mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-23 00:42:27 +00:00
Compare commits
411 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b224142b2a | |||
| 60563aead6 | |||
| a201a3e837 | |||
| 2d070ff1c0 | |||
| 4e257d43b2 | |||
| 7cb1a2e7e4 | |||
| e2bc79401b | |||
| 26589835e5 | |||
| e65bf63e51 | |||
| f6bddb9502 | |||
| d071bd2e7c | |||
| 921433f998 | |||
| 48be7c508d | |||
| f1260a598d | |||
| 36c945a77c | |||
| 0a8f3554e9 | |||
| af42af7869 | |||
| 65dcfd55a7 | |||
| 052b41fbb2 | |||
| 5998cf8a3c | |||
| fc282f86c0 | |||
| 804421095a | |||
| bc53ca3b71 | |||
| ff5eb54331 | |||
| 23698c1373 | |||
| 0a0260b75b | |||
| 9636ef3499 | |||
| dc0eb0f6b5 | |||
| 525eb518f6 | |||
| 70dd447156 | |||
| 52eb4d2d4e | |||
| 24ea7a0d45 | |||
| faaebc2806 | |||
| 6f867ebca3 | |||
| cbadd8bde1 | |||
| 395be050a3 | |||
| a59cdc2c89 | |||
| c98964a9e8 | |||
| 1054bfe476 | |||
| 7198e670ae | |||
| 4a7984f04d | |||
| c0b546921e | |||
| de84065cde | |||
| 8dfd61bbcf | |||
| e04496188b | |||
| 705dd4d7df | |||
| 0d0917b779 | |||
| ad2fd9e4d5 | |||
| e8ae28b439 | |||
| fde9517247 | |||
| 4a597a2b38 | |||
| 34b1950820 | |||
| 5562030594 | |||
| 9821c7da65 | |||
| c7a79d81ca | |||
| f5ba442ba6 | |||
| 2d052a7a28 | |||
| 3577ff5a81 | |||
| 88984a3960 | |||
| 6d52f3c02a | |||
| cb6948b6fd | |||
| ad603fd213 | |||
| b06fec6ad0 | |||
| 7db731a47d | |||
| 35e9c3ad98 | |||
| 904ae416c5 | |||
| 4faca5543a | |||
| 5d5c3fbfd1 | |||
| 251e940fe8 | |||
| e833f457a1 | |||
| 6d763256f1 | |||
| 8da864bada | |||
| 82e96d7014 | |||
| 700de3f518 | |||
| ad9c0df552 | |||
| ca3b5a3221 | |||
| 8cd19670ab | |||
| 84fa042c75 | |||
| 3d83f647bf | |||
| 67863e364b | |||
| ac0933719a | |||
| b7c19e4034 | |||
| 94a0cb3522 | |||
| 28ad768c0a | |||
| baa7a1feb9 | |||
| 6b45b2bc52 | |||
| cf1370b9e2 | |||
| 6f67577115 | |||
| 191aa575f8 | |||
| 4e3842b9d8 | |||
| f0881d4aa9 | |||
| 521106e286 | |||
| 12ea532a7a | |||
| 98c21635c2 | |||
| c465b8c8c3 | |||
| cfa05587fc | |||
| 56a96dc817 | |||
| 32a034bd58 | |||
| 2814130aad | |||
| c5c778f575 | |||
| daec5bde66 | |||
| ee7f88d247 | |||
| 5c5cde7fe5 | |||
| 08e787da59 | |||
| b43cfa126f | |||
| fbaae2b1e4 | |||
| 0598f7e87c | |||
| b4862dea45 | |||
| 09e13d0034 | |||
| bee04c1b53 | |||
| 2fbe6b304c | |||
| 02e82f1cfc | |||
| a2bef4d999 | |||
| 50a69a8e20 | |||
| a5207b58e1 | |||
| 3c2b8d13b9 | |||
| 2f1191b263 | |||
| e4f45d7b35 | |||
| f4d024fd47 | |||
| c30850f00a | |||
| ce248d83d6 | |||
| 3ca282abfa | |||
| 5c0fbac7b0 | |||
| ce4c6b0c8a | |||
| 6b67c3736b | |||
| 3266ed98e6 | |||
| 5970b0ee41 | |||
| 3b51aebb51 | |||
| 12ceac4c02 | |||
| 7fa1256c5d | |||
| f328853251 | |||
| d1b0564698 | |||
| 111fb84041 | |||
| 79a70271d5 | |||
| 1ca397f426 | |||
| d49426f763 | |||
| c5a90adb39 | |||
| 3573686976 | |||
| cab071b544 | |||
| f1701aae9f | |||
| 96a0cc37e0 | |||
| 2330285b04 | |||
| ac463fe9aa | |||
| fdd78e41da | |||
| 4ad8500a3e | |||
| b5c6b47639 | |||
| 62e22d1aea | |||
| 1973a065c5 | |||
| 6c5248b9a9 | |||
| 1ed9c3082c | |||
| 37936b63c4 | |||
| 4a83b4acb9 | |||
| e7681f1b49 | |||
| 4f38dba334 | |||
| 67a9779d5b | |||
| 5b85aa6550 | |||
| 6a5b3ef4fe | |||
| 9570412991 | |||
| c506e33018 | |||
| 8f32a9949b | |||
| d7e05de556 | |||
| 1e13d43b71 | |||
| a6b9e6cb3c | |||
| 0b44f58518 | |||
| c749155ad2 | |||
| 9d6248886c | |||
| de16db5a2f | |||
| 251d4fa3e3 | |||
| 9324bdf107 | |||
| e3e63efd68 | |||
| 071367b6a9 | |||
| 2e8d7b09af | |||
| eee65b8c22 | |||
| e11fa4a278 | |||
| 650aa566b0 | |||
| bd48efcdd5 | |||
| 9ac79f1071 | |||
| fc48a109fd | |||
| 0017951a74 | |||
| 959319f91f | |||
| 41cbe5fb01 | |||
| 71d72a02a9 | |||
| 01c580224d | |||
| 0355af310d | |||
| 94231b62a3 | |||
| fe364a0798 | |||
| 30922afd08 | |||
| 73e398b0f4 | |||
| 10ae97e42f | |||
| 96242f6c5e | |||
| 5dc3a5ab20 | |||
| 44bfdfebc2 | |||
| d33b320436 | |||
| 51b6db977f | |||
| e02e6099aa | |||
| 8e20f3e7dc | |||
| 5434c47d1f | |||
| cbc8e652b9 | |||
| 4a26466b2b | |||
| 6c7a4edae3 | |||
| 8c8cec29d4 | |||
| 9de4f84f22 | |||
| 563a39c2d9 | |||
| 741eca17f4 | |||
| b32f59a40d | |||
| 352d6fd83c | |||
| 738fa38047 | |||
| fabe93e548 | |||
| 16f72be898 | |||
| 9c22de9eb2 | |||
| f0f5262e3e | |||
| 8594148496 | |||
| dd869695c4 | |||
| 7943a73cfb | |||
| 59bcd031c8 | |||
| 22cc86e6a0 | |||
| a763fc08b6 | |||
| 8ae234aedf | |||
| 793487b825 | |||
| bb5ae7447d | |||
| 0370156179 | |||
| 39cab761eb | |||
| 720e80377e | |||
| 3d44050959 | |||
| d5efa0f23c | |||
| e63b310058 | |||
| 384d8c6167 | |||
| d23608964e | |||
| d656db843a | |||
| 0ed1e539ae | |||
| d8a8b8e6dc | |||
| 77f0e7919e | |||
| 587ddc0fdd | |||
| efdc177b78 | |||
| 275e1144ad | |||
| d987ccf289 | |||
| fe7774ab75 | |||
| 19e6a6909f | |||
| 4446a1ed08 | |||
| b4e4d94061 | |||
| f81f8ea5d6 | |||
| 7476ae2a82 | |||
| 0c4a32246b | |||
| b8b43c7149 | |||
| b4286b87db | |||
| cb0d5ac7d0 | |||
| 957f05860b | |||
| d4139b98e3 | |||
| 29d614421f | |||
| beff1caf4f | |||
| 29ec6db345 | |||
| 8efc652c10 | |||
| 29079a7ec2 | |||
| 3ac0f1506c | |||
| 38f1e8847c | |||
| cff9e05626 | |||
| 29a36008d1 | |||
| 51958b991c | |||
| 771279128d | |||
| 385d70b294 | |||
| 4bd41b3678 | |||
| 527293d2f2 | |||
| d754e24a02 | |||
| b4576435e3 | |||
| 5e1500c93b | |||
| c9073b10a1 | |||
| a9f7af59a2 | |||
| 728399e372 | |||
| 51a3302288 | |||
| 5decde0af9 | |||
| 3620ac4eaf | |||
| 43e906e3c8 | |||
| 39bb2aa811 | |||
| acab4dd443 | |||
| 45ff2cddb7 | |||
| 1619324d06 | |||
| 7b0045290d | |||
| 441ddf233a | |||
| 306c641c72 | |||
| b417e23d97 | |||
| 481492cb59 | |||
| d3fbd026b4 | |||
| 2d77adeeb8 | |||
| f84130fc7c | |||
| 57f8f61094 | |||
| 5ec0b9993a | |||
| 65cb049a38 | |||
| 3247137ef2 | |||
| adb8175654 | |||
| 5afd6b8628 | |||
| 4cb6a5635e | |||
| b54411e533 | |||
| 7f85d8c8a2 | |||
| c95b18da85 | |||
| a062c27e1a | |||
| c5df59a2f0 | |||
| d538b48fbc | |||
| 0a27273d64 | |||
| 22170527c4 | |||
| f0f920d0e8 | |||
| 193f7b0fe3 | |||
| c81491f97e | |||
| bb91265b2b | |||
| affb735c38 | |||
| 3db2332821 | |||
| a6ae2ca635 | |||
| 466eecacc4 | |||
| a327c91bac | |||
| cef2aa64d9 | |||
| 69a124e11f | |||
| 3f056462d6 | |||
| e8eb774458 | |||
| 223d06645d | |||
| 2db5dc2ed7 | |||
| 6d95fc2547 | |||
| b10062452a | |||
| 9c72533264 | |||
| f805ddf319 | |||
| 2267881d52 | |||
| 7ca23d14c7 | |||
| 4cf845e6ff | |||
| 9c6ab05659 | |||
| 0f9cfc0615 | |||
| 6028dbb4e5 | |||
| fc8cb2b5b7 | |||
| 594657f2c7 | |||
| 09e1155a26 | |||
| e824f81670 | |||
| 69c0405004 | |||
| e38abaa32a | |||
| c002f834d4 | |||
| e53a91f5c3 | |||
| ef5e93b71b | |||
| 6f00a69850 | |||
| 41938fbe72 | |||
| d1561c28d9 | |||
| be0621de42 | |||
| 15cec40ed5 | |||
| ea734c90b5 | |||
| 6c5b569c29 | |||
| e5f3f4c552 | |||
| f097eaf3cd | |||
| 48eba3c092 | |||
| bdba6219ac | |||
| d86912a7bb | |||
| 362366a333 | |||
| 35049d530e | |||
| 0438042844 | |||
| f4203d0621 | |||
| bf6b9aaef8 | |||
| d5f5b38d26 | |||
| 6a078279eb | |||
| a61b930bd9 | |||
| 6be2f6a7e4 | |||
| 1d08b1687f | |||
| e2382137e6 | |||
| f1039ab0e9 | |||
| ce3532aa19 | |||
| 1b1c5b5f9f | |||
| 9c3f1937a7 | |||
| 81a641c96c | |||
| 037df28b7c | |||
| fe1c67b8b4 | |||
| c7c9218210 | |||
| 6d6516d80d | |||
| 528f16bdaf | |||
| 64641a3390 | |||
| 74b8f38030 | |||
| c7faf8a03c | |||
| aa9601352d | |||
| 81b9d9a57e | |||
| cecd9b89ba | |||
| 938322a3d1 | |||
| 1c04dccf53 | |||
| 0622f02470 | |||
| 1366774931 | |||
| 5cbae2b833 | |||
| c12805acce | |||
| e2c84c5f39 | |||
| e19db3f447 | |||
| 7d0b316e74 | |||
| 0ef428d286 | |||
| 2a73a572d3 | |||
| 638d121b75 | |||
| 3b75d4fa8f | |||
| cb897786bc | |||
| aa780ceb8c | |||
| 4a3f94e688 | |||
| 211b3a135e | |||
| cbce5e5eb6 | |||
| a3347579e6 | |||
| 2fbd170188 | |||
| 95208eb24e | |||
| bcf282da91 | |||
| edc2567b10 | |||
| b379bdd36e | |||
| eeb9a6ab65 | |||
| c4de954b15 | |||
| 2d8e9bf058 | |||
| 0b352ff0f7 | |||
| 28ec84a6c9 | |||
| 7f5f805c10 | |||
| b3789c261b | |||
| d86fc1c141 | |||
| accedf7184 | |||
| 5f5fba1117 | |||
| 61cd48ff44 | |||
| ca2c2ccfac | |||
| 905a264744 | |||
| 114d0ae11b | |||
| 4d768474e8 |
+10
-9
@@ -24,8 +24,8 @@
|
||||
#EQEMU_DISABLE_LOGSYS
|
||||
#EQEMU_COMMANDS_LOGGING
|
||||
#EQEMU_BUILD_SERVER
|
||||
#EQEMU_BUILD_LOGIN
|
||||
#EQEMU_BUILD_TESTS
|
||||
#EQEMU_BUILD_LOGIN
|
||||
#EQEMU_BUILD_TESTS
|
||||
#EQEMU_BUILD_PERL
|
||||
#EQEMU_BUILD_LUA
|
||||
#EQEMU_SANITIZE_LUA_LIBS
|
||||
@@ -103,7 +103,7 @@ IF(MSVC)
|
||||
SET(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /SAFESEH:NO")
|
||||
SET(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /SAFESEH:NO")
|
||||
ENDIF(EQEMU_DISABLE_SAFESEH)
|
||||
|
||||
|
||||
OPTION(EQEMU_BUILD_MSVC_MP "Enable build with multiple processes." ON)
|
||||
IF(EQEMU_BUILD_MSVC_MP)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
||||
@@ -115,7 +115,7 @@ IF(MSVC)
|
||||
STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
||||
ENDIF(${flag_var} MATCHES "/MD")
|
||||
ENDFOREACH(flag_var)
|
||||
|
||||
|
||||
ADD_DEFINITIONS(-DNOMINMAX)
|
||||
ELSE(MSVC)
|
||||
#Normally set by perl but we don't use the perl flags anymore so we set it.
|
||||
@@ -126,6 +126,7 @@ ENDIF(MSVC)
|
||||
IF(UNIX)
|
||||
IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
||||
ADD_DEFINITIONS(-DFREEBSD)
|
||||
ADD_DEFINITIONS(-D_GLIBCXX_USE_C99)
|
||||
SET(FREEBSD TRUE)
|
||||
ENDIF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
||||
IF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||
@@ -305,26 +306,26 @@ FIND_PACKAGE(ZLIB REQUIRED)
|
||||
FIND_PACKAGE(MySQL REQUIRED)
|
||||
IF(EQEMU_BUILD_PERL)
|
||||
FIND_PACKAGE(PerlLibs REQUIRED)
|
||||
INCLUDE_DIRECTORIES("${PERL_INCLUDE_PATH}")
|
||||
INCLUDE_DIRECTORIES(SYSTEM "${PERL_INCLUDE_PATH}")
|
||||
ENDIF(EQEMU_BUILD_PERL)
|
||||
|
||||
IF(EQEMU_BUILD_LUA)
|
||||
FIND_PACKAGE(EQLua51 REQUIRED)
|
||||
SET(Boost_USE_STATIC_LIBS OFF)
|
||||
SET(Boost_USE_MULTITHREADED ON)
|
||||
SET(Boost_USE_MULTITHREADED ON)
|
||||
SET(Boost_USE_STATIC_RUNTIME OFF)
|
||||
SET(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/boost")
|
||||
|
||||
FIND_PACKAGE(Boost REQUIRED)
|
||||
INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}" "${Boost_INCLUDE_DIRS}" "luabind")
|
||||
|
||||
INCLUDE_DIRECTORIES(SYSTEM "${LUA_INCLUDE_DIR}" "${Boost_INCLUDE_DIRS}" "luabind")
|
||||
|
||||
OPTION(EQEMU_SANITIZE_LUA_LIBS "Sanitize Lua Libraries (Remove OS and IO standard libraries from being able to run)." ON)
|
||||
IF(EQEMU_SANITIZE_LUA_LIBS)
|
||||
ADD_DEFINITIONS(-DSANITIZE_LUA_LIBS)
|
||||
ENDIF(EQEMU_SANITIZE_LUA_LIBS)
|
||||
ENDIF(EQEMU_BUILD_LUA)
|
||||
|
||||
INCLUDE_DIRECTORIES("${ZLIB_INCLUDE_DIRS}" "${MySQL_INCLUDE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/common/glm/glm")
|
||||
INCLUDE_DIRECTORIES(SYSTEM "${ZLIB_INCLUDE_DIRS}" "${MySQL_INCLUDE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/common/glm/glm")
|
||||
|
||||
IF(EQEMU_BUILD_LUA)
|
||||
ADD_SUBDIRECTORY(luabind)
|
||||
|
||||
+211
@@ -1,5 +1,216 @@
|
||||
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
||||
-------------------------------------------------------
|
||||
== 12/04/2014 ==
|
||||
Kayen: Ranged attacks will now more accurately check MAX firing range, fixing the issue where you would
|
||||
hit ranged attack and nothing would happpen due to incorrect server side range checks.
|
||||
Trevius: Initial addition of the RoF2 client from May 10th 2013 (currently available on Steam as the F2P client).
|
||||
Trevius: RoF2 is disabled by default, but you can enable by editing /common/patches/patches.cpp (see comments)
|
||||
|
||||
== 12/01/2014 ==
|
||||
Trevius: Mercenaries now spawn as the same Gender and Size of the Merchant they are purchased from.
|
||||
Trevius: Mercenaries now spawn with randomized facial features when purchased.
|
||||
Trevius: Setting a lastname for NPCs will now override any hard coded lastname (such as GM Trainers).
|
||||
|
||||
Required SQL: utils/sql/git/required/2014_12_01_mercs_table_update.sql
|
||||
|
||||
== 11/28/2014 ==
|
||||
Trevius: Fixed a zone crash related to numhits for spells.
|
||||
Trevius: Fixed a query related to group leaders logging in.
|
||||
Trevius (Natedog): Fixed a world crash related to attempting to join an adventure with Mercenaries.
|
||||
|
||||
== 11/27/2014 ==
|
||||
Kayen: Projectiles (ie Arrows) fired from archery will now do damage upon impact instead of instantly (consistent w/ live).
|
||||
Optional SQL: utils/sql/git/optional/2014_11_27_ProjectileDmgOnImpact.sql
|
||||
|
||||
== 11/25/2014 ==
|
||||
Trevius: Spells that modify model size are now limited to 2 size adjustments from the base size.
|
||||
Trevius: Fix to prevent Mercenaries from being set as Group Leader.
|
||||
|
||||
== 11/24/2014 ==
|
||||
Trevius: Added Rule NPC:EnableMeritBasedFaction (disabled by default) - Allows faction gain to work similar to experience.
|
||||
|
||||
== 11/22/2014 ==
|
||||
Trevius: Grouping with Mercenaries is now considerably less buggy.
|
||||
Trevius: Fixed an issue with Spell Globals related to high Character IDs.
|
||||
Trevius: Crash fix for Swarm Pets.
|
||||
|
||||
== 11/19/2014 ==
|
||||
Trevius: Mercenaries now Dismiss, Suspend, Unsuspend, and Die correctly.
|
||||
|
||||
== 11/18/2014 ==
|
||||
Trevius: Mercenaries can now zone once again.
|
||||
|
||||
== 11/17/2014 ==
|
||||
demonstar55: Correct OP_AugmentInfo reply. This fixes RoF display issue with Adventurer's Stone. Still issues with UF/SoF/SoD though.
|
||||
|
||||
== 11/16/2014 ==
|
||||
demonstar55: fix size issue with ControlBoat_Struct and exploit fix in OP_BoardBoat
|
||||
|
||||
Akkadius: Implemented Automatic Database update and versioning system
|
||||
Akkadius: Created database revision define, this is located in version.h in common #define CURRENT_BINARY_DATABASE_VERSION 9057
|
||||
- This revision define will need to be incremented each time a database update is made
|
||||
- Along with a revision define increment, you will need to update the db_update manifest located in:
|
||||
- https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt
|
||||
- An entry needs to be made at the bottom of the manifest, the entry is quite simple
|
||||
- Example: 9057|2014_11_13_spells_new_updates.sql|SHOW COLUMNS FROM `spells_new` LIKE 'disallow_sit'|empty|
|
||||
- This latest example is checking to see if the spells_new table contains the column 'disallow_sit', if its empty, the update needs to be ran
|
||||
- More examples of match types below:
|
||||
# Example: Version|Filename.sql|Query_to_Check_Condition_For_Needed_Update|match type|text to match
|
||||
# 0 = Database Version
|
||||
# 1 = Filename.sql
|
||||
# 2 = Query_to_Check_Condition_For_Needed_Update
|
||||
# 3 = Match Type - If condition from match type to Value 4 is true, update will flag for needing to be ran
|
||||
# contains = If query results contains text from 4th value
|
||||
# match = If query results matches text from 4th value
|
||||
# missing = If query result is missing text from 4th value
|
||||
# empty = If the query results in no results
|
||||
# not_empty = If the query is not empty
|
||||
# 4 = Text to match
|
||||
- The manifest contains all database updates 'Required' to be made to the schema, and it will contain a working backport all the way back to SVN -
|
||||
currently it is tested and backported through the beginning of our Github repo
|
||||
- On world bootup or standalone run of db_update.pl, users will be prompted with a simple menu that we will expand upon later:
|
||||
|
||||
============================================================
|
||||
EQEmu: Automatic Database Upgrade Check
|
||||
============================================================
|
||||
Operating System is: MSWin32
|
||||
(Windows) MySQL is in system path
|
||||
Path = C:\Program Files\MariaDB 10.0\bin/mysql
|
||||
============================================================
|
||||
Binary Database Version: (9057)
|
||||
Local Database Version: (9057)
|
||||
|
||||
Database up to Date: Continuing World Bootup...
|
||||
============================================================
|
||||
Retrieving latest database manifest...
|
||||
URL: https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt
|
||||
Saved: db_update/db_update_manifest.txt
|
||||
|
||||
Database Management Menu (Please Select):
|
||||
1) Backup Database - (Saves to Backups folder)
|
||||
Ideal to perform before performing updates
|
||||
2) Backup Database Compressed - (Saves to Backups folder)
|
||||
Ideal to perform before performing updates
|
||||
3) Check for pending Database updates
|
||||
Stages updates for automatic upgrade...
|
||||
0) Exit
|
||||
|
||||
Akkadius: Created db_update.pl, placed in utils/scripts folder, used for the automatic database update routine (Linux/Windows)
|
||||
- db_update.pl script created db_version table if not created, if old one is present it will remove it
|
||||
Akkadius: Created db_dumper.pl, placed in utils/scripts folder, used for the automatic database update routine backups and standalone backups (Linux/Windows)
|
||||
Akkadius: World will now check the db_update.pl script on bootup, if the db_update.pl script is not present, it will fetch it remotely before running -
|
||||
when db_update.pl is done running, world will continue with bootup
|
||||
|
||||
== 11/15/2014 ==
|
||||
Uleat(Natedog): A better fix for OP_ShopPlayerBuy - doesn't cause the issues that I introduced
|
||||
Kayen: Implemented NPC Special Ability 41 'Allow To Tank', gives NPC opportunity to take aggro over a client in melee range.
|
||||
Kayen: Updated swarm pet AI to be consistent with live.
|
||||
|
||||
*OLD AI: Swarm pet would lock on to target until target died, then depop as soon as target died.
|
||||
|
||||
*NEW AI: Swarm pet will attack cast on target, NOT perma locked it can change targets if attacked
|
||||
by something else that generate more hate. When target dies swarm pet will follow owner, if owner is
|
||||
attacked by something else the swarm pet will attack it (until duration timer despawns the pet).
|
||||
|
||||
Kayen: Updated perl quest function: MakeTempPet(Tspell_id, name=nullptr, duration=0, target=nullptr, sticktarg=0)
|
||||
Kayen: Implemented perl quest function: Mob::TypesTempPet(npctypesid, name=nullptr, duration=0, follow=0, target=nullptr, sticktarg=0)
|
||||
Note: 'sticktarg' field will cause the swarm pet to use the OLD AI
|
||||
|
||||
Rule to use OLD AI only - default is disabled.
|
||||
Optional SQL: utils/sql/git/optional/2014_11_15_SwarmPetTargetLock.sql
|
||||
|
||||
== 11/14/2014 ==
|
||||
Secrets: Identified object size and solidtype as flags. Exported them as functions to Perl.
|
||||
demonstar55: Don't use the hack for charms that doesn't work on RoF
|
||||
demonstar55: UF too
|
||||
demonstar55: Tit
|
||||
demonstar55: SoF
|
||||
demonstar55: SoD
|
||||
demonstar55: 62 (untested)
|
||||
|
||||
== 11/13/2014 ==
|
||||
Kayen: Implemented target type (44) 'Beams' (which projects an AE infront of caster with a specified length and width).
|
||||
Kayen: Implemented target type (32) AE Target HateList
|
||||
Kayen: Implemented target type (36) Area Client Only
|
||||
Kayen: Implemented target type (37) Area PC Only
|
||||
Kayen: Implemented target type (39) Group No Pet
|
||||
Uleat: PlayerLogMerchantTransactions does not support partial stack purchase logging at this time
|
||||
|
||||
== 11/12/2014 ==
|
||||
Uleat: Changed 'GMTrainee' struct to reflect the actual client hard-coded max skill count (100) - applies to all currently supported clients (6.2->RoF)
|
||||
|
||||
== 11/11/2014 ==
|
||||
Uleat: Third attempt at a fix for GM trainer zone crashes... (this is starting to look like a KLS fix...)
|
||||
|
||||
== 11/10/2014 ==
|
||||
Uleat: Fix for GM Trainer crashing server (really!)
|
||||
JJ: Yellow faction messages.
|
||||
|
||||
== 11/09/2014 ==
|
||||
Kayen: Implemented support for spell target type (45) 'Target Rings' on Underfoot (does work earlier expansions). Thanks to Lecht for figuring out the op_code side.
|
||||
JJ: Implement new Live-like faction adjustment message using rule Client:UseLiveFactionMessage.
|
||||
Optional SQL: utils/sql/git/optional/2014_11_09_LiveFactionMessages.sql
|
||||
|
||||
== 11/06/2014 ==
|
||||
demonstar55: Tracking default sort will now be correct order
|
||||
Trevius: Fixed dynamic merchant list loading. Allows any merchant to be used in any zone.
|
||||
|
||||
== 11/03/2014 ==
|
||||
Secrets: Fixed an overflow in melee lifetap calculations (int16 vs int32)
|
||||
Secrets: Fixed overflow on AC and ATK values that can go out of range.
|
||||
Secrets: Merc/Bot fixes for previous updates.
|
||||
Secrets: Changed a lot of int16s for stat-related functions to int32 because they were causing combat formula overflows (int16/int32 mismatch).
|
||||
Secrets: Linux fix?
|
||||
|
||||
== 11/02/2014 ==
|
||||
Akkadius: Added out of range checking for Spell Save/Loads
|
||||
|
||||
== 11/01/2014 ==
|
||||
Trevius: Fixed potential crash related to Pets/Mercs buffs when targeting themselves.
|
||||
JJ: (noudess) Revamped faction system. See https://github.com/EQEmu/Server/pull/256
|
||||
|
||||
== 10/28/2014 ==
|
||||
Uleat: Added Client::InterrogateInventory(). Can be invoked by #interrogateinv and is also called when Handle_OP_MoveItem() calls for SwapItemResync()
|
||||
|
||||
== 10/22/2014 ==
|
||||
Uleat: Fix for stacking items in a world object..added a new command option: #peekinv world - will show world container contents, if one is in use by target.
|
||||
|
||||
== 10/20/2014 ==
|
||||
demonstar55: Inspect Buffs rank 1 will now show NPC buffs in target window (SoD+)
|
||||
|
||||
== 10/19/2014 ==
|
||||
Uleat: Updated command #peekinv to display item links properly in RoF clients
|
||||
demonstar55: Group Mentoring in raids
|
||||
demonstar55: Inspect Buffs (text only version) works in raid groups
|
||||
demonstar55: Make use of the Inspect Buffs op/packet. 62 SOL until someone finds its op
|
||||
|
||||
== 10/18/2014==
|
||||
demonstar55: Implement group mentor, sharing leadership exp (SoF+ only)
|
||||
demonstar55: Add gaining of group leadership while in raids
|
||||
|
||||
== 10/16/2014 ==
|
||||
Uleat: Fixed the auto-conversion view naming error and renamed the views in the script files. Added a fix sql for databases that auto-converted.
|
||||
Fix SQL: ../sql/git/bots/deprecated/2014_10_16_Lower_Case_View_Fix.sql
|
||||
|
||||
== 10/15/2014 ==
|
||||
Uleat: Cleaned up load/drop bots sqls, added '../utils/sql/git/bots/deprecated' and '../deprecated/load_bots_old.sql' (use this file on pre-player blob conversion databases.)
|
||||
Notes: I modifed the behavior of both load and drop bots to fail on the first operation if their modifications have been performed already.
|
||||
'load_bots.sql' will explicitly add bot schema, while 'drop_bots.sql' will explicitly drop it. I also added a few lines to change
|
||||
a few altered tables back to their original state - as of the date in the file.
|
||||
|
||||
== 10/13/2014 ==
|
||||
demonstar55: Partially implement leadership and raids
|
||||
Currently working: client side only effects and stat bonuses.
|
||||
Not working: Mark NPC, and other stuff that need extra server side support
|
||||
Currently only UF tested (Tit and 62 may just work, others need packet work)
|
||||
|
||||
== 10/12/2014 ==
|
||||
Akkadius: Fix for LDON Character Stat load
|
||||
|
||||
== 10/11/2014 ==
|
||||
demonstar55: Implement Raid MOTD for UF
|
||||
Don't forget 2014_10_11_RaidMOTD.sql!
|
||||
|
||||
== 10/09/2014 ==
|
||||
Uleat: Added 'BOTS' conversion code to supplement the database 'PlayerProfile' blob conversion that Akkadius recently implemented.
|
||||
Note: This automatic conversion uses the view `vwbotcharactermobs` as an update vector. If you need/would like for the converter to run on
|
||||
|
||||
+15
-2
@@ -72,6 +72,7 @@ SET(common_sources
|
||||
patches/sod.cpp
|
||||
patches/sof.cpp
|
||||
patches/rof.cpp
|
||||
patches/rof2.cpp
|
||||
patches/titanium.cpp
|
||||
patches/underfoot.cpp
|
||||
SocketLib/Base64.cpp
|
||||
@@ -168,6 +169,7 @@ SET(common_headers
|
||||
ptimer.h
|
||||
queue.h
|
||||
races.h
|
||||
random.h
|
||||
rdtsc.h
|
||||
rulesys.h
|
||||
ruletypes.h
|
||||
@@ -216,7 +218,11 @@ SET(common_headers
|
||||
patches/rof_itemfields.h
|
||||
patches/rof_ops.h
|
||||
patches/rof_structs.h
|
||||
patches/rof2.h
|
||||
patches/rof2_constants.h
|
||||
patches/rof2_itemfields.h
|
||||
patches/rof2_ops.h
|
||||
patches/rof2_structs.h
|
||||
patches/titanium.h
|
||||
patches/titanium_constants.h
|
||||
patches/titanium_itemfields.h
|
||||
@@ -269,8 +275,12 @@ SOURCE_GROUP(Patches FILES
|
||||
patches/rof_itemfields.h
|
||||
patches/rof_ops.h
|
||||
patches/rof_constants.h
|
||||
patches/rof2_constants.h
|
||||
patches/rof_structs.h
|
||||
patches/rof2.h
|
||||
patches/rof2_itemfields.h
|
||||
patches/rof2_ops.h
|
||||
patches/rof2_constants.h
|
||||
patches/rof2_structs.h
|
||||
patches/titanium.h
|
||||
patches/titanium_itemfields.h
|
||||
patches/titanium_ops.h
|
||||
@@ -286,6 +296,7 @@ SOURCE_GROUP(Patches FILES
|
||||
patches/sod.cpp
|
||||
patches/sof.cpp
|
||||
patches/rof.cpp
|
||||
patches/rof2.cpp
|
||||
patches/titanium.cpp
|
||||
patches/underfoot.cpp
|
||||
)
|
||||
@@ -336,7 +347,9 @@ ADD_LIBRARY(common ${common_sources} ${common_headers})
|
||||
|
||||
IF(UNIX)
|
||||
ADD_DEFINITIONS(-fPIC)
|
||||
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/underfoot.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
||||
SET_SOURCE_FILES_PROPERTIES("SocketLib/Mime.cpp" PROPERTY COMPILE_FLAGS -Wno-unused-result)
|
||||
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/rof2.cpp" "patches/underfoot.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
||||
ENDIF(UNIX)
|
||||
|
||||
|
||||
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||
|
||||
@@ -290,50 +290,3 @@ const char* GetEQClassName(uint8 class_, uint8 level) {
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetArrayEQClass(uint8 eqclass) {
|
||||
switch (eqclass) {
|
||||
case WARRIOR:
|
||||
return WARRIOR;
|
||||
case CLERIC:
|
||||
return CLERIC;
|
||||
case PALADIN:
|
||||
return PALADIN;
|
||||
case RANGER:
|
||||
return RANGER;
|
||||
case SHADOWKNIGHT:
|
||||
return SHADOWKNIGHT;
|
||||
case DRUID:
|
||||
return DRUID;
|
||||
case MONK:
|
||||
return MONK;
|
||||
case BARD:
|
||||
return BARD;
|
||||
case ROGUE:
|
||||
return ROGUE;
|
||||
case SHAMAN:
|
||||
return SHAMAN;
|
||||
case NECROMANCER:
|
||||
return NECROMANCER;
|
||||
case WIZARD:
|
||||
return WIZARD;
|
||||
case MAGICIAN:
|
||||
return MAGICIAN;
|
||||
case ENCHANTER:
|
||||
return ENCHANTER;
|
||||
case BEASTLORD:
|
||||
return BEASTLORD;
|
||||
case BERSERKER:
|
||||
return BERSERKER;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint8 GetEQArrayEQClass(uint8 eqclass) {
|
||||
if (eqclass >= WARRIOR && eqclass <= BERSERKER)
|
||||
return eqclass - WARRIOR;
|
||||
if (eqclass >= WARRIORGM && eqclass <= BERSERKERGM)
|
||||
return eqclass - WARRIORGM;
|
||||
return WARRIOR;
|
||||
}
|
||||
|
||||
|
||||
@@ -86,7 +86,5 @@
|
||||
#define call_1 65536
|
||||
|
||||
const char* GetEQClassName(uint8 class_, uint8 level = 0);
|
||||
uint32 GetArrayEQClass(uint8 eqclass);
|
||||
uint8 GetEQArrayEQClass(uint8 eqclass);
|
||||
#endif
|
||||
|
||||
|
||||
+1223
-720
File diff suppressed because it is too large
Load Diff
+422
-13
@@ -41,6 +41,7 @@ class SpawnGroupList;
|
||||
class Petition;
|
||||
class Client;
|
||||
class Merc;
|
||||
class MySQLRequestResult;
|
||||
struct Combine_Struct;
|
||||
//struct Faction;
|
||||
//struct FactionMods;
|
||||
@@ -68,21 +69,15 @@ uint8 eventid;
|
||||
EventLogDetails_Struct eld[255];
|
||||
};
|
||||
|
||||
|
||||
// Added By Hogie
|
||||
// INSERT into variables (varname,value) values('decaytime [minlevel] [maxlevel]','[number of seconds]');
|
||||
// IE: decaytime 1 54 = Levels 1 through 54
|
||||
// decaytime 55 100 = Levels 55 through 100
|
||||
// It will always put the LAST time for the level (I think) from the Database
|
||||
struct npcDecayTimes_Struct {
|
||||
uint16 minlvl;
|
||||
uint16 maxlvl;
|
||||
uint32 seconds;
|
||||
};
|
||||
// Added By Hogie -- End
|
||||
|
||||
|
||||
struct VarCache_Struct {
|
||||
char varname[26]; // varname is char(25) in database
|
||||
char varname[26];
|
||||
char value[0];
|
||||
};
|
||||
|
||||
@@ -93,13 +88,417 @@ struct ExtendedProfile_Struct;
|
||||
struct GuildMember_Struct;
|
||||
class PTimerList;
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/* Conversion Structs */
|
||||
|
||||
namespace Convert {
|
||||
struct BindStruct {
|
||||
/*000*/ uint32 zoneId;
|
||||
/*004*/ float x;
|
||||
/*008*/ float y;
|
||||
/*012*/ float z;
|
||||
/*016*/ float heading;
|
||||
};
|
||||
struct Color_Struct
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint8 blue;
|
||||
uint8 green;
|
||||
uint8 red;
|
||||
uint8 use_tint; // if there's a tint this is FF
|
||||
} rgb;
|
||||
uint32 color;
|
||||
};
|
||||
};
|
||||
struct AA_Array
|
||||
{
|
||||
uint32 AA;
|
||||
uint32 value;
|
||||
};
|
||||
struct SpellBuff_Struct
|
||||
{
|
||||
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
|
||||
/*001*/ uint8 level;
|
||||
/*002*/ uint8 bard_modifier;
|
||||
/*003*/ uint8 effect; //not real
|
||||
/*004*/ uint32 spellid;
|
||||
/*008*/ uint32 duration;
|
||||
/*012*/ uint32 counters;
|
||||
/*016*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
|
||||
/*020*/
|
||||
};
|
||||
struct Tribute_Struct {
|
||||
uint32 tribute;
|
||||
uint32 tier;
|
||||
};
|
||||
struct Disciplines_Struct {
|
||||
uint32 values[MAX_PP_DISCIPLINES];
|
||||
};
|
||||
struct GroupLeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
uint32 groupAAMarkNPC;
|
||||
uint32 groupAANPCHealth;
|
||||
uint32 groupAADelegateMainAssist;
|
||||
uint32 groupAADelegateMarkNPC;
|
||||
uint32 groupAA4;
|
||||
uint32 groupAA5;
|
||||
uint32 groupAAInspectBuffs;
|
||||
uint32 groupAA7;
|
||||
uint32 groupAASpellAwareness;
|
||||
uint32 groupAAOffenseEnhancement;
|
||||
uint32 groupAAManaEnhancement;
|
||||
uint32 groupAAHealthEnhancement;
|
||||
uint32 groupAAHealthRegeneration;
|
||||
uint32 groupAAFindPathToPC;
|
||||
uint32 groupAAHealthOfTargetsTarget;
|
||||
uint32 groupAA15;
|
||||
};
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct RaidLeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
uint32 raidAAMarkNPC;
|
||||
uint32 raidAANPCHealth;
|
||||
uint32 raidAADelegateMainAssist;
|
||||
uint32 raidAADelegateMarkNPC;
|
||||
uint32 raidAA4;
|
||||
uint32 raidAA5;
|
||||
uint32 raidAA6;
|
||||
uint32 raidAASpellAwareness;
|
||||
uint32 raidAAOffenseEnhancement;
|
||||
uint32 raidAAManaEnhancement;
|
||||
uint32 raidAAHealthEnhancement;
|
||||
uint32 raidAAHealthRegeneration;
|
||||
uint32 raidAAFindPathToPC;
|
||||
uint32 raidAAHealthOfTargetsTarget;
|
||||
uint32 raidAA14;
|
||||
uint32 raidAA15;
|
||||
};
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
Convert::GroupLeadershipAA_Struct group;
|
||||
Convert::RaidLeadershipAA_Struct raid;
|
||||
};
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
typedef struct
|
||||
{
|
||||
/*00*/ char Name[64];
|
||||
/*64*/ uint32 Level;
|
||||
/*68*/ uint32 Race;
|
||||
/*72*/ uint32 Class;
|
||||
/*76*/ uint32 Zone;
|
||||
/*80*/ uint32 Time;
|
||||
/*84*/ uint32 Points;
|
||||
/*88*/
|
||||
} PVPStatsEntry_Struct;
|
||||
struct BandolierItem_Struct {
|
||||
uint32 item_id;
|
||||
uint32 icon;
|
||||
char item_name[64];
|
||||
};
|
||||
struct Bandolier_Struct {
|
||||
char name[32];
|
||||
Convert::BandolierItem_Struct items[EmuConstants::BANDOLIER_SIZE];
|
||||
};
|
||||
struct PotionBelt_Struct {
|
||||
Convert::BandolierItem_Struct items[EmuConstants::POTION_BELT_SIZE];
|
||||
};
|
||||
struct SuspendedMinion_Struct
|
||||
{
|
||||
/*000*/ uint16 SpellID;
|
||||
/*002*/ uint32 HP;
|
||||
/*006*/ uint32 Mana;
|
||||
/*010*/ Convert::SpellBuff_Struct Buffs[BUFF_COUNT];
|
||||
/*510*/ uint32 Items[_MaterialCount];
|
||||
/*546*/ char Name[64];
|
||||
/*610*/
|
||||
};
|
||||
|
||||
struct PlayerProfile_Struct {
|
||||
/*0000*/ uint32 checksum; // Checksum from CRC32::SetEQChecksum
|
||||
/*0004*/ char name[64]; // Name of player sizes not right
|
||||
/*0068*/ char last_name[32]; // Last name of player sizes not right
|
||||
/*0100*/ uint32 gender; // Player Gender - 0 Male, 1 Female
|
||||
/*0104*/ uint32 race; // Player race
|
||||
/*0108*/ uint32 class_; // Player class
|
||||
/*0112*/ uint32 unknown0112; //
|
||||
/*0116*/ uint32 level; // Level of player (might be one byte)
|
||||
/*0120*/ Convert::BindStruct binds[5]; // Bind points (primary is first, home city is fifth)
|
||||
/*0220*/ uint32 deity; // deity
|
||||
/*0224*/ uint32 guild_id;
|
||||
/*0228*/ uint32 birthday; // characters bday
|
||||
/*0232*/ uint32 lastlogin; // last login or zone time
|
||||
/*0236*/ uint32 timePlayedMin; // in minutes
|
||||
/*0240*/ uint8 pvp;
|
||||
/*0241*/ uint8 level2; //no idea why this is here, but thats how it is on live
|
||||
/*0242*/ uint8 anon; // 2=roleplay, 1=anon, 0=not anon
|
||||
/*0243*/ uint8 gm;
|
||||
/*0244*/ uint8 guildrank;
|
||||
/*0245*/ uint8 guildbanker;
|
||||
/*0246*/ uint8 unknown0246[6]; //
|
||||
/*0252*/ uint32 intoxication;
|
||||
/*0256*/ uint32 spellSlotRefresh[MAX_PP_REF_MEMSPELL]; //in ms
|
||||
/*0292*/ uint32 abilitySlotRefresh;
|
||||
/*0296*/ uint8 haircolor; // Player hair color
|
||||
/*0297*/ uint8 beardcolor; // Player beard color
|
||||
/*0298*/ uint8 eyecolor1; // Player left eye color
|
||||
/*0299*/ uint8 eyecolor2; // Player right eye color
|
||||
/*0300*/ uint8 hairstyle; // Player hair style
|
||||
/*0301*/ uint8 beard; // Beard type
|
||||
/*0302*/ uint8 ability_time_seconds; //The following four spots are unknown right now.....
|
||||
/*0303*/ uint8 ability_number; //ability used
|
||||
/*0304*/ uint8 ability_time_minutes;
|
||||
/*0305*/ uint8 ability_time_hours; //place holder
|
||||
/*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag?
|
||||
/*0312*/ uint32 item_material[_MaterialCount]; // Item texture/material of worn/held items
|
||||
/*0348*/ uint8 unknown0348[44];
|
||||
/*0392*/ Convert::Color_Struct item_tint[_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
|
||||
/*2384*/ char title[32]; // length might be wrong
|
||||
/*2416*/ char suffix[32]; // length might be wrong
|
||||
/*2448*/ uint32 guildid2; //
|
||||
/*2452*/ uint32 exp; // Current Experience
|
||||
/*2456*/ uint32 unknown2492;
|
||||
/*2460*/ uint32 points; // Unspent Practice points
|
||||
/*2464*/ uint32 mana; // current mana
|
||||
/*2468*/ uint32 cur_hp; // current hp
|
||||
/*2472*/ uint32 unknown2508; // 0x05
|
||||
/*2476*/ uint32 STR; // Strength
|
||||
/*2480*/ uint32 STA; // Stamina
|
||||
/*2484*/ uint32 CHA; // Charisma
|
||||
/*2488*/ uint32 DEX; // Dexterity
|
||||
/*2492*/ uint32 INT; // Intelligence
|
||||
/*2496*/ uint32 AGI; // Agility
|
||||
/*2500*/ uint32 WIS; // Wisdom
|
||||
/*2504*/ uint8 face; // Player face
|
||||
/*2505*/ uint8 unknown2541[47]; // ?
|
||||
/*2552*/ uint8 languages[MAX_PP_LANGUAGE];
|
||||
/*2580*/ uint8 unknown2616[4];
|
||||
/*2584*/ uint32 spell_book[MAX_PP_REF_SPELLBOOK];
|
||||
/*4504*/ uint8 unknown4540[128]; // Was [428] all 0xff
|
||||
/*4632*/ uint32 mem_spells[MAX_PP_REF_MEMSPELL];
|
||||
/*4668*/ uint8 unknown4704[32]; //
|
||||
/*4700*/ float y; // Player y position
|
||||
/*4704*/ float x; // Player x position
|
||||
/*4708*/ float z; // Player z position
|
||||
/*4712*/ float heading; // Direction player is facing
|
||||
/*4716*/ uint8 unknown4752[4]; //
|
||||
/*4720*/ int32 platinum; // Platinum Pieces on player
|
||||
/*4724*/ int32 gold; // Gold Pieces on player
|
||||
/*4728*/ int32 silver; // Silver Pieces on player
|
||||
/*4732*/ int32 copper; // Copper Pieces on player
|
||||
/*4736*/ int32 platinum_bank; // Platinum Pieces in Bank
|
||||
/*4740*/ int32 gold_bank; // Gold Pieces in Bank
|
||||
/*4744*/ int32 silver_bank; // Silver Pieces in Bank
|
||||
/*4748*/ int32 copper_bank; // Copper Pieces in Bank
|
||||
/*4752*/ int32 platinum_cursor; // Platinum on cursor
|
||||
/*4756*/ int32 gold_cursor; // Gold on cursor
|
||||
/*4760*/ int32 silver_cursor; // Silver on cursor
|
||||
/*4764*/ int32 copper_cursor; // Copper on cursor
|
||||
/*4768*/ int32 platinum_shared; // Platinum shared between characters
|
||||
/*4772*/ uint8 unknown4808[24];
|
||||
/*4796*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
||||
/*5196*/ uint8 unknown5132[184];
|
||||
/*5380*/ uint32 pvp2; //
|
||||
/*5384*/ uint32 unknown5420; //
|
||||
/*5388*/ uint32 pvptype; //
|
||||
/*5392*/ uint32 unknown5428; //
|
||||
/*5396*/ uint32 ability_down; // Guessing
|
||||
/*5400*/ uint8 unknown5436[8]; //
|
||||
/*5408*/ uint32 autosplit; //not used right now
|
||||
/*5412*/ uint8 unknown5448[8];
|
||||
/*5420*/ uint32 zone_change_count; // Number of times user has zoned in their career (guessing)
|
||||
/*5424*/ uint8 unknown5460[16]; //
|
||||
/*5440*/ uint32 drakkin_heritage; //
|
||||
/*5444*/ uint32 drakkin_tattoo; //
|
||||
/*5448*/ uint32 drakkin_details; //
|
||||
/*5452*/ uint32 expansions; // expansion setting, bit field of expansions avaliable
|
||||
/*5456*/ int32 toxicity; //from drinking potions, seems to increase by 3 each time you drink
|
||||
/*5460*/ char unknown5496[16]; //
|
||||
/*5476*/ int32 hunger_level;
|
||||
/*5480*/ int32 thirst_level;
|
||||
/*5484*/ uint32 ability_up;
|
||||
/*5488*/ char unknown5524[16];
|
||||
/*5504*/ uint16 zone_id; // Current zone of the player
|
||||
/*5506*/ uint16 zoneInstance; // Instance ID
|
||||
/*5508*/ Convert::SpellBuff_Struct buffs[BUFF_COUNT]; // Buffs currently on the player
|
||||
/*6008*/ char groupMembers[6][64];//
|
||||
/*6392*/ char unknown6428[656];
|
||||
/*7048*/ uint32 entityid;
|
||||
/*7052*/ uint32 leadAAActive;
|
||||
/*7056*/ uint32 unknown7092;
|
||||
/*7060*/ int32 ldon_points_guk; //client uses these as signed
|
||||
/*7064*/ int32 ldon_points_mir;
|
||||
/*7068*/ int32 ldon_points_mmc;
|
||||
/*7072*/ int32 ldon_points_ruj;
|
||||
/*7076*/ int32 ldon_points_tak;
|
||||
/*7080*/ int32 ldon_points_available;
|
||||
/*7084*/ int32 ldon_wins_guk;
|
||||
/*7088*/ int32 ldon_wins_mir;
|
||||
/*7092*/ int32 ldon_wins_mmc;
|
||||
/*7096*/ int32 ldon_wins_ruj;
|
||||
/*7100*/ int32 ldon_wins_tak;
|
||||
/*7104*/ int32 ldon_losses_guk;
|
||||
/*7108*/ int32 ldon_losses_mir;
|
||||
/*7112*/ int32 ldon_losses_mmc;
|
||||
/*7116*/ int32 ldon_losses_ruj;
|
||||
/*7120*/ int32 ldon_losses_tak;
|
||||
/*7124*/ uint8 unknown7160[72];
|
||||
/*7196*/ uint32 tribute_time_remaining; //in miliseconds
|
||||
/*7200*/ uint32 showhelm;
|
||||
/*7204*/ uint32 career_tribute_points;
|
||||
/*7208*/ uint32 unknown7244;
|
||||
/*7212*/ uint32 tribute_points;
|
||||
/*7216*/ uint32 unknown7252;
|
||||
/*7220*/ uint32 tribute_active; //1=active
|
||||
/*7224*/ Convert::Tribute_Struct tributes[EmuConstants::TRIBUTE_SIZE];
|
||||
/*7264*/ Convert::Disciplines_Struct disciplines;
|
||||
/*7664*/ uint32 recastTimers[MAX_RECAST_TYPES]; // Timers (GMT of last use)
|
||||
/*7744*/ char unknown7780[160];
|
||||
/*7904*/ uint32 endurance;
|
||||
/*7908*/ uint32 group_leadership_exp; //0-1000
|
||||
/*7912*/ uint32 raid_leadership_exp; //0-2000
|
||||
/*7916*/ uint32 group_leadership_points;
|
||||
/*7920*/ uint32 raid_leadership_points;
|
||||
/*7924*/ Convert::LeadershipAA_Struct leader_abilities;
|
||||
/*8052*/ uint8 unknown8088[132];
|
||||
/*8184*/ uint32 air_remaining;
|
||||
/*8188*/ uint32 PVPKills;
|
||||
/*8192*/ uint32 PVPDeaths;
|
||||
/*8196*/ uint32 PVPCurrentPoints;
|
||||
/*8200*/ uint32 PVPCareerPoints;
|
||||
/*8204*/ uint32 PVPBestKillStreak;
|
||||
/*8208*/ uint32 PVPWorstDeathStreak;
|
||||
/*8212*/ uint32 PVPCurrentKillStreak;
|
||||
/*8216*/ Convert::PVPStatsEntry_Struct PVPLastKill;
|
||||
/*8304*/ Convert::PVPStatsEntry_Struct PVPLastDeath;
|
||||
/*8392*/ uint32 PVPNumberOfKillsInLast24Hours;
|
||||
/*8396*/ Convert::PVPStatsEntry_Struct PVPRecentKills[50];
|
||||
/*12796*/ uint32 aapoints_spent;
|
||||
/*12800*/ uint32 expAA;
|
||||
/*12804*/ uint32 aapoints; //avaliable, unspent
|
||||
/*12808*/ uint8 unknown12844[36];
|
||||
/*12844*/ Convert::Bandolier_Struct bandoliers[EmuConstants::BANDOLIERS_COUNT];
|
||||
/*14124*/ uint8 unknown14160[4506];
|
||||
/*18630*/ Convert::SuspendedMinion_Struct SuspendedMinion; // No longer in use
|
||||
/*19240*/ uint32 timeentitledonaccount;
|
||||
/*19244*/ Convert::PotionBelt_Struct potionbelt; //there should be 3 more of these
|
||||
/*19532*/ uint8 unknown19568[8];
|
||||
/*19540*/ uint32 currentRadCrystals; // Current count of radiant crystals
|
||||
/*19544*/ uint32 careerRadCrystals; // Total count of radiant crystals ever
|
||||
/*19548*/ uint32 currentEbonCrystals;// Current count of ebon crystals
|
||||
/*19552*/ uint32 careerEbonCrystals; // Total count of ebon crystals ever
|
||||
/*19556*/ uint8 groupAutoconsent; // 0=off, 1=on
|
||||
/*19557*/ uint8 raidAutoconsent; // 0=off, 1=on
|
||||
/*19558*/ uint8 guildAutoconsent; // 0=off, 1=on
|
||||
/*19559*/ uint8 unknown19595[5]; // ***Placeholder (6/29/2005)
|
||||
/*19564*/ uint32 RestTimer;
|
||||
/*19568*/
|
||||
};
|
||||
|
||||
|
||||
namespace player_lootitem_temp
|
||||
{
|
||||
struct ServerLootItem_Struct_temp {
|
||||
uint32 item_id;
|
||||
int16 equipSlot;
|
||||
uint8 charges;
|
||||
uint16 lootslot;
|
||||
uint32 aug1;
|
||||
uint32 aug2;
|
||||
uint32 aug3;
|
||||
uint32 aug4;
|
||||
uint32 aug5;
|
||||
};
|
||||
}
|
||||
|
||||
struct DBPlayerCorpse_Struct_temp {
|
||||
uint32 crc;
|
||||
bool locked;
|
||||
uint32 itemcount;
|
||||
uint32 exp;
|
||||
float size;
|
||||
uint8 level;
|
||||
uint8 race;
|
||||
uint8 gender;
|
||||
uint8 class_;
|
||||
uint8 deity;
|
||||
uint8 texture;
|
||||
uint8 helmtexture;
|
||||
uint32 copper;
|
||||
uint32 silver;
|
||||
uint32 gold;
|
||||
uint32 plat;
|
||||
Color_Struct item_tint[9];
|
||||
uint8 haircolor;
|
||||
uint8 beardcolor;
|
||||
uint8 eyecolor1;
|
||||
uint8 eyecolor2;
|
||||
uint8 hairstyle;
|
||||
uint8 face;
|
||||
uint8 beard;
|
||||
uint32 drakkin_heritage;
|
||||
uint32 drakkin_tattoo;
|
||||
uint32 drakkin_details;
|
||||
player_lootitem_temp::ServerLootItem_Struct_temp items[0];
|
||||
};
|
||||
|
||||
namespace classic_db_temp {
|
||||
struct DBPlayerCorpse_Struct_temp {
|
||||
uint32 crc;
|
||||
bool locked;
|
||||
uint32 itemcount;
|
||||
uint32 exp;
|
||||
float size;
|
||||
uint8 level;
|
||||
uint8 race;
|
||||
uint8 gender;
|
||||
uint8 class_;
|
||||
uint8 deity;
|
||||
uint8 texture;
|
||||
uint8 helmtexture;
|
||||
uint32 copper;
|
||||
uint32 silver;
|
||||
uint32 gold;
|
||||
uint32 plat;
|
||||
Color_Struct item_tint[9];
|
||||
uint8 haircolor;
|
||||
uint8 beardcolor;
|
||||
uint8 eyecolor1;
|
||||
uint8 eyecolor2;
|
||||
uint8 hairstyle;
|
||||
uint8 face;
|
||||
uint8 beard;
|
||||
player_lootitem_temp::ServerLootItem_Struct_temp items[0];
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#pragma pack()
|
||||
|
||||
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);
|
||||
~Database();
|
||||
bool ThrowDBError(std::string ErrorMessage, std::string query_title, std::string query);
|
||||
|
||||
|
||||
/*
|
||||
@@ -174,8 +573,7 @@ public:
|
||||
* Adventure related.
|
||||
*/
|
||||
void UpdateAdventureStatsEntry(uint32 char_id, uint8 theme, bool win);
|
||||
bool GetAdventureStats(uint32 char_id, uint32 &guk_w, uint32 &mir_w, uint32 &mmc_w, uint32 &ruj_w, uint32 &tak_w,
|
||||
uint32 &guk_l, uint32 &mir_l, uint32 &mmc_l, uint32 &ruj_l, uint32 &tak_l);
|
||||
bool GetAdventureStats(uint32 char_id, AdventureStats_Struct *as);
|
||||
|
||||
/*
|
||||
* Account Related
|
||||
@@ -204,7 +602,7 @@ public:
|
||||
|
||||
void SetGroupLeaderName(uint32 gid, const char* name);
|
||||
char* GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr,
|
||||
GroupLeadershipAA_Struct* GLAA = nullptr);
|
||||
char *mentoree = nullptr, int *mentor_percent = nullptr, GroupLeadershipAA_Struct* GLAA = nullptr);
|
||||
void ClearGroupLeader(uint32 gid = 0);
|
||||
|
||||
|
||||
@@ -215,8 +613,18 @@ public:
|
||||
void ClearRaidDetails(uint32 rid = 0);
|
||||
uint32 GetRaidID(const char* name);
|
||||
const char *GetRaidLeaderName(uint32 rid);
|
||||
void GetGroupLeadershipInfo(uint32 gid, uint32 rid, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr,
|
||||
char *mentoree = nullptr, int *mentor_percent = nullptr, GroupLeadershipAA_Struct* GLAA = nullptr);
|
||||
void GetRaidLeadershipInfo(uint32 rid, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr,
|
||||
RaidLeadershipAA_Struct* RLAA = nullptr);
|
||||
void SetRaidGroupLeaderInfo(uint32 gid, uint32 rid);
|
||||
void ClearRaidLeader(uint32 gid = 0xFFFFFFFF, uint32 rid = 0);
|
||||
|
||||
bool CheckDatabaseConversions();
|
||||
/* Database Conversions*/
|
||||
bool CheckDatabaseConversions();
|
||||
bool CheckDatabaseConvertPPDeblob();
|
||||
bool CheckDatabaseConvertCorpseDeblob();
|
||||
bool CheckDatabaseConvertBotsPostPPDeblob();
|
||||
|
||||
/*
|
||||
* Database Variables
|
||||
@@ -274,6 +682,7 @@ private:
|
||||
*/
|
||||
void ClearAllRaids();
|
||||
void ClearAllRaidDetails();
|
||||
void ClearAllRaidLeaders();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+20
-87
@@ -4,6 +4,7 @@
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <errmsg.h>
|
||||
#include <mysqld_error.h>
|
||||
@@ -113,6 +114,16 @@ MySQLRequestResult DBcore::QueryDatabase(const char* query, uint32 querylen, boo
|
||||
#ifdef _EQDEBUG
|
||||
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
|
||||
#endif
|
||||
|
||||
/* Implement Logging at the Root */
|
||||
if (mysql_errno(&mysql) > 0 && strlen(query) > 0){
|
||||
std::cout << "\n[MYSQL ERR] " << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << " [Query]: \n" << query << "\n" << std::endl;
|
||||
/* Write to log file */
|
||||
std::ofstream log("eqemu_query_error_log.txt", std::ios_base::app | std::ios_base::out);
|
||||
log << "[MYSQL ERR] " << mysql_error(&mysql) << "\n" << query << "\n";
|
||||
log.close();
|
||||
}
|
||||
|
||||
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(&mysql),errorBuffer);
|
||||
|
||||
}
|
||||
@@ -126,7 +137,6 @@ MySQLRequestResult DBcore::QueryDatabase(const char* query, uint32 querylen, boo
|
||||
|
||||
MySQLRequestResult requestResult(res, (uint32)mysql_affected_rows(&mysql), rowCount, (uint32)mysql_field_count(&mysql), (uint32)mysql_insert_id(&mysql));
|
||||
|
||||
|
||||
#if DEBUG_MYSQL_QUERIES >= 1
|
||||
if (requestResult.Success())
|
||||
{
|
||||
@@ -145,93 +155,16 @@ MySQLRequestResult DBcore::QueryDatabase(const char* query, uint32 querylen, boo
|
||||
return requestResult;
|
||||
}
|
||||
|
||||
bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RES** result, uint32* affected_rows, uint32* last_insert_id, uint32* errnum, bool retry) {
|
||||
if (errnum)
|
||||
*errnum = 0;
|
||||
if (errbuf)
|
||||
errbuf[0] = 0;
|
||||
bool ret = false;
|
||||
LockMutex lock(&MDatabase);
|
||||
if (pStatus != Connected)
|
||||
Open();
|
||||
void DBcore::TransactionBegin() {
|
||||
QueryDatabase("START TRANSACTION");
|
||||
}
|
||||
|
||||
if (mysql_real_query(&mysql, query, querylen)) {
|
||||
if (mysql_errno(&mysql) == CR_SERVER_GONE_ERROR)
|
||||
pStatus = Error;
|
||||
if (mysql_errno(&mysql) == CR_SERVER_LOST || mysql_errno(&mysql) == CR_SERVER_GONE_ERROR) {
|
||||
if (retry) {
|
||||
std::cout << "Database Error: Lost connection, attempting to recover...." << std::endl;
|
||||
ret = RunQuery(query, querylen, errbuf, result, affected_rows, last_insert_id, errnum, false);
|
||||
if (ret)
|
||||
std::cout << "Reconnection to database successful." << std::endl;
|
||||
}
|
||||
else {
|
||||
pStatus = Error;
|
||||
if (errnum)
|
||||
*errnum = mysql_errno(&mysql);
|
||||
if (errbuf)
|
||||
snprintf(errbuf, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
|
||||
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (errnum)
|
||||
*errnum = mysql_errno(&mysql);
|
||||
if (errbuf)
|
||||
snprintf(errbuf, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
|
||||
#ifdef _EQDEBUG
|
||||
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
|
||||
#endif
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (result && mysql_field_count(&mysql)) {
|
||||
*result = mysql_store_result(&mysql);
|
||||
#ifdef _EQDEBUG
|
||||
DBMemLeak::Alloc(*result, query);
|
||||
#endif
|
||||
}
|
||||
else if (result)
|
||||
*result = 0;
|
||||
if (affected_rows)
|
||||
*affected_rows = mysql_affected_rows(&mysql);
|
||||
if (last_insert_id)
|
||||
*last_insert_id = (uint32)mysql_insert_id(&mysql);
|
||||
if (result) {
|
||||
if (*result) {
|
||||
ret = true;
|
||||
}
|
||||
else {
|
||||
#ifdef _EQDEBUG
|
||||
std::cout << "DB Query Error: No Result" << std::endl;
|
||||
#endif
|
||||
if (errnum)
|
||||
*errnum = UINT_MAX;
|
||||
if (errbuf)
|
||||
strcpy(errbuf, "DBcore::RunQuery: No Result");
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
ret = true;
|
||||
}
|
||||
}
|
||||
#if DEBUG_MYSQL_QUERIES >= 1
|
||||
if (ret) {
|
||||
std::cout << "query successful";
|
||||
if (result && (*result))
|
||||
std::cout << ", " << (int) mysql_num_rows(*result) << " rows returned";
|
||||
if (affected_rows)
|
||||
std::cout << ", " << (*affected_rows) << " rows affected";
|
||||
std::cout<< std::endl;
|
||||
}
|
||||
else {
|
||||
std::cout << "QUERY: query FAILED" << std::endl;
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
void DBcore::TransactionCommit() {
|
||||
QueryDatabase("COMMIT");
|
||||
}
|
||||
|
||||
void DBcore::TransactionRollback() {
|
||||
QueryDatabase("ROLLBACK");
|
||||
}
|
||||
|
||||
uint32 DBcore::DoEscapeString(char* tobuf, const char* frombuf, uint32 fromlen) {
|
||||
|
||||
+3
-1
@@ -23,9 +23,11 @@ public:
|
||||
DBcore();
|
||||
~DBcore();
|
||||
eStatus GetStatus() { return pStatus; }
|
||||
bool RunQuery(const char* query, uint32 querylen, char* errbuf = 0, MYSQL_RES** result = 0, uint32* affected_rows = 0, uint32* last_insert_id = 0, uint32* errnum = 0, bool retry = true);
|
||||
MySQLRequestResult QueryDatabase(const char* query, uint32 querylen, bool retryOnFailureOnce = true);
|
||||
MySQLRequestResult QueryDatabase(std::string query, bool retryOnFailureOnce = true);
|
||||
void TransactionBegin();
|
||||
void TransactionCommit();
|
||||
void TransactionRollback();
|
||||
uint32 DoEscapeString(char* tobuf, const char* frombuf, uint32 fromlen);
|
||||
void ping();
|
||||
MYSQL* getMySQL(){ return &mysql; }
|
||||
|
||||
@@ -207,6 +207,7 @@ N(OP_GroupInvite2),
|
||||
N(OP_GroupLeaderChange),
|
||||
N(OP_GroupLeadershipAAUpdate),
|
||||
N(OP_GroupMakeLeader),
|
||||
N(OP_GroupMentor),
|
||||
N(OP_GroupRoles),
|
||||
N(OP_GroupUpdate),
|
||||
N(OP_GroupUpdateB),
|
||||
@@ -244,6 +245,7 @@ N(OP_IncreaseStats),
|
||||
N(OP_InitialHPUpdate),
|
||||
N(OP_InitialMobHealth),
|
||||
N(OP_InspectAnswer),
|
||||
N(OP_InspectBuffs),
|
||||
N(OP_InspectMessageUpdate),
|
||||
N(OP_InspectRequest),
|
||||
N(OP_InstillDoubt),
|
||||
|
||||
+91
-2
@@ -810,12 +810,77 @@ enum MaterialUseSlots : uint8
|
||||
**
|
||||
*/
|
||||
|
||||
enum InventoryMapTypes : int16 {
|
||||
MapPossessions = 0,
|
||||
MapBank,
|
||||
MapSharedBank,
|
||||
MapTrade,
|
||||
MapWorld,
|
||||
MapLimbo,
|
||||
MapTribute,
|
||||
MapTrophyTribute,
|
||||
MapGuildTribute,
|
||||
MapMerchant,
|
||||
MapDeleted,
|
||||
MapCorpse,
|
||||
MapBazaar,
|
||||
MapInspect,
|
||||
MapRealEstate,
|
||||
MapViewMODPC,
|
||||
MapViewMODBank,
|
||||
MapViewMODSharedBank,
|
||||
MapViewMODLimbo,
|
||||
MapAltStorage,
|
||||
MapArchived,
|
||||
MapMail,
|
||||
MapGuildTrophyTribute,
|
||||
MapKrono,
|
||||
MapOther,
|
||||
_MapCount
|
||||
};
|
||||
|
||||
enum InventoryMainTypes : int16 {
|
||||
MainCharm = 0,
|
||||
MainEar1,
|
||||
MainHead,
|
||||
MainFace,
|
||||
MainEar2,
|
||||
MainNeck,
|
||||
MainShoulders,
|
||||
MainArms,
|
||||
MainBack,
|
||||
MainWrist1,
|
||||
MainWrist2,
|
||||
MainRange,
|
||||
MainHands,
|
||||
MainPrimary,
|
||||
MainSecondary,
|
||||
MainFinger1,
|
||||
MainFinger2,
|
||||
MainChest,
|
||||
MainLegs,
|
||||
MainFeet,
|
||||
MainWaist,
|
||||
MainPowerSource = 9999, // temp
|
||||
MainAmmo = 21, // temp
|
||||
MainGeneral1,
|
||||
MainGeneral2,
|
||||
MainGeneral3,
|
||||
MainGeneral4,
|
||||
MainGeneral5,
|
||||
MainGeneral6,
|
||||
MainGeneral7,
|
||||
MainGeneral8,
|
||||
//MainGeneral9,
|
||||
//MainGeneral10,
|
||||
MainCursor,
|
||||
_MainCount
|
||||
};
|
||||
|
||||
#define INVALID_INDEX -1
|
||||
#define NOT_USED 0
|
||||
#define NO_ITEM 0
|
||||
|
||||
#define DB_ITEM_CONTAINER_SIZE 255 // probably need to move to database.h
|
||||
|
||||
// yes..these are redundant... but, they help to identify and define what is actually being performed
|
||||
// plus, since they're pre-op's, they don't affect the actual binary size
|
||||
#define MAP_BEGIN 0
|
||||
@@ -903,4 +968,28 @@ namespace legacy {
|
||||
} InventorySlot;
|
||||
}
|
||||
|
||||
#pragma pack(1) // will be used in packets as well as other inventory-related systems
|
||||
|
||||
struct ItemSlot_Struct
|
||||
{
|
||||
int16 indexMap;
|
||||
int16 unknown02;
|
||||
int16 indexMain;
|
||||
int16 indexSub;
|
||||
int16 indexAug;
|
||||
int16 unknown01;
|
||||
};
|
||||
|
||||
struct ItemSlotShort_Struct
|
||||
{
|
||||
int16 indexMain;
|
||||
int16 indexSub;
|
||||
int16 indexAug;
|
||||
int16 unknown01;
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
static const uint32 MAX_SPELL_DB_ID_VAL = 65535;
|
||||
|
||||
#endif
|
||||
|
||||
+218
-210
@@ -216,10 +216,12 @@ std::string EmuConstants::InventoryMainName(int16 main) {
|
||||
return "General 7";
|
||||
case MainGeneral8:
|
||||
return "General 8";
|
||||
/*
|
||||
case MainGeneral9:
|
||||
return "General 9";
|
||||
case MainGeneral10:
|
||||
return "General 10";
|
||||
*/
|
||||
case MainCursor:
|
||||
return "Cursor";
|
||||
default:
|
||||
@@ -515,7 +517,7 @@ EQClientVersion EQLimits::ValidateMobVersion(EQClientVersion version) {
|
||||
// inventory
|
||||
uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
// not all maps will have an instantiated container..some are references for queue generators (i.e., bazaar, mail, etc...)
|
||||
// a zero '0' indicates a needed value..otherwise, change to 'NOT_USED' for a null value so indices requiring research can be identified
|
||||
// a zero '0' indicates a needed value..otherwise, change to '_NOTUSED' for a null value so indices requiring research can be identified
|
||||
// ALL of these values need to be verified before pushing to live
|
||||
//
|
||||
// make sure that you transcribe the actual value from 'defaults' to here before updating or client crashes will ensue..and/or...
|
||||
@@ -537,7 +539,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoD*/ EmuConstants::MAP_POSSESSIONS_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_POSSESSIONS_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_POSSESSIONS_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_POSSESSIONS_SIZE,
|
||||
|
||||
/*NPC*/ EmuConstants::MAP_POSSESSIONS_SIZE,
|
||||
/*Merc*/ EmuConstants::MAP_POSSESSIONS_SIZE,
|
||||
@@ -552,7 +554,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoD*/ EmuConstants::MAP_BANK_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_BANK_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_BANK_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_BANK_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
@@ -567,7 +569,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoD*/ EmuConstants::MAP_SHARED_BANK_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_SHARED_BANK_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_SHARED_BANK_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_SHARED_BANK_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
@@ -582,12 +584,12 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoD*/ EmuConstants::MAP_TRADE_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_TRADE_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_TRADE_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_TRADE_SIZE,
|
||||
|
||||
/*NPC*/ EmuConstants::TRADE_NPC_SIZE,
|
||||
/*Merc*/ EmuConstants::TRADE_NPC_SIZE,
|
||||
/*NPC*/ 4,
|
||||
/*Merc*/ 4,
|
||||
/*Bot*/ EmuConstants::MAP_TRADE_SIZE, // client thinks this is another client
|
||||
/*Pet*/ EmuConstants::TRADE_NPC_SIZE
|
||||
/*Pet*/ 4
|
||||
},
|
||||
{ // local[MapWorld]
|
||||
/*Unknown*/ NOT_USED,
|
||||
@@ -597,7 +599,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoD*/ EmuConstants::MAP_WORLD_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_WORLD_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_WORLD_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_WORLD_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
@@ -612,7 +614,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoD*/ EmuConstants::MAP_LIMBO_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_LIMBO_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_LIMBO_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_LIMBO_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
@@ -627,72 +629,72 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoD*/ EmuConstants::MAP_TRIBUTE_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_TRIBUTE_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_TRIBUTE_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_TRIBUTE_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapTrophyTribute]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_TROPHY_TRIBUTE_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_TROPHY_TRIBUTE_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_TROPHY_TRIBUTE_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_TROPHY_TRIBUTE_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_TROPHY_TRIBUTE_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_TROPHY_TRIBUTE_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_TROPHY_TRIBUTE_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapGuildTribute]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_GUILD_TRIBUTE_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_GUILD_TRIBUTE_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_GUILD_TRIBUTE_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_GUILD_TRIBUTE_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_GUILD_TRIBUTE_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_GUILD_TRIBUTE_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_GUILD_TRIBUTE_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapMerchant]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_MERCHANT_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_MERCHANT_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_MERCHANT_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_MERCHANT_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_MERCHANT_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_MERCHANT_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_MERCHANT_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapDeleted]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_DELETED_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_DELETED_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_DELETED_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_DELETED_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_DELETED_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_DELETED_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_DELETED_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapCorpse]
|
||||
/*Unknown*/ NOT_USED,
|
||||
@@ -701,13 +703,13 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoF*/ SoF::consts::MAP_CORPSE_SIZE,
|
||||
/*SoD*/ SoD::consts::MAP_CORPSE_SIZE,
|
||||
/*Underfoot*/ Underfoot::consts::MAP_CORPSE_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_CORPSE_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF*/ RoF::consts::MAP_CORPSE_SIZE,
|
||||
/*RoF2*/ RoF2::consts::MAP_CORPSE_SIZE,
|
||||
|
||||
/*NPC*/ EmuConstants::MAP_CORPSE_SIZE,
|
||||
/*Merc*/ EmuConstants::MAP_CORPSE_SIZE,
|
||||
/*Bot*/ EmuConstants::MAP_CORPSE_SIZE,
|
||||
/*Pet*/ EmuConstants::MAP_CORPSE_SIZE
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapBazaar]
|
||||
/*Unknown*/ NOT_USED,
|
||||
@@ -717,22 +719,22 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
/*SoD*/ EmuConstants::MAP_BAZAAR_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_BAZAAR_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_BAZAAR_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_BAZAAR_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED, // this may need to be 'EmuConstants::MAP_BAZAAR_SIZE' if offline client traders respawn as an npc
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0, // this may need to be 'EmuConstants::MAP_BAZAAR_SIZE' if offline client traders respawn as an npc
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapInspect]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ Client62::consts::MAP_INSPECT_SIZE,
|
||||
/*Titanium*/ Titanium::consts::MAP_INSPECT_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_INSPECT_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_INSPECT_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_INSPECT_SIZE,
|
||||
/*RoF*/ EmuConstants::MAP_INSPECT_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*SoF*/ SoF::consts::MAP_INSPECT_SIZE,
|
||||
/*SoD*/ SoD::consts::MAP_INSPECT_SIZE,
|
||||
/*Underfoot*/ Underfoot::consts::MAP_INSPECT_SIZE,
|
||||
/*RoF*/ RoF::consts::MAP_INSPECT_SIZE,
|
||||
/*RoF2*/ RoF2::consts::MAP_INSPECT_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
@@ -741,168 +743,168 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
},
|
||||
{ // local[MapRealEstate]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_REAL_ESTATE_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_REAL_ESTATE_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_REAL_ESTATE_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_REAL_ESTATE_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_REAL_ESTATE_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_REAL_ESTATE_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_REAL_ESTATE_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapViewMODPC]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_VIEW_MOD_PC_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_VIEW_MOD_PC_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_VIEW_MOD_PC_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_VIEW_MOD_PC_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_VIEW_MOD_PC_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_VIEW_MOD_PC_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_VIEW_MOD_PC_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapViewMODBank]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_VIEW_MOD_BANK_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_VIEW_MOD_BANK_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_VIEW_MOD_BANK_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_VIEW_MOD_BANK_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_VIEW_MOD_BANK_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_VIEW_MOD_BANK_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_VIEW_MOD_BANK_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapViewMODSharedBank]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_VIEW_MOD_SHARED_BANK_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_VIEW_MOD_SHARED_BANK_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_VIEW_MOD_SHARED_BANK_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_VIEW_MOD_SHARED_BANK_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_VIEW_MOD_SHARED_BANK_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_VIEW_MOD_SHARED_BANK_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_VIEW_MOD_SHARED_BANK_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapViewMODLimbo]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_VIEW_MOD_LIMBO_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_VIEW_MOD_LIMBO_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_VIEW_MOD_LIMBO_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_VIEW_MOD_LIMBO_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_VIEW_MOD_LIMBO_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_VIEW_MOD_LIMBO_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_VIEW_MOD_LIMBO_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapAltStorage]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_ALT_STORAGE_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_ALT_STORAGE_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_ALT_STORAGE_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_ALT_STORAGE_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_ALT_STORAGE_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_ALT_STORAGE_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_ALT_STORAGE_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapArchived]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_ARCHIVED_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_ARCHIVED_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_ARCHIVED_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_ARCHIVED_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_ARCHIVED_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_ARCHIVED_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_ARCHIVED_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapMail]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_MAIL_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_MAIL_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_MAIL_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_MAIL_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_MAIL_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_MAIL_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_MAIL_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapGuildTrophyTribute]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_GUILD_TROPHY_TRIBUTE_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_GUILD_TROPHY_TRIBUTE_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_GUILD_TROPHY_TRIBUTE_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_GUILD_TROPHY_TRIBUTE_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_GUILD_TROPHY_TRIBUTE_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_GUILD_TROPHY_TRIBUTE_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_GUILD_TROPHY_TRIBUTE_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapKrono]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ Client62::consts::MAP_KRONO_SIZE,
|
||||
/*Titanium*/ Titanium::consts::MAP_KRONO_SIZE,
|
||||
/*SoF*/ SoF::consts::MAP_KRONO_SIZE,
|
||||
/*SoD*/ SoD::consts::MAP_KRONO_SIZE,
|
||||
/*Underfoot*/ Underfoot::consts::MAP_KRONO_SIZE,
|
||||
/*62*/ NOT_USED,
|
||||
/*Titanium*/ NOT_USED,
|
||||
/*SoF*/ NOT_USED,
|
||||
/*SoD*/ NOT_USED,
|
||||
/*Underfoot*/ NOT_USED,
|
||||
/*RoF*/ EmuConstants::MAP_KRONO_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_KRONO_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
},
|
||||
{ // local[MapOther]
|
||||
/*Unknown*/ NOT_USED,
|
||||
/*62*/ EmuConstants::MAP_OTHER_SIZE,
|
||||
/*Titanium*/ EmuConstants::MAP_OTHER_SIZE,
|
||||
/*SoF*/ EmuConstants::MAP_OTHER_SIZE,
|
||||
/*SoD*/ EmuConstants::MAP_OTHER_SIZE,
|
||||
/*Underfoot*/ EmuConstants::MAP_OTHER_SIZE,
|
||||
/*62*/ 0,
|
||||
/*Titanium*/ 0,
|
||||
/*SoF*/ 0,
|
||||
/*SoD*/ 0,
|
||||
/*Underfoot*/ 0,
|
||||
/*RoF*/ EmuConstants::MAP_OTHER_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::MAP_OTHER_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
}
|
||||
};
|
||||
|
||||
@@ -913,6 +915,7 @@ uint16 EQLimits::InventoryMapSize(int16 map, uint32 version) {
|
||||
}
|
||||
|
||||
uint64 EQLimits::PossessionsBitmask(uint32 version) {
|
||||
// these are for the new inventory system (RoF)..not the current (Ti) one...
|
||||
// 0x0000000000200000 is SlotPowerSource (SoF+)
|
||||
// 0x0000000080000000 is SlotGeneral9 (RoF+)
|
||||
// 0x0000000100000000 is SlotGeneral10 (RoF+)
|
||||
@@ -927,13 +930,14 @@ uint64 EQLimits::PossessionsBitmask(uint32 version) {
|
||||
/*RoF*/ 0x00000003FFFFFFFF,
|
||||
/*RoF2*/ 0,
|
||||
|
||||
/*NPC*/ 0x00000000007FFFFF, // limited to equipment slots..for the time being
|
||||
/*Merc*/ 0x00000000007FFFFF,
|
||||
/*Bot*/ 0x00000000007FFFFF,
|
||||
/*Pet*/ 0x00000000007FFFFF
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
};
|
||||
|
||||
return local[ValidateMobVersion(version)];
|
||||
return NOT_USED;
|
||||
//return local[ValidateMobVersion(version)];
|
||||
}
|
||||
|
||||
uint64 EQLimits::EquipmentBitmask(uint32 version) {
|
||||
@@ -947,13 +951,14 @@ uint64 EQLimits::EquipmentBitmask(uint32 version) {
|
||||
/*RoF*/ 0x00000000007FFFFF,
|
||||
/*RoF2*/ 0,
|
||||
|
||||
/*NPC*/ 0x00000000007FFFFF,
|
||||
/*Merc*/ 0x00000000007FFFFF,
|
||||
/*Bot*/ 0x00000000007FFFFF,
|
||||
/*Pet*/ 0x00000000007FFFFF
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
};
|
||||
|
||||
return local[ValidateMobVersion(version)];
|
||||
return NOT_USED;
|
||||
//return local[ValidateMobVersion(version)];
|
||||
}
|
||||
|
||||
uint64 EQLimits::GeneralBitmask(uint32 version) {
|
||||
@@ -967,13 +972,14 @@ uint64 EQLimits::GeneralBitmask(uint32 version) {
|
||||
/*RoF*/ 0x00000001FF800000,
|
||||
/*RoF2*/ 0,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
};
|
||||
|
||||
return local[ValidateMobVersion(version)];
|
||||
return NOT_USED;
|
||||
//return local[ValidateMobVersion(version)];
|
||||
}
|
||||
|
||||
uint64 EQLimits::CursorBitmask(uint32 version) {
|
||||
@@ -987,13 +993,14 @@ uint64 EQLimits::CursorBitmask(uint32 version) {
|
||||
/*RoF*/ 0x0000000200000000,
|
||||
/*RoF2*/ 0,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
/*Bot*/ NOT_USED,
|
||||
/*Pet*/ NOT_USED
|
||||
/*NPC*/ 0,
|
||||
/*Merc*/ 0,
|
||||
/*Bot*/ 0,
|
||||
/*Pet*/ 0
|
||||
};
|
||||
|
||||
return local[ValidateMobVersion(version)];
|
||||
return NOT_USED;
|
||||
//return local[ValidateMobVersion(version)];
|
||||
}
|
||||
|
||||
bool EQLimits::AllowsEmptyBagInBag(uint32 version) {
|
||||
@@ -1005,7 +1012,7 @@ bool EQLimits::AllowsEmptyBagInBag(uint32 version) {
|
||||
/*SoD*/ SoD::limits::ALLOWS_EMPTY_BAG_IN_BAG,
|
||||
/*Underfoot*/ Underfoot::limits::ALLOWS_EMPTY_BAG_IN_BAG,
|
||||
/*RoF*/ RoF::limits::ALLOWS_EMPTY_BAG_IN_BAG,
|
||||
/*RoF2*/ false,
|
||||
/*RoF2*/ RoF2::limits::ALLOWS_EMPTY_BAG_IN_BAG,
|
||||
|
||||
/*NPC*/ false,
|
||||
/*Merc*/ false,
|
||||
@@ -1013,7 +1020,8 @@ bool EQLimits::AllowsEmptyBagInBag(uint32 version) {
|
||||
/*Pet*/ false
|
||||
};
|
||||
|
||||
return local[ValidateMobVersion(version)];
|
||||
return false; // not implemented
|
||||
//return local[ValidateMobVersion(version)];
|
||||
}
|
||||
|
||||
bool EQLimits::AllowsClickCastFromBag(uint32 version) {
|
||||
@@ -1025,7 +1033,7 @@ bool EQLimits::AllowsClickCastFromBag(uint32 version) {
|
||||
/*SoD*/ SoD::limits::ALLOWS_CLICK_CAST_FROM_BAG,
|
||||
/*Underfoot*/ Underfoot::limits::ALLOWS_CLICK_CAST_FROM_BAG,
|
||||
/*RoF*/ RoF::limits::ALLOWS_CLICK_CAST_FROM_BAG,
|
||||
/*RoF2*/ false,
|
||||
/*RoF2*/ RoF2::limits::ALLOWS_CLICK_CAST_FROM_BAG,
|
||||
|
||||
/*NPC*/ false,
|
||||
/*Merc*/ false,
|
||||
@@ -1046,7 +1054,7 @@ uint16 EQLimits::ItemCommonSize(uint32 version) {
|
||||
/*SoD*/ EmuConstants::ITEM_COMMON_SIZE,
|
||||
/*Underfoot*/ EmuConstants::ITEM_COMMON_SIZE,
|
||||
/*RoF*/ EmuConstants::ITEM_COMMON_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::ITEM_COMMON_SIZE,
|
||||
|
||||
/*NPC*/ EmuConstants::ITEM_COMMON_SIZE,
|
||||
/*Merc*/ EmuConstants::ITEM_COMMON_SIZE,
|
||||
@@ -1066,7 +1074,7 @@ uint16 EQLimits::ItemContainerSize(uint32 version) {
|
||||
/*SoD*/ EmuConstants::ITEM_CONTAINER_SIZE,
|
||||
/*Underfoot*/ EmuConstants::ITEM_CONTAINER_SIZE,
|
||||
/*RoF*/ EmuConstants::ITEM_CONTAINER_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::ITEM_CONTAINER_SIZE,
|
||||
|
||||
/*NPC*/ EmuConstants::ITEM_CONTAINER_SIZE,
|
||||
/*Merc*/ EmuConstants::ITEM_CONTAINER_SIZE,
|
||||
@@ -1086,7 +1094,7 @@ bool EQLimits::CoinHasWeight(uint32 version) {
|
||||
/*SoD*/ SoD::limits::COIN_HAS_WEIGHT,
|
||||
/*Underfoot*/ Underfoot::limits::COIN_HAS_WEIGHT,
|
||||
/*RoF*/ RoF::limits::COIN_HAS_WEIGHT,
|
||||
/*RoF2*/ true,
|
||||
/*RoF2*/ RoF::limits::COIN_HAS_WEIGHT,
|
||||
|
||||
/*NPC*/ true,
|
||||
/*Merc*/ true,
|
||||
@@ -1106,7 +1114,7 @@ uint32 EQLimits::BandoliersCount(uint32 version) {
|
||||
/*SoD*/ EmuConstants::BANDOLIERS_COUNT,
|
||||
/*Underfoot*/ EmuConstants::BANDOLIERS_COUNT,
|
||||
/*RoF*/ EmuConstants::BANDOLIERS_COUNT,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::BANDOLIERS_COUNT,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
@@ -1126,7 +1134,7 @@ uint32 EQLimits::BandolierSize(uint32 version) {
|
||||
/*SoD*/ EmuConstants::BANDOLIER_SIZE,
|
||||
/*Underfoot*/ EmuConstants::BANDOLIER_SIZE,
|
||||
/*RoF*/ EmuConstants::BANDOLIER_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::BANDOLIER_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
@@ -1146,7 +1154,7 @@ uint32 EQLimits::PotionBeltSize(uint32 version) {
|
||||
/*SoD*/ EmuConstants::POTION_BELT_SIZE,
|
||||
/*Underfoot*/ EmuConstants::POTION_BELT_SIZE,
|
||||
/*RoF*/ EmuConstants::POTION_BELT_SIZE,
|
||||
/*RoF2*/ 0,
|
||||
/*RoF2*/ EmuConstants::POTION_BELT_SIZE,
|
||||
|
||||
/*NPC*/ NOT_USED,
|
||||
/*Merc*/ NOT_USED,
|
||||
|
||||
+52
-52
@@ -39,8 +39,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
// Hard-coded values usually indicate that further research is needed and the values given are from the old (known) system
|
||||
|
||||
using namespace RoF2::maps; // server inventory maps enumeration (code and database sync'd to reference)
|
||||
using namespace RoF2::slots; // server possessions slots enumeration (code and database sync'd to reference)
|
||||
// (future use)
|
||||
//using namespace RoF2::maps; // server inventory maps enumeration (code and database sync'd to reference)
|
||||
//using namespace RoF::slots; // server possessions slots enumeration (code and database sync'd to reference)
|
||||
|
||||
class EmuConstants {
|
||||
// an immutable value is required to initialize arrays, etc... use this class as a repository for those
|
||||
@@ -57,20 +58,20 @@ public:
|
||||
static std::string InventoryAugName(int16 aug);
|
||||
|
||||
// these are currently hard-coded for existing inventory system..do not use in place of special client version handlers until ready
|
||||
static const uint16 MAP_POSSESSIONS_SIZE = RoF2::consts::MAP_POSSESSIONS_SIZE;
|
||||
static const uint16 MAP_BANK_SIZE = RoF2::consts::MAP_BANK_SIZE;
|
||||
static const uint16 MAP_SHARED_BANK_SIZE = RoF2::consts::MAP_SHARED_BANK_SIZE;
|
||||
static const uint16 MAP_TRADE_SIZE = RoF2::consts::MAP_TRADE_SIZE;
|
||||
static const uint16 MAP_WORLD_SIZE = RoF2::consts::MAP_WORLD_SIZE;
|
||||
static const uint16 MAP_LIMBO_SIZE = RoF2::consts::MAP_LIMBO_SIZE;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = Titanium::consts::MAP_TRIBUTE_SIZE; // server is setup for 'presumed' Titanium value of 5..if Titanium::consts is changed, hard-code this to '5' until server/db is updated
|
||||
static const uint16 MAP_POSSESSIONS_SIZE = _MainCount;
|
||||
static const uint16 MAP_BANK_SIZE = 24;
|
||||
static const uint16 MAP_SHARED_BANK_SIZE = 2;
|
||||
static const uint16 MAP_TRADE_SIZE = 8;
|
||||
static const uint16 MAP_WORLD_SIZE = 10;
|
||||
static const uint16 MAP_LIMBO_SIZE = 36;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 5; // (need client values)
|
||||
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||
static const uint16 MAP_DELETED_SIZE = 0;
|
||||
static const uint16 MAP_CORPSE_SIZE = RoF2::consts::MAP_CORPSE_SIZE; // no bitmask use..limits to size of client corpse window (see EQLimits::InventoryMapSize(MapCorpse, <EQClientVersion))
|
||||
static const uint16 MAP_BAZAAR_SIZE = Titanium::consts::MAP_BAZAAR_SIZE;
|
||||
static const uint16 MAP_INSPECT_SIZE = RoF2::consts::MAP_INSPECT_SIZE;
|
||||
static const uint16 MAP_CORPSE_SIZE = _MainCount; // no bitmask use..limits to size of client corpse window (see EQLimits::InventoryMapSize(MapCorpse, <EQClientVersion))
|
||||
static const uint16 MAP_BAZAAR_SIZE = 80;
|
||||
static const uint16 MAP_INSPECT_SIZE = 22;
|
||||
static const uint16 MAP_REAL_ESTATE_SIZE = 0;
|
||||
static const uint16 MAP_VIEW_MOD_PC_SIZE = NOT_USED;
|
||||
static const uint16 MAP_VIEW_MOD_BANK_SIZE = NOT_USED;
|
||||
@@ -80,61 +81,60 @@ public:
|
||||
static const uint16 MAP_ARCHIVED_SIZE = 0;
|
||||
static const uint16 MAP_MAIL_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_KRONO_SIZE = RoF::consts::MAP_KRONO_SIZE;
|
||||
static const uint16 MAP_KRONO_SIZE = 0;
|
||||
static const uint16 MAP_OTHER_SIZE = 0;
|
||||
|
||||
// most of these definitions will go away with the structure-based system..this maintains compatibility for now
|
||||
// (these are mainly to assign specific values to constants used in conversions and to identify per-client ranges/offsets)
|
||||
static const int16 EQUIPMENT_BEGIN = RoF2::consts::EQUIPMENT_BEGIN;
|
||||
static const int16 EQUIPMENT_END = RoF2::consts::EQUIPMENT_END;
|
||||
static const uint16 EQUIPMENT_SIZE = RoF2::consts::EQUIPMENT_SIZE;
|
||||
static const int16 EQUIPMENT_BEGIN = MainCharm;
|
||||
static const int16 EQUIPMENT_END = MainAmmo;
|
||||
static const uint16 EQUIPMENT_SIZE = 22; // does not account for 'Power Source' - used mainly for npc equipment arrays
|
||||
|
||||
static const int16 GENERAL_BEGIN = RoF2::consts::GENERAL_BEGIN;
|
||||
static const int16 GENERAL_END = RoF2::consts::GENERAL_END;
|
||||
static const uint16 GENERAL_SIZE = RoF2::consts::GENERAL_SIZE;
|
||||
static const int16 GENERAL_BAGS_BEGIN = RoF2::consts::GENERAL_BAGS_BEGIN;
|
||||
static const int16 GENERAL_BAGS_END_OFFSET = RoF2::consts::GENERAL_BAGS_END_OFFSET;
|
||||
static const int16 GENERAL_BAGS_END = RoF2::consts::GENERAL_BAGS_END;
|
||||
static const int16 GENERAL_BEGIN = MainGeneral1;
|
||||
static const int16 GENERAL_END = MainGeneral8;
|
||||
static const uint16 GENERAL_SIZE = 8;
|
||||
static const int16 GENERAL_BAGS_BEGIN = 251;
|
||||
static const int16 GENERAL_BAGS_END_OFFSET = 79;
|
||||
static const int16 GENERAL_BAGS_END = GENERAL_BAGS_BEGIN + GENERAL_BAGS_END_OFFSET;
|
||||
|
||||
static const int16 CURSOR_BAG_BEGIN = RoF2::consts::CURSOR_BAG_BEGIN;
|
||||
static const int16 CURSOR_BAG_END_OFFSET = RoF2::consts::CURSOR_BAG_END_OFFSET;
|
||||
static const int16 CURSOR_BAG_END = RoF2::consts::CURSOR_BAG_END;
|
||||
static const int16 CURSOR_BAG_BEGIN = 331;
|
||||
static const int16 CURSOR_BAG_END_OFFSET = 9;
|
||||
static const int16 CURSOR_BAG_END = CURSOR_BAG_BEGIN + CURSOR_BAG_END_OFFSET;
|
||||
|
||||
static const int16 BANK_BEGIN = RoF2::consts::BANK_BEGIN;
|
||||
static const int16 BANK_END = RoF2::consts::BANK_END;
|
||||
static const int16 BANK_BAGS_BEGIN = RoF2::consts::BANK_BAGS_BEGIN;
|
||||
static const int16 BANK_BAGS_END_OFFSET = RoF2::consts::BANK_BAGS_END_OFFSET;
|
||||
static const int16 BANK_BAGS_END = RoF2::consts::BANK_BAGS_END;
|
||||
static const int16 BANK_BEGIN = 2000;
|
||||
static const int16 BANK_END = 2023;
|
||||
static const int16 BANK_BAGS_BEGIN = 2031;
|
||||
static const int16 BANK_BAGS_END_OFFSET = 239;
|
||||
static const int16 BANK_BAGS_END = BANK_BAGS_BEGIN + BANK_BAGS_END_OFFSET;
|
||||
|
||||
static const int16 SHARED_BANK_BEGIN = RoF2::consts::SHARED_BANK_BEGIN;
|
||||
static const int16 SHARED_BANK_END = RoF2::consts::SHARED_BANK_END;
|
||||
static const int16 SHARED_BANK_BAGS_BEGIN = RoF2::consts::SHARED_BANK_BAGS_BEGIN;
|
||||
static const int16 SHARED_BANK_BAGS_END_OFFSET = RoF2::consts::SHARED_BANK_BAGS_END_OFFSET;
|
||||
static const int16 SHARED_BANK_BAGS_END = RoF2::consts::SHARED_BANK_BAGS_END;
|
||||
static const int16 SHARED_BANK_BEGIN = 2500;
|
||||
static const int16 SHARED_BANK_END = 2501;
|
||||
static const int16 SHARED_BANK_BAGS_BEGIN = 2531;
|
||||
static const int16 SHARED_BANK_BAGS_END_OFFSET = 19;
|
||||
static const int16 SHARED_BANK_BAGS_END = SHARED_BANK_BAGS_BEGIN + SHARED_BANK_BAGS_END_OFFSET;
|
||||
|
||||
static const int16 TRADE_BEGIN = RoF2::consts::TRADE_BEGIN;
|
||||
static const int16 TRADE_END = RoF2::consts::TRADE_END;
|
||||
static const int16 TRADE_NPC_END = RoF2::consts::TRADE_NPC_END;
|
||||
static const int16 TRADE_NPC_SIZE = RoF2::consts::TRADE_NPC_SIZE;
|
||||
static const int16 TRADE_BAGS_BEGIN = RoF2::consts::TRADE_BAGS_BEGIN;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = RoF2::consts::TRADE_BAGS_END_OFFSET;
|
||||
static const int16 TRADE_BAGS_END = RoF2::consts::TRADE_BAGS_END;
|
||||
static const int16 TRADE_BEGIN = 3000;
|
||||
static const int16 TRADE_END = 3007;
|
||||
static const int16 TRADE_NPC_END = 3003;
|
||||
static const int16 TRADE_BAGS_BEGIN = 3031;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = 79;
|
||||
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
|
||||
|
||||
static const int16 WORLD_BEGIN = RoF2::consts::WORLD_BEGIN;
|
||||
static const int16 WORLD_END = RoF2::consts::WORLD_END;
|
||||
static const int16 WORLD_BEGIN = 4000;
|
||||
static const int16 WORLD_END = 4009;
|
||||
static const int16 WORLD_SIZE = MAP_WORLD_SIZE;
|
||||
|
||||
static const int16 TRIBUTE_BEGIN = RoF2::consts::TRIBUTE_BEGIN;
|
||||
static const int16 TRIBUTE_END = RoF2::consts::TRIBUTE_END;
|
||||
static const int16 TRIBUTE_BEGIN = 400;
|
||||
static const int16 TRIBUTE_END = 404;
|
||||
static const int16 TRIBUTE_SIZE = MAP_TRIBUTE_SIZE;
|
||||
|
||||
static const int16 CORPSE_BEGIN = RoF2::consts::CORPSE_BEGIN;
|
||||
static const int16 CORPSE_END = RoF2::consts::CORPSE_END;
|
||||
static const int16 CORPSE_BEGIN = 22;
|
||||
//static const int16 CORPSE_END = RoF::consts::CORPSE_END; // not ready for use
|
||||
|
||||
static const int16 MATERIAL_BEGIN = Underfoot::consts::MATERIAL_BEGIN;
|
||||
static const int16 MATERIAL_END = Underfoot::consts::MATERIAL_END;
|
||||
static const int16 MATERIAL_TINT_END = Underfoot::consts::MATERIAL_TINT_END;
|
||||
static const int16 MATERIAL_SIZE = Underfoot::consts::MATERIAL_SIZE;
|
||||
static const int16 MATERIAL_BEGIN = MaterialHead;
|
||||
static const int16 MATERIAL_END = MaterialSecondary;
|
||||
static const int16 MATERIAL_TINT_END = MaterialFeet;
|
||||
static const int16 MATERIAL_SIZE = _MaterialCount;
|
||||
|
||||
// items
|
||||
// common and container sizes will not increase until the new 'location' struct is implemented
|
||||
|
||||
+118
-30
@@ -478,7 +478,11 @@ struct CastSpell_Struct
|
||||
uint32 spell_id;
|
||||
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
||||
uint32 target_id;
|
||||
uint8 cs_unknown[4];
|
||||
uint32 cs_unknown1;
|
||||
uint32 cs_unknown2;
|
||||
float y_pos;
|
||||
float x_pos;
|
||||
float z_pos;
|
||||
};
|
||||
|
||||
struct SpellEffect_Struct
|
||||
@@ -597,8 +601,8 @@ struct GMTrainee_Struct
|
||||
{
|
||||
/*000*/ uint32 npcid;
|
||||
/*004*/ uint32 playerid;
|
||||
/*008*/ uint32 skills[73];
|
||||
/*300*/ uint8 unknown300[148];
|
||||
/*008*/ uint32 skills[PACKET_SKILL_ARRAY_SIZE];
|
||||
/*408*/ uint8 unknown408[40];
|
||||
/*448*/
|
||||
};
|
||||
|
||||
@@ -759,14 +763,62 @@ struct MovePotionToBelt_Struct {
|
||||
static const uint32 MAX_GROUP_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_RAID_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_LEADERSHIP_AA_ARRAY = (MAX_GROUP_LEADERSHIP_AA_ARRAY+MAX_RAID_LEADERSHIP_AA_ARRAY);
|
||||
struct LeadershipAA_Struct {
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
struct GroupLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 groupAAMarkNPC;
|
||||
uint32 groupAANPCHealth;
|
||||
uint32 groupAADelegateMainAssist;
|
||||
uint32 groupAADelegateMarkNPC;
|
||||
uint32 groupAA4;
|
||||
uint32 groupAA5;
|
||||
uint32 groupAAInspectBuffs;
|
||||
uint32 groupAA7;
|
||||
uint32 groupAASpellAwareness;
|
||||
uint32 groupAAOffenseEnhancement;
|
||||
uint32 groupAAManaEnhancement;
|
||||
uint32 groupAAHealthEnhancement;
|
||||
uint32 groupAAHealthRegeneration;
|
||||
uint32 groupAAFindPathToPC;
|
||||
uint32 groupAAHealthOfTargetsTarget;
|
||||
uint32 groupAA15;
|
||||
};
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct RaidLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 raidAAMarkNPC;
|
||||
uint32 raidAANPCHealth;
|
||||
uint32 raidAADelegateMainAssist;
|
||||
uint32 raidAADelegateMarkNPC;
|
||||
uint32 raidAA4;
|
||||
uint32 raidAA5;
|
||||
uint32 raidAA6;
|
||||
uint32 raidAASpellAwareness;
|
||||
uint32 raidAAOffenseEnhancement;
|
||||
uint32 raidAAManaEnhancement;
|
||||
uint32 raidAAHealthEnhancement;
|
||||
uint32 raidAAHealthRegeneration;
|
||||
uint32 raidAAFindPathToPC;
|
||||
uint32 raidAAHealthOfTargetsTarget;
|
||||
uint32 raidAA14;
|
||||
uint32 raidAA15;
|
||||
};
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
GroupLeadershipAA_Struct group;
|
||||
RaidLeadershipAA_Struct raid;
|
||||
};
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -779,17 +831,18 @@ struct BindStruct {
|
||||
/*008*/ float y;
|
||||
/*012*/ float z;
|
||||
/*016*/ float heading;
|
||||
/*020*/
|
||||
/*020*/ uint32 instance_id;
|
||||
/*024*/
|
||||
};
|
||||
|
||||
struct SuspendedMinion_Struct
|
||||
{
|
||||
/*000*/ uint16 SpellID;
|
||||
/*002*/ uint32 HP;
|
||||
/*006*/ uint32 Mana;
|
||||
/*010*/ SpellBuff_Struct Buffs[BUFF_COUNT];
|
||||
/*510*/ uint32 Items[_MaterialCount];
|
||||
/*546*/ char Name[64];
|
||||
/*000*/ uint16 SpellID;
|
||||
/*002*/ uint32 HP;
|
||||
/*006*/ uint32 Mana;
|
||||
/*010*/ SpellBuff_Struct Buffs[BUFF_COUNT];
|
||||
/*510*/ uint32 Items[_MaterialCount];
|
||||
/*546*/ char Name[64];
|
||||
/*610*/
|
||||
};
|
||||
|
||||
@@ -806,7 +859,7 @@ static const uint32 MAX_PP_MEMSPELL = 9; // Set to latest client so functions ca
|
||||
static const uint32 MAX_PP_REF_SPELLBOOK = 480; // Set for Player Profile size retain
|
||||
static const uint32 MAX_PP_REF_MEMSPELL = 9; // Set for Player Profile size retain
|
||||
|
||||
static const uint32 MAX_PP_SKILL = _SkillPacketArraySize; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_AA_ARRAY = 240;
|
||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||
static const uint32 MAX_RECAST_TYPES = 20;
|
||||
@@ -2183,6 +2236,12 @@ struct GroupLeaderChange_Struct
|
||||
/*128*/ char Unknown128[20];
|
||||
};
|
||||
|
||||
struct GroupMentor_Struct {
|
||||
/*000*/ int percent;
|
||||
/*004*/ char name[64];
|
||||
/*068*/
|
||||
};
|
||||
|
||||
struct FaceChange_Struct {
|
||||
/*000*/ uint8 haircolor;
|
||||
/*001*/ uint8 beardcolor;
|
||||
@@ -2605,6 +2664,17 @@ struct Translocate_Struct {
|
||||
/*088*/ uint32 Complete;
|
||||
};
|
||||
|
||||
struct PendingTranslocate_Struct
|
||||
{
|
||||
uint32 zone_id;
|
||||
uint16 instance_id;
|
||||
float heading;
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
uint32 spell_id;
|
||||
};
|
||||
|
||||
struct Sacrifice_Struct {
|
||||
/*000*/ uint32 CasterID;
|
||||
/*004*/ uint32 TargetID;
|
||||
@@ -3914,6 +3984,11 @@ struct MarkNPC_Struct
|
||||
/*08**/ char Name[64];
|
||||
};
|
||||
|
||||
struct InspectBuffs_Struct {
|
||||
/*000*/ uint32 spell_id[BUFF_COUNT];
|
||||
/*100*/ uint32 tics_remaining[BUFF_COUNT];
|
||||
};
|
||||
|
||||
struct RaidGeneral_Struct {
|
||||
/*00*/ uint32 action; //=10
|
||||
/*04*/ char player_name[64]; //should both be the player's name
|
||||
@@ -3929,6 +4004,19 @@ struct RaidAddMember_Struct {
|
||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||
};
|
||||
|
||||
struct RaidMOTD_Struct {
|
||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||
/*136*/ char motd[0]; // max size is 1024, but reply is variable
|
||||
};
|
||||
|
||||
struct RaidLeadershipUpdate_Struct {
|
||||
/*000*/ uint32 action;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ char leader_name[64];
|
||||
/*132*/ GroupLeadershipAA_Struct group; //unneeded
|
||||
/*196*/ RaidLeadershipAA_Struct raid;
|
||||
/*260*/ char Unknown260[128]; //unverified
|
||||
};
|
||||
|
||||
struct RaidAdd_Struct {
|
||||
/*000*/ uint32 action; //=0
|
||||
@@ -4307,14 +4395,14 @@ typedef struct {
|
||||
struct ControlBoat_Struct {
|
||||
/*000*/ uint32 boatId; // entitylist id of the boat
|
||||
/*004*/ bool TakeControl; // 01 if taking control, 00 if releasing it
|
||||
/*007*/ // no idea what these last three bytes represent
|
||||
/*007*/ char unknown[3]; // no idea what these last three bytes represent
|
||||
};
|
||||
|
||||
struct AugmentInfo_Struct
|
||||
{
|
||||
/*000*/ uint32 itemid; // id of the solvent needed
|
||||
/*004*/ uint8 window; // window to display the information in
|
||||
/*005*/ uint8 unknown005[67]; // total packet length 72, all the rest were always 00
|
||||
/*004*/ uint32 window; // window to display the information in
|
||||
/*008*/ char augment_info[64]; // the reply has the text here
|
||||
/*072*/
|
||||
};
|
||||
|
||||
@@ -5121,17 +5209,17 @@ struct MercenaryMerchantResponse_Struct {
|
||||
};
|
||||
|
||||
struct ServerLootItem_Struct {
|
||||
uint32 item_id;
|
||||
int16 equipSlot;
|
||||
uint8 charges;
|
||||
uint16 lootslot;
|
||||
uint32 aug1;
|
||||
uint32 aug2;
|
||||
uint32 aug3;
|
||||
uint32 aug4;
|
||||
uint32 aug5;
|
||||
uint8 minlevel;
|
||||
uint8 maxlevel;
|
||||
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;
|
||||
uint8 min_level; //
|
||||
uint8 max_level; //
|
||||
};
|
||||
|
||||
//Found in client near a ref to the string:
|
||||
|
||||
+3
-3
@@ -47,7 +47,7 @@ const char *FactionValueToString(FACTION_VALUE fv) {
|
||||
|
||||
|
||||
//o--------------------------------------------------------------
|
||||
//| Name: CalculateFaction; rembrant, Dec. 16, 2001
|
||||
//| Name: CalculateFaction; Dec. 16, 2001
|
||||
//o--------------------------------------------------------------
|
||||
//| Notes: Returns the faction message value.
|
||||
//| Modify these values to taste.
|
||||
@@ -69,7 +69,7 @@ FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value)
|
||||
return FACTION_INDIFFERENT;
|
||||
}
|
||||
|
||||
// neotokyo: this function should check if some races have more than one race define
|
||||
// this function should check if some races have more than one race define
|
||||
bool IsOfEqualRace(int r1, int r2)
|
||||
{
|
||||
if (r1 == r2)
|
||||
@@ -88,7 +88,7 @@ bool IsOfEqualRace(int r1, int r2)
|
||||
return false;
|
||||
}
|
||||
|
||||
// neotokyo: trolls endure ogres, dark elves, ...
|
||||
// trolls endure ogres, dark elves, ...
|
||||
bool IsOfIndiffRace(int r1, int r2)
|
||||
{
|
||||
if (r1 == r2)
|
||||
|
||||
+7
-6
@@ -163,7 +163,7 @@ enum { //timer settings, all in milliseconds
|
||||
CombatEventTimer_expire = 12000,
|
||||
Tribute_duration = 600000,
|
||||
ZoneTimerResolution = 3, //sleep time between zone main loop runs (milliseconds)
|
||||
FeignMemoryDuration = 120000, // EverHood - Duration player must feign death to clear zonewide agro.
|
||||
FeignMemoryDuration = 120000, // Duration player must feign death to clear zonewide agro.
|
||||
EnragedTimer = 360000,
|
||||
EnragedDurationTimer = 10000
|
||||
};
|
||||
@@ -208,12 +208,12 @@ enum { //some random constants
|
||||
//chance ratio that a
|
||||
#define THREATENLY_ARRGO_CHANCE 32 // 32/128 (25%) chance that a mob will arrgo on con Threatenly
|
||||
|
||||
// max factions per npc faction list
|
||||
//max factions per npc faction list
|
||||
#define MAX_NPC_FACTIONS 20
|
||||
|
||||
//value caps
|
||||
#define MAX_FACTION 1500
|
||||
#define MIN_FACTION -1500
|
||||
//individual faction pool
|
||||
#define MAX_PERSONAL_FACTION 1200
|
||||
#define MIN_PERSONAL_FACTION -3000
|
||||
|
||||
//The Level Cap:
|
||||
//#define LEVEL_CAP RuleI(Character, MaxLevel) //hard cap is 127
|
||||
@@ -261,7 +261,8 @@ enum {
|
||||
commandChangeFlags = 200, //ability to set/refresh flags
|
||||
commandBanPlayers = 100, //can set bans on players
|
||||
commandChangeDatarate = 201, //edit client's data rate
|
||||
commandZoneToCoords = 0 //can #zone with coords
|
||||
commandZoneToCoords = 0, //can #zone with coords
|
||||
commandInterrogateInv = 100 //below this == only log on error state and self-only target dump
|
||||
};
|
||||
|
||||
//default states for logging flag on NPCs and clients (having NPCs on by default is prolly a bad idea)
|
||||
|
||||
@@ -1412,6 +1412,8 @@ ItemInst::ItemInst(const Item_Struct* item, int16 charges) {
|
||||
m_scaledItem = nullptr;
|
||||
m_evolveInfo = nullptr;
|
||||
m_scaling = false;
|
||||
m_ornamenticon = 0;
|
||||
m_ornamentidfile = 0;
|
||||
}
|
||||
|
||||
ItemInst::ItemInst(SharedDatabase *db, uint32 item_id, int16 charges) {
|
||||
@@ -1434,6 +1436,8 @@ ItemInst::ItemInst(SharedDatabase *db, uint32 item_id, int16 charges) {
|
||||
m_scaledItem = nullptr;
|
||||
m_evolveInfo = nullptr;
|
||||
m_scaling = false;
|
||||
m_ornamenticon = 0;
|
||||
m_ornamentidfile = 0;
|
||||
}
|
||||
|
||||
ItemInst::ItemInst(ItemInstTypes use_type) {
|
||||
@@ -1451,6 +1455,8 @@ ItemInst::ItemInst(ItemInstTypes use_type) {
|
||||
m_scaledItem = nullptr;
|
||||
m_evolveInfo = nullptr;
|
||||
m_scaling = false;
|
||||
m_ornamenticon = 0;
|
||||
m_ornamentidfile = 0;
|
||||
}
|
||||
|
||||
// Make a copy of an ItemInst object
|
||||
@@ -1501,6 +1507,8 @@ ItemInst::ItemInst(const ItemInst& copy)
|
||||
m_evolveInfo = nullptr;
|
||||
|
||||
m_scaling = copy.m_scaling;
|
||||
m_ornamenticon = copy.m_ornamenticon;
|
||||
m_ornamentidfile = copy.m_ornamentidfile;
|
||||
}
|
||||
|
||||
// Clean up container contents
|
||||
@@ -1774,6 +1782,67 @@ ItemInst* ItemInst::GetAugment(uint8 slot) const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ItemInst* ItemInst::GetOrnamentationAug(int ornamentationAugtype) const
|
||||
{
|
||||
for (int i = AUG_BEGIN; i < EmuConstants::ITEM_COMMON_SIZE; i++) {
|
||||
if (GetAugment(i) && m_item->AugSlotType[i] == ornamentationAugtype) {
|
||||
const char *item_IDFile = GetAugment(i)->GetItem()->IDFile;
|
||||
if (strncmp(item_IDFile, "IT64", strlen(item_IDFile)) == 0 || strncmp(item_IDFile, "IT63", strlen(item_IDFile)) == 0)
|
||||
continue;
|
||||
|
||||
return this->GetAugment(i);
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool ItemInst::CanTransform(const Item_Struct *ItemToTry, const Item_Struct *Container, bool AllowAll) {
|
||||
if (!ItemToTry || !Container) return false;
|
||||
|
||||
if (ItemToTry->ItemType == ItemTypeArrow || strnlen(Container->CharmFile, 30) == 0)
|
||||
return false;
|
||||
|
||||
if (AllowAll && strncasecmp(Container->CharmFile, "ITEMTRANSFIGSHIELD", 18) && strncasecmp(Container->CharmFile, "ITEMTransfigBow", 15)) {
|
||||
switch (ItemToTry->ItemType) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 35:
|
||||
case 45:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static std::map<std::string, int> types;
|
||||
types["itemtransfig1hp"] = 2;
|
||||
types["itemtransfig1hs"] = 0;
|
||||
types["itemtransfig2hb"] = 4;
|
||||
types["itemtransfig2hp"] = 35;
|
||||
types["itemtransfig2hs"] = 1;
|
||||
types["itemtransfigblunt"] = 3;
|
||||
types["itemtransfigbow"] = 5;
|
||||
types["itemtransfighth"] = 45;
|
||||
types["itemtransfigshield"] = 8;
|
||||
types["itemtransfigslashing"] = 0;
|
||||
|
||||
auto i = types.find(MakeLowerString(Container->CharmFile));
|
||||
if (i != types.end() && i->second == ItemToTry->ItemType)
|
||||
return true;
|
||||
|
||||
static std::map<std::string, int> typestwo;
|
||||
typestwo["itemtransfigblunt"] = 4;
|
||||
typestwo["itemtransfigslashing"] = 1;
|
||||
|
||||
i = typestwo.find(MakeLowerString(Container->CharmFile));
|
||||
if (i != typestwo.end() && i->second == ItemToTry->ItemType)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 ItemInst::GetAugmentItemID(uint8 slot) const
|
||||
{
|
||||
uint32 id = NO_ITEM;
|
||||
|
||||
+9
-1
@@ -329,7 +329,9 @@ public:
|
||||
void DeleteAugment(uint8 slot);
|
||||
ItemInst* RemoveAugment(uint8 index);
|
||||
bool IsAugmented();
|
||||
|
||||
ItemInst* GetOrnamentationAug(int ornamentationAugtype) const;
|
||||
static bool CanTransform(const Item_Struct *ItemToTry, const Item_Struct *Container, bool AllowAll = false);
|
||||
|
||||
// Has attack/delay?
|
||||
bool IsWeapon() const;
|
||||
bool IsAmmo() const;
|
||||
@@ -391,6 +393,10 @@ public:
|
||||
void SetActivated(bool activated) { m_activated = activated; }
|
||||
int8 GetEvolveLvl() const { return m_evolveLvl; }
|
||||
void SetScaling(bool v) { m_scaling = v; }
|
||||
uint32 GetOrnamentationIcon() const { return m_ornamenticon; }
|
||||
void SetOrnamentIcon(uint32 ornament_icon) { m_ornamenticon = ornament_icon; }
|
||||
uint32 GetOrnamentationIDFile() const { return m_ornamentidfile; }
|
||||
void SetOrnamentationIDFile(uint32 ornament_idfile) { m_ornamentidfile = ornament_idfile; }
|
||||
|
||||
void Initialize(SharedDatabase *db = nullptr);
|
||||
void ScaleItem();
|
||||
@@ -435,6 +441,8 @@ protected:
|
||||
Item_Struct* m_scaledItem;
|
||||
EvolveInfo* m_evolveInfo;
|
||||
bool m_scaling;
|
||||
uint32 m_ornamenticon;
|
||||
uint32 m_ornamentidfile;
|
||||
|
||||
//
|
||||
// Items inside of this item (augs or contents);
|
||||
|
||||
@@ -169,6 +169,7 @@ F(bardlevel)
|
||||
F(questitemflag)
|
||||
F(svcorruption)
|
||||
F(purity)
|
||||
F(evolvinglevel)
|
||||
F(backstabdmg)
|
||||
F(dsmitigation)
|
||||
F(heroic_str)
|
||||
|
||||
@@ -217,6 +217,7 @@ struct Item_Struct {
|
||||
// Begin SoF Fields
|
||||
int32 SVCorruption;
|
||||
uint32 Purity;
|
||||
uint8 EvolvingLevel;
|
||||
uint32 BackstabDmg;
|
||||
uint32 DSMitigation;
|
||||
int32 HeroicStr;
|
||||
|
||||
@@ -54,20 +54,6 @@
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
static bool WELLRNG_init = false;
|
||||
static int state_i = 0;
|
||||
static unsigned int STATE[R];
|
||||
static unsigned int z0, z1, z2;
|
||||
unsigned int (*WELLRNG19937)(void);
|
||||
static unsigned int case_1 (void);
|
||||
static unsigned int case_2 (void);
|
||||
static unsigned int case_3 (void);
|
||||
static unsigned int case_4 (void);
|
||||
static unsigned int case_5 (void);
|
||||
static unsigned int case_6 (void);
|
||||
uint32 rnd_hash(time_t t, clock_t c);
|
||||
void oneseed(const uint32 seed);
|
||||
|
||||
void CoutTimestamp(bool ms) {
|
||||
time_t rawtime;
|
||||
struct tm* gmt_t;
|
||||
@@ -179,41 +165,6 @@ const char * itoa(int num, char* a,int b) {
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* generate a random integer in the range low-high this
|
||||
* should be used instead of the rand()%limit method
|
||||
*/
|
||||
int MakeRandomInt(int low, int high)
|
||||
{
|
||||
if(low >= high)
|
||||
return(low);
|
||||
|
||||
//return (rand()%(high-low+1) + (low));
|
||||
if(!WELLRNG_init) {
|
||||
WELLRNG_init = true;
|
||||
oneseed( rnd_hash( time(nullptr), clock() ) );
|
||||
WELLRNG19937 = case_1;
|
||||
}
|
||||
unsigned int randomnum = ((WELLRNG19937)());
|
||||
if(randomnum == 0xffffffffUL)
|
||||
return high;
|
||||
return int ((randomnum / (double)0xffffffffUL) * (high - low + 1) + low);
|
||||
}
|
||||
|
||||
double MakeRandomFloat(double low, double high)
|
||||
{
|
||||
if(low >= high)
|
||||
return(low);
|
||||
|
||||
//return (rand() / (double)RAND_MAX * (high - low) + low);
|
||||
if(!WELLRNG_init) {
|
||||
WELLRNG_init = true;
|
||||
oneseed( rnd_hash( time(nullptr), clock() ) );
|
||||
WELLRNG19937 = case_1;
|
||||
}
|
||||
return ((WELLRNG19937)() / (double)0xffffffffUL * (high - low) + low);
|
||||
}
|
||||
|
||||
uint32 rnd_hash( time_t t, clock_t c )
|
||||
{
|
||||
// Get a uint32 from t and c
|
||||
@@ -239,111 +190,6 @@ uint32 rnd_hash( time_t t, clock_t c )
|
||||
return ( h1 + differ++ ) ^ h2;
|
||||
}
|
||||
|
||||
void oneseed( const uint32 seed )
|
||||
{
|
||||
// Initialize generator state with seed
|
||||
// See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier.
|
||||
// In previous versions, most significant bits (MSBs) of the seed affect
|
||||
// only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto.
|
||||
register int j = 0;
|
||||
STATE[j] = seed & 0xffffffffUL;
|
||||
for (j = 1; j < R; j++)
|
||||
{
|
||||
STATE[j] = ( 1812433253UL * ( STATE[j-1] ^ (STATE[j-1] >> 30) ) + j ) & 0xffffffffUL;
|
||||
}
|
||||
}
|
||||
|
||||
// WELL RNG code
|
||||
|
||||
/* ***************************************************************************** */
|
||||
/* Copyright: Francois Panneton and Pierre L'Ecuyer, University of Montreal */
|
||||
/* Makoto Matsumoto, Hiroshima University */
|
||||
/* Notice: This code can be used freely for personal, academic, */
|
||||
/* or non-commercial purposes. For commercial purposes, */
|
||||
/* please contact P. L'Ecuyer at: lecuyer@iro.UMontreal.ca */
|
||||
/* A modified "maximally equidistributed" implementation */
|
||||
/* by Shin Harase, Hiroshima University. */
|
||||
/* ***************************************************************************** */
|
||||
|
||||
unsigned int case_1 (void){
|
||||
// state_i == 0
|
||||
z0 = (VRm1Under & MASKL) | (VRm2Under & MASKU);
|
||||
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
|
||||
z2 = MAT3POS (9, VM2) ^ MAT0POS (1, VM3);
|
||||
newV1 = z1 ^ z2;
|
||||
newV0Under = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
|
||||
state_i = R - 1;
|
||||
WELLRNG19937 = case_3;
|
||||
return (STATE[state_i] ^ (newVM2Over & BITMASK));
|
||||
}
|
||||
|
||||
static unsigned int case_2 (void){
|
||||
// state_i == 1
|
||||
z0 = (VRm1 & MASKL) | (VRm2Under & MASKU);
|
||||
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
|
||||
z2 = MAT3POS (9, VM2) ^ MAT0POS (1, VM3);
|
||||
newV1 = z1 ^ z2;
|
||||
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
|
||||
state_i = 0;
|
||||
WELLRNG19937 = case_1;
|
||||
return (STATE[state_i] ^ (newVM2 & BITMASK));
|
||||
}
|
||||
|
||||
static unsigned int case_3 (void){
|
||||
// state_i+M1 >= R
|
||||
z0 = (VRm1 & MASKL) | (VRm2 & MASKU);
|
||||
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1Over);
|
||||
z2 = MAT3POS (9, VM2Over) ^ MAT0POS (1, VM3Over);
|
||||
newV1 = z1 ^ z2;
|
||||
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
|
||||
state_i--;
|
||||
if (state_i + M1 < R)
|
||||
WELLRNG19937 = case_5;
|
||||
return (STATE[state_i] ^ (newVM2Over & BITMASK));
|
||||
}
|
||||
|
||||
static unsigned int case_4 (void){
|
||||
// state_i+M3 >= R
|
||||
z0 = (VRm1 & MASKL) | (VRm2 & MASKU);
|
||||
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
|
||||
z2 = MAT3POS (9, VM2) ^ MAT0POS (1, VM3Over);
|
||||
newV1 = z1 ^ z2;
|
||||
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
|
||||
state_i--;
|
||||
if (state_i + M3 < R)
|
||||
WELLRNG19937 = case_6;
|
||||
return (STATE[state_i] ^ (newVM2 & BITMASK));
|
||||
}
|
||||
|
||||
static unsigned int case_5 (void){
|
||||
// state_i+M2 >= R
|
||||
z0 = (VRm1 & MASKL) | (VRm2 & MASKU);
|
||||
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
|
||||
z2 = MAT3POS (9, VM2Over) ^ MAT0POS (1, VM3Over);
|
||||
newV1 = z1 ^ z2;
|
||||
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
|
||||
state_i--;
|
||||
if (state_i + M2 < R)
|
||||
WELLRNG19937 = case_4;
|
||||
return (STATE[state_i] ^ (newVM2Over & BITMASK));
|
||||
}
|
||||
|
||||
static unsigned int case_6 (void){
|
||||
// 2 <= state_i <= (R - M3 - 1)
|
||||
z0 = (VRm1 & MASKL) | (VRm2 & MASKU);
|
||||
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
|
||||
z2 = MAT3POS (9, VM2) ^ MAT0POS (1, VM3);
|
||||
newV1 = z1 ^ z2;
|
||||
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
|
||||
state_i--;
|
||||
if (state_i == 1)
|
||||
WELLRNG19937 = case_2;
|
||||
return (STATE[state_i] ^ (newVM2 & BITMASK));
|
||||
}
|
||||
|
||||
// end WELL RNG code
|
||||
|
||||
|
||||
float EQ13toFloat(int d)
|
||||
{
|
||||
return ( float(d)/float(1<<2));
|
||||
|
||||
@@ -1231,7 +1231,7 @@ namespace Client62
|
||||
int16 slot_id = ServerToClient62Slot(slot_id_in);
|
||||
uint32 merchant_slot = inst->GetMerchantSlot();
|
||||
int16 charges = inst->GetCharges();
|
||||
const Item_Struct *item = inst->GetItem();
|
||||
const Item_Struct *item = inst->GetUnscaledItem();
|
||||
int i;
|
||||
uint32 sub_length;
|
||||
|
||||
@@ -1244,7 +1244,7 @@ namespace Client62
|
||||
(merchant_slot == 0) ? slot_id_in : merchant_slot,
|
||||
inst->GetPrice(),
|
||||
(merchant_slot == 0) ? 1 : inst->GetMerchantCount(),
|
||||
0,
|
||||
inst->IsScaling() ? inst->GetExp() / 100 : 0,
|
||||
//merchant_slot, //instance ID, bullshit for now
|
||||
// The 'Merchant Slot' needs to be some unique id for bazaar to work properly
|
||||
(merchant_slot == 0) ? inst->GetSerialNumber() : merchant_slot,
|
||||
|
||||
@@ -106,7 +106,7 @@ namespace Client62 {
|
||||
static const uint16 MAP_TRADE_SIZE = 8;
|
||||
static const uint16 MAP_WORLD_SIZE = 10;
|
||||
static const uint16 MAP_LIMBO_SIZE = 36;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 5; // 5 until verified otherwise
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 0; //?
|
||||
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||
@@ -157,7 +157,6 @@ namespace Client62 {
|
||||
static const int16 TRADE_BEGIN = 3000;
|
||||
static const int16 TRADE_END = 3007;
|
||||
static const int16 TRADE_NPC_END = 3003;
|
||||
static const int16 TRADE_NPC_SIZE = 4;
|
||||
static const int16 TRADE_BAGS_BEGIN = 3031;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = 79;
|
||||
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
|
||||
@@ -171,11 +170,6 @@ namespace Client62 {
|
||||
static const int16 CORPSE_BEGIN = slots::MainGeneral1;
|
||||
static const int16 CORPSE_END = slots::MainGeneral1 + slots::MainCursor;
|
||||
|
||||
static const int16 MATERIAL_BEGIN = MaterialHead;
|
||||
static const int16 MATERIAL_END = MaterialSecondary;
|
||||
static const int16 MATERIAL_TINT_END = MaterialFeet;
|
||||
static const int16 MATERIAL_SIZE = _MaterialCount;
|
||||
|
||||
static const uint16 ITEM_COMMON_SIZE = 5;
|
||||
static const uint16 ITEM_CONTAINER_SIZE = 10;
|
||||
|
||||
|
||||
@@ -472,8 +472,8 @@ struct GMTrainee_Struct
|
||||
{
|
||||
/*000*/ uint32 npcid;
|
||||
/*004*/ uint32 playerid;
|
||||
/*008*/ uint32 skills[73];
|
||||
/*300*/ uint8 unknown300[148];
|
||||
/*008*/ uint32 skills[PACKET_SKILL_ARRAY_SIZE];
|
||||
/*408*/ uint8 unknown408[40];
|
||||
/*448*/
|
||||
};
|
||||
|
||||
@@ -611,14 +611,62 @@ struct PotionBelt_Struct {
|
||||
static const uint32 MAX_GROUP_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_RAID_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_LEADERSHIP_AA_ARRAY = (MAX_GROUP_LEADERSHIP_AA_ARRAY+MAX_RAID_LEADERSHIP_AA_ARRAY);
|
||||
struct LeadershipAA_Struct {
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
struct GroupLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 groupAAMarkNPC;
|
||||
uint32 groupAANPCHealth;
|
||||
uint32 groupAADelegateMainAssist;
|
||||
uint32 groupAADelegateMarkNPC;
|
||||
uint32 groupAA4;
|
||||
uint32 groupAA5;
|
||||
uint32 groupAAInspectBuffs;
|
||||
uint32 groupAA7;
|
||||
uint32 groupAASpellAwareness;
|
||||
uint32 groupAAOffenseEnhancement;
|
||||
uint32 groupAAManaEnhancement;
|
||||
uint32 groupAAHealthEnhancement;
|
||||
uint32 groupAAHealthRegeneration;
|
||||
uint32 groupAAFindPathToPC;
|
||||
uint32 groupAAHealthOfTargetsTarget;
|
||||
uint32 groupAA15;
|
||||
};
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct RaidLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 raidAAMarkNPC;
|
||||
uint32 raidAANPCHealth;
|
||||
uint32 raidAADelegateMainAssist;
|
||||
uint32 raidAADelegateMarkNPC;
|
||||
uint32 raidAA4;
|
||||
uint32 raidAA5;
|
||||
uint32 raidAA6;
|
||||
uint32 raidAASpellAwareness;
|
||||
uint32 raidAAOffenseEnhancement;
|
||||
uint32 raidAAManaEnhancement;
|
||||
uint32 raidAAHealthEnhancement;
|
||||
uint32 raidAAHealthRegeneration;
|
||||
uint32 raidAAFindPathToPC;
|
||||
uint32 raidAAHealthOfTargetsTarget;
|
||||
uint32 raidAA14;
|
||||
uint32 raidAA15;
|
||||
};
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
GroupLeadershipAA_Struct group;
|
||||
RaidLeadershipAA_Struct raid;
|
||||
};
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -630,7 +678,7 @@ struct RaidLeadershipAA_Struct {
|
||||
static const uint32 MAX_PP_LANGUAGE = 28;
|
||||
static const uint32 MAX_PP_SPELLBOOK = 400;
|
||||
static const uint32 MAX_PP_MEMSPELL = 9;
|
||||
static const uint32 MAX_PP_SKILL = _SkillPacketArraySize; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_AA_ARRAY = 240;
|
||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||
struct PlayerProfile_Struct
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "sof.h"
|
||||
#include "sod.h"
|
||||
#include "rof.h"
|
||||
//#include "rof2.h"
|
||||
#include "rof2.h"
|
||||
|
||||
void RegisterAllPatches(EQStreamIdentifier &into) {
|
||||
Client62::Register(into);
|
||||
@@ -17,6 +17,7 @@ void RegisterAllPatches(EQStreamIdentifier &into) {
|
||||
SoD::Register(into);
|
||||
Underfoot::Register(into);
|
||||
RoF::Register(into);
|
||||
// Uncomment the line below to enable RoF2 Client
|
||||
//RoF2::Register(into);
|
||||
}
|
||||
|
||||
@@ -27,5 +28,6 @@ void ReloadAllPatches() {
|
||||
SoD::Reload();
|
||||
Underfoot::Reload();
|
||||
RoF::Reload();
|
||||
// Uncomment the line below to enable RoF2 Client
|
||||
//RoF2::Reload();
|
||||
}
|
||||
|
||||
+140
-22
@@ -235,6 +235,18 @@ namespace RoF
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_AugmentInfo)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(AugmentInfo_Struct);
|
||||
SETUP_DIRECT_ENCODE(AugmentInfo_Struct, structs::AugmentInfo_Struct);
|
||||
|
||||
OUT(itemid);
|
||||
OUT(window);
|
||||
strn0cpy(eq->augment_info, emu->augment_info, 64);
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_Barter)
|
||||
{
|
||||
EQApplicationPacket *in = *p;
|
||||
@@ -1309,6 +1321,20 @@ namespace RoF
|
||||
FINISH_ENCODE();
|
||||
}*/
|
||||
|
||||
ENCODE(OP_InspectBuffs)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(InspectBuffs_Struct);
|
||||
SETUP_DIRECT_ENCODE(InspectBuffs_Struct, structs::InspectBuffs_Struct);
|
||||
|
||||
// we go over the internal 25 instead of the packet's since no entry is 0, which it will be already
|
||||
for (int i = 0; i < BUFF_COUNT; i++) {
|
||||
OUT(spell_id[i]);
|
||||
OUT(tics_remaining[i]);
|
||||
}
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_InspectRequest)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(Inspect_Struct);
|
||||
@@ -2602,6 +2628,29 @@ namespace RoF
|
||||
add_member->flags[4] = in_add_member->flags[4];
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else if (raid_gen->action == 35)
|
||||
{
|
||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) + strlen(inmotd->motd) + 1);
|
||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
||||
|
||||
outmotd->general.action = inmotd->general.action;
|
||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
||||
{
|
||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
||||
|
||||
outlaa->action = inlaa->action;
|
||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else
|
||||
{
|
||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
||||
@@ -4475,15 +4524,40 @@ namespace RoF
|
||||
|
||||
DECODE(OP_RaidInvite)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||
|
||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
||||
IN(action);
|
||||
IN(parameter);
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
// This is a switch on the RaidGeneral action
|
||||
switch (*(uint32 *)__packet->pBuffer) {
|
||||
case 35: { // raidMOTD
|
||||
// we don't have a nice macro for this
|
||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
||||
__eq_buffer->motd[1023] = '\0';
|
||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
||||
__packet->pBuffer = new unsigned char[__packet->size];
|
||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
||||
IN(general.action);
|
||||
IN(general.parameter);
|
||||
FINISH_DIRECT_DECODE();
|
||||
break;
|
||||
}
|
||||
case 36: { // raidPlayerNote unhandled
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
||||
IN(action);
|
||||
IN(parameter);
|
||||
FINISH_DIRECT_DECODE();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DECODE(OP_ReadBook)
|
||||
@@ -4745,6 +4819,7 @@ namespace RoF
|
||||
|
||||
char* SerializeItem(const ItemInst *inst, int16 slot_id_in, uint32 *length, uint8 depth)
|
||||
{
|
||||
int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType);
|
||||
uint8 null_term = 0;
|
||||
bool stackable = inst->IsStackable();
|
||||
uint32 merchant_slot = inst->GetMerchantSlot();
|
||||
@@ -4754,7 +4829,7 @@ namespace RoF
|
||||
|
||||
std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary);
|
||||
|
||||
const Item_Struct *item = inst->GetItem();
|
||||
const Item_Struct *item = inst->GetUnscaledItem();
|
||||
//_log(NET__ERROR, "Serialize called for: %s", item->Name);
|
||||
|
||||
RoF::structs::ItemSerializationHeader hdr;
|
||||
@@ -4776,7 +4851,7 @@ namespace RoF
|
||||
hdr.price = inst->GetPrice();
|
||||
hdr.merchant_slot = (merchant_slot == 0) ? 1 : inst->GetMerchantCount();
|
||||
//hdr.merchant_slot = (merchant_slot == 0) ? 1 : 0xffffffff;
|
||||
hdr.unknown020 = 0;
|
||||
hdr.scaled_value = inst->IsScaling() ? inst->GetExp() / 100 : 0;
|
||||
hdr.instance_id = (merchant_slot == 0) ? inst->GetSerialNumber() : merchant_slot;
|
||||
hdr.unknown028 = 0;
|
||||
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
|
||||
@@ -4785,20 +4860,62 @@ namespace RoF
|
||||
hdr.unknown044 = 0;
|
||||
hdr.unknown048 = 0;
|
||||
hdr.unknown052 = 0;
|
||||
hdr.unknown056 = 0;
|
||||
hdr.unknown060 = 0;
|
||||
hdr.unknown061 = 0;
|
||||
hdr.unknown062 = 0;
|
||||
hdr.unknowna1 = 0xffffffff;
|
||||
hdr.unknowna2 = 0;
|
||||
hdr.unknown063 = 0;
|
||||
hdr.unknowna3 = 0;
|
||||
hdr.unknowna4 = 0xffffffff;
|
||||
hdr.unknowna5 = 0;
|
||||
hdr.ItemClass = item->ItemClass;
|
||||
|
||||
hdr.isEvolving = item->EvolvingLevel > 0 ? 1 : 0;
|
||||
ss.write((const char*)&hdr, sizeof(RoF::structs::ItemSerializationHeader));
|
||||
|
||||
if (item->EvolvingLevel > 0) {
|
||||
RoF::structs::EvolvingItem evotop;
|
||||
evotop.unknown001 = 0;
|
||||
evotop.unknown002 = 0;
|
||||
evotop.unknown003 = 0;
|
||||
evotop.unknown004 = 0;
|
||||
evotop.evoLevel = item->EvolvingLevel;
|
||||
evotop.progress = 95.512;
|
||||
evotop.Activated = 1;
|
||||
evotop.evomaxlevel = 7;
|
||||
ss.write((const char*)&evotop, sizeof(RoF::structs::EvolvingItem));
|
||||
}
|
||||
//ORNAMENT IDFILE / ICON
|
||||
uint16 ornaIcon = 0;
|
||||
if (inst->GetOrnamentationAug(ornamentationAugtype)) {
|
||||
const Item_Struct *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem();
|
||||
//Mainhand
|
||||
ss.write(aug_weap->IDFile, strlen(aug_weap->IDFile));
|
||||
ss.write((const char*)&null_term, sizeof(uint8));
|
||||
//Offhand
|
||||
ss.write(aug_weap->IDFile, strlen(aug_weap->IDFile));
|
||||
ss.write((const char*)&null_term, sizeof(uint8));
|
||||
//Icon
|
||||
ornaIcon = aug_weap->Icon;
|
||||
}
|
||||
else if (inst->GetOrnamentationIDFile() && inst->GetOrnamentationIcon()) {
|
||||
char tmp[30]; memset(tmp, 0x0, 30); sprintf(tmp, "IT%d", inst->GetOrnamentationIDFile());
|
||||
//Mainhand
|
||||
ss.write(tmp, strlen(tmp));
|
||||
ss.write((const char*)&null_term, sizeof(uint8));
|
||||
//Offhand
|
||||
ss.write(tmp, strlen(tmp));
|
||||
ss.write((const char*)&null_term, sizeof(uint8));
|
||||
ornaIcon = inst->GetOrnamentationIcon();
|
||||
}
|
||||
else {
|
||||
ss.write((const char*)&null_term, sizeof(uint8)); //no mh
|
||||
ss.write((const char*)&null_term, sizeof(uint8));//no of
|
||||
}
|
||||
|
||||
RoF::structs::ItemSerializationHeaderFinish hdrf;
|
||||
hdrf.ornamentIcon = ornaIcon;
|
||||
hdrf.unknown061 = 0;
|
||||
hdrf.unknown062 = 0;
|
||||
hdrf.unknowna1 = 0xffffffff;
|
||||
hdrf.unknowna2 = 0;
|
||||
hdrf.unknown063 = 0;
|
||||
hdrf.unknowna3 = 0;
|
||||
hdrf.unknowna4 = 0xffffffff;
|
||||
hdrf.unknowna5 = 0;
|
||||
hdrf.ItemClass = item->ItemClass;
|
||||
ss.write((const char*)&hdrf, sizeof(RoF::structs::ItemSerializationHeaderFinish));
|
||||
|
||||
if (strlen(item->Name) > 0)
|
||||
{
|
||||
ss.write(item->Name, strlen(item->Name));
|
||||
@@ -4914,6 +5031,7 @@ namespace RoF
|
||||
ibs.SpellShield = item->SpellShield;
|
||||
ibs.Avoidance = item->Avoidance;
|
||||
ibs.Accuracy = item->Accuracy;
|
||||
ibs.CharmFileID = item->CharmFileID;
|
||||
ibs.FactionAmt1 = item->FactionAmt1;
|
||||
ibs.FactionMod1 = item->FactionMod1;
|
||||
ibs.FactionAmt2 = item->FactionAmt2;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,37 @@
|
||||
#ifndef RoF2_H_
|
||||
#define RoF2_H_
|
||||
|
||||
#include "../struct_strategy.h"
|
||||
|
||||
class EQStreamIdentifier;
|
||||
|
||||
namespace RoF2 {
|
||||
|
||||
//these are the only public member of this namespace.
|
||||
extern void Register(EQStreamIdentifier &into);
|
||||
extern void Reload();
|
||||
|
||||
|
||||
|
||||
//you should not directly access anything below..
|
||||
//I just dont feel like making a seperate header for it.
|
||||
|
||||
class Strategy : public StructStrategy {
|
||||
public:
|
||||
Strategy();
|
||||
|
||||
protected:
|
||||
|
||||
virtual std::string Describe() const;
|
||||
virtual const EQClientVersion ClientVersion() const;
|
||||
|
||||
//magic macro to declare our opcode processors
|
||||
#include "ss_declare.h"
|
||||
#include "rof2_ops.h"
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /*RoF2_H_*/
|
||||
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
EQEMu: Everquest Server Emulator
|
||||
|
||||
Copyright (C) 2001-2014 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 RoF2_CONSTANTS_H_
|
||||
#define RoF2_CONSTANTS_H_
|
||||
|
||||
#include "../types.h"
|
||||
|
||||
namespace RoF2 {
|
||||
namespace maps {
|
||||
typedef enum : int16 {
|
||||
MapPossessions = 0,
|
||||
MapBank,
|
||||
MapSharedBank,
|
||||
MapTrade,
|
||||
MapWorld,
|
||||
MapLimbo,
|
||||
MapTribute,
|
||||
MapTrophyTribute,
|
||||
MapGuildTribute,
|
||||
MapMerchant,
|
||||
MapDeleted,
|
||||
MapCorpse,
|
||||
MapBazaar,
|
||||
MapInspect,
|
||||
MapRealEstate,
|
||||
MapViewMODPC,
|
||||
MapViewMODBank,
|
||||
MapViewMODSharedBank,
|
||||
MapViewMODLimbo,
|
||||
MapAltStorage,
|
||||
MapArchived,
|
||||
MapMail,
|
||||
MapGuildTrophyTribute,
|
||||
MapKrono,
|
||||
MapOther,
|
||||
_MapCount
|
||||
} InventoryMaps;
|
||||
}
|
||||
|
||||
namespace slots {
|
||||
typedef enum : int16 {
|
||||
MainCharm = 0,
|
||||
MainEar1,
|
||||
MainHead,
|
||||
MainFace,
|
||||
MainEar2,
|
||||
MainNeck,
|
||||
MainShoulders,
|
||||
MainArms,
|
||||
MainBack,
|
||||
MainWrist1,
|
||||
MainWrist2,
|
||||
MainRange,
|
||||
MainHands,
|
||||
MainPrimary,
|
||||
MainSecondary,
|
||||
MainFinger1,
|
||||
MainFinger2,
|
||||
MainChest,
|
||||
MainLegs,
|
||||
MainFeet,
|
||||
MainWaist,
|
||||
MainPowerSource,
|
||||
MainAmmo,
|
||||
MainGeneral1,
|
||||
MainGeneral2,
|
||||
MainGeneral3,
|
||||
MainGeneral4,
|
||||
MainGeneral5,
|
||||
MainGeneral6,
|
||||
MainGeneral7,
|
||||
MainGeneral8,
|
||||
MainGeneral9,
|
||||
MainGeneral10,
|
||||
MainCursor,
|
||||
_MainCount,
|
||||
_MainEquipmentBegin = MainCharm,
|
||||
_MainEquipmentEnd = MainAmmo,
|
||||
_MainEquipmentCount = (_MainEquipmentEnd - _MainEquipmentBegin + 1),
|
||||
_MainGeneralBegin = MainGeneral1,
|
||||
_MainGeneralEnd = MainGeneral10,
|
||||
_MainGeneralCount = (_MainGeneralEnd - _MainGeneralBegin + 1)
|
||||
} EquipmentSlots;
|
||||
}
|
||||
|
||||
namespace consts {
|
||||
static const uint16 MAP_POSSESSIONS_SIZE = slots::_MainCount;
|
||||
static const uint16 MAP_BANK_SIZE = 24;
|
||||
static const uint16 MAP_SHARED_BANK_SIZE = 2;
|
||||
static const uint16 MAP_TRADE_SIZE = 8;
|
||||
static const uint16 MAP_WORLD_SIZE = 10;
|
||||
static const uint16 MAP_LIMBO_SIZE = 36;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 0; //?
|
||||
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||
static const uint16 MAP_DELETED_SIZE = 0;
|
||||
static const uint16 MAP_CORPSE_SIZE = slots::_MainCount;
|
||||
static const uint16 MAP_BAZAAR_SIZE = 200;
|
||||
static const uint16 MAP_INSPECT_SIZE = slots::_MainEquipmentCount;
|
||||
static const uint16 MAP_REAL_ESTATE_SIZE = 0;
|
||||
static const uint16 MAP_VIEW_MOD_PC_SIZE = MAP_POSSESSIONS_SIZE;
|
||||
static const uint16 MAP_VIEW_MOD_BANK_SIZE = MAP_BANK_SIZE;
|
||||
static const uint16 MAP_VIEW_MOD_SHARED_BANK_SIZE = MAP_SHARED_BANK_SIZE;
|
||||
static const uint16 MAP_VIEW_MOD_LIMBO_SIZE = MAP_LIMBO_SIZE;
|
||||
static const uint16 MAP_ALT_STORAGE_SIZE = 0;
|
||||
static const uint16 MAP_ARCHIVED_SIZE = 0;
|
||||
static const uint16 MAP_MAIL_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_KRONO_SIZE = NOT_USED;
|
||||
static const uint16 MAP_OTHER_SIZE = 0;
|
||||
|
||||
// most of these definitions will go away with the structure-based system..this maintains compatibility for now
|
||||
// (bag slots and main slots beyond Possessions are assigned for compatibility with current server coding)
|
||||
static const int16 EQUIPMENT_BEGIN = slots::MainCharm;
|
||||
static const int16 EQUIPMENT_END = slots::MainAmmo;
|
||||
static const uint16 EQUIPMENT_SIZE = slots::_MainEquipmentCount;
|
||||
|
||||
static const int16 GENERAL_BEGIN = slots::MainGeneral1;
|
||||
static const int16 GENERAL_END = slots::MainGeneral10;
|
||||
static const uint16 GENERAL_SIZE = slots::_MainGeneralCount;
|
||||
static const int16 GENERAL_BAGS_BEGIN = 251;
|
||||
static const int16 GENERAL_BAGS_END_OFFSET = 99;
|
||||
static const int16 GENERAL_BAGS_END = GENERAL_BAGS_BEGIN + GENERAL_BAGS_END_OFFSET;
|
||||
|
||||
static const int16 CURSOR = slots::MainCursor;
|
||||
static const int16 CURSOR_BAG_BEGIN = 351;
|
||||
static const int16 CURSOR_BAG_END_OFFSET = 9;
|
||||
static const int16 CURSOR_BAG_END = CURSOR_BAG_BEGIN + CURSOR_BAG_END_OFFSET;
|
||||
|
||||
static const int16 BANK_BEGIN = 2000;
|
||||
static const int16 BANK_END = 2023;
|
||||
static const int16 BANK_BAGS_BEGIN = 2031;
|
||||
static const int16 BANK_BAGS_END_OFFSET = 239;
|
||||
static const int16 BANK_BAGS_END = BANK_BAGS_BEGIN + BANK_BAGS_END_OFFSET;
|
||||
|
||||
static const int16 SHARED_BANK_BEGIN = 2500;
|
||||
static const int16 SHARED_BANK_END = 2501;
|
||||
static const int16 SHARED_BANK_BAGS_BEGIN = 2531;
|
||||
static const int16 SHARED_BANK_BAGS_END_OFFSET = 19;
|
||||
static const int16 SHARED_BANK_BAGS_END = SHARED_BANK_BAGS_BEGIN + SHARED_BANK_BAGS_END_OFFSET;
|
||||
|
||||
static const int16 TRADE_BEGIN = 3000;
|
||||
static const int16 TRADE_END = 3007;
|
||||
static const int16 TRADE_NPC_END = 3003;
|
||||
static const int16 TRADE_BAGS_BEGIN = 3031;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = 79;
|
||||
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
|
||||
|
||||
static const int16 WORLD_BEGIN = 4000;
|
||||
static const int16 WORLD_END = 4009;
|
||||
|
||||
static const int16 TRIBUTE_BEGIN = 400;
|
||||
static const int16 TRIBUTE_END = 404;
|
||||
|
||||
static const int16 CORPSE_BEGIN = slots::MainGeneral1;
|
||||
static const int16 CORPSE_END = slots::MainGeneral1 + slots::MainCursor;
|
||||
|
||||
static const uint16 ITEM_COMMON_SIZE = 6;
|
||||
static const uint16 ITEM_CONTAINER_SIZE = 255; // 255; (server max will be 255..unsure what actual client is - test)
|
||||
|
||||
static const uint32 BANDOLIERS_COUNT = 20; // count = number of bandolier instances
|
||||
static const uint32 BANDOLIER_SIZE = 4; // size = number of equipment slots in bandolier instance
|
||||
static const uint32 POTION_BELT_SIZE = 5;
|
||||
}
|
||||
|
||||
namespace limits {
|
||||
static const bool ALLOWS_EMPTY_BAG_IN_BAG = true;
|
||||
static const bool ALLOWS_CLICK_CAST_FROM_BAG = true;
|
||||
static const bool COIN_HAS_WEIGHT = false;
|
||||
}
|
||||
|
||||
}; //end namespace RoF2
|
||||
|
||||
#endif /*RoF2_CONSTANTS_H_*/
|
||||
|
||||
/*
|
||||
RoF2 Notes:
|
||||
** Structure-based inventory **
|
||||
ok Possessions: ( 0, { 0 .. 33 }, -1, -1 ) (Corpse: { 23 .. 56 } [Offset 23])
|
||||
ok [Equipment: ( 0, { 0 .. 22 }, -1, -1 )]
|
||||
ok [General: ( 0, { 23 .. 32 }, -1, -1 )]
|
||||
ok [Cursor: ( 0, 33, -1, -1 )]
|
||||
General Bags: ( 0, { 23 .. 32 }, { 0 .. (maxsize - 1) }, -1 )
|
||||
Cursor Bags: ( 0, 33, { 0 .. (maxsize - 1) }, -1 )
|
||||
|
||||
Bank: ( 1, { 0 .. 23 }, -1, -1 )
|
||||
Bank Bags: ( 1, { 0 .. 23 }, { 0 .. (maxsize - 1)}, -1 )
|
||||
|
||||
Shared Bank: ( 2, { 0 .. 1 }, -1, -1 )
|
||||
Shared Bank Bags: ( 2, { 0 .. 1 }, { 0 .. (maxsize - 1) }, -1 )
|
||||
|
||||
Trade: ( 3, { 0 .. 8 }, -1, -1 )
|
||||
(Trade Bags: 3031 - 3110 -- server values)
|
||||
|
||||
World: ( 4, { 0 .. 10 }, -1, -1 )
|
||||
|
||||
*/
|
||||
@@ -0,0 +1,439 @@
|
||||
/*
|
||||
|
||||
|
||||
These fields must be in the order of how they are serialized!
|
||||
|
||||
|
||||
|
||||
*/
|
||||
#define NEW_TRY
|
||||
#ifdef NEW_TRY
|
||||
//* 000 */ I(ItemClass) // Leave this one off on purpose
|
||||
/* 001 */ S(Name)
|
||||
/* 002 */ S(Lore)
|
||||
//* 003 */ C("")//lorefile - Newly Added - Field is Null
|
||||
/* 004 */ S(IDFile)
|
||||
/* 005 */ I(ID)
|
||||
/* 006 */ I(Weight)
|
||||
/* 007 */ I(NoRent)
|
||||
/* 008 */ I(NoDrop)
|
||||
/* 009 */ I(Size)
|
||||
/* 010 */ I(Slots)
|
||||
/* 011 */ I(Price)
|
||||
/* 012 */ I(Icon)
|
||||
/* 013 */ C("0")//UNK013
|
||||
/* 014 */ C("0")//UNK014
|
||||
/* 015 */ I(BenefitFlag)
|
||||
/* 016 */ I(Tradeskills)
|
||||
/* 017 */ I(CR)
|
||||
/* 018 */ I(DR)
|
||||
/* 019 */ I(PR)
|
||||
/* 020 */ I(MR)
|
||||
/* 021 */ I(FR)
|
||||
/* 022 */ C("0")//svcorruption - Newly Added
|
||||
/* 023 */ I(AStr)
|
||||
/* 024 */ I(ASta)
|
||||
/* 025 */ I(AAgi)
|
||||
/* 026 */ I(ADex)
|
||||
/* 027 */ I(ACha)
|
||||
/* 028 */ I(AInt)
|
||||
/* 029 */ I(AWis)
|
||||
/* 030 */ I(HP)
|
||||
/* 031 */ I(Mana)
|
||||
/* 032 */ I(Endur) //endur - Relocated
|
||||
/* 033 */ I(AC)
|
||||
/* 034 */ I(Classes)//classes - Relocated
|
||||
/* 035 */ I(Races)//races - Relocated
|
||||
/* 036 */ I(Deity)
|
||||
/* 037 */ I(SkillModValue)
|
||||
/* 038 */ C("0")//UNK038 - Default is 0
|
||||
/* 039 */ I(SkillModType)
|
||||
/* 040 */ I(BaneDmgRace)
|
||||
/* 041 */ I(BaneDmgBody)//banedmgbody - Relocated
|
||||
/* 042 */ I(BaneDmgRaceAmt)//banedmgraceamt - Relocated
|
||||
/* 043 */ I(BaneDmgAmt)//banedmgamt - Relocated
|
||||
/* 044 */ I(Magic)
|
||||
/* 045 */ I(CastTime_)
|
||||
/* 046 */ I(ReqLevel)
|
||||
/* 047 */ I(RecLevel)//reclevel - Relocated
|
||||
/* 048 */ I(RecSkill)//recskill - Relocated
|
||||
/* 049 */ I(BardType)
|
||||
/* 050 */ I(BardValue)
|
||||
/* 051 */ I(Light)
|
||||
/* 052 */ I(Delay)
|
||||
/* 053 */ I(ElemDmgType)
|
||||
/* 054 */ I(ElemDmgAmt)
|
||||
/* 055 */ I(Range)
|
||||
/* 056 */ I(Damage)
|
||||
/* 057 */ I(Color)
|
||||
/* 058 */ I(ItemType)
|
||||
/* 059 */ I(Material)
|
||||
/* 060 */ C("0")//UNK060 - Default is 0
|
||||
/* 061 */ C("0")//UNK061 - Default is 0
|
||||
/* 062 */ F(SellRate)
|
||||
/* 063 */ I(CombatEffects)
|
||||
/* 064 */ I(Shielding)
|
||||
/* 065 */ I(StunResist)
|
||||
/* 066 */ I(StrikeThrough)
|
||||
/* 067 */ I(ExtraDmgSkill)
|
||||
/* 068 */ I(ExtraDmgAmt)
|
||||
/* 069 */ I(SpellShield)
|
||||
/* 070 */ I(Avoidance)
|
||||
/* 071 */ I(Accuracy)
|
||||
/* 072 */ I(CharmFileID)
|
||||
/* 073 */ I(FactionMod1)//Swapped these so Faction Amt comes after each Faction Mod
|
||||
/* 074 */ I(FactionAmt1)//Swapped these so Faction Amt comes after each Faction Mod
|
||||
/* 075 */ I(FactionMod2)//Swapped these so Faction Amt comes after each Faction Mod
|
||||
/* 076 */ I(FactionAmt2)//Swapped these so Faction Amt comes after each Faction Mod
|
||||
/* 077 */ I(FactionMod3)//Swapped these so Faction Amt comes after each Faction Mod
|
||||
/* 078 */ I(FactionAmt3)//Swapped these so Faction Amt comes after each Faction Mod
|
||||
/* 079 */ I(FactionMod4)//Swapped these so Faction Amt comes after each Faction Mod
|
||||
/* 080 */ I(FactionAmt4)//Swapped these so Faction Amt comes after each Faction Mod
|
||||
/* 081 */ S(CharmFile)
|
||||
/* 082 */ I(AugType)
|
||||
/* 083 */ I(AugRestrict)//augrestrict - Relocated
|
||||
/* 084 */ I(AugDistiller)//augdistiller - Relocated
|
||||
/* 085 */ I(AugSlotType[0])
|
||||
/* 086 */ I(AugSlotVisible[0])//augslot1visible - Default 1
|
||||
/* 087 */ C("0")//augslot1unk2 - Newly Added - Default 0
|
||||
/* 088 */ I(AugSlotType[1])
|
||||
/* 089 */ I(AugSlotVisible[1])
|
||||
/* 090 */ C("0")//augslot2unk2 - Newly Added
|
||||
/* 091 */ I(AugSlotType[2])
|
||||
/* 092 */ I(AugSlotVisible[2])
|
||||
/* 093 */ C("0")//augslot3unk2 - Newly Added
|
||||
/* 094 */ I(AugSlotType[3])
|
||||
/* 095 */ I(AugSlotVisible[3])
|
||||
/* 096 */ C("0")//augslot4unk2 - Newly Added
|
||||
/* 097 */ I(AugSlotType[4])
|
||||
/* 098 */ I(AugSlotVisible[4])
|
||||
/* 099 */ C("0")//augslot5unk2 - Newly Added
|
||||
/* 100 */ I(PointType)//pointtype - Relocated
|
||||
/* 101 */ I(LDoNTheme)
|
||||
/* 102 */ I(LDoNPrice)
|
||||
/* 103 */ C("70")//UNK098 - Newly Added - Default 70, but some are set to 0
|
||||
/* 104 */ I(LDoNSold)
|
||||
/* 105 */ I(BagType)
|
||||
/* 106 */ I(BagSlots)
|
||||
/* 107 */ I(BagSize)
|
||||
/* 108 */ I(BagWR)
|
||||
/* 109 */ I(Book)
|
||||
/* 110 */ I(BookType)
|
||||
/* 111 */ S(Filename)
|
||||
/* 112 */ I(LoreGroup)
|
||||
/* 113 */ I(ArtifactFlag)
|
||||
/* 114 */ C("0")//I(PendingLoreFlag)?//UNK109 - Default 0, but a few are 1
|
||||
/* 115 */ I(Favor)
|
||||
/* 116 */ I(GuildFavor)//guildfavor - Relocated
|
||||
/* 117 */ I(FVNoDrop)
|
||||
/* 118 */ I(DotShielding)
|
||||
/* 119 */ I(Attack)
|
||||
/* 120 */ I(Regen)
|
||||
/* 121 */ I(ManaRegen)
|
||||
/* 122 */ I(EnduranceRegen)
|
||||
/* 123 */ I(Haste)
|
||||
/* 124 */ I(DamageShield)
|
||||
/* 125 */ C("-1") //UNK120 - Default is -1
|
||||
/* 126 */ C("0") //UNK121 - Default is 0
|
||||
/* 127 */ I(Attuneable)
|
||||
/* 128 */ I(NoPet)
|
||||
/* 129 */ C("0") //UNK124 - Default 0, but a few are 1
|
||||
/* 130 */ I(PotionBelt)
|
||||
/* 131 */ C("0") //potionbeltslots - Default 0, but a few are 1
|
||||
/* 132 */ I(StackSize)
|
||||
/* 133 */ I(NoTransfer)
|
||||
/* 134 */ I(Stackable)//UNK129 - Default is 0, but some are much higher
|
||||
/* 135 */ I(QuestItemFlag)//questitemflag - Default is 0 (off), flag on = 1
|
||||
/* 136 */ C("0")//UNK131 - Default is 0, but there is an item set to 1
|
||||
/* 137 */ C("0")//UNK132 - Default is 0? 0000000000000000000?
|
||||
/* 138 */ I(Click.Effect)
|
||||
/* 139 */ I(Click.Type)
|
||||
/* 140 */ I(Click.Level2)
|
||||
/* 141 */ I(Click.Level)
|
||||
/* 142 */ I(MaxCharges)//maxcharges - Relocated
|
||||
/* 143 */ I(CastTime_)//casttime - Relocated - Note Duplicate Entries for CastTime_ and none for CastTime
|
||||
/* 144 */ I(RecastDelay)//recastdelay - Relocated
|
||||
/* 145 */ I(RecastType)//recasttype - Relocated
|
||||
/* 146 */ C("0")//clickunk5 - Newly Added - Default is 0
|
||||
/* 147 */ C("")//clickname - Newly Added - Default is Null
|
||||
/* 148 */ C("-1")//clickunk7 - Newly Added - Default is -1, but some set to 0 and some much higher
|
||||
/* 149 */ I(Proc.Effect)
|
||||
/* 150 */ I(Proc.Type)
|
||||
/* 151 */ I(Proc.Level2)
|
||||
/* 152 */ I(Proc.Level)
|
||||
/* 153 */ C("0")//procunk1 - Newly Added - Default is 0, but some set to -1 and 1
|
||||
/* 154 */ C("0")//procunk2 - Newly Added - Default is 0
|
||||
/* 155 */ C("0")//procunk3 - Newly Added - Default is 0
|
||||
/* 156 */ C("0")//procunk4 - Newly Added - Default is 0
|
||||
/* 157 */ I(ProcRate)//procrate - Relocated
|
||||
/* 158 */ C("")//procname - Newly Added - Default is Null
|
||||
/* 159 */ C("-1")//procunk7 - Newly Added - Default is -1, but some set to 0
|
||||
/* 160 */ I(Worn.Effect)
|
||||
/* 161 */ I(Worn.Type)
|
||||
/* 162 */ I(Worn.Level2)
|
||||
/* 163 */ I(Worn.Level)
|
||||
/* 164 */ C("0")//wornunk1 - Newly Added - Default is 0
|
||||
/* 165 */ C("0")//wornunk2 - Newly Added - Default is 0
|
||||
/* 166 */ C("0")//wornunk3 - Newly Added - Default is 0
|
||||
/* 167 */ C("0")//wornunk4 - Newly Added - Default is 0
|
||||
/* 168 */ C("0")//wornunk5 - Newly Added - Default is 0
|
||||
/* 169 */ C("")//wornname - Newly Added - Default is Null
|
||||
/* 170 */ C("-1")//wornunk7 - Newly Added - Default is -1, but some set to 0
|
||||
/* 171 */ I(Focus.Effect)
|
||||
/* 172 */ I(Focus.Type)
|
||||
/* 173 */ I(Focus.Level2)
|
||||
/* 174 */ I(Focus.Level)
|
||||
/* 175 */ C("0")//focusunk1 - Newly Added - Default is 0
|
||||
/* 176 */ C("0")//focusunk2 - Newly Added - Default is 0
|
||||
/* 177 */ C("0")//focusunk3 - Newly Added - Default is 0
|
||||
/* 178 */ C("0")//focusunk4 - Newly Added - Default is 0
|
||||
/* 179 */ C("0")//focusunk5 - Newly Added - Default is 0
|
||||
/* 180 */ C("")//focusname - Newly Added - Default is Null
|
||||
/* 181 */ C("-1")//focusunk7 - Newly Added - Default is -1, but some set to 0
|
||||
/* 182 */ I(Scroll.Effect)
|
||||
/* 183 */ I(Scroll.Type)
|
||||
/* 184 */ I(Scroll.Level2)
|
||||
/* 185 */ I(Scroll.Level)
|
||||
/* 186 */ C("0")//scrollunk1 - Renumber this***
|
||||
/* 187 */ C("0")//scrollunk2 - Newly Added - Default is 0
|
||||
/* 188 */ C("0")//scrollunk3 - Newly Added - Default is 0
|
||||
/* 189 */ C("0")//scrollunk4 - Newly Added - Default is 0
|
||||
/* 190 */ C("0")//scrollunk5 - Newly Added - Default is 0
|
||||
/* 191 */ C("")//scrollname - Newly Added - Default is Null
|
||||
/* 192 */ C("-1")//scrollunk7 - Newly Added - Default is -1, but some set to 0
|
||||
/* 193 */ C("0")//UNK193 - Default is 0
|
||||
/* 194 */ C("0")//purity - Newly Added - Default is 0, but some go up to 75
|
||||
/* 195 */ C("0")//dsmitigation - Newly Added - Default is 0, but some are up to 2
|
||||
/* 196 */ C("0")//heroic_str - Newly Added - Default is 0
|
||||
/* 197 */ C("0")//heroic_int - Newly Added - Default is 0
|
||||
/* 198 */ C("0")//heroic_wis - Newly Added - Default is 0
|
||||
/* 199 */ C("0")//heroic_agi - Newly Added - Default is 0
|
||||
/* 200 */ C("0")//heroic_dex - Newly Added - Default is 0
|
||||
/* 201 */ C("0")//heroic_sta - Newly Added - Default is 0
|
||||
/* 202 */ C("0")//heroic_cha - Newly Added - Default is 0
|
||||
/* 203 */ C("0")//HeroicSvPoison - Newly Added - Default is 0
|
||||
/* 204 */ C("0")//HeroicSvMagic - Newly Added - Default is 0
|
||||
/* 205 */ C("0")//HeroicSvFire - Newly Added - Default is 0
|
||||
/* 206 */ C("0")//HeroicSvDisease - Newly Added - Default is 0
|
||||
/* 207 */ C("0")//HeroicSvCold - Newly Added - Default is 0
|
||||
/* 208 */ C("0")//HeroicSvCorruption - Newly Added - Default is 0
|
||||
/* 209 */ C("0")//healamt - Newly Added - Default is 0, but some are up to 9
|
||||
/* 210 */ C("0")//spelldmg - Newly Added - Default is 0, but some are up to 9
|
||||
/* 211 */ C("0")//clairvoyance - Newly Added - Default is 0, but some are up to 10
|
||||
/* 212 */ C("0")//backstabdmg - Newly Added - Default is 0, but some are up to 65
|
||||
//* 213 */ C("0")//evolvinglevel - Newly Added - Default is 0, but some are up to 7
|
||||
//* 214 */ C("0")//MaxPower - Newly Added
|
||||
//* 215 */ C("0")//Power - Newly Added
|
||||
|
||||
//This doesn't appear to be used /* 102 */ S(verified)//verified
|
||||
//This doesn't appear to be used /* 102 */ S(serialized)//created
|
||||
//Unsure where this goes right now (or if it is even used) /* 108 */ I(SummonedFlag)
|
||||
|
||||
#else
|
||||
/* 000 */ //I(ItemClass) Leave this one off on purpose
|
||||
/* 001 */ S(Name)
|
||||
/* 002 */ S(Lore)
|
||||
/* 003 */ C("") //LoreFile?
|
||||
/* 003 */ S(IDFile)
|
||||
/* 004 */ I(ID)
|
||||
/* 005 */ I(Weight)
|
||||
/* 006 */ I(NoRent)
|
||||
/* 007 */ I(NoDrop)
|
||||
/* 008 */ I(Size)
|
||||
/* 009 */ I(Slots)
|
||||
/* 010 */ I(Price)
|
||||
/* 011 */ I(Icon)
|
||||
/* 013 */ C("0")
|
||||
/* 014 */ C("0")
|
||||
/* 014 */ I(BenefitFlag)
|
||||
/* 015 */ I(Tradeskills)
|
||||
/* 016 */ I(CR)
|
||||
/* 017 */ I(DR)
|
||||
/* 018 */ I(PR)
|
||||
/* 019 */ I(MR)
|
||||
/* 020 */ I(FR)
|
||||
C("0") //svcorruption
|
||||
/* 021 */ I(AStr)
|
||||
/* 022 */ I(ASta)
|
||||
/* 023 */ I(AAgi)
|
||||
/* 024 */ I(ADex)
|
||||
/* 025 */ I(ACha)
|
||||
/* 026 */ I(AInt)
|
||||
/* 027 */ I(AWis)
|
||||
/* 028 */ I(HP)
|
||||
/* 029 */ I(Mana)
|
||||
I(Endur)
|
||||
/* 030 */ I(AC)
|
||||
/* 052 */ I(Classes)
|
||||
/* 053 */ I(Races)
|
||||
/* 031 */ I(Deity)
|
||||
/* 032 */ I(SkillModValue)
|
||||
/* 033 */ C("0")
|
||||
/* 034 */ I(SkillModType)
|
||||
/* 035 */ I(BaneDmgRace)
|
||||
/* 037 */ I(BaneDmgBody)
|
||||
/* 036 */ I(BaneDmgRaceAmt)
|
||||
/* 036 */ I(BaneDmgAmt)
|
||||
/* 038 */ I(Magic)
|
||||
/* 039 */ I(CastTime_)
|
||||
/* 040 */ I(ReqLevel)
|
||||
/* 045 */ I(RecLevel)
|
||||
/* 046 */ I(RecSkill)
|
||||
/* 041 */ I(BardType)
|
||||
/* 042 */ I(BardValue)
|
||||
/* 043 */ I(Light)
|
||||
/* 044 */ I(Delay)
|
||||
/* 047 */ I(ElemDmgType)
|
||||
/* 048 */ I(ElemDmgAmt)
|
||||
/* 049 */ I(Range)
|
||||
/* 050 */ I(Damage)
|
||||
/* 051 */ I(Color)
|
||||
/* 056 */ I(ItemType)
|
||||
/* 057 */ I(Material)
|
||||
/* 060 */ C("0")
|
||||
/* 061 */ C("0")
|
||||
/* 058 */ F(SellRate)
|
||||
/* 063 */ I(CombatEffects)
|
||||
/* 064 */ I(Shielding)
|
||||
/* 065 */ I(StunResist)
|
||||
/* 059 */ //C("0")
|
||||
/* 061 */ //C("0")
|
||||
/* 066 */ I(StrikeThrough)
|
||||
/* 067 */ I(ExtraDmgSkill)
|
||||
/* 068 */ I(ExtraDmgAmt)
|
||||
/* 069 */ I(SpellShield)
|
||||
/* 070 */ I(Avoidance)
|
||||
/* 071 */ I(Accuracy)
|
||||
/* 072 */ I(CharmFileID)
|
||||
/* 073 */ I(FactionMod1)
|
||||
/* 077 */ I(FactionAmt1)
|
||||
/* 074 */ I(FactionMod2)
|
||||
/* 078 */ I(FactionAmt2)
|
||||
/* 075 */ I(FactionMod3)
|
||||
/* 079 */ I(FactionAmt3)
|
||||
/* 076 */ I(FactionMod4)
|
||||
/* 080 */ I(FactionAmt4)
|
||||
/* 081 */ S(CharmFile)
|
||||
/* 082 */ I(AugType)
|
||||
/* 082 */ I(AugRestrict)
|
||||
/* 082 */ I(AugDistiller)
|
||||
/* 083 */ I(AugSlotType[0])
|
||||
/* 084 */ I(AugSlotVisible[0])
|
||||
/* 084 */ I(AugSlotUnk2[0])
|
||||
/* 085 */ I(AugSlotType[1])
|
||||
/* 086 */ I(AugSlotVisible[1])
|
||||
/* 086 */ I(AugSlotUnk2[1])
|
||||
/* 087 */ I(AugSlotType[2])
|
||||
/* 088 */ I(AugSlotVisible[2])
|
||||
/* 088 */ I(AugSlotUnk2[2])
|
||||
/* 089 */ I(AugSlotType[3])
|
||||
/* 090 */ I(AugSlotVisible[3])
|
||||
/* 090 */ I(AugSlotUnk2[3])
|
||||
/* 091 */ I(AugSlotType[4])
|
||||
/* 092 */ I(AugSlotVisible[4])
|
||||
/* 092 */ I(AugSlotUnk2[4])
|
||||
/* 093 */ I(PointType)
|
||||
/* 093 */ I(LDoNTheme)
|
||||
/* 094 */ I(LDoNPrice)
|
||||
/* 094 */ C("0")
|
||||
/* 095 */ I(LDoNSold)
|
||||
/* 096 */ I(BagType)
|
||||
/* 097 */ I(BagSlots)
|
||||
/* 098 */ I(BagSize)
|
||||
/* 099 */ I(BagWR)
|
||||
/* 100 */ I(Book)
|
||||
/* 101 */ I(BookType)
|
||||
/* 102 */ S(Filename)
|
||||
/* 105 */ I(LoreGroup)
|
||||
/* 106 */ //I(PendingLoreFlag)
|
||||
/* 107 */ I(ArtifactFlag)
|
||||
/* 094 */ C("0")
|
||||
/* 108 */ //I(SummonedFlag)
|
||||
/* 109 */ I(Favor)
|
||||
/* 121 */ I(GuildFavor)
|
||||
/* 110 */ I(FVNoDrop)
|
||||
/* 112 */ I(DotShielding)
|
||||
/* 113 */ I(Attack)
|
||||
/* 114 */ I(Regen)
|
||||
/* 115 */ I(ManaRegen)
|
||||
/* 116 */ I(EnduranceRegen)
|
||||
/* 117 */ I(Haste)
|
||||
/* 118 */ I(DamageShield)
|
||||
/* 120 */ C("0")
|
||||
/* 121 */ C("0")
|
||||
/* 125 */ I(Attuneable)
|
||||
/* 126 */ I(NoPet)
|
||||
/* 124 */ C("0")
|
||||
/* 129 */ I(PotionBelt)
|
||||
/* 130 */ I(PotionBeltSlots)
|
||||
/* 131 */ I(StackSize)
|
||||
/* 132 */ I(NoTransfer)
|
||||
/* 129 */ C("0")
|
||||
/* 132 */ I(QuestItemFlag)
|
||||
/* 131 */ C("0")
|
||||
/* 132 */ C("00000000000000000000000000000000000000")
|
||||
/* 134 */ I(Click.Effect)
|
||||
/* 135 */ I(Click.Type)
|
||||
/* 136 */ I(Click.Level2)
|
||||
/* 137 */ I(Click.Level)
|
||||
/* 055 */ I(MaxCharges)
|
||||
/* 060 */ I(CastTime)
|
||||
/* 119 */ I(RecastDelay)
|
||||
/* 120 */ I(RecastType)
|
||||
/* 138 */ C("0") //clickunk5 (prolly ProcRate)
|
||||
/* 138 */ C("") //clickunk6
|
||||
/* 138 */ C("-1") //clickunk7
|
||||
/* 139 */ I(Proc.Effect)
|
||||
/* 140 */ I(Proc.Type)
|
||||
/* 141 */ I(Proc.Level2)
|
||||
/* 142 */ I(Proc.Level)
|
||||
/* 143 */ C("0") //procunk1 (prolly MaxCharges)
|
||||
/* 143 */ C("0") //procunk2 (prolly CastTime)
|
||||
/* 143 */ C("0") //procunk3 (prolly RecastDelay)
|
||||
/* 143 */ C("0") //procunk4 (prolly RecastType)
|
||||
/* 062 */ I(ProcRate)
|
||||
/* 143 */ C("") //procunk6
|
||||
/* 143 */ C("-1") //procunk7
|
||||
/* 144 */ I(Worn.Effect)
|
||||
/* 145 */ I(Worn.Type)
|
||||
/* 146 */ I(Worn.Level2)
|
||||
/* 147 */ I(Worn.Level)
|
||||
/* 143 */ C("0") //wornunk1 (prolly MaxCharges)
|
||||
/* 143 */ C("0") //wornunk2 (prolly CastTime)
|
||||
/* 143 */ C("0") //wornunk3 (prolly RecastDelay)
|
||||
/* 143 */ C("0") //wornunk4 (prolly RecastType)
|
||||
/* 143 */ C("0") //wornunk5 (prolly ProcRate)
|
||||
/* 143 */ C("") //wornunk6
|
||||
/* 143 */ C("-1") //wornunk7
|
||||
/* 149 */ I(Focus.Effect)
|
||||
/* 150 */ I(Focus.Type)
|
||||
/* 151 */ I(Focus.Level2)
|
||||
/* 152 */ I(Focus.Level)
|
||||
/* 143 */ C("0") //focusunk1 (prolly MaxCharges)
|
||||
/* 143 */ C("0") //focusunk2 (prolly CastTime)
|
||||
/* 143 */ C("0") //focusunk3 (prolly RecastDelay)
|
||||
/* 143 */ C("0") //focusunk4 (prolly RecastType)
|
||||
/* 143 */ C("0") //focusunk5 (prolly ProcRate)
|
||||
/* 143 */ C("") //focusunk6
|
||||
/* 143 */ C("-1") //focusunk7
|
||||
/* 154 */ I(Scroll.Effect)
|
||||
/* 155 */ I(Scroll.Type)
|
||||
/* 156 */ I(Scroll.Level2)
|
||||
/* 157 */ I(Scroll.Level)
|
||||
/* 143 */ C("0") //scrollunk1 (prolly MaxCharges)
|
||||
/* 143 */ C("0") //scrollunk2 (prolly CastTime)
|
||||
/* 143 */ C("0") //scrollunk3 (prolly RecastDelay)
|
||||
/* 143 */ C("0") //scrollunk4 (prolly RecastType)
|
||||
/* 143 */ C("0") //scrollunk5 (prolly ProcRate)
|
||||
/* 143 */ C("") //scrollunk6
|
||||
/* 143 */ C("-1") //scrollunk7
|
||||
/* 193 */ C("0") //Power Source Capacity
|
||||
/* 194 */ C("0") //purity
|
||||
|
||||
#endif
|
||||
|
||||
#undef I
|
||||
#undef C
|
||||
#undef S
|
||||
#undef F
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
// out-going packets that require an ENCODE translation:
|
||||
// Begin RoF2 Encodes
|
||||
|
||||
// incoming packets that require a DECODE translation:
|
||||
// Begin RoF2 Decodes
|
||||
|
||||
|
||||
// End RoF2 Encodes/Decodes
|
||||
|
||||
// These require Encodes/Decodes for RoF, so they do for RoF2 as well
|
||||
// Begin RoF Encodes
|
||||
E(OP_Action)
|
||||
E(OP_AdventureMerchantSell)
|
||||
E(OP_AltCurrency)
|
||||
E(OP_AltCurrencySell)
|
||||
E(OP_Animation)
|
||||
E(OP_ApplyPoison)
|
||||
E(OP_AugmentInfo)
|
||||
E(OP_Barter)
|
||||
E(OP_BazaarSearch)
|
||||
E(OP_BeginCast)
|
||||
E(OP_BlockedBuffs)
|
||||
E(OP_Buff)
|
||||
E(OP_BuffCreate)
|
||||
E(OP_CancelTrade)
|
||||
E(OP_CastSpell)
|
||||
E(OP_ChannelMessage)
|
||||
E(OP_CharInventory)
|
||||
E(OP_ClickObjectAction)
|
||||
E(OP_ClientUpdate)
|
||||
E(OP_Consider)
|
||||
E(OP_Damage)
|
||||
E(OP_DeleteCharge)
|
||||
E(OP_DeleteItem)
|
||||
E(OP_DeleteSpawn)
|
||||
E(OP_DisciplineUpdate)
|
||||
E(OP_DzCompass)
|
||||
E(OP_DzExpeditionEndsWarning)
|
||||
E(OP_DzExpeditionInfo)
|
||||
E(OP_DzExpeditionList)
|
||||
E(OP_DzJoinExpeditionConfirm)
|
||||
E(OP_DzLeaderStatus)
|
||||
E(OP_DzMemberList)
|
||||
E(OP_ExpansionInfo)
|
||||
E(OP_GMLastName)
|
||||
E(OP_GMTrainSkillConfirm)
|
||||
E(OP_GroundSpawn)
|
||||
E(OP_GroupCancelInvite)
|
||||
E(OP_GroupFollow)
|
||||
E(OP_GroupFollow2)
|
||||
E(OP_GroupInvite)
|
||||
E(OP_GroupUpdate)
|
||||
E(OP_GuildMemberList)
|
||||
E(OP_GuildMemberUpdate)
|
||||
E(OP_GuildsList)
|
||||
E(OP_HPUpdate)
|
||||
E(OP_Illusion)
|
||||
E(OP_InspectBuffs)
|
||||
E(OP_InspectRequest)
|
||||
E(OP_InterruptCast)
|
||||
E(OP_ItemLinkResponse)
|
||||
E(OP_ItemPacket)
|
||||
E(OP_ItemVerifyReply)
|
||||
E(OP_LeadershipExpUpdate)
|
||||
E(OP_LogServer)
|
||||
E(OP_LootItem)
|
||||
E(OP_ManaChange)
|
||||
E(OP_MercenaryDataResponse)
|
||||
E(OP_MercenaryDataUpdate)
|
||||
E(OP_MoveItem)
|
||||
E(OP_NewSpawn)
|
||||
E(OP_NewZone)
|
||||
E(OP_OnLevelMessage)
|
||||
//E(OP_OpenNewTasksWindow)
|
||||
E(OP_PetBuffWindow)
|
||||
E(OP_PlayerProfile)
|
||||
E(OP_RaidJoin)
|
||||
E(OP_RaidUpdate)
|
||||
E(OP_ReadBook)
|
||||
E(OP_RecipeAutoCombine)
|
||||
E(OP_RemoveBlockedBuffs)
|
||||
E(OP_RequestClientZoneChange)
|
||||
E(OP_RespondAA)
|
||||
E(OP_RezzRequest)
|
||||
E(OP_SendAATable)
|
||||
E(OP_SendCharInfo)
|
||||
E(OP_SendMembership)
|
||||
E(OP_SendZonepoints)
|
||||
E(OP_SetGuildRank)
|
||||
E(OP_ShopPlayerBuy)
|
||||
E(OP_ShopPlayerSell)
|
||||
E(OP_ShopRequest)
|
||||
E(OP_SkillUpdate)
|
||||
E(OP_SomeItemPacketMaybe)
|
||||
E(OP_SpawnAppearance)
|
||||
E(OP_SpawnDoor)
|
||||
E(OP_Stun)
|
||||
E(OP_TargetBuffs)
|
||||
E(OP_TaskDescription)
|
||||
E(OP_TaskHistoryReply)
|
||||
E(OP_Track)
|
||||
E(OP_Trader)
|
||||
E(OP_TraderBuy)
|
||||
E(OP_TributeInfo)
|
||||
E(OP_TributeItem)
|
||||
E(OP_VetRewardsAvaliable)
|
||||
E(OP_WearChange)
|
||||
E(OP_WhoAllResponse)
|
||||
E(OP_ZoneChange)
|
||||
E(OP_ZoneEntry)
|
||||
E(OP_ZonePlayerToBind)
|
||||
E(OP_ZoneServerInfo)
|
||||
E(OP_ZoneSpawns)
|
||||
// Begin RoF Decodes
|
||||
D(OP_AdventureMerchantSell)
|
||||
D(OP_AltCurrencySell)
|
||||
D(OP_AltCurrencySellSelection)
|
||||
D(OP_ApplyPoison)
|
||||
D(OP_AugmentInfo)
|
||||
D(OP_AugmentItem)
|
||||
D(OP_BazaarSearch)
|
||||
D(OP_BlockedBuffs)
|
||||
D(OP_Buff)
|
||||
D(OP_BuffRemoveRequest)
|
||||
D(OP_CastSpell)
|
||||
D(OP_ChannelMessage)
|
||||
D(OP_CharacterCreate)
|
||||
D(OP_ClientUpdate)
|
||||
D(OP_Consider)
|
||||
D(OP_ConsiderCorpse)
|
||||
D(OP_Consume)
|
||||
D(OP_Damage)
|
||||
D(OP_DeleteItem)
|
||||
D(OP_EnvDamage)
|
||||
D(OP_FaceChange)
|
||||
D(OP_FindPersonRequest)
|
||||
D(OP_GMLastName)
|
||||
D(OP_GroupCancelInvite)
|
||||
D(OP_GroupDisband)
|
||||
D(OP_GroupFollow)
|
||||
D(OP_GroupFollow2)
|
||||
D(OP_GroupInvite)
|
||||
D(OP_GroupInvite2)
|
||||
D(OP_GuildDemote)
|
||||
D(OP_GuildRemove)
|
||||
D(OP_GuildStatus)
|
||||
D(OP_InspectRequest)
|
||||
D(OP_ItemLinkClick)
|
||||
D(OP_ItemVerifyRequest)
|
||||
D(OP_LoadSpellSet)
|
||||
D(OP_LootItem)
|
||||
D(OP_MoveItem)
|
||||
D(OP_PetCommands)
|
||||
D(OP_RaidInvite)
|
||||
D(OP_ReadBook)
|
||||
D(OP_RecipeAutoCombine)
|
||||
D(OP_RemoveBlockedBuffs)
|
||||
D(OP_RezzAnswer)
|
||||
D(OP_Save)
|
||||
D(OP_SetServerFilter)
|
||||
D(OP_ShopPlayerBuy)
|
||||
D(OP_ShopPlayerSell)
|
||||
D(OP_ShopRequest)
|
||||
D(OP_Trader)
|
||||
D(OP_TraderBuy)
|
||||
D(OP_TradeSkillCombine)
|
||||
D(OP_TributeItem)
|
||||
D(OP_WhoAllRequest)
|
||||
D(OP_ZoneChange)
|
||||
D(OP_ZoneEntry)
|
||||
// End RoF Encodes/Decodes
|
||||
#undef E
|
||||
#undef D
|
||||
File diff suppressed because it is too large
Load Diff
@@ -108,7 +108,7 @@ namespace RoF {
|
||||
static const uint16 MAP_TRADE_SIZE = 8;
|
||||
static const uint16 MAP_WORLD_SIZE = 10;
|
||||
static const uint16 MAP_LIMBO_SIZE = 36;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 5; // 5 until verified otherwise
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 0; //?
|
||||
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||
@@ -161,7 +161,6 @@ namespace RoF {
|
||||
static const int16 TRADE_BEGIN = 3000;
|
||||
static const int16 TRADE_END = 3007;
|
||||
static const int16 TRADE_NPC_END = 3003;
|
||||
static const int16 TRADE_NPC_SIZE = 4;
|
||||
static const int16 TRADE_BAGS_BEGIN = 3031;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = 79;
|
||||
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
|
||||
@@ -175,12 +174,6 @@ namespace RoF {
|
||||
static const int16 CORPSE_BEGIN = slots::MainGeneral1;
|
||||
static const int16 CORPSE_END = slots::MainGeneral1 + slots::MainCursor;
|
||||
|
||||
// RoF may have additional material slots based on observations in player profile - may need translators
|
||||
static const int16 MATERIAL_BEGIN = MaterialHead;
|
||||
static const int16 MATERIAL_END = MaterialSecondary;
|
||||
static const int16 MATERIAL_TINT_END = MaterialFeet;
|
||||
static const int16 MATERIAL_SIZE = _MaterialCount;
|
||||
|
||||
static const uint16 ITEM_COMMON_SIZE = 6;
|
||||
static const uint16 ITEM_CONTAINER_SIZE = 255; // 255; (server max will be 255..unsure what actual client is - test)
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ E(OP_AltCurrency)
|
||||
E(OP_AltCurrencySell)
|
||||
E(OP_Animation)
|
||||
E(OP_ApplyPoison)
|
||||
E(OP_AugmentInfo)
|
||||
E(OP_Barter)
|
||||
E(OP_BazaarSearch)
|
||||
E(OP_BeginCast)
|
||||
@@ -44,6 +45,7 @@ E(OP_GuildMemberUpdate)
|
||||
E(OP_GuildsList)
|
||||
E(OP_HPUpdate)
|
||||
E(OP_Illusion)
|
||||
E(OP_InspectBuffs)
|
||||
E(OP_InspectRequest)
|
||||
E(OP_InterruptCast)
|
||||
E(OP_ItemLinkResponse)
|
||||
|
||||
+100
-15
@@ -112,7 +112,7 @@ static const uint32 MAX_NUMBER_GUILDS = 1500;
|
||||
static const uint32 MAX_PP_LANGUAGE = 32; // was 25
|
||||
static const uint32 MAX_PP_SPELLBOOK = 720; // was 480
|
||||
static const uint32 MAX_PP_MEMSPELL = 16; // was 12
|
||||
static const uint32 MAX_PP_SKILL = _SkillPacketArraySize; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_AA_ARRAY = 300;
|
||||
static const uint32 MAX_PP_DISCIPLINES = 200; // was 100
|
||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||
@@ -767,8 +767,8 @@ struct GMTrainee_Struct
|
||||
{
|
||||
/*000*/ uint32 npcid;
|
||||
/*004*/ uint32 playerid;
|
||||
/*008*/ uint32 skills[73];
|
||||
/*300*/ uint8 unknown300[148];
|
||||
/*008*/ uint32 skills[PACKET_SKILL_ARRAY_SIZE];
|
||||
/*408*/ uint8 unknown408[40];
|
||||
/*448*/
|
||||
};
|
||||
|
||||
@@ -915,14 +915,62 @@ struct PotionBelt_Struct {
|
||||
BandolierItem_Struct items[MAX_POTIONS_IN_BELT];
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
struct GroupLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 groupAAMarkNPC;
|
||||
uint32 groupAANPCHealth;
|
||||
uint32 groupAADelegateMainAssist;
|
||||
uint32 groupAADelegateMarkNPC;
|
||||
uint32 groupAA4;
|
||||
uint32 groupAA5;
|
||||
uint32 groupAAInspectBuffs;
|
||||
uint32 groupAA7;
|
||||
uint32 groupAASpellAwareness;
|
||||
uint32 groupAAOffenseEnhancement;
|
||||
uint32 groupAAManaEnhancement;
|
||||
uint32 groupAAHealthEnhancement;
|
||||
uint32 groupAAHealthRegeneration;
|
||||
uint32 groupAAFindPathToPC;
|
||||
uint32 groupAAHealthOfTargetsTarget;
|
||||
uint32 groupAA15;
|
||||
};
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct RaidLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 raidAAMarkNPC;
|
||||
uint32 raidAANPCHealth;
|
||||
uint32 raidAADelegateMainAssist;
|
||||
uint32 raidAADelegateMarkNPC;
|
||||
uint32 raidAA4;
|
||||
uint32 raidAA5;
|
||||
uint32 raidAA6;
|
||||
uint32 raidAASpellAwareness;
|
||||
uint32 raidAAOffenseEnhancement;
|
||||
uint32 raidAAManaEnhancement;
|
||||
uint32 raidAAHealthEnhancement;
|
||||
uint32 raidAAHealthRegeneration;
|
||||
uint32 raidAAFindPathToPC;
|
||||
uint32 raidAAHealthOfTargetsTarget;
|
||||
uint32 raidAA14;
|
||||
uint32 raidAA15;
|
||||
};
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
GroupLeadershipAA_Struct group;
|
||||
RaidLeadershipAA_Struct raid;
|
||||
};
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -2425,6 +2473,11 @@ struct GroupFollow_Struct { // Live Follow Struct
|
||||
/*0152*/
|
||||
};
|
||||
|
||||
struct InspectBuffs_Struct {
|
||||
/*000*/ uint32 spell_id[BUFF_COUNT];
|
||||
/*168*/ uint32 tics_remaining[BUFF_COUNT];
|
||||
};
|
||||
|
||||
struct LFG_Struct {
|
||||
/*000*/ uint32 unknown000;
|
||||
/*004*/ uint32 value; // 0x00 = off 0x01 = on
|
||||
@@ -3994,6 +4047,21 @@ struct RaidAddMember_Struct {
|
||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||
};
|
||||
|
||||
struct RaidMOTD_Struct {
|
||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
||||
};
|
||||
|
||||
struct RaidLeadershipUpdate_Struct {
|
||||
/*000*/ uint32 action;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ uint32 Unknown068;
|
||||
/*072*/ char leader_name[64];
|
||||
/*136*/ GroupLeadershipAA_Struct group; //unneeded
|
||||
/*200*/ RaidLeadershipAA_Struct raid;
|
||||
/*264*/ char Unknown264[128];
|
||||
};
|
||||
|
||||
struct RaidAdd_Struct {
|
||||
/*000*/ uint32 action; //=0
|
||||
/*004*/ char player_name[64]; //should both be the player's name
|
||||
@@ -4101,7 +4169,8 @@ struct Arrow_Struct {
|
||||
/*070*/ uint8 unknown070;
|
||||
/*071*/ uint8 item_type;
|
||||
/*072*/ uint8 skill;
|
||||
/*073*/ char model_name[43];
|
||||
/*073*/ uint8 unknown073[16];
|
||||
/*089*/ char model_name[27];
|
||||
/*116*/
|
||||
};
|
||||
|
||||
@@ -4328,7 +4397,7 @@ struct ItemSerializationHeader
|
||||
/*030*/ uint16 unknown013; // 0xffff
|
||||
/*032*/ uint32 price;
|
||||
/*036*/ uint32 merchant_slot; //1 if not a merchant item
|
||||
/*040*/ uint32 unknown020; //0
|
||||
/*040*/ uint32 scaled_value; //0
|
||||
/*044*/ uint32 instance_id; //unique instance id if not merchant item, else is merchant slot
|
||||
/*048*/ uint32 unknown028; //0
|
||||
/*052*/ uint32 last_cast_time; // Unix Time from PP of last cast for this recast type if recast delay > 0
|
||||
@@ -4337,8 +4406,24 @@ struct ItemSerializationHeader
|
||||
/*064*/ uint32 unknown044; // 0
|
||||
/*068*/ uint32 unknown048; // 0
|
||||
/*072*/ uint32 unknown052; // 0
|
||||
/*076*/ uint32 unknown056; // 0
|
||||
/*080*/ uint8 unknown060; // 0
|
||||
uint8 isEvolving;
|
||||
};
|
||||
|
||||
struct EvolvingItem {
|
||||
uint8 unknown001;
|
||||
uint8 unknown002;
|
||||
uint8 unknown003;
|
||||
uint8 unknown004;
|
||||
int32 evoLevel;
|
||||
double progress;
|
||||
uint8 Activated;
|
||||
int32 evomaxlevel;
|
||||
uint8 unknown005[4];
|
||||
};
|
||||
|
||||
struct ItemSerializationHeaderFinish
|
||||
{
|
||||
uint16 ornamentIcon;
|
||||
/*081*/ uint8 unknown061; // 0 - Add Evolving Item struct if this isn't set to 0?
|
||||
/*082*/ uint8 unknown062; // 0
|
||||
/*083*/ uint32 unknowna1; // 0xffffffff
|
||||
@@ -4608,9 +4693,9 @@ struct ItemQuaternaryBodyStruct
|
||||
struct AugmentInfo_Struct
|
||||
{
|
||||
/*000*/ uint32 itemid; // id of the solvent needed
|
||||
/*004*/ uint8 window; // window to display the information in
|
||||
/*005*/ uint8 unknown005[71]; // total packet length 76, all the rest were always 00
|
||||
/*076*/
|
||||
/*004*/ uint32 window; // window to display the information in
|
||||
/*008*/ char augment_info[64]; // total packet length 76, all the rest were always 00
|
||||
/*072*/ uint32 unknown072;
|
||||
};
|
||||
|
||||
struct VeteranRewardItem
|
||||
|
||||
+71
-10
@@ -174,6 +174,18 @@ namespace SoD
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_AugmentInfo)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(AugmentInfo_Struct);
|
||||
SETUP_DIRECT_ENCODE(AugmentInfo_Struct, structs::AugmentInfo_Struct);
|
||||
|
||||
OUT(itemid);
|
||||
OUT(window);
|
||||
strn0cpy(eq->augment_info, emu->augment_info, 64);
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_Barter)
|
||||
{
|
||||
EQApplicationPacket *in = *p;
|
||||
@@ -1657,6 +1669,29 @@ namespace SoD
|
||||
add_member->flags[4] = in_add_member->flags[4];
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else if (raid_gen->action == 35)
|
||||
{
|
||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) + strlen(inmotd->motd) + 1);
|
||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
||||
|
||||
outmotd->general.action = inmotd->general.action;
|
||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
||||
{
|
||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
||||
|
||||
outlaa->action = inlaa->action;
|
||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else
|
||||
{
|
||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
||||
@@ -2974,15 +3009,40 @@ namespace SoD
|
||||
|
||||
DECODE(OP_RaidInvite)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||
|
||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
||||
IN(action);
|
||||
IN(parameter);
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
// This is a switch on the RaidGeneral action
|
||||
switch (*(uint32 *)__packet->pBuffer) {
|
||||
case 35: { // raidMOTD
|
||||
// we don't have a nice macro for this
|
||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
||||
__eq_buffer->motd[1023] = '\0';
|
||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
||||
__packet->pBuffer = new unsigned char[__packet->size];
|
||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
||||
IN(general.action);
|
||||
IN(general.parameter);
|
||||
FINISH_DIRECT_DECODE();
|
||||
break;
|
||||
}
|
||||
case 36: { // raidPlayerNote unhandled
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
||||
IN(action);
|
||||
IN(parameter);
|
||||
FINISH_DIRECT_DECODE();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DECODE(OP_ReadBook)
|
||||
@@ -3147,7 +3207,7 @@ namespace SoD
|
||||
|
||||
std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary);
|
||||
|
||||
const Item_Struct *item = inst->GetItem();
|
||||
const Item_Struct *item = inst->GetUnscaledItem();
|
||||
//_log(NET__ERROR, "Serialize called for: %s", item->Name);
|
||||
SoD::structs::ItemSerializationHeader hdr;
|
||||
hdr.stacksize = stackable ? charges : 1;
|
||||
@@ -3158,7 +3218,7 @@ namespace SoD
|
||||
hdr.slot = (merchant_slot == 0) ? slot_id : merchant_slot;
|
||||
hdr.price = inst->GetPrice();
|
||||
hdr.merchant_slot = (merchant_slot == 0) ? 1 : inst->GetMerchantCount();
|
||||
hdr.unknown020 = 0;
|
||||
hdr.scaled_value = inst->IsScaling() ? inst->GetExp() / 100 : 0;
|
||||
hdr.instance_id = (merchant_slot == 0) ? inst->GetSerialNumber() : merchant_slot;
|
||||
hdr.unknown028 = 0;
|
||||
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
|
||||
@@ -3281,6 +3341,7 @@ namespace SoD
|
||||
ibs.SpellShield = item->SpellShield;
|
||||
ibs.Avoidance = item->Avoidance;
|
||||
ibs.Accuracy = item->Accuracy;
|
||||
ibs.CharmFileID = item->CharmFileID;
|
||||
ibs.FactionAmt1 = item->FactionAmt1;
|
||||
ibs.FactionMod1 = item->FactionMod1;
|
||||
ibs.FactionAmt2 = item->FactionAmt2;
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace SoD {
|
||||
static const uint16 MAP_TRADE_SIZE = 8;
|
||||
static const uint16 MAP_WORLD_SIZE = 10;
|
||||
static const uint16 MAP_LIMBO_SIZE = 36;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 5; // 5 until verified otherwise
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 0; //?
|
||||
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||
@@ -158,7 +158,6 @@ namespace SoD {
|
||||
static const int16 TRADE_BEGIN = 3000;
|
||||
static const int16 TRADE_END = 3007;
|
||||
static const int16 TRADE_NPC_END = 3003;
|
||||
static const int16 TRADE_NPC_SIZE = 4;
|
||||
static const int16 TRADE_BAGS_BEGIN = 3031;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = 79;
|
||||
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
|
||||
@@ -172,11 +171,6 @@ namespace SoD {
|
||||
static const int16 CORPSE_BEGIN = slots::MainGeneral1;
|
||||
static const int16 CORPSE_END = slots::MainGeneral1 + slots::MainCursor;
|
||||
|
||||
static const int16 MATERIAL_BEGIN = MaterialHead;
|
||||
static const int16 MATERIAL_END = MaterialSecondary;
|
||||
static const int16 MATERIAL_TINT_END = MaterialFeet;
|
||||
static const int16 MATERIAL_SIZE = _MaterialCount;
|
||||
|
||||
static const uint16 ITEM_COMMON_SIZE = 5;
|
||||
static const uint16 ITEM_CONTAINER_SIZE = 10;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ E(OP_Action)
|
||||
E(OP_AdventureMerchantSell)
|
||||
E(OP_AltCurrencySell)
|
||||
E(OP_ApplyPoison)
|
||||
E(OP_AugmentInfo)
|
||||
E(OP_Barter)
|
||||
E(OP_BazaarSearch)
|
||||
E(OP_Buff)
|
||||
|
||||
@@ -576,8 +576,8 @@ struct GMTrainee_Struct
|
||||
{
|
||||
/*000*/ uint32 npcid;
|
||||
/*004*/ uint32 playerid;
|
||||
/*008*/ uint32 skills[73];
|
||||
/*300*/ uint8 unknown300[148];
|
||||
/*008*/ uint32 skills[PACKET_SKILL_ARRAY_SIZE];
|
||||
/*408*/ uint8 unknown408[40];
|
||||
/*448*/
|
||||
};
|
||||
|
||||
@@ -711,14 +711,62 @@ struct PotionBelt_Struct {
|
||||
static const uint32 MAX_GROUP_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_RAID_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_LEADERSHIP_AA_ARRAY = (MAX_GROUP_LEADERSHIP_AA_ARRAY+MAX_RAID_LEADERSHIP_AA_ARRAY);
|
||||
struct LeadershipAA_Struct {
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
struct GroupLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 groupAAMarkNPC;
|
||||
uint32 groupAANPCHealth;
|
||||
uint32 groupAADelegateMainAssist;
|
||||
uint32 groupAADelegateMarkNPC;
|
||||
uint32 groupAA4;
|
||||
uint32 groupAA5;
|
||||
uint32 groupAAInspectBuffs;
|
||||
uint32 groupAA7;
|
||||
uint32 groupAASpellAwareness;
|
||||
uint32 groupAAOffenseEnhancement;
|
||||
uint32 groupAAManaEnhancement;
|
||||
uint32 groupAAHealthEnhancement;
|
||||
uint32 groupAAHealthRegeneration;
|
||||
uint32 groupAAFindPathToPC;
|
||||
uint32 groupAAHealthOfTargetsTarget;
|
||||
uint32 groupAA15;
|
||||
};
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct RaidLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 raidAAMarkNPC;
|
||||
uint32 raidAANPCHealth;
|
||||
uint32 raidAADelegateMainAssist;
|
||||
uint32 raidAADelegateMarkNPC;
|
||||
uint32 raidAA4;
|
||||
uint32 raidAA5;
|
||||
uint32 raidAA6;
|
||||
uint32 raidAASpellAwareness;
|
||||
uint32 raidAAOffenseEnhancement;
|
||||
uint32 raidAAManaEnhancement;
|
||||
uint32 raidAAHealthEnhancement;
|
||||
uint32 raidAAHealthRegeneration;
|
||||
uint32 raidAAFindPathToPC;
|
||||
uint32 raidAAHealthOfTargetsTarget;
|
||||
uint32 raidAA14;
|
||||
uint32 raidAA15;
|
||||
};
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
GroupLeadershipAA_Struct group;
|
||||
RaidLeadershipAA_Struct raid;
|
||||
};
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -744,7 +792,7 @@ struct BindStruct {
|
||||
static const uint32 MAX_PP_LANGUAGE = 25; //
|
||||
static const uint32 MAX_PP_SPELLBOOK = 480; // Confirmed 60 pages on Live now
|
||||
static const uint32 MAX_PP_MEMSPELL = 10; //was 9 now 10 on Live
|
||||
static const uint32 MAX_PP_SKILL = _SkillPacketArraySize; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||
static const uint32 MAX_RECAST_TYPES = 20;
|
||||
@@ -3562,6 +3610,21 @@ struct RaidAddMember_Struct {
|
||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||
};
|
||||
|
||||
struct RaidMOTD_Struct {
|
||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
||||
};
|
||||
|
||||
struct RaidLeadershipUpdate_Struct {
|
||||
/*000*/ uint32 action;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ uint32 Unknown068;
|
||||
/*072*/ char leader_name[64];
|
||||
/*136*/ GroupLeadershipAA_Struct group; //unneeded
|
||||
/*200*/ RaidLeadershipAA_Struct raid;
|
||||
/*264*/ char Unknown264[128];
|
||||
};
|
||||
|
||||
struct RaidAdd_Struct {
|
||||
/*000*/ uint32 action; //=0
|
||||
/*004*/ char player_name[64]; //should both be the player's name
|
||||
@@ -3868,7 +3931,7 @@ struct ItemSerializationHeader
|
||||
/*008*/ uint32 slot;
|
||||
/*012*/ uint32 price;
|
||||
/*016*/ uint32 merchant_slot; //1 if not a merchant item
|
||||
/*020*/ uint32 unknown020; //0
|
||||
/*020*/ uint32 scaled_value; //0
|
||||
/*024*/ uint32 instance_id; //unique instance id if not merchant item, else is merchant slot
|
||||
/*028*/ uint32 unknown028; //0
|
||||
/*032*/ uint32 last_cast_time; // Unix Time from PP of last cast for this recast type if recast delay > 0
|
||||
@@ -4110,9 +4173,9 @@ struct ItemQuaternaryBodyStruct
|
||||
struct AugmentInfo_Struct
|
||||
{
|
||||
/*000*/ uint32 itemid; // id of the solvent needed
|
||||
/*004*/ uint8 window; // window to display the information in
|
||||
/*005*/ uint8 unknown005[71]; // total packet length 76, all the rest were always 00
|
||||
/*076*/
|
||||
/*004*/ uint32 window; // window to display the information in
|
||||
/*008*/ char augment_info[64]; // total packet length 76, all the rest were always 00
|
||||
/*072*/ uint32 unknown072;
|
||||
};
|
||||
|
||||
struct VeteranRewardItem
|
||||
|
||||
+71
-10
@@ -174,6 +174,18 @@ namespace SoF
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_AugmentInfo)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(AugmentInfo_Struct);
|
||||
SETUP_DIRECT_ENCODE(AugmentInfo_Struct, structs::AugmentInfo_Struct);
|
||||
|
||||
OUT(itemid);
|
||||
OUT(window);
|
||||
strn0cpy(eq->augment_info, emu->augment_info, 64);
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_BazaarSearch)
|
||||
{
|
||||
if (((*p)->size == sizeof(BazaarReturnDone_Struct)) || ((*p)->size == sizeof(BazaarWelcome_Struct))) {
|
||||
@@ -1315,6 +1327,29 @@ namespace SoF
|
||||
add_member->flags[4] = in_add_member->flags[4];
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else if (raid_gen->action == 35)
|
||||
{
|
||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) + strlen(inmotd->motd) + 1);
|
||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
||||
|
||||
outmotd->general.action = inmotd->general.action;
|
||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
||||
{
|
||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
||||
|
||||
outlaa->action = inlaa->action;
|
||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else
|
||||
{
|
||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
||||
@@ -2312,15 +2347,40 @@ namespace SoF
|
||||
|
||||
DECODE(OP_RaidInvite)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||
|
||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
||||
IN(action);
|
||||
IN(parameter);
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
// This is a switch on the RaidGeneral action
|
||||
switch (*(uint32 *)__packet->pBuffer) {
|
||||
case 35: { // raidMOTD
|
||||
// we don't have a nice macro for this
|
||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
||||
__eq_buffer->motd[1023] = '\0';
|
||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
||||
__packet->pBuffer = new unsigned char[__packet->size];
|
||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
||||
IN(general.action);
|
||||
IN(general.parameter);
|
||||
FINISH_DIRECT_DECODE();
|
||||
break;
|
||||
}
|
||||
case 36: { // raidPlayerNote unhandled
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
||||
IN(action);
|
||||
IN(parameter);
|
||||
FINISH_DIRECT_DECODE();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DECODE(OP_ReadBook)
|
||||
@@ -2471,7 +2531,7 @@ namespace SoF
|
||||
|
||||
std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary);
|
||||
|
||||
const Item_Struct *item = inst->GetItem();
|
||||
const Item_Struct *item = inst->GetUnscaledItem();
|
||||
//_log(NET__ERROR, "Serialize called for: %s", item->Name);
|
||||
SoF::structs::ItemSerializationHeader hdr;
|
||||
hdr.stacksize = stackable ? charges : 1;
|
||||
@@ -2482,7 +2542,7 @@ namespace SoF
|
||||
hdr.slot = (merchant_slot == 0) ? slot_id : merchant_slot;
|
||||
hdr.price = inst->GetPrice();
|
||||
hdr.merchant_slot = (merchant_slot == 0) ? 1 : inst->GetMerchantCount();
|
||||
hdr.unknown020 = 0;
|
||||
hdr.scaled_value = inst->IsScaling() ? inst->GetExp() / 100 : 0;
|
||||
hdr.instance_id = (merchant_slot == 0) ? inst->GetSerialNumber() : merchant_slot;
|
||||
hdr.unknown028 = 0;
|
||||
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
|
||||
@@ -2604,6 +2664,7 @@ namespace SoF
|
||||
ibs.SpellShield = item->SpellShield;
|
||||
ibs.Avoidance = item->Avoidance;
|
||||
ibs.Accuracy = item->Accuracy;
|
||||
ibs.CharmFileID = item->CharmFileID;
|
||||
ibs.FactionAmt1 = item->FactionAmt1;
|
||||
ibs.FactionMod1 = item->FactionMod1;
|
||||
ibs.FactionAmt2 = item->FactionAmt2;
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace SoF {
|
||||
static const uint16 MAP_TRADE_SIZE = 8;
|
||||
static const uint16 MAP_WORLD_SIZE = 10;
|
||||
static const uint16 MAP_LIMBO_SIZE = 36;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 5; // 5 until verified otherwise
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 0; //?
|
||||
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||
@@ -158,7 +158,6 @@ namespace SoF {
|
||||
static const int16 TRADE_BEGIN = 3000;
|
||||
static const int16 TRADE_END = 3007;
|
||||
static const int16 TRADE_NPC_END = 3003;
|
||||
static const int16 TRADE_NPC_SIZE = 4;
|
||||
static const int16 TRADE_BAGS_BEGIN = 3031;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = 79;
|
||||
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
|
||||
@@ -172,11 +171,6 @@ namespace SoF {
|
||||
static const int16 CORPSE_BEGIN = slots::MainGeneral1;
|
||||
static const int16 CORPSE_END = slots::MainGeneral1 + slots::MainCursor;
|
||||
|
||||
static const int16 MATERIAL_BEGIN = MaterialHead;
|
||||
static const int16 MATERIAL_END = MaterialSecondary;
|
||||
static const int16 MATERIAL_TINT_END = MaterialFeet;
|
||||
static const int16 MATERIAL_SIZE = _MaterialCount;
|
||||
|
||||
static const uint16 ITEM_COMMON_SIZE = 5;
|
||||
static const uint16 ITEM_CONTAINER_SIZE = 10;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ E(OP_Action)
|
||||
E(OP_AdventureMerchantSell)
|
||||
E(OP_AltCurrencySell)
|
||||
E(OP_ApplyPoison)
|
||||
E(OP_AugmentInfo)
|
||||
E(OP_BazaarSearch)
|
||||
E(OP_BecomeTrader)
|
||||
E(OP_Buff)
|
||||
|
||||
@@ -554,8 +554,8 @@ struct GMTrainee_Struct
|
||||
{
|
||||
/*000*/ uint32 npcid;
|
||||
/*004*/ uint32 playerid;
|
||||
/*008*/ uint32 skills[73];
|
||||
/*300*/ uint8 unknown300[148];
|
||||
/*008*/ uint32 skills[PACKET_SKILL_ARRAY_SIZE];
|
||||
/*408*/ uint8 unknown408[40];
|
||||
/*448*/
|
||||
};
|
||||
|
||||
@@ -689,14 +689,62 @@ struct PotionBelt_Struct {
|
||||
static const uint32 MAX_GROUP_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_RAID_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_LEADERSHIP_AA_ARRAY = (MAX_GROUP_LEADERSHIP_AA_ARRAY+MAX_RAID_LEADERSHIP_AA_ARRAY);
|
||||
struct LeadershipAA_Struct {
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
struct GroupLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 groupAAMarkNPC;
|
||||
uint32 groupAANPCHealth;
|
||||
uint32 groupAADelegateMainAssist;
|
||||
uint32 groupAADelegateMarkNPC;
|
||||
uint32 groupAA4;
|
||||
uint32 groupAA5;
|
||||
uint32 groupAAInspectBuffs;
|
||||
uint32 groupAA7;
|
||||
uint32 groupAASpellAwareness;
|
||||
uint32 groupAAOffenseEnhancement;
|
||||
uint32 groupAAManaEnhancement;
|
||||
uint32 groupAAHealthEnhancement;
|
||||
uint32 groupAAHealthRegeneration;
|
||||
uint32 groupAAFindPathToPC;
|
||||
uint32 groupAAHealthOfTargetsTarget;
|
||||
uint32 groupAA15;
|
||||
};
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct RaidLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 raidAAMarkNPC;
|
||||
uint32 raidAANPCHealth;
|
||||
uint32 raidAADelegateMainAssist;
|
||||
uint32 raidAADelegateMarkNPC;
|
||||
uint32 raidAA4;
|
||||
uint32 raidAA5;
|
||||
uint32 raidAA6;
|
||||
uint32 raidAASpellAwareness;
|
||||
uint32 raidAAOffenseEnhancement;
|
||||
uint32 raidAAManaEnhancement;
|
||||
uint32 raidAAHealthEnhancement;
|
||||
uint32 raidAAHealthRegeneration;
|
||||
uint32 raidAAFindPathToPC;
|
||||
uint32 raidAAHealthOfTargetsTarget;
|
||||
uint32 raidAA14;
|
||||
uint32 raidAA15;
|
||||
};
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
GroupLeadershipAA_Struct group;
|
||||
RaidLeadershipAA_Struct raid;
|
||||
};
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -722,7 +770,7 @@ struct BindStruct {
|
||||
static const uint32 MAX_PP_LANGUAGE = 25; //
|
||||
static const uint32 MAX_PP_SPELLBOOK = 480; // Confirmed 60 pages on Live now
|
||||
static const uint32 MAX_PP_MEMSPELL = 10; //was 9 now 10 on Live
|
||||
static const uint32 MAX_PP_SKILL = _SkillPacketArraySize; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||
static const uint32 MAX_RECAST_TYPES = 20;
|
||||
@@ -3425,6 +3473,21 @@ struct RaidAddMember_Struct {
|
||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||
};
|
||||
|
||||
struct RaidMOTD_Struct {
|
||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
||||
};
|
||||
|
||||
struct RaidLeadershipUpdate_Struct {
|
||||
/*000*/ uint32 action;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ uint32 Unknown068;
|
||||
/*072*/ char leader_name[64];
|
||||
/*136*/ GroupLeadershipAA_Struct group; //unneeded
|
||||
/*200*/ RaidLeadershipAA_Struct raid;
|
||||
/*264*/ char Unknown264[128];
|
||||
};
|
||||
|
||||
struct RaidAdd_Struct {
|
||||
/*000*/ uint32 action; //=0
|
||||
/*004*/ char player_name[64]; //should both be the player's name
|
||||
@@ -3726,7 +3789,7 @@ struct ItemSerializationHeader
|
||||
uint32 slot;
|
||||
uint32 price;
|
||||
uint32 merchant_slot; //1 if not a merchant item
|
||||
uint32 unknown020; //0
|
||||
uint32 scaled_value; //0
|
||||
uint32 instance_id; //unique instance id if not merchant item, else is merchant slot
|
||||
uint32 unknown028; //0
|
||||
uint32 last_cast_time; // Unix Time from PP of last cast for this recast type if recast delay > 0
|
||||
@@ -3964,9 +4027,9 @@ struct ItemQuaternaryBodyStruct
|
||||
struct AugmentInfo_Struct
|
||||
{
|
||||
/*000*/ uint32 itemid; // id of the solvent needed
|
||||
/*004*/ uint8 window; // window to display the information in
|
||||
/*005*/ uint8 unknown005[71]; // total packet length 76, all the rest were always 00
|
||||
/*076*/
|
||||
/*004*/ uint32 window; // window to display the information in
|
||||
/*008*/ char augment_info[64]; // total packet length 76, all the rest were always 00
|
||||
/*072*/ uint32 unknown072;
|
||||
};
|
||||
|
||||
struct VeteranRewardItem
|
||||
|
||||
@@ -1661,7 +1661,7 @@ namespace Titanium
|
||||
int16 slot_id = ServerToTitaniumSlot(slot_id_in);
|
||||
uint32 merchant_slot = inst->GetMerchantSlot();
|
||||
int16 charges = inst->GetCharges();
|
||||
const Item_Struct *item = inst->GetItem();
|
||||
const Item_Struct *item = inst->GetUnscaledItem();
|
||||
int i;
|
||||
uint32 sub_length;
|
||||
|
||||
@@ -1673,7 +1673,7 @@ namespace Titanium
|
||||
(merchant_slot == 0) ? slot_id_in : merchant_slot,
|
||||
inst->GetPrice(),
|
||||
(merchant_slot == 0) ? 1 : inst->GetMerchantCount(),
|
||||
0,
|
||||
inst->IsScaling() ? inst->GetExp() / 100 : 0,
|
||||
//merchant_slot, //instance ID, bullshit for now
|
||||
(merchant_slot == 0) ? inst->GetSerialNumber() : merchant_slot,
|
||||
0, // item recast timer timestamp field (aka..last_cast_time field in SoF+ clients)
|
||||
|
||||
@@ -106,7 +106,7 @@ namespace Titanium {
|
||||
static const uint16 MAP_TRADE_SIZE = 8;
|
||||
static const uint16 MAP_WORLD_SIZE = 10;
|
||||
static const uint16 MAP_LIMBO_SIZE = 36;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 5; // 5 until verified otherwise
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 0; //?
|
||||
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||
@@ -157,7 +157,6 @@ namespace Titanium {
|
||||
static const int16 TRADE_BEGIN = 3000;
|
||||
static const int16 TRADE_END = 3007;
|
||||
static const int16 TRADE_NPC_END = 3003;
|
||||
static const int16 TRADE_NPC_SIZE = 4;
|
||||
static const int16 TRADE_BAGS_BEGIN = 3031;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = 79;
|
||||
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
|
||||
@@ -171,11 +170,6 @@ namespace Titanium {
|
||||
static const int16 CORPSE_BEGIN = slots::MainGeneral1;
|
||||
static const int16 CORPSE_END = slots::MainGeneral1 + slots::MainCursor;
|
||||
|
||||
static const int16 MATERIAL_BEGIN = MaterialHead;
|
||||
static const int16 MATERIAL_END = MaterialSecondary;
|
||||
static const int16 MATERIAL_TINT_END = MaterialFeet;
|
||||
static const int16 MATERIAL_SIZE = _MaterialCount;
|
||||
|
||||
static const uint16 ITEM_COMMON_SIZE = 5;
|
||||
static const uint16 ITEM_CONTAINER_SIZE = 10;
|
||||
|
||||
|
||||
@@ -485,8 +485,8 @@ struct GMTrainee_Struct
|
||||
{
|
||||
/*000*/ uint32 npcid;
|
||||
/*004*/ uint32 playerid;
|
||||
/*008*/ uint32 skills[73];
|
||||
/*300*/ uint8 unknown300[148];
|
||||
/*008*/ uint32 skills[PACKET_SKILL_ARRAY_SIZE];
|
||||
/*408*/ uint8 unknown408[40];
|
||||
/*448*/
|
||||
};
|
||||
|
||||
@@ -619,14 +619,62 @@ struct PotionBelt_Struct {
|
||||
static const uint32 MAX_GROUP_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_RAID_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_LEADERSHIP_AA_ARRAY = (MAX_GROUP_LEADERSHIP_AA_ARRAY+MAX_RAID_LEADERSHIP_AA_ARRAY);
|
||||
struct LeadershipAA_Struct {
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
struct GroupLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 groupAAMarkNPC;
|
||||
uint32 groupAANPCHealth;
|
||||
uint32 groupAADelegateMainAssist;
|
||||
uint32 groupAADelegateMarkNPC;
|
||||
uint32 groupAA4;
|
||||
uint32 groupAA5;
|
||||
uint32 groupAAInspectBuffs;
|
||||
uint32 groupAA7;
|
||||
uint32 groupAASpellAwareness;
|
||||
uint32 groupAAOffenseEnhancement;
|
||||
uint32 groupAAManaEnhancement;
|
||||
uint32 groupAAHealthEnhancement;
|
||||
uint32 groupAAHealthRegeneration;
|
||||
uint32 groupAAFindPathToPC;
|
||||
uint32 groupAAHealthOfTargetsTarget;
|
||||
uint32 groupAA15;
|
||||
};
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct RaidLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 raidAAMarkNPC;
|
||||
uint32 raidAANPCHealth;
|
||||
uint32 raidAADelegateMainAssist;
|
||||
uint32 raidAADelegateMarkNPC;
|
||||
uint32 raidAA4;
|
||||
uint32 raidAA5;
|
||||
uint32 raidAA6;
|
||||
uint32 raidAASpellAwareness;
|
||||
uint32 raidAAOffenseEnhancement;
|
||||
uint32 raidAAManaEnhancement;
|
||||
uint32 raidAAHealthEnhancement;
|
||||
uint32 raidAAHealthRegeneration;
|
||||
uint32 raidAAFindPathToPC;
|
||||
uint32 raidAAHealthOfTargetsTarget;
|
||||
uint32 raidAA14;
|
||||
uint32 raidAA15;
|
||||
};
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
GroupLeadershipAA_Struct group;
|
||||
RaidLeadershipAA_Struct raid;
|
||||
};
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -652,7 +700,7 @@ struct BindStruct {
|
||||
static const uint32 MAX_PP_LANGUAGE = 28;
|
||||
static const uint32 MAX_PP_SPELLBOOK = 400;
|
||||
static const uint32 MAX_PP_MEMSPELL = 9;
|
||||
static const uint32 MAX_PP_SKILL = _SkillPacketArraySize; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_AA_ARRAY = 240;
|
||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||
static const uint32 MAX_RECAST_TYPES = 20;
|
||||
|
||||
+130
-15
@@ -226,6 +226,18 @@ namespace Underfoot
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_AugmentInfo)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(AugmentInfo_Struct);
|
||||
SETUP_DIRECT_ENCODE(AugmentInfo_Struct, structs::AugmentInfo_Struct);
|
||||
|
||||
OUT(itemid);
|
||||
OUT(window);
|
||||
strn0cpy(eq->augment_info, emu->augment_info, 64);
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_Barter)
|
||||
{
|
||||
EQApplicationPacket *in = *p;
|
||||
@@ -1125,6 +1137,20 @@ namespace Underfoot
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_InspectBuffs)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(InspectBuffs_Struct);
|
||||
SETUP_DIRECT_ENCODE(InspectBuffs_Struct, structs::InspectBuffs_Struct);
|
||||
|
||||
// we go over the internal 25 instead of the packet's since no entry is 0, which it will be already
|
||||
for (int i = 0; i < BUFF_COUNT; i++) {
|
||||
OUT(spell_id[i]);
|
||||
OUT(tics_remaining[i]);
|
||||
}
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_InspectRequest)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(Inspect_Struct);
|
||||
@@ -1929,6 +1955,29 @@ namespace Underfoot
|
||||
add_member->flags[4] = in_add_member->flags[4];
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else if (raid_gen->action == 35)
|
||||
{
|
||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) + strlen(inmotd->motd) + 1);
|
||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
||||
|
||||
outmotd->general.action = inmotd->general.action;
|
||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
||||
{
|
||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
||||
|
||||
outlaa->action = inlaa->action;
|
||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
||||
dest->FastQueuePacket(&outapp);
|
||||
}
|
||||
else
|
||||
{
|
||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
||||
@@ -2957,6 +3006,11 @@ namespace Underfoot
|
||||
IN(spell_id);
|
||||
emu->inventoryslot = UnderfootToServerSlot(eq->inventoryslot);
|
||||
IN(target_id);
|
||||
IN(cs_unknown1);
|
||||
IN(cs_unknown2);
|
||||
IN(y_pos);
|
||||
IN(x_pos);
|
||||
IN(z_pos);
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
@@ -3367,15 +3421,41 @@ namespace Underfoot
|
||||
|
||||
DECODE(OP_RaidInvite)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||
|
||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
||||
IN(action);
|
||||
IN(parameter);
|
||||
// This is a switch on the RaidGeneral action
|
||||
switch (*(uint32 *)__packet->pBuffer) {
|
||||
case 35: { // raidMOTD
|
||||
// we don't have a nice macro for this
|
||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
||||
__eq_buffer->motd[1023] = '\0';
|
||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
||||
__packet->pBuffer = new unsigned char[__packet->size];
|
||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
||||
IN(general.action);
|
||||
IN(general.parameter);
|
||||
FINISH_DIRECT_DECODE();
|
||||
break;
|
||||
}
|
||||
case 36: { // raidPlayerNote unhandled
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
||||
IN(action);
|
||||
IN(parameter);
|
||||
FINISH_DIRECT_DECODE();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
|
||||
DECODE(OP_ReadBook)
|
||||
@@ -3531,6 +3611,7 @@ namespace Underfoot
|
||||
|
||||
char* SerializeItem(const ItemInst *inst, int16 slot_id_in, uint32 *length, uint8 depth)
|
||||
{
|
||||
int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType);
|
||||
uint8 null_term = 0;
|
||||
bool stackable = inst->IsStackable();
|
||||
uint32 merchant_slot = inst->GetMerchantSlot();
|
||||
@@ -3540,7 +3621,7 @@ namespace Underfoot
|
||||
|
||||
std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary);
|
||||
|
||||
const Item_Struct *item = inst->GetItem();
|
||||
const Item_Struct *item = inst->GetUnscaledItem();
|
||||
//_log(NET__ERROR, "Serialize called for: %s", item->Name);
|
||||
Underfoot::structs::ItemSerializationHeader hdr;
|
||||
hdr.stacksize = stackable ? charges : 1;
|
||||
@@ -3551,7 +3632,7 @@ namespace Underfoot
|
||||
hdr.slot = (merchant_slot == 0) ? slot_id : merchant_slot;
|
||||
hdr.price = inst->GetPrice();
|
||||
hdr.merchant_slot = (merchant_slot == 0) ? 1 : inst->GetMerchantCount();
|
||||
hdr.unknown020 = 0;
|
||||
hdr.scaled_value = inst->IsScaling() ? inst->GetExp() / 100 : 0;
|
||||
hdr.instance_id = (merchant_slot == 0) ? inst->GetSerialNumber() : merchant_slot;
|
||||
hdr.unknown028 = 0;
|
||||
hdr.last_cast_time = ((item->RecastDelay > 1) ? 1212693140 : 0);
|
||||
@@ -3560,14 +3641,47 @@ namespace Underfoot
|
||||
hdr.unknown044 = 0;
|
||||
hdr.unknown048 = 0;
|
||||
hdr.unknown052 = 0;
|
||||
hdr.unknown056 = 0;
|
||||
hdr.unknown060 = 0;
|
||||
hdr.unknown061 = 0;
|
||||
hdr.unknown062 = 0;
|
||||
hdr.ItemClass = item->ItemClass;
|
||||
|
||||
hdr.isEvolving = item->EvolvingLevel > 0 ? 1 : 0;
|
||||
ss.write((const char*)&hdr, sizeof(Underfoot::structs::ItemSerializationHeader));
|
||||
|
||||
if (item->EvolvingLevel > 0) {
|
||||
Underfoot::structs::EvolvingItem evotop;
|
||||
evotop.unknown001 = 0;
|
||||
evotop.unknown002 = 0;
|
||||
evotop.unknown003 = 0;
|
||||
evotop.unknown004 = 0;
|
||||
evotop.evoLevel = item->EvolvingLevel;
|
||||
evotop.progress = 95.512;
|
||||
evotop.Activated = 1;
|
||||
evotop.evomaxlevel = 7;
|
||||
ss.write((const char*)&evotop, sizeof(Underfoot::structs::EvolvingItem));
|
||||
}
|
||||
//ORNAMENT IDFILE / ICON -
|
||||
uint16 ornaIcon = 0;
|
||||
if (inst->GetOrnamentationAug(ornamentationAugtype)) {
|
||||
const Item_Struct *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem();
|
||||
ss.write(aug_weap->IDFile, strlen(aug_weap->IDFile));
|
||||
ss.write((const char*)&null_term, sizeof(uint8));
|
||||
ornaIcon = aug_weap->Icon;
|
||||
}
|
||||
else if (inst->GetOrnamentationIDFile() && inst->GetOrnamentationIcon()) {
|
||||
char tmp[30]; memset(tmp, 0x0, 30); sprintf(tmp, "IT%d", inst->GetOrnamentationIDFile());
|
||||
ss.write(tmp, strlen(tmp));
|
||||
ss.write((const char*)&null_term, sizeof(uint8));
|
||||
ornaIcon = inst->GetOrnamentationIcon();
|
||||
}
|
||||
else {
|
||||
ss.write((const char*)&null_term, sizeof(uint8)); //no idfile
|
||||
}
|
||||
|
||||
Underfoot::structs::ItemSerializationHeaderFinish hdrf;
|
||||
hdrf.ornamentIcon = ornaIcon;
|
||||
hdrf.unknown060 = 0; //This is Always 0.. or it breaks shit..
|
||||
hdrf.unknown061 = 0; //possibly ornament / special ornament
|
||||
hdrf.isCopied = 0; //Flag for item to be 'Copied'
|
||||
hdrf.ItemClass = item->ItemClass;
|
||||
ss.write((const char*)&hdrf, sizeof(Underfoot::structs::ItemSerializationHeaderFinish));
|
||||
|
||||
if (strlen(item->Name) > 0)
|
||||
{
|
||||
ss.write(item->Name, strlen(item->Name));
|
||||
@@ -3674,6 +3788,7 @@ namespace Underfoot
|
||||
ibs.SpellShield = item->SpellShield;
|
||||
ibs.Avoidance = item->Avoidance;
|
||||
ibs.Accuracy = item->Accuracy;
|
||||
ibs.CharmFileID = item->CharmFileID;
|
||||
ibs.FactionAmt1 = item->FactionAmt1;
|
||||
ibs.FactionMod1 = item->FactionMod1;
|
||||
ibs.FactionAmt2 = item->FactionAmt2;
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace Underfoot {
|
||||
static const uint16 MAP_TRADE_SIZE = 8;
|
||||
static const uint16 MAP_WORLD_SIZE = 10;
|
||||
static const uint16 MAP_LIMBO_SIZE = 36;
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 5; // 5 until verified otherwise
|
||||
static const uint16 MAP_TRIBUTE_SIZE = 0; //?
|
||||
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
|
||||
static const uint16 MAP_MERCHANT_SIZE = 0;
|
||||
@@ -158,7 +158,6 @@ namespace Underfoot {
|
||||
static const int16 TRADE_BEGIN = 3000;
|
||||
static const int16 TRADE_END = 3007;
|
||||
static const int16 TRADE_NPC_END = 3003;
|
||||
static const int16 TRADE_NPC_SIZE = 4;
|
||||
static const int16 TRADE_BAGS_BEGIN = 3031;
|
||||
static const int16 TRADE_BAGS_END_OFFSET = 79;
|
||||
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
|
||||
@@ -172,11 +171,6 @@ namespace Underfoot {
|
||||
static const int16 CORPSE_BEGIN = slots::MainGeneral1;
|
||||
static const int16 CORPSE_END = slots::MainGeneral1 + slots::MainCursor;
|
||||
|
||||
static const int16 MATERIAL_BEGIN = MaterialHead;
|
||||
static const int16 MATERIAL_END = MaterialSecondary;
|
||||
static const int16 MATERIAL_TINT_END = MaterialFeet;
|
||||
static const int16 MATERIAL_SIZE = _MaterialCount;
|
||||
|
||||
static const uint16 ITEM_COMMON_SIZE = 5;
|
||||
static const uint16 ITEM_CONTAINER_SIZE = 10;
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ E(OP_AdventureMerchantSell)
|
||||
E(OP_AltCurrency)
|
||||
E(OP_AltCurrencySell)
|
||||
E(OP_ApplyPoison)
|
||||
E(OP_AugmentInfo)
|
||||
E(OP_Barter)
|
||||
E(OP_BazaarSearch)
|
||||
E(OP_Buff)
|
||||
@@ -34,6 +35,7 @@ E(OP_GroupUpdate)
|
||||
E(OP_GuildMemberList)
|
||||
E(OP_GuildsList)
|
||||
E(OP_Illusion)
|
||||
E(OP_InspectBuffs)
|
||||
E(OP_InspectRequest)
|
||||
E(OP_ItemLinkResponse)
|
||||
E(OP_ItemPacket)
|
||||
|
||||
@@ -519,7 +519,11 @@ struct CastSpell_Struct
|
||||
uint32 spell_id;
|
||||
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
||||
uint32 target_id;
|
||||
uint32 cs_unknown[5];
|
||||
uint32 cs_unknown1;
|
||||
uint32 cs_unknown2;
|
||||
float y_pos;
|
||||
float x_pos;
|
||||
float z_pos;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -619,8 +623,8 @@ struct GMTrainee_Struct
|
||||
{
|
||||
/*000*/ uint32 npcid;
|
||||
/*004*/ uint32 playerid;
|
||||
/*008*/ uint32 skills[73];
|
||||
/*300*/ uint8 unknown300[148];
|
||||
/*008*/ uint32 skills[PACKET_SKILL_ARRAY_SIZE];
|
||||
/*408*/ uint8 unknown408[40];
|
||||
/*448*/
|
||||
};
|
||||
|
||||
@@ -754,14 +758,62 @@ struct PotionBelt_Struct {
|
||||
static const uint32 MAX_GROUP_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_RAID_LEADERSHIP_AA_ARRAY = 16;
|
||||
static const uint32 MAX_LEADERSHIP_AA_ARRAY = (MAX_GROUP_LEADERSHIP_AA_ARRAY+MAX_RAID_LEADERSHIP_AA_ARRAY);
|
||||
struct LeadershipAA_Struct {
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
struct GroupLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 groupAAMarkNPC;
|
||||
uint32 groupAANPCHealth;
|
||||
uint32 groupAADelegateMainAssist;
|
||||
uint32 groupAADelegateMarkNPC;
|
||||
uint32 groupAA4;
|
||||
uint32 groupAA5;
|
||||
uint32 groupAAInspectBuffs;
|
||||
uint32 groupAA7;
|
||||
uint32 groupAASpellAwareness;
|
||||
uint32 groupAAOffenseEnhancement;
|
||||
uint32 groupAAManaEnhancement;
|
||||
uint32 groupAAHealthEnhancement;
|
||||
uint32 groupAAHealthRegeneration;
|
||||
uint32 groupAAFindPathToPC;
|
||||
uint32 groupAAHealthOfTargetsTarget;
|
||||
uint32 groupAA15;
|
||||
};
|
||||
uint32 ranks[MAX_GROUP_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct RaidLeadershipAA_Struct {
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
union {
|
||||
struct {
|
||||
uint32 raidAAMarkNPC;
|
||||
uint32 raidAANPCHealth;
|
||||
uint32 raidAADelegateMainAssist;
|
||||
uint32 raidAADelegateMarkNPC;
|
||||
uint32 raidAA4;
|
||||
uint32 raidAA5;
|
||||
uint32 raidAA6;
|
||||
uint32 raidAASpellAwareness;
|
||||
uint32 raidAAOffenseEnhancement;
|
||||
uint32 raidAAManaEnhancement;
|
||||
uint32 raidAAHealthEnhancement;
|
||||
uint32 raidAAHealthRegeneration;
|
||||
uint32 raidAAFindPathToPC;
|
||||
uint32 raidAAHealthOfTargetsTarget;
|
||||
uint32 raidAA14;
|
||||
uint32 raidAA15;
|
||||
};
|
||||
uint32 ranks[MAX_RAID_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
struct LeadershipAA_Struct {
|
||||
union {
|
||||
struct {
|
||||
GroupLeadershipAA_Struct group;
|
||||
RaidLeadershipAA_Struct raid;
|
||||
};
|
||||
uint32 ranks[MAX_LEADERSHIP_AA_ARRAY];
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -787,7 +839,7 @@ struct BindStruct {
|
||||
static const uint32 MAX_PP_LANGUAGE = 25; //
|
||||
static const uint32 MAX_PP_SPELLBOOK = 720; // Confirmed 60 pages on Underfoot now
|
||||
static const uint32 MAX_PP_MEMSPELL = 10; //was 9 now 10 on Underfoot
|
||||
static const uint32 MAX_PP_SKILL = _SkillPacketArraySize; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||
static const uint32 MAX_RECAST_TYPES = 20;
|
||||
@@ -2118,6 +2170,14 @@ struct GroupFollow_Struct { // Underfoot Follow Struct
|
||||
/*0152*/
|
||||
};
|
||||
|
||||
struct InspectBuffs_Struct {
|
||||
/*000*/ uint32 spell_id[BUFF_COUNT];
|
||||
/*100*/ uint32 filler100[5]; // BUFF_COUNT is really 30...
|
||||
/*120*/ uint32 tics_remaining[BUFF_COUNT];
|
||||
/*220*/ uint32 filler220[5]; // BUFF_COUNT is really 30...
|
||||
};
|
||||
|
||||
|
||||
struct LFG_Struct {
|
||||
/*000*/ uint32 unknown000;
|
||||
/*004*/ uint32 value; // 0x00 = off 0x01 = on
|
||||
@@ -3623,6 +3683,21 @@ struct RaidAddMember_Struct {
|
||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||
};
|
||||
|
||||
struct RaidMOTD_Struct {
|
||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
||||
};
|
||||
|
||||
struct RaidLeadershipUpdate_Struct {
|
||||
/*000*/ uint32 action;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ uint32 Unknown068;
|
||||
/*072*/ char leader_name[64];
|
||||
/*136*/ GroupLeadershipAA_Struct group; //unneeded
|
||||
/*200*/ RaidLeadershipAA_Struct raid;
|
||||
/*264*/ char Unknown264[128];
|
||||
};
|
||||
|
||||
struct RaidAdd_Struct {
|
||||
/*000*/ uint32 action; //=0
|
||||
/*004*/ char player_name[64]; //should both be the player's name
|
||||
@@ -3930,25 +4005,42 @@ struct ItemVerifyReply_Struct {
|
||||
|
||||
struct ItemSerializationHeader
|
||||
{
|
||||
/*000*/ uint32 stacksize;
|
||||
/*004*/ uint32 unknown004;
|
||||
/*008*/ uint32 slot;
|
||||
/*012*/ uint32 price;
|
||||
/*016*/ uint32 merchant_slot; //1 if not a merchant item
|
||||
/*020*/ uint32 unknown020; //0
|
||||
/*024*/ uint32 instance_id; //unique instance id if not merchant item, else is merchant slot
|
||||
/*028*/ uint32 unknown028; //0
|
||||
/*032*/ uint32 last_cast_time; // Unix Time from PP of last cast for this recast type if recast delay > 0
|
||||
/*036*/ uint32 charges; //Total Charges an item has (-1 for unlimited)
|
||||
/*040*/ uint32 inst_nodrop; // 1 if the item is no drop (attuned items)
|
||||
/*044*/ uint32 unknown044; //0
|
||||
/*048*/ uint32 unknown048; //0
|
||||
/*052*/ uint32 unknown052; //0
|
||||
/*056*/ uint32 unknown056; //0
|
||||
/*060*/ uint8 unknown060; //0
|
||||
/*061*/ uint8 unknown061; //0 - Add Evolving Item struct if this isn't set to 0?
|
||||
/*062*/ uint8 unknown062; // New to Underfoot
|
||||
/*063*/ uint8 ItemClass; //0, 1, or 2
|
||||
/*000*/ uint32 stacksize;
|
||||
/*004*/ uint32 unknown004;
|
||||
/*008*/ uint32 slot;
|
||||
/*012*/ uint32 price;
|
||||
/*016*/ uint32 merchant_slot; //1 if not a merchant item
|
||||
/*020*/ uint32 scaled_value; //0
|
||||
/*024*/ uint32 instance_id; //unique instance id if not merchant item, else is merchant slot
|
||||
/*028*/ uint32 unknown028; //0
|
||||
/*032*/ uint32 last_cast_time; // Unix Time from PP of last cast for this recast type if recast delay > 0
|
||||
/*036*/ uint32 charges; //Total Charges an item has (-1 for unlimited)
|
||||
/*040*/ uint32 inst_nodrop; // 1 if the item is no drop (attuned items)
|
||||
/*044*/ uint32 unknown044; //0
|
||||
/*048*/ uint32 unknown048; //0
|
||||
/*052*/ uint32 unknown052; //0
|
||||
/*056*/ uint8 isEvolving; //0 // If 1 Add evolving item data in between Header and HeaderFinish
|
||||
};
|
||||
|
||||
struct EvolvingItem {
|
||||
uint8 unknown001;
|
||||
uint8 unknown002;
|
||||
uint8 unknown003;
|
||||
uint8 unknown004;
|
||||
int32 evoLevel;
|
||||
double progress;
|
||||
uint8 Activated;
|
||||
int32 evomaxlevel;
|
||||
uint8 unknown02[4];
|
||||
};
|
||||
|
||||
struct ItemSerializationHeaderFinish
|
||||
{
|
||||
uint16 ornamentIcon;
|
||||
/*060*/ uint8 unknown060; //0
|
||||
/*061*/ uint8 unknown061; //0 -
|
||||
/*062*/ uint8 isCopied; // New to Underfoot // Copied flag on item
|
||||
/*063*/ uint8 ItemClass; //0, 1, or 2
|
||||
};
|
||||
|
||||
struct ItemBodyStruct
|
||||
@@ -4180,9 +4272,9 @@ struct ItemQuaternaryBodyStruct
|
||||
struct AugmentInfo_Struct
|
||||
{
|
||||
/*000*/ uint32 itemid; // id of the solvent needed
|
||||
/*004*/ uint8 window; // window to display the information in
|
||||
/*005*/ uint8 unknown005[71]; // total packet length 76, all the rest were always 00
|
||||
/*076*/
|
||||
/*004*/ uint32 window; // window to display the information in
|
||||
/*008*/ char augment_info[64]; // total packet length 76, all the rest were always 00
|
||||
/*072*/ uint32 unknown072;
|
||||
};
|
||||
|
||||
struct VeteranRewardItem
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
/* EQEMu: Everquest Server Emulator
|
||||
Copyright (C) 2001-2014 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 __random_h__
|
||||
#define __random_h__
|
||||
|
||||
#include <random>
|
||||
#include <utility>
|
||||
|
||||
/* This uses mt19937 seeded with the std::random_device
|
||||
* The idea is to have this be included as a member of another class
|
||||
* so mocking out for testing is easier
|
||||
* If you need to reseed random.Reseed()
|
||||
* Eventually this should be derived from an abstract base class
|
||||
*/
|
||||
|
||||
namespace EQEmu {
|
||||
class Random {
|
||||
public:
|
||||
// AKA old MakeRandomInt
|
||||
const int Int(int low, int high)
|
||||
{
|
||||
if (low > high)
|
||||
std::swap(low, high);
|
||||
return std::uniform_int_distribution<int>(low, high)(m_gen); // [low, high]
|
||||
}
|
||||
|
||||
// AKA old MakeRandomFloat
|
||||
const double Real(double low, double high)
|
||||
{
|
||||
if (low > high)
|
||||
std::swap(low, high);
|
||||
return std::uniform_real_distribution<double>(low, high)(m_gen); // [low, high)
|
||||
}
|
||||
|
||||
// example Roll(50) would have a 50% success rate
|
||||
// Roll(100) 100%, etc
|
||||
// valid values 0-100 (well, higher works too but ...)
|
||||
const bool Roll(const int required)
|
||||
{
|
||||
return Int(0, 99) < required;
|
||||
}
|
||||
|
||||
// valid values 0.0 - 1.0
|
||||
const bool Roll(const double required)
|
||||
{
|
||||
return Real(0.0, 1.0) <= required;
|
||||
}
|
||||
|
||||
void Reseed()
|
||||
{
|
||||
// We could do the seed_seq thing here too if we need better seeding
|
||||
// but that is mostly overkill for us, so just seed once
|
||||
std::random_device rd;
|
||||
m_gen.seed(rd());
|
||||
}
|
||||
|
||||
Random()
|
||||
{
|
||||
Reseed();
|
||||
}
|
||||
|
||||
private:
|
||||
std::mt19937 m_gen;
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* !__random_h__ */
|
||||
|
||||
+10
-4
@@ -100,6 +100,7 @@ RULE_BOOL ( Character, KeepLevelOverMax, false) // Don't delevel a character tha
|
||||
RULE_INT ( Character, FoodLossPerUpdate, 35) // How much food/water you lose per stamina update
|
||||
RULE_INT ( Character, BaseInstrumentSoftCap, 36) // Softcap for instrument mods, 36 commonly referred to as "3.6" as well.
|
||||
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_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY( Mercs )
|
||||
@@ -123,7 +124,6 @@ RULE_INT ( Guild, PlayerCreationLimit, 1) // Only allow use of the UF+ window i
|
||||
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_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY( Skills )
|
||||
@@ -247,7 +247,6 @@ RULE_INT ( Pathing, CullNodesFromStart, 1) // Checks LOS from Start point to se
|
||||
RULE_INT ( Pathing, CullNodesFromEnd, 1) // Checks LOS from End point to second to last node for this many nodes and removes last node if there is LOS
|
||||
RULE_REAL ( Pathing, CandidateNodeRangeXY, 400) // When searching for path start/end nodes, only nodes within this range will be considered.
|
||||
RULE_REAL ( Pathing, CandidateNodeRangeZ, 10) // When searching for path start/end nodes, only nodes within this range will be considered.
|
||||
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY( Watermap )
|
||||
@@ -325,7 +324,7 @@ RULE_INT ( Spells, AI_IdleNoSpellMaxRecast, 2000) // AI spell recast time(MS) ch
|
||||
RULE_INT ( Spells, AI_IdleBeneficialChance, 100) // Chance while idle to do a beneficial spell on self or others.
|
||||
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_BOOL ( Spells, SwarmPetTargetLock, false) // Use old method of swarm pets target locking till target dies then despawning.
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY( Combat )
|
||||
@@ -420,6 +419,7 @@ RULE_INT ( Combat, ArcheryBonusChance, 50)
|
||||
RULE_INT ( Combat, BerserkerFrenzyStart, 35)
|
||||
RULE_INT ( Combat, BerserkerFrenzyEnd, 45)
|
||||
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_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY( NPC )
|
||||
@@ -438,6 +438,7 @@ 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_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_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY ( Aggro )
|
||||
@@ -505,7 +506,6 @@ RULE_INT ( Merchant, PricePenaltyPct, 4) // Determines maximum price penalty fro
|
||||
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_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY ( Bazaar )
|
||||
@@ -587,6 +587,12 @@ RULE_CATEGORY( Inventory )
|
||||
RULE_BOOL ( Inventory, EnforceAugmentRestriction, true) // Forces augment slot restrictions
|
||||
RULE_BOOL ( Inventory, EnforceAugmentUsability, true) // Forces augmented item usability
|
||||
RULE_BOOL ( Inventory, EnforceAugmentWear, true) // Forces augment wear slot validation
|
||||
RULE_BOOL ( Inventory, DeleteTransformationMold, true) //False if you want mold to last forever
|
||||
RULE_BOOL ( Inventory, AllowAnyWeaponTransformation, false) //Weapons can use any weapon transformation
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY( Client )
|
||||
RULE_BOOL( Client, UseLiveFactionMessage, false) // Allows players to see faction adjustments like Live
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
#undef RULE_CATEGORY
|
||||
|
||||
@@ -104,6 +104,7 @@
|
||||
#define ServerOP_GroupFollow 0x0110
|
||||
#define ServerOP_GroupFollowAck 0x0111
|
||||
#define ServerOP_GroupCancelInvite 0x0112
|
||||
#define ServerOP_RaidMOTD 0x0113
|
||||
|
||||
#define ServerOP_InstanceUpdateTime 0x014F
|
||||
#define ServerOP_AdventureRequest 0x0150
|
||||
@@ -854,6 +855,11 @@ struct ServerRaidMessage_Struct {
|
||||
char message[0];
|
||||
};
|
||||
|
||||
struct ServerRaidMOTD_Struct {
|
||||
uint32 rid;
|
||||
char motd[0];
|
||||
};
|
||||
|
||||
struct ServerLFGMatchesRequest_Struct {
|
||||
uint32 FromID;
|
||||
uint8 QuerierLevel;
|
||||
|
||||
+1195
-1284
File diff suppressed because it is too large
Load Diff
+4
-1
@@ -41,7 +41,6 @@ public:
|
||||
uint8 GetGMSpeed(uint32 account_id);
|
||||
bool SetHideMe(uint32 account_id, uint8 hideme);
|
||||
int32 DeleteStalePlayerCorpses();
|
||||
int32 DeleteStalePlayerBackups();
|
||||
void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message);
|
||||
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message);
|
||||
void GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message);
|
||||
@@ -54,6 +53,10 @@ public:
|
||||
*/
|
||||
bool SaveCursor(uint32 char_id, std::list<ItemInst*>::const_iterator &start, std::list<ItemInst*>::const_iterator &end);
|
||||
bool SaveInventory(uint32 char_id, const ItemInst* 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 ItemInst* inst, int16 slot_id);
|
||||
bool UpdateSharedBankSlot(uint32 char_id, const ItemInst* inst, int16 slot_id);
|
||||
bool VerifyInventory(uint32 account_id, int16 slot_id, const ItemInst* inst);
|
||||
bool GetSharedBank(uint32 id, Inventory* inv, bool is_charid);
|
||||
int32 GetSharedPlatinum(uint32 account_id);
|
||||
|
||||
+7
-3
@@ -30,7 +30,7 @@
|
||||
**
|
||||
** (ref: eqstr_us.txt [05-10-2013])
|
||||
*/
|
||||
enum SkillUseTypes : uint32
|
||||
enum SkillUseTypes
|
||||
{
|
||||
/*13855*/ Skill1HBlunt = 0,
|
||||
/*13856*/ Skill1HSlashing,
|
||||
@@ -108,6 +108,7 @@ enum SkillUseTypes : uint32
|
||||
/*13869*/ SkillBerserking,
|
||||
/*13902*/ SkillTaunt,
|
||||
/*05837*/ SkillFrenzy, // This appears to be the only listed one not grouped with the others
|
||||
/*00000*/ _EmuSkillCount // move to last position of active enumeration labels
|
||||
|
||||
// SoF+ specific skills
|
||||
// /*03670*/ SkillRemoveTraps,
|
||||
@@ -124,7 +125,6 @@ enum SkillUseTypes : uint32
|
||||
|
||||
// Support values
|
||||
// /*-----*/ _SkillServerArraySize = _SkillCount_RoF2, // Should reflect last client '_SkillCount'
|
||||
/*-----*/ _SkillPacketArraySize = 100, // Currently supported clients appear to iterate full 100 dword buffer range
|
||||
|
||||
// Superfluous additions to SkillUseTypes..server-use only
|
||||
// /*-----*/ ExtSkillGenericTradeskill = 100
|
||||
@@ -152,7 +152,7 @@ enum SkillUseTypes : uint32
|
||||
NOTE: Disregard this until it is sorted out
|
||||
|
||||
I changed (tradeskill==75) to ExtSkillGenericTradeskill in tradeskills.cpp for both instances. If it's a pseudo-enumeration of
|
||||
an AA ability, then use the 'ExtSkill' ('ExtentedSkill') prefix with a value >= 100. (current implementation)
|
||||
an AA ability, then use the 'ExtSkill' ('ExtendedSkill') prefix with a value >= 100. (current implementation)
|
||||
|
||||
We probably need to recode ALL of the skill checks to use the new Skill2HPiercing and ensure that the animation value is
|
||||
properly changed in the patch files. As far as earlier clients using this new skill, it can be done, but we just need to ensure
|
||||
@@ -163,6 +163,7 @@ enum SkillUseTypes : uint32
|
||||
|
||||
In addition to the above re-coding, we're probably going to need to rework the database pp blob to reserve space for the current
|
||||
100-dword buffer allocation. This way, we can just add new ones without having to rework it each time.
|
||||
(Wasn't done for this in particular..but, thanks Akkadius!)
|
||||
|
||||
-U
|
||||
*/
|
||||
@@ -171,6 +172,9 @@ enum SkillUseTypes : uint32
|
||||
// temporary until it can be sorted out...
|
||||
#define HIGHEST_SKILL SkillFrenzy
|
||||
|
||||
// server profile does not reflect this yet..so, prefixed with 'PACKET_'
|
||||
#define PACKET_SKILL_ARRAY_SIZE 100
|
||||
|
||||
// TODO: add string return for skill names
|
||||
|
||||
/*
|
||||
|
||||
+18
-7
@@ -119,7 +119,7 @@ typedef enum {
|
||||
/* 29 */ // NOT USED
|
||||
/* 30 */ // NOT USED
|
||||
/* 31 */ // NOT USED
|
||||
/* 32 */ ST_AECaster2 = 0x20, //ae caster hatelist maybe?
|
||||
/* 32 */ ST_AETargetHateList = 0x20,
|
||||
/* 33 */ ST_HateList = 0x21,
|
||||
/* 34 */ ST_LDoNChest_Cursed = 0x22,
|
||||
/* 35 */ ST_Muramite = 0x23, //only works on special muramites
|
||||
@@ -131,10 +131,13 @@ typedef enum {
|
||||
/* 41 */ ST_Group = 0x29,
|
||||
/* 42 */ ST_Directional = 0x2a, //ae around this target between two angles
|
||||
/* 43 */ ST_GroupClientAndPet = 0x2b,
|
||||
/* 44 */ //ST_Beam = 0x2c, //like directional but facing in front of you always
|
||||
/* 45 */ //ST_Ring = 0x2d, // Like a mix of PB ae + rain spell(has ae duration)
|
||||
/* 44 */ ST_Beam = 0x2c,
|
||||
/* 45 */ ST_Ring = 0x2d,
|
||||
/* 46 */ ST_TargetsTarget = 0x2e, // uses the target of your target
|
||||
/* 47 */ ST_PetMaster = 0x2f, // uses the master as target
|
||||
/* 48 */ // UNKNOWN
|
||||
/* 49 */ // NOT USED
|
||||
/* 50 */ ST_TargetAENoPlayersPets = 0x32,
|
||||
} SpellTargetType;
|
||||
|
||||
typedef enum {
|
||||
@@ -673,7 +676,7 @@ struct SPDat_Spell_Struct
|
||||
/* 122 */ //uint32 TravelType;
|
||||
/* 123 */ uint16 SpellAffectIndex;
|
||||
/* 124 */ int8 disallow_sit; // 124: high-end Yaulp spells (V, VI, VII, VIII [Rk 1, 2, & 3], & Gallenite's Bark of Fury
|
||||
/* 125 */ // 125: Words of the Skeptic
|
||||
/* 125 */ int8 diety_agnostic;// 125: Words of the Skeptic
|
||||
/* 126 */ int8 deities[16]; // Deity check. 201 - 216 per http://www.eqemulator.net/wiki/wikka.php?wakka=DeityList
|
||||
// -1: Restrict to Deity; 1: Restrict to Deity, but only used on non-Live (Test Server "Blessing of ...") spells; 0: Don't restrict
|
||||
/* 142 */ // 142: between 0 & 100
|
||||
@@ -697,6 +700,7 @@ struct SPDat_Spell_Struct
|
||||
/* 162 */ int bonushate;
|
||||
/* 163 */
|
||||
/* 164 */ // for most spells this appears to mimic ResistDiff
|
||||
/* 165 */ bool ldon_trap; //Flag found on all LDON trap / chest related spells.
|
||||
/* 166 */ int EndurCost;
|
||||
/* 167 */ int8 EndurTimerIndex;
|
||||
/* 168 */ bool IsDisciplineBuff; //Will goto the combat window when cast
|
||||
@@ -709,9 +713,14 @@ struct SPDat_Spell_Struct
|
||||
/* 178 */ int pvpresistcalc;
|
||||
/* 179 */ int pvpresistcap;
|
||||
/* 180 */ int spell_category;
|
||||
/* 181 */
|
||||
/* 181 */ //unknown - likely buff duration related
|
||||
/* 182 */ //unknown - likely buff duration related
|
||||
/* 183 */
|
||||
/* 184 */
|
||||
/* 185 */ int8 can_mgb; // 0=no, -1 or 1 = yes
|
||||
/* 186 */ int dispel_flag;
|
||||
/* 187 */ //int npc_category;
|
||||
/* 188 */ //int npc_usefulness;
|
||||
/* 189 */ int MinResist;
|
||||
/* 190 */ int MaxResist;
|
||||
/* 191 */ uint8 viral_targets;
|
||||
@@ -719,14 +728,16 @@ struct SPDat_Spell_Struct
|
||||
/* 193 */ int NimbusEffect;
|
||||
/* 194 */ float directional_start; //Cone Start Angle:
|
||||
/* 195 */ float directional_end; // Cone End Angle:
|
||||
/* 196 */
|
||||
/* 196 */ bool sneak; // effect can only be used if sneaking (rogue 'Daggerfall' ect)
|
||||
/* 197 */ bool not_extendable;
|
||||
/* 198- 199 */
|
||||
/* 200 */ bool suspendable; // buff is suspended in suspended buff zones
|
||||
/* 201 */ int viral_range;
|
||||
/* 202 */
|
||||
/* 203 */ //int songcap; // individual song cap (how live currently does it, not implemented)
|
||||
/* 204 - 206 */
|
||||
/* 204 */
|
||||
/* 205 */ bool no_block;
|
||||
/* 206 */
|
||||
/* 207 */ int spellgroup;
|
||||
/* 208 */ int rank; //increments AA effects with same name
|
||||
/* 209 */ int powerful_flag; // Need more investigation to figure out what to call this, for now we know -1 makes charm spells not break before their duration is complete, it does alot more though
|
||||
|
||||
@@ -18,9 +18,6 @@
|
||||
#ifndef _WINDOWS
|
||||
#ifndef __UNIX_H__
|
||||
#define __UNIX_H__
|
||||
#ifndef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
|
||||
#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP {0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, __LOCK_INITIALIZER}
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
|
||||
typedef int SOCKET;
|
||||
|
||||
@@ -23,6 +23,14 @@
|
||||
#define EQEMU_PROTOCOL_VERSION "0.3.10"
|
||||
|
||||
#define CURRENT_VERSION "1.0.0"
|
||||
|
||||
/*
|
||||
Everytime a Database SQL is added to Github,
|
||||
increment CURRENT_BINARY_DATABASE_VERSION number and make sure you update the manifest
|
||||
Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
||||
*/
|
||||
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9059
|
||||
#define COMPILE_DATE __DATE__
|
||||
#define COMPILE_TIME __TIME__
|
||||
#ifndef WIN32
|
||||
|
||||
@@ -389,7 +389,7 @@ void Client::GenerateKey()
|
||||
'6', '7', '8', '9'
|
||||
};
|
||||
|
||||
key.append((const char*)&key_selection[MakeRandomInt(0, 35)], 1);
|
||||
key.append((const char*)&key_selection[random.Int(0, 35)], 1);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "../common/opcodemgr.h"
|
||||
#include "../common/eq_stream_type.h"
|
||||
#include "../common/eq_stream_factory.h"
|
||||
#include "../common/random.h"
|
||||
#ifndef WIN32
|
||||
#include "eq_crypto_api.h"
|
||||
#endif
|
||||
@@ -129,6 +130,8 @@ public:
|
||||
* Gets the connection for this client.
|
||||
*/
|
||||
EQStream *GetConnection() { return connection; }
|
||||
|
||||
EQEmu::Random random;
|
||||
private:
|
||||
EQStream *connection;
|
||||
ClientVersion version;
|
||||
|
||||
@@ -21,7 +21,7 @@ SET(lb_sources
|
||||
)
|
||||
|
||||
SET(lb_headers
|
||||
|
||||
|
||||
)
|
||||
|
||||
ADD_LIBRARY(luabind ${lb_sources} ${lb_headers})
|
||||
@@ -29,6 +29,11 @@ ADD_LIBRARY(luabind ${lb_sources} ${lb_headers})
|
||||
|
||||
IF(UNIX)
|
||||
ADD_DEFINITIONS(-fPIC)
|
||||
set_source_files_properties(${lb_sources} PROPERTY COMPILE_FLAGS -Wno-deprecated-declarations)
|
||||
ENDIF(UNIX)
|
||||
|
||||
IF(MSVC)
|
||||
set_source_files_properties(${lb_sources} PROPERTY COMPILE_FLAGS " /W0 " )
|
||||
ENDIF(MSVC)
|
||||
|
||||
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <luabind/config.hpp>
|
||||
#include <luabind/detail/instance_holder.hpp>
|
||||
#include <luabind/detail/ref.hpp>
|
||||
#include <cstdlib>
|
||||
|
||||
namespace luabind { namespace detail
|
||||
{
|
||||
|
||||
+10
-11
@@ -349,17 +349,16 @@ void Database::GeneralQueryReceive(ServerPacket *pack) {
|
||||
/*
|
||||
These are general queries passed from anywhere in zone instead of packing structures and breaking them down again and again
|
||||
*/
|
||||
char *Query = nullptr;
|
||||
Query = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(Query);
|
||||
char errbuf[MYSQL_ERRMSG_SIZE];
|
||||
char* query = 0;
|
||||
uint32 lastid = 0;
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, Query), errbuf, 0, 0, &lastid)) {
|
||||
_log(QUERYSERV__ERROR, "Failed Delete Log Record Insert: %s", errbuf);
|
||||
_log(QUERYSERV__ERROR, "%s", query);
|
||||
char *queryBuffer = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(queryBuffer);
|
||||
|
||||
std::string query(queryBuffer);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
_log(QUERYSERV__ERROR, "Failed Delete Log Record Insert: %s", results.ErrorMessage().c_str());
|
||||
_log(QUERYSERV__ERROR, "%s", query.c_str());
|
||||
}
|
||||
safe_delete_array(query);
|
||||
|
||||
safe_delete(pack);
|
||||
safe_delete(Query);
|
||||
safe_delete(queryBuffer);
|
||||
}
|
||||
|
||||
@@ -94,6 +94,7 @@ OP_ClearBlockedBuffs=0x5d3c
|
||||
OP_WorldObjectsSent=0x7fa8
|
||||
OP_SendExpZonein=0x25ab
|
||||
OP_SendAATable=0x7791
|
||||
OP_ShroudClearAA=0x422e
|
||||
OP_RespondAA=0x379d
|
||||
OP_UpdateAA=0x504f
|
||||
OP_SendAAStats=0x3d1c
|
||||
@@ -289,8 +290,10 @@ OP_LeadershipExpToggle=0x3ea6
|
||||
OP_LeadershipExpUpdate=0x6922
|
||||
OP_PurchaseLeadershipAA=0x1962
|
||||
OP_UpdateLeadershipAA=0x56aa
|
||||
OP_MarkNPC=0x2d9f
|
||||
OP_MarkNPC=0x1a6c
|
||||
OP_MarkRaidNPC=0x2d9f #unimplemented
|
||||
OP_ClearNPCMarks=0x0d2d
|
||||
OP_ClearRaidNPCMarks=0x433a #unimplemented
|
||||
OP_DelegateAbility=0x7820
|
||||
OP_SetGroupTarget=0x118a
|
||||
OP_Charm=0x7118
|
||||
@@ -365,7 +368,7 @@ OP_DzLeaderStatus=0x4021
|
||||
OP_DzExpeditionEndsWarning=0x32eb
|
||||
OP_DzMemberList=0x348f
|
||||
OP_DzCompass=0x0e01 # Was 0x4f09
|
||||
OP_DzChooseZone=0x0000 # Maybe 0x29d6
|
||||
OP_DzChooseZone=0x6e5e # Maybe 0x29d6
|
||||
|
||||
# New Opcodes
|
||||
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
|
||||
@@ -498,6 +501,8 @@ OP_GroupRoles=0x047c
|
||||
OP_GroupMakeLeader=0x4129
|
||||
OP_DoGroupLeadershipAbility=0x17d7
|
||||
OP_GroupLeadershipAAUpdate=0x6567
|
||||
OP_GroupMentor=0x56DB
|
||||
OP_InspectBuffs=0x01f3
|
||||
|
||||
# LFG/LFP Opcodes
|
||||
OP_LFGCommand=0x4463
|
||||
@@ -510,8 +515,8 @@ OP_LFGAppearance=0x0000
|
||||
OP_LFGResponse=0x0000
|
||||
|
||||
# Raid Opcodes
|
||||
OP_RaidInvite=0x1bd1
|
||||
OP_RaidUpdate=0x548e
|
||||
OP_RaidInvite=0x5fb2
|
||||
OP_RaidUpdate=0x1bd1
|
||||
OP_RaidJoin=0x0000
|
||||
|
||||
# Button-push commands
|
||||
|
||||
@@ -0,0 +1,660 @@
|
||||
# ShowEQ Import Notes:
|
||||
# ZERO THE FILE first
|
||||
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
|
||||
# Unknown Mapping:
|
||||
# OP_Action2 -> OP_Damage
|
||||
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
|
||||
# Name Differences:
|
||||
# OP_CancelInvite -> OP_GroupCancelInvite
|
||||
# OP_GMFind -> OP_FindPersonRequest
|
||||
# OP_CommonMessage -> OP_ChannelMessage
|
||||
|
||||
OP_Unknown=0x0000
|
||||
OP_ExploreUnknown=0x0000 # used for unknown explorer
|
||||
|
||||
# world packets
|
||||
# Required to reach Char Select:
|
||||
OP_SendLoginInfo=0x7a09
|
||||
OP_ApproveWorld=0x7499
|
||||
OP_LogServer=0x7ceb
|
||||
OP_SendCharInfo=0x00d2
|
||||
OP_ExpansionInfo=0x590d
|
||||
OP_GuildsList=0x0000
|
||||
OP_EnterWorld=0x578f
|
||||
OP_PostEnterWorld=0x6259
|
||||
OP_World_Client_CRC1=0x12cc
|
||||
OP_World_Client_CRC2=0x0f13
|
||||
OP_SendSpellChecksum=0x0000
|
||||
OP_SendSkillCapsChecksum=0x0000
|
||||
|
||||
# Character Select Related:
|
||||
OP_SendMaxCharacters=0x5475
|
||||
OP_SendMembership=0x7acc
|
||||
OP_SendMembershipDetails=0x057b
|
||||
OP_CharacterCreateRequest=0x6773
|
||||
OP_CharacterCreate=0x6bbf
|
||||
OP_DeleteCharacter=0x1808
|
||||
OP_RandomNameGenerator=0x5954
|
||||
OP_ApproveName=0x56a2
|
||||
OP_MOTD=0x0c22
|
||||
OP_SetChatServer=0x1bc5
|
||||
OP_SetChatServer2=0x7eec
|
||||
OP_ZoneServerInfo=0x4c44
|
||||
OP_WorldComplete=0x4493
|
||||
OP_WorldUnknown001=0x2301
|
||||
OP_FloatListThing=0x46c6
|
||||
|
||||
# Reasons for Disconnect:
|
||||
OP_ZoneUnavail=0x4cb4
|
||||
OP_WorldClientReady=0x23c1
|
||||
OP_CharacterStillInZone=0x0000
|
||||
OP_WorldChecksumFailure=0x0000
|
||||
OP_WorldLoginFailed=0x0000
|
||||
OP_WorldLogout=0x0000
|
||||
OP_WorldLevelTooHigh=0x0000
|
||||
OP_CharInacessable=0x0000
|
||||
OP_UserCompInfo=0x0000
|
||||
OP_SendExeChecksum=0x0000
|
||||
OP_SendBaseDataChecksum=0x0000
|
||||
|
||||
# Zone in opcodes
|
||||
OP_AckPacket=0x471d
|
||||
OP_ZoneEntry=0x5089
|
||||
OP_ReqNewZone=0x7887
|
||||
OP_NewZone=0x1795
|
||||
OP_ZoneSpawns=0x5237
|
||||
OP_PlayerProfile=0x6506
|
||||
OP_TimeOfDay=0x5070
|
||||
OP_LevelUpdate=0x1eec
|
||||
OP_Stamina=0x2a79
|
||||
OP_RequestClientZoneChange=0x3fcf
|
||||
OP_ZoneChange=0x2d18
|
||||
OP_LockoutTimerInfo=0x0000
|
||||
OP_ZoneServerReady=0x0000
|
||||
OP_ZoneInUnknown=0x0000
|
||||
OP_LogoutReply=0x0000
|
||||
OP_PreLogoutReply=0x0000
|
||||
|
||||
# Required to fully log in
|
||||
OP_SpawnAppearance=0x0971
|
||||
OP_ChangeSize=0x4707
|
||||
OP_TributeUpdate=0x5961
|
||||
OP_TributeTimer=0x073d
|
||||
OP_SendTributes=0x729b
|
||||
OP_SendGuildTributes=0x1877
|
||||
OP_TributeInfo=0x4254
|
||||
OP_Weather=0x661e
|
||||
OP_ReqClientSpawn=0x35fa
|
||||
OP_SpawnDoor=0x7291
|
||||
OP_GroundSpawn=0x6fca
|
||||
OP_SendZonepoints=0x69a4
|
||||
OP_BlockedBuffs=0x3033
|
||||
OP_RemoveBlockedBuffs=0x0de7
|
||||
OP_ClearBlockedBuffs=0x34cb
|
||||
OP_WorldObjectsSent=0x5ae2
|
||||
OP_SendExpZonein=0x5f8e
|
||||
OP_SendAATable=0x66b5
|
||||
OP_RespondAA=0x7a27
|
||||
OP_UpdateAA=0x66f0
|
||||
OP_SendAAStats=0x43c8
|
||||
OP_AAExpUpdate=0x7d14
|
||||
OP_ExpUpdate=0x20ed
|
||||
OP_HPUpdate=0x2828
|
||||
OP_ManaChange=0x5467
|
||||
OP_TGB=0x0876
|
||||
OP_SpecialMesg=0x083
|
||||
OP_GuildMemberList=0x12a6
|
||||
OP_GuildMOTD=0x3e13
|
||||
OP_CharInventory=0x5ca6
|
||||
OP_WearChange=0x7994
|
||||
OP_ClientUpdate=0x7dfc
|
||||
OP_ClientReady=0x345d
|
||||
OP_SetServerFilter=0x444d
|
||||
|
||||
# Guild Opcodes - Disabled until crashes are resolved in RoF
|
||||
OP_GetGuildMOTD=0x36e0
|
||||
OP_GetGuildMOTDReply=0x4f1f
|
||||
OP_GuildMemberUpdate=0x69b9
|
||||
OP_GuildInvite=0x7099
|
||||
OP_GuildRemove=0x1444
|
||||
OP_GuildPeace=0x67e3
|
||||
OP_SetGuildMOTD=0x0b0b
|
||||
OP_GuildList=0x6279
|
||||
OP_GuildWar=0x1ffb
|
||||
OP_GuildLeader=0x7e09
|
||||
OP_GuildDelete=0x3708
|
||||
OP_GuildInviteAccept=0x7053
|
||||
OP_GuildDemote=0x2d4e
|
||||
OP_GuildPromote=0x0000
|
||||
OP_GuildPublicNote=0x5053
|
||||
OP_GuildManageBanker=0x748f
|
||||
OP_GuildBank=0x5134
|
||||
OP_SetGuildRank=0x0b9c
|
||||
OP_GuildUpdateURLAndChannel=0x2958
|
||||
OP_GuildStatus=0x7326
|
||||
OP_GuildCreate=0x76d9
|
||||
OP_GuildMemberLevelUpdate=0x0000 # Unused?
|
||||
OP_ZoneGuildList=0x0000 # Unused?
|
||||
OP_GetGuildsList=0x0000 # Unused?
|
||||
OP_LFGuild=0x0000
|
||||
OP_GuildManageRemove=0x0000
|
||||
OP_GuildManageAdd=0x0000
|
||||
OP_GuildManageStatus=0x0000
|
||||
|
||||
# GM/Guide Opcodes
|
||||
OP_GMServers=0x08c1
|
||||
OP_GMBecomeNPC=0x3ae1
|
||||
OP_GMZoneRequest=0x62ac
|
||||
OP_GMZoneRequest2=0x7e1a
|
||||
OP_GMGoto=0x7d8e
|
||||
OP_GMSearchCorpse=0x357c
|
||||
OP_GMHideMe=0x79c5
|
||||
OP_GMDelCorpse=0x607e
|
||||
OP_GMApproval=0x6db5
|
||||
OP_GMToggle=0x2097
|
||||
OP_GMSummon=0x486f
|
||||
OP_GMEmoteZone=0x1cfd
|
||||
OP_GMEmoteWorld=0x458e
|
||||
OP_GMFind=0x4a8f
|
||||
OP_GMKick=0x26a7
|
||||
OP_GMKill=0x51d3
|
||||
OP_GMNameChange=0x035f
|
||||
OP_GMLastName=0x46ce
|
||||
|
||||
# Misc Opcodes
|
||||
OP_InspectRequest=0x57bc
|
||||
OP_InspectAnswer=0x71ac
|
||||
OP_InspectMessageUpdate=0x4d25
|
||||
OP_BeginCast=0x318f
|
||||
OP_ColoredText=0x43af
|
||||
OP_ConsentResponse=0x384a
|
||||
OP_MemorizeSpell=0x217c
|
||||
OP_SwapSpell=0x0efa
|
||||
OP_CastSpell=0x1287
|
||||
OP_Consider=0x742b
|
||||
OP_FormattedMessage=0x1024
|
||||
OP_SimpleMessage=0x213f
|
||||
OP_Buff=0x659c
|
||||
OP_Illusion=0x312a
|
||||
OP_MoneyOnCorpse=0x5f44
|
||||
OP_RandomReply=0x106b
|
||||
OP_DenyResponse=0x2382
|
||||
OP_SkillUpdate=0x04c
|
||||
OP_GMTrainSkillConfirm=0x4b64
|
||||
OP_RandomReq=0x7b10
|
||||
OP_Death=0x6517
|
||||
OP_GMTraining=0x1966
|
||||
OP_GMEndTraining=0x4d6b
|
||||
OP_GMTrainSkill=0x2a85
|
||||
OP_Animation=0x7177
|
||||
OP_Begging=0x6703
|
||||
OP_Consent=0x1fd1
|
||||
OP_ConsentDeny=0x7a45
|
||||
OP_AutoFire=0x241e
|
||||
OP_PetCommands=0x0159
|
||||
OP_DeleteSpell=0x52e5
|
||||
OP_Surname=0x0423
|
||||
OP_ClearSurname=0x3fb0
|
||||
OP_FaceChange=0x5578
|
||||
OP_SenseHeading=0x260a
|
||||
OP_Action=0x744c
|
||||
OP_ConsiderCorpse=0x5204
|
||||
OP_HideCorpse=0x49e1
|
||||
OP_CorpseDrag=0x0904
|
||||
OP_CorpseDrop=0x7037
|
||||
OP_Bug=0x73f4
|
||||
OP_Feedback=0x5602
|
||||
OP_Report=0x1414
|
||||
OP_Damage=0x6f15
|
||||
OP_ChannelMessage=0x2b2d
|
||||
OP_Assist=0x4478
|
||||
OP_AssistGroup=0x27f8
|
||||
OP_MoveCoin=0x0bcf
|
||||
OP_ZonePlayerToBind=0x0ecb
|
||||
OP_KeyRing=0x6857
|
||||
OP_WhoAllRequest=0x674b
|
||||
OP_WhoAllResponse=0x51b8
|
||||
OP_FriendsWho=0x3956
|
||||
OP_ConfirmDelete=0x43a3
|
||||
OP_Logout=0x4ac6
|
||||
OP_Rewind=0x1745
|
||||
OP_TargetCommand=0x58e2
|
||||
OP_Hide=0x67fe
|
||||
OP_Jump=0x31f4
|
||||
OP_Camp=0x28ec
|
||||
OP_Emote=0x373b
|
||||
OP_SetRunMode=0x009f
|
||||
OP_BankerChange=0x791e
|
||||
OP_TargetMouse=0x075d
|
||||
OP_MobHealth=0x37b1
|
||||
OP_InitialMobHealth=0x0000 # Unused?
|
||||
OP_TargetHoTT=0x0272
|
||||
OP_XTargetResponse=0x672f
|
||||
OP_XTargetRequest=0x45be
|
||||
OP_XTargetAutoAddHaters=0x792c
|
||||
OP_TargetBuffs=0x4f4b
|
||||
OP_BuffCreate=0x3377
|
||||
OP_BuffRemoveRequest=0x64f2
|
||||
OP_DeleteSpawn=0x7280
|
||||
OP_AutoAttack=0x109d
|
||||
OP_AutoAttack2=0x3526
|
||||
OP_Consume=0x4b70
|
||||
OP_MoveItem=0x32ee
|
||||
OP_DeleteItem=0x18ad
|
||||
OP_DeleteCharge=0x01b8
|
||||
OP_ItemPacket=0x368e
|
||||
OP_ItemLinkResponse=0x70c0
|
||||
OP_ItemLinkClick=0x4cef
|
||||
OP_ItemPreview=0x6b5c
|
||||
OP_NewSpawn=0x6097
|
||||
OP_Track=0x17e5
|
||||
OP_TrackTarget=0x0029
|
||||
OP_TrackUnknown=0x4577
|
||||
OP_ClickDoor=0x3a8f
|
||||
OP_MoveDoor=0x08e8
|
||||
OP_RemoveAllDoors=0x700c
|
||||
OP_EnvDamage=0x51fd
|
||||
OP_BoardBoat=0x4211
|
||||
OP_Forage=0x5306
|
||||
OP_LeaveBoat=0x7617
|
||||
OP_ControlBoat=0x0ae7
|
||||
OP_SafeFallSuccess=0x2219
|
||||
OP_RezzComplete=0x760d
|
||||
OP_RezzRequest=0x3c21
|
||||
OP_RezzAnswer=0x701c
|
||||
OP_Shielding=0x48c1
|
||||
OP_RequestDuel=0x3af1
|
||||
OP_MobRename=0x2c57
|
||||
OP_AugmentItem=0x661b
|
||||
OP_WeaponEquip1=0x34a7
|
||||
OP_WeaponEquip2=0x559a
|
||||
OP_WeaponUnequip2=0x2d25
|
||||
OP_ApplyPoison=0x31e6
|
||||
OP_Save=0x4a39
|
||||
OP_TestBuff=0x7cb8
|
||||
OP_CustomTitles=0x100e
|
||||
OP_Split=0x3a54
|
||||
OP_YellForHelp=0x4e56
|
||||
OP_LoadSpellSet=0x261d
|
||||
OP_Bandolier=0x7677
|
||||
OP_PotionBelt=0x1a3e
|
||||
OP_DuelResponse=0x6a46
|
||||
OP_DuelResponse2=0x68d3
|
||||
OP_SaveOnZoneReq=0x600d
|
||||
OP_ReadBook=0x72df
|
||||
OP_Dye=0x23b9
|
||||
OP_InterruptCast=0x048c
|
||||
OP_AAAction=0x424e
|
||||
OP_LeadershipExpToggle=0x6c55
|
||||
OP_LeadershipExpUpdate=0x2797
|
||||
OP_PurchaseLeadershipAA=0x0026
|
||||
OP_UpdateLeadershipAA=0x026
|
||||
OP_MarkNPC=0x5a58
|
||||
OP_MarkRaidNPC=0x74bd #unimplemented
|
||||
OP_ClearNPCMarks=0x2003
|
||||
OP_ClearRaidNPCMarks=0x20d3 #unimplemented
|
||||
OP_DelegateAbility=0x76b8
|
||||
OP_SetGroupTarget=0x2814
|
||||
OP_Charm=0x5d92
|
||||
OP_Stun=0x36a4
|
||||
OP_SendFindableNPCs=0x7e62
|
||||
OP_FindPersonRequest=0x5cea
|
||||
OP_FindPersonReply=0x7e58
|
||||
OP_Sound=0x1a30
|
||||
OP_PetBuffWindow=0x5882
|
||||
OP_LevelAppearance=0x3bc9
|
||||
OP_Translocate=0x6580
|
||||
OP_Sacrifice=0x1821
|
||||
OP_PopupResponse=0x08a6
|
||||
OP_OnLevelMessage=0x4d6e
|
||||
OP_AugmentInfo=0x0afb
|
||||
OP_Petition=0x3de3
|
||||
OP_SomeItemPacketMaybe=0x747c
|
||||
OP_PVPStats=0x4b15
|
||||
OP_PVPLeaderBoardRequest=0x04aa
|
||||
OP_PVPLeaderBoardReply=0x071f
|
||||
OP_PVPLeaderBoardDetailsRequest=0x3707
|
||||
OP_PVPLeaderBoardDetailsReply=0x25b7
|
||||
OP_RestState=0x000f
|
||||
OP_RespawnWindow=0x28bc
|
||||
OP_LDoNButton=0x5327
|
||||
OP_SetStartCity=0x6326
|
||||
OP_VoiceMacroIn=0x17fd
|
||||
OP_VoiceMacroOut=0x409a
|
||||
OP_ItemViewUnknown=0x465b
|
||||
OP_VetRewardsAvaliable=0x590e
|
||||
OP_VetClaimRequest=0x1126
|
||||
OP_VetClaimReply=0x16d4
|
||||
OP_DisciplineUpdate=0x759e
|
||||
OP_DisciplineTimer=0x6989
|
||||
OP_BecomeCorpse=0x0000 # Unused?
|
||||
OP_Action2=0x0000 # Unused?
|
||||
OP_MobUpdate=0x2c84
|
||||
OP_NPCMoveUpdate=0x5892
|
||||
OP_CameraEffect=0x127f
|
||||
OP_SpellEffect=0x5936
|
||||
OP_RemoveNimbusEffect=0x7b1e
|
||||
OP_AltCurrency=0x62ab
|
||||
OP_AltCurrencyMerchantRequest=0x61cb
|
||||
OP_AltCurrencyMerchantReply=0x5409
|
||||
OP_AltCurrencyPurchase=0x0165
|
||||
OP_AltCurrencySell=0x74ec
|
||||
OP_AltCurrencySellSelection=0x3788
|
||||
OP_AltCurrencyReclaim=0x3899
|
||||
OP_CrystalCountUpdate=0x467f
|
||||
OP_CrystalCreate=0x7aee
|
||||
OP_CrystalReclaim=0x2439
|
||||
OP_Untargetable=0x053c
|
||||
OP_IncreaseStats=0x70a3
|
||||
OP_Weblink=0x6f4b
|
||||
OP_OpenContainer=0x0000
|
||||
OP_Marquee=0x0000
|
||||
OP_ItemRecastDelay=0x15a9
|
||||
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
|
||||
|
||||
OP_DzQuit=0x205f
|
||||
OP_DzListTimers=0x0398
|
||||
OP_DzAddPlayer=0x59ca
|
||||
OP_DzRemovePlayer=0x4701
|
||||
OP_DzSwapPlayer=0x1abc
|
||||
OP_DzMakeLeader=0x405b
|
||||
OP_DzPlayerList=0x543d
|
||||
OP_DzJoinExpeditionConfirm=0x14c6
|
||||
OP_DzJoinExpeditionReply=0x7f4b
|
||||
OP_DzExpeditionInfo=0x4f7e
|
||||
OP_DzExpeditionList=0x9119
|
||||
OP_DzMemberStatus=0xb2e3
|
||||
OP_DzLeaderStatus=0x32f0
|
||||
OP_DzExpeditionEndsWarning=0x7e94
|
||||
OP_DzMemberList=0x3de9
|
||||
OP_DzCompass=0x3e0e
|
||||
OP_DzChooseZone=0x0000
|
||||
|
||||
# New Opcodes
|
||||
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
|
||||
OP_ManaUpdate=0x3791
|
||||
OP_EnduranceUpdate=0x5f42
|
||||
OP_MobManaUpdate=0x2404
|
||||
OP_MobEnduranceUpdate=0x1c81
|
||||
|
||||
# Mercenary Opcodes
|
||||
OP_MercenaryDataUpdateRequest=0x7b89
|
||||
OP_MercenaryDataUpdate=0x61a4
|
||||
OP_MercenaryDataRequest=0x11c1
|
||||
OP_MercenaryDataResponse=0x72ce
|
||||
OP_MercenaryHire=0x7169
|
||||
OP_MercenaryDismiss=0x6e83
|
||||
OP_MercenaryTimerRequest=0x31e4
|
||||
OP_MercenaryTimer=0x0763
|
||||
OP_MercenaryUnknown1=0x5d26
|
||||
OP_MercenaryCommand=0x27f2
|
||||
OP_MercenarySuspendRequest=0x4407
|
||||
OP_MercenarySuspendResponse=0x6f03
|
||||
OP_MercenaryUnsuspendResponse=0x27a0
|
||||
|
||||
# Looting
|
||||
OP_LootRequest=0x0adf
|
||||
OP_EndLootRequest=0x30f7
|
||||
OP_LootItem=0x4dc9
|
||||
OP_LootComplete=0x55c4
|
||||
|
||||
# bazaar trader stuff:
|
||||
OP_BazaarSearch=0x39d6
|
||||
OP_TraderDelItem=0x0000
|
||||
OP_BecomeTrader=0x61b3
|
||||
OP_TraderShop=0x31df
|
||||
OP_Trader=0x4ef5
|
||||
OP_TraderBuy=0x0000
|
||||
OP_Barter=0x243a
|
||||
OP_ShopItem=0x0000
|
||||
OP_BazaarInspect=0x0000
|
||||
OP_Bazaar=0x0000
|
||||
OP_TraderItemUpdate=0x0000
|
||||
|
||||
# pc/npc trading
|
||||
OP_TradeRequest=0x77b5
|
||||
OP_TradeAcceptClick=0x69e2
|
||||
OP_TradeRequestAck=0x14bf
|
||||
OP_TradeCoins=0x4206
|
||||
OP_FinishTrade=0x3993
|
||||
OP_CancelTrade=0x354c
|
||||
OP_TradeMoneyUpdate=0x68c2
|
||||
OP_MoneyUpdate=0x640c
|
||||
OP_TradeBusy=0x5505
|
||||
|
||||
# Sent after canceling trade or after closing tradeskill object
|
||||
OP_FinishWindow=0x7349
|
||||
OP_FinishWindow2=0x40ef
|
||||
|
||||
# Sent on Live for what seems to be item existance verification
|
||||
# Ex. Before Right Click Effect happens from items
|
||||
OP_ItemVerifyRequest=0x189c
|
||||
OP_ItemVerifyReply=0x097b
|
||||
|
||||
# merchant stuff
|
||||
OP_ShopPlayerSell=0x0000
|
||||
OP_ShopRequest=0x4fed
|
||||
OP_ShopEnd=0x30a8
|
||||
OP_ShopEndConfirm=0x3196
|
||||
OP_ShopPlayerBuy=0x0ddd
|
||||
OP_ShopDelItem=0x724f
|
||||
|
||||
# tradeskill stuff:
|
||||
OP_ClickObject=0x4aa1
|
||||
OP_ClickObjectAction=0x0c1e
|
||||
OP_ClearObject=0x7a11
|
||||
OP_RecipeDetails=0x40d7
|
||||
OP_RecipesFavorite=0x71b1
|
||||
OP_RecipesSearch=0x1db6
|
||||
OP_RecipeReply=0x6e02
|
||||
OP_RecipeAutoCombine=0x6261
|
||||
OP_TradeSkillCombine=0x579a
|
||||
|
||||
# Tribute Packets:
|
||||
OP_OpenGuildTributeMaster=0x378d
|
||||
OP_OpenTributeMaster=0x7666
|
||||
OP_SelectTribute=0x79fc
|
||||
OP_TributeItem=0x4f3e
|
||||
OP_TributeMoney=0x58fb
|
||||
OP_TributeToggle=0x241d
|
||||
OP_TributePointUpdate=0x5300
|
||||
OP_TributeNPC=0x0000
|
||||
OP_GuildTributeInfo=0x0000
|
||||
OP_OpenTributeReply=0x0000
|
||||
OP_GuildTributeStatus=0x0000
|
||||
|
||||
# Adventure packets:
|
||||
OP_LeaveAdventure=0x5d18
|
||||
OP_AdventureFinish=0x400f
|
||||
OP_AdventureInfoRequest=0x3cb0
|
||||
OP_AdventureInfo=0x4c54
|
||||
OP_AdventureRequest=0x2c6c
|
||||
OP_AdventureDetails=0x5648
|
||||
OP_AdventureData=0x7171
|
||||
OP_AdventureUpdate=0x1b01
|
||||
OP_AdventureMerchantRequest=0x6922
|
||||
OP_AdventureMerchantResponse=0x3e47
|
||||
OP_AdventureMerchantPurchase=0x5b72
|
||||
OP_AdventureMerchantSell=0x2f9b
|
||||
OP_AdventurePointsUpdate=0x65c3
|
||||
OP_AdventureStatsRequest=0x5a62
|
||||
OP_AdventureStatsReply=0x2370
|
||||
OP_AdventureLeaderboardRequest=0x7093
|
||||
OP_AdventureLeaderboardReply=0x7f79
|
||||
|
||||
# Group Opcodes
|
||||
OP_GroupDisband=0x4c10
|
||||
OP_GroupInvite=0x6110
|
||||
OP_GroupFollow=0x1649
|
||||
OP_GroupUpdate=0x3abb
|
||||
OP_GroupUpdateB=0x6194
|
||||
OP_GroupCancelInvite=0x0000
|
||||
OP_GroupAcknowledge=0x7323
|
||||
OP_GroupDelete=0x0f6c
|
||||
OP_CancelInvite=0x2a50
|
||||
OP_GroupFollow2=0x2060
|
||||
OP_GroupInvite2=0x32c2
|
||||
OP_GroupDisbandYou=0x1ae5
|
||||
OP_GroupDisbandOther=0x74da
|
||||
OP_GroupLeaderChange=0x21b4
|
||||
OP_GroupRoles=0x70e2
|
||||
OP_GroupMakeLeader=0x4229
|
||||
OP_DoGroupLeadershipAbility=0x1fb5
|
||||
OP_GroupLeadershipAAUpdate=0x02cf
|
||||
OP_GroupMentor=0x3342
|
||||
OP_InspectBuffs=0x486c
|
||||
|
||||
# LFG/LFP Opcodes
|
||||
OP_LFGCommand=0x6060
|
||||
OP_LFGGetMatchesRequest=0x0340
|
||||
OP_LFGGetMatchesResponse=0x5048
|
||||
OP_LFPGetMatchesRequest=0x4d7d
|
||||
OP_LFPGetMatchesResponse=0x22c6
|
||||
OP_LFPCommand=0x49a9
|
||||
OP_LFGAppearance=0x0000
|
||||
OP_LFGResponse=0x0000
|
||||
|
||||
# Raid Opcodes
|
||||
OP_RaidInvite=0x55ac
|
||||
OP_RaidUpdate=0x3973
|
||||
OP_RaidJoin=0x0000
|
||||
|
||||
# Button-push commands
|
||||
OP_Taunt=0x2703
|
||||
OP_CombatAbility=0x3eba
|
||||
OP_SenseTraps=0x02af
|
||||
OP_PickPocket=0x39e8
|
||||
OP_DisarmTraps=0x78bf
|
||||
OP_Disarm=0x5ec8
|
||||
OP_Sneak=0x5d55
|
||||
OP_Fishing=0x1e2a
|
||||
OP_InstillDoubt=0x640e
|
||||
OP_FeignDeath=0x52fa
|
||||
OP_Mend=0x0ecf
|
||||
OP_Bind_Wound=0x0386
|
||||
OP_LDoNOpen=0x3d5c
|
||||
|
||||
# Task packets
|
||||
OP_TaskDescription=0x3714
|
||||
OP_TaskActivity=0x08d3
|
||||
OP_CompletedTasks=0x4eba
|
||||
OP_TaskActivityComplete=0x5e19
|
||||
OP_AcceptNewTask=0x0a23
|
||||
OP_CancelTask=0x39f0
|
||||
OP_TaskMemberList=0x5727
|
||||
OP_OpenNewTasksWindow=0x48a2
|
||||
OP_AvaliableTask=0x36e8
|
||||
OP_TaskHistoryRequest=0x5f1c
|
||||
OP_TaskHistoryReply=0x3d05
|
||||
OP_DeclineAllTasks=0x0000
|
||||
|
||||
# Title opcodes
|
||||
OP_NewTitlesAvailable=0x0d32
|
||||
OP_RequestTitles=0x6344
|
||||
OP_SendTitleList=0x2d08
|
||||
OP_SetTitle=0x6527
|
||||
OP_SetTitleReply=0x4c21
|
||||
|
||||
# mail opcodes
|
||||
OP_Command=0x0000
|
||||
OP_MailboxHeader=0x0000
|
||||
OP_MailHeader=0x0000
|
||||
OP_MailBody=0x0000
|
||||
OP_NewMail=0x0000
|
||||
OP_SentConfirm=0x0000
|
||||
|
||||
########### Below this point should not be needed ###########
|
||||
|
||||
# This section are all unknown in Titanium
|
||||
OP_ForceFindPerson=0x0000
|
||||
OP_LocInfo=0x0000
|
||||
OP_ReloadUI=0x0000
|
||||
OP_ItemName=0x0000
|
||||
OP_ItemLinkText=0x0000
|
||||
OP_MultiLineMsg=0x0000
|
||||
OP_MendHPUpdate=0x0000
|
||||
OP_TargetReject=0x0000
|
||||
OP_SafePoint=0x0000
|
||||
OP_ApproveZone=0x0000
|
||||
OP_ZoneComplete=0x0000
|
||||
OP_ClientError=0x0000
|
||||
OP_DumpName=0x0000
|
||||
OP_Heartbeat=0x0000
|
||||
OP_CrashDump=0x0000
|
||||
OP_LoginComplete=0x0000
|
||||
|
||||
# discovered opcodes not yet used:
|
||||
OP_PickLockSuccess=0x0000
|
||||
OP_PlayMP3=0x0000
|
||||
OP_ReclaimCrystals=0x0000
|
||||
OP_DynamicWall=0x0000
|
||||
OP_OpenDiscordMerchant=0x0000
|
||||
OP_DiscordMerchantInventory=0x0000
|
||||
OP_GiveMoney=0x0000
|
||||
OP_RequestKnowledgeBase=0x0000
|
||||
OP_KnowledgeBase=0x0000
|
||||
OP_SlashAdventure=0x0000 # /adventure
|
||||
OP_BecomePVPPrompt=0x0000
|
||||
OP_MoveLogRequest=0x0000 # gone I think
|
||||
OP_MoveLogDisregard=0x0000 # gone I think
|
||||
|
||||
# named unknowns, to make looking for real unknown easier
|
||||
OP_AnnoyingZoneUnknown=0x0000
|
||||
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
|
||||
OP_QueryResponseThing=0x0000
|
||||
|
||||
|
||||
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
|
||||
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
|
||||
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
|
||||
|
||||
# Petition Opcodes
|
||||
OP_PetitionSearch=0x0000 search term for petition
|
||||
OP_PetitionSearchResults=0x0000 (list of?) matches from search
|
||||
OP_PetitionSearchText=0x0000 text results of search
|
||||
|
||||
OP_PetitionUpdate=0x0000
|
||||
OP_PetitionCheckout=0x0000
|
||||
OP_PetitionCheckIn=0x0000
|
||||
OP_PetitionQue=0x0000
|
||||
OP_PetitionUnCheckout=0x0000
|
||||
OP_PetitionDelete=0x0000
|
||||
OP_DeletePetition=0x0000
|
||||
OP_PetitionResolve=0x0000
|
||||
OP_PDeletePetition=0x0000
|
||||
OP_PetitionBug=0x0000
|
||||
OP_PetitionRefresh=0x0000
|
||||
OP_PetitionCheckout2=0x0000
|
||||
OP_PetitionViewPetition=0x0000
|
||||
|
||||
# Login opcodes
|
||||
OP_SessionReady=0x0000
|
||||
OP_Login=0x0000
|
||||
OP_ServerListRequest=0x0000
|
||||
OP_PlayEverquestRequest=0x0000
|
||||
OP_PlayEverquestResponse=0x0000
|
||||
OP_ChatMessage=0x0000
|
||||
OP_LoginAccepted=0x0000
|
||||
OP_ServerListResponse=0x0000
|
||||
OP_Poll=0x0000
|
||||
OP_EnterChat=0x0000
|
||||
OP_PollResponse=0x0000
|
||||
|
||||
# raw opcodes
|
||||
OP_RAWSessionRequest=0x0000
|
||||
OP_RAWSessionResponse=0x0000
|
||||
OP_RAWCombined=0x0000
|
||||
OP_RAWSessionDisconnect=0x0000
|
||||
OP_RAWKeepAlive=0x0000
|
||||
OP_RAWSessionStatRequest=0x0000
|
||||
OP_RAWSessionStatResponse=0x0000
|
||||
OP_RAWPacket=0x0000
|
||||
OP_RAWFragment=0x0000
|
||||
OP_RAWOutOfOrderAck=0x0000
|
||||
OP_RAWAck=0x0000
|
||||
OP_RAWAppCombined=0x0000
|
||||
OP_RAWOutOfSession=0x0000
|
||||
|
||||
# we need to document the differences between these packets to make identifying them easier
|
||||
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
|
||||
OP_InitialHPUpdate=0x0000
|
||||
@@ -158,7 +158,7 @@ OP_GMApproval=0x72fa # C
|
||||
OP_GMToggle=0x7566 # C
|
||||
OP_GMSummon=0x596d # C
|
||||
OP_GMEmoteZone=0x3e7c # C
|
||||
OP_GMEmoteWorld=0x3e7c # C
|
||||
OP_GMEmoteWorld=0x5298 # C
|
||||
OP_GMFind=0x6e27 # C
|
||||
OP_GMKick=0x799c # C
|
||||
OP_GMKill=0x6685 # C
|
||||
@@ -288,8 +288,10 @@ OP_LeadershipExpToggle=0x34c5 # C
|
||||
OP_LeadershipExpUpdate=0x69d0 # C
|
||||
OP_PurchaseLeadershipAA=0x07b3 # C
|
||||
OP_UpdateLeadershipAA=0x6948 # C
|
||||
OP_MarkNPC=0x0d4b # C
|
||||
OP_MarkNPC=0x695c # C
|
||||
OP_MarkRaidNPC=0x0d4b # C
|
||||
OP_ClearNPCMarks=0x5033 # C
|
||||
OP_ClearRaidNPCMarks=0x5f55 # C
|
||||
OP_DoGroupLeadershipAbility=0x540b # C
|
||||
OP_GroupLeadershipAAUpdate=0x0c33
|
||||
OP_DelegateAbility=0x0322 # C
|
||||
@@ -367,7 +369,7 @@ OP_DzExpeditionEndsWarning=0x1879
|
||||
OP_DzExpeditionList=0x3657
|
||||
OP_DzMemberList=0x74e4
|
||||
OP_DzCompass=0x35d3
|
||||
OP_DzChooseZone=0xd8a
|
||||
OP_DzChooseZone=0x0d8a
|
||||
#0x1d99 was grouped with these too but I don't really know it's purpose.
|
||||
|
||||
# New Opcodes
|
||||
@@ -484,6 +486,8 @@ OP_GroupDisbandOther=0x162d
|
||||
OP_GroupLeaderChange=0x7545
|
||||
OP_GroupRoles=0x6b67
|
||||
OP_GroupMakeLeader=0x6087
|
||||
OP_GroupMentor=0x1224
|
||||
OP_InspectBuffs=0x66bf
|
||||
# LFG/LFP Opcodes
|
||||
OP_LFGCommand=0x3288 # C
|
||||
OP_LFGGetMatchesRequest=0x5613 # C
|
||||
@@ -576,7 +580,6 @@ OP_MultiLineMsg=0x0000 #
|
||||
OP_MendHPUpdate=0x0000 #
|
||||
OP_TargetReject=0x0000 #
|
||||
OP_SafePoint=0x0000 #
|
||||
OP_IncreaseStats=0x0000 #
|
||||
OP_ApproveZone=0x0000 #
|
||||
OP_ZoneComplete=0x0000 #
|
||||
OP_ClientError=0x0000 #
|
||||
|
||||
@@ -85,6 +85,7 @@ OP_TaskActivity=0x2E60 #SEQ 12/04/08
|
||||
OP_CompletedTasks=0x75AC #Derision 2009
|
||||
OP_Weather=0x70A5 #SEQ 12/04/08
|
||||
OP_SendAATable=0x6F05 #Trevius 12/20/08
|
||||
OP_ShroudClearAA=0x71b9
|
||||
OP_UpdateAA=0x45D2 #Trevius 12/20/08
|
||||
OP_RespondAA=0x4426 #Trevius 12/20/08
|
||||
OP_ReqClientSpawn=0x014C #SEQ 12/04/08
|
||||
@@ -281,8 +282,10 @@ OP_LeadershipExpToggle=0x24D4 #Xinu 02/20/09
|
||||
OP_LeadershipExpUpdate=0x58b6 #Derision 2009
|
||||
OP_PurchaseLeadershipAA=0x1408 #Derision 2009
|
||||
OP_UpdateLeadershipAA=0x7abf #Derision 2009
|
||||
OP_MarkNPC=0x00c6 #Derision 2009
|
||||
OP_MarkNPC=0x4697 #Derision 2009
|
||||
OP_MarkRaidNPC=0x00c6
|
||||
OP_ClearNPCMarks=0x2ff2 #
|
||||
OP_ClearRaidNPCMarks=0x56a9 #
|
||||
OP_DoGroupLeadershipAbility=0x5a64 #Derision 2009
|
||||
OP_DelegateAbility=0x57e3 #Derision 2009
|
||||
OP_SetGroupTarget=0x1651 #Derision 2009
|
||||
@@ -329,6 +332,7 @@ OP_InspectMessageUpdate=0x67e9 # C
|
||||
OP_OpenInventory=0x66c8
|
||||
OP_OpenContainer=0x10e3
|
||||
OP_Marquee=0x2f75
|
||||
OP_Untargetable=0x3e36
|
||||
|
||||
#expedition
|
||||
OP_DzQuit=0x20d6
|
||||
@@ -450,6 +454,8 @@ OP_GroupDelete=0x0000 #
|
||||
OP_CancelInvite=0x596C #Trevius 03/02/09
|
||||
OP_GroupFollow2=0x59D4 #Xinu 02/20/09
|
||||
OP_GroupInvite2=0x07F6 #Xinu 02/20/09
|
||||
OP_GroupMentor=0x9EF3
|
||||
OP_InspectBuffs=0x3547
|
||||
|
||||
#LFG/LFP Opcodes
|
||||
OP_LFGCommand=0x5D81 #Trevius 01/16/09
|
||||
@@ -526,7 +532,7 @@ OP_MultiLineMsg=0x0000 #
|
||||
OP_MendHPUpdate=0x0000 #
|
||||
OP_TargetReject=0x0000 #
|
||||
OP_SafePoint=0x0000 #
|
||||
OP_IncreaseStats=0x0000 #
|
||||
OP_IncreaseStats=0x5ecb #
|
||||
OP_ApproveZone=0x0000 #
|
||||
OP_ZoneComplete=0x0000 #
|
||||
OP_ClientError=0x0000 #
|
||||
@@ -540,9 +546,11 @@ OP_PickLockSuccess=0x0000 #
|
||||
OP_VetRewardsAvaliable=0x044b #
|
||||
OP_VetClaimRequest=0x7503
|
||||
OP_VetClaimReply=0x01e1
|
||||
OP_PlayMP3=0x0000 #
|
||||
OP_PlayMP3=0x0d1c #
|
||||
OP_ReclaimCrystals=0x0000 #
|
||||
OP_CrystalCountUpdate=0x64C1 #
|
||||
OP_CrystalCreate=0x65e2
|
||||
OP_CrystalReclaim=0x0730
|
||||
OP_DynamicWall=0x0000 #
|
||||
OP_OpenDiscordMerchant=0x0000 #
|
||||
OP_DiscordMerchantInventory=0x0000 #
|
||||
|
||||
@@ -420,6 +420,8 @@ OP_RaidJoin=0x1f21 # ShowEQ 10/27/05
|
||||
OP_RaidInvite=0x5891 # ShowEQ 10/27/05
|
||||
OP_RaidUpdate=0x1f21 # EQEmu 06/29/05
|
||||
|
||||
OP_InspectBuffs=0x4FB6
|
||||
|
||||
|
||||
OP_ZoneComplete=0x0000
|
||||
OP_ItemLinkText=0x0000
|
||||
|
||||
@@ -88,6 +88,7 @@ OP_TaskActivity=0x31f3 # C
|
||||
OP_CompletedTasks=0x687f # C
|
||||
OP_Weather=0x4658 # V
|
||||
OP_SendAATable=0x6ef9 # V
|
||||
OP_ShroudClearAA=0x2cd4
|
||||
OP_UpdateAA=0x7bf6 # V
|
||||
OP_RespondAA=0x1fbd # C 0x2bad
|
||||
OP_ReqClientSpawn=0x69cd # V
|
||||
@@ -292,8 +293,10 @@ OP_LeadershipExpToggle=0x5033 # C
|
||||
OP_LeadershipExpUpdate=0x074f # C
|
||||
OP_PurchaseLeadershipAA=0x5f55 # C
|
||||
OP_UpdateLeadershipAA=0x77ed # C
|
||||
OP_MarkNPC=0x3ec7 # C
|
||||
OP_MarkNPC=0x66bf
|
||||
OP_MarkRaidNPC=0x3ec7 # C
|
||||
OP_ClearNPCMarks=0x5c29 # C
|
||||
OP_ClearRaidNPCMarks=0x2af4
|
||||
OP_DoGroupLeadershipAbility=0x0068 # C
|
||||
OP_GroupLeadershipAAUpdate=0x167b # C
|
||||
OP_DelegateAbility=0x6e58 # C
|
||||
@@ -313,7 +316,7 @@ OP_OnLevelMessage=0x24cb # C
|
||||
OP_AugmentInfo=0x31b1 # C
|
||||
OP_Petition=0x31d1 # C
|
||||
OP_SomeItemPacketMaybe=0x2c27 # C
|
||||
OP_PVPStats=0x0000 #
|
||||
OP_PVPStats=0x5272 #
|
||||
OP_PVPLeaderBoardRequest=0x4973 # C
|
||||
OP_PVPLeaderBoardReply=0x3842 # C
|
||||
OP_PVPLeaderBoardDetailsRequest=0x6c75 # C
|
||||
@@ -371,7 +374,17 @@ OP_DzExpeditionEndsWarning=0x6ac2
|
||||
OP_DzExpeditionList=0x70d8
|
||||
OP_DzMemberList=0x15c4
|
||||
OP_DzCompass=0x01cb
|
||||
OP_DzChooseZone=0x0000
|
||||
OP_DzChooseZone=0x65e1
|
||||
|
||||
#shroud
|
||||
OP_ShroudSelectionWindow=0x72ad
|
||||
OP_ShroudRequestStats=0x488b
|
||||
OP_ShroudRespondStats=0x1910
|
||||
OP_ShroudSelect=0x45d7
|
||||
OP_ShroudSelectCancel=0x666d
|
||||
OP_ShroudProgress=0x6016 # This clears current progress and sets
|
||||
OP_ShroudProgress2=0x66b4 # This just sets progress
|
||||
OP_Shroud=0x1643
|
||||
|
||||
# New Opcodes
|
||||
OP_SpawnPositionUpdate=0x4656 # C
|
||||
@@ -487,6 +500,8 @@ OP_GroupDisbandOther=0x49f6 # C
|
||||
OP_GroupLeaderChange=0x0c33 # C
|
||||
OP_GroupRoles=0x116d # C
|
||||
OP_GroupMakeLeader=0x5851
|
||||
OP_GroupMentor=0x292f
|
||||
OP_InspectBuffs=0x105b
|
||||
|
||||
# LFG/LFP Opcodes
|
||||
OP_LFGCommand=0x2c38 # C
|
||||
@@ -656,3 +671,6 @@ OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
|
||||
OP_InitialHPUpdate=0x0000 #
|
||||
|
||||
OP_ItemRecastDelay=0x82d7
|
||||
|
||||
# unhandled
|
||||
OP_ShieldGroup=0x23a1
|
||||
|
||||
@@ -0,0 +1,214 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
############################################################
|
||||
#::: Script: DB_Dumper.pl
|
||||
#::: Purpose: Utility to easily manage database backups and compress.
|
||||
#::: Export Individual DB Tables...
|
||||
#::: Export specific databases...
|
||||
#::: Built for both Windows and Linux
|
||||
#::: Windows uses WinRar or 7-Zip for compression
|
||||
#::: Linux uses tar for compression
|
||||
#::: Author: Akkadius
|
||||
############################################################
|
||||
|
||||
$localdrive = "C:"; #::: Where Windows and all Install Programs are...
|
||||
$linesep = "---------------------------------------";
|
||||
|
||||
use POSIX qw(strftime);
|
||||
my $date = strftime "%m-%d-%Y", localtime;
|
||||
print "\nTodays Date: " . $date . "\n";
|
||||
|
||||
use Config;
|
||||
print "Operating System is: $Config{osname}\n";
|
||||
if($Config{osname}=~/linux/i){ $OS = "Linux"; }
|
||||
if($Config{osname}=~/Win|MS/i){ $OS = "Windows"; }
|
||||
|
||||
if(!$ARGV[0]){
|
||||
print "\nERROR! Need arguments\n\n";
|
||||
print "#::: Help :::#\n";
|
||||
print "######################################################\n\n";
|
||||
print "Arguments\n";
|
||||
print " loc=\"C:\\File Location\" - File path location to backup...\n";
|
||||
print " database=\"dbname\" - Manually specify databasename, default is database in eqemu_config.xml\n";
|
||||
print " tables=\"table1,table2,table3\" - Manually specify tables, default is to dump all tables from database\n";
|
||||
print " compress - Compress Database with 7-ZIP, will fallback to WinRAR depending on what is installed (Must be installed to default program dir)...\n";
|
||||
print ' Example: perl DB_Dumper.pl Loc="E:\Backups"' . "\n\n";
|
||||
print "######################################################\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
#::: CONFIG VARIABLES - Parsed from eqemu_config.xml
|
||||
|
||||
my $confile = "eqemu_config.xml"; #default
|
||||
open(F, "<$confile") or die "Unable to open config: $confile - This must be in your EQEmu Server Folder with your XML config\n";
|
||||
my $indb = 0;
|
||||
|
||||
while(<F>) {
|
||||
s/\r//g;
|
||||
if(/<database>/i) { $indb = 1; }
|
||||
next unless($indb == 1);
|
||||
if(/<\/database>/i) { $indb = 0; last; }
|
||||
if(/<host>(.*)<\/host>/i) { $host = $1; }
|
||||
elsif(/<username>(.*)<\/username>/i) { $user = $1; }
|
||||
elsif(/<password>(.*)<\/password>/i) { $pass = $1; }
|
||||
elsif(/<db>(.*)<\/db>/i) { $db = $1; }
|
||||
}
|
||||
|
||||
$Debug = 0;
|
||||
print "Arguments\n" if $Debug;
|
||||
$n = 0;
|
||||
while($ARGV[$n]){
|
||||
print $n . ': ' . $ARGV[$n] . "\n" if $Debug;
|
||||
if($ARGV[$n]=~/compress/i){
|
||||
print "Compression SET\n";
|
||||
$Compress = 1;
|
||||
}
|
||||
if($ARGV[$n]=~/database=/i){
|
||||
@DB_NAME = split('=', $ARGV[$n]);
|
||||
print "Database is " . $DB_NAME[1] . "\n";
|
||||
$db = $DB_NAME[1];
|
||||
}
|
||||
if($ARGV[$n]=~/loc=/i){
|
||||
@B_LOC = split('=', $ARGV[$n]);
|
||||
print "Backup Directory: " . $B_LOC[1] . "\n";
|
||||
}
|
||||
if($ARGV[$n]=~/tables=/i){
|
||||
@Tables = split('=', $ARGV[$n]); @TList = split(',', $Tables[1]);
|
||||
foreach my $tables (@TList){
|
||||
$t_tables .= $tables . " ";
|
||||
$t_tables_l .= $tables . "_";
|
||||
$t_tables_p .= $tables . "\n";
|
||||
}
|
||||
print "Backing up tables: \n\n############################\n" . $t_tables_p . "############################\n\n";
|
||||
}
|
||||
$n++;
|
||||
}
|
||||
|
||||
#::: Check for Backup Directory existence, if doesn't exist then create...
|
||||
if (-d $B_LOC[1]) {
|
||||
print "Directory currently exists... Adding files to it...\n\n";
|
||||
}
|
||||
elsif($B_LOC[1] ne ""){
|
||||
print "Directory does NOT exist! Creating...\n\n";
|
||||
mkdir($B_LOC[1]) or die 'Failed to create folder, maybe created the folder manually at "' . $B_LOC[1]. '" ?';
|
||||
}
|
||||
else{
|
||||
print "No save location specified... Saving to folder script is running in...\n";
|
||||
}
|
||||
if($B_LOC[1] ne ""){
|
||||
if($OS eq "Windows"){ $file_app = "\\"; }
|
||||
if($OS eq "Linux"){ $file_app = "/"; }
|
||||
}
|
||||
else {
|
||||
$file_app = "";
|
||||
}
|
||||
|
||||
if($t_tables ne ""){
|
||||
$tables_f_l = substr($t_tables_l, 0, 20) . '...';
|
||||
$target_file = '' . $tables_f_l . ' ' . $date . '';
|
||||
print "Performing table based backup...\n";
|
||||
#::: Backup Database...
|
||||
print "Backing up Database " . $db . "... \n\n";
|
||||
$cmd = 'mysqldump -u' . $user . ' --max_allowed_packet=512M --password="' . $pass . '" ' . $db . ' ' . $t_tables . ' > "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql"';
|
||||
printcmd($cmd);
|
||||
system($cmd);
|
||||
}
|
||||
else{ #::: Entire DB Backup
|
||||
$target_file = '' . $db . ' ' . $date . '';
|
||||
#::: Backup Database...
|
||||
print "Backing up Database " . $db . "... \n\n";
|
||||
$cmd = 'mysqldump -u' . $user . ' --max_allowed_packet=512M --password="' . $pass . '" ' . $db . ' > "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql"';
|
||||
printcmd($cmd);
|
||||
system($cmd);
|
||||
}
|
||||
|
||||
#::: Get File Size
|
||||
$fileloc = '' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql';
|
||||
$filesize = -s $fileloc;
|
||||
if($filesize < 1000){ print "\n" . 'Error occurred... exiting...' . "\n\n"; exit; }
|
||||
print "Backup DONE... DB Backup File Size '" . $filesize . "' (" . get_filesize_str($fileloc) . ")\n\n";
|
||||
|
||||
#::: WinRar Get, check compression flag
|
||||
if($Compress == 1){
|
||||
if($OS eq "Windows"){
|
||||
if(-d $localdrive . "\\Program Files\\7-Zip"){
|
||||
print " ::: You have 7-Zip installed as 64 Bit...\n\n";
|
||||
$S_ZIP = $localdrive . "\\Program Files\\7-Zip";
|
||||
}
|
||||
elsif(-d $localdrive . "\\Program Files (x86)\\7-Zip"){
|
||||
print " ::: You have 7-Zip installed as 32 Bit...\n\n";
|
||||
$S_ZIP = $localdrive . "\\Program Files (x86)\\7-Zip";
|
||||
}
|
||||
elsif(-d $localdrive . "\\Program Files (x86)\\WinRAR"){
|
||||
print " ::: You have WinRAR installed as 32 Bit...\n\n";
|
||||
$WinRar = $localdrive . "\\Program Files (x86)\\WinRAR";
|
||||
}
|
||||
elsif(-d $localdrive . "\\Program Files\\WinRAR"){
|
||||
print " ::: You have WinRAR installed as 64 Bit...\n\n";
|
||||
$WinRar = $localdrive . "\\Program Files\\WinRAR";
|
||||
}
|
||||
else{
|
||||
print "No WinRAR installed... Will not compress...\n";
|
||||
}
|
||||
if($S_ZIP ne ""){
|
||||
print "Compressing Database with 7-ZIP... \n\n";
|
||||
$cmd = '"' . $S_ZIP . '\\7z" a -t7z -m0=lzma -mx=9 "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.7z" "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
|
||||
printcmd($cmd);
|
||||
system($cmd);
|
||||
print "\nDeleting RAW .sql Dump... \n\n";
|
||||
$cmd = 'del "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
|
||||
printcmd($cmd);
|
||||
system($cmd);
|
||||
$final_file = $target_file . ".7z";
|
||||
}
|
||||
elsif($WinRar ne ""){
|
||||
print "Compressing Database with WinRAR... \n";
|
||||
$cmd = '"' . $WinRar . '\\rar" a "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.rar" "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
|
||||
printcmd($cmd);
|
||||
system($cmd);
|
||||
print "\nDeleting RAW .sql Dump... \n\n";
|
||||
$cmd = 'del "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
|
||||
printcmd($cmd);
|
||||
system($cmd);
|
||||
$final_file = $target_file . ".rar";
|
||||
}
|
||||
}
|
||||
if($OS eq "Linux"){
|
||||
print "Compressing Database with Tarball... \n";
|
||||
$cmd = 'tar -zcvf "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.tar.gz" "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
|
||||
printcmd($cmd);
|
||||
system($cmd);
|
||||
print "\nDeleting RAW .sql Dump... \n\n";
|
||||
$cmd = 'rm "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
|
||||
printcmd($cmd);
|
||||
system($cmd);
|
||||
$final_file = $target_file . ".tar.gz";
|
||||
}
|
||||
}
|
||||
|
||||
#::: Get Final File Location for display
|
||||
if($B_LOC[1] ne ""){ $final_loc = $B_LOC[1] . '' . $file_app . ""; }
|
||||
else{
|
||||
if($OS eq "Windows"){
|
||||
$final_loc = `echo %cd%`;
|
||||
}
|
||||
elsif($OS eq "Linux"){
|
||||
$final_loc = `pwd`;
|
||||
}
|
||||
}
|
||||
|
||||
print "Final file located: " . $final_loc . "" . $final_file . "\n\n";
|
||||
|
||||
sub printcmd{
|
||||
print "--- CMD --- \n" . $_[0] . "\n" . $linesep . "\n\n";
|
||||
}
|
||||
|
||||
sub get_filesize_str{
|
||||
my $file = shift();
|
||||
my $size = (stat($file))[7] || die "stat($file): $!\n";
|
||||
if ($size > 1099511627776) { return sprintf("%.2f TiB", $size / 1099511627776); }
|
||||
elsif ($size > 1073741824) { return sprintf("%.2f GiB", $size / 1073741824); }
|
||||
elsif ($size > 1048576) { return sprintf("%.2f MiB", $size / 1048576); }
|
||||
elsif ($size > 1024) { return sprintf("%.2f KiB", $size / 1024); }
|
||||
else { return "$size byte" . ($size == 1 ? "" : "s"); }
|
||||
}
|
||||
@@ -0,0 +1,425 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
###########################################################
|
||||
#::: Automatic Database Upgrade Script
|
||||
#::: Author: Akkadius
|
||||
#::: Purpose: To upgrade databases with ease and maintain versioning
|
||||
###########################################################
|
||||
|
||||
|
||||
#::: If current version is less than what world is reporting, then download a new one...
|
||||
$current_version = 1;
|
||||
if($ARGV[0] eq "V"){
|
||||
if($ARGV[1] > $current_version){
|
||||
print "Retrieving latest database manifest...\n";
|
||||
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/db_update.pl", "db_update.pl");
|
||||
exit;
|
||||
}
|
||||
else{
|
||||
print "No update necessary \n";
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
$perl_version = $^V;
|
||||
$perl_version =~s/v//g;
|
||||
print "Perl Version is " . $perl_version . "\n";
|
||||
if($perl_version > 5.12){ no warnings 'uninitialized'; }
|
||||
no warnings;
|
||||
|
||||
my $confile = "eqemu_config.xml"; #default
|
||||
open(F, "<$confile") or die "Unable to open config: $confile\n";
|
||||
my $indb = 0;
|
||||
while(<F>) {
|
||||
s/\r//g;
|
||||
if(/<database>/i) { $indb = 1; }
|
||||
next unless($indb == 1);
|
||||
if(/<\/database>/i) { $indb = 0; last; }
|
||||
if(/<host>(.*)<\/host>/i) { $host = $1; }
|
||||
elsif(/<username>(.*)<\/username>/i) { $user = $1; }
|
||||
elsif(/<password>(.*)<\/password>/i) { $pass = $1; }
|
||||
elsif(/<db>(.*)<\/db>/i) { $db = $1; }
|
||||
}
|
||||
|
||||
$console_output =
|
||||
"============================================================
|
||||
EQEmu: Automatic Database Upgrade Check
|
||||
============================================================
|
||||
";
|
||||
|
||||
use Config;
|
||||
$console_output .= " Operating System is: $Config{osname}\n";
|
||||
if($Config{osname}=~/linux/i){ $OS = "Linux"; }
|
||||
if($Config{osname}=~/Win|MS/i){ $OS = "Windows"; }
|
||||
|
||||
if($OS eq "Windows"){
|
||||
$has_mysql_path = `echo %PATH%`;
|
||||
if($has_mysql_path=~/MySQL|MariaDB/i){
|
||||
@mysql = split(';', $has_mysql_path);
|
||||
foreach my $v (@mysql){
|
||||
if($v=~/MySQL|MariaDB/i){
|
||||
$v =~s/\n//g;
|
||||
$path = trim($v) . "/mysql";
|
||||
last;
|
||||
}
|
||||
}
|
||||
$console_output .= " (Windows) MySQL is in system path \n";
|
||||
$console_output .= " Path = " . $path . "\n";
|
||||
$console_output .= "============================================================\n";
|
||||
}
|
||||
}
|
||||
|
||||
#::: Linux Check
|
||||
if($OS eq "Linux"){
|
||||
$path = `which mysql`;
|
||||
if ($path eq "") {
|
||||
$path = `which mariadb`;
|
||||
}
|
||||
$path =~s/\n//g;
|
||||
|
||||
$console_output .= " (Linux) MySQL is in system path \n";
|
||||
$console_output .= " Path = " . $path . "\n";
|
||||
$console_output .= "============================================================\n";
|
||||
}
|
||||
|
||||
#::: Path not found, error and exit
|
||||
if($path eq ""){
|
||||
print "MySQL path not found, please add the path for automatic database upgrading to continue... \n\n";
|
||||
print "Exiting...\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
#::: Create db_update working directory if not created
|
||||
mkdir('db_update');
|
||||
|
||||
#::: Check if db_version table exists...
|
||||
if(trim(GetMySQLResult("SHOW COLUMNS FROM db_version LIKE 'Revision'")) ne ""){
|
||||
print GetMySQLResult("DROP TABLE db_version");
|
||||
print "Old db_version table present, dropping...\n\n";
|
||||
}
|
||||
|
||||
if(GetMySQLResult("SHOW TABLES LIKE 'db_version'") eq ""){
|
||||
print GetMySQLResult("
|
||||
CREATE TABLE db_version (
|
||||
version int(11) DEFAULT '0'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||
INSERT INTO db_version (version) VALUES ('1000');");
|
||||
print "Table 'db_version' does not exists.... Creating...\n\n";
|
||||
}
|
||||
|
||||
if($OS eq "Windows"){ @db_version = split(': ', `world db_version`); }
|
||||
if($OS eq "Linux"){ @db_version = split(': ', `./world db_version`); }
|
||||
|
||||
$bin_db_ver = trim($db_version[1]);
|
||||
$local_db_ver = trim(GetMySQLResult("SELECT version FROM db_version LIMIT 1"));
|
||||
|
||||
#::: If ran from Linux startup script, supress output
|
||||
if($bin_db_ver == $local_db_ver && $ARGV[0] eq "ran_from_start"){
|
||||
print "Database up to date...\n";
|
||||
exit;
|
||||
}
|
||||
else{
|
||||
print $console_output;
|
||||
}
|
||||
|
||||
|
||||
print " Binary Database Version: (" . $bin_db_ver . ")\n";
|
||||
print " Local Database Version: (" . $local_db_ver . ")\n\n";
|
||||
|
||||
#::: If World ran this script, and our version is up to date, continue...
|
||||
if($bin_db_ver == $local_db_ver && $ARGV[0] eq "ran_from_world"){
|
||||
print " Database up to Date: Continuing World Bootup...\n";
|
||||
print "============================================================\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
print "Retrieving latest database manifest...\n";
|
||||
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt", "db_update/db_update_manifest.txt");
|
||||
# GetRemoteFile("https://dl.dropboxusercontent.com/u/50023467/dl/db_update_manifest.txt", "db_update/db_update_manifest.txt");
|
||||
|
||||
if($local_db_ver < $bin_db_ver && $ARGV[0] eq "ran_from_world"){
|
||||
print "You have missing database updates, type 1 or 2 to backup your database before running them as recommended...\n\n";
|
||||
#::: Display Menu
|
||||
ShowMenuPrompt();
|
||||
}
|
||||
else{
|
||||
#::: Most likely ran standalone
|
||||
print "\n";
|
||||
ShowMenuPrompt();
|
||||
}
|
||||
|
||||
|
||||
sub ShowMenuPrompt {
|
||||
my %dispatch = (
|
||||
1 => \&database_dump,
|
||||
2 => \&database_dump_compress,
|
||||
3 => \&Run_Database_Check,
|
||||
4 => \&AA_Fetch,
|
||||
0 => \&Exit,
|
||||
);
|
||||
|
||||
while (1) {
|
||||
{
|
||||
local $| = 1;
|
||||
if(!$menu_show && ($ARGV[0] eq "ran_from_world" || $ARGV[0] eq "ran_from_start")){
|
||||
$menu_show++;
|
||||
next;
|
||||
}
|
||||
print MenuOptions(), '> ';
|
||||
}
|
||||
|
||||
my $choice = <>;
|
||||
|
||||
$choice =~ s/\A\s+//;
|
||||
$choice =~ s/\s+\z//;
|
||||
|
||||
if (defined(my $handler = $dispatch{$choice})) {
|
||||
my $result = $handler->();
|
||||
unless (defined $result) {
|
||||
exit 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if($ARGV[0] ne "ran_from_world"){
|
||||
# warn "\n\nInvalid selection\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub MenuOptions {
|
||||
if(@total_updates){
|
||||
$option[3] = "Run pending REQUIRED updates... (" . scalar (@total_updates) . ")";
|
||||
}
|
||||
else{
|
||||
$option[3] = "Check for pending REQUIRED Database updates
|
||||
Stages updates for automatic upgrade...";
|
||||
}
|
||||
|
||||
return <<EO_MENU;
|
||||
Database Management Menu (Please Select):
|
||||
1) Backup Database - (Saves to Backups folder)
|
||||
Ideal to perform before performing updates
|
||||
2) Backup Database Compressed - (Saves to Backups folder)
|
||||
Ideal to perform before performing updates
|
||||
3) $option[3]
|
||||
4) AAs - Get Latest AA's from PEQ (This deletes AA's already in the database)
|
||||
0) Exit
|
||||
|
||||
EO_MENU
|
||||
}
|
||||
|
||||
sub CheckForDatabaseDumpScript{
|
||||
if(`perl db_dumper.pl`=~/Need arguments/i){
|
||||
return;
|
||||
}
|
||||
else{
|
||||
print "db_dumper.pl not found... retrieving...\n\n";
|
||||
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/db_dumper.pl", "db_dumper.pl");
|
||||
}
|
||||
}
|
||||
|
||||
sub ran_from_world {
|
||||
print "Running from world...\n";
|
||||
}
|
||||
|
||||
sub database_dump {
|
||||
CheckForDatabaseDumpScript();
|
||||
print "Performing database backup....\n";
|
||||
print `perl db_dumper.pl database="$db" loc="backups"`;
|
||||
}
|
||||
sub database_dump_compress {
|
||||
CheckForDatabaseDumpScript();
|
||||
print "Performing database backup....\n";
|
||||
print `perl db_dumper.pl database="$db" loc="backups" compress`;
|
||||
}
|
||||
sub Exit{ }
|
||||
|
||||
#::: Returns Tab Delimited MySQL Result from Command Line
|
||||
sub GetMySQLResult{
|
||||
my $run_query = $_[0];
|
||||
if($OS eq "Windows"){ return `"$path" --user $user --password="$pass" $db -N -B -e "$run_query"`; }
|
||||
if($OS eq "Linux"){
|
||||
$run_query =~s/`//g;
|
||||
return `$path --user="$user" --password="$pass" $db -N -B -e "$run_query"`;
|
||||
}
|
||||
}
|
||||
|
||||
sub GetMySQLResultFromFile{
|
||||
my $update_file = $_[0];
|
||||
if($OS eq "Windows"){ return `"$path" --user $user --password="$pass" --force $db < $update_file`; }
|
||||
if($OS eq "Linux"){ return `"$path" --user $user --password="$pass" --force $db < $update_file`; }
|
||||
}
|
||||
|
||||
#::: Gets Remote File based on URL (1st Arg), and saves to destination file (2nd Arg)
|
||||
#::: Example: GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt", "db_update/db_update_manifest.txt");
|
||||
sub GetRemoteFile{
|
||||
my $URL = $_[0];
|
||||
my $Dest_File = $_[1];
|
||||
|
||||
if($OS eq "Windows"){
|
||||
require LWP::UserAgent;
|
||||
my $ua = LWP::UserAgent->new;
|
||||
$ua->timeout(10);
|
||||
$ua->env_proxy;
|
||||
my $response = $ua->get($URL);
|
||||
|
||||
if ($response->is_success){
|
||||
open (FILE, '> ' . $Dest_File . '');
|
||||
print FILE $response->decoded_content;
|
||||
close (FILE);
|
||||
print " URL: " . $URL . "\n";
|
||||
print " Saved: " . $Dest_File . " \n";
|
||||
}
|
||||
else {
|
||||
print "Error, no connection to the internet...\n\n";
|
||||
die $response->status_line;
|
||||
}
|
||||
}
|
||||
if($OS eq "Linux"){
|
||||
#::: wget -O db_update/db_update_manifest.txt https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt
|
||||
$wget = `wget --quiet -O $Dest_File $URL`;
|
||||
print " URL: " . $URL . "\n";
|
||||
print " Saved: " . $Dest_File . " \n";
|
||||
if($wget=~/unable to resolve/i){
|
||||
print "Error, no connection to the internet...\n\n";
|
||||
die;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#::: Trim Whitespaces
|
||||
sub trim {
|
||||
my $string = $_[0];
|
||||
$string =~ s/^\s+//;
|
||||
$string =~ s/\s+$//;
|
||||
return $string;
|
||||
}
|
||||
|
||||
#::: Fetch Latest PEQ AA's
|
||||
sub AA_Fetch{
|
||||
print "Pulling down PEQ AA Tables...\n";
|
||||
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/peq_aa_tables.sql", "db_update/peq_aa_tables.sql");
|
||||
print "\n\nInstalling AA Tables...\n";
|
||||
print GetMySQLResultFromFile("db_update/peq_aa_tables.sql");
|
||||
print "\nDone...\n\n";
|
||||
}
|
||||
|
||||
#::: Responsible for Database Upgrade Routines
|
||||
sub Run_Database_Check{
|
||||
#::: Run 2 - Running pending updates...
|
||||
if(defined(@total_updates)){
|
||||
@total_updates = sort @total_updates;
|
||||
foreach my $val (@total_updates){
|
||||
$file_name = trim($m_d{$val}[1]);
|
||||
print "Running Update: " . $val . " - " . $file_name . "\n";
|
||||
print GetMySQLResultFromFile("db_update/$file_name");
|
||||
print GetMySQLResult("UPDATE db_version SET version = $val WHERE version < $val");
|
||||
}
|
||||
}
|
||||
|
||||
#::: Run 1 - Initial checking of needed updates...
|
||||
print "Reading manifest...\n\n";
|
||||
use Data::Dumper;
|
||||
open (FILE, "db_update/db_update_manifest.txt");
|
||||
while (<FILE>) {
|
||||
chomp;
|
||||
$o = $_;
|
||||
if($o=~/#/i){ next; }
|
||||
@manifest = split('\|', $o);
|
||||
$m_d{$manifest[0]} = [@manifest];
|
||||
}
|
||||
|
||||
@total_updates = ();
|
||||
|
||||
#::: Iterate through Manifest backwards from binary version down to local version...
|
||||
for($i = $bin_db_ver; $i > 1000; $i--){
|
||||
if(!defined($m_d{$i}[0])){ next; }
|
||||
|
||||
$file_name = trim($m_d{$i}[1]);
|
||||
$query_check = trim($m_d{$i}[2]);
|
||||
$match_type = trim($m_d{$i}[3]);
|
||||
$match_text = trim($m_d{$i}[4]);
|
||||
|
||||
#::: Match type update
|
||||
if($match_type eq "contains"){
|
||||
if(trim(GetMySQLResult($query_check))=~/$match_text/i){
|
||||
print "Missing DB Update " . $i . " '" . $file_name . "' \n";
|
||||
FetchMissingUpdate($i, $file_name);
|
||||
push(@total_updates, $i);
|
||||
}
|
||||
else{
|
||||
print "DB up to date with: " . $i . " - '" . $file_name . "' \n";
|
||||
}
|
||||
print_match_debug();
|
||||
print_break();
|
||||
}
|
||||
if($match_type eq "missing"){
|
||||
if(GetMySQLResult($query_check)=~/$match_text/i){
|
||||
print "DB up to date with: " . $i . " - '" . $file_name . "' \n";
|
||||
next;
|
||||
}
|
||||
else{
|
||||
print "Missing DB Update " . $i . " '" . $file_name . "' \n";
|
||||
FetchMissingUpdate($i, $file_name);
|
||||
push(@total_updates, $i);
|
||||
}
|
||||
print_match_debug();
|
||||
print_break();
|
||||
}
|
||||
if($match_type eq "empty"){
|
||||
if(GetMySQLResult($query_check) eq ""){
|
||||
print "Missing DB Update " . $i . " '" . $file_name . "' \n";
|
||||
FetchMissingUpdate($i, $file_name);
|
||||
push(@total_updates, $i);
|
||||
}
|
||||
else{
|
||||
print "DB up to date with: " . $i . " - '" . $file_name . "' \n";
|
||||
}
|
||||
print_match_debug();
|
||||
print_break();
|
||||
}
|
||||
if($match_type eq "not_empty"){
|
||||
if(GetMySQLResult($query_check) ne ""){
|
||||
print "Missing DB Update " . $i . " '" . $file_name . "' \n";
|
||||
FetchMissingUpdate($i, $file_name);
|
||||
push(@total_updates, $i);
|
||||
}
|
||||
else{
|
||||
print "DB up to date with: " . $i . " - '" . $file_name . "' \n";
|
||||
}
|
||||
print_match_debug();
|
||||
print_break();
|
||||
}
|
||||
}
|
||||
print "\n";
|
||||
|
||||
if(scalar (@total_updates) == 0){
|
||||
print "No updates need to be run...\n";
|
||||
print "Setting Database to Binary Version (" . $bin_db_ver . ") if not already...\n\n";
|
||||
GetMySQLResult("UPDATE db_version SET version = $bin_db_ver");
|
||||
}
|
||||
}
|
||||
|
||||
sub FetchMissingUpdate{
|
||||
$db_update = $_[0];
|
||||
$update_file = $_[1];
|
||||
if($db_update >= 9000){
|
||||
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/git/required/" . $update_file, "db_update/" . $update_file . "");
|
||||
}
|
||||
elsif($db_update >= 5000 && $db_update <= 9000){
|
||||
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/svn/" . $update_file, "db_update/" . $update_file . "");
|
||||
}
|
||||
}
|
||||
|
||||
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(GetMySQLResult($query_check)) . "'\n";
|
||||
}
|
||||
sub print_break{
|
||||
if(!$debug){ return; }
|
||||
print "\n==============================================\n";
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
# Input and Output txt and conf files.
|
||||
*.txt
|
||||
*.conf
|
||||
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# File Name: conf_to_oplist.pl
|
||||
# Converts a Patch File into the Opcode List with Opcode Names for the Spreadsheet.
|
||||
|
||||
# Directions to use this script:
|
||||
# 1. Paste the contents of the current patch file in the patch_OLD.conf file.
|
||||
# 2. Run this script using "perl conf_to_oplist.pl"
|
||||
# 3. This updates the opcodelist.txt with the values from the Patch File.
|
||||
|
||||
|
||||
$stopmessage = "Failed to open file";
|
||||
open OpcodeFile, "<", "opcodelist.txt" or die $stopmessage;
|
||||
open PatchFile, "<", "patch_OLD.conf" or die $stopmessage;
|
||||
|
||||
my @OpcodeList = <OpcodeFile>;
|
||||
my @PatchFile = <PatchFile>;
|
||||
my %PatchHash = ();
|
||||
|
||||
foreach $line (@PatchFile)
|
||||
{
|
||||
@equalssplit = split(/=/, $line);
|
||||
$ArraySize = @equalssplit;
|
||||
if ($ArraySize > 1)
|
||||
{
|
||||
@OpcodeArray = split(//, $equalssplit[1]);
|
||||
$CurOpcode = $OpcodeArray[0].$OpcodeArray[1].$OpcodeArray[2].$OpcodeArray[3].$OpcodeArray[4].$OpcodeArray[5];
|
||||
$CurOpcode = lc($CurOpcode);
|
||||
# Opcode Name => Opcode
|
||||
$PatchHash{ $CurOpcode } = $equalssplit[0];
|
||||
}
|
||||
}
|
||||
|
||||
close(OpcodeFile);
|
||||
close(PatchFile);
|
||||
|
||||
# Clear out file contents
|
||||
open OpcodeResultFile, ">", "opcodelist.txt" or die $stopmessage;
|
||||
print OpcodeResultFile "";
|
||||
close(OpcodeResultFile);
|
||||
|
||||
open OpcodeResultFile, ">>", "opcodelist.txt" or die $stopmessage;
|
||||
|
||||
while( my ($k, $v) = each %$PatchFile )
|
||||
{
|
||||
#print OpcodeResultFile "key: $k, value: $v.\n";
|
||||
}
|
||||
|
||||
|
||||
$TabSpace = " "; # Tab
|
||||
foreach $line (@OpcodeList)
|
||||
{
|
||||
@LineSplit = split(//, $line);
|
||||
$CurOpcode = $LineSplit[0].$LineSplit[1].$LineSplit[2].$LineSplit[3].$LineSplit[4].$LineSplit[5];
|
||||
$CurOpcode = lc($CurOpcode);
|
||||
$OpcodeName = ""; # Tab
|
||||
if ($PatchHash{$CurOpcode})
|
||||
{
|
||||
$NameKey = $PatchHash{$CurOpcode};
|
||||
$OpcodeName = $NameKey;
|
||||
}
|
||||
$CurLine = $CurOpcode.$TabSpace.$OpcodeName."\n";
|
||||
print OpcodeResultFile $CurLine;
|
||||
}
|
||||
|
||||
close(OpcodeResultFile);
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,88 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# File Name: oplist_to_conf.pl
|
||||
# Converts the Opcode List with Opcode Names from the Spreadsheet into a Patch File.
|
||||
|
||||
# Directions to use this script:
|
||||
# 1. Copy the opcodes and opcode names columns from the opcode spreadsheet
|
||||
# for the columns you want to create a new .conf file from into the file.
|
||||
# 2. Remove the header row entries in the newly created text file and save it.
|
||||
# 3. Paste the contents of the current patch file in the patch_OLD.conf file.
|
||||
# 4. Run this script using "perl oplist_to_conf.pl"
|
||||
# 5. This creates a new .conf file named patch_NEW.conf
|
||||
# 6. Rename patch_NEW.conf to the desired name and you are all done
|
||||
|
||||
|
||||
$stopmessage = "Failed to open file";
|
||||
# Open the text file that contains the opcode and opcode name rows for a single client from the opcode list spreadsheet
|
||||
open OpcodeFile, "<", "opcodelist.txt" or die $stopmessage;
|
||||
# Open the .conf file to copy from
|
||||
open PatchFile, "<", "patch_OLD.conf" or die $stopmessage;
|
||||
|
||||
# Read these files into arrays for looping and close the files
|
||||
my @OpcodeList = <OpcodeFile>;
|
||||
my @PatchFile = <PatchFile>;
|
||||
close(OpcodeFile);
|
||||
close(PatchFile);
|
||||
|
||||
# Open the new/destination .conf file and clear out file contents
|
||||
open OpcodeResultFile, ">", "patch_NEW.conf" or die $stopmessage;
|
||||
print OpcodeResultFile "";
|
||||
# Close out the newly cleared .conf file
|
||||
close(OpcodeResultFile);
|
||||
|
||||
# Open the new/destination .conf file again for appending
|
||||
open OpcodeResultFile, ">>", "patch_NEW.conf" or die $stopmessage;
|
||||
|
||||
my %PatchHash = ();
|
||||
|
||||
foreach $line (@OpcodeList)
|
||||
{
|
||||
@equalssplit = split(/ /, $line);
|
||||
$ArraySize = @equalssplit;
|
||||
if ($ArraySize > 1)
|
||||
{
|
||||
my $CurOpcode = "";
|
||||
my $CurOpcodeName = "";
|
||||
@OpcodeArray = split(//, $equalssplit[0]);
|
||||
if ($equalssplit[1] =~ /^OP_(.*)/i)
|
||||
{
|
||||
$CurOpcodeName = "OP_".$1;
|
||||
}
|
||||
foreach $Letter (@OpcodeArray)
|
||||
{
|
||||
if ($Letter =~ /[A-Za-z0-9]/)
|
||||
{
|
||||
$CurOpcode .= $Letter;
|
||||
}
|
||||
}
|
||||
if ($CurOpcode && $CurOpcodeName)
|
||||
{
|
||||
$CurOpcode = lc($CurOpcode);
|
||||
$PatchHash{ $CurOpcodeName } = $CurOpcode;
|
||||
#print $CurOpcodeName."=". $CurOpcode."\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$TabSpace = " "; # Tab
|
||||
foreach $line (@PatchFile)
|
||||
{
|
||||
$CurLine = $line;
|
||||
if ($line =~ /^OP_([^\=]+)=([^\s]+)(.*)/i)
|
||||
{
|
||||
$NewOpcode = "0x0000";
|
||||
$OpcodeName = "OP_".$1;
|
||||
|
||||
if ($PatchHash{$OpcodeName})
|
||||
{
|
||||
$NewOpcode = $PatchHash{$OpcodeName};
|
||||
}
|
||||
|
||||
$CurLine = $OpcodeName."=".$NewOpcode.$3."\n";
|
||||
}
|
||||
print OpcodeResultFile $CurLine;
|
||||
}
|
||||
|
||||
|
||||
close(OpcodeResultFile);
|
||||
@@ -0,0 +1,661 @@
|
||||
# ShowEQ Import Notes:
|
||||
# ZERO THE FILE first
|
||||
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
|
||||
# Unknown Mapping:
|
||||
# OP_Action2 -> OP_Damage
|
||||
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
|
||||
# Name Differences:
|
||||
# OP_CancelInvite -> OP_GroupCancelInvite
|
||||
# OP_GMFind -> OP_FindPersonRequest
|
||||
# OP_CommonMessage -> OP_ChannelMessage
|
||||
|
||||
OP_Unknown=0x0000
|
||||
OP_ExploreUnknown=0x0000 used for unknown explorer
|
||||
|
||||
# world packets
|
||||
# Required to reach Char Select:
|
||||
OP_SendLoginInfo=0x7a09
|
||||
OP_ApproveWorld=0x7499
|
||||
OP_LogServer=0x7ceb
|
||||
OP_SendCharInfo=0x00d2
|
||||
OP_ExpansionInfo=0x590d
|
||||
OP_GuildsList=0x0000
|
||||
OP_EnterWorld=0x578f
|
||||
OP_PostEnterWorld=0x6259
|
||||
OP_World_Client_CRC1=0x12cc
|
||||
OP_World_Client_CRC2=0x0f13
|
||||
OP_SendSpellChecksum=0x0000
|
||||
OP_SendSkillCapsChecksum=0x0000
|
||||
|
||||
# Character Select Related:
|
||||
OP_SendMaxCharacters=0x5475
|
||||
OP_SendMembership=0x7acc
|
||||
OP_SendMembershipDetails=0x057b
|
||||
OP_CharacterCreateRequest=0x6773
|
||||
OP_CharacterCreate=0x6bbf
|
||||
OP_DeleteCharacter=0x1808
|
||||
OP_RandomNameGenerator=0x5954
|
||||
OP_ApproveName=0x56a2
|
||||
OP_MOTD=0x0c22
|
||||
OP_SetChatServer=0x1bc5
|
||||
OP_SetChatServer2=0x7eec
|
||||
OP_ZoneServerInfo=0x4c44
|
||||
OP_WorldComplete=0x4493
|
||||
OP_WorldUnknown001=0x2301
|
||||
OP_FloatListThing=0x46c6
|
||||
|
||||
# Reasons for Disconnect:
|
||||
OP_ZoneUnavail=0x4cb4
|
||||
OP_WorldClientReady=0x23c1
|
||||
OP_CharacterStillInZone=0x0000
|
||||
OP_WorldChecksumFailure=0x0000
|
||||
OP_WorldLoginFailed=0x0000
|
||||
OP_WorldLogout=0x0000
|
||||
OP_WorldLevelTooHigh=0x0000
|
||||
OP_CharInacessable=0x0000
|
||||
OP_UserCompInfo=0x0000
|
||||
OP_SendExeChecksum=0x0000
|
||||
OP_SendBaseDataChecksum=0x0000
|
||||
|
||||
# Zone in opcodes
|
||||
OP_AckPacket=0x471d
|
||||
OP_ZoneEntry=0x5089
|
||||
OP_ReqNewZone=0x7887
|
||||
OP_NewZone=0x1795
|
||||
OP_ZoneSpawns=0x5237
|
||||
OP_PlayerProfile=0x6506
|
||||
OP_TimeOfDay=0x5070
|
||||
OP_LevelUpdate=0x1eec
|
||||
OP_Stamina=0x2a79
|
||||
OP_RequestClientZoneChange=0x3fcf
|
||||
OP_ZoneChange=0x2d18
|
||||
OP_LockoutTimerInfo=0x0000
|
||||
OP_ZoneServerReady=0x0000
|
||||
OP_ZoneInUnknown=0x0000
|
||||
OP_LogoutReply=0x0000
|
||||
OP_PreLogoutReply=0x0000
|
||||
|
||||
# Required to fully log in
|
||||
OP_SpawnAppearance=0x0971
|
||||
OP_ChangeSize=0x4707
|
||||
OP_TributeUpdate=0x5961
|
||||
OP_TributeTimer=0x073d
|
||||
OP_SendTributes=0x729b
|
||||
OP_SendGuildTributes=0x1877
|
||||
OP_TributeInfo=0x4254
|
||||
OP_Weather=0x661e
|
||||
OP_ReqClientSpawn=0x35fa
|
||||
OP_SpawnDoor=0x7291
|
||||
OP_GroundSpawn=0x6fca
|
||||
OP_SendZonepoints=0x69a4
|
||||
OP_BlockedBuffs=0x3033
|
||||
OP_RemoveBlockedBuffs=0x0de7
|
||||
OP_ClearBlockedBuffs=0x34cb
|
||||
OP_WorldObjectsSent=0x5ae2
|
||||
OP_SendExpZonein=0x5f8e
|
||||
OP_SendAATable=0x66b5
|
||||
OP_RespondAA=0x7a27
|
||||
OP_UpdateAA=0x66f0
|
||||
OP_SendAAStats=0x43c8
|
||||
OP_AAExpUpdate=0x7d14
|
||||
OP_ExpUpdate=0x20ed
|
||||
OP_HPUpdate=0x2828
|
||||
OP_ManaChange=0x43af
|
||||
OP_TGB=0x0876
|
||||
OP_SpecialMesg=0x0083
|
||||
OP_GuildMemberList=0x12a6
|
||||
OP_GuildMOTD=0x3e13
|
||||
OP_CharInventory=0x5ca6
|
||||
OP_WearChange=0x7994
|
||||
OP_ClientUpdate=0x7dfc
|
||||
OP_ClientReady=0x345d # 0x422d
|
||||
OP_SetServerFilter=0x444d
|
||||
|
||||
# Guild Opcodes - Disabled until crashes are resolved in RoF
|
||||
OP_GetGuildMOTD=0x36e0 # Was 0x35dc
|
||||
OP_GetGuildMOTDReply=0x4f1f # Was 0x4586
|
||||
OP_GuildMemberUpdate=0x69b9 # Was 0x5643
|
||||
OP_GuildInvite=0x7099
|
||||
OP_GuildRemove=0x1444
|
||||
OP_GuildPeace=0x67e3
|
||||
OP_SetGuildMOTD=0x0b0b
|
||||
OP_GuildList=0x507a
|
||||
OP_GuildWar=0x1ffb
|
||||
OP_GuildLeader=0x7e09
|
||||
OP_GuildDelete=0x3708
|
||||
OP_GuildInviteAccept=0x7053
|
||||
OP_GuildDemote=0x2d4e
|
||||
OP_GuildPromote=0x0000
|
||||
OP_GuildPublicNote=0x5053
|
||||
OP_GuildManageBanker=0x748f # Was 0x0737
|
||||
OP_GuildBank=0x5134 # Was 0x10c3
|
||||
OP_SetGuildRank=0x0b9c
|
||||
OP_GuildUpdateURLAndChannel=0x2958
|
||||
OP_GuildStatus=0x7326
|
||||
OP_GuildCreate=0x1dc8 # or maybe 0x086e
|
||||
OP_GuildMemberLevelUpdate=0x0000 # Unused?
|
||||
OP_ZoneGuildList=0x0000 # Unused?
|
||||
OP_GetGuildsList=0x0000 # Unused?
|
||||
OP_LFGuild=0x0000
|
||||
OP_GuildManageRemove=0x0000
|
||||
OP_GuildManageAdd=0x0000
|
||||
OP_GuildManageStatus=0x0000
|
||||
|
||||
# GM/Guide Opcodes
|
||||
OP_GMServers=0x08c1
|
||||
OP_GMBecomeNPC=0x3ae1
|
||||
OP_GMZoneRequest=0x62ac
|
||||
OP_GMZoneRequest2=0x7e1a
|
||||
OP_GMGoto=0x7d8e
|
||||
OP_GMSearchCorpse=0x357c
|
||||
OP_GMHideMe=0x79c5
|
||||
OP_GMDelCorpse=0x607e
|
||||
OP_GMApproval=0x6db5
|
||||
OP_GMToggle=0x2097
|
||||
OP_GMSummon=0x486f # Was 0x684f
|
||||
OP_GMEmoteZone=0x1cfd # Was 0x0655
|
||||
OP_GMEmoteWorld=0x458e # Was 0x1935
|
||||
OP_GMFind=0x4a8f
|
||||
OP_GMKick=0x26a7
|
||||
OP_GMKill=0x51d3
|
||||
OP_GMNameChange=0x035f # Was 0x4434
|
||||
OP_GMLastName=0x46ce # Was 0x3077
|
||||
|
||||
# Misc Opcodes
|
||||
OP_InspectRequest=0x57bc
|
||||
OP_InspectAnswer=0x71ac
|
||||
OP_InspectMessageUpdate=0x4d25
|
||||
OP_BeginCast=0x318f
|
||||
OP_ColoredText=0x0000
|
||||
OP_ConsentResponse=0x384a
|
||||
OP_MemorizeSpell=0x217c
|
||||
OP_SwapSpell=0x0efa
|
||||
OP_CastSpell=0x1287
|
||||
OP_Consider=0x742b
|
||||
OP_FormattedMessage=0x1024
|
||||
OP_SimpleMessage=0x213f
|
||||
OP_Buff=0x659c
|
||||
OP_Illusion=0x312a
|
||||
OP_MoneyOnCorpse=0x5f44
|
||||
OP_RandomReply=0x106b
|
||||
OP_DenyResponse=0x2382
|
||||
OP_SkillUpdate=0x004c
|
||||
OP_GMTrainSkillConfirm=0x66dd # 0x3960
|
||||
OP_RandomReq=0x7b10
|
||||
OP_Death=0x6517
|
||||
OP_GMTraining=0x1966
|
||||
OP_GMEndTraining=0x4d6b
|
||||
OP_GMTrainSkill=0x2a85
|
||||
OP_Animation=0x7177
|
||||
OP_Begging=0x6703
|
||||
OP_Consent=0x1fd1
|
||||
OP_ConsentDeny=0x7a45
|
||||
OP_AutoFire=0x241e
|
||||
OP_PetCommands=0x0159
|
||||
OP_DeleteSpell=0x52e5
|
||||
OP_Surname=0x0423
|
||||
OP_ClearSurname=0x7d23
|
||||
OP_FaceChange=0x5578
|
||||
OP_SenseHeading=0x260a
|
||||
OP_Action=0x744c
|
||||
OP_ConsiderCorpse=0x5204
|
||||
OP_HideCorpse=0x49e1
|
||||
OP_CorpseDrag=0x0904
|
||||
OP_CorpseDrop=0x7037
|
||||
OP_Bug=0x73f4
|
||||
OP_Feedback=0x5602
|
||||
OP_Report=0x1414
|
||||
OP_Damage=0x6f15
|
||||
OP_ChannelMessage=0x2b2d
|
||||
OP_Assist=0x4478
|
||||
OP_AssistGroup=0x27f8
|
||||
OP_MoveCoin=0x0bcf
|
||||
OP_ZonePlayerToBind=0x0ecb
|
||||
OP_KeyRing=0x6857
|
||||
OP_WhoAllRequest=0x65ab
|
||||
OP_WhoAllResponse=0x7c88
|
||||
OP_FriendsWho=0x3956
|
||||
OP_ConfirmDelete=0x43a3
|
||||
OP_Logout=0x4ac6
|
||||
OP_Rewind=0x1745
|
||||
OP_TargetCommand=0x58e2
|
||||
OP_Hide=0x67fe
|
||||
OP_Jump=0x2060
|
||||
OP_Camp=0x28ec
|
||||
OP_Emote=0x373b
|
||||
OP_SetRunMode=0x009f
|
||||
OP_BankerChange=0x383c
|
||||
OP_TargetMouse=0x075d
|
||||
OP_MobHealth=0x37b1
|
||||
OP_InitialMobHealth=0x0000 # Unused?
|
||||
OP_TargetHoTT=0x0272
|
||||
OP_XTargetResponse=0x672f
|
||||
OP_XTargetRequest=0x45be
|
||||
OP_XTargetAutoAddHaters=0x792c
|
||||
OP_TargetBuffs=0x4f4b
|
||||
OP_BuffCreate=0x3377
|
||||
OP_BuffRemoveRequest=0x64f2
|
||||
OP_DeleteSpawn=0x7280
|
||||
OP_AutoAttack=0x109d
|
||||
OP_AutoAttack2=0x3526
|
||||
OP_Consume=0x4b70
|
||||
OP_MoveItem=0x32ee
|
||||
OP_DeleteItem=0x18ad
|
||||
OP_DeleteCharge=0x01b8
|
||||
OP_ItemPacket=0x368e
|
||||
OP_ItemLinkResponse=0x633c
|
||||
OP_ItemLinkClick=0x4cef
|
||||
OP_ItemPreview=0x6b5c
|
||||
OP_NewSpawn=0x6097
|
||||
OP_Track=0x17e5
|
||||
OP_TrackTarget=0x0029
|
||||
OP_TrackUnknown=0x4577
|
||||
OP_ClickDoor=0x3a8f
|
||||
OP_MoveDoor=0x08e8
|
||||
OP_RemoveAllDoors=0x700c
|
||||
OP_EnvDamage=0x51fd
|
||||
OP_BoardBoat=0x4211
|
||||
OP_Forage=0x5306
|
||||
OP_LeaveBoat=0x7617
|
||||
OP_ControlBoat=0x0ae7
|
||||
OP_SafeFallSuccess=0x2219
|
||||
OP_RezzComplete=0x760d
|
||||
OP_RezzRequest=0x3c21
|
||||
OP_RezzAnswer=0x701c
|
||||
OP_Shielding=0x48c1
|
||||
OP_RequestDuel=0x3af1
|
||||
OP_MobRename=0x2c57
|
||||
OP_AugmentItem=0x661b # Was 0x37cb
|
||||
OP_WeaponEquip1=0x34a7
|
||||
OP_WeaponEquip2=0x559a # Was 0x6022
|
||||
OP_WeaponUnequip2=0x2d25 # Was 0x0110
|
||||
OP_ApplyPoison=0x31e6
|
||||
OP_Save=0x4a39
|
||||
OP_TestBuff=0x7cb8 # Was 0x3772
|
||||
OP_CustomTitles=0x100e
|
||||
OP_Split=0x3a54
|
||||
OP_YellForHelp=0x4e56
|
||||
OP_LoadSpellSet=0x261d
|
||||
OP_Bandolier=0x7677
|
||||
OP_PotionBelt=0x1a3e # Was 0x4d3b
|
||||
OP_DuelResponse=0x6a46
|
||||
OP_DuelResponse2=0x68d3
|
||||
OP_SaveOnZoneReq=0x600d
|
||||
OP_ReadBook=0x72df
|
||||
OP_Dye=0x23b9
|
||||
OP_InterruptCast=0x048c
|
||||
OP_AAAction=0x424e
|
||||
OP_LeadershipExpToggle=0x6c55
|
||||
OP_LeadershipExpUpdate=0x2797
|
||||
OP_PurchaseLeadershipAA=0x0026
|
||||
OP_UpdateLeadershipAA=0x026
|
||||
OP_MarkNPC=0x5a58
|
||||
OP_MarkRaidNPC=0x74bd #unimplemented
|
||||
OP_ClearNPCMarks=0x2003
|
||||
OP_ClearRaidNPCMarks=0x20d3 #unimplemented
|
||||
OP_DelegateAbility=0x76b8
|
||||
OP_SetGroupTarget=0x2814
|
||||
OP_Charm=0x5d92
|
||||
OP_Stun=0x36a4
|
||||
OP_SendFindableNPCs=0x3897
|
||||
OP_FindPersonRequest=0x5cea
|
||||
OP_FindPersonReply=0x7e58
|
||||
OP_Sound=0x1a30
|
||||
OP_PetBuffWindow=0x5882
|
||||
OP_LevelAppearance=0x3bc9
|
||||
OP_Translocate=0x6580
|
||||
OP_Sacrifice=0x1821
|
||||
OP_PopupResponse=0x214a
|
||||
OP_OnLevelMessage=0x4fd0
|
||||
OP_AugmentInfo=0x0afb
|
||||
OP_Petition=0x5f03
|
||||
OP_SomeItemPacketMaybe=0x747c
|
||||
OP_PVPStats=0x6f4b # Unsure
|
||||
OP_PVPLeaderBoardRequest=0x3707
|
||||
OP_PVPLeaderBoardReply=0x25b7
|
||||
OP_PVPLeaderBoardDetailsRequest=0x15a9
|
||||
OP_PVPLeaderBoardDetailsReply=0x04aa
|
||||
OP_RestState=0x00f
|
||||
OP_RespawnWindow=0x28bc
|
||||
OP_LDoNButton=0x5327
|
||||
OP_SetStartCity=0x6326 # Was 0x2d1b
|
||||
OP_VoiceMacroIn=0x17fd
|
||||
OP_VoiceMacroOut=0x409a
|
||||
OP_ItemViewUnknown=0x2289
|
||||
OP_VetRewardsAvaliable=0x590e
|
||||
OP_VetClaimRequest=0x1126
|
||||
OP_VetClaimReply=0x16d4
|
||||
OP_DisciplineUpdate=0x759e # Was 0x2f05
|
||||
OP_DisciplineTimer=0x6989 # Was 0x5e3f
|
||||
OP_BecomeCorpse=0x0000 # Unused?
|
||||
OP_Action2=0x0000 # Unused?
|
||||
OP_MobUpdate=0x2c84
|
||||
OP_NPCMoveUpdate=0x189c
|
||||
OP_CameraEffect=0x127f
|
||||
OP_SpellEffect=0x5936
|
||||
OP_RemoveNimbusEffect=0xc693
|
||||
OP_AltCurrency=0x7121
|
||||
OP_AltCurrencyMerchantRequest=0x6b6d
|
||||
OP_AltCurrencyMerchantReply=0x74ec
|
||||
OP_AltCurrencyPurchase=0x61cb
|
||||
OP_AltCurrencySell=0x0165
|
||||
OP_AltCurrencySellSelection=0x5409
|
||||
OP_AltCurrencyReclaim=0x532a
|
||||
OP_CrystalCountUpdate=0x467f # Was 0x3f60
|
||||
OP_CrystalCreate=0x7aee # Was 0x5a82
|
||||
OP_CrystalReclaim=0x2439 # Was 0x7616
|
||||
OP_Untargetable=0x053c
|
||||
OP_IncreaseStats=0x70a3
|
||||
OP_Weblink=0x18d3
|
||||
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
|
||||
OP_OpenContainer=0x0000
|
||||
OP_Marquee=0x0000
|
||||
|
||||
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_DzExpeditionInfo=0x9119
|
||||
OP_DzExpeditionList=0x205f
|
||||
OP_DzMemberStatus=0x32f0
|
||||
OP_DzLeaderStatus=0x3de9
|
||||
OP_DzExpeditionEndsWarning=0x5189
|
||||
OP_DzMemberList=0x5ae4
|
||||
OP_DzCompass=0x3e0e # Was 0x4f09
|
||||
OP_DzChooseZone=0x0000 # Maybe 0x29d6
|
||||
|
||||
# New Opcodes
|
||||
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
|
||||
OP_ManaUpdate=0x3791
|
||||
OP_EnduranceUpdate=0x5f42
|
||||
OP_MobManaUpdate=0x2404
|
||||
OP_MobEnduranceUpdate=0x1c81
|
||||
|
||||
# Mercenary Opcodes
|
||||
OP_MercenaryDataUpdateRequest=0x7b89
|
||||
OP_MercenaryDataUpdate=0x61a4
|
||||
OP_MercenaryDataRequest=0x11c1
|
||||
OP_MercenaryDataResponse=0x72ce
|
||||
OP_MercenaryHire=0x7169
|
||||
OP_MercenaryDismiss=0x6e83
|
||||
OP_MercenaryTimerRequest=0x31e4
|
||||
OP_MercenaryTimer=0x0763
|
||||
OP_MercenaryUnknown1=0x5d26
|
||||
OP_MercenaryCommand=0x27f2
|
||||
OP_MercenarySuspendRequest=0x4407
|
||||
OP_MercenarySuspendResponse=0x6f03
|
||||
OP_MercenaryUnsuspendResponse=0x27a0
|
||||
|
||||
# Looting
|
||||
OP_LootRequest=0x0adf
|
||||
OP_EndLootRequest=0x30f7
|
||||
OP_LootItem=0x4dc9
|
||||
OP_LootComplete=0x55c4
|
||||
|
||||
# bazaar trader stuff:
|
||||
OP_BazaarSearch=0x39d6
|
||||
OP_TraderDelItem=0x0000
|
||||
OP_BecomeTrader=0x61b3
|
||||
OP_TraderShop=0x31df
|
||||
OP_Trader=0x4ef5 # Was 0x6790
|
||||
OP_TraderBuy=0x0000
|
||||
OP_Barter=0x243a
|
||||
OP_ShopItem=0x0000
|
||||
OP_BazaarInspect=0x0000
|
||||
OP_Bazaar=0x0000
|
||||
OP_TraderItemUpdate=0x0000
|
||||
|
||||
# pc/npc trading
|
||||
OP_TradeRequest=0x77b5
|
||||
OP_TradeAcceptClick=0x69e2
|
||||
OP_TradeRequestAck=0x14bf
|
||||
OP_TradeCoins=0x4206
|
||||
OP_FinishTrade=0x3993
|
||||
OP_CancelTrade=0x354c
|
||||
OP_TradeMoneyUpdate=0x68c2
|
||||
OP_MoneyUpdate=0x640c
|
||||
OP_TradeBusy=0x5505
|
||||
|
||||
# Sent after canceling trade or after closing tradeskill object
|
||||
OP_FinishWindow=0x7349
|
||||
OP_FinishWindow2=0x40ef
|
||||
|
||||
# Sent on Live for what seems to be item existance verification
|
||||
# Ex. Before Right Click Effect happens from items
|
||||
OP_ItemVerifyRequest=0x097b
|
||||
OP_ItemVerifyReply=0x2115
|
||||
|
||||
# merchant stuff
|
||||
OP_ShopPlayerSell=0x1901
|
||||
OP_ShopRequest=0x4fed
|
||||
OP_ShopEnd=0x30a8
|
||||
OP_ShopEndConfirm=0x3196
|
||||
OP_ShopPlayerBuy=0x04c
|
||||
OP_ShopDelItem=0x724f
|
||||
|
||||
# tradeskill stuff:
|
||||
OP_ClickObject=0x4aa1
|
||||
OP_ClickObjectAction=0x0c1e
|
||||
OP_ClearObject=0x7a11
|
||||
OP_RecipeDetails=0x40d7
|
||||
OP_RecipesFavorite=0x5c74
|
||||
OP_RecipesSearch=0x1db6
|
||||
OP_RecipeReply=0x6e02
|
||||
OP_RecipeAutoCombine=0x6261
|
||||
OP_TradeSkillCombine=0x579a
|
||||
|
||||
# Tribute Packets:
|
||||
OP_OpenGuildTributeMaster=0x378d
|
||||
OP_OpenTributeMaster=0x7666 # Was 0x40f5
|
||||
OP_SelectTribute=0x79fc
|
||||
OP_TributeItem=0x4f3e
|
||||
OP_TributeMoney=0x58fb # Was 0x6fed
|
||||
OP_TributeToggle=0x241d
|
||||
OP_TributePointUpdate=0x5300
|
||||
OP_TributeNPC=0x0000
|
||||
OP_GuildTributeInfo=0x0000
|
||||
OP_OpenTributeReply=0x0000
|
||||
OP_GuildTributeStatus=0x0000
|
||||
|
||||
# Adventure packets:
|
||||
OP_LeaveAdventure=0x5d18
|
||||
OP_AdventureFinish=0x400f
|
||||
OP_AdventureInfoRequest=0x3cb0
|
||||
OP_AdventureInfo=0x4c54
|
||||
OP_AdventureRequest=0x2c6c
|
||||
OP_AdventureDetails=0x5648
|
||||
OP_AdventureData=0x7171
|
||||
OP_AdventureUpdate=0x1b01
|
||||
OP_AdventureMerchantRequest=0x6922 # Was 654d
|
||||
OP_AdventureMerchantResponse=0x3e47 # Was 7949
|
||||
OP_AdventureMerchantPurchase=0x5b72 # Was 155a
|
||||
OP_AdventureMerchantSell=0x2f9b # Was 389c
|
||||
OP_AdventurePointsUpdate=0x65c3 # Was 7589
|
||||
OP_AdventureStatsRequest=0x5a62
|
||||
OP_AdventureStatsReply=0x2370
|
||||
OP_AdventureLeaderboardRequest=0x7093
|
||||
OP_AdventureLeaderboardReply=0x7f79
|
||||
|
||||
# Group Opcodes
|
||||
OP_GroupDisband=0x4c10
|
||||
OP_GroupInvite=0x1649
|
||||
OP_GroupFollow=0x05ce
|
||||
OP_GroupUpdate=0x3abb
|
||||
OP_GroupUpdateB=0x6194
|
||||
OP_GroupCancelInvite=0x0000
|
||||
OP_GroupAcknowledge=0x7323
|
||||
OP_GroupDelete=0x0f6c
|
||||
OP_CancelInvite=0x32c2
|
||||
OP_GroupFollow2=0x2a50
|
||||
OP_GroupInvite2=0x6c65
|
||||
OP_GroupDisbandYou=0x1ae5
|
||||
OP_GroupDisbandOther=0x74da
|
||||
OP_GroupLeaderChange=0x21b4
|
||||
OP_GroupRoles=0x70e2
|
||||
OP_GroupMakeLeader=0x4229
|
||||
OP_DoGroupLeadershipAbility=0x1fb5
|
||||
OP_GroupLeadershipAAUpdate=0x02cf
|
||||
OP_GroupMentor=0x5892
|
||||
OP_InspectBuffs=0x486c
|
||||
|
||||
# LFG/LFP Opcodes
|
||||
OP_LFGCommand=0x6060
|
||||
OP_LFGGetMatchesRequest=0x0340
|
||||
OP_LFGGetMatchesResponse=0x5048
|
||||
OP_LFPGetMatchesRequest=0x4d7d
|
||||
OP_LFPGetMatchesResponse=0x22c6
|
||||
OP_LFPCommand=0x49a9
|
||||
OP_LFGAppearance=0x0000
|
||||
OP_LFGResponse=0x0000
|
||||
|
||||
# Raid Opcodes
|
||||
OP_RaidInvite=0x55ac
|
||||
OP_RaidUpdate=0x3973
|
||||
OP_RaidJoin=0x0000
|
||||
|
||||
# Button-push commands
|
||||
OP_Taunt=0x2703
|
||||
OP_CombatAbility=0x3eba
|
||||
OP_SenseTraps=0x02af # Was 0x2ee0
|
||||
OP_PickPocket=0x39e8
|
||||
OP_DisarmTraps=0x78bf
|
||||
OP_Disarm=0x5ec8
|
||||
OP_Sneak=0x5d55
|
||||
OP_Fishing=0x1e2a
|
||||
OP_InstillDoubt=0x640e
|
||||
OP_FeignDeath=0x52fa
|
||||
OP_Mend=0x0ecf
|
||||
OP_Bind_Wound=0x0386
|
||||
OP_LDoNOpen=0x3d5c
|
||||
|
||||
# Task packets
|
||||
OP_TaskDescription=0x083
|
||||
OP_TaskActivity=0x3714
|
||||
OP_CompletedTasks=0x4eba
|
||||
OP_TaskActivityComplete=0x5e19
|
||||
OP_AcceptNewTask=0x0a23
|
||||
OP_CancelTask=0x08d3
|
||||
OP_TaskMemberList=0x5727 # Was 0x1656
|
||||
OP_OpenNewTasksWindow=0x48a2 # Was 0x11de
|
||||
OP_AvaliableTask=0x36e8 # Was 0x2377
|
||||
OP_TaskHistoryRequest=0x5f1c
|
||||
OP_TaskHistoryReply=0x3d05
|
||||
OP_DeclineAllTasks=0x0000
|
||||
|
||||
# Title opcodes
|
||||
OP_NewTitlesAvailable=0x0d32
|
||||
OP_RequestTitles=0x6344
|
||||
OP_SendTitleList=0x2d08
|
||||
OP_SetTitle=0x6527
|
||||
OP_SetTitleReply=0x4c21
|
||||
|
||||
# mail opcodes
|
||||
OP_Command=0x0000
|
||||
OP_MailboxHeader=0x0000
|
||||
OP_MailHeader=0x0000
|
||||
OP_MailBody=0x0000
|
||||
OP_NewMail=0x0000
|
||||
OP_SentConfirm=0x0000
|
||||
|
||||
########### Below this point should not be needed ###########
|
||||
|
||||
# This section are all unknown in Titanium
|
||||
OP_ForceFindPerson=0x0000
|
||||
OP_LocInfo=0x0000
|
||||
OP_ReloadUI=0x0000
|
||||
OP_ItemName=0x0000
|
||||
OP_ItemLinkText=0x0000
|
||||
OP_MultiLineMsg=0x0000
|
||||
OP_MendHPUpdate=0x0000
|
||||
OP_TargetReject=0x0000
|
||||
OP_SafePoint=0x0000
|
||||
OP_ApproveZone=0x0000
|
||||
OP_ZoneComplete=0x0000
|
||||
OP_ClientError=0x0000
|
||||
OP_DumpName=0x0000
|
||||
OP_Heartbeat=0x0000
|
||||
OP_CrashDump=0x0000
|
||||
OP_LoginComplete=0x0000
|
||||
|
||||
# discovered opcodes not yet used:
|
||||
OP_PickLockSuccess=0x0000
|
||||
OP_PlayMP3=0x0000
|
||||
OP_ReclaimCrystals=0x0000
|
||||
OP_DynamicWall=0x0000
|
||||
OP_OpenDiscordMerchant=0x0000
|
||||
OP_DiscordMerchantInventory=0x0000
|
||||
OP_GiveMoney=0x0000
|
||||
OP_RequestKnowledgeBase=0x0000
|
||||
OP_KnowledgeBase=0x0000
|
||||
OP_SlashAdventure=0x0000 # /adventure
|
||||
OP_BecomePVPPrompt=0x0000
|
||||
OP_MoveLogRequest=0x0000 # gone I think
|
||||
OP_MoveLogDisregard=0x0000 # gone I think
|
||||
|
||||
# named unknowns, to make looking for real unknown easier
|
||||
OP_AnnoyingZoneUnknown=0x0000
|
||||
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
|
||||
OP_QueryResponseThing=0x0000
|
||||
|
||||
|
||||
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
|
||||
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
|
||||
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
|
||||
|
||||
# Petition Opcodes
|
||||
OP_PetitionSearch=0x0000 search term for petition
|
||||
OP_PetitionSearchResults=0x0000 (list of?) matches from search
|
||||
OP_PetitionSearchText=0x0000 text results of search
|
||||
|
||||
OP_PetitionUpdate=0x0000
|
||||
OP_PetitionCheckout=0x0000
|
||||
OP_PetitionCheckIn=0x0000
|
||||
OP_PetitionQue=0x0000
|
||||
OP_PetitionUnCheckout=0x0000
|
||||
OP_PetitionDelete=0x0000
|
||||
OP_DeletePetition=0x0000
|
||||
OP_PetitionResolve=0x0000
|
||||
OP_PDeletePetition=0x0000
|
||||
OP_PetitionBug=0x0000
|
||||
OP_PetitionRefresh=0x0000
|
||||
OP_PetitionCheckout2=0x0000
|
||||
OP_PetitionViewPetition=0x0000
|
||||
|
||||
# Login opcodes
|
||||
OP_SessionReady=0x0000
|
||||
OP_Login=0x0000
|
||||
OP_ServerListRequest=0x0000
|
||||
OP_PlayEverquestRequest=0x0000
|
||||
OP_PlayEverquestResponse=0x0000
|
||||
OP_ChatMessage=0x0000
|
||||
OP_LoginAccepted=0x0000
|
||||
OP_ServerListResponse=0x0000
|
||||
OP_Poll=0x0000
|
||||
OP_EnterChat=0x0000
|
||||
OP_PollResponse=0x0000
|
||||
|
||||
# raw opcodes
|
||||
OP_RAWSessionRequest=0x0000
|
||||
OP_RAWSessionResponse=0x0000
|
||||
OP_RAWCombined=0x0000
|
||||
OP_RAWSessionDisconnect=0x0000
|
||||
OP_RAWKeepAlive=0x0000
|
||||
OP_RAWSessionStatRequest=0x0000
|
||||
OP_RAWSessionStatResponse=0x0000
|
||||
OP_RAWPacket=0x0000
|
||||
OP_RAWFragment=0x0000
|
||||
OP_RAWOutOfOrderAck=0x0000
|
||||
OP_RAWAck=0x0000
|
||||
OP_RAWAppCombined=0x0000
|
||||
OP_RAWOutOfSession=0x0000
|
||||
|
||||
# we need to document the differences between these packets to make identifying them easier
|
||||
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
|
||||
OP_InitialHPUpdate=0x0000
|
||||
|
||||
OP_ItemRecastDelay=0x08a6
|
||||
@@ -0,0 +1,661 @@
|
||||
# ShowEQ Import Notes:
|
||||
# ZERO THE FILE first
|
||||
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
|
||||
# Unknown Mapping:
|
||||
# OP_Action2 -> OP_Damage
|
||||
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
|
||||
# Name Differences:
|
||||
# OP_CancelInvite -> OP_GroupCancelInvite
|
||||
# OP_GMFind -> OP_FindPersonRequest
|
||||
# OP_CommonMessage -> OP_ChannelMessage
|
||||
|
||||
OP_Unknown=0x0000
|
||||
OP_ExploreUnknown=0x0000 used for unknown explorer
|
||||
|
||||
# world packets
|
||||
# Required to reach Char Select:
|
||||
OP_SendLoginInfo=0x7a09
|
||||
OP_ApproveWorld=0x7499
|
||||
OP_LogServer=0x7ceb
|
||||
OP_SendCharInfo=0x00d2
|
||||
OP_ExpansionInfo=0x590d
|
||||
OP_GuildsList=0x7056
|
||||
OP_EnterWorld=0x0641
|
||||
OP_PostEnterWorld=0x6259
|
||||
OP_World_Client_CRC1=0x12cc
|
||||
OP_World_Client_CRC2=0x0f13
|
||||
OP_SendSpellChecksum=0x0000
|
||||
OP_SendSkillCapsChecksum=0x0000
|
||||
|
||||
# Character Select Related:
|
||||
OP_SendMaxCharacters=0x05a8
|
||||
OP_SendMembership=0x057b
|
||||
OP_SendMembershipDetails=0x6a98
|
||||
OP_CharacterCreateRequest=0x655c
|
||||
OP_CharacterCreate=0x6bbf
|
||||
OP_DeleteCharacter=0x1808
|
||||
OP_RandomNameGenerator=0x5954
|
||||
OP_ApproveName=0x56a2
|
||||
OP_MOTD=0x0c22
|
||||
OP_SetChatServer=0x1bc5
|
||||
OP_SetChatServer2=0x7db5
|
||||
OP_ZoneServerInfo=0x6ef5
|
||||
OP_WorldComplete=0x4493
|
||||
OP_WorldUnknown001=0x2958
|
||||
OP_FloatListThing=0x46c6
|
||||
|
||||
# Reasons for Disconnect:
|
||||
OP_ZoneUnavail=0x4c44
|
||||
OP_WorldClientReady=0x23c1
|
||||
OP_CharacterStillInZone=0x0000
|
||||
OP_WorldChecksumFailure=0x0000
|
||||
OP_WorldLoginFailed=0x0000
|
||||
OP_WorldLogout=0x0000
|
||||
OP_WorldLevelTooHigh=0x0000
|
||||
OP_CharInacessable=0x0000
|
||||
OP_UserCompInfo=0x0000
|
||||
OP_SendExeChecksum=0x0000
|
||||
OP_SendBaseDataChecksum=0x0000
|
||||
|
||||
# Zone in opcodes
|
||||
OP_AckPacket=0x471d
|
||||
OP_ZoneEntry=0x5089
|
||||
OP_ReqNewZone=0x7887
|
||||
OP_NewZone=0x1795
|
||||
OP_ZoneSpawns=0x5237
|
||||
OP_PlayerProfile=0x6506
|
||||
OP_TimeOfDay=0x5070
|
||||
OP_LevelUpdate=0x1eec
|
||||
OP_Stamina=0x2a79
|
||||
OP_RequestClientZoneChange=0x3fcf
|
||||
OP_ZoneChange=0x2d18
|
||||
OP_LockoutTimerInfo=0x0000
|
||||
OP_ZoneServerReady=0x0000
|
||||
OP_ZoneInUnknown=0x0000
|
||||
OP_LogoutReply=0x0000
|
||||
OP_PreLogoutReply=0x0000
|
||||
|
||||
# Required to fully log in
|
||||
OP_SpawnAppearance=0x0971
|
||||
OP_ChangeSize=0x4707
|
||||
OP_TributeUpdate=0x5961
|
||||
OP_TributeTimer=0x073d
|
||||
OP_SendTributes=0x729b
|
||||
OP_SendGuildTributes=0x4d5e
|
||||
OP_TributeInfo=0x4254
|
||||
OP_Weather=0x661e
|
||||
OP_ReqClientSpawn=0x35fa
|
||||
OP_SpawnDoor=0x7291
|
||||
OP_GroundSpawn=0x6fca
|
||||
OP_SendZonepoints=0x69a4
|
||||
OP_BlockedBuffs=0x4d25
|
||||
OP_RemoveBlockedBuffs=0x3033
|
||||
OP_ClearBlockedBuffs=0x6b3d
|
||||
OP_WorldObjectsSent=0x5ae2
|
||||
OP_SendExpZonein=0x5f8e
|
||||
OP_SendAATable=0x66b5
|
||||
OP_RespondAA=0x7a27
|
||||
OP_UpdateAA=0x66f0
|
||||
OP_SendAAStats=0x43c8
|
||||
OP_AAExpUpdate=0x7e92
|
||||
OP_ExpUpdate=0x20ed
|
||||
OP_HPUpdate=0x2828
|
||||
OP_ManaChange=0x1287
|
||||
OP_TGB=0x0000
|
||||
OP_SpecialMesg=0x0000
|
||||
OP_GuildMemberList=0x0e48
|
||||
OP_GuildMOTD=0x3e13
|
||||
OP_CharInventory=0x5ca6
|
||||
OP_WearChange=0x7994
|
||||
OP_ClientUpdate=0x7dfc
|
||||
OP_ClientReady=0x345d # 0x422d
|
||||
OP_SetServerFilter=0x444d
|
||||
|
||||
# Guild Opcodes - Disabled until crashes are resolved in RoF
|
||||
OP_GetGuildMOTD=0x36e0 # Was 0x35dc
|
||||
OP_GetGuildMOTDReply=0x4f1f # Was 0x4586
|
||||
OP_GuildMemberUpdate=0x69b9 # Was 0x5643
|
||||
OP_GuildInvite=0x7099
|
||||
OP_GuildRemove=0x1444
|
||||
OP_GuildPeace=0x084e
|
||||
OP_SetGuildMOTD=0x0b0b
|
||||
OP_GuildList=0x0000
|
||||
OP_GuildWar=0x46ce
|
||||
OP_GuildLeader=0x2f3e
|
||||
OP_GuildDelete=0x3708
|
||||
OP_GuildInviteAccept=0x7053
|
||||
OP_GuildDemote=0x2d4e
|
||||
OP_GuildPromote=0x0000
|
||||
OP_GuildPublicNote=0x5053
|
||||
OP_GuildManageBanker=0x748f # Was 0x0737
|
||||
OP_GuildBank=0x5134 # Was 0x10c3
|
||||
OP_SetGuildRank=0x0b9c
|
||||
OP_GuildUpdateURLAndChannel=0x6084
|
||||
OP_GuildStatus=0x7326
|
||||
OP_GuildCreate=0x1dc8 # or maybe 0x086e
|
||||
OP_GuildMemberLevelUpdate=0x0000 # Unused?
|
||||
OP_ZoneGuildList=0x0000 # Unused?
|
||||
OP_GetGuildsList=0x0000 # Unused?
|
||||
OP_LFGuild=0x0000
|
||||
OP_GuildManageRemove=0x0000
|
||||
OP_GuildManageAdd=0x0000
|
||||
OP_GuildManageStatus=0x0000
|
||||
|
||||
# GM/Guide Opcodes
|
||||
OP_GMServers=0x08c1
|
||||
OP_GMBecomeNPC=0x3ae1
|
||||
OP_GMZoneRequest=0x62ac
|
||||
OP_GMZoneRequest2=0x7e1a
|
||||
OP_GMGoto=0x7d8e
|
||||
OP_GMSearchCorpse=0x46b1
|
||||
OP_GMHideMe=0x79c5
|
||||
OP_GMDelCorpse=0x607e
|
||||
OP_GMApproval=0x6db5
|
||||
OP_GMToggle=0x2097
|
||||
OP_GMSummon=0x486f # Was 0x684f
|
||||
OP_GMEmoteZone=0x1cfd # Was 0x0655
|
||||
OP_GMEmoteWorld=0x458e # Was 0x1935
|
||||
OP_GMFind=0x4a8f
|
||||
OP_GMKick=0x26a7
|
||||
OP_GMKill=0x51d3
|
||||
OP_GMNameChange=0x035f # Was 0x4434
|
||||
OP_GMLastName=0x16ce # Was 0x3077
|
||||
|
||||
# Misc Opcodes
|
||||
OP_InspectRequest=0x57bc
|
||||
OP_InspectAnswer=0x71ac
|
||||
OP_InspectMessageUpdate=0x6f8b
|
||||
OP_BeginCast=0x318f
|
||||
OP_ColoredText=0x0000
|
||||
OP_ConsentResponse=0x384a
|
||||
OP_MemorizeSpell=0x6a0d
|
||||
OP_SwapSpell=0x0efa
|
||||
OP_CastSpell=0x4466
|
||||
OP_Consider=0x742b
|
||||
OP_FormattedMessage=0x1024
|
||||
OP_SimpleMessage=0x213f
|
||||
OP_Buff=0x3a54
|
||||
OP_Illusion=0x312a
|
||||
OP_MoneyOnCorpse=0x5f44
|
||||
OP_RandomReply=0x106b
|
||||
OP_DenyResponse=0x2382
|
||||
OP_SkillUpdate=0x2264
|
||||
OP_GMTrainSkillConfirm=0x19aa # 0x3960
|
||||
OP_RandomReq=0x7b10
|
||||
OP_Death=0x6517
|
||||
OP_GMTraining=0x1966
|
||||
OP_GMEndTraining=0x4d6b
|
||||
OP_GMTrainSkill=0x2a85
|
||||
OP_Animation=0x7177
|
||||
OP_Begging=0x6703
|
||||
OP_Consent=0x1fd1
|
||||
OP_ConsentDeny=0x7a45
|
||||
OP_AutoFire=0x241e
|
||||
OP_PetCommands=0x0159
|
||||
OP_DeleteSpell=0x52e5
|
||||
OP_Surname=0x0423
|
||||
OP_ClearSurname=0x7d23
|
||||
OP_FaceChange=0x5578
|
||||
OP_SenseHeading=0x217c
|
||||
OP_Action=0x744c
|
||||
OP_ConsiderCorpse=0x5204
|
||||
OP_HideCorpse=0x67fc
|
||||
OP_CorpseDrag=0x7eec
|
||||
OP_CorpseDrop=0x0904
|
||||
OP_Bug=0x73f4
|
||||
OP_Feedback=0x5602
|
||||
OP_Report=0x1414
|
||||
OP_Damage=0x6f15
|
||||
OP_ChannelMessage=0x2b2d
|
||||
OP_Assist=0x4478
|
||||
OP_AssistGroup=0x27f8
|
||||
OP_MoveCoin=0x0bcf
|
||||
OP_ZonePlayerToBind=0x0ecb
|
||||
OP_KeyRing=0x6857
|
||||
OP_WhoAllRequest=0x65ab
|
||||
OP_WhoAllResponse=0x407a
|
||||
OP_FriendsWho=0x3956
|
||||
OP_ConfirmDelete=0x43a3
|
||||
OP_Logout=0x4ac6
|
||||
OP_Rewind=0x1745
|
||||
OP_TargetCommand=0x58e2
|
||||
OP_Hide=0x5d55
|
||||
OP_Jump=0x2060
|
||||
OP_Camp=0x28ec
|
||||
OP_Emote=0x373b
|
||||
OP_SetRunMode=0x009f
|
||||
OP_BankerChange=0x383c
|
||||
OP_TargetMouse=0x075d
|
||||
OP_MobHealth=0x2dd3
|
||||
OP_InitialMobHealth=0x0000 # Unused?
|
||||
OP_TargetHoTT=0x486c
|
||||
OP_XTargetResponse=0x4d59
|
||||
OP_XTargetRequest=0x3763
|
||||
OP_XTargetAutoAddHaters=0x672f
|
||||
OP_TargetBuffs=0x4f4b
|
||||
OP_BuffCreate=0x3377
|
||||
OP_BuffRemoveRequest=0x49bc
|
||||
OP_DeleteSpawn=0x7280
|
||||
OP_AutoAttack=0x109d
|
||||
OP_AutoAttack2=0x3526
|
||||
OP_Consume=0x4b70
|
||||
OP_MoveItem=0x32ee
|
||||
OP_DeleteItem=0x18ad
|
||||
OP_DeleteCharge=0x01b8
|
||||
OP_ItemPacket=0x368e
|
||||
OP_ItemLinkResponse=0x70c0
|
||||
OP_ItemLinkClick=0x4cef
|
||||
OP_ItemPreview=0x7f80
|
||||
OP_NewSpawn=0x0b04
|
||||
OP_Track=0x17e5
|
||||
OP_TrackTarget=0x0029
|
||||
OP_TrackUnknown=0x0f83
|
||||
OP_ClickDoor=0x3a8f
|
||||
OP_MoveDoor=0x08e8
|
||||
OP_RemoveAllDoors=0x700c
|
||||
OP_EnvDamage=0x51fd
|
||||
OP_BoardBoat=0x31e6
|
||||
OP_Forage=0x5306
|
||||
OP_LeaveBoat=0x4211
|
||||
OP_ControlBoat=0x0ae7
|
||||
OP_SafeFallSuccess=0x6dbc
|
||||
OP_RezzComplete=0x760d
|
||||
OP_RezzRequest=0x3c21
|
||||
OP_RezzAnswer=0x701c
|
||||
OP_Shielding=0x48c1
|
||||
OP_RequestDuel=0x3af1
|
||||
OP_MobRename=0x2c57
|
||||
OP_AugmentItem=0x661b # Was 0x37cb
|
||||
OP_WeaponEquip1=0x34a7
|
||||
OP_WeaponEquip2=0x559a # Was 0x6022
|
||||
OP_WeaponUnequip2=0x2d25 # Was 0x0110
|
||||
OP_ApplyPoison=0x1b0c
|
||||
OP_Save=0x4a39
|
||||
OP_TestBuff=0x7cb8 # Was 0x3772
|
||||
OP_CustomTitles=0x100e
|
||||
OP_Split=0x0522
|
||||
OP_YellForHelp=0x4e56
|
||||
OP_LoadSpellSet=0x261d
|
||||
OP_Bandolier=0x7677
|
||||
OP_PotionBelt=0x1a3e # Was 0x4d3b
|
||||
OP_DuelResponse=0x6a46
|
||||
OP_DuelResponse2=0x68d3
|
||||
OP_SaveOnZoneReq=0x2c7a
|
||||
OP_ReadBook=0x72df
|
||||
OP_Dye=0x23b9
|
||||
OP_InterruptCast=0x048c
|
||||
OP_AAAction=0x424e
|
||||
OP_LeadershipExpToggle=0x74bd
|
||||
OP_LeadershipExpUpdate=0x4ee2
|
||||
OP_PurchaseLeadershipAA=0x6c55
|
||||
OP_UpdateLeadershipAA=0x0026
|
||||
OP_MarkNPC=0x5a58
|
||||
OP_MarkRaidNPC=0x0000 #unimplemented
|
||||
OP_ClearNPCMarks=0x0272
|
||||
OP_ClearRaidNPCMarks=0x0000 #unimplemented
|
||||
OP_DelegateAbility=0x4c9d
|
||||
OP_SetGroupTarget=0x026
|
||||
OP_Charm=0x5d92
|
||||
OP_Stun=0x36a4
|
||||
OP_SendFindableNPCs=0x587e
|
||||
OP_FindPersonRequest=0x5cea
|
||||
OP_FindPersonReply=0x7e58
|
||||
OP_Sound=0x1a30
|
||||
OP_PetBuffWindow=0x5882
|
||||
OP_LevelAppearance=0x3bc9
|
||||
OP_Translocate=0x6580
|
||||
OP_Sacrifice=0x1821
|
||||
OP_PopupResponse=0x214a
|
||||
OP_OnLevelMessage=0x4fd0
|
||||
OP_AugmentInfo=0x0afb
|
||||
OP_Petition=0x4101
|
||||
OP_SomeItemPacketMaybe=0x747c
|
||||
OP_PVPStats=0x6f4b # Unsure
|
||||
OP_PVPLeaderBoardRequest=0x3707
|
||||
OP_PVPLeaderBoardReply=0x25b7
|
||||
OP_PVPLeaderBoardDetailsRequest=0x15a9
|
||||
OP_PVPLeaderBoardDetailsReply=0x04aa
|
||||
OP_RestState=0x000f
|
||||
OP_RespawnWindow=0x28bc
|
||||
OP_LDoNButton=0x5327
|
||||
OP_SetStartCity=0x6326 # Was 0x2d1b
|
||||
OP_VoiceMacroIn=0x17fd
|
||||
OP_VoiceMacroOut=0x409a
|
||||
OP_ItemViewUnknown=0x465b
|
||||
OP_VetRewardsAvaliable=0x6773
|
||||
OP_VetClaimRequest=0x1126
|
||||
OP_VetClaimReply=0x16d4
|
||||
OP_DisciplineUpdate=0x759e # Was 0x2f05
|
||||
OP_DisciplineTimer=0x6989 # Was 0x5e3f
|
||||
OP_BecomeCorpse=0x0000 # Unused?
|
||||
OP_Action2=0x0000 # Unused?
|
||||
OP_MobUpdate=0x2c84
|
||||
OP_NPCMoveUpdate=0x5892
|
||||
OP_CameraEffect=0x127f
|
||||
OP_SpellEffect=0x5936
|
||||
OP_RemoveNimbusEffect=0xc693
|
||||
OP_AltCurrency=0x3ee6
|
||||
OP_AltCurrencyMerchantRequest=0x05f0
|
||||
OP_AltCurrencyMerchantReply=0x0165
|
||||
OP_AltCurrencyPurchase=0x6b6d
|
||||
OP_AltCurrencySell=0x61cb
|
||||
OP_AltCurrencySellSelection=0x74ec
|
||||
OP_AltCurrencyReclaim=0x27a2
|
||||
OP_CrystalCountUpdate=0x467f # Was 0x3f60
|
||||
OP_CrystalCreate=0x7aee # Was 0x5a82
|
||||
OP_CrystalReclaim=0x2439 # Was 0x7616
|
||||
OP_Untargetable=0x1456
|
||||
OP_IncreaseStats=0x70a3
|
||||
OP_Weblink=0x18d3
|
||||
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
|
||||
OP_OpenContainer=0x0000
|
||||
OP_Marquee=0x0000
|
||||
|
||||
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_DzExpeditionInfo=0x9119
|
||||
OP_DzExpeditionList=0x205f
|
||||
OP_DzMemberStatus=0x32f0
|
||||
OP_DzLeaderStatus=0x3de9
|
||||
OP_DzExpeditionEndsWarning=0x5189
|
||||
OP_DzMemberList=0x0000
|
||||
OP_DzCompass=0x3e0e # Was 0x4f09
|
||||
OP_DzChooseZone=0x0000 # Maybe 0x29d6
|
||||
|
||||
# New Opcodes
|
||||
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
|
||||
OP_ManaUpdate=0x3791
|
||||
OP_EnduranceUpdate=0x5f42
|
||||
OP_MobManaUpdate=0x2925
|
||||
OP_MobEnduranceUpdate=0x7314
|
||||
|
||||
# Mercenary Opcodes
|
||||
OP_MercenaryDataUpdateRequest=0x2bcb
|
||||
OP_MercenaryDataUpdate=0x7b89
|
||||
OP_MercenaryDataRequest=0x61a4
|
||||
OP_MercenaryDataResponse=0x11c1
|
||||
OP_MercenaryHire=0x72ce
|
||||
OP_MercenaryDismiss=0x7169
|
||||
OP_MercenaryTimerRequest=0x6e83
|
||||
OP_MercenaryTimer=0x31e4
|
||||
OP_MercenaryUnknown1=0x20b9
|
||||
OP_MercenaryCommand=0x1b37
|
||||
OP_MercenarySuspendRequest=0x6e9f
|
||||
OP_MercenarySuspendResponse=0x4407
|
||||
OP_MercenaryUnsuspendResponse=0x6f03
|
||||
|
||||
# Looting
|
||||
OP_LootRequest=0x0adf
|
||||
OP_EndLootRequest=0x30f7
|
||||
OP_LootItem=0x4dc9
|
||||
OP_LootComplete=0x55c4
|
||||
|
||||
# bazaar trader stuff:
|
||||
OP_BazaarSearch=0x39d6
|
||||
OP_TraderDelItem=0x0000
|
||||
OP_BecomeTrader=0x61b3
|
||||
OP_TraderShop=0x5eca
|
||||
OP_Trader=0x4ef5 # Was 0x6790
|
||||
OP_TraderBuy=0x0000
|
||||
OP_Barter=0x243a
|
||||
OP_ShopItem=0x0000
|
||||
OP_BazaarInspect=0x0000
|
||||
OP_Bazaar=0x0000
|
||||
OP_TraderItemUpdate=0x0000
|
||||
|
||||
# pc/npc trading
|
||||
OP_TradeRequest=0x77b5
|
||||
OP_TradeAcceptClick=0x69e2
|
||||
OP_TradeRequestAck=0x14bf
|
||||
OP_TradeCoins=0x4206
|
||||
OP_FinishTrade=0x3993
|
||||
OP_CancelTrade=0x354c
|
||||
OP_TradeMoneyUpdate=0x68c2
|
||||
OP_MoneyUpdate=0x640c
|
||||
OP_TradeBusy=0x5505
|
||||
|
||||
# Sent after canceling trade or after closing tradeskill object
|
||||
OP_FinishWindow=0x7349
|
||||
OP_FinishWindow2=0x40ef
|
||||
|
||||
# Sent on Live for what seems to be item existance verification
|
||||
# Ex. Before Right Click Effect happens from items
|
||||
OP_ItemVerifyRequest=0x189c
|
||||
OP_ItemVerifyReply=0x097b
|
||||
|
||||
# merchant stuff
|
||||
OP_ShopPlayerSell=0x3de3
|
||||
OP_ShopRequest=0x4fed
|
||||
OP_ShopEnd=0x30a8
|
||||
OP_ShopEndConfirm=0x3196
|
||||
OP_ShopPlayerBuy=0x004c
|
||||
OP_ShopDelItem=0x724f
|
||||
|
||||
# tradeskill stuff:
|
||||
OP_ClickObject=0x4aa1
|
||||
OP_ClickObjectAction=0x0c1e
|
||||
OP_ClearObject=0x7a11
|
||||
OP_RecipeDetails=0x6e02
|
||||
OP_RecipesFavorite=0x5c74
|
||||
OP_RecipesSearch=0x6290
|
||||
OP_RecipeReply=0x1db6
|
||||
OP_RecipeAutoCombine=0x40d7
|
||||
OP_TradeSkillCombine=0x579a
|
||||
|
||||
# Tribute Packets:
|
||||
OP_OpenGuildTributeMaster=0x49ea
|
||||
OP_OpenTributeMaster=0x7666 # Was 0x40f5
|
||||
OP_SelectTribute=0x79fc
|
||||
OP_TributeItem=0x4f3e
|
||||
OP_TributeMoney=0x58fb # Was 0x6fed
|
||||
OP_TributeToggle=0x4e32
|
||||
OP_TributePointUpdate=0x5300
|
||||
OP_TributeNPC=0x0000
|
||||
OP_GuildTributeInfo=0x0000
|
||||
OP_OpenTributeReply=0x0000
|
||||
OP_GuildTributeStatus=0x0000
|
||||
|
||||
# Adventure packets:
|
||||
OP_LeaveAdventure=0x5d18
|
||||
OP_AdventureFinish=0x400f
|
||||
OP_AdventureInfoRequest=0x3cb0
|
||||
OP_AdventureInfo=0x4c54
|
||||
OP_AdventureRequest=0x2c6c
|
||||
OP_AdventureDetails=0x5648
|
||||
OP_AdventureData=0x7171
|
||||
OP_AdventureUpdate=0x1b01
|
||||
OP_AdventureMerchantRequest=0x6922 # Was 654d
|
||||
OP_AdventureMerchantResponse=0x3e47 # Was 7949
|
||||
OP_AdventureMerchantPurchase=0x5b72 # Was 155a
|
||||
OP_AdventureMerchantSell=0x2f9b # Was 389c
|
||||
OP_AdventurePointsUpdate=0x65c3 # Was 7589
|
||||
OP_AdventureStatsRequest=0x5a62
|
||||
OP_AdventureStatsReply=0x2370
|
||||
OP_AdventureLeaderboardRequest=0x7093
|
||||
OP_AdventureLeaderboardReply=0x7f79
|
||||
|
||||
# Group Opcodes
|
||||
OP_GroupDisband=0x4c10
|
||||
OP_GroupInvite=0x1649
|
||||
OP_GroupFollow=0x05ce
|
||||
OP_GroupUpdate=0x4ced
|
||||
OP_GroupUpdateB=0x0cbc
|
||||
OP_GroupCancelInvite=0x0000
|
||||
OP_GroupAcknowledge=0x04d0
|
||||
OP_GroupDelete=0x3abb
|
||||
OP_CancelInvite=0x32c2
|
||||
OP_GroupFollow2=0x2a50
|
||||
OP_GroupInvite2=0x6c65
|
||||
OP_GroupDisbandYou=0x7323
|
||||
OP_GroupDisbandOther=0x88a1
|
||||
OP_GroupLeaderChange=0x74da
|
||||
OP_GroupRoles=0x4d9f
|
||||
OP_GroupMakeLeader=0x4229
|
||||
OP_DoGroupLeadershipAbility=0x6eae
|
||||
OP_GroupLeadershipAAUpdate=0x6298
|
||||
OP_GroupMentor=0x3342
|
||||
OP_InspectBuffs=0x0000
|
||||
|
||||
# LFG/LFP Opcodes
|
||||
OP_LFGCommand=0x6060
|
||||
OP_LFGGetMatchesRequest=0x0340
|
||||
OP_LFGGetMatchesResponse=0x5048
|
||||
OP_LFPGetMatchesRequest=0x4d7d
|
||||
OP_LFPGetMatchesResponse=0x22c6
|
||||
OP_LFPCommand=0x49a9
|
||||
OP_LFGAppearance=0x0000
|
||||
OP_LFGResponse=0x0000
|
||||
|
||||
# Raid Opcodes
|
||||
OP_RaidInvite=0x3973
|
||||
OP_RaidUpdate=0x56fe
|
||||
OP_RaidJoin=0x0000
|
||||
|
||||
# Button-push commands
|
||||
OP_Taunt=0x2703
|
||||
OP_CombatAbility=0x3eba
|
||||
OP_SenseTraps=0x02af # Was 0x2ee0
|
||||
OP_PickPocket=0x39e8
|
||||
OP_DisarmTraps=0x0000
|
||||
OP_Disarm=0x5ec8
|
||||
OP_Sneak=0x4577
|
||||
OP_Fishing=0x1e2a
|
||||
OP_InstillDoubt=0x640e
|
||||
OP_FeignDeath=0x52fa
|
||||
OP_Mend=0x0ecf
|
||||
OP_Bind_Wound=0x0386
|
||||
OP_LDoNOpen=0x3d5c
|
||||
|
||||
# Task packets
|
||||
OP_TaskDescription=0x0083
|
||||
OP_TaskActivity=0x083
|
||||
OP_CompletedTasks=0x4eba
|
||||
OP_TaskActivityComplete=0x7037
|
||||
OP_AcceptNewTask=0x0a23
|
||||
OP_CancelTask=0x3714
|
||||
OP_TaskMemberList=0x5727 # Was 0x1656
|
||||
OP_OpenNewTasksWindow=0x48a2 # Was 0x11de
|
||||
OP_AvaliableTask=0x36e8 # Was 0x2377
|
||||
OP_TaskHistoryRequest=0x5f1c
|
||||
OP_TaskHistoryReply=0x3d05
|
||||
OP_DeclineAllTasks=0x0000
|
||||
|
||||
# Title opcodes
|
||||
OP_NewTitlesAvailable=0x0d32
|
||||
OP_RequestTitles=0x6344
|
||||
OP_SendTitleList=0x2d08
|
||||
OP_SetTitle=0x6527
|
||||
OP_SetTitleReply=0x4c21
|
||||
|
||||
# mail opcodes
|
||||
OP_Command=0x0000
|
||||
OP_MailboxHeader=0x0000
|
||||
OP_MailHeader=0x0000
|
||||
OP_MailBody=0x0000
|
||||
OP_NewMail=0x0000
|
||||
OP_SentConfirm=0x0000
|
||||
|
||||
########### Below this point should not be needed ###########
|
||||
|
||||
# This section are all unknown in Titanium
|
||||
OP_ForceFindPerson=0x0000
|
||||
OP_LocInfo=0x0000
|
||||
OP_ReloadUI=0x0000
|
||||
OP_ItemName=0x0000
|
||||
OP_ItemLinkText=0x0000
|
||||
OP_MultiLineMsg=0x0000
|
||||
OP_MendHPUpdate=0x0000
|
||||
OP_TargetReject=0x0000
|
||||
OP_SafePoint=0x0000
|
||||
OP_ApproveZone=0x0000
|
||||
OP_ZoneComplete=0x0000
|
||||
OP_ClientError=0x0000
|
||||
OP_DumpName=0x0000
|
||||
OP_Heartbeat=0x0000
|
||||
OP_CrashDump=0x0000
|
||||
OP_LoginComplete=0x0000
|
||||
|
||||
# discovered opcodes not yet used:
|
||||
OP_PickLockSuccess=0x0000
|
||||
OP_PlayMP3=0x0000
|
||||
OP_ReclaimCrystals=0x0000
|
||||
OP_DynamicWall=0x0000
|
||||
OP_OpenDiscordMerchant=0x0000
|
||||
OP_DiscordMerchantInventory=0x0000
|
||||
OP_GiveMoney=0x0000
|
||||
OP_RequestKnowledgeBase=0x0000
|
||||
OP_KnowledgeBase=0x0000
|
||||
OP_SlashAdventure=0x0000 # /adventure
|
||||
OP_BecomePVPPrompt=0x0000
|
||||
OP_MoveLogRequest=0x0000 # gone I think
|
||||
OP_MoveLogDisregard=0x0000 # gone I think
|
||||
|
||||
# named unknowns, to make looking for real unknown easier
|
||||
OP_AnnoyingZoneUnknown=0x0000
|
||||
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
|
||||
OP_QueryResponseThing=0x0000
|
||||
|
||||
|
||||
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
|
||||
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
|
||||
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
|
||||
|
||||
# Petition Opcodes
|
||||
OP_PetitionSearch=0x0000 search term for petition
|
||||
OP_PetitionSearchResults=0x0000 (list of?) matches from search
|
||||
OP_PetitionSearchText=0x0000 text results of search
|
||||
|
||||
OP_PetitionUpdate=0x0000
|
||||
OP_PetitionCheckout=0x0000
|
||||
OP_PetitionCheckIn=0x0000
|
||||
OP_PetitionQue=0x0000
|
||||
OP_PetitionUnCheckout=0x0000
|
||||
OP_PetitionDelete=0x0000
|
||||
OP_DeletePetition=0x0000
|
||||
OP_PetitionResolve=0x0000
|
||||
OP_PDeletePetition=0x0000
|
||||
OP_PetitionBug=0x0000
|
||||
OP_PetitionRefresh=0x0000
|
||||
OP_PetitionCheckout2=0x0000
|
||||
OP_PetitionViewPetition=0x0000
|
||||
|
||||
# Login opcodes
|
||||
OP_SessionReady=0x0000
|
||||
OP_Login=0x0000
|
||||
OP_ServerListRequest=0x0000
|
||||
OP_PlayEverquestRequest=0x0000
|
||||
OP_PlayEverquestResponse=0x0000
|
||||
OP_ChatMessage=0x0000
|
||||
OP_LoginAccepted=0x0000
|
||||
OP_ServerListResponse=0x0000
|
||||
OP_Poll=0x0000
|
||||
OP_EnterChat=0x0000
|
||||
OP_PollResponse=0x0000
|
||||
|
||||
# raw opcodes
|
||||
OP_RAWSessionRequest=0x0000
|
||||
OP_RAWSessionResponse=0x0000
|
||||
OP_RAWCombined=0x0000
|
||||
OP_RAWSessionDisconnect=0x0000
|
||||
OP_RAWKeepAlive=0x0000
|
||||
OP_RAWSessionStatRequest=0x0000
|
||||
OP_RAWSessionStatResponse=0x0000
|
||||
OP_RAWPacket=0x0000
|
||||
OP_RAWFragment=0x0000
|
||||
OP_RAWOutOfOrderAck=0x0000
|
||||
OP_RAWAck=0x0000
|
||||
OP_RAWAppCombined=0x0000
|
||||
OP_RAWOutOfSession=0x0000
|
||||
|
||||
# we need to document the differences between these packets to make identifying them easier
|
||||
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
|
||||
OP_InitialHPUpdate=0x0000
|
||||
|
||||
OP_ItemRecastDelay=0x08a6
|
||||
@@ -0,0 +1,334 @@
|
||||
5001|1_task_system.sql
|
||||
# 5002|2_optional_maxclients.sql
|
||||
# 5003|14_optional_merchantlist.sql
|
||||
5004|35_task_stepped.sql
|
||||
5005|42_task_min_maxlevel.sql
|
||||
5006|55_zone_shutdowndeleay.sql
|
||||
# 5007|68_optional_character_maxexplevel.sql
|
||||
# 5008|103_optional_chat_rules.sql
|
||||
5009|104_traps.sql
|
||||
# 5010|106_optional_proc_rules.sql
|
||||
5011|120_damageshieldtypes.sql
|
||||
5012|125_aggrozone.sql
|
||||
# 5013|127_optional_spell_rules.sql
|
||||
# 5014|129_optional_shared_plat_rule.sql
|
||||
# 5015|131_optional_combat_rules.sql
|
||||
5016|133_task_repeatable.sql
|
||||
5017|142_deathpeace_and_lifetap_aas.sql
|
||||
# 5018|158_optional_death_exp_loss.sql
|
||||
5019|176_melody.sql
|
||||
5020|189_character_.sql
|
||||
5021|196_trader.sql
|
||||
5022|210_undyeme.sql
|
||||
5023|222_buyer.sql
|
||||
5024|226_account_limiting.sql
|
||||
5025|230_spells_table.sql
|
||||
5026|235_horses_table.sql
|
||||
5027|243_spawn_timers.sql
|
||||
5028|247_mail.sql
|
||||
5029|249_chatchannels.sql
|
||||
5030|250_bot_spell_update.sql
|
||||
# 5031|250_optional_bot_spell_update.sql
|
||||
# 5032|285_optional_bot_spell_update.sql
|
||||
5033|292_augslots.sql
|
||||
5034|294_merchant_logging.sql
|
||||
5035|304_faction_list.sql
|
||||
5036|326_aas.sql
|
||||
5037|328_bot_management.sql
|
||||
# 5038|328_optional_bot_management.sql
|
||||
5039|340_gm_ips.sql
|
||||
5040|356_combat.sql
|
||||
5041|360_peqzone.sql
|
||||
5042|364_ranged_dist_rule.sql
|
||||
5043|386_bot_save_raid.sql
|
||||
# 5044|434_optional_rest_state_rules.sql
|
||||
5045|447_sof_startzone_rule.sql
|
||||
5046|463_altadv_vars.sql
|
||||
5047|475_aa_actions.sql
|
||||
5048|500_spawn2_optimization.sql
|
||||
5049|503_bugs.sql
|
||||
5050|518_drakkin_npc_type_features.sql
|
||||
5051|524_rule_values_notes.sql
|
||||
5052|527_npc_armor_tint.sql
|
||||
5053|553_saylink_table.sql
|
||||
5054|564_nokeyring.sql
|
||||
5055|600_group_leadership.sql
|
||||
5056|612_instance_changes.sql
|
||||
5057|615_adventure_assassination.sql
|
||||
5058|619_Adventure_Recruiter_Flavor.sql
|
||||
5059|621_LDoNTraps.sql
|
||||
5060|633_ucs.sql
|
||||
5061|634_TrapTemplateDefaultValue.sql
|
||||
5062|643_BotsTable.sql
|
||||
5063|646_archery_penalty_rule.sql
|
||||
5064|665_heroic_resists.sql
|
||||
5065|667_titles.sql
|
||||
5066|687_aa_table_changes.sql
|
||||
5067|699_peqzone_rule.sql
|
||||
5068|702_aashieldblock_tint_table.sql
|
||||
5069|703_peqzone_rule.sql
|
||||
5070|704_rules.sql
|
||||
5071|710_tint_set_naming.sql
|
||||
5072|721_pathing_rules.sql
|
||||
5073|730_smart_delay_moving.sql
|
||||
5074|731_rule_assist_notarget_self.sql
|
||||
5075|732_sacrifice_rules.sql
|
||||
5076|745_slow_mitigation.sql
|
||||
5077|754_archery_base_damage_rule.sql
|
||||
5078|755_sof_altadv_vars_updates.sql
|
||||
5079|773_monk_rules.sql
|
||||
# 5080|853_optional_rule_aaexp.sql
|
||||
# 5081|858_optional_rule_ip_limit_by_status.sql
|
||||
# 5082|892_optional_bots_table_mod.sql
|
||||
# 5083|893_optional_bots_table_mod.sql
|
||||
5084|898_npc_maxlevel_scalerate.sql
|
||||
# 5085|902_optional_rule_snareflee.sql
|
||||
5086|923_spawn2_enabled.sql
|
||||
5087|962_hot_zone.sql
|
||||
5088|964_reports.sql
|
||||
5089|971_veteran_rewards.sql
|
||||
5090|977_raid_npc_private_corpses.sql
|
||||
5091|979_unique_spawn_by_name.sql
|
||||
5092|980_account_ip.sql
|
||||
5093|1022_botadventuring.sql
|
||||
5094|1027_botactives.sql
|
||||
5095|1030_botzoningsupport.sql
|
||||
5096|1036_botbuffs.sql
|
||||
5097|1038_botpetstatepersists.sql
|
||||
5098|1038_grouptablesuniquecolumndefinitions.sql
|
||||
5099|1039_botguilds.sql
|
||||
5100|1040_DeprecatedBotRaidsSystems.sql
|
||||
5101|1057_titles.sql
|
||||
5102|1077_botgroups.sql
|
||||
5103|1136_spell_globals.sql
|
||||
# 5104|1144_optional_rule_return_nodrop.sql
|
||||
5105|1195_account_suspendeduntil.sql
|
||||
5106|1259_npc_skill_types.sql
|
||||
5107|1280_bot_augs.sql
|
||||
# 5108|1290_optional_exp_loss_rule.sql
|
||||
5109|1293_guild_bank.sql
|
||||
5110|1379_loginserver_trusted_server.sql
|
||||
5111|1392_recipe_learning.sql
|
||||
# 5112|1394_optional_rule_sod_hp_mana_end.sql
|
||||
5113|1404_faction_list.sql
|
||||
# 5114|1410_optional_sod_aas_ht_and_loh.sql
|
||||
5115|1436_login_server_table_fix.sql
|
||||
5116|1446_allowrest_optional.sql
|
||||
5117|1446_allowrest_required.sql
|
||||
5118|1450_cvs.sql
|
||||
5119|1451_guilds.sql
|
||||
5120|1498_instance_adventure.sql
|
||||
5121|1510_global_instances.sql
|
||||
5122|1511_map_path_loading.sql
|
||||
5123|1513_zone_points.sql
|
||||
5124|1519_zone_primary_key_id.sql
|
||||
5125|1542_items_table_cleanup.sql
|
||||
5126|1548_nimbuseffect_required.sql
|
||||
5127|1562_instanced_spawnconditions.sql
|
||||
5128|1586_waypoints_optional.sql
|
||||
5129|1610_tradeskill_required.sql
|
||||
5130|1618_zone.sql
|
||||
# 5131|1625_optional_rule_class_race_exp_bonus.sql
|
||||
# 5132|1672_optional_rules_respawn_window.sql
|
||||
# 5133|1679_optional_rules_blocked_buffs.sql
|
||||
5134|1696_modify_zone_and_object_tables.sql
|
||||
5135|1711_account_restricted_aa.sql
|
||||
# 5136|1717_optional_rule_bash_stun_chance.sql
|
||||
# 5137|1718_optional_rules_mod3s.sql
|
||||
# 5138|1719_optional_triggerOnCastAAs.sql
|
||||
# 5139|1720_optional_sql_AAs.sql
|
||||
5140|1720_required_sql_AA_effects_update.sql
|
||||
# 5141|1721_optional_sql_drakkin_breath_update.sql
|
||||
5142|1721_required_sql_altadv_vars_update.sql
|
||||
# 5143|1723_optional_sql_new_stats_window_rule.sql
|
||||
5144|1723_required_sql_corruption.sql
|
||||
# 5145|1736_optional_sql_feral_swipe.sql
|
||||
5146|1737_required_sql_rule_and_aa_update.sql
|
||||
# 5147|1746_optional_sql_bot_manaregen.sql
|
||||
# 5148|1747_optional_HoT_zone_and_zonepoints.sql
|
||||
# 5149|1750_optional_sql_reflect_rule.sql
|
||||
# 5150|1753_optional_haste_cap_rule.sql
|
||||
5151|1753_required_sql_healing_adept_aa.sql
|
||||
5152|1754_required_sql_healing_adept_aa_fix.sql
|
||||
5153|1755_required_sql_fear_resist_aas.sql
|
||||
# 5154|1784_optional_corpsedrag_rules.sql
|
||||
5155|1786_required_update_to_aas.sql
|
||||
5156|1790_required_aa_required_level_cost.sql
|
||||
5157|1793_resist_adjust.sql
|
||||
# 5158|1799_optional_rest_regen_endurance_rule.sql
|
||||
5159|1802_required_doppelganger.sql
|
||||
5160|1803_required_tasks_xpreward_signed.sql
|
||||
5161|1804_required_ae_melee_updates.sql
|
||||
# 5162|1809_optional_rules.sql
|
||||
5163|1813_required_doppelganger_npcid_change.sql
|
||||
# 5164|1817_optional_npc_archery_bonus_rule.sql
|
||||
# 5165|1823_optional_delay_death.sql
|
||||
5166|1847_required_doors_dest_zone_size_32.sql
|
||||
# 5167|1859_optional_item_casts_use_focus_rule.sql
|
||||
# 5168|1884_optional_bot_spells_update.sql
|
||||
# 5169|1885_optional_rules_fv_pvp_expansions.sql
|
||||
# 5170|1889_optional_skill_cap_rule.sql
|
||||
5171|1908_required_npc_types_definitions.sql
|
||||
# 5172|1926_optional_stat_cap.sql
|
||||
5173|1944_spawn2.sql
|
||||
5174|1946_doors.sql
|
||||
# 5175|1960_optional_console_timeout_rule.sql
|
||||
# 5176|1962_optional_guild_creation_window_rules.sql
|
||||
# 5177|1963_optional_rule_live_like_focuses.sql
|
||||
# 5178|1968_optional_enrage_rules.sql
|
||||
# 5179|1972_optional_extradmg_item_cap.sql
|
||||
5180|1974_required_bot_spells_update.sql
|
||||
5181|1977_underwater.sql
|
||||
# 5182|1998_optional_intoxication_and_looting_rules.sql
|
||||
5183|2004_charges_alt_currency.sql
|
||||
# 5184|2015_optional_specialization_training_rule.sql
|
||||
# 5185|2016_optional_rule_bot_aa_expansion.sql
|
||||
# 5186|2023_optional_mysqlcli.sql
|
||||
# 5187|2024_optional_update_crystals.sql
|
||||
5188|2024_required_update.sql
|
||||
5189|2057_required_discovered_items.sql
|
||||
# 5190|2058_optional_rule_discovered_items.sql
|
||||
5191|2062_required_version_changes.sql
|
||||
5192|2069_required_pets.sql
|
||||
5193|2079_player_speech.sql
|
||||
5194|2087_required_bots_hp_and_mana_and_spell_updates.sql
|
||||
5195|2098_required_zonepoint_version_changes.sql
|
||||
5196|2099_required_discovered_items_account_status.sql
|
||||
5197|2104_required_group_roles.sql
|
||||
5198|2107_required_bot_stances.sql
|
||||
5199|2129_required_lfguild.sql
|
||||
5200|2133_required_faction_loot_despawn.sql
|
||||
5201|2136_extended_targets.sql
|
||||
5202|2142_emotes.sql
|
||||
# 5203|2154_optional_rule_spell_procs_resists_falloff.sql
|
||||
# 5204|2156_optional_charm_break_rule.sql
|
||||
# 5205|2159_optional_defensiveproc_rules.sql
|
||||
5206|2164_require_bots_bottimers.sql
|
||||
# 5207|2171_optional_SpecialAttackACBonus_rule.sql
|
||||
# 5208|2176_optional_aa_expansion_SOF_fix.sql
|
||||
# 5209|2176_optional_FrenzyBonus_rule.sql
|
||||
5210|2176_required_aa_updates.sql
|
||||
5211|2178_required_aa_updates.sql
|
||||
# 5212|2183_optional_bot_xp_rule.sql
|
||||
# 5213|2185_optional_NPCFlurryChacne_rule
|
||||
# 5214|2185_optional_NPCFlurryChacne_rule.sql
|
||||
# 5215|2185_optional_NPCFlurryChance_rule.sql
|
||||
5216|2185_required_aa_updates
|
||||
5217|2185_required_aa_updates.sql
|
||||
# 5218|2188_optional_miscspelleffect_rules
|
||||
# 5219|2188_optional_miscspelleffect_rules.sql
|
||||
5220|2188_required_aa_updates
|
||||
5221|2188_required_aa_updates.sql
|
||||
# 5222|2189_optional_taunt_rules
|
||||
# 5223|2189_optional_taunt_rules.sql
|
||||
5224|2195_required_sharedplatupdates.sql
|
||||
# 5225|2208_optional_aa_stacking_rule.sql
|
||||
# 5226|2208_optional_EnableSoulAbrasionAA.sql
|
||||
5227|2208_required_aa_updates.sql
|
||||
# 5228|2209_optional_additive_bonus_rule.sql
|
||||
5229|2213_loot_changes.sql
|
||||
5230|2214_faction_list_mod.sql
|
||||
5231|2215_required_aa_updates.sql
|
||||
# 5232|2243_optional_char_max_level_rule.sql
|
||||
5233|2260_probability.sql
|
||||
5234|2262_required_pet_discipline_update.sql
|
||||
5235|2264_required_aa_updates.sql
|
||||
5236|2268_QueryServ.sql
|
||||
5237|2268_required_updates.sql
|
||||
# 5238|2274_optional_rule_iplimitdisconnectall.sql
|
||||
# 5239|2278_optional_rule_targetableswarmpet.sql
|
||||
# 5240|2280_optional_rule_targetableswarmpet-rename.sql
|
||||
5241|2283_required_npc_changes.sql
|
||||
5242|2299_required_inspectmessage_fields.sql
|
||||
# 5243|2300_optional_loot_changes.sql
|
||||
5244|2304_QueryServ.sql
|
||||
5245|2340_required_maxbuffslotspet.sql
|
||||
5246|2361_QueryServ.sql
|
||||
5247|2361_required_qs_rule_values.sql
|
||||
5248|2370_required_aa_updates.sql
|
||||
5249|2376_required_aa_updates.sql
|
||||
# 5250|2380_optional_merc_data.sql
|
||||
# 5251|2380_optional_merc_merchant_npctypes_update.sql
|
||||
# 5252|2380_optional_merc_rules.sql
|
||||
5253|2383_required_group_ismerc.sql
|
||||
# 5254|2428_optional_levelbasedexpmods.sql
|
||||
# 5255|2448_optional_stun_proc_aggro_rule.sql
|
||||
5256|2471_required_aa_updates.sql
|
||||
5257|2482_required_start_zones.sql
|
||||
5258|2504_required_aa_updates.sql
|
||||
8000|mercs.sql|SHOW TABLES LIKE 'merc_stats'|empty|
|
||||
9000|2013_02_18_Merc_Rules_and_Tables.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE '%Mercs:ResurrectRadius%'|empty|
|
||||
9001|2013_02_25_Impr_HT_LT.sql|SHOW TABLES LIKE 'merc_inventory'|empty|
|
||||
9002|2013_03_1_Merc_Rules_and_Equipment.sql|SHOW TABLES LIKE 'merc_inventory'|empty|
|
||||
# 9003|2013_03_23_Escape_FadingMemories.sql
|
||||
# 9004|2013_04_04_NaturesBounty.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '1230' AND `slot` = '1' AND `effectid` = '313' AND `base1` = '15' AND `base2` = '0'|empty|
|
||||
9005|2013_04_08_Salvage.sql|SHOW COLUMNS FROM `tradeskill_recipe_entries` LIKE 'salvagecount'|empty|
|
||||
9006|2013_05_05_Account_Flags.sql|SHOW TABLES LIKE 'account_flags'|empty|
|
||||
9007|2013_05_05_Item_Tick.sql|SHOW TABLES LIKE 'item_tick'|empty|
|
||||
9008|2013_07_11_NPC_Special_Abilities.sql|SHOW COLUMNS FROM `npc_types` LIKE 'special_abilities'|empty|
|
||||
9009|2013_10_12_Merc_Special_Abilities.sql|SHOW COLUMNS FROM `merc_stats` LIKE 'special_abilities'|empty|
|
||||
# 9010|2013_10_12_Merc_vwMercNpcTypes.sql
|
||||
9011|2013_10_31_Recipe_disabling.sql|SHOW COLUMNS FROM `tradeskill_recipe` LIKE 'enabled'|empty|
|
||||
9012|2013_11_07_BaseData.sql|SHOW TABLES LIKE 'base_data'|empty|
|
||||
# 9013|2013_11_13_Instrument_Singing_Mastery.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '213' AND `slot` = '1' AND `effectid` = '260' AND `base1` = '2' AND `base2` = '23'|empty|
|
||||
9014|2013_11_18_AssistRadius.sql|SHOW COLUMNS FROM `npc_types` LIKE 'assistradius'|empty|
|
||||
9015|2013_12_26_MerchantList_Class_Required.sql|SHOW COLUMNS FROM `merchantlist` LIKE 'classes_required'|empty|
|
||||
# 9016|2014_01_04_SongModCapAAs.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '571' AND `slot` = '1' AND `effectid` = '261'|empty|
|
||||
9017|2014_01_08_SpellsNewAdditions.sql|SHOW COLUMNS FROM `spells_new` LIKE 'persistdeath'|empty|
|
||||
9018|2014_01_09_PreservePetSize.sql|SHOW COLUMNS FROM `character_pet_info` LIKE 'size'|empty|
|
||||
# 9019|2014_01_20_MezMastery.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '781' AND `slot` = '1' AND `effectid` = '287'|empty|
|
||||
9020|2014_01_20_Not_Extendable.sql|SHOW COLUMNS FROM `spells_new` LIKE 'not_extendable'|empty|
|
||||
# 9021|2014_01_20_SpellCastingReinforcement.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '86' AND `slot` = '1' AND `effectid` = '128'|empty|
|
||||
9022|2014_01_20_Weather.sql|SHOW COLUMNS FROM `zone` LIKE 'rain_chance1'|empty|
|
||||
# 9023|2014_01_27_CritcalMendAA.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '230' AND `slot` = '1' AND `effectid` = '275'|empty
|
||||
# 9024|2014_02_02_SpellCriticalsAA.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '4755' AND `slot` = '1' AND `effectid` = '294'|empty
|
||||
9025|2014_02_13_Rename_instance_lockout_tables.sql|SHOW TABLES LIKE 'instance_list'|empty|
|
||||
9026|2014_02_13_spells_new_update.sql|SHOW COLUMNS FROM `spells_new` LIKE 'ConeStartAngle'|empty|
|
||||
9027|2014_02_20_buff_update.sql|SHOW COLUMNS FROM `character_buffs` LIKE 'caston_y'|empty|
|
||||
9028|2014_02_26_roambox_update.sql|SHOW COLUMNS FROM `spawngroup` LIKE 'mindelay'|empty|
|
||||
# 9029|2014_02_26_virulentvenomAA.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '888' AND `slot` = '1' AND `effectid` = '250'|empty|
|
||||
9030|2014_04_04_PhysicalResist.sql|SHOW COLUMNS FROM `npc_types` LIKE 'PhR'|empty|
|
||||
9031|2014_04_10_No_Target_With_Hotkey.sql|SHOW COLUMNS FROM `npc_types` LIKE 'no_target_hotkey'|empty|
|
||||
9032|2014_04_12_SlowMitigation.sql|SHOW COLUMNS FROM `npc_types` LIKE 'slow_mitigation'|contains|float
|
||||
9034|2014_04_25_spawn_events.sql|SHOW COLUMNS FROM `spawn_events` LIKE 'strict'|empty|
|
||||
9035|2014_04_27_AISpellEffects.sql|SHOW COLUMNS FROM `npc_types` LIKE 'npc_spells_effects_id'|empty|
|
||||
9036|2014_05_04_SlowMitigationFix.sql|SHOW COLUMNS FROM `npc_types` LIKE 'slow_mitigation'|contains|float
|
||||
# 9038|2014_06_25_AA_Updates.sql|SELECT * FROM `altadv_vars` WHERE `skill_id` = '1604'|empty
|
||||
# 9039|2014_07_04_AA_Updates.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '158' AND `slot` = '1' AND `effectid` = '238'|empty
|
||||
9040|2014_07_10_npc_spells.sql|SHOW COLUMNS FROM `npc_spells` LIKE 'engaged_no_sp_recast_min'|empty|
|
||||
9041|2014_08_02_spells_new.sql|SHOW COLUMNS FROM `spells_new` LIKE 'viral_range'|empty|
|
||||
9042|2014_08_12_NPC_raid_targets.sql|SHOW COLUMNS FROM `npc_types` LIKE 'raid_target'|empty|
|
||||
9043|2014_08_18_spells_new_update.sql|SHOW COLUMNS FROM `spells_new` LIKE 'viral_targets'|empty|
|
||||
9044|2014_08_20_merchantlist_probability.sql|SHOW COLUMNS FROM `merchantlist` LIKE 'probability'|empty|
|
||||
9045|2014_08_23_Complete_QueryServ_Table_Structures.sql|SHOW TABLES LIKE 'qs_player_aa_rate_hourly'|empty|
|
||||
9046|2014_08_23_player_events_and_player_aa_rate_hourly.sql|SHOW TABLES LIKE 'qs_player_events'|empty|
|
||||
9048|2014_09_09_attack_delay.sql|SHOW COLUMNS FROM `npc_types` LIKE 'attack_delay'|empty|
|
||||
9050|2014_09_20_ban_messages.sql|SHOW COLUMNS FROM `account` LIKE 'ban_reason'|empty|
|
||||
9051|2014_10_11_RaidMOTD.sql|SHOW COLUMNS FROM `raid_details` LIKE 'motd'|empty|
|
||||
9052|2014_10_13_RaidLeadership.sql|SHOW TABLES LIKE 'raid_leaders'|empty|
|
||||
9053|2014_10_18_group_mentor.sql|SHOW COLUMNS FROM `group_leaders` LIKE 'mentoree'|empty|
|
||||
9054|2014_10_19_raid_group_mentor.sql|SHOW COLUMNS FROM `raid_leaders` LIKE 'mentoree'|empty|
|
||||
9055|2014_10_30_special_abilities_null.sql|SHOW COLUMNS FROM `npc_types` LIKE 'special_abilities'|contains|NO
|
||||
9056|2014_11_08_RaidMembers.sql|SHOW COLUMNS FROM `raid_members` LIKE 'groupid'|missing|unsigned
|
||||
9057|2014_11_13_spells_new_updates.sql|SHOW COLUMNS FROM `spells_new` LIKE 'disallow_sit'|empty|
|
||||
9058|2014_11_26_InventoryTableUpdate.sql|SHOW COLUMNS FROM `inventory` LIKE 'ornamenticon'|empty|
|
||||
9059|2014_12_01_mercs_table_update.sql|SHOW COLUMNS FROM `mercs` LIKE 'MercSize'|empty|
|
||||
|
||||
# Upgrade conditions:
|
||||
# This won't be needed after this system is implemented, but it is used database that are not
|
||||
# yet using the versioning system to figure out where the database is schema wise to determine
|
||||
# which updates are necessary to run
|
||||
#
|
||||
# Example: Version|Filename.sql|Query_to_Check_Condition_For_Needed_Update|match type|text to match
|
||||
# 0 = Database Version
|
||||
# 1 = Filename.sql
|
||||
# 2 = Query_to_Check_Condition_For_Needed_Update
|
||||
# 3 = Match Type - If condition from match type to Value 4 is true, update will flag for needing to be ran
|
||||
# contains = If query results contains text from 4th value
|
||||
# match = If query results matches text from 4th value
|
||||
# missing = If query result is missing text from 4th value
|
||||
# empty = If the query results in no results
|
||||
# not_empty = If the query is not empty
|
||||
# 4 = Text to match
|
||||
#
|
||||
#
|
||||
@@ -0,0 +1,74 @@
|
||||
-- A fix for the auto-conversion view renaming issue
|
||||
|
||||
|
||||
DROP VIEW IF EXISTS `vwbotcharactermobs`;
|
||||
DROP VIEW IF EXISTS `vwbotgroups`;
|
||||
DROP VIEW IF EXISTS `vwgroups`;
|
||||
DROP VIEW IF EXISTS `vwguildmembers`;
|
||||
|
||||
|
||||
CREATE VIEW `vwBotCharacterMobs` AS
|
||||
SELECT _utf8'C' AS mobtype,
|
||||
c.`id`,
|
||||
c.`name`,
|
||||
c.`class`,
|
||||
c.`level`,
|
||||
c.`last_login`,
|
||||
c.`zone_id`
|
||||
FROM `character_data` AS c
|
||||
UNION ALL
|
||||
SELECT _utf8'B' AS mobtype,
|
||||
b.`BotID` AS id,
|
||||
b.`Name` AS name,
|
||||
b.`Class` AS class,
|
||||
b.`BotLevel` AS level,
|
||||
0 AS timelaston,
|
||||
0 AS zoneid
|
||||
FROM bots AS b;
|
||||
|
||||
CREATE VIEW `vwGroups` AS
|
||||
SELECT g.`groupid` AS groupid,
|
||||
GetMobType(g.`name`) AS mobtype,
|
||||
g.`name` AS name,
|
||||
g.`charid` AS mobid,
|
||||
IFNULL(c.`level`, b.`BotLevel`) AS level
|
||||
FROM `group_id` AS g
|
||||
LEFT JOIN `character_data` AS c ON g.`name` = c.`name`
|
||||
LEFT JOIN `bots` AS b ON g.`name` = b.`Name`;
|
||||
|
||||
CREATE VIEW `vwBotGroups` AS
|
||||
SELECT g.`BotGroupId`,
|
||||
g.`BotGroupName`,
|
||||
g.`BotGroupLeaderBotId`,
|
||||
b.`Name` AS BotGroupLeaderName,
|
||||
b.`BotOwnerCharacterId`,
|
||||
c.`name` AS BotOwnerCharacterName
|
||||
FROM `botgroup` AS g
|
||||
JOIN `bots` AS b ON g.`BotGroupLeaderBotId` = b.`BotID`
|
||||
JOIN `character_data` AS c ON b.`BotOwnerCharacterID` = c.`id`
|
||||
ORDER BY b.`BotOwnerCharacterId`, g.`BotGroupName`;
|
||||
|
||||
CREATE VIEW `vwGuildMembers` AS
|
||||
SELECT 'C' AS mobtype,
|
||||
cm.`char_id`,
|
||||
cm.`guild_id`,
|
||||
cm.`rank`,
|
||||
cm.`tribute_enable`,
|
||||
cm.`total_tribute`,
|
||||
cm.`last_tribute`,
|
||||
cm.`banker`,
|
||||
cm.`public_note`,
|
||||
cm.`alt`
|
||||
FROM `guild_members` AS cm
|
||||
UNION ALL
|
||||
SELECT 'B' AS mobtype,
|
||||
bm.`char_id`,
|
||||
bm.`guild_id`,
|
||||
bm.`rank`,
|
||||
bm.`tribute_enable`,
|
||||
bm.`total_tribute`,
|
||||
bm.`last_tribute`,
|
||||
bm.`banker`,
|
||||
bm.`public_note`,
|
||||
bm.`alt`
|
||||
FROM `botguildmembers` AS bm;
|
||||
@@ -0,0 +1,280 @@
|
||||
-- 'load_bots_old' sql script file
|
||||
-- current as of 10/15/2014
|
||||
--
|
||||
-- Use this file on databases where the player profile blob has not been converted
|
||||
--
|
||||
-- Note: This file assumes a database free of bot remnants. If you have a prior
|
||||
-- bot installation and wish to reload the default schema and entries, then
|
||||
-- source 'drop_bots.sql' before sourcing this file.
|
||||
|
||||
|
||||
ALTER TABLE `guild_members` DROP PRIMARY KEY;
|
||||
ALTER TABLE `group_id` DROP PRIMARY KEY, ADD PRIMARY KEY USING BTREE(`groupid`, `charid`, `name`, `ismerc`);
|
||||
|
||||
UPDATE `spawn2` SET `enabled` = 1 WHERE `id` IN (59297,59298);
|
||||
|
||||
-- old command kept for reference (`commands` now only has 2 columns - `command` and `access`)
|
||||
-- INSERT INTO `commands` VALUES ('bot', '0', 'Type \"#bot help\" to the see the list of available commands for bots.');
|
||||
INSERT INTO `commands` VALUES ('bot', '0');
|
||||
|
||||
INSERT INTO `rule_values` VALUES
|
||||
('1', 'Bots:BotAAExpansion', '8', 'The expansion through which bots will obtain AAs'),
|
||||
('1', 'Bots:BotFinishBuffing', 'false', 'Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.'),
|
||||
('1', 'Bots:BotGroupBuffing', 'false', 'Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB.'),
|
||||
('1', 'Bots:BotManaRegen', '3.0', 'Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players.'),
|
||||
('1', 'Bots:BotQuest', 'false', 'Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl'),
|
||||
('1', 'Bots:BotSpellQuest', 'false', 'Anita Thrall\'s (Anita_Thrall.pl) Bot Spell Scriber quests.'),
|
||||
('1', 'Bots:CreateBotCount', '150', 'Number of bots that each account can create'),
|
||||
('1', 'Bots:SpawnBotCount', '71', 'Number of bots a character can have spawned at one time, You + 71 bots is a 12 group raid');
|
||||
|
||||
CREATE TABLE `bots` (
|
||||
`BotID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotOwnerCharacterID` INT(10) UNSIGNED NOT NULL,
|
||||
`BotSpellsID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Name` VARCHAR(64) NOT NULL,
|
||||
`LastName` VARCHAR(32) DEFAULT NULL,
|
||||
`BotLevel` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Race` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`Class` TINYINT(2) NOT NULL DEFAULT '0',
|
||||
`Gender` TINYINT(2) NOT NULL DEFAULT '0',
|
||||
`Size` FLOAT NOT NULL DEFAULT '0',
|
||||
`Face` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinHairStyle` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinHairColor` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinEyeColor` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinEyeColor2` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinBeardColor` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinBeard` INT(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinHeritage` INT(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinTattoo` INT(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinDetails` INT(10) NOT NULL DEFAULT '0',
|
||||
`HP` INTEGER NOT NULL DEFAULT '0',
|
||||
`Mana` INTEGER NOT NULL DEFAULT '0',
|
||||
`MR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`CR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`DR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`FR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`PR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`Corrup` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`AC` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`STR` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`STA` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`DEX` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`AGI` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`_INT` MEDIUMINT(8) NOT NULL DEFAULT '80',
|
||||
`WIS` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`CHA` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`ATK` MEDIUMINT(9) NOT NULL DEFAULT '0',
|
||||
`BotCreateDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`LastSpawnDate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`TotalPlayTime` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`LastZoneId` SMALLINT(6) NOT NULL DEFAULT '0',
|
||||
`BotInspectMessage` VARCHAR(256) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (`BotID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE `botstances` (
|
||||
`BotID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`StanceID` TINYINT UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotID`),
|
||||
CONSTRAINT `FK_botstances_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
|
||||
);
|
||||
|
||||
CREATE TABLE `bottimers` (
|
||||
`BotID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`TimerID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Value` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotID`),
|
||||
CONSTRAINT `FK_bottimers_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
|
||||
);
|
||||
|
||||
CREATE TABLE `botbuffs` (
|
||||
`BotBuffId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`SpellId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CasterLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`DurationFormula` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`TicsRemaining` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`PoisonCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`DiseaseCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CurseCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CorruptionCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`HitCount` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`MeleeRune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`MagicRune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`DeathSaveSuccessChance` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CasterAARank` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Persistent` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotBuffId`),
|
||||
KEY `FK_botbuff_1` (`BotId`),
|
||||
CONSTRAINT `FK_botbuff_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE `botinventory` (
|
||||
`BotInventoryID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotID` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`SlotID` INTEGER SIGNED NOT NULL DEFAULT '0',
|
||||
`ItemID` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`charges` TINYINT(3) UNSIGNED DEFAULT 0,
|
||||
`color` INTEGER UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot1` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot2` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot3` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot4` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot5` MEDIUMINT(7) UNSIGNED DEFAULT 0,
|
||||
`instnodrop` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`BotInventoryID`),
|
||||
KEY `FK_botinventory_1` (`BotID`),
|
||||
CONSTRAINT `FK_botinventory_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE `botpets` (
|
||||
`BotPetsId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`PetId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`BotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Name` VARCHAR(64) NULL,
|
||||
`Mana` INTEGER NOT NULL DEFAULT '0',
|
||||
`HitPoints` INTEGER NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetsId`),
|
||||
KEY `FK_botpets_1` (`BotId`),
|
||||
CONSTRAINT `FK_botpets_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`),
|
||||
CONSTRAINT `U_botpets_1` UNIQUE (`BotId`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE `botpetbuffs` (
|
||||
`BotPetBuffId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotPetsId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`SpellId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CasterLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Duration` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetBuffId`),
|
||||
KEY `FK_botpetbuffs_1` (`BotPetsId`),
|
||||
CONSTRAINT `FK_botpetbuffs_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE `botpetinventory` (
|
||||
`BotPetInventoryId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotPetsId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`ItemId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetInventoryId`),
|
||||
KEY `FK_botpetinventory_1` (`BotPetsId`),
|
||||
CONSTRAINT `FK_botpetinventory_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE `botgroup` (
|
||||
`BotGroupId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotGroupLeaderBotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`BotGroupName` VARCHAR(64) NOT NULL,
|
||||
PRIMARY KEY (`BotGroupId`),
|
||||
KEY `FK_botgroup_1` (`BotGroupLeaderBotId`),
|
||||
CONSTRAINT `FK_botgroup_1` FOREIGN KEY (`BotGroupLeaderBotId`) REFERENCES `bots` (`BotID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE `botgroupmembers` (
|
||||
`BotGroupMemberId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotGroupId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`BotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotGroupMemberId`),
|
||||
KEY `FK_botgroupmembers_1` (`BotGroupId`),
|
||||
CONSTRAINT `FK_botgroupmembers_1` FOREIGN KEY (`BotGroupId`) REFERENCES `botgroup` (`BotGroupId`),
|
||||
KEY `FK_botgroupmembers_2` (`BotId`),
|
||||
CONSTRAINT `FK_botgroupmembers_2` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE `botguildmembers` (
|
||||
`char_id` INT(11) NOT NULL DEFAULT '0',
|
||||
`guild_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`rank` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`tribute_enable` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`total_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`last_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`banker` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`public_note` TEXT NULL,
|
||||
`alt` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`char_id`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
DELIMITER //
|
||||
|
||||
CREATE FUNCTION `GetMobType` (mobname VARCHAR(64)) RETURNS CHAR(1)
|
||||
BEGIN
|
||||
DECLARE Result CHAR(1);
|
||||
|
||||
SET Result = NULL;
|
||||
|
||||
IF (SELECT COUNT(*) FROM `character_` WHERE `name` = mobname) > 0 THEN
|
||||
SET Result = 'C';
|
||||
ELSEIF (SELECT COUNT(*) FROM `bots` WHERE `Name` = mobname) > 0 THEN
|
||||
SET Result = 'B';
|
||||
END IF;
|
||||
|
||||
RETURN Result;
|
||||
END//
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
CREATE VIEW `vwBotCharacterMobs` AS
|
||||
SELECT _utf8'C' AS mobtype,
|
||||
c.`id`,
|
||||
c.`name`,
|
||||
c.`class`,
|
||||
c.`level`,
|
||||
c.`timelaston`,
|
||||
c.`zoneid`
|
||||
FROM `character_` AS c
|
||||
UNION ALL
|
||||
SELECT _utf8'B' AS mobtype,
|
||||
b.`BotID` AS id,
|
||||
b.`Name` AS name,
|
||||
b.`Class` AS class,
|
||||
b.`BotLevel` AS level,
|
||||
0 AS timelaston,
|
||||
0 AS zoneid
|
||||
FROM bots AS b;
|
||||
|
||||
CREATE VIEW `vwGroups` AS
|
||||
SELECT g.`groupid` AS groupid,
|
||||
GetMobType(g.`name`) AS mobtype,
|
||||
g.`name` AS name,
|
||||
g.`charid` AS mobid,
|
||||
IFNULL(c.`level`, b.`BotLevel`) AS level
|
||||
FROM `group_id` AS g
|
||||
LEFT JOIN `character_` AS c ON g.`name` = c.`name`
|
||||
LEFT JOIN `bots` AS b ON g.`name` = b.`Name`;
|
||||
|
||||
CREATE VIEW `vwBotGroups` AS
|
||||
SELECT g.`BotGroupId`,
|
||||
g.`BotGroupName`,
|
||||
g.`BotGroupLeaderBotId`,
|
||||
b.`Name` AS BotGroupLeaderName,
|
||||
b.`BotOwnerCharacterId`,
|
||||
c.`name` AS BotOwnerCharacterName
|
||||
FROM `botgroup` AS g
|
||||
JOIN `bots` AS b ON g.`BotGroupLeaderBotId` = b.`BotID`
|
||||
JOIN `character_` AS c ON b.`BotOwnerCharacterID` = c.`id`
|
||||
ORDER BY b.`BotOwnerCharacterId`, g.`BotGroupName`;
|
||||
|
||||
CREATE VIEW `vwGuildMembers` AS
|
||||
SELECT 'C' AS mobtype,
|
||||
cm.`char_id`,
|
||||
cm.`guild_id`,
|
||||
cm.`rank`,
|
||||
cm.`tribute_enable`,
|
||||
cm.`total_tribute`,
|
||||
cm.`last_tribute`,
|
||||
cm.`banker`,
|
||||
cm.`public_note`,
|
||||
cm.`alt`
|
||||
FROM `guild_members` AS cm
|
||||
UNION ALL
|
||||
SELECT 'B' AS mobtype,
|
||||
bm.`char_id`,
|
||||
bm.`guild_id`,
|
||||
bm.`rank`,
|
||||
bm.`tribute_enable`,
|
||||
bm.`total_tribute`,
|
||||
bm.`last_tribute`,
|
||||
bm.`banker`,
|
||||
bm.`public_note`,
|
||||
bm.`alt`
|
||||
FROM `botguildmembers` AS bm;
|
||||
@@ -1,21 +1,41 @@
|
||||
DROP TABLE IF EXISTS `botbuffs`;
|
||||
-- 'drop_bots' sql script file
|
||||
-- current as of 10/15/2014
|
||||
--
|
||||
-- Note: This file will revert all changes made by either 'load_bots' sql file.
|
||||
-- There may still be remnants of bot activity in tables `guild_members` and
|
||||
-- `group_id`. If these entries are causing issues, you may need to manually
|
||||
-- remove them.
|
||||
--
|
||||
-- If this script fails due to a 'SQL Error (1068): Multiple primary key defined'
|
||||
-- error, run this query: ALTER TABLE `guild_members` DROP PRIMARY KEY;
|
||||
-- and it should remove the key so this script will process in its entirety.
|
||||
|
||||
|
||||
ALTER TABLE `guild_members` ADD PRIMARY KEY (`char_id`);
|
||||
ALTER TABLE `group_id` DROP PRIMARY KEY, ADD PRIMARY KEY (`groupid`, `charid`, `ismerc`);
|
||||
|
||||
UPDATE `spawn2` SET `enabled` = 0 WHERE `id` IN (59297,59298);
|
||||
|
||||
DELETE FROM `commands` WHERE `command` = 'bot';
|
||||
DELETE FROM `rule_values` WHERE `rule_name` LIKE 'Bots%';
|
||||
|
||||
DROP VIEW IF EXISTS `vwBotCharacterMobs`;
|
||||
DROP VIEW IF EXISTS `vwBotGroups`;
|
||||
DROP VIEW IF EXISTS `vwGroups`;
|
||||
DROP VIEW IF EXISTS `vwGuildMembers`;
|
||||
|
||||
DROP FUNCTION IF EXISTS `GetMobType`;
|
||||
|
||||
DROP TABLE IF EXISTS `botguildmembers`;
|
||||
DROP TABLE IF EXISTS `botgroupmembers`;
|
||||
-- this table is not a part of 'load_bots.sql'
|
||||
DROP TABLE IF EXISTS `botgroups`;
|
||||
DROP TABLE IF EXISTS `botgroup`;
|
||||
DROP TABLE IF EXISTS `botpetinventory`;
|
||||
DROP TABLE IF EXISTS `botpetbuffs`;
|
||||
DROP TABLE IF EXISTS `botpets`;
|
||||
DROP TABLE IF EXISTS `botgroupmembers`;
|
||||
DROP TABLE IF EXISTS `botgroup`;
|
||||
DROP TABLE IF EXISTS `botgroups`;
|
||||
DROP TABLE IF EXISTS `botinventory`;
|
||||
DROP TABLE IF EXISTS `botguildmembers`;
|
||||
DROP TABLE IF EXISTS `botstances`;
|
||||
DROP TABLE IF EXISTS `botbuffs`;
|
||||
DROP TABLE IF EXISTS `bottimers`;
|
||||
DROP TABLE IF EXISTS `botstances`;
|
||||
DROP TABLE IF EXISTS `bots`;
|
||||
DROP VIEW IF EXISTS `vwGuildMembers`;
|
||||
DROP VIEW IF EXISTS `vwBotCharacterMobs`;
|
||||
DROP VIEW IF EXISTS `vwBotGroups`;
|
||||
|
||||
delete from rule_values where rule_name like 'Bots%' and ruleset_id = 1;
|
||||
|
||||
delete from commands where command = 'bot';
|
||||
|
||||
update spawn2 set enabled = 0 where id in (59297,59298);
|
||||
+253
-280
@@ -1,307 +1,280 @@
|
||||
-- This is pretty much a straight copy of the original files with fixes applied.
|
||||
-- HeidiSQL does not like sub-directory references, so this should now run from there.
|
||||
-- The 'headers' are left in place for reference only.
|
||||
-- 'load_bots' sql script file
|
||||
-- current as of 10/15/2014
|
||||
--
|
||||
-- Use this file on databases where the player profile blob has been converted.
|
||||
--
|
||||
-- Note: This file assumes a database free of bot remnants. If you have a prior
|
||||
-- bot installation and wish to reload the default schema and entries, then
|
||||
-- source 'drop_bots.sql' before sourcing this file.
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/botguildmembers.sql;
|
||||
CREATE TABLE IF NOT EXISTS `botguildmembers` (
|
||||
`char_id` int(11) NOT NULL default '0',
|
||||
`guild_id` mediumint(8) unsigned NOT NULL default '0',
|
||||
`rank` tinyint(3) unsigned NOT NULL default '0',
|
||||
`tribute_enable` tinyint(3) unsigned NOT NULL default '0',
|
||||
`total_tribute` int(10) unsigned NOT NULL default '0',
|
||||
`last_tribute` int(10) unsigned NOT NULL default '0',
|
||||
`banker` tinyint(3) unsigned NOT NULL default '0',
|
||||
`public_note` text NULL,
|
||||
`alt` tinyint(3) unsigned NOT NULL default '0',
|
||||
PRIMARY KEY (`char_id`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/bots.sql;
|
||||
update spawn2 set enabled = 1 where id in (59297,59298);
|
||||
ALTER TABLE `guild_members` DROP PRIMARY KEY;
|
||||
ALTER TABLE `group_id` DROP PRIMARY KEY, ADD PRIMARY KEY USING BTREE(`groupid`, `charid`, `name`, `ismerc`);
|
||||
|
||||
INSERT INTO rule_values VALUES ('1', 'Bots:BotManaRegen', '3.0', 'Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players.');
|
||||
INSERT INTO rule_values VALUES ('1', 'Bots:BotFinishBuffing', 'false', 'Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.');
|
||||
INSERT INTO rule_values VALUES ('1', 'Bots:CreateBotCount', '150', 'Number of bots that each account can create');
|
||||
INSERT INTO rule_values VALUES ('1', 'Bots:SpawnBotCount', '71', 'Number of bots a character can have spawned at one time, You + 71 bots is a 12 group raid');
|
||||
INSERT INTO rule_values VALUES ('1', 'Bots:BotQuest', 'false', 'Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl');
|
||||
INSERT INTO rule_values VALUES ('1', 'Bots:BotGroupBuffing', 'false', 'Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB.');
|
||||
INSERT INTO rule_values VALUES ('1', 'Bots:BotSpellQuest', 'false', 'Anita Thrall\'s (Anita_Thrall.pl) Bot Spell Scriber quests.');
|
||||
UPDATE `spawn2` SET `enabled` = 1 WHERE `id` IN (59297,59298);
|
||||
|
||||
-- this is a hack fix to maintain the original file process
|
||||
delete from rule_values where rule_name like 'Bots%' and ruleset_id = 1;
|
||||
INSERT INTO rule_values VALUES ('1', 'Bots:BotAAExpansion', '8', 'The expansion through which bots will obtain AAs');
|
||||
|
||||
-- field count has changed
|
||||
-- old command kept for reference (`commands` now only has 2 columns - `command` and `access`)
|
||||
-- INSERT INTO `commands` VALUES ('bot', '0', 'Type \"#bot help\" to the see the list of available commands for bots.');
|
||||
INSERT INTO `commands` VALUES ('bot', '0');
|
||||
|
||||
CREATE TABLE bots (
|
||||
`BotID` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`BotOwnerCharacterID` int(10) unsigned NOT NULL,
|
||||
`BotSpellsID` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`Name` varchar(64) NOT NULL,
|
||||
`LastName` varchar(32) DEFAULT NULL,
|
||||
`BotLevel` tinyint(2) unsigned NOT NULL DEFAULT '0',
|
||||
`Race` smallint(5) NOT NULL DEFAULT '0',
|
||||
`Class` tinyint(2) NOT NULL DEFAULT '0',
|
||||
`Gender` tinyint(2) NOT NULL DEFAULT '0',
|
||||
`Size` float NOT NULL DEFAULT '0',
|
||||
`Face` int(10) NOT NULL DEFAULT '1',
|
||||
`LuclinHairStyle` int(10) NOT NULL DEFAULT '1',
|
||||
`LuclinHairColor` int(10) NOT NULL DEFAULT '1',
|
||||
`LuclinEyeColor` int(10) NOT NULL DEFAULT '1',
|
||||
`LuclinEyeColor2` int(10) NOT NULL DEFAULT '1',
|
||||
`LuclinBeardColor` int(10) NOT NULL DEFAULT '1',
|
||||
`LuclinBeard` int(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinHeritage` int(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinTattoo` int(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinDetails` int(10) NOT NULL DEFAULT '0',
|
||||
`HP` INTEGER NOT NULL DEFAULT '0',
|
||||
`Mana` INTEGER NOT NULL DEFAULT '0',
|
||||
`MR` smallint(5) NOT NULL DEFAULT '0',
|
||||
`CR` smallint(5) NOT NULL DEFAULT '0',
|
||||
`DR` smallint(5) NOT NULL DEFAULT '0',
|
||||
`FR` smallint(5) NOT NULL DEFAULT '0',
|
||||
`PR` smallint(5) NOT NULL DEFAULT '0',
|
||||
`Corrup` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`AC` smallint(5) NOT NULL DEFAULT '0',
|
||||
`STR` mediumint(8) NOT NULL DEFAULT '75',
|
||||
`STA` mediumint(8) NOT NULL DEFAULT '75',
|
||||
`DEX` mediumint(8) NOT NULL DEFAULT '75',
|
||||
`AGI` mediumint(8) NOT NULL DEFAULT '75',
|
||||
`_INT` mediumint(8) NOT NULL DEFAULT '80',
|
||||
`WIS` mediumint(8) NOT NULL DEFAULT '75',
|
||||
`CHA` mediumint(8) NOT NULL DEFAULT '75',
|
||||
`ATK` mediumint(9) NOT NULL DEFAULT '0',
|
||||
`BotCreateDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`LastSpawnDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`TotalPlayTime` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`LastZoneId` smallint(6) NOT NULL DEFAULT '0',
|
||||
`BotInspectMessage` VARCHAR(256) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (`BotID`)
|
||||
INSERT INTO `rule_values` VALUES
|
||||
('1', 'Bots:BotAAExpansion', '8', 'The expansion through which bots will obtain AAs'),
|
||||
('1', 'Bots:BotFinishBuffing', 'false', 'Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.'),
|
||||
('1', 'Bots:BotGroupBuffing', 'false', 'Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB.'),
|
||||
('1', 'Bots:BotManaRegen', '3.0', 'Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players.'),
|
||||
('1', 'Bots:BotQuest', 'false', 'Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl'),
|
||||
('1', 'Bots:BotSpellQuest', 'false', 'Anita Thrall\'s (Anita_Thrall.pl) Bot Spell Scriber quests.'),
|
||||
('1', 'Bots:CreateBotCount', '150', 'Number of bots that each account can create'),
|
||||
('1', 'Bots:SpawnBotCount', '71', 'Number of bots a character can have spawned at one time, You + 71 bots is a 12 group raid');
|
||||
|
||||
CREATE TABLE `bots` (
|
||||
`BotID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotOwnerCharacterID` INT(10) UNSIGNED NOT NULL,
|
||||
`BotSpellsID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Name` VARCHAR(64) NOT NULL,
|
||||
`LastName` VARCHAR(32) DEFAULT NULL,
|
||||
`BotLevel` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Race` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`Class` TINYINT(2) NOT NULL DEFAULT '0',
|
||||
`Gender` TINYINT(2) NOT NULL DEFAULT '0',
|
||||
`Size` FLOAT NOT NULL DEFAULT '0',
|
||||
`Face` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinHairStyle` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinHairColor` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinEyeColor` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinEyeColor2` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinBeardColor` INT(10) NOT NULL DEFAULT '1',
|
||||
`LuclinBeard` INT(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinHeritage` INT(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinTattoo` INT(10) NOT NULL DEFAULT '0',
|
||||
`DrakkinDetails` INT(10) NOT NULL DEFAULT '0',
|
||||
`HP` INTEGER NOT NULL DEFAULT '0',
|
||||
`Mana` INTEGER NOT NULL DEFAULT '0',
|
||||
`MR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`CR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`DR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`FR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`PR` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`Corrup` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`AC` SMALLINT(5) NOT NULL DEFAULT '0',
|
||||
`STR` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`STA` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`DEX` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`AGI` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`_INT` MEDIUMINT(8) NOT NULL DEFAULT '80',
|
||||
`WIS` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`CHA` MEDIUMINT(8) NOT NULL DEFAULT '75',
|
||||
`ATK` MEDIUMINT(9) NOT NULL DEFAULT '0',
|
||||
`BotCreateDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`LastSpawnDate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`TotalPlayTime` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`LastZoneId` SMALLINT(6) NOT NULL DEFAULT '0',
|
||||
`BotInspectMessage` VARCHAR(256) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (`BotID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
ALTER TABLE `group_id` DROP PRIMARY KEY, ADD PRIMARY KEY USING BTREE(`groupid`, `charid`, `name`);
|
||||
ALTER TABLE `guild_members` DROP PRIMARY KEY;
|
||||
CREATE TABLE `botstances` (
|
||||
`BotID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`StanceID` TINYINT UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotID`),
|
||||
CONSTRAINT `FK_botstances_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
|
||||
);
|
||||
|
||||
DROP VIEW IF EXISTS `vwGuildMembers`;
|
||||
CREATE VIEW `vwGuildMembers` AS
|
||||
select 'C' as mobtype,
|
||||
cm.char_id,
|
||||
cm.guild_id,
|
||||
cm.rank,
|
||||
cm.tribute_enable,
|
||||
cm.total_tribute,
|
||||
cm.last_tribute,
|
||||
cm.banker,
|
||||
cm.public_note,
|
||||
cm.alt
|
||||
from guild_members as cm
|
||||
union all
|
||||
select 'B' as mobtype,
|
||||
bm.char_id,
|
||||
bm.guild_id,
|
||||
bm.rank,
|
||||
bm.tribute_enable,
|
||||
bm.total_tribute,
|
||||
bm.last_tribute,
|
||||
bm.banker,
|
||||
bm.public_note,
|
||||
bm.alt
|
||||
from botguildmembers as bm;
|
||||
CREATE TABLE `bottimers` (
|
||||
`BotID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`TimerID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Value` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotID`),
|
||||
CONSTRAINT `FK_bottimers_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
|
||||
);
|
||||
|
||||
DROP VIEW IF EXISTS `vwBotCharacterMobs`;
|
||||
CREATE VIEW `vwBotCharacterMobs` AS
|
||||
select 'C' as mobtype,
|
||||
c.id,
|
||||
c.name,
|
||||
c.class,
|
||||
c.level,
|
||||
c.timelaston,
|
||||
c.zoneid
|
||||
from character_ as c
|
||||
union all
|
||||
select 'B' as mobtype,
|
||||
b.BotID as id,
|
||||
b.Name as name,
|
||||
b.Class as class,
|
||||
b.BotLevel as level,
|
||||
0 as timelaston,
|
||||
0 as zoneid
|
||||
from bots as b;
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/botpetstatepersists.sql;
|
||||
DROP TABLE IF EXISTS `botpetinventory`;
|
||||
DROP TABLE IF EXISTS `botpetbuffs`;
|
||||
DROP TABLE IF EXISTS `botpets`;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `botpets` (
|
||||
`BotPetsId` integer unsigned NOT NULL AUTO_INCREMENT,
|
||||
`PetId` integer unsigned NOT NULL DEFAULT '0',
|
||||
`BotId` integer unsigned NOT NULL DEFAULT '0',
|
||||
`Name` varchar(64) NULL,
|
||||
`Mana` integer NOT NULL DEFAULT '0',
|
||||
`HitPoints` integer NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetsId`),
|
||||
KEY `FK_botpets_1` (`BotId`),
|
||||
CONSTRAINT `FK_botpets_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`),
|
||||
CONSTRAINT `U_botpets_1` UNIQUE (`BotId`)
|
||||
CREATE TABLE `botbuffs` (
|
||||
`BotBuffId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`SpellId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CasterLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`DurationFormula` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`TicsRemaining` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`PoisonCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`DiseaseCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CurseCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CorruptionCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`HitCount` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`MeleeRune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`MagicRune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`DeathSaveSuccessChance` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CasterAARank` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Persistent` TINYINT(1) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotBuffId`),
|
||||
KEY `FK_botbuff_1` (`BotId`),
|
||||
CONSTRAINT `FK_botbuff_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `botpetbuffs` (
|
||||
`BotPetBuffId` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`BotPetsId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`SpellId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`CasterLevel` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`Duration` int(11) unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetBuffId`),
|
||||
KEY `FK_botpetbuffs_1` (`BotPetsId`),
|
||||
CONSTRAINT `FK_botpetbuffs_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `botpetinventory` (
|
||||
`BotPetInventoryId` integer unsigned NOT NULL AUTO_INCREMENT,
|
||||
`BotPetsId` integer unsigned NOT NULL DEFAULT '0',
|
||||
`ItemId` integer unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetInventoryId`),
|
||||
KEY `FK_botpetinventory_1` (`BotPetsId`),
|
||||
CONSTRAINT `FK_botpetinventory_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/botinventory.sql;
|
||||
CREATE TABLE IF NOT EXISTS botinventory (
|
||||
BotInventoryID integer unsigned NOT NULL auto_increment,
|
||||
BotID integer unsigned NOT NULL DEFAULT '0',
|
||||
SlotID integer signed NOT NULL DEFAULT '0',
|
||||
ItemID integer unsigned NOT NULL DEFAULT '0',
|
||||
charges tinyint(3) unsigned DEFAULT 0,
|
||||
color integer unsigned NOT NULL DEFAULT 0,
|
||||
augslot1 mediumint(7) unsigned NOT NULL DEFAULT 0,
|
||||
augslot2 mediumint(7) unsigned NOT NULL DEFAULT 0,
|
||||
augslot3 mediumint(7) unsigned NOT NULL DEFAULT 0,
|
||||
augslot4 mediumint(7) unsigned NOT NULL DEFAULT 0,
|
||||
augslot5 mediumint(7) unsigned DEFAULT 0,
|
||||
instnodrop tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (BotInventoryID),
|
||||
KEY FK_botinventory_1 (BotID),
|
||||
CONSTRAINT FK_botinventory_1 FOREIGN KEY (BotID) REFERENCES bots (BotID)
|
||||
CREATE TABLE `botinventory` (
|
||||
`BotInventoryID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotID` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`SlotID` INTEGER SIGNED NOT NULL DEFAULT '0',
|
||||
`ItemID` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`charges` TINYINT(3) UNSIGNED DEFAULT 0,
|
||||
`color` INTEGER UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot1` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot2` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot3` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot4` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
|
||||
`augslot5` MEDIUMINT(7) UNSIGNED DEFAULT 0,
|
||||
`instnodrop` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`BotInventoryID`),
|
||||
KEY `FK_botinventory_1` (`BotID`),
|
||||
CONSTRAINT `FK_botinventory_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/botbuffs.sql;
|
||||
DROP TABLE IF EXISTS `botbuffs`;
|
||||
CREATE TABLE `botbuffs` (
|
||||
`BotBuffId` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`BotId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`SpellId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`CasterLevel` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`DurationFormula` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`TicsRemaining` int(11) unsigned NOT NULL DEFAULT '0',
|
||||
`PoisonCounters` int(11) unsigned NOT NULL DEFAULT '0',
|
||||
`DiseaseCounters` int(11) unsigned NOT NULL DEFAULT '0',
|
||||
`CurseCounters` int(11) unsigned NOT NULL DEFAULT '0',
|
||||
`CorruptionCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`HitCount` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`MeleeRune` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`MagicRune` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`DeathSaveSuccessChance` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`CasterAARank` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`Persistent` tinyint(1) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotBuffId`),
|
||||
KEY `FK_botbuff_1` (`BotId`),
|
||||
CONSTRAINT `FK_botbuff_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
|
||||
CREATE TABLE `botpets` (
|
||||
`BotPetsId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`PetId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`BotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Name` VARCHAR(64) NULL,
|
||||
`Mana` INTEGER NOT NULL DEFAULT '0',
|
||||
`HitPoints` INTEGER NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetsId`),
|
||||
KEY `FK_botpets_1` (`BotId`),
|
||||
CONSTRAINT `FK_botpets_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`),
|
||||
CONSTRAINT `U_botpets_1` UNIQUE (`BotId`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/botadventuring.sql;
|
||||
DELIMITER $$
|
||||
CREATE TABLE `botpetbuffs` (
|
||||
`BotPetBuffId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotPetsId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`SpellId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`CasterLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`Duration` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetBuffId`),
|
||||
KEY `FK_botpetbuffs_1` (`BotPetsId`),
|
||||
CONSTRAINT `FK_botpetbuffs_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE `botpetinventory` (
|
||||
`BotPetInventoryId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotPetsId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`ItemId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotPetInventoryId`),
|
||||
KEY `FK_botpetinventory_1` (`BotPetsId`),
|
||||
CONSTRAINT `FK_botpetinventory_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE `botgroup` (
|
||||
`BotGroupId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotGroupLeaderBotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`BotGroupName` VARCHAR(64) NOT NULL,
|
||||
PRIMARY KEY (`BotGroupId`),
|
||||
KEY `FK_botgroup_1` (`BotGroupLeaderBotId`),
|
||||
CONSTRAINT `FK_botgroup_1` FOREIGN KEY (`BotGroupLeaderBotId`) REFERENCES `bots` (`BotID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE `botgroupmembers` (
|
||||
`BotGroupMemberId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`BotGroupId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
`BotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotGroupMemberId`),
|
||||
KEY `FK_botgroupmembers_1` (`BotGroupId`),
|
||||
CONSTRAINT `FK_botgroupmembers_1` FOREIGN KEY (`BotGroupId`) REFERENCES `botgroup` (`BotGroupId`),
|
||||
KEY `FK_botgroupmembers_2` (`BotId`),
|
||||
CONSTRAINT `FK_botgroupmembers_2` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE `botguildmembers` (
|
||||
`char_id` INT(11) NOT NULL DEFAULT '0',
|
||||
`guild_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`rank` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`tribute_enable` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`total_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`last_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`banker` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`public_note` TEXT NULL,
|
||||
`alt` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`char_id`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
DELIMITER \\
|
||||
|
||||
DROP FUNCTION IF EXISTS `GetMobType` $$
|
||||
CREATE FUNCTION `GetMobType` (mobname VARCHAR(64)) RETURNS CHAR(1)
|
||||
BEGIN
|
||||
DECLARE Result CHAR(1);
|
||||
|
||||
SET Result = NULL;
|
||||
|
||||
IF (select count(*) from character_ where name = mobname) > 0 THEN
|
||||
SET Result = 'C';
|
||||
ELSEIF (select count(*) from bots where Name = mobname) > 0 THEN
|
||||
SET Result = 'B';
|
||||
END IF;
|
||||
|
||||
RETURN Result;
|
||||
END $$
|
||||
DECLARE Result CHAR(1);
|
||||
|
||||
SET Result = NULL;
|
||||
|
||||
IF (SELECT COUNT(*) FROM `character_data` WHERE `name` = mobname) > 0 THEN
|
||||
SET Result = 'C';
|
||||
ELSEIF (SELECT COUNT(*) FROM `bots` WHERE `Name` = mobname) > 0 THEN
|
||||
SET Result = 'B';
|
||||
END IF;
|
||||
|
||||
RETURN Result;
|
||||
END\\
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
DROP VIEW IF EXISTS `vwGroups`;
|
||||
CREATE VIEW `vwBotCharacterMobs` AS
|
||||
SELECT _utf8'C' AS mobtype,
|
||||
c.`id`,
|
||||
c.`name`,
|
||||
c.`class`,
|
||||
c.`level`,
|
||||
c.`last_login`,
|
||||
c.`zone_id`
|
||||
FROM `character_data` AS c
|
||||
UNION ALL
|
||||
SELECT _utf8'B' AS mobtype,
|
||||
b.`BotID` AS id,
|
||||
b.`Name` AS name,
|
||||
b.`Class` AS class,
|
||||
b.`BotLevel` AS level,
|
||||
0 AS timelaston,
|
||||
0 AS zoneid
|
||||
FROM bots AS b;
|
||||
|
||||
CREATE VIEW `vwGroups` AS
|
||||
select g.groupid as groupid,
|
||||
GetMobType(g.name) as mobtype,
|
||||
g.name as name,
|
||||
g.charid as mobid,
|
||||
ifnull(c.level, b.BotLevel) as level
|
||||
from group_id as g
|
||||
left join character_ as c on g.name = c.name
|
||||
left join bots as b on g.name = b.Name;
|
||||
SELECT g.`groupid` AS groupid,
|
||||
GetMobType(g.`name`) AS mobtype,
|
||||
g.`name` AS name,
|
||||
g.`charid` AS mobid,
|
||||
IFNULL(c.`level`, b.`BotLevel`) AS level
|
||||
FROM `group_id` AS g
|
||||
LEFT JOIN `character_data` AS c ON g.`name` = c.`name`
|
||||
LEFT JOIN `bots` AS b ON g.`name` = b.`Name`;
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/botgroups.sql;
|
||||
DROP TABLE IF EXISTS `botgroupmembers`;
|
||||
DROP TABLE IF EXISTS `botgroup`;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `botgroup` (
|
||||
`BotGroupId` integer unsigned NOT NULL AUTO_INCREMENT,
|
||||
`BotGroupLeaderBotId` integer unsigned NOT NULL DEFAULT '0',
|
||||
`BotGroupName` varchar(64) NOT NULL,
|
||||
PRIMARY KEY (`BotGroupId`),
|
||||
KEY FK_botgroup_1 (BotGroupLeaderBotId),
|
||||
CONSTRAINT FK_botgroup_1 FOREIGN KEY (BotGroupLeaderBotId) REFERENCES bots (BotID)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `botgroupmembers` (
|
||||
`BotGroupMemberId` integer unsigned NOT NULL AUTO_INCREMENT,
|
||||
`BotGroupId` integer unsigned NOT NULL DEFAULT '0',
|
||||
`BotId` integer unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`BotGroupMemberId`),
|
||||
KEY FK_botgroupmembers_1 (BotGroupId),
|
||||
CONSTRAINT FK_botgroupmembers_1 FOREIGN KEY (BotGroupId) REFERENCES botgroup (BotGroupId),
|
||||
KEY FK_botgroupmembers_2 (BotId),
|
||||
CONSTRAINT FK_botgroupmembers_2 FOREIGN KEY (BotId) REFERENCES bots (BotID)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
DROP VIEW IF EXISTS `vwBotGroups`;
|
||||
CREATE VIEW `vwBotGroups` AS
|
||||
select g.BotGroupId,
|
||||
g.BotGroupName,
|
||||
g.BotGroupLeaderBotId,
|
||||
b.Name as BotGroupLeaderName,
|
||||
b.BotOwnerCharacterId,
|
||||
c.name as BotOwnerCharacterName
|
||||
from botgroup as g
|
||||
join bots as b on g.BotGroupLeaderBotId = b.BotID
|
||||
join character_ as c on b.BotOwnerCharacterID = c.id
|
||||
order by b.BotOwnerCharacterId, g.BotGroupName;
|
||||
SELECT g.`BotGroupId`,
|
||||
g.`BotGroupName`,
|
||||
g.`BotGroupLeaderBotId`,
|
||||
b.`Name` AS BotGroupLeaderName,
|
||||
b.`BotOwnerCharacterId`,
|
||||
c.`name` AS BotOwnerCharacterName
|
||||
FROM `botgroup` AS g
|
||||
JOIN `bots` AS b ON g.`BotGroupLeaderBotId` = b.`BotID`
|
||||
JOIN `character_data` AS c ON b.`BotOwnerCharacterID` = c.`id`
|
||||
ORDER BY b.`BotOwnerCharacterId`, g.`BotGroupName`;
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/botstances.sql;
|
||||
CREATE TABLE botstances (
|
||||
BotID int(10) unsigned NOT NULL default '0',
|
||||
StanceID tinyint unsigned NOT NULL default '0',
|
||||
PRIMARY KEY (BotID),
|
||||
CONSTRAINT FK_botstances_1 FOREIGN KEY (BotID) REFERENCES bots (BotID)
|
||||
);
|
||||
|
||||
-- FILE:
|
||||
-- source player_tables/bottimers.sql;
|
||||
CREATE TABLE bottimers (
|
||||
BotID int(10) unsigned NOT NULL default '0',
|
||||
TimerID int(10) unsigned NOT NULL default '0',
|
||||
Value int(10) unsigned NOT NULL default '0',
|
||||
PRIMARY KEY (BotID),
|
||||
CONSTRAINT FK_bottimers_1 FOREIGN KEY (BotID) REFERENCES bots (BotID)
|
||||
)
|
||||
CREATE VIEW `vwGuildMembers` AS
|
||||
SELECT 'C' AS mobtype,
|
||||
cm.`char_id`,
|
||||
cm.`guild_id`,
|
||||
cm.`rank`,
|
||||
cm.`tribute_enable`,
|
||||
cm.`total_tribute`,
|
||||
cm.`last_tribute`,
|
||||
cm.`banker`,
|
||||
cm.`public_note`,
|
||||
cm.`alt`
|
||||
FROM `guild_members` AS cm
|
||||
UNION ALL
|
||||
SELECT 'B' AS mobtype,
|
||||
bm.`char_id`,
|
||||
bm.`guild_id`,
|
||||
bm.`rank`,
|
||||
bm.`tribute_enable`,
|
||||
bm.`total_tribute`,
|
||||
bm.`last_tribute`,
|
||||
bm.`banker`,
|
||||
bm.`public_note`,
|
||||
bm.`alt`
|
||||
FROM `botguildmembers` AS bm;
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
INSERT INTO altadv_vars SET skill_id="4698", name="Quick Draw", cost="5", max_level="1", hotkey_sid="4294967295", hotkey_sid2="4294967295", title_sid="4698", desc_sid="4698", type="1", spellid="4294967295", prereq_skill="0", prereq_minpoints="0", spell_type="0", spell_refresh="0", class_type="51", cost_inc="0", aa_expansion="12", special_category="4294967295", sof_type="1", sof_cost_inc="0", sof_max_level="2", sof_next_skill="4698", clientver="4", account_time_required="0", sof_current_level="0", sof_next_id="6545", level_inc="0", classes="65534", berserker="1";
|
||||
INSERT INTO aa_effects SET aaid=4698, slot=1, effectid=362, base1=1, base2=0;
|
||||
INSERT INTO altadv_vars SET skill_id="6545", name="Quick Draw II", cost="5", max_level="1", hotkey_sid="4294967295", hotkey_sid2="4294967295", title_sid="4698", desc_sid="4698", type="1", spellid="4294967295", prereq_skill="4698", prereq_minpoints="1", spell_type="0", spell_refresh="0", class_type="56", cost_inc="0", aa_expansion="14", special_category="4294967295", sof_type="1", sof_cost_inc="0", sof_max_level="2", sof_next_skill="4698", clientver="5", account_time_required="0", sof_current_level="1", sof_next_id="0", level_inc="0", classes="65534", berserker="1";
|
||||
INSERT INTO aa_effects SET aaid=6545, slot=1, effectid=362, base1=1, base2=0;
|
||||
@@ -0,0 +1 @@
|
||||
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Client:UseLiveFactionMessage', 'false', 'Allow players to see faction adjustments like Live.');
|
||||
@@ -0,0 +1 @@
|
||||
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Spells:SwarmPetTargetLock', 'false', 'Use old method of swarm pet AI, where they lock onto a set target then depop when target is dead.');
|
||||
@@ -0,0 +1 @@
|
||||
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'NPC:EnableMeritBasedFaction', 'false', 'If set to true, faction will be given in the same way as experience (solo/group/raid).');
|
||||
@@ -0,0 +1,3 @@
|
||||
/* Optional Transformation Rules */
|
||||
INSERT INTO `rule_values` VALUES (1, 'Inventory:DeleteTransformationMold', 'true', 'false to keep transformation mold forever');
|
||||
INSERT INTO `rule_values` VALUES (1, 'Inventory:AllowAnyWeaponTransformation', 'false', 'True allows any MELEE weapon to use the other melee type transformatios');
|
||||
@@ -0,0 +1 @@
|
||||
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Combat:ProjectileDmgOnImpact', 'true', 'If enabled, projectiles (ie arrows) will hit on impact, instead of instantly.');
|
||||
@@ -1,4 +1,5 @@
|
||||
ALTER TABLE `npc_types` ADD COLUMN `special_abilities` TEXT NOT NULL DEFAULT '' AFTER `npcspecialattks`;
|
||||
ALTER TABLE `npc_types` ADD COLUMN `special_abilities` TEXT NULL AFTER `npcspecialattks`;
|
||||
ALTER TABLE `npc_types` MODIFY COLUMN `special_abilities` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
|
||||
|
||||
UPDATE npc_types SET special_abilities = CONCAT(special_abilities, "1,1^") WHERE npcspecialattks LIKE BINARY '%S%';
|
||||
UPDATE npc_types SET special_abilities = CONCAT(special_abilities, "2,1^") WHERE npcspecialattks LIKE BINARY '%E%';
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
ALTER TABLE `merc_stats` ADD COLUMN `special_abilities` TEXT NOT NULL DEFAULT '' AFTER `specialattks`;
|
||||
|
||||
ALTER TABLE `merc_stats` ADD COLUMN `special_abilities` TEXT NULL AFTER `specialattks`;
|
||||
ALTER TABLE `merc_stats` MODIFY COLUMN `special_abilities` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
|
||||
|
||||
UPDATE merc_stats SET special_abilities = CONCAT(special_abilities, "1,1^") WHERE specialattks LIKE BINARY '%S%';
|
||||
UPDATE merc_stats SET special_abilities = CONCAT(special_abilities, "2,1^") WHERE specialattks LIKE BINARY '%E%';
|
||||
UPDATE merc_stats SET special_abilities = CONCAT(special_abilities, "3,1^") WHERE specialattks LIKE BINARY '%R%';
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
-- AA MGB update
|
||||
UPDATE altadv_vars SET spellid = 5228 WHERE skill_id = 128;
|
||||
UPDATE aa_actions SET spell_id = 5228, nonspell_action = 0 WHERE aaid = 128;
|
||||
|
||||
-- AA Project Illusion update
|
||||
UPDATE altadv_vars SET spellid = 5227 WHERE skill_id = 643;
|
||||
UPDATE aa_actions SET spell_id = 5227, nonspell_action = 0 WHERE aaid = 643;
|
||||
|
||||
-- AA Improved Reclaim Energy
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('180', '1', '241', '95', '0');
|
||||
|
||||
-- AA Headshot
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('644', '1', '217', '0', '32000');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('644', '2', '346', '46', '0');
|
||||
|
||||
-- AA Anatomy (Rogue Assassinate)
|
||||
INSERT INTO `altadv_vars` (`skill_id`, `name`, `cost`, `max_level`, `hotkey_sid`, `hotkey_sid2`, `title_sid`, `desc_sid`, `type`, `spellid`, `prereq_skill`, `prereq_minpoints`, `spell_type`, `spell_refresh`, `classes`, `berserker`, `class_type`, `cost_inc`, `aa_expansion`, `special_category`, `sof_type`, `sof_cost_inc`, `sof_max_level`, `sof_next_skill`, `clientver`, `account_time_required`, `sof_current_level`,`sof_next_id`,`level_inc`) VALUES ('1604', 'Anatomy', '5', '3', '4294967295', '4294967295', '1604', '1604', '1', '4294967295', '0', '0', '0', '0', '512', '0', '60', '1', '10', '4294967295', '3', '0', '3', '1604', '1', '0', '0', '0', '0');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1604', '1', '439', '0', '32000');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1604', '2', '345', '48', '0');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1605', '1', '439', '0', '32000');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1605', '2', '345', '51', '0');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1606', '1', '439', '0', '32000');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1606', '2', '345', '53', '0');
|
||||
|
||||
-- AA Finishing Blow Fix
|
||||
DELETE FROM aa_effects WHERE aaid = 199 AND slot = 2;
|
||||
DELETE FROM aa_effects WHERE aaid = 200 AND slot = 2;
|
||||
DELETE FROM aa_effects WHERE aaid = 201 AND slot = 2;
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('119', '1', '278', '500', '32000');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('119', '2', '440', '50', '200');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('120', '1', '278', '500', '32000');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('120', '2', '440', '52', '200');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('121', '1', '278', '500', '32000');
|
||||
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('121', '2', '440', '54', '200');
|
||||
@@ -1 +1 @@
|
||||
ALTER TABLE `account` ADD COLUMN `ban_reason` TEXT NULL DEFAULT NULL AFTER `expansion`, ADD COLUMN `suspend_reason` TEXT NULL DEFAULT NULL AFTER `ban_reason`;
|
||||
ALTER TABLE `account` ADD COLUMN `ban_reason` TEXT NULL DEFAULT NULL, ADD COLUMN `suspend_reason` TEXT NULL DEFAULT NULL AFTER `ban_reason`;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE `raid_details` ADD `motd` varchar(1024);
|
||||
@@ -0,0 +1,9 @@
|
||||
CREATE TABLE `raid_leaders` (
|
||||
`gid` int(4) unsigned NOT NULL,
|
||||
`rid` int(4) unsigned NOT NULL,
|
||||
`marknpc` varchar(64) NOT NULL,
|
||||
`maintank` varchar(64) NOT NULL,
|
||||
`assist` varchar(64) NOT NULL,
|
||||
`puller` varchar(64) NOT NULL,
|
||||
`leadershipaa` tinyblob NOT NULL
|
||||
);
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `group_leaders` ADD `mentoree` VARCHAR(64) NOT NULL;
|
||||
ALTER TABLE `group_leaders` ADD `mentor_percent` INT(4) DEFAULT 0 NOT NULL;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `raid_leaders` ADD `mentoree` VARCHAR(64) NOT NULL;
|
||||
ALTER TABLE `raid_leaders` ADD `mentor_percent` INT(4) DEFAULT 0 NOT NULL;
|
||||
@@ -0,0 +1,4 @@
|
||||
ALTER TABLE `merc_stats` MODIFY COLUMN `special_abilities` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
|
||||
|
||||
ALTER TABLE `npc_types` MODIFY COLUMN `special_abilities` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE `raid_members` CHANGE COLUMN `groupid` `groupid` INT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `charid`;
|
||||
@@ -0,0 +1,9 @@
|
||||
-- spells new table update
|
||||
ALTER TABLE `spells_new` CHANGE `field124` `disallow_sit` INT(11) NOT NULL DEFAULT '0';
|
||||
ALTER TABLE `spells_new` CHANGE `field125` `deities0` INT(11) NOT NULL DEFAULT '0';
|
||||
ALTER TABLE `spells_new` CHANGE `field196` `sneaking` INT(11) NOT NULL DEFAULT '0';
|
||||
ALTER TABLE `spells_new` CHANGE `field158` `effectdescnum2` INT(11) NOT NULL DEFAULT '0';
|
||||
ALTER TABLE `spells_new` CHANGE `field165` `ldon_trap` INT(11) NOT NULL DEFAULT '0';
|
||||
ALTER TABLE `spells_new` CHANGE `field205` `no_block` INT(11) NOT NULL DEFAULT '0';
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user