mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 13:16:39 +00:00
Compare commits
284 Commits
Stable-v1.0.3
...
eqsi
| Author | SHA1 | Date | |
|---|---|---|---|
| 751e61d6e5 | |||
| 4cb7d9a352 | |||
| b04844aa94 | |||
| b15ada974f | |||
| e2587b78f5 | |||
| 06dfba3c81 | |||
| 8aa942cd27 | |||
| a9070b1327 | |||
| 745510ea75 | |||
| f6d721dd72 | |||
| 0503e85fd3 | |||
| 0232f4f672 | |||
| 56d355935b | |||
| d260bb5cd4 | |||
| 4816c1fc9a | |||
| 50469b858b | |||
| 64998a398d | |||
| 9a3af63f65 | |||
| 5679f45f5b | |||
| 66c0da85e6 | |||
| 4246e4f79b | |||
| 90dc7a4e38 | |||
| bf28354301 | |||
| 5f1141dfb1 | |||
| 5b03fba463 | |||
| 0efd0c5f73 | |||
| 2947e3f39f | |||
| 77974c83d7 | |||
| d0bb3047f0 | |||
| 739b1bfaa3 | |||
| fb308eaa01 | |||
| 7c40bcff53 | |||
| ec87656d58 | |||
| 159ba9f487 | |||
| d8fe5124ff | |||
| fa337d441e | |||
| ea1ae1a0a4 | |||
| 95ea61114a | |||
| 585e5830f7 | |||
| bfb77803d8 | |||
| 364ab42c49 | |||
| 89183cf8b7 | |||
| aaa116d97c | |||
| 4360021fc9 | |||
| b7b233d46f | |||
| 5c43f2d80e | |||
| ed9b6db369 | |||
| dd0d15e134 | |||
| 29d6817019 | |||
| 46bb559af1 | |||
| 031a37baa1 | |||
| 62a4ce76b6 | |||
| d85e6ae495 | |||
| 32c4c360bd | |||
| f2a075d432 | |||
| 2dee62c850 | |||
| db380944ac | |||
| 28c5b32624 | |||
| 6db350790e | |||
| 3f8ff1373c | |||
| d6ee505c63 | |||
| e84b2ba224 | |||
| 4de9b2c53e | |||
| 385823461b | |||
| 85c28185a2 | |||
| 25de25a777 | |||
| 357a92dfee | |||
| 35c83db432 | |||
| f7cc1053f1 | |||
| d5864aea3e | |||
| 2b2d6e1ef5 | |||
| f99523dc48 | |||
| 69913c0897 | |||
| 75694e8797 | |||
| 24856b6a2d | |||
| a70291f20f | |||
| 6e1a5eac94 | |||
| 37b87e98f4 | |||
| 55d2e9b842 | |||
| 3afc5d0890 | |||
| f6b6fcc2c5 | |||
| 5039aa07a5 | |||
| 8048239a81 | |||
| ecdc0f7096 | |||
| 2c3107fbe9 | |||
| c2b31bd6e2 | |||
| a8ba563632 | |||
| 4065df7930 | |||
| 0b06044dce | |||
| 93464e3963 | |||
| 8dd18a43a0 | |||
| afe42ccdaf | |||
| f5a7117bdf | |||
| 696c02c0f0 | |||
| 6daf207323 | |||
| f67cd057f3 | |||
| 0789d10d3e | |||
| a07149919d | |||
| f9f3a8f3bd | |||
| 1def512b4c | |||
| b85d5a6d98 | |||
| 94fabc87f0 | |||
| d3afde1aa1 | |||
| 5a0d2b527b | |||
| 3d64878e60 | |||
| 26772b721c | |||
| 3c95545ea3 | |||
| ae5689ffb4 | |||
| e894e96404 | |||
| ed5715ccd9 | |||
| 7f9af238f8 | |||
| fd1e425abc | |||
| 35c1eccbe1 | |||
| 69f06f736c | |||
| 48fb483de6 | |||
| 8ce2921e3d | |||
| f06a9b3dce | |||
| 3efc925264 | |||
| a8db4532d0 | |||
| ab35f8b842 | |||
| ef3cf099b8 | |||
| 00cfe2d25f | |||
| 7a4c9b36a8 | |||
| 488c4941d2 | |||
| 97dc0a84dd | |||
| f01c890966 | |||
| 50de63117d | |||
| 4e4d82857c | |||
| 039e0fbb83 | |||
| e1a02455d8 | |||
| c1c9ec2790 | |||
| e90e141a79 | |||
| 38d3f9b7c0 | |||
| 7d62b208ca | |||
| 27f6826fd3 | |||
| 051f9ffab9 | |||
| bdb083eac7 | |||
| 4b93ef0a98 | |||
| e86d11250b | |||
| e5746c3b2e | |||
| 6a7ea65dd0 | |||
| 68df09a570 | |||
| d53d569020 | |||
| 1d12f92934 | |||
| e89fa01d89 | |||
| 4c49397ef6 | |||
| 8dc8e53218 | |||
| d0fbbed20d | |||
| 33407ee0da | |||
| c81a5e0783 | |||
| 66fec40169 | |||
| 60f2d14caa | |||
| 538d6a2a33 | |||
| f26dce39c3 | |||
| acb5bb3e3e | |||
| 16125c38af | |||
| 69db67efe5 | |||
| 37ecc69088 | |||
| d68a3b191e | |||
| 64cf613189 | |||
| f3da7773d3 | |||
| 7c9bd80c1e | |||
| 2bae779a9b | |||
| e862994716 | |||
| f612f8be42 | |||
| ef2c17748e | |||
| 4c4b0aba0c | |||
| 4decdb3e4d | |||
| 6b3078d0f7 | |||
| 3a4b341ad6 | |||
| 2a2ce6da5d | |||
| 239c478f31 | |||
| f6c62af82e | |||
| 84db0ec2c5 | |||
| 345f3d6301 | |||
| de5170c5cb | |||
| 7674b3a077 | |||
| 11e017ccb9 | |||
| bda4fcfb26 | |||
| a7fd9312d0 | |||
| 3963897fe4 | |||
| f42b0351fd | |||
| 37cb9f00f6 | |||
| 343b781e74 | |||
| f428a8a56a | |||
| cd9a7f1d5d | |||
| 83548ee405 | |||
| 5f588934a9 | |||
| 1f5dcb6965 | |||
| 5f111f159b | |||
| 527ee56fb2 | |||
| 8396f19e85 | |||
| aadc4b5e6b | |||
| ccb5427b45 | |||
| 8983f3c5dc | |||
| 9349d5d473 | |||
| ae6ceddab7 | |||
| 84c90715be | |||
| aeff31ba7a | |||
| f431e820ef | |||
| c41521c310 | |||
| f437232db1 | |||
| 3ed43d50f2 | |||
| 7cd613e5f2 | |||
| 921136c987 | |||
| d4df2e7351 | |||
| 9cf553232d | |||
| 6cb2fdd737 | |||
| bbf4d19de3 | |||
| 02cedce54e | |||
| 871fcd1fc8 | |||
| 7457d832f8 | |||
| a9ff407657 | |||
| 1ba7f0cd65 | |||
| 56fcabc119 | |||
| 402353affa | |||
| bc196f2e50 | |||
| 148eaf7048 | |||
| b44da7c13a | |||
| 4b57f69cba | |||
| 542d454fe0 | |||
| 3d61df253d | |||
| dcd276a5ce | |||
| bacaf6453e | |||
| 860ee81a38 | |||
| bcec9501b7 | |||
| 37b46d1289 | |||
| 54de212214 | |||
| a64343689c | |||
| 3e0af2928b | |||
| a5d79b25db | |||
| cb8843926c | |||
| 59ec184208 | |||
| 9a010a90a9 | |||
| 3d6fe8acba | |||
| 02ec76d2aa | |||
| 8615df0a03 | |||
| 951f3239f1 | |||
| fe630bf7ca | |||
| 1a2537f5d8 | |||
| 7b04b9ef4a | |||
| 30b516e7bd | |||
| c72749790d | |||
| 05780a9316 | |||
| 3889da7301 | |||
| 57ebfd2675 | |||
| b10187f9de | |||
| af99db7287 | |||
| 306ecf003a | |||
| 2b2ebc75b0 | |||
| 83bb10b32b | |||
| d9bdcf2aec | |||
| 3e25a3df5c | |||
| 73e91be281 | |||
| 471d7ec42d | |||
| 1b6974ade3 | |||
| c1a6a23e06 | |||
| 9ec299247c | |||
| 79549ba330 | |||
| 4b15121f70 | |||
| c29219f214 | |||
| 51d8f00418 | |||
| e843f66135 | |||
| 542dc16752 | |||
| 62888170b0 | |||
| ca0b26f89f | |||
| cd8cd90a38 | |||
| ae3c98c692 | |||
| 767dfaef70 | |||
| c07fe35908 | |||
| ea8f81feec | |||
| a38417bf54 | |||
| 0f54984966 | |||
| 6c1af93f58 | |||
| 16895910e4 | |||
| b155a603aa | |||
| ecc9e41ab2 | |||
| 2a74d04635 | |||
| a089820464 | |||
| 579efe83af | |||
| a37a811014 | |||
| 0ecc702612 | |||
| a144ecd21b | |||
| 772fa200ac |
@@ -30,6 +30,7 @@
|
|||||||
#EQEMU_BUILD_LUA
|
#EQEMU_BUILD_LUA
|
||||||
#EQEMU_SANITIZE_LUA_LIBS
|
#EQEMU_SANITIZE_LUA_LIBS
|
||||||
#EQEMU_BUILD_CLIENT_FILES
|
#EQEMU_BUILD_CLIENT_FILES
|
||||||
|
#EQEMU_USE_MAP_MMFS
|
||||||
#EQEMU_MAP_DIR
|
#EQEMU_MAP_DIR
|
||||||
|
|
||||||
#We set a fairly new version (as of 2013) because I found finding perl was a bit... buggy on older ones
|
#We set a fairly new version (as of 2013) because I found finding perl was a bit... buggy on older ones
|
||||||
@@ -275,6 +276,11 @@ IF(EQEMU_BUILD_LUA)
|
|||||||
ADD_DEFINITIONS(-DLUA_EQEMU)
|
ADD_DEFINITIONS(-DLUA_EQEMU)
|
||||||
ENDIF(EQEMU_BUILD_LUA)
|
ENDIF(EQEMU_BUILD_LUA)
|
||||||
|
|
||||||
|
OPTION(EQEMU_USE_MAP_MMFS "Create and use Zone Map MMF files." OFF)
|
||||||
|
IF(EQEMU_USE_MAP_MMFS)
|
||||||
|
ADD_DEFINITIONS(-DUSE_MAP_MMFS)
|
||||||
|
ENDIF(EQEMU_USE_MAP_MMFS)
|
||||||
|
|
||||||
SET(EQEMU_MAP_DIR "./Maps" CACHE STRING "The dir that maps, water maps, and paths are located in.")
|
SET(EQEMU_MAP_DIR "./Maps" CACHE STRING "The dir that maps, water maps, and paths are located in.")
|
||||||
|
|
||||||
ADD_DEFINITIONS(-DEQDEBUG=${EQEMU_DEBUG_LEVEL})
|
ADD_DEFINITIONS(-DEQDEBUG=${EQEMU_DEBUG_LEVEL})
|
||||||
|
|||||||
@@ -1,53 +1,59 @@
|
|||||||
EQEmu
|
# EQEmulator Core Server
|
||||||
===
|
|Travis CI (Linux)|Appveyor (Windows) |
|
||||||
|
|:---:|:---:|
|
||||||
|
|[](https://travis-ci.org/EQEmu/Server) |[](https://ci.appveyor.com/project/KimLS/server/branch/master) |
|
||||||
|
|
||||||
[](https://travis-ci.org/EQEmu/Server)
|
***
|
||||||
|
|
||||||
Overview
|
**EQEmulator is a custom completely from-scratch open source server implementation for EverQuest built mostly on C++**
|
||||||
---
|
* MySQL/MariaDB is used as the database engine (over 200+ tables)
|
||||||
|
* Perl and LUA are both supported scripting languages for NPC/Player/Quest oriented events
|
||||||
|
* Open source database (Project EQ) has content up to expansion GoD (included in server installs)
|
||||||
|
* Game server environments and databases can be heavily customized to create all new experiences
|
||||||
|
* Hundreds of Quests/events created and maintained by Project EQ
|
||||||
|
|
||||||
EQEmu is a custom server implementation for EverQuest
|
## Server Installs
|
||||||
|
||Windows|Linux|
|
||||||
|
|:---:|:---:|:---:|
|
||||||
|
|**Install Count**|||
|
||||||
|
### > Windows
|
||||||
|
* [Easy Install](http://wiki.eqemulator.org/p?Akkas_PEQ_Server_Installer&frm=Main#from-scratch-installation-instructions-windows)
|
||||||
|
* [Advanced Setup](http://wiki.eqemulator.org/p?Complete_Windows-based_Server_Setup_Guide)
|
||||||
|
|
||||||
Dependencies
|
### > Debian/Ubuntu
|
||||||
---
|
|
||||||
|
|
||||||
For Windows: http://eqemu.github.io
|
> wget --no-check-certificate https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/linux_installer/install.sh -O install.sh && chmod 755 install.sh && ./install.sh
|
||||||
|
|
||||||
Login Server dependencies for Windows/Linux/OSX: http://eqemu.github.io
|
### > CentOS/Fedora
|
||||||
|
|
||||||
For Debian based distros (adjust to your local flavor):
|
> curl -O https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/linux_installer/install.sh install.sh && chmod 755 install.sh && ./install.sh
|
||||||
|
|
||||||
- libmysqlclient-dev
|
## Supported Clients
|
||||||
- libperl-dev
|
|
||||||
- liblua5.1-0-dev (5.2 should work as well)
|
|
||||||
- libboost-dev
|
|
||||||
|
|
||||||
Further instructions on building the source can be found on the
|
|Titanium Edition|Secrets of Faydwer|Seeds of Destruction|Underfoot|Rain of Fear|
|
||||||
[wiki](http://wiki.eqemulator.org/i?M=Wiki).
|
|:---:|:---:|:---:|:---:|:---:|
|
||||||
|
|<img src="http://i.imgur.com/hrwDxoM.jpg" height="150">|<img src="http://i.imgur.com/cRDW5tn.png" height="150">|<img src="http://i.imgur.com/V48kuVn.jpg" height="150">|<img src="http://i.imgur.com/IJQ0XMa.jpg" height="150">|<img src="http://i.imgur.com/OMpHkKa.png" height="100">|
|
||||||
|
|
||||||
Bug reports
|
## Bug Reports <img src="http://i.imgur.com/daf1Vjw.png" height="20">
|
||||||
---
|
* Please use the [issue tracker](https://github.com/EQEmu/Server/issues) provided by GitHub to send us bug
|
||||||
|
|
||||||
Please use the [issue tracker](https://github.com/EQEmu/Server/issues) provided by GitHub to send us bug
|
|
||||||
reports or feature requests.
|
reports or feature requests.
|
||||||
|
* The [EQEmu Forums](http://www.eqemulator.org/forums/) are also a place to submit and get help with bugs.
|
||||||
|
|
||||||
The [EQEmu Forums](http://www.eqemulator.org/forums/) also have forums to submit
|
## Contributions <img src="http://image.flaticon.com/icons/png/512/25/25231.png" width="20">
|
||||||
bugs/get help with bugs.
|
|
||||||
|
|
||||||
Contributions
|
* The preferred way to contribute is to fork the repo and submit a pull request on
|
||||||
---
|
|
||||||
|
|
||||||
The preferred way to contribute is to fork the repo and submit a pull request on
|
|
||||||
GitHub. If you need help with your changes, you can always post on the forums or
|
GitHub. If you need help with your changes, you can always post on the forums or
|
||||||
try IRC. You can also post unified diffs (`git diff` should do the trick) on the
|
try Discord. You can also post unified diffs (`git diff` should do the trick) on the
|
||||||
[Server Code Submissions](http://www.eqemulator.org/forums/forumdisplay.php?f=669)
|
[Server Code Submissions](http://www.eqemulator.org/forums/forumdisplay.php?f=669)
|
||||||
forum, although pull requests will be much quicker and easier on all parties.
|
forum, although pull requests will be much quicker and easier on all parties.
|
||||||
|
|
||||||
Contact
|
## Contact <img src="http://gamerescape.com/wp-content/uploads/2015/06/discord.png" height="20">
|
||||||
---
|
|
||||||
- **User IRC Channel**: `#eqemu` on `irc.eqemulator.net`
|
|
||||||
- **Developer IRC Channel**: `#eqemucoders` on `irc.eqemulator.net`
|
|
||||||
|
|
||||||
|
- Discord Channel: https://discord.gg/QHsm7CD
|
||||||
|
- **User Discord Channel**: `#general`
|
||||||
|
- **Developer Discord Channel**: `#eqemucoders`
|
||||||
|
|
||||||
|
Resources
|
||||||
|
---
|
||||||
- [EQEmulator Forums](http://www.eqemulator.org/forums)
|
- [EQEmulator Forums](http://www.eqemulator.org/forums)
|
||||||
- [EQEmulator Wiki](http://wiki.eqemulator.org/i?M=Wiki)
|
- [EQEmulator Wiki](http://wiki.eqemulator.org/i?M=Wiki)
|
||||||
|
|
||||||
|
|||||||
+305
-134
@@ -1,5 +1,176 @@
|
|||||||
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
== 09/12/2016 ==
|
||||||
|
Akkadius: Massive overhaul of the update system and EQEmu Server management utility framework
|
||||||
|
(known as eqemu_update.pl) now known as eqemu_server.pl
|
||||||
|
- eqemu_server.pl is now a general EQEmu Server management utiltiy framework that can be used
|
||||||
|
to extend to many purposes. It's main purpose is to simplify server management
|
||||||
|
- eqemu_server.pl changes:
|
||||||
|
- Menu has been completely changed, instead of a number based (enter number and hit enter)
|
||||||
|
you now type commands within the menu (Ex: 'database')
|
||||||
|
- Handles last mile installation for Windows Servers (See Github Readme)
|
||||||
|
- Handles last mile installation for Linux Servers (See Github Readme)
|
||||||
|
- Ubuntu
|
||||||
|
- Debian
|
||||||
|
- Fedora
|
||||||
|
- CentOS
|
||||||
|
- Now checks for Internet connection before performing web requests
|
||||||
|
- Database:
|
||||||
|
- Regular schema updates now happen automatically, if new binaries present updated
|
||||||
|
database schema changes, script will backup first, auto update database, and continue
|
||||||
|
world bootup
|
||||||
|
- Regular bots database schema changes now happen automatically similarily to the above
|
||||||
|
- Database checks can also be ran manually via the script menu
|
||||||
|
- CLI Arguments
|
||||||
|
- Arguments passed to eqemu_server.pl can execute the same name-based operations that
|
||||||
|
are present in the interactive menu
|
||||||
|
- Example: "perl eqemu_server.pl opcodes" will download opcodes
|
||||||
|
- Example: "perl eqemu_server.pl backup_player_tables" will backup and export player tables
|
||||||
|
- Bots
|
||||||
|
- Bots can now be automatically setup in Linux or Windows via the 'setup_bots' command
|
||||||
|
- Windows will auto download binaries and install, along with installing bots db schema
|
||||||
|
- Linxu will auto compile binaries and install, along with installings bots db schema
|
||||||
|
- Utility scripts
|
||||||
|
- Linux now has the following utility scripts for download, available via menu 'utility_scripts'
|
||||||
|
and via Linux default install:
|
||||||
|
- server_launcher.pl
|
||||||
|
- server_start_dev.sh
|
||||||
|
- server_start.sh
|
||||||
|
- server_status.sh
|
||||||
|
- server_stop.sh
|
||||||
|
- Usage analytics
|
||||||
|
- eqemu_server.pl now collects usage analytics, this is very helpful for our developers
|
||||||
|
- Example: We can see how many installs have been performed:
|
||||||
|
https://github.com/EQEmu/Server#server-installs
|
||||||
|
- This helps us see how often certain utilities are used as well
|
||||||
|
- Console Messages
|
||||||
|
- All script messages have been prefixed with a bracket action Ex: [Update] [Database] [Info]
|
||||||
|
to be more consistent with our log conventions
|
||||||
|
- 'New Server' Utility
|
||||||
|
- Running 'new_server' from the main menu or 'perl eqemu_server.pl new_server' while in
|
||||||
|
a completely new folder with just the script present, will allow a server operator
|
||||||
|
to initiate a full clean PEQ install in that folder. Pulling down all assets and
|
||||||
|
installing a PEQ database with the name the server operator gives the prompts in the
|
||||||
|
script
|
||||||
|
|
||||||
|
== 09/10/2016 ==
|
||||||
|
noudess: Task system experience based on a % of a level did not take into
|
||||||
|
account the hell levels rule. Now it does.
|
||||||
|
|
||||||
|
== 09/04/2016 (Changes over past few months) ==
|
||||||
|
Akkadius: Fixed an issue where clients would crash with health marquee's
|
||||||
|
Akkadius: Fixed issues with NPC's "ghosting" when they path
|
||||||
|
Akkadius: Overhauled worldserver logging
|
||||||
|
Akkadius: Pets now don't actually spawn until the player has fully entered the zone (Live-like)
|
||||||
|
demonstar/KLS: Adjusted some background workings on how spell buff tics are synced with the client
|
||||||
|
Uleat: Optimizations to map loading and zone times
|
||||||
|
Uleat/Akkadius: Fixed bandolier exploit where you could equip a 2H and Shield
|
||||||
|
mackal: Re-worked spell re-use timer logic
|
||||||
|
mackal: Source optimizations all over, crash fixes
|
||||||
|
mackal: Fixed some issues with illusions on zoning
|
||||||
|
mackal: Fixed some client DOT stacking bugs
|
||||||
|
mackal: Invis will now break on AA spell casts and item cast
|
||||||
|
mackal: Changed how Loot response code works
|
||||||
|
mackal: Implemented 3 additional spell gems with (Mnemonic Retention)
|
||||||
|
mackal: Instant spells now have instrument mods
|
||||||
|
mackal: Rate limit character saves
|
||||||
|
mackal: Made it so items no longer do TGB (Live-like) Rule implemented to disable
|
||||||
|
mackal: Set pet buffs limit to 30
|
||||||
|
|
||||||
|
== 09/03/2016 ==
|
||||||
|
Uleat: Changed 'Bind Wound' behavior to match the best references that I could find for post-2004 era.
|
||||||
|
Note: If you wish to retain the old method, source in the optional '2016_09_03_old_bind_wound_rule.sql' script file.
|
||||||
|
|
||||||
|
== 08/27/2016 ==
|
||||||
|
Kinglykrab: Added optional IP-based account exemptions.
|
||||||
|
- To use this system simply set World:EnableIPExemptions to true and create an entry in the ip_exemptions table.
|
||||||
|
- Example: exemption_ip of IP 192.168.1.4 in ip_exemptions with exemption_amount of 1 will allow only 1 account to login from IP 192.168.1.4.
|
||||||
|
- Note: If there is no exemption, the amount of accounts logged in from a singular IP will default to World:MaxClientsPerIP
|
||||||
|
|
||||||
|
== 08/23/2016 ==
|
||||||
|
noudess: Force mobs on a depop @ end pathgrid to still do this on idle zones.
|
||||||
|
This makes them be more random after a zone is idle, rather than always showing
|
||||||
|
up at start point when 1st person logs into an idle zone. Much more like live.
|
||||||
|
I dion't think this will be much of a performance problem. Once they path and
|
||||||
|
depop, no mkore cpu usage.
|
||||||
|
|
||||||
|
== 08/14/2016 ==
|
||||||
|
mackal: Implement Linked Spell Reuse Timers
|
||||||
|
- For whatever reason this is a bit unfriendly, but that's how it is on live.
|
||||||
|
- Titanium is especially unfriendly with large differences in reuse times (ex higher canni and the first 4)
|
||||||
|
- Unsure when this went live for spells, but canni was at least linked at OoW launch
|
||||||
|
|
||||||
|
== 08/13/2016 ==
|
||||||
|
Kinglykrab: Implemented optional avoidance cap rules.
|
||||||
|
- Serves to eliminate God-like characters on custom servers with high item stats
|
||||||
|
- Rule Names:
|
||||||
|
- Character:EnableAvoidanceCap (default is false)
|
||||||
|
- Character:AvoidanceCap (default is 750, beyond 1,000 seems to make characters dodge all attacks)
|
||||||
|
|
||||||
|
== 08/02/2016 ==
|
||||||
|
Uleat: Changed 'SendZoneSpawnsBulk' behavior to use near/far criteria (live-like) when sending packets.
|
||||||
|
- Zone-to-Zone client loading will see a small decrease in time (less than 10~15%)
|
||||||
|
- World-to-Zone client loading appears to greatly benefit from this (tested 'devastation' - pre-change: ~22 seconds, post-change: 12~15 seconds)
|
||||||
|
- This change does not affect the final spawning of mobs in the client
|
||||||
|
|
||||||
|
== 07/31/2016 ==
|
||||||
|
mackal: Implement more spell gems!
|
||||||
|
- There are a few things still left to due like make dealing with losing gems nice (reset AAs, going to an older client etc)
|
||||||
|
- Sadly SoF disc release doesn't support gem 10 like one might expect :(
|
||||||
|
- So changed clients:
|
||||||
|
- SoD = 10
|
||||||
|
- UF = 12
|
||||||
|
- RoF/RoF2 = 12. I know the UI supports 16, but the client does not and can cause client crashes
|
||||||
|
- The quest APIs assume you pass a valid spell gem ...
|
||||||
|
|
||||||
|
== 07/28/2016 ==
|
||||||
|
Uleat: Implemented zone memory-mapped file usage
|
||||||
|
- Zone map files are converted to pre-loaded binary files, bypassing the (sometimes) time-consuming raw data transform process
|
||||||
|
- There are three ways to convert files:
|
||||||
|
-- Do nothing! The zone bootup process will check for a mmf file and load it, if found, or create it after the 'normal' transform process is complete
|
||||||
|
-- Use the command line option: zone convert_map <zone_name>.map (for singular conversions)
|
||||||
|
-- Drop the 'convert_maps_to_mmfs.pl' into your server directory and execute it for a batch conversion
|
||||||
|
-- Note: Any zone maps not pre-converted will be processed once a zone is booted up that does not have one
|
||||||
|
- To enable this feature, you must have the 'USE_MAP_MMFS' option checked in cmake and have built binaries on that
|
||||||
|
- To disable this feature, or if you encouter problems, disable the 'USE_MAP_MMFS' option and rebuild your binaries
|
||||||
|
- This feature will test the validity of your zlib library. If you get errors/crashes upon conversion, then your zlib1.dll is most likely suspect (check our forum for solutions)
|
||||||
|
|
||||||
|
== 07/25/2016 ==
|
||||||
|
mackal: Fix up the SpellBuff struct
|
||||||
|
- THERE MAYBE BUGS
|
||||||
|
- there shouldn't though, most of the hackery was from badly named fields causing confusion
|
||||||
|
|
||||||
|
== 07/09/2016 ==
|
||||||
|
Uleat: Important fix for mob pathing
|
||||||
|
- This should fix failed pathing issues (and high cpu usage for zone.exe) for mobs in affect zones
|
||||||
|
- Changed variable 'gridno' type from int16 to int32 to reflect actual return value of fetch (values do exceed 32767 aka int16.max)
|
||||||
|
- Precision loss from int32 to int16 conversion was causing grid id to be changed to quest controlled movement in cases where (gridno & 0x8000 == true)
|
||||||
|
|
||||||
|
== 06/28/2016 ==
|
||||||
|
Noudess: Resurrection effects now block certain buffs like on live.
|
||||||
|
Noudess: Added message about why spells are blocked (rule based)
|
||||||
|
Noudess: Added new rule: Client:UseLiveBlockedMessage
|
||||||
|
Uleat: Fix for bot inventory save failure involving items with unlimited charges
|
||||||
|
|
||||||
|
== 06/13/2016 ==
|
||||||
|
Noudess: Changes personal faction earned min/max to -2000/2000 from -3000/1200
|
||||||
|
|
||||||
|
== 06/06/2016 ==
|
||||||
|
Uleat: Reworked EQEmuDictionary to use class LookupEntry
|
||||||
|
|
||||||
|
== 06/01/2016 ==
|
||||||
|
Uleat: Implemented EQEmu::TintProfile
|
||||||
|
Uleat: Implemented EQEmu::TextureProfile
|
||||||
|
|
||||||
|
== 05/31/2016 ==
|
||||||
|
Uleat: Converted enumeration MaterialSlots to EQEmu::textures::TextureSlot
|
||||||
|
|
||||||
|
== 05/28/2016 ==
|
||||||
|
Uleat: Merged client_version and inventory_version into emu_versions files
|
||||||
|
|
||||||
|
== 05/27/2016 ==
|
||||||
|
Uleat: Renamed EQEmu::Item_Struct to EQEmu::ItemBase (and appropriate files) to coincide with new inventory naming conventions
|
||||||
|
|
||||||
== 05/25/2016 ==
|
== 05/25/2016 ==
|
||||||
Uleat: Renamed and moved enumeration SkillUseTypes to EQEmu::skill::SkillType - added class EQEmu::SkillProfile, though not implemented at this time
|
Uleat: Renamed and moved enumeration SkillUseTypes to EQEmu::skill::SkillType - added class EQEmu::SkillProfile, though not implemented at this time
|
||||||
Uleat: Some more work on eq_dictionary
|
Uleat: Some more work on eq_dictionary
|
||||||
@@ -318,10 +489,10 @@ mackal: Reworked the activated avoidace skills (riposte, dodge, etc) based on de
|
|||||||
Also riposte immunity from the increase riposte chance spell effect.
|
Also riposte immunity from the increase riposte chance spell effect.
|
||||||
|
|
||||||
== 7/2/2015 ==
|
== 7/2/2015 ==
|
||||||
KLS/Demonstar55: AA system has been rewritten fixing a ton of bugs and extending functionality while making it easier to create new AA points.
|
KLS/mackal: AA system has been rewritten fixing a ton of bugs and extending functionality while making it easier to create new AA points.
|
||||||
KLS/Demonstar55: New tables are needed and so older data will need to be migrated to the new system.
|
KLS/mackal: New tables are needed and so older data will need to be migrated to the new system.
|
||||||
KLS/Demonstar55: The SQL saves the old aa points spent/avail/character_alt_abilities data if any server ops want to do something different than PEQ did with it.
|
KLS/mackal: The SQL saves the old aa points spent/avail/character_alt_abilities data if any server ops want to do something different than PEQ did with it.
|
||||||
KLS/Demonstar55: Will try to get a wiki entry written up next week some time explaining the system but it's really not hard to follow the db tables in the meantime.
|
KLS/mackal: Will try to get a wiki entry written up next week some time explaining the system but it's really not hard to follow the db tables in the meantime.
|
||||||
|
|
||||||
== 7/1/2015 ==
|
== 7/1/2015 ==
|
||||||
Akkadius: Fix an issue where emote messages would overflow the buffer of 256 by increasing the size and changing some of the initialization
|
Akkadius: Fix an issue where emote messages would overflow the buffer of 256 by increasing the size and changing some of the initialization
|
||||||
@@ -351,7 +522,7 @@ Akkadius: Added DB ver 9082 with update to add npc_types texture columns if tabl
|
|||||||
Uleat: Added null-term declaration for character names in ENCODE(OP_CharInfo) - where appropriate
|
Uleat: Added null-term declaration for character names in ENCODE(OP_CharInfo) - where appropriate
|
||||||
|
|
||||||
== 05/20/2015 ==
|
== 05/20/2015 ==
|
||||||
demonstar55: Bard instrument mods should be more consistent with live. Zoning will keep instrument mod for long duration buffs (selo's)
|
mackal: Bard instrument mods should be more consistent with live. Zoning will keep instrument mod for long duration buffs (selo's)
|
||||||
Still need to have procs/doom effects to inherit the instrument mods from their source buff/whatever
|
Still need to have procs/doom effects to inherit the instrument mods from their source buff/whatever
|
||||||
|
|
||||||
== 05/18/2015 ==
|
== 05/18/2015 ==
|
||||||
@@ -361,7 +532,7 @@ KLS: Changed how fishing locates water to hopefully be a bit more accurate at th
|
|||||||
Uleat: Added check to EntityList::CheckSpawnQueue() to bypass dereference if returned iterator is npc_list.end() - should fix the debug assertion failure crash
|
Uleat: Added check to EntityList::CheckSpawnQueue() to bypass dereference if returned iterator is npc_list.end() - should fix the debug assertion failure crash
|
||||||
|
|
||||||
== 04/30/2015 ==
|
== 04/30/2015 ==
|
||||||
demonstar55: Implement mob and client melee push
|
mackal: Implement mob and client melee push
|
||||||
You can set Combat:MeleePush to false to turn off or change Combat:MeleePushChance to increase the chance an NPC can be pushed
|
You can set Combat:MeleePush to false to turn off or change Combat:MeleePushChance to increase the chance an NPC can be pushed
|
||||||
PCs are always pushed, need to do more testing to verify.
|
PCs are always pushed, need to do more testing to verify.
|
||||||
|
|
||||||
@@ -415,7 +586,7 @@ Uleat: Fix for RoF+ clients showing active 'Return Home' button when action is n
|
|||||||
Noudess: Starting erudites that were supposed to start in paineel were landing in erudin on Titanium. Fixed to be paineel.
|
Noudess: Starting erudites that were supposed to start in paineel were landing in erudin on Titanium. Fixed to be paineel.
|
||||||
|
|
||||||
== 02/20/2015 ==
|
== 02/20/2015 ==
|
||||||
demonstar55: Implement claims for RoF/RoF2 (should no longer crash the client!)
|
mackal: Implement claims for RoF/RoF2 (should no longer crash the client!)
|
||||||
- fixed bugs related to claims for the rest of the clients (woo infinite loops)
|
- fixed bugs related to claims for the rest of the clients (woo infinite loops)
|
||||||
|
|
||||||
== 02/18/2015 ==
|
== 02/18/2015 ==
|
||||||
@@ -434,7 +605,7 @@ Notes:
|
|||||||
|
|
||||||
== 02/16/2015 ==
|
== 02/16/2015 ==
|
||||||
Trevius: (RoF2) Bazaar Trading (Buying/Selling) is now fully functional. Bazaar (/bazaar) search is not yet functional.
|
Trevius: (RoF2) Bazaar Trading (Buying/Selling) is now fully functional. Bazaar (/bazaar) search is not yet functional.
|
||||||
demonstar55: (RoF2) Send the bard focus effects, note custom servers will need to fix their items, server side we still use the old system, but RoF2 wasn't showing anything with not sending focus, so send them
|
mackal: (RoF2) Send the bard focus effects, note custom servers will need to fix their items, server side we still use the old system, but RoF2 wasn't showing anything with not sending focus, so send them
|
||||||
|
|
||||||
== 02/14/2015 ==
|
== 02/14/2015 ==
|
||||||
Trevius: (RoF2) Bazaar is now partially functional. RoF2 clients can start/end trader mode and other clients can purchase from them. No other functionality yet.
|
Trevius: (RoF2) Bazaar is now partially functional. RoF2 clients can start/end trader mode and other clients can purchase from them. No other functionality yet.
|
||||||
@@ -484,7 +655,7 @@ Akkadius: Implement Packet logs with dumps
|
|||||||
See: http://wiki.eqemulator.org/p?Logging_System_Overhaul#packet-logging-levels
|
See: http://wiki.eqemulator.org/p?Logging_System_Overhaul#packet-logging-levels
|
||||||
|
|
||||||
== 02/01/2015 ==
|
== 02/01/2015 ==
|
||||||
demonstar55: Add quest debugging to lua
|
mackal: Add quest debugging to lua
|
||||||
eq.debug("Test debug level implicit 1")
|
eq.debug("Test debug level implicit 1")
|
||||||
eq.debug("Test debug level explicit 1", 1)
|
eq.debug("Test debug level explicit 1", 1)
|
||||||
eq.debug("Test debug level explicit 2", 2)
|
eq.debug("Test debug level explicit 2", 2)
|
||||||
@@ -677,7 +848,7 @@ Trevius: Finished lining up the RoF2 Player Profile Struct. Zone times are now
|
|||||||
Trevius: Fixed zoning after death for RoF2.
|
Trevius: Fixed zoning after death for RoF2.
|
||||||
|
|
||||||
== 12/17/2014 ==
|
== 12/17/2014 ==
|
||||||
demonstar55: Use vectors for route stuff, should be more CPU cache friendly so faster
|
mackal: Use vectors for route stuff, should be more CPU cache friendly so faster
|
||||||
Secrets: EQStream changes as recommended by a community member in private.
|
Secrets: EQStream changes as recommended by a community member in private.
|
||||||
|
|
||||||
== 12/15/2014 ==
|
== 12/15/2014 ==
|
||||||
@@ -687,7 +858,7 @@ Trevius: Player Corpses now saved attuned settings for Items.
|
|||||||
Required SQL: utils/sql/git/required/2014_12_15_multiple_table_updates.sql
|
Required SQL: utils/sql/git/required/2014_12_15_multiple_table_updates.sql
|
||||||
|
|
||||||
== 12/13/2014 ==
|
== 12/13/2014 ==
|
||||||
demonstar55: Fix guild rank spam on zone (needed to be in OP_PP).
|
mackal: Fix guild rank spam on zone (needed to be in OP_PP).
|
||||||
Trevius: (RoF+) Implemented Armor Ornamentation using Hero's Forge Armor Models. To use, create an ornamentation augment and set the herosforgemodel field in the items table.
|
Trevius: (RoF+) Implemented Armor Ornamentation using Hero's Forge Armor Models. To use, create an ornamentation augment and set the herosforgemodel field in the items table.
|
||||||
Trevius: (RoF+) Added command #heromodel (#hm for short) - Usage: #heromodel [hero forge model] [ [slot] ] (example: #heromodel 63)
|
Trevius: (RoF+) Added command #heromodel (#hm for short) - Usage: #heromodel [hero forge model] [ [slot] ] (example: #heromodel 63)
|
||||||
|
|
||||||
@@ -695,11 +866,11 @@ Be sure to run this or there will be item loss:
|
|||||||
Required SQL: utils/sql/git/required/2014_12_13_inventory_table_update.sql
|
Required SQL: utils/sql/git/required/2014_12_13_inventory_table_update.sql
|
||||||
|
|
||||||
== 12/12/2014 ==
|
== 12/12/2014 ==
|
||||||
demonstar55: Add special attack 42, Ignore Root Aggro Rules. This allows you to root a mob and have them still use the normal aggro rules (so they will attack the one with most hate, not closest)
|
mackal: Add special attack 42, Ignore Root Aggro Rules. This allows you to root a mob and have them still use the normal aggro rules (so they will attack the one with most hate, not closest)
|
||||||
|
|
||||||
== 12/09/2014 ==
|
== 12/09/2014 ==
|
||||||
Trevius: (RoF+) Implemented Hero's Forge Armor Models for Items. To use, set herosforgemodel field in the item table to a model number such as 63 (for example).
|
Trevius: (RoF+) Implemented Hero's Forge Armor Models for Items. To use, set herosforgemodel field in the item table to a model number such as 63 (for example).
|
||||||
demonstar55: SoF+ swarm pets will no longer be F8able (without a hack!)
|
mackal: SoF+ swarm pets will no longer be F8able (without a hack!)
|
||||||
|
|
||||||
== 12/08/2014 ==
|
== 12/08/2014 ==
|
||||||
Secrets: Added a feature that allows an EQ client to log in directly to World without having to enter the LoginServer, provided the 'password' field is set in WorldServer.
|
Secrets: Added a feature that allows an EQ client to log in directly to World without having to enter the LoginServer, provided the 'password' field is set in WorldServer.
|
||||||
@@ -745,10 +916,10 @@ Trevius: Mercenaries now Dismiss, Suspend, Unsuspend, and Die correctly.
|
|||||||
Trevius: Mercenaries can now zone once again.
|
Trevius: Mercenaries can now zone once again.
|
||||||
|
|
||||||
== 11/17/2014 ==
|
== 11/17/2014 ==
|
||||||
demonstar55: Correct OP_AugmentInfo reply. This fixes RoF display issue with Adventurer's Stone. Still issues with UF/SoF/SoD though.
|
mackal: Correct OP_AugmentInfo reply. This fixes RoF display issue with Adventurer's Stone. Still issues with UF/SoF/SoD though.
|
||||||
|
|
||||||
== 11/16/2014 ==
|
== 11/16/2014 ==
|
||||||
demonstar55: fix size issue with ControlBoat_Struct and exploit fix in OP_BoardBoat
|
mackal: fix size issue with ControlBoat_Struct and exploit fix in OP_BoardBoat
|
||||||
|
|
||||||
Akkadius: Implemented Automatic Database update and versioning system
|
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
|
Akkadius: Created database revision define, this is located in version.h in common #define CURRENT_BINARY_DATABASE_VERSION 9057
|
||||||
@@ -825,12 +996,12 @@ Optional SQL: utils/sql/git/optional/2014_11_15_SwarmPetTargetLock.sql
|
|||||||
|
|
||||||
== 11/14/2014 ==
|
== 11/14/2014 ==
|
||||||
Secrets: Identified object size and solidtype as flags. Exported them as functions to Perl.
|
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
|
mackal: Don't use the hack for charms that doesn't work on RoF
|
||||||
demonstar55: UF too
|
mackal: UF too
|
||||||
demonstar55: Tit
|
mackal: Tit
|
||||||
demonstar55: SoF
|
mackal: SoF
|
||||||
demonstar55: SoD
|
mackal: SoD
|
||||||
demonstar55: 62 (untested)
|
mackal: 62 (untested)
|
||||||
|
|
||||||
== 11/13/2014 ==
|
== 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 (44) 'Beams' (which projects an AE infront of caster with a specified length and width).
|
||||||
@@ -856,7 +1027,7 @@ JJ: Implement new Live-like faction adjustment message using rule Client:UseLive
|
|||||||
Optional SQL: utils/sql/git/optional/2014_11_09_LiveFactionMessages.sql
|
Optional SQL: utils/sql/git/optional/2014_11_09_LiveFactionMessages.sql
|
||||||
|
|
||||||
== 11/06/2014 ==
|
== 11/06/2014 ==
|
||||||
demonstar55: Tracking default sort will now be correct order
|
mackal: Tracking default sort will now be correct order
|
||||||
Trevius: Fixed dynamic merchant list loading. Allows any merchant to be used in any zone.
|
Trevius: Fixed dynamic merchant list loading. Allows any merchant to be used in any zone.
|
||||||
|
|
||||||
== 11/03/2014 ==
|
== 11/03/2014 ==
|
||||||
@@ -880,17 +1051,17 @@ Uleat: Added Client::InterrogateInventory(). Can be invoked by #interrogateinv a
|
|||||||
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.
|
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 ==
|
== 10/20/2014 ==
|
||||||
demonstar55: Inspect Buffs rank 1 will now show NPC buffs in target window (SoD+)
|
mackal: Inspect Buffs rank 1 will now show NPC buffs in target window (SoD+)
|
||||||
|
|
||||||
== 10/19/2014 ==
|
== 10/19/2014 ==
|
||||||
Uleat: Updated command #peekinv to display item links properly in RoF clients
|
Uleat: Updated command #peekinv to display item links properly in RoF clients
|
||||||
demonstar55: Group Mentoring in raids
|
mackal: Group Mentoring in raids
|
||||||
demonstar55: Inspect Buffs (text only version) works in raid groups
|
mackal: 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
|
mackal: Make use of the Inspect Buffs op/packet. 62 SOL until someone finds its op
|
||||||
|
|
||||||
== 10/18/2014==
|
== 10/18/2014==
|
||||||
demonstar55: Implement group mentor, sharing leadership exp (SoF+ only)
|
mackal: Implement group mentor, sharing leadership exp (SoF+ only)
|
||||||
demonstar55: Add gaining of group leadership while in raids
|
mackal: Add gaining of group leadership while in raids
|
||||||
|
|
||||||
== 10/16/2014 ==
|
== 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.
|
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.
|
||||||
@@ -903,7 +1074,7 @@ Notes: I modifed the behavior of both load and drop bots to fail on the first op
|
|||||||
a few altered tables back to their original state - as of the date in the file.
|
a few altered tables back to their original state - as of the date in the file.
|
||||||
|
|
||||||
== 10/13/2014 ==
|
== 10/13/2014 ==
|
||||||
demonstar55: Partially implement leadership and raids
|
mackal: Partially implement leadership and raids
|
||||||
Currently working: client side only effects and stat bonuses.
|
Currently working: client side only effects and stat bonuses.
|
||||||
Not working: Mark NPC, and other stuff that need extra server side support
|
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)
|
Currently only UF tested (Tit and 62 may just work, others need packet work)
|
||||||
@@ -912,7 +1083,7 @@ demonstar55: Partially implement leadership and raids
|
|||||||
Akkadius: Fix for LDON Character Stat load
|
Akkadius: Fix for LDON Character Stat load
|
||||||
|
|
||||||
== 10/11/2014 ==
|
== 10/11/2014 ==
|
||||||
demonstar55: Implement Raid MOTD for UF
|
mackal: Implement Raid MOTD for UF
|
||||||
Don't forget 2014_10_11_RaidMOTD.sql!
|
Don't forget 2014_10_11_RaidMOTD.sql!
|
||||||
|
|
||||||
== 10/09/2014 ==
|
== 10/09/2014 ==
|
||||||
@@ -925,7 +1096,7 @@ previously and/or manually changed code, or just have a need for it to re-run, c
|
|||||||
** This will only work if you haven't deleted your `character_old` table **
|
** This will only work if you haven't deleted your `character_old` table **
|
||||||
|
|
||||||
== 10/07/2014 ==
|
== 10/07/2014 ==
|
||||||
demonstar55: Identified tutorial flag in all charcreate packets, reworked logic to correctly set homes binds
|
mackal: Identified tutorial flag in all charcreate packets, reworked logic to correctly set homes binds
|
||||||
|
|
||||||
== 10/05/2014 ==
|
== 10/05/2014 ==
|
||||||
Uleat: Added Server<->Corpse slot translators needed for re-enumeration (inactive until phased in)
|
Uleat: Added Server<->Corpse slot translators needed for re-enumeration (inactive until phased in)
|
||||||
@@ -943,13 +1114,13 @@ Uleat: First round of Ti/6.2 translators added - needed for re-enumeration
|
|||||||
|
|
||||||
== 10/01/2014 ==
|
== 10/01/2014 ==
|
||||||
Kayen: Exported to PERL $client->SendColoredText(color, msg)
|
Kayen: Exported to PERL $client->SendColoredText(color, msg)
|
||||||
demonstar55: Exported SendColoredText to lua
|
mackal: Exported SendColoredText to lua
|
||||||
|
|
||||||
== 09/30/2014 ==
|
== 09/30/2014 ==
|
||||||
Uleat: Implemented click-casting from bag slots for clients that natively support it (RoF)
|
Uleat: Implemented click-casting from bag slots for clients that natively support it (RoF)
|
||||||
|
|
||||||
== 09/28/2014 ==
|
== 09/28/2014 ==
|
||||||
demonstar55: Add support for post June 18, 2014 Hundred Hands Effect spells (they changed the formula and stuff)
|
mackal: Add support for post June 18, 2014 Hundred Hands Effect spells (they changed the formula and stuff)
|
||||||
set Spells:Jun182014HundredHandsRevamp to true if you're using a spell file from June 18, 2014+
|
set Spells:Jun182014HundredHandsRevamp to true if you're using a spell file from June 18, 2014+
|
||||||
|
|
||||||
== 09/27/2014 ==
|
== 09/27/2014 ==
|
||||||
@@ -958,15 +1129,15 @@ Note: identifier is the stat field in spells_new, slot is used for certain effec
|
|||||||
Example $mob->GetSpellStat(121, "range"); //Returns spell range
|
Example $mob->GetSpellStat(121, "range"); //Returns spell range
|
||||||
Example $mob->GetSpellStat(121, "effectid", 1); //Returns the the value of effectid1
|
Example $mob->GetSpellStat(121, "effectid", 1); //Returns the the value of effectid1
|
||||||
This will allow you to pull almost all the data for any spell in quest files.
|
This will allow you to pull almost all the data for any spell in quest files.
|
||||||
demonstar55: Move the client's SetAttackTimer to the end of Client::CalcBonuses to keep the haste in sync
|
mackal: Move the client's SetAttackTimer to the end of Client::CalcBonuses to keep the haste in sync
|
||||||
demonstar55: Correct haste/slow "stacking" rules
|
mackal: Correct haste/slow "stacking" rules
|
||||||
demonstar55: Correct SE_AttackSpeed4 to respect unslowable
|
mackal: Correct SE_AttackSpeed4 to respect unslowable
|
||||||
demonstar55: Make the haste be between 1-225 like the client (<100 = slow, >100 = haste) to ...
|
mackal: Make the haste be between 1-225 like the client (<100 = slow, >100 = haste) to ...
|
||||||
demonstar55: Correct Hundred Hands effect and use formula provided by devs
|
mackal: Correct Hundred Hands effect and use formula provided by devs
|
||||||
|
|
||||||
== 09/24/2014 ==
|
== 09/24/2014 ==
|
||||||
Uleat: Re-ordered server opcodes and handlers to give them some predictability of location (I need this for the inventory re-enumeration.)
|
Uleat: Re-ordered server opcodes and handlers to give them some predictability of location (I need this for the inventory re-enumeration.)
|
||||||
demonstar55: Added helper function bool EQEmu::IsTradeskill(uint32 skill)
|
mackal: Added helper function bool EQEmu::IsTradeskill(uint32 skill)
|
||||||
|
|
||||||
== 09/23/2014 ==
|
== 09/23/2014 ==
|
||||||
Kayen: Spell recourse effects will now be applied AFTER the base spells effects have been applied (consistent with live).
|
Kayen: Spell recourse effects will now be applied AFTER the base spells effects have been applied (consistent with live).
|
||||||
@@ -1075,46 +1246,46 @@ Akkadius: Player Profile Blob to Database Conversion
|
|||||||
ORDER BY DATA DESC;
|
ORDER BY DATA DESC;
|
||||||
|
|
||||||
== 09/20/2014 ==
|
== 09/20/2014 ==
|
||||||
demonstar55: Fix crash in SendEnterWorld on illegally long names
|
mackal: Fix crash in SendEnterWorld on illegally long names
|
||||||
demonstar55: The client only lets you enter 15 characters for your name (UF at least)
|
mackal: The client only lets you enter 15 characters for your name (UF at least)
|
||||||
demonstar55: Add rule Spells:SHDProcIDOffByOne for pre-UF spell file, set to true, UF+ set to false
|
mackal: Add rule Spells:SHDProcIDOffByOne for pre-UF spell file, set to true, UF+ set to false
|
||||||
KLS: #suspend and #ban now have required messages to record the reason for the ban/suspension.
|
KLS: #suspend and #ban now have required messages to record the reason for the ban/suspension.
|
||||||
|
|
||||||
== 09/19/2014 ==
|
== 09/19/2014 ==
|
||||||
demonstar55: Added Client::Tell_StringID (used in tell queue messages)
|
mackal: Added Client::Tell_StringID (used in tell queue messages)
|
||||||
demonstar55: Tell queues (and offline) messages now show correctly
|
mackal: Tell queues (and offline) messages now show correctly
|
||||||
demonstar55: Fix starting with capital check
|
mackal: Fix starting with capital check
|
||||||
|
|
||||||
== 09/18/2014==
|
== 09/18/2014==
|
||||||
demonstar55: Implement tell queues
|
mackal: Implement tell queues
|
||||||
Currently set to a limit of 20 by default (World:TellQueueSize) I was unable to hit the limit on live though (100+)
|
Currently set to a limit of 20 by default (World:TellQueueSize) I was unable to hit the limit on live though (100+)
|
||||||
The required SQL nukes the old tell queue table, which may or may not be in your DB
|
The required SQL nukes the old tell queue table, which may or may not be in your DB
|
||||||
Optional SQL adds the rule to the DB to allow easy of change
|
Optional SQL adds the rule to the DB to allow easy of change
|
||||||
Note: this does not play well with multiple sessions with the same name on (crash and relog and have multiple sessions) but normal tells don't play well either
|
Note: this does not play well with multiple sessions with the same name on (crash and relog and have multiple sessions) but normal tells don't play well either
|
||||||
|
|
||||||
== 09/16/2014 ==
|
== 09/16/2014 ==
|
||||||
demonstar55: Implement spell formula 137 (BER AA Desperation)
|
mackal: Implement spell formula 137 (BER AA Desperation)
|
||||||
Uleat (NateDog): Fix for LoadBuffs() crash when a spell with a non-persistent Illusion effect was loaded.
|
Uleat (NateDog): Fix for LoadBuffs() crash when a spell with a non-persistent Illusion effect was loaded.
|
||||||
demonstar55: Fix some effect calcs + implement more (derived from the client)
|
mackal: Fix some effect calcs + implement more (derived from the client)
|
||||||
|
|
||||||
== 09/15/2014 ==
|
== 09/15/2014 ==
|
||||||
Kayen: Nimbus effects will now be reapplied after zoning and will be removed when associated buff fades.
|
Kayen: Nimbus effects will now be reapplied after zoning and will be removed when associated buff fades.
|
||||||
|
|
||||||
== 09/13/2014 ==
|
== 09/13/2014 ==
|
||||||
demonstar55: Fix rogues not having Thieves' Cant
|
mackal: Fix rogues not having Thieves' Cant
|
||||||
|
|
||||||
== 09/09/2014 ==
|
== 09/09/2014 ==
|
||||||
demonstar55: Incrase Mob kick/bash timer by 3
|
mackal: Incrase Mob kick/bash timer by 3
|
||||||
see: http://www.eqemulator.org/forums/showthread.php?t=38734
|
see: http://www.eqemulator.org/forums/showthread.php?t=38734
|
||||||
demonstar55: Fix slow effect on NPC special attack reuse timers
|
mackal: Fix slow effect on NPC special attack reuse timers
|
||||||
see: http://www.eqemulator.org/forums/showthread.php?t=38734
|
see: http://www.eqemulator.org/forums/showthread.php?t=38734
|
||||||
demonstar55: Slow fixes to bots!
|
mackal: Slow fixes to bots!
|
||||||
demonstar55: Revamped how NPC attack rate is set
|
mackal: Revamped how NPC attack rate is set
|
||||||
SQL: 2014_09_09_attack_delay.sql
|
SQL: 2014_09_09_attack_delay.sql
|
||||||
demonstar55: Added attackdelay to #npcedit
|
mackal: Added attackdelay to #npcedit
|
||||||
|
|
||||||
== 09/08/2014 ==
|
== 09/08/2014 ==
|
||||||
demonstar55: Fix slow calc
|
mackal: Fix slow calc
|
||||||
see: http://www.eqemulator.org/forums/showthread.php?t=38734
|
see: http://www.eqemulator.org/forums/showthread.php?t=38734
|
||||||
|
|
||||||
== 09/07/2014 ==
|
== 09/07/2014 ==
|
||||||
@@ -1125,18 +1296,18 @@ Uleat: Tweaked 'Smart' trading code to return main slots before sub slots in sta
|
|||||||
|
|
||||||
== 09/05/2014 ==
|
== 09/05/2014 ==
|
||||||
Uleat: Fix for cursor item loss when zoning. (Thanks to the other devs who traced and fixed the 'macro' issue!)
|
Uleat: Fix for cursor item loss when zoning. (Thanks to the other devs who traced and fixed the 'macro' issue!)
|
||||||
demonstar55: Fix size getting nuked with lua's SendIllusionPacket
|
mackal: Fix size getting nuked with lua's SendIllusionPacket
|
||||||
|
|
||||||
== 09/03/2014 ==
|
== 09/03/2014 ==
|
||||||
Secrets: Identified the routines needed to augment items in RoF. Currently, only Insert and Remove are supported. Swap and Destroy do not work due to missing functions related to the cursor.
|
Secrets: Identified the routines needed to augment items in RoF. Currently, only Insert and Remove are supported. Swap and Destroy do not work due to missing functions related to the cursor.
|
||||||
demonstar55: Added work around command to show numhits on your buffs (#shownumhits)
|
mackal: Added work around command to show numhits on your buffs (#shownumhits)
|
||||||
Uleat: Fix for timer issue introduced by Zone::ShutDown() fix.
|
Uleat: Fix for timer issue introduced by Zone::ShutDown() fix.
|
||||||
|
|
||||||
== 09/02/2014 ==
|
== 09/02/2014 ==
|
||||||
Secrets: Identified OP_GuildPromote for RoF clients.
|
Secrets: Identified OP_GuildPromote for RoF clients.
|
||||||
Secrets: Fixed promotion, demotion, transferring a leader and displaying of client ranks in the Rain of Fear client. The rain of fear client, as such, will only have 3 ranks like the other clients, but supports a theoretical 8 ranks later.
|
Secrets: Fixed promotion, demotion, transferring a leader and displaying of client ranks in the Rain of Fear client. The rain of fear client, as such, will only have 3 ranks like the other clients, but supports a theoretical 8 ranks later.
|
||||||
Secrets/Akkadius: Fixed an issue involving character name lookup in the new DB code.
|
Secrets/Akkadius: Fixed an issue involving character name lookup in the new DB code.
|
||||||
demonstar55: crash fix checking DivineAura in hate_list.cpp
|
mackal: crash fix checking DivineAura in hate_list.cpp
|
||||||
Secrets: Reverted some code that got in the main branch that shouldn't have gotten there.
|
Secrets: Reverted some code that got in the main branch that shouldn't have gotten there.
|
||||||
Uleat: Changed #loc to report the same precision as /loc for Cartesians
|
Uleat: Changed #loc to report the same precision as /loc for Cartesians
|
||||||
|
|
||||||
@@ -1147,7 +1318,7 @@ KLS: Fixed a few quest related inconsistencies.
|
|||||||
KLS: Added Lua EntityList::ChannelMessage(from, type, msg, language)
|
KLS: Added Lua EntityList::ChannelMessage(from, type, msg, language)
|
||||||
|
|
||||||
== 08/30/2014 ==
|
== 08/30/2014 ==
|
||||||
demonstar55: (noudess) Merchants should be more descriptive of why they don't sell to you
|
mackal: (noudess) Merchants should be more descriptive of why they don't sell to you
|
||||||
|
|
||||||
== 08/26/2014 ==
|
== 08/26/2014 ==
|
||||||
Uleat: Implemented 'Smart' Player Trade transfers. Trades are processed by containers, stackables and then all remaining. QueryServ logs have been updated to match these transactions.
|
Uleat: Implemented 'Smart' Player Trade transfers. Trades are processed by containers, stackables and then all remaining. QueryServ logs have been updated to match these transactions.
|
||||||
@@ -1525,7 +1696,7 @@ Optional SQL: utils/sql/git/optional/2014_04_03_SpellProjectileRules.sql
|
|||||||
Note: The rules in this SQL are for setting the item id for the graphic used by the projectile on different clients.
|
Note: The rules in this SQL are for setting the item id for the graphic used by the projectile on different clients.
|
||||||
|
|
||||||
== 04/01/2014 ==
|
== 04/01/2014 ==
|
||||||
demonstar55: Implemented ability for a merchant to open and close shop.
|
mackal: Implemented ability for a merchant to open and close shop.
|
||||||
Lua quest functions: e.self:MerchantOpenShop() and e.self:MerchantCloseShop()
|
Lua quest functions: e.self:MerchantOpenShop() and e.self:MerchantCloseShop()
|
||||||
GM Commands: #merchant_open_shop (short: #open_shop) and #merchant_close_shop (short: #close_shop)
|
GM Commands: #merchant_open_shop (short: #open_shop) and #merchant_close_shop (short: #close_shop)
|
||||||
default to status 100, just in case you need to force the merchants status
|
default to status 100, just in case you need to force the merchants status
|
||||||
@@ -1591,7 +1762,7 @@ Kayen: Revision to lull/harmony/pacification code to be consistent with live bas
|
|||||||
which if 'resisted' will cause the caster to gain aggro.
|
which if 'resisted' will cause the caster to gain aggro.
|
||||||
|
|
||||||
== 03/05/2014 ==
|
== 03/05/2014 ==
|
||||||
demonstar55: Corrected rogue's evade to be single target
|
mackal: Corrected rogue's evade to be single target
|
||||||
sorvani: fixed crash issue 119
|
sorvani: fixed crash issue 119
|
||||||
|
|
||||||
== 03/04/2014 ==
|
== 03/04/2014 ==
|
||||||
@@ -1606,7 +1777,7 @@ Kayen: Revision to root code to be consistent with live based on extensive perso
|
|||||||
Optional SQL: utils/sql/git/optional/2014_03_04_RootRule.sql
|
Optional SQL: utils/sql/git/optional/2014_03_04_RootRule.sql
|
||||||
|
|
||||||
== 03/03/2014 ==
|
== 03/03/2014 ==
|
||||||
demonstar55: Implemented deadly strikes and gave rogues higher innate throwing crit chance
|
mackal: Implemented deadly strikes and gave rogues higher innate throwing crit chance
|
||||||
|
|
||||||
New rules: Combat:RogueCritThrowingChance, Combat:RogueDeadlyStrikeChance, Combat:RogueDeadlyStrikeMod
|
New rules: Combat:RogueCritThrowingChance, Combat:RogueDeadlyStrikeChance, Combat:RogueDeadlyStrikeMod
|
||||||
Defaults should give fairly close to live results
|
Defaults should give fairly close to live results
|
||||||
@@ -1618,7 +1789,7 @@ Kayen: Revision to charm code to be consistent with live based on extensive pers
|
|||||||
|
|
||||||
Optional SQL: utils/sql/git/optional/2014_03_02_CharmRules.sql
|
Optional SQL: utils/sql/git/optional/2014_03_02_CharmRules.sql
|
||||||
|
|
||||||
demonstar55: Melee Crits, HoTs, DoTs messages should now be filtered correctly on all clients.
|
mackal: Melee Crits, HoTs, DoTs messages should now be filtered correctly on all clients.
|
||||||
Clients that also support seeing others DoTs will now see them if they don't filter them
|
Clients that also support seeing others DoTs will now see them if they don't filter them
|
||||||
note: some newer clients have a 'mine only' option for HoTs but it functions the same as show
|
note: some newer clients have a 'mine only' option for HoTs but it functions the same as show
|
||||||
|
|
||||||
@@ -1670,7 +1841,7 @@ Sorvani: Renamed the instance_lockout and instance_lockout_player tables to inst
|
|||||||
Required SQL: utils/sql/git/2014_02_13_Rename_instance_lockout_tables.sql
|
Required SQL: utils/sql/git/2014_02_13_Rename_instance_lockout_tables.sql
|
||||||
|
|
||||||
== 02/10/2014 ==
|
== 02/10/2014 ==
|
||||||
demonstar55 (Secrets): Re-wrote the entity list to be a std::map. This should be used for direct entityID lookups and is noticably faster performance-wise. Also should result in less nil pointers potentially.
|
mackal (Secrets): Re-wrote the entity list to be a std::map. This should be used for direct entityID lookups and is noticably faster performance-wise. Also should result in less nil pointers potentially.
|
||||||
Secrets: Fixed a crash issue that could occur on #repop related to quest timers.
|
Secrets: Fixed a crash issue that could occur on #repop related to quest timers.
|
||||||
Kayen: Divine Arbiration and other similar spell effects will now utilize a spell range check.
|
Kayen: Divine Arbiration and other similar spell effects will now utilize a spell range check.
|
||||||
Kayen: Revised how heal amount is calculated to properly incorporate all current focus effects/bonuses.
|
Kayen: Revised how heal amount is calculated to properly incorporate all current focus effects/bonuses.
|
||||||
@@ -1701,14 +1872,14 @@ Kayen: Implemented SE_FfLimitUseType (focus limit to numhits type)
|
|||||||
|
|
||||||
== 01/20/2014 ==
|
== 01/20/2014 ==
|
||||||
cavedude: Live-Like weather system (Thanks to robregen for figuring it out!)
|
cavedude: Live-Like weather system (Thanks to robregen for figuring it out!)
|
||||||
demonstar55: Implemented not_extendable spell flag
|
mackal: Implemented not_extendable spell flag
|
||||||
demonstar55: Moved Spell Casting Reinforcement to DB
|
mackal: Moved Spell Casting Reinforcement to DB
|
||||||
demonstar55: Moved Mez Mastery to DB
|
mackal: Moved Mez Mastery to DB
|
||||||
Kayen: Complete revision of the numhits systems to utilize 'numhits type' field in spell file.
|
Kayen: Complete revision of the numhits systems to utilize 'numhits type' field in spell file.
|
||||||
|
|
||||||
== 01/18/2014 ==
|
== 01/18/2014 ==
|
||||||
sorvani: Implemented for Lua eq.get_characters_in_instance(uint16 instance_id), return a Lua HashTable
|
sorvani: Implemented for Lua eq.get_characters_in_instance(uint16 instance_id), return a Lua HashTable
|
||||||
demonstar55: NPCs will now cast their charms.
|
mackal: NPCs will now cast their charms.
|
||||||
|
|
||||||
== 01/13/2014 ==
|
== 01/13/2014 ==
|
||||||
Kayen: Numerous minor fixes to spell effects.
|
Kayen: Numerous minor fixes to spell effects.
|
||||||
@@ -1728,19 +1899,19 @@ Kayen: Implemented SE_LimitRace (Limits to spells cast by a certain race)
|
|||||||
Kayen: Implemented SE_FcMute (silences casting of spells that contain specific spell effects) ie silence only heals
|
Kayen: Implemented SE_FcMute (silences casting of spells that contain specific spell effects) ie silence only heals
|
||||||
|
|
||||||
== 01/09/2014 ==
|
== 01/09/2014 ==
|
||||||
demonstar55: Add pet size preservation like live (zone, camp, etc)
|
mackal: Add pet size preservation like live (zone, camp, etc)
|
||||||
|
|
||||||
== 01/07/2014 ==
|
== 01/07/2014 ==
|
||||||
demonstar55: Moved pet can attack check to before it tries to attack, which is more live like.
|
mackal: Moved pet can attack check to before it tries to attack, which is more live like.
|
||||||
|
|
||||||
== 01/03/2014 ==
|
== 01/03/2014 ==
|
||||||
demonstar55: Crash prevention for emote.
|
mackal: Crash prevention for emote.
|
||||||
|
|
||||||
== 01/02/2014 ==
|
== 01/02/2014 ==
|
||||||
demonstar55: Stuns from beneficial spells (Harvest) ignore immunity
|
mackal: Stuns from beneficial spells (Harvest) ignore immunity
|
||||||
|
|
||||||
== 12/26/2013 ==
|
== 12/26/2013 ==
|
||||||
demonstar55: Added classes_required to merchantlist (same bitmask as items)
|
mackal: Added classes_required to merchantlist (same bitmask as items)
|
||||||
|
|
||||||
== 12/24/2013 ==
|
== 12/24/2013 ==
|
||||||
Secrets (Akkadius): Perl $client->SilentMessage("Message"); addition, this is a pre-req for a Perl plugin I've shared with EQEmu. This function essentially mimics a player speaking with an NPC - which is used in popup window responses
|
Secrets (Akkadius): Perl $client->SilentMessage("Message"); addition, this is a pre-req for a Perl plugin I've shared with EQEmu. This function essentially mimics a player speaking with an NPC - which is used in popup window responses
|
||||||
@@ -1761,14 +1932,14 @@ Kayen: Implemented SE_TriggerOnAmountValue (Trigger spell if HP/Mana/End bellow
|
|||||||
Kayen: Fix to SE_BlockNextSpellFocus to make it functional again.
|
Kayen: Fix to SE_BlockNextSpellFocus to make it functional again.
|
||||||
|
|
||||||
== 12/15/2013 ==
|
== 12/15/2013 ==
|
||||||
demonstar55: Moved the blocked buff check down so we get spell effects like on live
|
mackal: Moved the blocked buff check down so we get spell effects like on live
|
||||||
Kayen: Implemented SE_ReduceHealing (Reduces amount of healing on target by X amount)
|
Kayen: Implemented SE_ReduceHealing (Reduces amount of healing on target by X amount)
|
||||||
Kayen: Implemented SE_CastonFocusEffect (Triggers spell as part of a focus, when that focus effect is used)
|
Kayen: Implemented SE_CastonFocusEffect (Triggers spell as part of a focus, when that focus effect is used)
|
||||||
Kayen: Implemented SE_IncreaseHitDmgTaken (Effect is triggered when X amount of damage is taken)
|
Kayen: Implemented SE_IncreaseHitDmgTaken (Effect is triggered when X amount of damage is taken)
|
||||||
Kayen: More fixes for various spell triggers/procs to now properly use their resist modifier.
|
Kayen: More fixes for various spell triggers/procs to now properly use their resist modifier.
|
||||||
|
|
||||||
== 12/14/2013 ==
|
== 12/14/2013 ==
|
||||||
demonstar55: Blocked buffs shouldn't fail, they should just not be applied.
|
mackal: Blocked buffs shouldn't fail, they should just not be applied.
|
||||||
JJ: Changed enable/disable recipe to confirm change made.
|
JJ: Changed enable/disable recipe to confirm change made.
|
||||||
|
|
||||||
== 12/13/2013 ==
|
== 12/13/2013 ==
|
||||||
@@ -1779,52 +1950,52 @@ Kayen: Fix for various spell triggers/procs to now properly use their resist mod
|
|||||||
Kayen: Fix to mob->ModSkillDmgTaken(skill_num, value), setting value to -1 will now properly effect all skills.
|
Kayen: Fix to mob->ModSkillDmgTaken(skill_num, value), setting value to -1 will now properly effect all skills.
|
||||||
|
|
||||||
== 12/11/2013 ==
|
== 12/11/2013 ==
|
||||||
demonstar55: Fixed issue with crippling blow from berserker frenzy not actually doing anything
|
mackal: Fixed issue with crippling blow from berserker frenzy not actually doing anything
|
||||||
demonstar55: Fix haste caps
|
mackal: Fix haste caps
|
||||||
|
|
||||||
== 12/04/2013 ==
|
== 12/04/2013 ==
|
||||||
demonstar55: Fixed SpellType_Charm case in AICastSpell
|
mackal: Fixed SpellType_Charm case in AICastSpell
|
||||||
|
|
||||||
== 12/03/2013 ==
|
== 12/03/2013 ==
|
||||||
demonstar55: Added #showspellslist to view a mobs spell list
|
mackal: Added #showspellslist to view a mobs spell list
|
||||||
demonstar55: Fix procing off of unattackable things
|
mackal: Fix procing off of unattackable things
|
||||||
|
|
||||||
== 12/02/2013 ==
|
== 12/02/2013 ==
|
||||||
JJ: Bandaid fix to CopyCharacter function.
|
JJ: Bandaid fix to CopyCharacter function.
|
||||||
|
|
||||||
== 11/29/2013 ==
|
== 11/29/2013 ==
|
||||||
demonstar55: Stacking issues should be resolved now, probably could be optimized more, but went from 3 loops that do stuff to 3 where only 2 really does stuff and one breaks early in most cases, so slightly better
|
mackal: Stacking issues should be resolved now, probably could be optimized more, but went from 3 loops that do stuff to 3 where only 2 really does stuff and one breaks early in most cases, so slightly better
|
||||||
|
|
||||||
== 11/23/2013 ==
|
== 11/23/2013 ==
|
||||||
Secrets: Fixed an issue related to a zone crash where the count of the abilities in an AA was 0, leading to a size 0 buffer issue.
|
Secrets: Fixed an issue related to a zone crash where the count of the abilities in an AA was 0, leading to a size 0 buffer issue.
|
||||||
|
|
||||||
== 11/19/2013 ==
|
== 11/19/2013 ==
|
||||||
Secrets: Fixed an issue with two zone crashes reported on PEQ related to the buff restrictions code and AAs.
|
Secrets: Fixed an issue with two zone crashes reported on PEQ related to the buff restrictions code and AAs.
|
||||||
demonstar55: Partially make use of dot_stacking_exempt (case when it's 1 is implemented, -1 case isn't)
|
mackal: Partially make use of dot_stacking_exempt (case when it's 1 is implemented, -1 case isn't)
|
||||||
|
|
||||||
== 11/18/2013 ==
|
== 11/18/2013 ==
|
||||||
demonstar55: Added assistradius to npc_types, defaults to aggroradius if set to 0 (old behaviour)
|
mackal: Added assistradius to npc_types, defaults to aggroradius if set to 0 (old behaviour)
|
||||||
|
|
||||||
== 11/17/2013 ==
|
== 11/17/2013 ==
|
||||||
Sorvani: fixed leash and tether special abilities to use the specified range correctly.
|
Sorvani: fixed leash and tether special abilities to use the specified range correctly.
|
||||||
demonstar55: Rewrote the Mob::_GetMovementSpeed fix an issue that arose from the change on 11/11
|
mackal: Rewrote the Mob::_GetMovementSpeed fix an issue that arose from the change on 11/11
|
||||||
- Added the rule Character:BaseRunSpeedCap (default 158) so people can customize what their runspeed cap is. Hardcapped to 225 so stuff doesn't get too crazy.
|
- Added the rule Character:BaseRunSpeedCap (default 158) so people can customize what their runspeed cap is. Hardcapped to 225 so stuff doesn't get too crazy.
|
||||||
|
|
||||||
== 11/16/2013 ==
|
== 11/16/2013 ==
|
||||||
Leere: Fixed the drinking message for auto-consume, it will again correctly show up for forced consumption instead.
|
Leere: Fixed the drinking message for auto-consume, it will again correctly show up for forced consumption instead.
|
||||||
demonstar55: Added Mob::DoCastingChecks() which will check for various fail conditions while the casting bar is up. This is called after Mob::DoCastSpell() starts the casting and before it returns.
|
mackal: Added Mob::DoCastingChecks() which will check for various fail conditions while the casting bar is up. This is called after Mob::DoCastSpell() starts the casting and before it returns.
|
||||||
|
|
||||||
== 11/15/2013 ==
|
== 11/15/2013 ==
|
||||||
demonstar55: Fixed Mob::CalcFocusEffect()'s SE_LimitEffect
|
mackal: Fixed Mob::CalcFocusEffect()'s SE_LimitEffect
|
||||||
Leere: Fixed a stacking issue for SE_StackingCommand_Block
|
Leere: Fixed a stacking issue for SE_StackingCommand_Block
|
||||||
|
|
||||||
== 11/13/2013 ==
|
== 11/13/2013 ==
|
||||||
demonstar55: Implemented bard song effect cap. You can set the base cap with the rule Character:BaseInstrumentSoftCap, defaults to 36 or "3.6" as it is sometimes referred to.
|
mackal: Implemented bard song effect cap. You can set the base cap with the rule Character:BaseInstrumentSoftCap, defaults to 36 or "3.6" as it is sometimes referred to.
|
||||||
demonstar55: Fix Echo of Taelosia and Ayonae's Tutelage to increase the mod cap instead of further improving the instrument mod
|
mackal: Fix Echo of Taelosia and Ayonae's Tutelage to increase the mod cap instead of further improving the instrument mod
|
||||||
demonstar55: Implemented Singing/Instrument Mastery as an AA bonus.
|
mackal: Implemented Singing/Instrument Mastery as an AA bonus.
|
||||||
|
|
||||||
== 11/11/2013 ==
|
== 11/11/2013 ==
|
||||||
demonstar55: Changed the way walk speed is calculated to allow mobs to have their walk speed equal a 100% movement reduction
|
mackal: Changed the way walk speed is calculated to allow mobs to have their walk speed equal a 100% movement reduction
|
||||||
|
|
||||||
== 11/09/2013 ==
|
== 11/09/2013 ==
|
||||||
Leere: Fixed Bard mana regen, they now only are affected by items and AA.
|
Leere: Fixed Bard mana regen, they now only are affected by items and AA.
|
||||||
@@ -1874,50 +2045,50 @@ Uleat: Converted SkillType typedef enumeration to SkillUseTypes enumeration - So
|
|||||||
Uleat: Prepped the client patch files for larger skill buffer size (not active)
|
Uleat: Prepped the client patch files for larger skill buffer size (not active)
|
||||||
|
|
||||||
== 10/24/2013 ==
|
== 10/24/2013 ==
|
||||||
demonstar55: Fix some memory leaks in Mob::SpellOnTarget
|
mackal: Fix some memory leaks in Mob::SpellOnTarget
|
||||||
|
|
||||||
== 10/21/2013 ==
|
== 10/21/2013 ==
|
||||||
demonstar55: Changed GetMinLevel return 0 for more cases that EQ uses for some reason ...
|
mackal: Changed GetMinLevel return 0 for more cases that EQ uses for some reason ...
|
||||||
demonstar55: Added buff level restrictions, set the Spells:BuffLevelRestrictions to false to have the old behavior.
|
mackal: Added buff level restrictions, set the Spells:BuffLevelRestrictions to false to have the old behavior.
|
||||||
|
|
||||||
== 10/18/2013 ==
|
== 10/18/2013 ==
|
||||||
Uleat: Expanded the 'Bag Type' enumeration to include all known values. Also, set in place additional 'Bag Type' to 'Skill Type' conversions. Some of these will need to be verified before activation.
|
Uleat: Expanded the 'Bag Type' enumeration to include all known values. Also, set in place additional 'Bag Type' to 'Skill Type' conversions. Some of these will need to be verified before activation.
|
||||||
Uleat: Cleaned up some unused enumerations to show a move towards standardization. More to come...
|
Uleat: Cleaned up some unused enumerations to show a move towards standardization. More to come...
|
||||||
|
|
||||||
== 10/12/2013 ==
|
== 10/12/2013 ==
|
||||||
demonstar55: Allow Titanium and lower clients to enter Tutorial zone from character select
|
mackal: Allow Titanium and lower clients to enter Tutorial zone from character select
|
||||||
Bad_Captain: Fixed merc crash issue by updating special_abilities & vwMercNpcTypes (Sorvani).
|
Bad_Captain: Fixed merc crash issue by updating special_abilities & vwMercNpcTypes (Sorvani).
|
||||||
Bad_Captain: Bots- added out of combat bard songs & #bot bardoutofcombat on|off command to turn them on/off.
|
Bad_Captain: Bots- added out of combat bard songs & #bot bardoutofcombat on|off command to turn them on/off.
|
||||||
|
|
||||||
== 10/11/2013 ==
|
== 10/11/2013 ==
|
||||||
JJ: (demonstar55) Allow use of Go Home button when Tutorial still selected in RoF.
|
JJ: (mackal) Allow use of Go Home button when Tutorial still selected in RoF.
|
||||||
|
|
||||||
== 10/10/2013 ==
|
== 10/10/2013 ==
|
||||||
Secrets: Fixed zone shutdown (or #reloadqst) reinitalization of Perl. This should allow for Perl 5.14 and later to work on Windows under the new quest system.
|
Secrets: Fixed zone shutdown (or #reloadqst) reinitalization of Perl. This should allow for Perl 5.14 and later to work on Windows under the new quest system.
|
||||||
demonstar55: Beneficial single target buffs shouldn't have their mana/timers set if they fail to cast after the Mob::SpellOnTarget call in Mob::SpellFinished
|
mackal: Beneficial single target buffs shouldn't have their mana/timers set if they fail to cast after the Mob::SpellOnTarget call in Mob::SpellFinished
|
||||||
JJ: Revert change to EnterWorldPacket introduced on 22 April 2013 to fix inability to enter Tutorial or Go Home from character select screen.
|
JJ: Revert change to EnterWorldPacket introduced on 22 April 2013 to fix inability to enter Tutorial or Go Home from character select screen.
|
||||||
|
|
||||||
== 10/09/2013 ==
|
== 10/09/2013 ==
|
||||||
demonstar55: Fixed some more instances of the AA timer being eaten
|
mackal: Fixed some more instances of the AA timer being eaten
|
||||||
|
|
||||||
== 10/08/2013 ==
|
== 10/08/2013 ==
|
||||||
demonstar55: Added IsBuffSpell(spell_id) that will return true if the spell has a duration, so would end up in effects/song/discs etc windows on the client
|
mackal: Added IsBuffSpell(spell_id) that will return true if the spell has a duration, so would end up in effects/song/discs etc windows on the client
|
||||||
demonstar55: Replaced instances of using CalcBuffDuration to determine if a spell was a buff with IsBuffSpell
|
mackal: Replaced instances of using CalcBuffDuration to determine if a spell was a buff with IsBuffSpell
|
||||||
demonstar55: Removed Mob::HasBuffIcon since it was doing what IsBuffSpell does in a more convoluted way with a rather misleading name
|
mackal: Removed Mob::HasBuffIcon since it was doing what IsBuffSpell does in a more convoluted way with a rather misleading name
|
||||||
demonstar55: Fixed issues that arose from the 10/03/2013 change
|
mackal: Fixed issues that arose from the 10/03/2013 change
|
||||||
|
|
||||||
== 10/05/2013 ==
|
== 10/05/2013 ==
|
||||||
Sorvani: fixed issue with stackable items being created with 0 charges cause by fix to SummonItems
|
Sorvani: fixed issue with stackable items being created with 0 charges cause by fix to SummonItems
|
||||||
|
|
||||||
== 10/03/2013 ==
|
== 10/03/2013 ==
|
||||||
demonstar55: Fix when the random +1 tick is added to nerf extension focus effects to where they should be
|
mackal: Fix when the random +1 tick is added to nerf extension focus effects to where they should be
|
||||||
|
|
||||||
== 09/30/2013 ==
|
== 09/30/2013 ==
|
||||||
Sorvani: Changed SummonItem to only summon an item with max charges when said default value is present and not on zero charges
|
Sorvani: Changed SummonItem to only summon an item with max charges when said default value is present and not on zero charges
|
||||||
demonstar55: Fixed issue with #showstats showing your level for a bunch of values
|
mackal: Fixed issue with #showstats showing your level for a bunch of values
|
||||||
|
|
||||||
== 09/13/2013 ==
|
== 09/13/2013 ==
|
||||||
demonstar55: Add support for /pet hold on and /pet hold off (UF and RoF)
|
mackal: Add support for /pet hold on and /pet hold off (UF and RoF)
|
||||||
|
|
||||||
== 08/29/2013 ==
|
== 08/29/2013 ==
|
||||||
KLS: Removed Common Profiler and Zone Profiler. They're well past outdated status and are just code bloat.
|
KLS: Removed Common Profiler and Zone Profiler. They're well past outdated status and are just code bloat.
|
||||||
@@ -2063,8 +2234,8 @@ KLS: Perl now will (like lua) keep track of the values you return from EVENT_*.
|
|||||||
KLS: Exported eq.follow(entity_id, [distance]) and eq.stop_follow() to lua.
|
KLS: Exported eq.follow(entity_id, [distance]) and eq.stop_follow() to lua.
|
||||||
|
|
||||||
== 07/01/2013 ==
|
== 07/01/2013 ==
|
||||||
demonstar55: Fix Monster Summoning related to giants/cyclops
|
mackal: Fix Monster Summoning related to giants/cyclops
|
||||||
demonstar55: Prevent Monster Summoning from summoning a portal in bothunder
|
mackal: Prevent Monster Summoning from summoning a portal in bothunder
|
||||||
KLS: Merge of lua branch to master
|
KLS: Merge of lua branch to master
|
||||||
See: http://www.eqemulator.org/forums/showthread.php?t=37008 for more detailed information on what is added.
|
See: http://www.eqemulator.org/forums/showthread.php?t=37008 for more detailed information on what is added.
|
||||||
Upgrade notes:
|
Upgrade notes:
|
||||||
@@ -2132,35 +2303,35 @@ JJ: Fixed rare case where heals from buffs could go negative.
|
|||||||
Derision: Moved entity_list.Clear() prior to destruction of Perl objects in zone shutdown as I was seeing a segfault due to attempts to call EVENT_HATE_LIST as mobs were being destroyed.
|
Derision: Moved entity_list.Clear() prior to destruction of Perl objects in zone shutdown as I was seeing a segfault due to attempts to call EVENT_HATE_LIST as mobs were being destroyed.
|
||||||
|
|
||||||
== 04/09/2013 ==
|
== 04/09/2013 ==
|
||||||
demonstar55: Realized I was an idiot, changed salvage script to be better
|
mackal: Realized I was an idiot, changed salvage script to be better
|
||||||
optional SQL: 2013_04_09_SalvageCleanOld.sql - run if ran old script
|
optional SQL: 2013_04_09_SalvageCleanOld.sql - run if ran old script
|
||||||
|
|
||||||
== 04/08/2013 ==
|
== 04/08/2013 ==
|
||||||
demonstar55: Implemented Salvage AA
|
mackal: Implemented Salvage AA
|
||||||
required SQL: 2013_04_08_Salvage.sql
|
required SQL: 2013_04_08_Salvage.sql
|
||||||
script: generate_salvage.py - will generate the entries for some exceptions for salvage returns.
|
script: generate_salvage.py - will generate the entries for some exceptions for salvage returns.
|
||||||
|
|
||||||
== 04/04/2013 ==
|
== 04/04/2013 ==
|
||||||
demonstar55: Implemented SE_ForageAdditionalItems as a bonus
|
mackal: Implemented SE_ForageAdditionalItems as a bonus
|
||||||
required SQL: 2013_04_04_NaturesBounty.sql
|
required SQL: 2013_04_04_NaturesBounty.sql
|
||||||
|
|
||||||
== 04/03/2013 ==
|
== 04/03/2013 ==
|
||||||
demonstar55: Overloaded Mob::Say_StringID with the option to provide a message type
|
mackal: Overloaded Mob::Say_StringID with the option to provide a message type
|
||||||
demonstar55: Switched rest of the Pet Messages to MT_PetResponse (Leader commands intentionally left the old way)
|
mackal: Switched rest of the Pet Messages to MT_PetResponse (Leader commands intentionally left the old way)
|
||||||
|
|
||||||
== 04/2/2013 ==
|
== 04/2/2013 ==
|
||||||
Bad_Captain: Fixed Merc lack of use of heal over time spells (causing excessive healing).
|
Bad_Captain: Fixed Merc lack of use of heal over time spells (causing excessive healing).
|
||||||
Bad_Captain: Fixed pet mitigation/AC issues.
|
Bad_Captain: Fixed pet mitigation/AC issues.
|
||||||
|
|
||||||
== 04/01/2013 ==
|
== 04/01/2013 ==
|
||||||
demonstar55: AA reuse timers now start when you hit the button and are reset upon failure
|
mackal: AA reuse timers now start when you hit the button and are reset upon failure
|
||||||
demonstar55: Instant Cast bard AAs can now be used while singing a song
|
mackal: Instant Cast bard AAs can now be used while singing a song
|
||||||
|
|
||||||
== 03/30/2013 ==
|
== 03/30/2013 ==
|
||||||
demonstar55: Fixed most of the pet talking, all use StringIDs now. Pet now informs you when it taunts.
|
mackal: Fixed most of the pet talking, all use StringIDs now. Pet now informs you when it taunts.
|
||||||
|
|
||||||
== 03/23/2013 ==
|
== 03/23/2013 ==
|
||||||
demonstar55: Fix issues with escape not always working and fixed SE_FadingMemories to have the message since the message isn't part of the spell data.
|
mackal: Fix issues with escape not always working and fixed SE_FadingMemories to have the message since the message isn't part of the spell data.
|
||||||
Escape now uses just the spell and not the AA Actoin
|
Escape now uses just the spell and not the AA Actoin
|
||||||
Fading Memories now only uses the AA Action to eat mana
|
Fading Memories now only uses the AA Action to eat mana
|
||||||
|
|
||||||
@@ -2170,7 +2341,7 @@ Bad_Captain: Added checks before dismissing merc to prevent possible bugged merc
|
|||||||
Bad_Captain: Merged in Secret's merc memory leak fixes.
|
Bad_Captain: Merged in Secret's merc memory leak fixes.
|
||||||
|
|
||||||
== 03/20/2013 ==
|
== 03/20/2013 ==
|
||||||
demonstar55: Fixed stacking issues with SE_Limit* (ex. Unholy Aura Discipline and Aura of Reverence)
|
mackal: Fixed stacking issues with SE_Limit* (ex. Unholy Aura Discipline and Aura of Reverence)
|
||||||
|
|
||||||
== 03/18/2013 ==
|
== 03/18/2013 ==
|
||||||
Bad_Captain: Fixed zone crash due to merc focus effects & tribute.
|
Bad_Captain: Fixed zone crash due to merc focus effects & tribute.
|
||||||
@@ -2233,7 +2404,7 @@ KLS: Changed how shared memory works:
|
|||||||
af4t: Add Touch of the Wicked AA redux to SK Improved Harm Touch and Leech Touch.
|
af4t: Add Touch of the Wicked AA redux to SK Improved Harm Touch and Leech Touch.
|
||||||
|
|
||||||
== 02/22/2013 ==
|
== 02/22/2013 ==
|
||||||
demonstar55: Mobs will now be removed from XTargets when they get back to their way point, should be last instance of XTarget mobs not clearing when they are not aggroed anymore
|
mackal: Mobs will now be removed from XTargets when they get back to their way point, should be last instance of XTarget mobs not clearing when they are not aggroed anymore
|
||||||
|
|
||||||
== 02/19/2013 ==
|
== 02/19/2013 ==
|
||||||
Derision: World should no longer crash if the start_zone query fails at character creation.
|
Derision: World should no longer crash if the start_zone query fails at character creation.
|
||||||
@@ -2242,7 +2413,7 @@ Derision: World should no longer crash if the start_zone query fails at characte
|
|||||||
Bad_Captain: Moved merc save to merc table, save merc buffs, added cure and rez spells to healer merc.
|
Bad_Captain: Moved merc save to merc table, save merc buffs, added cure and rez spells to healer merc.
|
||||||
JJ: Chat garbled for drunk characters.
|
JJ: Chat garbled for drunk characters.
|
||||||
Derision: Charmed pets should no longer be targettable with F8. Charmed pets no longer get a surname of Soandso's Pet.
|
Derision: Charmed pets should no longer be targettable with F8. Charmed pets no longer get a surname of Soandso's Pet.
|
||||||
demonstar55: Added potionbelt tool tip
|
mackal: Added potionbelt tool tip
|
||||||
KLS: Added EVENT_DEATH to Player Quests
|
KLS: Added EVENT_DEATH to Player Quests
|
||||||
|
|
||||||
REQUIRED SQL: 2013_02_18_Merc_Rules_and_Tables.sql
|
REQUIRED SQL: 2013_02_18_Merc_Rules_and_Tables.sql
|
||||||
@@ -2254,8 +2425,8 @@ Derision: Client version is now returned by the stream proxy as a number.
|
|||||||
Derision: Fixed bug where BecomeTrader packets were only being sent to the Trader, not all other clients in the bazaar.
|
Derision: Fixed bug where BecomeTrader packets were only being sent to the Trader, not all other clients in the bazaar.
|
||||||
|
|
||||||
== 02/16/2013 ==
|
== 02/16/2013 ==
|
||||||
demonstar55: Fix AA reuse timer calc
|
mackal: Fix AA reuse timer calc
|
||||||
demonstar55: Remove old filters and change all remaining old to new (Also fix Auction filtering out OOC as well due to incorrect define)
|
mackal: Remove old filters and change all remaining old to new (Also fix Auction filtering out OOC as well due to incorrect define)
|
||||||
|
|
||||||
== 02/12/2013 ==
|
== 02/12/2013 ==
|
||||||
Kayen: AA fix
|
Kayen: AA fix
|
||||||
@@ -2266,7 +2437,7 @@ REQUIRED SQL: utils/sql/svn/2504_required_aa_updates.sql
|
|||||||
Derision: RoF: Added ENCODE for OP_BeginCast (fixes no sound during spell casting). Corrected OP_DeleteSpell.
|
Derision: RoF: Added ENCODE for OP_BeginCast (fixes no sound during spell casting). Corrected OP_DeleteSpell.
|
||||||
|
|
||||||
== 02/10/2013 ==
|
== 02/10/2013 ==
|
||||||
JJ: (demonstar55) Language skill up should use proper function.
|
JJ: (mackal) Language skill up should use proper function.
|
||||||
JJ: SetLanguageSkill now updates client immediately. Both functions do proper limit checks.
|
JJ: SetLanguageSkill now updates client immediately. Both functions do proper limit checks.
|
||||||
Added two missing languages. Skill level 0 in a spoken language now shows 'in an unknown tongue'.
|
Added two missing languages. Skill level 0 in a spoken language now shows 'in an unknown tongue'.
|
||||||
JJ: Initial implementation of a GarbleMessage function and implemented for languages. Can be shared with drunk speaking.
|
JJ: Initial implementation of a GarbleMessage function and implemented for languages. Can be shared with drunk speaking.
|
||||||
@@ -2302,7 +2473,7 @@ Trevius: RoF: Turning on Trader mode in bazaar now works, but no further trader
|
|||||||
Akkadius: Fixed an issue where global_npc.pl was not initializing (initially)
|
Akkadius: Fixed an issue where global_npc.pl was not initializing (initially)
|
||||||
|
|
||||||
== 01/31/2013 ==
|
== 01/31/2013 ==
|
||||||
cavedude00: (demonstar55) Rune aggro fix
|
cavedude00: (mackal) Rune aggro fix
|
||||||
cavedude00: (Drajor) Tradeskill skillneeded fix.
|
cavedude00: (Drajor) Tradeskill skillneeded fix.
|
||||||
|
|
||||||
== 01/30/2013 ==
|
== 01/30/2013 ==
|
||||||
@@ -2336,7 +2507,7 @@ Bad_Captain: Mercs - Initial spell casting AI committed.
|
|||||||
KLS: Added crash logging for Windows builds.
|
KLS: Added crash logging for Windows builds.
|
||||||
Trevius: Mercenaries now despawn when a player camps out or disconnects in any way.
|
Trevius: Mercenaries now despawn when a player camps out or disconnects in any way.
|
||||||
Trevius: Players with a Mercenary spawned can now be invited to and join another group with their mercenary.
|
Trevius: Players with a Mercenary spawned can now be invited to and join another group with their mercenary.
|
||||||
Sorvani: (Demonstar55): Moved stunproc rule implmentation to catch all cases
|
Sorvani: (mackal): Moved stunproc rule implmentation to catch all cases
|
||||||
|
|
||||||
OPTIONAL SQL: utils/sql/svn/mercs.sql -- rerun for updated merc stats & merc spell lists
|
OPTIONAL SQL: utils/sql/svn/mercs.sql -- rerun for updated merc stats & merc spell lists
|
||||||
|
|
||||||
@@ -2787,9 +2958,9 @@ references:
|
|||||||
http://www.eqemulator.org/forums/showthread.php?t=35629 - CSD Bugged Corpse Patch
|
http://www.eqemulator.org/forums/showthread.php?t=35629 - CSD Bugged Corpse Patch
|
||||||
http://www.eqemulator.org/forums/showthread.php?t=35699 - CSD Bandolier Patch
|
http://www.eqemulator.org/forums/showthread.php?t=35699 - CSD Bandolier Patch
|
||||||
|
|
||||||
cavedude: (demonstar55) Damage shields by default will no longer count towards EXP gain. (Rule also added to change this behaviour.)
|
cavedude: (mackal) Damage shields by default will no longer count towards EXP gain. (Rule also added to change this behaviour.)
|
||||||
cavedude: (demonstar55) Extended targets should now clear when aggro is lost using skills.
|
cavedude: (mackal) Extended targets should now clear when aggro is lost using skills.
|
||||||
cavedude: (demonstar55) AAs with shorter reuse timers should now reset if the cast failed (interrupted.)
|
cavedude: (mackal) AAs with shorter reuse timers should now reset if the cast failed (interrupted.)
|
||||||
KLS: Fixed a cause of raids disbanding on zoning.
|
KLS: Fixed a cause of raids disbanding on zoning.
|
||||||
|
|
||||||
OPTIONAL SQL: INSERT INTO `rule_values` VALUES (1, 'Combat:EXPFromDmgShield', 'false', 'Determine if damage from a damage shield counts for EXP gain.');
|
OPTIONAL SQL: INSERT INTO `rule_values` VALUES (1, 'Combat:EXPFromDmgShield', 'false', 'Determine if damage from a damage shield counts for EXP gain.');
|
||||||
@@ -3166,7 +3337,7 @@ Kayen: Implemented Perl Mob Quest Object GetModVulnerability(resist type) - Retu
|
|||||||
Optional SQL: utils/sql/svn/2154_optional_rule_spell_procs_resists_falloff.sql
|
Optional SQL: utils/sql/svn/2154_optional_rule_spell_procs_resists_falloff.sql
|
||||||
|
|
||||||
==06/22/2012==
|
==06/22/2012==
|
||||||
Secrets: (demonstar55) Spells now display to all clients and can be filtered as such.
|
Secrets: (mackal) Spells now display to all clients and can be filtered as such.
|
||||||
Secrets: Damage Shields now go to the proper filter, and do not show the non-melee damage to everyone.
|
Secrets: Damage Shields now go to the proper filter, and do not show the non-melee damage to everyone.
|
||||||
|
|
||||||
==06/03/2012==
|
==06/03/2012==
|
||||||
@@ -5321,10 +5492,10 @@ WildcardX: *BOTS* Bots can now be invited and disbanded from your group by simpl
|
|||||||
WildcardX: *BOTS* Tweak to the bots total play time calculation to make it more accurate.
|
WildcardX: *BOTS* Tweak to the bots total play time calculation to make it more accurate.
|
||||||
KLS: Added #path meshtest simple to do a faster search on errant path nodes.
|
KLS: Added #path meshtest simple to do a faster search on errant path nodes.
|
||||||
KLS: Modified the accurate hazard code to make automatic path maps with more accurate info that requires less manual editing afterward.
|
KLS: Modified the accurate hazard code to make automatic path maps with more accurate info that requires less manual editing afterward.
|
||||||
cavedude: (demonstar55) Pets will now be amiable to their owners, indifferent to all else.
|
cavedude: (mackal) Pets will now be amiable to their owners, indifferent to all else.
|
||||||
cavedude: (demonstar55) Added $client->KeyRingCheck() and $client->KeyRingAdd() to allow Perl to manipulate the keyring.
|
cavedude: (mackal) Added $client->KeyRingCheck() and $client->KeyRingAdd() to allow Perl to manipulate the keyring.
|
||||||
cavedude: (demonstar55) Casting an invis spell on a player that already has a similar type invis spell will no longer drop the existing buff.
|
cavedude: (mackal) Casting an invis spell on a player that already has a similar type invis spell will no longer drop the existing buff.
|
||||||
cavedude: (demonstar55) Corrected message string for heal spells.
|
cavedude: (mackal) Corrected message string for heal spells.
|
||||||
cavedude: Added rule to determine at what HP a fleeing NPC will halt due to being snared.
|
cavedude: Added rule to determine at what HP a fleeing NPC will halt due to being snared.
|
||||||
|
|
||||||
==08/07/2009==
|
==08/07/2009==
|
||||||
@@ -5960,7 +6131,7 @@ KLS: Fixed the /bug structure and updated the table to be more useful.
|
|||||||
Required SQL: .\utils\sql\svn\503_bugs.sql
|
Required SQL: .\utils\sql\svn\503_bugs.sql
|
||||||
|
|
||||||
==05/11/2009==
|
==05/11/2009==
|
||||||
demonstar55: Added a function to allow Perl to check augments within items.
|
mackal: Added a function to allow Perl to check augments within items.
|
||||||
cavedude: Increased bind wound skill up speed some.
|
cavedude: Increased bind wound skill up speed some.
|
||||||
KLS: Fix for potentially dangerous typo in spawn conditions code.
|
KLS: Fix for potentially dangerous typo in spawn conditions code.
|
||||||
KLS: Removed some non-functioning but still taking up database resources database code.
|
KLS: Removed some non-functioning but still taking up database resources database code.
|
||||||
@@ -6261,7 +6432,7 @@ cavedude: Removed the USE_RACE_CLASS_XP_MODS define as it was outdated and horri
|
|||||||
cavedude: Added group XP bonus. The larger the group, the higher the XP gain.
|
cavedude: Added group XP bonus. The larger the group, the higher the XP gain.
|
||||||
cavedude: Added XP bonus for Warrior, Rogue, and Halfling.
|
cavedude: Added XP bonus for Warrior, Rogue, and Halfling.
|
||||||
cavedude: Corrected ZEM for AAs.
|
cavedude: Corrected ZEM for AAs.
|
||||||
cavedude: (Thanks to demonstar55) Pet Affinity will no longer effect charmed pets.
|
cavedude: (Thanks to mackal) Pet Affinity will no longer effect charmed pets.
|
||||||
cavedude: (realityincarnate) Bard songs that require instruments will now require them.
|
cavedude: (realityincarnate) Bard songs that require instruments will now require them.
|
||||||
|
|
||||||
Please note: XP gain has pretty much been overhauled. You may need tweak the multiplier rules for your server.
|
Please note: XP gain has pretty much been overhauled. You may need tweak the multiplier rules for your server.
|
||||||
@@ -6395,7 +6566,7 @@ AndMetal: Augments are now visible when linking items.
|
|||||||
Trevius: SoF - Adjusted the new Item Structure to align more fields
|
Trevius: SoF - Adjusted the new Item Structure to align more fields
|
||||||
Trevius: SoF - Added OP_Consume and OP_LootRequest opcodes
|
Trevius: SoF - Added OP_Consume and OP_LootRequest opcodes
|
||||||
cavedude00: (AndMetal) AAs now use skill_id instead of index for prereqs.
|
cavedude00: (AndMetal) AAs now use skill_id instead of index for prereqs.
|
||||||
cavedude00: (demonstar55) Implemented Improved Instrument Mastery, Improved Singing Mastery, and Echo of Taelosia AAs.
|
cavedude00: (mackal) Implemented Improved Instrument Mastery, Improved Singing Mastery, and Echo of Taelosia AAs.
|
||||||
cavedude00: Created Combat:ChanceToHitDivideBy rule and increased default value to 1250.
|
cavedude00: Created Combat:ChanceToHitDivideBy rule and increased default value to 1250.
|
||||||
Required and Optional SQL: utils/sql/svn/326_aas.sql
|
Required and Optional SQL: utils/sql/svn/326_aas.sql
|
||||||
KLS: SoF - Fix for item slots in bags.
|
KLS: SoF - Fix for item slots in bags.
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
|||||||
SET(common_sources
|
SET(common_sources
|
||||||
base_packet.cpp
|
base_packet.cpp
|
||||||
classes.cpp
|
classes.cpp
|
||||||
client_version.cpp
|
|
||||||
condition.cpp
|
condition.cpp
|
||||||
crash.cpp
|
crash.cpp
|
||||||
crc16.cpp
|
crc16.cpp
|
||||||
@@ -19,6 +18,7 @@ SET(common_sources
|
|||||||
emu_opcodes.cpp
|
emu_opcodes.cpp
|
||||||
emu_tcp_connection.cpp
|
emu_tcp_connection.cpp
|
||||||
emu_tcp_server.cpp
|
emu_tcp_server.cpp
|
||||||
|
emu_versions.cpp
|
||||||
eqdb.cpp
|
eqdb.cpp
|
||||||
eqdb_res.cpp
|
eqdb_res.cpp
|
||||||
eqemu_exception.cpp
|
eqemu_exception.cpp
|
||||||
@@ -35,12 +35,12 @@ SET(common_sources
|
|||||||
faction.cpp
|
faction.cpp
|
||||||
guild_base.cpp
|
guild_base.cpp
|
||||||
guilds.cpp
|
guilds.cpp
|
||||||
inventory_version.cpp
|
|
||||||
ipc_mutex.cpp
|
ipc_mutex.cpp
|
||||||
item.cpp
|
item.cpp
|
||||||
item_struct.cpp
|
item_base.cpp
|
||||||
light_source.cpp
|
light_source.cpp
|
||||||
md5.cpp
|
md5.cpp
|
||||||
|
memory_buffer.cpp
|
||||||
memory_mapped_file.cpp
|
memory_mapped_file.cpp
|
||||||
misc.cpp
|
misc.cpp
|
||||||
misc_functions.cpp
|
misc_functions.cpp
|
||||||
@@ -68,6 +68,7 @@ SET(common_sources
|
|||||||
struct_strategy.cpp
|
struct_strategy.cpp
|
||||||
tcp_connection.cpp
|
tcp_connection.cpp
|
||||||
tcp_server.cpp
|
tcp_server.cpp
|
||||||
|
textures.cpp
|
||||||
timeoutmgr.cpp
|
timeoutmgr.cpp
|
||||||
timer.cpp
|
timer.cpp
|
||||||
unix.cpp
|
unix.cpp
|
||||||
@@ -111,7 +112,6 @@ SET(common_headers
|
|||||||
base_data.h
|
base_data.h
|
||||||
bodytypes.h
|
bodytypes.h
|
||||||
classes.h
|
classes.h
|
||||||
client_version.h
|
|
||||||
condition.h
|
condition.h
|
||||||
crash.h
|
crash.h
|
||||||
crc16.h
|
crc16.h
|
||||||
@@ -127,6 +127,7 @@ SET(common_headers
|
|||||||
emu_oplist.h
|
emu_oplist.h
|
||||||
emu_tcp_connection.h
|
emu_tcp_connection.h
|
||||||
emu_tcp_server.h
|
emu_tcp_server.h
|
||||||
|
emu_versions.h
|
||||||
eq_constants.h
|
eq_constants.h
|
||||||
eq_packet_structs.h
|
eq_packet_structs.h
|
||||||
eqdb.h
|
eqdb.h
|
||||||
@@ -154,17 +155,17 @@ SET(common_headers
|
|||||||
global_define.h
|
global_define.h
|
||||||
guild_base.h
|
guild_base.h
|
||||||
guilds.h
|
guilds.h
|
||||||
inventory_version.h
|
|
||||||
ipc_mutex.h
|
ipc_mutex.h
|
||||||
item.h
|
item.h
|
||||||
|
item_base.h
|
||||||
item_fieldlist.h
|
item_fieldlist.h
|
||||||
item_struct.h
|
|
||||||
languages.h
|
languages.h
|
||||||
light_source.h
|
light_source.h
|
||||||
linked_list.h
|
linked_list.h
|
||||||
loottable.h
|
loottable.h
|
||||||
mail_oplist.h
|
mail_oplist.h
|
||||||
md5.h
|
md5.h
|
||||||
|
memory_buffer.h
|
||||||
memory_mapped_file.h
|
memory_mapped_file.h
|
||||||
misc.h
|
misc.h
|
||||||
misc_functions.h
|
misc_functions.h
|
||||||
@@ -199,6 +200,7 @@ SET(common_headers
|
|||||||
tcp_basic_server.h
|
tcp_basic_server.h
|
||||||
tcp_connection.h
|
tcp_connection.h
|
||||||
tcp_server.h
|
tcp_server.h
|
||||||
|
textures.h
|
||||||
timeoutmgr.h
|
timeoutmgr.h
|
||||||
timer.h
|
timer.h
|
||||||
types.h
|
types.h
|
||||||
|
|||||||
@@ -1,128 +0,0 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
|
||||||
|
|
||||||
Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net)
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; version 2 of the License.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
|
||||||
are required to give you total support for your newly bought product;
|
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "client_version.h"
|
|
||||||
|
|
||||||
|
|
||||||
bool EQEmu::versions::IsValidClientVersion(ClientVersion client_version)
|
|
||||||
{
|
|
||||||
if (client_version <= ClientVersion::Unknown || client_version > LastClientVersion)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
EQEmu::versions::ClientVersion EQEmu::versions::ValidateClientVersion(ClientVersion client_version)
|
|
||||||
{
|
|
||||||
if (client_version <= ClientVersion::Unknown || client_version > LastClientVersion)
|
|
||||||
return ClientVersion::Unknown;
|
|
||||||
|
|
||||||
return client_version;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* EQEmu::versions::ClientVersionName(ClientVersion client_version)
|
|
||||||
{
|
|
||||||
switch (client_version) {
|
|
||||||
case ClientVersion::Unknown:
|
|
||||||
return "Unknown Version";
|
|
||||||
case ClientVersion::Client62:
|
|
||||||
return "Client 6.2";
|
|
||||||
case ClientVersion::Titanium:
|
|
||||||
return "Titanium";
|
|
||||||
case ClientVersion::SoF:
|
|
||||||
return "SoF";
|
|
||||||
case ClientVersion::SoD:
|
|
||||||
return "SoD";
|
|
||||||
case ClientVersion::UF:
|
|
||||||
return "UF";
|
|
||||||
case ClientVersion::RoF:
|
|
||||||
return "RoF";
|
|
||||||
case ClientVersion::RoF2:
|
|
||||||
return "RoF2";
|
|
||||||
default:
|
|
||||||
return "Invalid Version";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 EQEmu::versions::ConvertClientVersionToClientVersionBit(ClientVersion client_version)
|
|
||||||
{
|
|
||||||
switch (client_version) {
|
|
||||||
case ClientVersion::Unknown:
|
|
||||||
case ClientVersion::Client62:
|
|
||||||
return bit_Unknown;
|
|
||||||
case ClientVersion::Titanium:
|
|
||||||
return bit_Titanium;
|
|
||||||
case ClientVersion::SoF:
|
|
||||||
return bit_SoF;
|
|
||||||
case ClientVersion::SoD:
|
|
||||||
return bit_SoD;
|
|
||||||
case ClientVersion::UF:
|
|
||||||
return bit_UF;
|
|
||||||
case ClientVersion::RoF:
|
|
||||||
return bit_RoF;
|
|
||||||
case ClientVersion::RoF2:
|
|
||||||
return bit_RoF2;
|
|
||||||
default:
|
|
||||||
return bit_Unknown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EQEmu::versions::ClientVersion EQEmu::versions::ConvertClientVersionBitToClientVersion(uint32 client_version_bit)
|
|
||||||
{
|
|
||||||
switch (client_version_bit) {
|
|
||||||
case (uint32)static_cast<unsigned int>(ClientVersion::Unknown) :
|
|
||||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::Client62) - 1)) :
|
|
||||||
return ClientVersion::Unknown;
|
|
||||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::Titanium) - 1)) :
|
|
||||||
return ClientVersion::Titanium;
|
|
||||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::SoF) - 1)) :
|
|
||||||
return ClientVersion::SoF;
|
|
||||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::SoD) - 1)) :
|
|
||||||
return ClientVersion::SoD;
|
|
||||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::UF) - 1)) :
|
|
||||||
return ClientVersion::UF;
|
|
||||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::RoF) - 1)) :
|
|
||||||
return ClientVersion::RoF;
|
|
||||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::RoF2) - 1)) :
|
|
||||||
return ClientVersion::RoF2;
|
|
||||||
default:
|
|
||||||
return ClientVersion::Unknown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 EQEmu::versions::ConvertClientVersionToExpansion(ClientVersion client_version)
|
|
||||||
{
|
|
||||||
switch (client_version) {
|
|
||||||
case ClientVersion::Unknown:
|
|
||||||
case ClientVersion::Client62:
|
|
||||||
case ClientVersion::Titanium:
|
|
||||||
return 0x000007FFU;
|
|
||||||
case ClientVersion::SoF:
|
|
||||||
return 0x00007FFFU;
|
|
||||||
case ClientVersion::SoD:
|
|
||||||
return 0x0000FFFFU;
|
|
||||||
case ClientVersion::UF:
|
|
||||||
return 0x0001FFFFU;
|
|
||||||
case ClientVersion::RoF:
|
|
||||||
case ClientVersion::RoF2:
|
|
||||||
return 0x000FFFFFU;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+23
-16
@@ -1,5 +1,6 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2014 EQEMu Development Team (http://eqemulator.net)
|
|
||||||
|
Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -15,34 +16,40 @@
|
|||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMMON_DATA_VERIFICATION_H
|
#ifndef COMMON_DATA_VERIFICATION_H
|
||||||
#define COMMON_DATA_VERIFICATION_H
|
#define COMMON_DATA_VERIFICATION_H
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
namespace EQEmu
|
namespace EQEmu
|
||||||
{
|
{
|
||||||
|
template <typename T>
|
||||||
template <typename T>
|
T Clamp(const T& value, const T& lower, const T& upper) {
|
||||||
T Clamp(const T& value, const T& lower, const T& upper) {
|
|
||||||
return std::max(lower, std::min(value, upper));
|
return std::max(lower, std::min(value, upper));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T ClampLower(const T& value, const T& lower) {
|
T ClampLower(const T& value, const T& lower) {
|
||||||
return std::max(lower, value);
|
return std::max(lower, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T ClampUpper(const T& value, const T& upper) {
|
T ClampUpper(const T& value, const T& upper) {
|
||||||
return std::min(value, upper);
|
return std::min(value, upper);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool ValueWithin(const T& value, const T& lower, const T& upper) {
|
bool ValueWithin(const T& value, const T& lower, const T& upper) {
|
||||||
return value >= lower && value <= upper;
|
return value >= lower && value <= upper;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
template <typename T1, typename T2, typename T3>
|
||||||
|
bool ValueWithin(const T1& value, const T2& lower, const T3& upper) {
|
||||||
|
return value >= (T1)lower && value <= (T1)upper;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
} /*EQEmu*/
|
||||||
|
|
||||||
|
#endif /*COMMON_DATA_VERIFICATION_H*/
|
||||||
|
|||||||
+27
-3
@@ -627,9 +627,9 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe
|
|||||||
/* Save Bind Points */
|
/* Save Bind Points */
|
||||||
query = StringFormat("REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, slot)"
|
query = StringFormat("REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, slot)"
|
||||||
" VALUES (%u, %u, %u, %f, %f, %f, %f, %i), "
|
" VALUES (%u, %u, %u, %f, %f, %f, %f, %i), "
|
||||||
"(%u, %u, %u, %f, %f, %f, %f, %i), ",
|
"(%u, %u, %u, %f, %f, %f, %f, %i), "
|
||||||
"(%u, %u, %u, %f, %f, %f, %f, %i), ",
|
"(%u, %u, %u, %f, %f, %f, %f, %i), "
|
||||||
"(%u, %u, %u, %f, %f, %f, %f, %i), ",
|
"(%u, %u, %u, %f, %f, %f, %f, %i), "
|
||||||
"(%u, %u, %u, %f, %f, %f, %f, %i)",
|
"(%u, %u, %u, %f, %f, %f, %f, %i)",
|
||||||
character_id, pp->binds[0].zoneId, 0, pp->binds[0].x, pp->binds[0].y, pp->binds[0].z, pp->binds[0].heading, 0,
|
character_id, pp->binds[0].zoneId, 0, pp->binds[0].x, pp->binds[0].y, pp->binds[0].z, pp->binds[0].heading, 0,
|
||||||
character_id, pp->binds[1].zoneId, 0, pp->binds[1].x, pp->binds[1].y, pp->binds[1].z, pp->binds[1].heading, 1,
|
character_id, pp->binds[1].zoneId, 0, pp->binds[1].x, pp->binds[1].y, pp->binds[1].z, pp->binds[1].heading, 1,
|
||||||
@@ -2136,3 +2136,27 @@ bool Database::SaveTime(int8 minute, int8 hour, int8 day, int8 month, int16 year
|
|||||||
return results.Success();
|
return results.Success();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Database::GetIPExemption(std::string account_ip) {
|
||||||
|
std::string query = StringFormat("SELECT `exemption_amount` FROM `ip_exemptions` WHERE `exemption_ip` = '%s'", account_ip.c_str());
|
||||||
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
|
if (results.Success() && results.RowCount() > 0) {
|
||||||
|
auto row = results.begin();
|
||||||
|
return atoi(row[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return RuleI(World, MaxClientsPerIP);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Database::GetInstanceID(uint32 char_id, uint32 zone_id) {
|
||||||
|
std::string query = StringFormat("SELECT instance_list.id FROM instance_list INNER JOIN instance_list_player ON instance_list.id = instance_list_player.id WHERE instance_list.zone = '%i' AND instance_list_player.charid = '%i'", zone_id, char_id);
|
||||||
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
|
if (results.Success() && results.RowCount() > 0) {
|
||||||
|
auto row = results.begin();
|
||||||
|
return atoi(row[0]);;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -187,6 +187,10 @@ public:
|
|||||||
void GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus);
|
void GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus);
|
||||||
void SetAgreementFlag(uint32 acctid);
|
void SetAgreementFlag(uint32 acctid);
|
||||||
|
|
||||||
|
int GetIPExemption(std::string account_ip);
|
||||||
|
|
||||||
|
int GetInstanceID(uint32 char_id, uint32 zone_id);
|
||||||
|
|
||||||
|
|
||||||
/* Groups */
|
/* Groups */
|
||||||
|
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ namespace Convert {
|
|||||||
/*002*/ uint32 HP;
|
/*002*/ uint32 HP;
|
||||||
/*006*/ uint32 Mana;
|
/*006*/ uint32 Mana;
|
||||||
/*010*/ Convert::SpellBuff_Struct Buffs[BUFF_COUNT];
|
/*010*/ Convert::SpellBuff_Struct Buffs[BUFF_COUNT];
|
||||||
/*510*/ uint32 Items[EQEmu::legacy::MaterialCount];
|
/*510*/ uint32 Items[EQEmu::textures::TextureCount];
|
||||||
/*546*/ char Name[64];
|
/*546*/ char Name[64];
|
||||||
/*610*/
|
/*610*/
|
||||||
};
|
};
|
||||||
@@ -227,9 +227,9 @@ namespace Convert {
|
|||||||
/*0304*/ uint8 ability_time_minutes;
|
/*0304*/ uint8 ability_time_minutes;
|
||||||
/*0305*/ uint8 ability_time_hours; //place holder
|
/*0305*/ uint8 ability_time_hours; //place holder
|
||||||
/*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag?
|
/*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag?
|
||||||
/*0312*/ uint32 item_material[EQEmu::legacy::MaterialCount]; // Item texture/material of worn/held items
|
/*0312*/ uint32 item_material[EQEmu::textures::TextureCount]; // Item texture/material of worn/held items
|
||||||
/*0348*/ uint8 unknown0348[44];
|
/*0348*/ uint8 unknown0348[44];
|
||||||
/*0392*/ Convert::Color_Struct item_tint[EQEmu::legacy::MaterialCount];
|
/*0392*/ Convert::Color_Struct item_tint[EQEmu::textures::TextureCount];
|
||||||
/*0428*/ Convert::AA_Array aa_array[MAX_PP_AA_ARRAY];
|
/*0428*/ Convert::AA_Array aa_array[MAX_PP_AA_ARRAY];
|
||||||
/*2348*/ float unknown2384; //seen ~128, ~47
|
/*2348*/ float unknown2384; //seen ~128, ~47
|
||||||
/*2352*/ char servername[32]; // length probably not right
|
/*2352*/ char servername[32]; // length probably not right
|
||||||
@@ -472,31 +472,18 @@ bool Database::CheckDatabaseConversions() {
|
|||||||
CheckDatabaseConvertPPDeblob();
|
CheckDatabaseConvertPPDeblob();
|
||||||
CheckDatabaseConvertCorpseDeblob();
|
CheckDatabaseConvertCorpseDeblob();
|
||||||
|
|
||||||
/* Fetch Automatic Upgrade Script */
|
/* Fetch EQEmu Server script */
|
||||||
if (!std::ifstream("eqemu_update.pl")){
|
if (!std::ifstream("eqemu_server.pl")){
|
||||||
std::cout << "Pulling down automatic database upgrade script..." << std::endl;
|
std::cout << "Pulling down automatic database upgrade script..." << std::endl;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
system("perl -MLWP::UserAgent -e \"require LWP::UserAgent; my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; my $response = $ua->get('https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/eqemu_update.pl'); if ($response->is_success){ open(FILE, '> eqemu_update.pl'); print FILE $response->decoded_content; close(FILE); }\"");
|
system("perl -MLWP::UserAgent -e \"require LWP::UserAgent; my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; my $response = $ua->get('https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/eqemu_server.pl'); if ($response->is_success){ open(FILE, '> eqemu_server.pl'); print FILE $response->decoded_content; close(FILE); }\"");
|
||||||
#else
|
#else
|
||||||
system("wget --no-check-certificate -O eqemu_update.pl https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/eqemu_update.pl");
|
system("wget --no-check-certificate -O eqemu_server.pl https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/eqemu_server.pl");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Run EQEmu Server script (Checks for database updates) */
|
||||||
Automatic (Database) Upgrade Script
|
system("perl eqemu_server.pl ran_from_world");
|
||||||
Script: eqemu_update.pl V 1 - the number that world passes to the script will
|
|
||||||
force the script to check for a newer version to update itself with
|
|
||||||
eqemu_update.pl ran_from_world - won't bring up a menu if your database versions match
|
|
||||||
eqemu_update.pl - ran standalone will bring up a menu prompt
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Check for a new version of this script, the arg passed
|
|
||||||
would have to be higher than the copy they have downloaded
|
|
||||||
locally and they will re fetch */
|
|
||||||
system("perl eqemu_update.pl V 14");
|
|
||||||
|
|
||||||
/* Run Automatic Database Upgrade Script */
|
|
||||||
system("perl eqemu_update.pl ran_from_world");
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1416,7 +1403,7 @@ bool Database::CheckDatabaseConvertPPDeblob(){
|
|||||||
if (rquery != ""){ results = QueryDatabase(rquery); }
|
if (rquery != ""){ results = QueryDatabase(rquery); }
|
||||||
/* Run Material Color Convert */
|
/* Run Material Color Convert */
|
||||||
first_entry = 0; rquery = "";
|
first_entry = 0; rquery = "";
|
||||||
for (i = 0; i < EQEmu::legacy::MaterialCount; i++){
|
for (i = 0; i < EQEmu::textures::TextureCount; i++){
|
||||||
if (pp->item_tint[i].color > 0){
|
if (pp->item_tint[i].color > 0){
|
||||||
if (first_entry != 1){
|
if (first_entry != 1){
|
||||||
rquery = StringFormat("REPLACE INTO `character_material` (id, slot, blue, green, red, use_tint, color) VALUES (%u, %u, %u, %u, %u, %u, %u)", character_id, i, pp->item_tint[i].rgb.blue, pp->item_tint[i].rgb.green, pp->item_tint[i].rgb.red, pp->item_tint[i].rgb.use_tint, pp->item_tint[i].color);
|
rquery = StringFormat("REPLACE INTO `character_material` (id, slot, blue, green, red, use_tint, color) VALUES (%u, %u, %u, %u, %u, %u, %u)", character_id, i, pp->item_tint[i].rgb.blue, pp->item_tint[i].rgb.green, pp->item_tint[i].rgb.red, pp->item_tint[i].rgb.use_tint, pp->item_tint[i].color);
|
||||||
|
|||||||
+21
-3
@@ -22,9 +22,7 @@
|
|||||||
|
|
||||||
#include "eq_limits.h"
|
#include "eq_limits.h"
|
||||||
#include "emu_legacy.h"
|
#include "emu_legacy.h"
|
||||||
#include "inventory_version.h"
|
#include "emu_versions.h"
|
||||||
//#include "deity.h"
|
|
||||||
//#include "say_link.h"
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -46,6 +44,26 @@ namespace EQEmu
|
|||||||
const size_t SayLinkBodySize = RoF2::constants::SayLinkBodySize;
|
const size_t SayLinkBodySize = RoF2::constants::SayLinkBodySize;
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
enum class CastingSlot : uint32 {
|
||||||
|
Gem1 = 0,
|
||||||
|
Gem2 = 1,
|
||||||
|
Gem3 = 2,
|
||||||
|
Gem4 = 3,
|
||||||
|
Gem5 = 4,
|
||||||
|
Gem6 = 5,
|
||||||
|
Gem7 = 6,
|
||||||
|
Gem8 = 7,
|
||||||
|
Gem9 = 8,
|
||||||
|
Gem10 = 9,
|
||||||
|
Gem11 = 10,
|
||||||
|
Gem12 = 11,
|
||||||
|
MaxGems = 12,
|
||||||
|
Ability = 20, // HT/LoH for Tit
|
||||||
|
PotionBelt = 21, // Tit uses a different slot for PB
|
||||||
|
Item = 22,
|
||||||
|
Discipline = 23,
|
||||||
|
AltAbility = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
} /*EQEmu*/
|
} /*EQEmu*/
|
||||||
|
|
||||||
|
|||||||
@@ -163,20 +163,6 @@ namespace EQEmu
|
|||||||
SlotCount
|
SlotCount
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MaterialSlots : uint8 {
|
|
||||||
MaterialHead = 0,
|
|
||||||
MaterialChest,
|
|
||||||
MaterialArms,
|
|
||||||
MaterialWrist,
|
|
||||||
MaterialHands,
|
|
||||||
MaterialLegs, // 5
|
|
||||||
MaterialFeet,
|
|
||||||
MaterialPrimary,
|
|
||||||
MaterialSecondary,
|
|
||||||
MaterialCount,
|
|
||||||
MaterialInvalid = 255
|
|
||||||
};
|
|
||||||
|
|
||||||
// these are currently hard-coded for existing inventory system..do not use in place of special client version handlers until ready
|
// these are currently hard-coded for existing inventory system..do not use in place of special client version handlers until ready
|
||||||
static const uint16 TYPE_POSSESSIONS_SIZE = SlotCount;
|
static const uint16 TYPE_POSSESSIONS_SIZE = SlotCount;
|
||||||
static const uint16 TYPE_BANK_SIZE = 24;
|
static const uint16 TYPE_BANK_SIZE = 24;
|
||||||
@@ -251,11 +237,6 @@ namespace EQEmu
|
|||||||
static const int16 CORPSE_BEGIN = 22;
|
static const int16 CORPSE_BEGIN = 22;
|
||||||
//static const int16 CORPSE_END = RoF::consts::CORPSE_END; // not ready for use
|
//static const int16 CORPSE_END = RoF::consts::CORPSE_END; // not ready for use
|
||||||
|
|
||||||
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
|
// items
|
||||||
// common and container sizes will not increase until the new 'location' struct is implemented
|
// common and container sizes will not increase until the new 'location' struct is implemented
|
||||||
static const uint16 ITEM_COMMON_SIZE = 6;//RoF::consts::ITEM_COMMON_SIZE;
|
static const uint16 ITEM_COMMON_SIZE = 6;//RoF::consts::ITEM_COMMON_SIZE;
|
||||||
|
|||||||
+56
-8
@@ -27,29 +27,77 @@
|
|||||||
|
|
||||||
namespace EntityLimits
|
namespace EntityLimits
|
||||||
{
|
{
|
||||||
namespace npc {
|
namespace NPC {
|
||||||
enum : int { Invalid = -1, Null, Safety };
|
enum : int { Invalid = -1, Null, Safety };
|
||||||
|
|
||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
}
|
|
||||||
|
|
||||||
namespace merc {
|
const size_t InvTypeTradeSize = 4;
|
||||||
|
|
||||||
|
} /*NPC*/
|
||||||
|
|
||||||
|
namespace NPCMerchant {
|
||||||
enum : int { Invalid = -1, Null, Safety };
|
enum : int { Invalid = -1, Null, Safety };
|
||||||
|
|
||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
}
|
|
||||||
|
|
||||||
namespace bot {
|
const size_t InvTypeTradeSize = 4;
|
||||||
|
|
||||||
|
} /*NPCMerchant*/
|
||||||
|
|
||||||
|
namespace Merc {
|
||||||
enum : int { Invalid = -1, Null, Safety };
|
enum : int { Invalid = -1, Null, Safety };
|
||||||
|
|
||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
}
|
|
||||||
|
|
||||||
namespace pet {
|
const size_t InvTypeTradeSize = 4;
|
||||||
|
|
||||||
|
} /*Merc*/
|
||||||
|
|
||||||
|
namespace Bot {
|
||||||
enum : int { Invalid = -1, Null, Safety };
|
enum : int { Invalid = -1, Null, Safety };
|
||||||
|
|
||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
}
|
|
||||||
|
const size_t InvTypeTradeSize = 8;
|
||||||
|
|
||||||
|
} /*Bot*/
|
||||||
|
|
||||||
|
namespace ClientPet {
|
||||||
|
enum : int { Invalid = -1, Null, Safety };
|
||||||
|
|
||||||
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
|
const size_t InvTypeTradeSize = 4;
|
||||||
|
|
||||||
|
} /*Pet*/
|
||||||
|
|
||||||
|
namespace NPCPet {
|
||||||
|
enum : int { Invalid = -1, Null, Safety };
|
||||||
|
|
||||||
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
|
const size_t InvTypeTradeSize = 4;
|
||||||
|
|
||||||
|
} /*Pet*/
|
||||||
|
|
||||||
|
namespace MercPet {
|
||||||
|
enum : int { Invalid = -1, Null, Safety };
|
||||||
|
|
||||||
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
|
const size_t InvTypeTradeSize = 4;
|
||||||
|
|
||||||
|
} /*Pet*/
|
||||||
|
|
||||||
|
namespace BotPet {
|
||||||
|
enum : int { Invalid = -1, Null, Safety };
|
||||||
|
|
||||||
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
|
const size_t InvTypeTradeSize = 4;
|
||||||
|
|
||||||
|
} /*Pet*/
|
||||||
|
|
||||||
}; /*EntityLimits*/
|
}; /*EntityLimits*/
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ N(OP_BuffRemoveRequest),
|
|||||||
N(OP_Bug),
|
N(OP_Bug),
|
||||||
N(OP_CameraEffect),
|
N(OP_CameraEffect),
|
||||||
N(OP_Camp),
|
N(OP_Camp),
|
||||||
|
N(OP_CancelSneakHide),
|
||||||
N(OP_CancelTask),
|
N(OP_CancelTask),
|
||||||
N(OP_CancelTrade),
|
N(OP_CancelTrade),
|
||||||
N(OP_CastSpell),
|
N(OP_CastSpell),
|
||||||
@@ -288,6 +289,7 @@ N(OP_LFGuild),
|
|||||||
N(OP_LFPCommand),
|
N(OP_LFPCommand),
|
||||||
N(OP_LFPGetMatchesRequest),
|
N(OP_LFPGetMatchesRequest),
|
||||||
N(OP_LFPGetMatchesResponse),
|
N(OP_LFPGetMatchesResponse),
|
||||||
|
N(OP_LinkedReuse),
|
||||||
N(OP_LoadSpellSet),
|
N(OP_LoadSpellSet),
|
||||||
N(OP_LocInfo),
|
N(OP_LocInfo),
|
||||||
N(OP_LockoutTimerInfo),
|
N(OP_LockoutTimerInfo),
|
||||||
|
|||||||
@@ -0,0 +1,370 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
|
||||||
|
Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "emu_versions.h"
|
||||||
|
|
||||||
|
|
||||||
|
bool EQEmu::versions::IsValidClientVersion(ClientVersion client_version)
|
||||||
|
{
|
||||||
|
if (client_version <= ClientVersion::Unknown || client_version > LastClientVersion)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::ClientVersion EQEmu::versions::ValidateClientVersion(ClientVersion client_version)
|
||||||
|
{
|
||||||
|
if (client_version <= ClientVersion::Unknown || client_version > LastClientVersion)
|
||||||
|
return ClientVersion::Unknown;
|
||||||
|
|
||||||
|
return client_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* EQEmu::versions::ClientVersionName(ClientVersion client_version)
|
||||||
|
{
|
||||||
|
switch (client_version) {
|
||||||
|
case ClientVersion::Unknown:
|
||||||
|
return "Unknown Version";
|
||||||
|
case ClientVersion::Client62:
|
||||||
|
return "Client 6.2";
|
||||||
|
case ClientVersion::Titanium:
|
||||||
|
return "Titanium";
|
||||||
|
case ClientVersion::SoF:
|
||||||
|
return "SoF";
|
||||||
|
case ClientVersion::SoD:
|
||||||
|
return "SoD";
|
||||||
|
case ClientVersion::UF:
|
||||||
|
return "UF";
|
||||||
|
case ClientVersion::RoF:
|
||||||
|
return "RoF";
|
||||||
|
case ClientVersion::RoF2:
|
||||||
|
return "RoF2";
|
||||||
|
default:
|
||||||
|
return "Invalid Version";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 EQEmu::versions::ConvertClientVersionToClientVersionBit(ClientVersion client_version)
|
||||||
|
{
|
||||||
|
switch (client_version) {
|
||||||
|
case ClientVersion::Unknown:
|
||||||
|
case ClientVersion::Client62:
|
||||||
|
return bit_Unknown;
|
||||||
|
case ClientVersion::Titanium:
|
||||||
|
return bit_Titanium;
|
||||||
|
case ClientVersion::SoF:
|
||||||
|
return bit_SoF;
|
||||||
|
case ClientVersion::SoD:
|
||||||
|
return bit_SoD;
|
||||||
|
case ClientVersion::UF:
|
||||||
|
return bit_UF;
|
||||||
|
case ClientVersion::RoF:
|
||||||
|
return bit_RoF;
|
||||||
|
case ClientVersion::RoF2:
|
||||||
|
return bit_RoF2;
|
||||||
|
default:
|
||||||
|
return bit_Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::ClientVersion EQEmu::versions::ConvertClientVersionBitToClientVersion(uint32 client_version_bit)
|
||||||
|
{
|
||||||
|
switch (client_version_bit) {
|
||||||
|
case (uint32)static_cast<unsigned int>(ClientVersion::Unknown) :
|
||||||
|
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::Client62) - 1)) :
|
||||||
|
return ClientVersion::Unknown;
|
||||||
|
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::Titanium) - 1)) :
|
||||||
|
return ClientVersion::Titanium;
|
||||||
|
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::SoF) - 1)) :
|
||||||
|
return ClientVersion::SoF;
|
||||||
|
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::SoD) - 1)) :
|
||||||
|
return ClientVersion::SoD;
|
||||||
|
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::UF) - 1)) :
|
||||||
|
return ClientVersion::UF;
|
||||||
|
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::RoF) - 1)) :
|
||||||
|
return ClientVersion::RoF;
|
||||||
|
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::RoF2) - 1)) :
|
||||||
|
return ClientVersion::RoF2;
|
||||||
|
default:
|
||||||
|
return ClientVersion::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 EQEmu::versions::ConvertClientVersionToExpansion(ClientVersion client_version)
|
||||||
|
{
|
||||||
|
switch (client_version) {
|
||||||
|
case ClientVersion::Unknown:
|
||||||
|
case ClientVersion::Client62:
|
||||||
|
case ClientVersion::Titanium:
|
||||||
|
return 0x000007FFU;
|
||||||
|
case ClientVersion::SoF:
|
||||||
|
return 0x00007FFFU;
|
||||||
|
case ClientVersion::SoD:
|
||||||
|
return 0x0000FFFFU;
|
||||||
|
case ClientVersion::UF:
|
||||||
|
return 0x0001FFFFU;
|
||||||
|
case ClientVersion::RoF:
|
||||||
|
case ClientVersion::RoF2:
|
||||||
|
return 0x000FFFFFU;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQEmu::versions::IsValidInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
if (inventory_version <= InventoryVersion::Unknown || inventory_version > LastInventoryVersion)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQEmu::versions::IsValidPCInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
if (inventory_version <= InventoryVersion::Unknown || inventory_version > LastPCInventoryVersion)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQEmu::versions::IsValidNonPCInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
if (inventory_version <= LastPCInventoryVersion || inventory_version > LastNonPCInventoryVersion)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQEmu::versions::IsValidOfflinePCInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
if (inventory_version <= LastNonPCInventoryVersion || inventory_version > LastOfflinePCInventoryVersion)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::InventoryVersion EQEmu::versions::ValidateInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
if (inventory_version <= InventoryVersion::Unknown || inventory_version > LastInventoryVersion)
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
|
||||||
|
return inventory_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::InventoryVersion EQEmu::versions::ValidatePCInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
if (inventory_version <= InventoryVersion::Unknown || inventory_version > LastPCInventoryVersion)
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
|
||||||
|
return inventory_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::InventoryVersion EQEmu::versions::ValidateNonPCInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
if (inventory_version <= LastPCInventoryVersion || inventory_version > LastNonPCInventoryVersion)
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
|
||||||
|
return inventory_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::InventoryVersion EQEmu::versions::ValidateOfflinePCInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
if (inventory_version <= LastNonPCInventoryVersion || inventory_version > LastOfflinePCInventoryVersion)
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
|
||||||
|
return inventory_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* EQEmu::versions::InventoryVersionName(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
switch (inventory_version) {
|
||||||
|
case InventoryVersion::Unknown:
|
||||||
|
return "Unknown Version";
|
||||||
|
case InventoryVersion::Client62:
|
||||||
|
return "Client 6.2";
|
||||||
|
case InventoryVersion::Titanium:
|
||||||
|
return "Titanium";
|
||||||
|
case InventoryVersion::SoF:
|
||||||
|
return "SoF";
|
||||||
|
case InventoryVersion::SoD:
|
||||||
|
return "SoD";
|
||||||
|
case InventoryVersion::UF:
|
||||||
|
return "UF";
|
||||||
|
case InventoryVersion::RoF:
|
||||||
|
return "RoF";
|
||||||
|
case InventoryVersion::RoF2:
|
||||||
|
return "RoF2";
|
||||||
|
case InventoryVersion::NPC:
|
||||||
|
return "NPC";
|
||||||
|
case InventoryVersion::NPCMerchant:
|
||||||
|
return "NPC Merchant";
|
||||||
|
case InventoryVersion::Merc:
|
||||||
|
return "Merc";
|
||||||
|
case InventoryVersion::Bot:
|
||||||
|
return "Bot";
|
||||||
|
case InventoryVersion::ClientPet:
|
||||||
|
return "Client Pet";
|
||||||
|
case InventoryVersion::NPCPet:
|
||||||
|
return "NPC Pet";
|
||||||
|
case InventoryVersion::MercPet:
|
||||||
|
return "Merc Pet";
|
||||||
|
case InventoryVersion::BotPet:
|
||||||
|
return "Bot Pet";
|
||||||
|
case InventoryVersion::OfflineTitanium:
|
||||||
|
return "Offline Titanium";
|
||||||
|
case InventoryVersion::OfflineSoF:
|
||||||
|
return "Offline SoF";
|
||||||
|
case InventoryVersion::OfflineSoD:
|
||||||
|
return "Offline SoD";
|
||||||
|
case InventoryVersion::OfflineUF:
|
||||||
|
return "Offline UF";
|
||||||
|
case InventoryVersion::OfflineRoF:
|
||||||
|
return "Offline RoF";
|
||||||
|
case InventoryVersion::OfflineRoF2:
|
||||||
|
return "Offline RoF2";
|
||||||
|
default:
|
||||||
|
return "Invalid Version";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::ClientVersion EQEmu::versions::ConvertInventoryVersionToClientVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
switch (inventory_version) {
|
||||||
|
case InventoryVersion::Unknown:
|
||||||
|
case InventoryVersion::Client62:
|
||||||
|
return ClientVersion::Unknown;
|
||||||
|
case InventoryVersion::Titanium:
|
||||||
|
return ClientVersion::Titanium;
|
||||||
|
case InventoryVersion::SoF:
|
||||||
|
return ClientVersion::SoF;
|
||||||
|
case InventoryVersion::SoD:
|
||||||
|
return ClientVersion::SoD;
|
||||||
|
case InventoryVersion::UF:
|
||||||
|
return ClientVersion::UF;
|
||||||
|
case InventoryVersion::RoF:
|
||||||
|
return ClientVersion::RoF;
|
||||||
|
case InventoryVersion::RoF2:
|
||||||
|
return ClientVersion::RoF2;
|
||||||
|
default:
|
||||||
|
return ClientVersion::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::InventoryVersion EQEmu::versions::ConvertClientVersionToInventoryVersion(ClientVersion client_version)
|
||||||
|
{
|
||||||
|
switch (client_version) {
|
||||||
|
case ClientVersion::Unknown:
|
||||||
|
case ClientVersion::Client62:
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
case ClientVersion::Titanium:
|
||||||
|
return InventoryVersion::Titanium;
|
||||||
|
case ClientVersion::SoF:
|
||||||
|
return InventoryVersion::SoF;
|
||||||
|
case ClientVersion::SoD:
|
||||||
|
return InventoryVersion::SoD;
|
||||||
|
case ClientVersion::UF:
|
||||||
|
return InventoryVersion::UF;
|
||||||
|
case ClientVersion::RoF:
|
||||||
|
return InventoryVersion::RoF;
|
||||||
|
case ClientVersion::RoF2:
|
||||||
|
return InventoryVersion::RoF2;
|
||||||
|
default:
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::InventoryVersion EQEmu::versions::ConvertPCInventoryVersionToOfflinePCInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
switch (inventory_version) {
|
||||||
|
case InventoryVersion::Titanium:
|
||||||
|
return InventoryVersion::OfflineTitanium;
|
||||||
|
case InventoryVersion::SoF:
|
||||||
|
return InventoryVersion::OfflineSoF;
|
||||||
|
case InventoryVersion::SoD:
|
||||||
|
return InventoryVersion::OfflineSoD;
|
||||||
|
case InventoryVersion::UF:
|
||||||
|
return InventoryVersion::OfflineUF;
|
||||||
|
case InventoryVersion::RoF:
|
||||||
|
return InventoryVersion::OfflineRoF;
|
||||||
|
case InventoryVersion::RoF2:
|
||||||
|
return InventoryVersion::OfflineRoF2;
|
||||||
|
default:
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::InventoryVersion EQEmu::versions::ConvertOfflinePCInventoryVersionToPCInventoryVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
switch (inventory_version) {
|
||||||
|
case InventoryVersion::OfflineTitanium:
|
||||||
|
return InventoryVersion::Titanium;
|
||||||
|
case InventoryVersion::OfflineSoF:
|
||||||
|
return InventoryVersion::SoF;
|
||||||
|
case InventoryVersion::OfflineSoD:
|
||||||
|
return InventoryVersion::SoD;
|
||||||
|
case InventoryVersion::OfflineUF:
|
||||||
|
return InventoryVersion::UF;
|
||||||
|
case InventoryVersion::OfflineRoF:
|
||||||
|
return InventoryVersion::RoF;
|
||||||
|
case InventoryVersion::OfflineRoF2:
|
||||||
|
return InventoryVersion::RoF2;
|
||||||
|
default:
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::ClientVersion EQEmu::versions::ConvertOfflinePCInventoryVersionToClientVersion(InventoryVersion inventory_version)
|
||||||
|
{
|
||||||
|
switch (inventory_version) {
|
||||||
|
case InventoryVersion::OfflineTitanium:
|
||||||
|
return ClientVersion::Titanium;
|
||||||
|
case InventoryVersion::OfflineSoF:
|
||||||
|
return ClientVersion::SoF;
|
||||||
|
case InventoryVersion::OfflineSoD:
|
||||||
|
return ClientVersion::SoD;
|
||||||
|
case InventoryVersion::OfflineUF:
|
||||||
|
return ClientVersion::UF;
|
||||||
|
case InventoryVersion::OfflineRoF:
|
||||||
|
return ClientVersion::RoF;
|
||||||
|
case InventoryVersion::OfflineRoF2:
|
||||||
|
return ClientVersion::RoF2;
|
||||||
|
default:
|
||||||
|
return ClientVersion::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::versions::InventoryVersion EQEmu::versions::ConvertClientVersionToOfflinePCInventoryVersion(ClientVersion client_version)
|
||||||
|
{
|
||||||
|
switch (client_version) {
|
||||||
|
case ClientVersion::Titanium:
|
||||||
|
return InventoryVersion::OfflineTitanium;
|
||||||
|
case ClientVersion::SoF:
|
||||||
|
return InventoryVersion::OfflineSoF;
|
||||||
|
case ClientVersion::SoD:
|
||||||
|
return InventoryVersion::OfflineSoD;
|
||||||
|
case ClientVersion::UF:
|
||||||
|
return InventoryVersion::OfflineUF;
|
||||||
|
case ClientVersion::RoF:
|
||||||
|
return InventoryVersion::OfflineRoF;
|
||||||
|
case ClientVersion::RoF2:
|
||||||
|
return InventoryVersion::OfflineRoF2;
|
||||||
|
default:
|
||||||
|
return InventoryVersion::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,8 +17,8 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMMON_CLIENT_VERSION_H
|
#ifndef COMMON_EMU_VERSIONS_H
|
||||||
#define COMMON_CLIENT_VERSION_H
|
#define COMMON_EMU_VERSIONS_H
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
@@ -61,8 +61,8 @@ namespace EQEmu
|
|||||||
bit_AllClients = 0xFFFFFFFF
|
bit_AllClients = 0xFFFFFFFF
|
||||||
};
|
};
|
||||||
|
|
||||||
static const ClientVersion LastClientVersion = ClientVersion::RoF2;
|
const ClientVersion LastClientVersion = ClientVersion::RoF2;
|
||||||
static const size_t ClientVersionCount = (static_cast<size_t>(LastClientVersion) + 1);
|
const size_t ClientVersionCount = (static_cast<size_t>(LastClientVersion) + 1);
|
||||||
|
|
||||||
extern bool IsValidClientVersion(ClientVersion client_version);
|
extern bool IsValidClientVersion(ClientVersion client_version);
|
||||||
extern ClientVersion ValidateClientVersion(ClientVersion client_version);
|
extern ClientVersion ValidateClientVersion(ClientVersion client_version);
|
||||||
@@ -73,6 +73,58 @@ namespace EQEmu
|
|||||||
|
|
||||||
} /*versions*/
|
} /*versions*/
|
||||||
|
|
||||||
|
namespace versions {
|
||||||
|
enum class InventoryVersion {
|
||||||
|
Unknown = 0,
|
||||||
|
Client62,
|
||||||
|
Titanium,
|
||||||
|
SoF,
|
||||||
|
SoD,
|
||||||
|
UF,
|
||||||
|
RoF,
|
||||||
|
RoF2,
|
||||||
|
NPC,
|
||||||
|
NPCMerchant,
|
||||||
|
Merc,
|
||||||
|
Bot,
|
||||||
|
ClientPet,
|
||||||
|
NPCPet,
|
||||||
|
MercPet,
|
||||||
|
BotPet,
|
||||||
|
OfflineTitanium,
|
||||||
|
OfflineSoF,
|
||||||
|
OfflineSoD,
|
||||||
|
OfflineUF,
|
||||||
|
OfflineRoF,
|
||||||
|
OfflineRoF2
|
||||||
|
};
|
||||||
|
|
||||||
|
const InventoryVersion LastInventoryVersion = InventoryVersion::OfflineRoF2;
|
||||||
|
const InventoryVersion LastPCInventoryVersion = InventoryVersion::RoF2;
|
||||||
|
const InventoryVersion LastNonPCInventoryVersion = InventoryVersion::BotPet;
|
||||||
|
const InventoryVersion LastOfflinePCInventoryVersion = InventoryVersion::OfflineRoF2;
|
||||||
|
const size_t InventoryVersionCount = (static_cast<size_t>(LastInventoryVersion) + 1);
|
||||||
|
|
||||||
|
extern bool IsValidInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
extern bool IsValidPCInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
extern bool IsValidNonPCInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
extern bool IsValidOfflinePCInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
|
||||||
|
extern InventoryVersion ValidateInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
extern InventoryVersion ValidatePCInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
extern InventoryVersion ValidateNonPCInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
extern InventoryVersion ValidateOfflinePCInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
|
||||||
|
extern const char* InventoryVersionName(InventoryVersion inventory_version);
|
||||||
|
extern ClientVersion ConvertInventoryVersionToClientVersion(InventoryVersion inventory_version);
|
||||||
|
extern InventoryVersion ConvertClientVersionToInventoryVersion(ClientVersion client_version);
|
||||||
|
extern InventoryVersion ConvertPCInventoryVersionToOfflinePCInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
extern InventoryVersion ConvertOfflinePCInventoryVersionToPCInventoryVersion(InventoryVersion inventory_version);
|
||||||
|
extern ClientVersion ConvertOfflinePCInventoryVersionToClientVersion(InventoryVersion inventory_version);
|
||||||
|
extern InventoryVersion ConvertClientVersionToOfflinePCInventoryVersion(ClientVersion client_version);
|
||||||
|
|
||||||
|
} /*versions*/
|
||||||
|
|
||||||
} /*EQEmu*/
|
} /*EQEmu*/
|
||||||
|
|
||||||
#endif /*COMMON_CLIENT_VERSION_H*/
|
#endif /*COMMON_EMU_VERSIONS_H*/
|
||||||
@@ -516,7 +516,6 @@ static const uint8 SkillDamageTypes[EQEmu::skills::HIGHEST_SKILL + 1] = // chang
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define INVALID_INDEX -1
|
#define INVALID_INDEX -1
|
||||||
#define NOT_USED 0
|
|
||||||
#define NO_ITEM 0
|
#define NO_ITEM 0
|
||||||
|
|
||||||
// yes..these are redundant... but, they help to identify and define what is actually being performed
|
// yes..these are redundant... but, they help to identify and define what is actually being performed
|
||||||
|
|||||||
+341
-481
@@ -21,501 +21,361 @@
|
|||||||
#include "emu_limits.h"
|
#include "emu_limits.h"
|
||||||
|
|
||||||
|
|
||||||
size_t EQEmu::constants::CharacterCreationLimit(versions::ClientVersion client_version)
|
static const EQEmu::constants::LookupEntry constants_lookup_entries[EQEmu::versions::ClientVersionCount] =
|
||||||
{
|
{
|
||||||
static const size_t local[versions::ClientVersionCount] = {
|
{ // Unknown
|
||||||
ClientUnknown::Null,
|
ClientUnknown::Null
|
||||||
Client62::Null,
|
},
|
||||||
Titanium::constants::CharacterCreationLimit,
|
{ // Client62
|
||||||
SoF::constants::CharacterCreationLimit,
|
Client62::Null
|
||||||
SoD::constants::CharacterCreationLimit,
|
},
|
||||||
UF::constants::CharacterCreationLimit,
|
{ // Titanium
|
||||||
RoF::constants::CharacterCreationLimit,
|
Titanium::constants::CharacterCreationLimit
|
||||||
|
},
|
||||||
|
{ // SoF
|
||||||
|
SoF::constants::CharacterCreationLimit
|
||||||
|
},
|
||||||
|
{ // SoD
|
||||||
|
SoD::constants::CharacterCreationLimit
|
||||||
|
},
|
||||||
|
{ // UF
|
||||||
|
UF::constants::CharacterCreationLimit
|
||||||
|
},
|
||||||
|
{ // RoF
|
||||||
|
RoF::constants::CharacterCreationLimit
|
||||||
|
},
|
||||||
|
{ // RoF2
|
||||||
RoF2::constants::CharacterCreationLimit
|
RoF2::constants::CharacterCreationLimit
|
||||||
};
|
|
||||||
|
|
||||||
return local[static_cast<size_t>(versions::ValidateClientVersion(client_version))];
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16 EQEmu::inventory::InventoryTypeSize(versions::InventoryVersion inventory_version, int16 inv_type)
|
|
||||||
{
|
|
||||||
static const uint16 local[legacy::TypeCount][versions::InventoryVersionCount] = {
|
|
||||||
{ // local[TypePossessions]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE,
|
|
||||||
legacy::TYPE_POSSESSIONS_SIZE
|
|
||||||
},
|
|
||||||
{ // local[TypeBank]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::invtype::InvTypeBankSize,
|
|
||||||
legacy::TYPE_BANK_SIZE,
|
|
||||||
legacy::TYPE_BANK_SIZE,
|
|
||||||
legacy::TYPE_BANK_SIZE,
|
|
||||||
legacy::TYPE_BANK_SIZE,
|
|
||||||
legacy::TYPE_BANK_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeSharedBank]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
legacy::TYPE_SHARED_BANK_SIZE,
|
|
||||||
legacy::TYPE_SHARED_BANK_SIZE,
|
|
||||||
legacy::TYPE_SHARED_BANK_SIZE,
|
|
||||||
legacy::TYPE_SHARED_BANK_SIZE,
|
|
||||||
legacy::TYPE_SHARED_BANK_SIZE,
|
|
||||||
legacy::TYPE_SHARED_BANK_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeTrade]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
legacy::TYPE_TRADE_SIZE,
|
|
||||||
legacy::TYPE_TRADE_SIZE,
|
|
||||||
legacy::TYPE_TRADE_SIZE,
|
|
||||||
legacy::TYPE_TRADE_SIZE,
|
|
||||||
legacy::TYPE_TRADE_SIZE,
|
|
||||||
legacy::TYPE_TRADE_SIZE,
|
|
||||||
4,
|
|
||||||
4,
|
|
||||||
legacy::TYPE_TRADE_SIZE, // client thinks this is another client
|
|
||||||
4
|
|
||||||
},
|
|
||||||
{ // local[TypeWorld]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
legacy::TYPE_WORLD_SIZE,
|
|
||||||
legacy::TYPE_WORLD_SIZE,
|
|
||||||
legacy::TYPE_WORLD_SIZE,
|
|
||||||
legacy::TYPE_WORLD_SIZE,
|
|
||||||
legacy::TYPE_WORLD_SIZE,
|
|
||||||
legacy::TYPE_WORLD_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeLimbo]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
legacy::TYPE_LIMBO_SIZE,
|
|
||||||
legacy::TYPE_LIMBO_SIZE,
|
|
||||||
legacy::TYPE_LIMBO_SIZE,
|
|
||||||
legacy::TYPE_LIMBO_SIZE,
|
|
||||||
legacy::TYPE_LIMBO_SIZE,
|
|
||||||
legacy::TYPE_LIMBO_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeTribute]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
legacy::TYPE_TRIBUTE_SIZE,
|
|
||||||
legacy::TYPE_TRIBUTE_SIZE,
|
|
||||||
legacy::TYPE_TRIBUTE_SIZE,
|
|
||||||
legacy::TYPE_TRIBUTE_SIZE,
|
|
||||||
legacy::TYPE_TRIBUTE_SIZE,
|
|
||||||
legacy::TYPE_TRIBUTE_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeTrophyTribute]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_TROPHY_TRIBUTE_SIZE,
|
|
||||||
legacy::TYPE_TROPHY_TRIBUTE_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeGuildTribute]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_GUILD_TRIBUTE_SIZE,
|
|
||||||
legacy::TYPE_GUILD_TRIBUTE_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeMerchant]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_MERCHANT_SIZE,
|
|
||||||
legacy::TYPE_MERCHANT_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeDeleted]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_DELETED_SIZE,
|
|
||||||
legacy::TYPE_DELETED_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeCorpse]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::invtype::InvTypeCorpseSize,
|
|
||||||
SoF::invtype::InvTypeCorpseSize,
|
|
||||||
SoD::invtype::InvTypeCorpseSize,
|
|
||||||
UF::invtype::InvTypeCorpseSize,
|
|
||||||
RoF::invtype::InvTypeCorpseSize,
|
|
||||||
RoF2::invtype::InvTypeCorpseSize,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeBazaar]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
legacy::TYPE_BAZAAR_SIZE,
|
|
||||||
legacy::TYPE_BAZAAR_SIZE,
|
|
||||||
legacy::TYPE_BAZAAR_SIZE,
|
|
||||||
legacy::TYPE_BAZAAR_SIZE,
|
|
||||||
legacy::TYPE_BAZAAR_SIZE,
|
|
||||||
legacy::TYPE_BAZAAR_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeInspect]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::invtype::InvTypeInspectSize,
|
|
||||||
SoF::invtype::InvTypeInspectSize,
|
|
||||||
SoD::invtype::InvTypeInspectSize,
|
|
||||||
UF::invtype::InvTypeInspectSize,
|
|
||||||
RoF::invtype::InvTypeInspectSize,
|
|
||||||
RoF2::invtype::InvTypeInspectSize,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeRealEstate]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_REAL_ESTATE_SIZE,
|
|
||||||
legacy::TYPE_REAL_ESTATE_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeViewMODPC]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_VIEW_MOD_PC_SIZE,
|
|
||||||
legacy::TYPE_VIEW_MOD_PC_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeViewMODBank]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_VIEW_MOD_BANK_SIZE,
|
|
||||||
legacy::TYPE_VIEW_MOD_BANK_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeViewMODSharedBank]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_VIEW_MOD_SHARED_BANK_SIZE,
|
|
||||||
legacy::TYPE_VIEW_MOD_SHARED_BANK_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeViewMODLimbo]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_VIEW_MOD_LIMBO_SIZE,
|
|
||||||
legacy::TYPE_VIEW_MOD_LIMBO_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeAltStorage]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_ALT_STORAGE_SIZE,
|
|
||||||
legacy::TYPE_ALT_STORAGE_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeArchived]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_ARCHIVED_SIZE,
|
|
||||||
legacy::TYPE_ARCHIVED_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeMail]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_MAIL_SIZE,
|
|
||||||
legacy::TYPE_MAIL_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeGuildTrophyTribute]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_GUILD_TROPHY_TRIBUTE_SIZE,
|
|
||||||
legacy::TYPE_GUILD_TROPHY_TRIBUTE_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeKrono]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_KRONO_SIZE,
|
|
||||||
legacy::TYPE_KRONO_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
},
|
|
||||||
{ // local[TypeOther]
|
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
Titanium::Null,
|
|
||||||
SoF::Null,
|
|
||||||
SoD::Null,
|
|
||||||
UF::Null,
|
|
||||||
legacy::TYPE_OTHER_SIZE,
|
|
||||||
legacy::TYPE_OTHER_SIZE,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if ((uint16)inv_type < legacy::TypeCount)
|
const EQEmu::constants::LookupEntry* EQEmu::constants::Lookup(versions::ClientVersion client_version)
|
||||||
return local[inv_type][static_cast<size_t>(versions::ValidateInventoryVersion(inventory_version))];
|
|
||||||
|
|
||||||
return NOT_USED;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 EQEmu::inventory::PossessionsBitmask(versions::InventoryVersion inventory_version)
|
|
||||||
{
|
{
|
||||||
static const uint64 local[versions::InventoryVersionCount] = {
|
return &constants_lookup_entries[static_cast<int>(versions::ValidateClientVersion(client_version))];
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
0x000000027FDFFFFF,
|
|
||||||
0x000000027FFFFFFF,
|
|
||||||
0x000000027FFFFFFF,
|
|
||||||
0x000000027FFFFFFF,
|
|
||||||
0x00000003FFFFFFFF,
|
|
||||||
0x00000003FFFFFFFF,
|
|
||||||
EntityLimits::npc::Null,
|
|
||||||
EntityLimits::merc::Null,
|
|
||||||
EntityLimits::bot::Null,
|
|
||||||
EntityLimits::pet::Null
|
|
||||||
};
|
|
||||||
|
|
||||||
return NOT_USED;
|
|
||||||
//return local[static_cast<size_t>(versions::ValidateInventoryVersion(inventory_version))];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::inventory::AllowEmptyBagInBag(versions::InventoryVersion inventory_version)
|
static const EQEmu::inventory::LookupEntry inventory_lookup_entries[EQEmu::versions::InventoryVersionCount] =
|
||||||
{
|
{
|
||||||
static const bool local[versions::InventoryVersionCount] = {
|
{ // Unknown
|
||||||
ClientUnknown::False,
|
ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null,
|
||||||
Client62::False,
|
ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null,
|
||||||
Titanium::behavior::AllowEmptyBagInBag,
|
ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null,
|
||||||
SoF::behavior::AllowEmptyBagInBag,
|
ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null,
|
||||||
SoD::behavior::AllowEmptyBagInBag,
|
ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null,
|
||||||
UF::behavior::AllowEmptyBagInBag,
|
|
||||||
RoF::behavior::AllowEmptyBagInBag,
|
|
||||||
RoF2::behavior::AllowEmptyBagInBag,
|
|
||||||
EntityLimits::npc::False,
|
|
||||||
EntityLimits::merc::False,
|
|
||||||
EntityLimits::bot::False,
|
|
||||||
EntityLimits::pet::False
|
|
||||||
};
|
|
||||||
|
|
||||||
return false;
|
ClientUnknown::Null, ClientUnknown::Null, ClientUnknown::Null,
|
||||||
//return local[static_cast<size_t>(versions::ValidateInventoryVersion(inventory_version))];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EQEmu::inventory::AllowClickCastFromBag(versions::InventoryVersion inventory_version)
|
ClientUnknown::False, ClientUnknown::False, ClientUnknown::False, ClientUnknown::False
|
||||||
|
},
|
||||||
|
{ // Client62
|
||||||
|
Client62::Null, Client62::Null, Client62::Null, Client62::Null, Client62::Null,
|
||||||
|
Client62::Null, Client62::Null, Client62::Null, Client62::Null, Client62::Null,
|
||||||
|
Client62::Null, Client62::Null, Client62::Null, Client62::Null, Client62::Null,
|
||||||
|
Client62::Null, Client62::Null, Client62::Null, Client62::Null, Client62::Null,
|
||||||
|
Client62::Null, Client62::Null, Client62::Null, Client62::Null, Client62::Null,
|
||||||
|
|
||||||
|
Client62::Null, Client62::Null, Client62::Null,
|
||||||
|
|
||||||
|
Client62::False, Client62::False, Client62::False, Client62::False
|
||||||
|
},
|
||||||
|
{ // Titanium
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*Titanium::invtype::InvTypePossessionsSize,*/ Titanium::invtype::InvTypeBankSize, Titanium::invtype::InvTypeSharedBankSize, Titanium::invtype::InvTypeTradeSize, Titanium::invtype::InvTypeWorldSize,
|
||||||
|
Titanium::invtype::InvTypeLimboSize, Titanium::invtype::InvTypeTributeSize, Titanium::Null, Titanium::Null, /*Titanium::invtype::InvTypeGuildTributeSize,*/ Titanium::invtype::InvTypeMerchantSize,
|
||||||
|
Titanium::Null, Titanium::invtype::InvTypeCorpseSize, EQEmu::legacy::TYPE_BAZAAR_SIZE, /*Titanium::invtype::InvTypeBazaarSize,*/ Titanium::invtype::InvTypeInspectSize, Titanium::Null,
|
||||||
|
Titanium::invtype::InvTypeViewMODPCSize, Titanium::invtype::InvTypeViewMODBankSize, Titanium::invtype::InvTypeViewMODSharedBankSize, Titanium::invtype::InvTypeViewMODLimboSize, Titanium::invtype::InvTypeAltStorageSize,
|
||||||
|
Titanium::invtype::InvTypeArchivedSize, Titanium::Null, Titanium::Null, Titanium::Null, Titanium::invtype::InvTypeOtherSize,
|
||||||
|
|
||||||
|
Titanium::Null, /*0x000000027FDFFFFF,*/ EQEmu::legacy::ITEM_CONTAINER_SIZE, /*Titanium::invbag::ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*Titanium::invaug::ItemAugSize,*/
|
||||||
|
|
||||||
|
Titanium::inventory::AllowEmptyBagInBag, Titanium::inventory::AllowClickCastFromBag, Titanium::inventory::ConcatenateInvTypeLimbo, Titanium::inventory::AllowOverLevelEquipment
|
||||||
|
},
|
||||||
|
{ // SoF
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*SoF::invtype::InvTypePossessionsSize,*/ SoF::invtype::InvTypeBankSize, SoF::invtype::InvTypeSharedBankSize, SoF::invtype::InvTypeTradeSize, SoF::invtype::InvTypeWorldSize,
|
||||||
|
SoF::invtype::InvTypeLimboSize, SoF::invtype::InvTypeTributeSize, SoF::Null, SoF::Null, /*SoF::invtype::InvTypeGuildTributeSize,*/ SoF::invtype::InvTypeMerchantSize,
|
||||||
|
SoF::Null, SoF::invtype::InvTypeCorpseSize, EQEmu::legacy::TYPE_BAZAAR_SIZE, /*SoF::invtype::InvTypeBazaarSize,*/ SoF::invtype::InvTypeInspectSize, SoF::Null,
|
||||||
|
SoF::invtype::InvTypeViewMODPCSize, SoF::invtype::InvTypeViewMODBankSize, SoF::invtype::InvTypeViewMODSharedBankSize, SoF::invtype::InvTypeViewMODLimboSize, SoF::invtype::InvTypeAltStorageSize,
|
||||||
|
SoF::invtype::InvTypeArchivedSize, SoF::Null, SoF::Null, SoF::Null, SoF::invtype::InvTypeOtherSize,
|
||||||
|
|
||||||
|
SoF::Null, /*0x000000027FFFFFFF,*/ EQEmu::legacy::ITEM_CONTAINER_SIZE, /*SoF::invbag::ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*SoF::invaug::ItemAugSize,*/
|
||||||
|
|
||||||
|
SoF::inventory::AllowEmptyBagInBag, SoF::inventory::AllowClickCastFromBag, SoF::inventory::ConcatenateInvTypeLimbo, SoF::inventory::AllowOverLevelEquipment
|
||||||
|
},
|
||||||
|
{ // SoD
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*SoD::invtype::InvTypePossessionsSize,*/ SoD::invtype::InvTypeBankSize, SoD::invtype::InvTypeSharedBankSize, SoD::invtype::InvTypeTradeSize, SoD::invtype::InvTypeWorldSize,
|
||||||
|
SoD::invtype::InvTypeLimboSize, SoD::invtype::InvTypeTributeSize, SoD::Null, SoD::Null, /*SoD::invtype::InvTypeGuildTributeSize,*/ SoD::invtype::InvTypeMerchantSize,
|
||||||
|
SoD::Null, SoD::invtype::InvTypeCorpseSize, EQEmu::legacy::TYPE_BAZAAR_SIZE, /*SoD::invtype::InvTypeBazaarSize,*/ SoD::invtype::InvTypeInspectSize, SoD::Null,
|
||||||
|
SoD::invtype::InvTypeViewMODPCSize, SoD::invtype::InvTypeViewMODBankSize, SoD::invtype::InvTypeViewMODSharedBankSize, SoD::invtype::InvTypeViewMODLimboSize, SoD::invtype::InvTypeAltStorageSize,
|
||||||
|
SoD::invtype::InvTypeArchivedSize, SoD::Null, SoD::Null, SoD::Null, SoD::invtype::InvTypeOtherSize,
|
||||||
|
|
||||||
|
SoD::Null, /*0x000000027FFFFFFF,*/ EQEmu::legacy::ITEM_CONTAINER_SIZE, /*SoD::invbag::ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*SoD::invaug::ItemAugSize,*/
|
||||||
|
|
||||||
|
SoD::inventory::AllowEmptyBagInBag, SoD::inventory::AllowClickCastFromBag, SoD::inventory::ConcatenateInvTypeLimbo, SoD::inventory::AllowOverLevelEquipment
|
||||||
|
},
|
||||||
|
{ // UF
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*UF::invtype::InvTypePossessionsSize,*/ UF::invtype::InvTypeBankSize, UF::invtype::InvTypeSharedBankSize, UF::invtype::InvTypeTradeSize, UF::invtype::InvTypeWorldSize,
|
||||||
|
UF::invtype::InvTypeLimboSize, UF::invtype::InvTypeTributeSize, UF::Null, UF::Null, /*UF::invtype::InvTypeGuildTributeSize,*/ UF::invtype::InvTypeMerchantSize,
|
||||||
|
UF::Null, UF::invtype::InvTypeCorpseSize, EQEmu::legacy::TYPE_BAZAAR_SIZE, /*UF::invtype::InvTypeBazaarSize,*/ UF::invtype::InvTypeInspectSize, UF::Null,
|
||||||
|
UF::invtype::InvTypeViewMODPCSize, UF::invtype::InvTypeViewMODBankSize, UF::invtype::InvTypeViewMODSharedBankSize, UF::invtype::InvTypeViewMODLimboSize, UF::invtype::InvTypeAltStorageSize,
|
||||||
|
UF::invtype::InvTypeArchivedSize, UF::Null, UF::Null, UF::Null, UF::invtype::InvTypeOtherSize,
|
||||||
|
|
||||||
|
UF::Null, /*0x000000027FFFFFFF,*/ EQEmu::legacy::ITEM_CONTAINER_SIZE, /*UF::invbag::ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*UF::invaug::ItemAugSize,*/
|
||||||
|
|
||||||
|
UF::inventory::AllowEmptyBagInBag, UF::inventory::AllowClickCastFromBag, UF::inventory::ConcatenateInvTypeLimbo, UF::inventory::AllowOverLevelEquipment
|
||||||
|
},
|
||||||
|
{ // RoF
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*RoF::invtype::InvTypePossessionsSize,*/ RoF::invtype::InvTypeBankSize, RoF::invtype::InvTypeSharedBankSize, RoF::invtype::InvTypeTradeSize, RoF::invtype::InvTypeWorldSize,
|
||||||
|
RoF::invtype::InvTypeLimboSize, RoF::invtype::InvTypeTributeSize, RoF::Null, /*RoF::invtype::InvTypeTrophyTributeSize,*/ RoF::Null, /*RoF::invtype::InvTypeGuildTributeSize,*/ RoF::invtype::InvTypeMerchantSize,
|
||||||
|
RoF::Null, /*RoF::invtype::InvTypeDeletedSize,*/ RoF::invtype::InvTypeCorpseSize, EQEmu::legacy::TYPE_BAZAAR_SIZE, /*RoF::invtype::InvTypeBazaarSize,*/ RoF::invtype::InvTypeInspectSize, RoF::Null, /*RoF::invtype::InvTypeRealEstateSize,*/
|
||||||
|
RoF::invtype::InvTypeViewMODPCSize, RoF::invtype::InvTypeViewMODBankSize, RoF::invtype::InvTypeViewMODSharedBankSize, RoF::invtype::InvTypeViewMODLimboSize, RoF::invtype::InvTypeAltStorageSize,
|
||||||
|
RoF::invtype::InvTypeArchivedSize, RoF::invtype::InvTypeMailSize, RoF::invtype::InvTypeGuildTrophyTributeSize, RoF::Null, RoF::invtype::InvTypeOtherSize,
|
||||||
|
|
||||||
|
RoF::Null, /*0x00000003FFFFFFFF,*/ EQEmu::legacy::ITEM_CONTAINER_SIZE, /*RoF::invbag::ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*RoF::invaug::ItemAugSize,*/
|
||||||
|
|
||||||
|
RoF::False, /*RoF::inventory::AllowEmptyBagInBag,*/ RoF::inventory::AllowClickCastFromBag, RoF::inventory::ConcatenateInvTypeLimbo, RoF::inventory::AllowOverLevelEquipment
|
||||||
|
},
|
||||||
|
{ // RoF2
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*RoF2::invtype::InvTypePossessionsSize,*/ RoF2::invtype::InvTypeBankSize, RoF2::invtype::InvTypeSharedBankSize, RoF2::invtype::InvTypeTradeSize, RoF2::invtype::InvTypeWorldSize,
|
||||||
|
RoF2::invtype::InvTypeLimboSize, RoF2::invtype::InvTypeTributeSize, RoF2::Null, /*RoF2::invtype::InvTypeTrophyTributeSize,*/ RoF2::Null, /*RoF2::invtype::InvTypeGuildTributeSize,*/ RoF2::invtype::InvTypeMerchantSize,
|
||||||
|
RoF2::Null, /*RoF2::invtype::InvTypeDeletedSize,*/ RoF2::invtype::InvTypeCorpseSize, EQEmu::legacy::TYPE_BAZAAR_SIZE, /*RoF2::invtype::InvTypeBazaarSize,*/ RoF2::invtype::InvTypeInspectSize, RoF2::Null, /*RoF2::invtype::InvTypeRealEstateSize*/
|
||||||
|
RoF2::invtype::InvTypeViewMODPCSize, RoF2::invtype::InvTypeViewMODBankSize, RoF2::invtype::InvTypeViewMODSharedBankSize, RoF2::invtype::InvTypeViewMODLimboSize, RoF2::invtype::InvTypeAltStorageSize,
|
||||||
|
RoF2::invtype::InvTypeArchivedSize, RoF2::invtype::InvTypeMailSize, RoF2::invtype::InvTypeGuildTrophyTributeSize, RoF2::invtype::InvTypeKronoSize, RoF2::invtype::InvTypeOtherSize,
|
||||||
|
|
||||||
|
RoF2::Null, /*0x00000003FFFFFFFF,*/ EQEmu::legacy::ITEM_CONTAINER_SIZE, /*RoF2::invbag::ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*RoF2::invaug::ItemAugSize,*/
|
||||||
|
|
||||||
|
RoF2::False, /*RoF2::inventory::AllowEmptyBagInBag,*/ RoF2::inventory::AllowClickCastFromBag, RoF2::inventory::ConcatenateInvTypeLimbo, RoF2::inventory::AllowOverLevelEquipment
|
||||||
|
},
|
||||||
|
{ // NPC
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::InvTypeTradeSize, EntityLimits::NPC::Null,
|
||||||
|
EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null,
|
||||||
|
EntityLimits::NPC::Null, EntityLimits::NPC::Null, /*InvTypeCorpseSize,*/ EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null,
|
||||||
|
EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null,
|
||||||
|
EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null, EntityLimits::NPC::Null,
|
||||||
|
|
||||||
|
EntityLimits::NPC::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*ItemAugSize,*/
|
||||||
|
|
||||||
|
EntityLimits::NPC::False, EntityLimits::NPC::False, EntityLimits::NPC::False, EntityLimits::NPC::False
|
||||||
|
},
|
||||||
|
{ // NPCMerchant
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::InvTypeTradeSize, EntityLimits::NPCMerchant::Null,
|
||||||
|
EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null,
|
||||||
|
EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, /*InvTypeCorpseSize,*/ EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null,
|
||||||
|
EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null,
|
||||||
|
EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null, EntityLimits::NPCMerchant::Null,
|
||||||
|
|
||||||
|
EntityLimits::NPCMerchant::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*ItemAugSize,*/
|
||||||
|
|
||||||
|
EntityLimits::NPCMerchant::False, EntityLimits::NPCMerchant::False, EntityLimits::NPCMerchant::False, EntityLimits::NPCMerchant::False
|
||||||
|
},
|
||||||
|
{ // Merc
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::InvTypeTradeSize, EntityLimits::Merc::Null,
|
||||||
|
EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null,
|
||||||
|
EntityLimits::Merc::Null, EntityLimits::Merc::Null, /*InvTypeCorpseSize,*/ EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null,
|
||||||
|
EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null,
|
||||||
|
EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null, EntityLimits::Merc::Null,
|
||||||
|
|
||||||
|
EntityLimits::Merc::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*ItemAugSize,*/
|
||||||
|
|
||||||
|
EntityLimits::Merc::False, EntityLimits::Merc::False, EntityLimits::Merc::False, EntityLimits::Merc::False
|
||||||
|
},
|
||||||
|
{ // Bot
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::InvTypeTradeSize, EntityLimits::Bot::Null,
|
||||||
|
EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null,
|
||||||
|
EntityLimits::Bot::Null, EntityLimits::Bot::Null, /*InvTypeCorpseSize,*/ EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null,
|
||||||
|
EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null,
|
||||||
|
EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null, EntityLimits::Bot::Null,
|
||||||
|
|
||||||
|
EntityLimits::Bot::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*ItemAugSize,*/
|
||||||
|
|
||||||
|
EntityLimits::Bot::False, EntityLimits::Bot::False, EntityLimits::Bot::False, EntityLimits::Bot::False
|
||||||
|
},
|
||||||
|
{ // ClientPet
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::InvTypeTradeSize, EntityLimits::ClientPet::Null,
|
||||||
|
EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null,
|
||||||
|
EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, /*InvTypeCorpseSize,*/ EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null,
|
||||||
|
EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null,
|
||||||
|
EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null, EntityLimits::ClientPet::Null,
|
||||||
|
|
||||||
|
EntityLimits::ClientPet::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*ItemAugSize,*/
|
||||||
|
|
||||||
|
EntityLimits::ClientPet::False, EntityLimits::ClientPet::False, EntityLimits::ClientPet::False, EntityLimits::ClientPet::False
|
||||||
|
},
|
||||||
|
{ // NPCPet
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::InvTypeTradeSize, EntityLimits::NPCPet::Null,
|
||||||
|
EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null,
|
||||||
|
EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, /*InvTypeCorpseSize,*/ EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null,
|
||||||
|
EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null,
|
||||||
|
EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null, EntityLimits::NPCPet::Null,
|
||||||
|
|
||||||
|
EntityLimits::NPCPet::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*ItemAugSize,*/
|
||||||
|
|
||||||
|
EntityLimits::NPCPet::False, EntityLimits::NPCPet::False, EntityLimits::NPCPet::False, EntityLimits::NPCPet::False
|
||||||
|
},
|
||||||
|
{ // MercPet
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::InvTypeTradeSize, EntityLimits::MercPet::Null,
|
||||||
|
EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null,
|
||||||
|
EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, /*InvTypeCorpseSize,*/ EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null,
|
||||||
|
EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null,
|
||||||
|
EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null, EntityLimits::MercPet::Null,
|
||||||
|
|
||||||
|
EntityLimits::MercPet::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*ItemAugSize,*/
|
||||||
|
|
||||||
|
EntityLimits::MercPet::False, EntityLimits::MercPet::False, EntityLimits::MercPet::False, EntityLimits::MercPet::False
|
||||||
|
},
|
||||||
|
{ // BotPet
|
||||||
|
EQEmu::legacy::TYPE_POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::InvTypeTradeSize, EntityLimits::BotPet::Null,
|
||||||
|
EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null,
|
||||||
|
EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, /*InvTypeCorpseSize,*/ EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null,
|
||||||
|
EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null,
|
||||||
|
EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null, EntityLimits::BotPet::Null,
|
||||||
|
|
||||||
|
EntityLimits::BotPet::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*ItemBagSize,*/ EQEmu::legacy::ITEM_COMMON_SIZE, /*ItemAugSize,*/
|
||||||
|
|
||||||
|
EntityLimits::BotPet::False, EntityLimits::BotPet::False, EntityLimits::BotPet::False, EntityLimits::BotPet::False
|
||||||
|
},
|
||||||
|
{ // OfflineTitanium
|
||||||
|
Titanium::Null, Titanium::Null, Titanium::Null, Titanium::invtype::InvTypeTradeSize, Titanium::Null,
|
||||||
|
Titanium::Null, Titanium::Null, Titanium::Null, Titanium::Null, Titanium::invtype::InvTypeMerchantSize,
|
||||||
|
Titanium::Null, Titanium::Null, Titanium::Null, /*Titanium::invtype::InvTypeBazaarSize,*/ Titanium::invtype::InvTypeInspectSize, Titanium::Null,
|
||||||
|
Titanium::invtype::InvTypeViewMODPCSize, Titanium::invtype::InvTypeViewMODBankSize, Titanium::invtype::InvTypeViewMODSharedBankSize, Titanium::invtype::InvTypeViewMODLimboSize, Titanium::Null,
|
||||||
|
Titanium::Null, Titanium::Null, Titanium::Null, Titanium::Null, Titanium::Null,
|
||||||
|
|
||||||
|
Titanium::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*Titanium::Null,*/ Titanium::Null,
|
||||||
|
|
||||||
|
Titanium::False, Titanium::False, Titanium::False, Titanium::False
|
||||||
|
},
|
||||||
|
{ // OfflineSoF
|
||||||
|
SoF::Null, SoF::Null, SoF::Null, SoF::invtype::InvTypeTradeSize, SoF::Null,
|
||||||
|
SoF::Null, SoF::Null, SoF::Null, SoF::Null, SoF::invtype::InvTypeMerchantSize,
|
||||||
|
SoF::Null, SoF::Null, SoF::Null, /*SoF::invtype::InvTypeBazaarSize,*/ SoF::invtype::InvTypeInspectSize, SoF::Null,
|
||||||
|
SoF::invtype::InvTypeViewMODPCSize, SoF::invtype::InvTypeViewMODBankSize, SoF::invtype::InvTypeViewMODSharedBankSize, SoF::invtype::InvTypeViewMODLimboSize, SoF::Null,
|
||||||
|
SoF::Null, SoF::Null, SoF::Null, SoF::Null, SoF::Null,
|
||||||
|
|
||||||
|
SoF::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*SoF::Null,*/ SoF::Null,
|
||||||
|
|
||||||
|
SoF::False, SoF::False, SoF::False, SoF::False
|
||||||
|
},
|
||||||
|
{ // OfflineSoD
|
||||||
|
SoD::Null, SoD::Null, SoD::Null, SoD::invtype::InvTypeTradeSize, SoD::Null,
|
||||||
|
SoD::Null, SoD::Null, SoD::Null, SoD::Null, SoD::invtype::InvTypeMerchantSize,
|
||||||
|
SoD::Null, SoD::Null, SoD::Null, /*SoD::invtype::InvTypeBazaarSize,*/ SoD::invtype::InvTypeInspectSize, SoD::Null,
|
||||||
|
SoD::invtype::InvTypeViewMODPCSize, SoD::invtype::InvTypeViewMODBankSize, SoD::invtype::InvTypeViewMODSharedBankSize, SoD::invtype::InvTypeViewMODLimboSize, SoD::Null,
|
||||||
|
SoD::Null, SoD::Null, SoD::Null, SoD::Null, SoD::Null,
|
||||||
|
|
||||||
|
SoD::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*SoD::Null,*/ SoD::Null,
|
||||||
|
|
||||||
|
SoD::False, SoD::False, SoD::False, SoD::False
|
||||||
|
},
|
||||||
|
{ // OfflineUF
|
||||||
|
UF::Null, UF::Null, UF::Null, UF::invtype::InvTypeTradeSize, UF::Null,
|
||||||
|
UF::Null, UF::Null, UF::Null, UF::Null, UF::invtype::InvTypeMerchantSize,
|
||||||
|
UF::Null, UF::Null, UF::Null, /*UF::invtype::InvTypeBazaarSize,*/ UF::invtype::InvTypeInspectSize, UF::Null,
|
||||||
|
UF::invtype::InvTypeViewMODPCSize, UF::invtype::InvTypeViewMODBankSize, UF::invtype::InvTypeViewMODSharedBankSize, UF::invtype::InvTypeViewMODLimboSize, UF::Null,
|
||||||
|
UF::Null, UF::Null, UF::Null, UF::Null, UF::Null,
|
||||||
|
|
||||||
|
UF::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*UF::Null,*/ UF::Null,
|
||||||
|
|
||||||
|
UF::False, UF::False, UF::False, UF::False
|
||||||
|
},
|
||||||
|
{ // OfflineRoF
|
||||||
|
RoF::Null, RoF::Null, RoF::Null, RoF::invtype::InvTypeTradeSize, RoF::Null,
|
||||||
|
RoF::Null, RoF::Null, RoF::Null, RoF::Null, RoF::invtype::InvTypeMerchantSize,
|
||||||
|
RoF::Null, RoF::Null, RoF::Null, /*RoF::invtype::InvTypeBazaarSize,*/ RoF::invtype::InvTypeInspectSize, RoF::Null,
|
||||||
|
RoF::invtype::InvTypeViewMODPCSize, RoF::invtype::InvTypeViewMODBankSize, RoF::invtype::InvTypeViewMODSharedBankSize, RoF::invtype::InvTypeViewMODLimboSize, RoF::Null,
|
||||||
|
RoF::Null, RoF::Null, RoF::Null, RoF::Null, RoF::Null,
|
||||||
|
|
||||||
|
RoF::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*RoF::Null,*/ RoF::Null,
|
||||||
|
|
||||||
|
RoF::False, RoF::False, RoF::False, RoF::False
|
||||||
|
},
|
||||||
|
{ // OfflineRoF2
|
||||||
|
RoF2::Null, RoF2::Null, RoF2::Null, RoF2::invtype::InvTypeTradeSize, RoF2::Null,
|
||||||
|
RoF2::Null, RoF2::Null, RoF2::Null, RoF2::Null, RoF2::invtype::InvTypeMerchantSize,
|
||||||
|
RoF2::Null, RoF2::Null, RoF2::Null, /*RoF2::invtype::InvTypeBazaarSize,*/ RoF2::invtype::InvTypeInspectSize, RoF2::Null,
|
||||||
|
RoF2::invtype::InvTypeViewMODPCSize, RoF2::invtype::InvTypeViewMODBankSize, RoF2::invtype::InvTypeViewMODSharedBankSize, RoF2::invtype::InvTypeViewMODLimboSize, RoF2::Null,
|
||||||
|
RoF2::Null, RoF2::Null, RoF2::Null, RoF2::Null, RoF2::Null,
|
||||||
|
|
||||||
|
RoF2::Null, EQEmu::legacy::ITEM_CONTAINER_SIZE, /*RoF2::Null,*/ RoF2::Null,
|
||||||
|
|
||||||
|
RoF2::False, RoF2::False, RoF2::False, RoF2::False
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const EQEmu::inventory::LookupEntry* EQEmu::inventory::Lookup(versions::InventoryVersion inventory_version)
|
||||||
{
|
{
|
||||||
static const bool local[versions::InventoryVersionCount] = {
|
return &inventory_lookup_entries[static_cast<int>(versions::ValidateInventoryVersion(inventory_version))];
|
||||||
ClientUnknown::False,
|
|
||||||
Client62::False,
|
|
||||||
Titanium::behavior::AllowClickCastFromBag,
|
|
||||||
SoF::behavior::AllowClickCastFromBag,
|
|
||||||
SoD::behavior::AllowClickCastFromBag,
|
|
||||||
UF::behavior::AllowClickCastFromBag,
|
|
||||||
RoF::behavior::AllowClickCastFromBag,
|
|
||||||
RoF2::behavior::AllowClickCastFromBag,
|
|
||||||
EntityLimits::npc::False,
|
|
||||||
EntityLimits::merc::False,
|
|
||||||
EntityLimits::bot::False,
|
|
||||||
EntityLimits::pet::False
|
|
||||||
};
|
|
||||||
|
|
||||||
return local[static_cast<size_t>(versions::ValidateInventoryVersion(inventory_version))];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16 EQEmu::inventory::ItemAugSize(versions::InventoryVersion inventory_version)
|
static const EQEmu::behavior::LookupEntry behavior_lookup_entries[EQEmu::versions::InventoryVersionCount] =
|
||||||
{
|
{
|
||||||
static const uint16 local[versions::InventoryVersionCount] = {
|
{ // Unknown
|
||||||
ClientUnknown::Null,
|
ClientUnknown::True
|
||||||
Client62::Null,
|
},
|
||||||
legacy::ITEM_COMMON_SIZE,
|
{ // Client62
|
||||||
legacy::ITEM_COMMON_SIZE,
|
Client62::True
|
||||||
legacy::ITEM_COMMON_SIZE,
|
},
|
||||||
legacy::ITEM_COMMON_SIZE,
|
{ // Titanium
|
||||||
legacy::ITEM_COMMON_SIZE,
|
Titanium::behavior::CoinHasWeight
|
||||||
legacy::ITEM_COMMON_SIZE,
|
},
|
||||||
legacy::ITEM_COMMON_SIZE,
|
{ // SoF
|
||||||
legacy::ITEM_COMMON_SIZE,
|
SoF::behavior::CoinHasWeight
|
||||||
legacy::ITEM_COMMON_SIZE,
|
},
|
||||||
legacy::ITEM_COMMON_SIZE
|
{ // SoD
|
||||||
};
|
SoD::behavior::CoinHasWeight
|
||||||
|
},
|
||||||
|
{ // UF
|
||||||
|
UF::behavior::CoinHasWeight
|
||||||
|
},
|
||||||
|
{ // RoF
|
||||||
|
RoF::behavior::CoinHasWeight
|
||||||
|
},
|
||||||
|
{ // RoF2
|
||||||
|
RoF2::behavior::CoinHasWeight
|
||||||
|
},
|
||||||
|
{ // NPC
|
||||||
|
EntityLimits::NPC::True /*CoinHasWeight*/
|
||||||
|
},
|
||||||
|
{ // NPCMerchant
|
||||||
|
EntityLimits::NPC::True /*CoinHasWeight*/
|
||||||
|
},
|
||||||
|
{ // Merc
|
||||||
|
EntityLimits::Merc::True /*CoinHasWeight*/
|
||||||
|
},
|
||||||
|
{ // Bot
|
||||||
|
EntityLimits::Bot::True /*CoinHasWeight*/
|
||||||
|
},
|
||||||
|
{ // ClientPet
|
||||||
|
EntityLimits::ClientPet::True /*CoinHasWeight*/
|
||||||
|
},
|
||||||
|
{ // NPCPet
|
||||||
|
EntityLimits::NPCPet::True /*CoinHasWeight*/
|
||||||
|
},
|
||||||
|
{ // MercPet
|
||||||
|
EntityLimits::MercPet::True /*CoinHasWeight*/
|
||||||
|
},
|
||||||
|
{ // BotPet
|
||||||
|
EntityLimits::BotPet::True /*CoinHasWeight*/
|
||||||
|
},
|
||||||
|
{ // OfflineTitanium
|
||||||
|
Titanium::False
|
||||||
|
},
|
||||||
|
{ // OfflineSoF
|
||||||
|
SoF::False
|
||||||
|
},
|
||||||
|
{ // OfflineSoD
|
||||||
|
SoD::False
|
||||||
|
},
|
||||||
|
{ // OfflineUF
|
||||||
|
UF::False
|
||||||
|
},
|
||||||
|
{ // OfflineRoF
|
||||||
|
RoF::False
|
||||||
|
},
|
||||||
|
{ // OfflineRoF2
|
||||||
|
RoF2::False
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return local[static_cast<size_t>(versions::ValidateInventoryVersion(inventory_version))];
|
const EQEmu::behavior::LookupEntry* EQEmu::behavior::Lookup(versions::InventoryVersion inventory_version)
|
||||||
}
|
|
||||||
|
|
||||||
uint16 EQEmu::inventory::ItemBagSize(versions::InventoryVersion inventory_version)
|
|
||||||
{
|
{
|
||||||
static const uint16 local[versions::InventoryVersionCount] = {
|
return &behavior_lookup_entries[static_cast<int>(versions::ValidateInventoryVersion(inventory_version))];
|
||||||
ClientUnknown::Null,
|
|
||||||
Client62::Null,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE,
|
|
||||||
legacy::ITEM_CONTAINER_SIZE
|
|
||||||
};
|
|
||||||
|
|
||||||
return local[static_cast<size_t>(versions::ValidateInventoryVersion(inventory_version))];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EQEmu::profile::CoinHasWeight(versions::InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
static const bool local[versions::InventoryVersionCount] = {
|
|
||||||
ClientUnknown::True,
|
|
||||||
Client62::True,
|
|
||||||
Titanium::behavior::CoinHasWeight,
|
|
||||||
SoF::behavior::CoinHasWeight,
|
|
||||||
SoD::behavior::CoinHasWeight,
|
|
||||||
UF::behavior::CoinHasWeight,
|
|
||||||
RoF::behavior::CoinHasWeight,
|
|
||||||
RoF::behavior::CoinHasWeight,
|
|
||||||
EntityLimits::npc::True,
|
|
||||||
EntityLimits::merc::True,
|
|
||||||
EntityLimits::bot::True,
|
|
||||||
EntityLimits::pet::True
|
|
||||||
};
|
|
||||||
|
|
||||||
return local[static_cast<size_t>(versions::ValidateInventoryVersion(inventory_version))];
|
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-14
@@ -20,9 +20,10 @@
|
|||||||
#ifndef COMMON_EQ_LIMITS_H
|
#ifndef COMMON_EQ_LIMITS_H
|
||||||
#define COMMON_EQ_LIMITS_H
|
#define COMMON_EQ_LIMITS_H
|
||||||
|
|
||||||
|
#include "emu_legacy.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "eq_constants.h"
|
#include "eq_constants.h"
|
||||||
#include "inventory_version.h"
|
#include "emu_versions.h"
|
||||||
#include "../common/patches/titanium_limits.h"
|
#include "../common/patches/titanium_limits.h"
|
||||||
#include "../common/patches/sof_limits.h"
|
#include "../common/patches/sof_limits.h"
|
||||||
#include "../common/patches/sod_limits.h"
|
#include "../common/patches/sod_limits.h"
|
||||||
@@ -34,30 +35,43 @@
|
|||||||
namespace EQEmu
|
namespace EQEmu
|
||||||
{
|
{
|
||||||
namespace constants {
|
namespace constants {
|
||||||
extern size_t CharacterCreationLimit(versions::ClientVersion client_version);
|
class LookupEntry {
|
||||||
|
public:
|
||||||
|
size_t CharacterCreationLimit;
|
||||||
|
};
|
||||||
|
|
||||||
|
const LookupEntry* Lookup(versions::ClientVersion client_version);
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace inventory {
|
namespace inventory {
|
||||||
extern uint16 InventoryTypeSize(versions::InventoryVersion inventory_version, int16 inv_type);
|
class LookupEntry {
|
||||||
extern uint64 PossessionsBitmask(versions::InventoryVersion inventory_version);
|
public:
|
||||||
|
size_t InventoryTypeSize[legacy::TypeCount];
|
||||||
|
|
||||||
extern bool AllowEmptyBagInBag(versions::InventoryVersion inventory_version);
|
uint64 PossessionsBitmask;
|
||||||
extern bool AllowClickCastFromBag(versions::InventoryVersion inventory_version);
|
size_t ItemBagSize;
|
||||||
|
size_t ItemAugSize;
|
||||||
|
|
||||||
extern uint16 ItemAugSize(versions::InventoryVersion inventory_version);
|
bool AllowEmptyBagInBag;
|
||||||
extern uint16 ItemBagSize(versions::InventoryVersion inventory_version);
|
bool AllowClickCastFromBag;
|
||||||
|
bool ConcatenateInvTypeLimbo;
|
||||||
|
bool AllowOverLevelEquipment;
|
||||||
|
};
|
||||||
|
|
||||||
extern bool ConcatenateInvTypeLimbo(versions::InventoryVersion inventory_version);
|
const LookupEntry* Lookup(versions::InventoryVersion inventory_version);
|
||||||
|
|
||||||
extern bool AllowOverLevelEquipment(versions::InventoryVersion inventory_version);
|
|
||||||
|
|
||||||
} /*inventory*/
|
} /*inventory*/
|
||||||
|
|
||||||
namespace profile {
|
namespace behavior {
|
||||||
extern bool CoinHasWeight(versions::InventoryVersion inventory_version);
|
class LookupEntry {
|
||||||
|
public:
|
||||||
|
bool CoinHasWeight;
|
||||||
|
};
|
||||||
|
|
||||||
} /*profile*/
|
const LookupEntry* Lookup(versions::InventoryVersion inventory_version);
|
||||||
|
|
||||||
|
} /*behavior*/
|
||||||
|
|
||||||
} /*EQEmu*/
|
} /*EQEmu*/
|
||||||
|
|
||||||
|
|||||||
+71
-138
@@ -25,15 +25,17 @@
|
|||||||
#include <list>
|
#include <list>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "../common/version.h"
|
#include "../common/version.h"
|
||||||
//#include "../common/item_struct.h"
|
#include "emu_constants.h"
|
||||||
|
#include "textures.h"
|
||||||
|
|
||||||
|
|
||||||
static const uint32 BUFF_COUNT = 25;
|
static const uint32 BUFF_COUNT = 25;
|
||||||
|
static const uint32 PET_BUFF_COUNT = 30;
|
||||||
static const uint32 MAX_MERC = 100;
|
static const uint32 MAX_MERC = 100;
|
||||||
static const uint32 MAX_MERC_GRADES = 10;
|
static const uint32 MAX_MERC_GRADES = 10;
|
||||||
static const uint32 MAX_MERC_STANCES = 10;
|
static const uint32 MAX_MERC_STANCES = 10;
|
||||||
static const uint32 BLOCKED_BUFF_COUNT = 20;
|
static const uint32 BLOCKED_BUFF_COUNT = 20;
|
||||||
|
|
||||||
#include "emu_constants.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Compiler override to ensure
|
** Compiler override to ensure
|
||||||
@@ -125,37 +127,7 @@ struct LDoNTrapTemplate
|
|||||||
|
|
||||||
// All clients translate the character select information to some degree
|
// All clients translate the character select information to some degree
|
||||||
|
|
||||||
struct Color_Struct
|
struct CharSelectEquip : EQEmu::Texture_Struct, EQEmu::Tint_Struct {};
|
||||||
{
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
uint8 Blue;
|
|
||||||
uint8 Green;
|
|
||||||
uint8 Red;
|
|
||||||
uint8 UseTint; // if there's a tint this is FF
|
|
||||||
} RGB;
|
|
||||||
uint32 Color;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct EquipStruct
|
|
||||||
{
|
|
||||||
uint32 Material;
|
|
||||||
uint32 Unknown1;
|
|
||||||
uint32 EliteMaterial;
|
|
||||||
uint32 HeroForgeModel;
|
|
||||||
uint32 Material2; // Same as material?
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CharSelectEquip
|
|
||||||
{
|
|
||||||
uint32 Material;
|
|
||||||
uint32 Unknown1;
|
|
||||||
uint32 EliteMaterial;
|
|
||||||
uint32 HeroForgeModel;
|
|
||||||
uint32 Material2;
|
|
||||||
Color_Struct Color;
|
|
||||||
};
|
|
||||||
|
|
||||||
// RoF2-based hybrid struct
|
// RoF2-based hybrid struct
|
||||||
struct CharacterSelectEntry_Struct
|
struct CharacterSelectEntry_Struct
|
||||||
@@ -170,7 +142,7 @@ struct CharacterSelectEntry_Struct
|
|||||||
uint16 Instance;
|
uint16 Instance;
|
||||||
uint8 Gender;
|
uint8 Gender;
|
||||||
uint8 Face;
|
uint8 Face;
|
||||||
CharSelectEquip Equip[9];
|
CharSelectEquip Equip[EQEmu::textures::TextureCount];
|
||||||
uint8 Unknown15; // Seen FF
|
uint8 Unknown15; // Seen FF
|
||||||
uint8 Unknown19; // Seen FF
|
uint8 Unknown19; // Seen FF
|
||||||
uint32 DrakkinTattoo;
|
uint32 DrakkinTattoo;
|
||||||
@@ -279,22 +251,7 @@ struct Spawn_Struct {
|
|||||||
/*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner
|
/*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner
|
||||||
/*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader
|
/*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader
|
||||||
/*0194*/ uint8 unknown0194[3];
|
/*0194*/ uint8 unknown0194[3];
|
||||||
/*0197*/ union
|
/*0197*/ EQEmu::TextureProfile equipment;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0000*/ EquipStruct equip_helmet; // Equipment: Helmet visual
|
|
||||||
/*0000*/ EquipStruct equip_chest; // Equipment: Chest visual
|
|
||||||
/*0000*/ EquipStruct equip_arms; // Equipment: Arms visual
|
|
||||||
/*0000*/ EquipStruct equip_bracers; // Equipment: Wrist visual
|
|
||||||
/*0000*/ EquipStruct equip_hands; // Equipment: Hands visual
|
|
||||||
/*0000*/ EquipStruct equip_legs; // Equipment: Legs visual
|
|
||||||
/*0000*/ EquipStruct equip_feet; // Equipment: Boots visual
|
|
||||||
/*0000*/ EquipStruct equip_primary; // Equipment: Main visual
|
|
||||||
/*0000*/ EquipStruct equip_secondary; // Equipment: Off visual
|
|
||||||
} equip;
|
|
||||||
/*0000*/ EquipStruct equipment[EQEmu::legacy::MaterialCount];
|
|
||||||
};
|
|
||||||
/*0233*/ float runspeed; // Speed when running
|
/*0233*/ float runspeed; // Speed when running
|
||||||
/*0036*/ uint8 afk; // 0=no, 1=afk
|
/*0036*/ uint8 afk; // 0=no, 1=afk
|
||||||
/*0238*/ uint32 guildID; // Current guild
|
/*0238*/ uint32 guildID; // Current guild
|
||||||
@@ -325,22 +282,7 @@ union
|
|||||||
/*0340*/ uint32 spawnId; // Spawn Id
|
/*0340*/ uint32 spawnId; // Spawn Id
|
||||||
/*0344*/ uint8 unknown0344[3];
|
/*0344*/ uint8 unknown0344[3];
|
||||||
/*0347*/ uint8 IsMercenary;
|
/*0347*/ uint8 IsMercenary;
|
||||||
/*0348*/ union
|
/*0348*/ EQEmu::TintProfile equipment_tint;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0348*/ Color_Struct color_helmet; // Color of helmet item
|
|
||||||
/*0352*/ Color_Struct color_chest; // Color of chest item
|
|
||||||
/*0356*/ Color_Struct color_arms; // Color of arms item
|
|
||||||
/*0360*/ Color_Struct color_bracers; // Color of bracers item
|
|
||||||
/*0364*/ Color_Struct color_hands; // Color of hands item
|
|
||||||
/*0368*/ Color_Struct color_legs; // Color of legs item
|
|
||||||
/*0372*/ Color_Struct color_feet; // Color of feet item
|
|
||||||
/*0376*/ Color_Struct color_primary; // Color of primary item
|
|
||||||
/*0380*/ Color_Struct color_secondary; // Color of secondary item
|
|
||||||
} equipment_colors;
|
|
||||||
/*0348*/ Color_Struct colors[EQEmu::legacy::MaterialCount]; // Array elements correspond to struct equipment_colors above
|
|
||||||
};
|
|
||||||
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
|
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
|
||||||
/*0385*/
|
/*0385*/
|
||||||
|
|
||||||
@@ -445,7 +387,19 @@ struct MemorizeSpell_Struct {
|
|||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 unknown12;
|
uint32 reduction; // lower reuse
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Linked Spell Reuse Timer
|
||||||
|
** Length: 12
|
||||||
|
** Comes before the OP_Memorize
|
||||||
|
** Live (maybe TDS steam) has an extra DWORD after timer_id
|
||||||
|
*/
|
||||||
|
struct LinkedSpellReuseTimer_Struct {
|
||||||
|
uint32 timer_id; // Timer ID of the spell
|
||||||
|
uint32 end_time; // timestamp of when it will be ready
|
||||||
|
uint32 start_time; // timestamp of when it started
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -478,10 +432,11 @@ struct DeleteSpell_Struct
|
|||||||
|
|
||||||
struct ManaChange_Struct
|
struct ManaChange_Struct
|
||||||
{
|
{
|
||||||
uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
uint32 spell_id;
|
/*08*/ uint32 spell_id;
|
||||||
uint32 unknown12;
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SwapSpell_Struct
|
struct SwapSpell_Struct
|
||||||
@@ -547,30 +502,28 @@ struct SpawnAppearance_Struct
|
|||||||
// this is used inside profile
|
// this is used inside profile
|
||||||
struct SpellBuff_Struct
|
struct SpellBuff_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
|
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
|
||||||
/*001*/ uint8 level;
|
/*001*/ uint8 level;
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 bard_modifier;
|
||||||
/*003*/ uint8 effect; //not real
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking? -- OSX client calls this "activated"
|
||||||
/*004*/ uint32 spellid;
|
/*004*/ uint32 spellid;
|
||||||
/*008*/ int32 duration;
|
/*008*/ int32 duration;
|
||||||
/*012*/ uint32 counters;
|
/*012*/ uint32 counters; // single book keeping value (counters, rune/vie)
|
||||||
/*016*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
|
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
/*020*/
|
// extra stuff for newer packets
|
||||||
|
/*020*/ uint32 num_hits;
|
||||||
|
/*024*/ float y; // referenced by SPA 441
|
||||||
|
/*028*/ float x; // unsure if all buffs get them
|
||||||
|
/*032*/ float z; // as valid data
|
||||||
|
/*036*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpellBuffFade_Struct {
|
struct SpellBuffPacket_Struct {
|
||||||
/*000*/ uint32 entityid;
|
/*000*/ uint32 entityid;
|
||||||
/*004*/ uint8 slot;
|
/*004*/ SpellBuff_Struct buff;
|
||||||
/*005*/ uint8 level;
|
/*040*/ uint32 slotid;
|
||||||
/*006*/ uint8 effect;
|
/*044*/ uint32 bufffade;
|
||||||
/*007*/ uint8 unknown7;
|
/*048*/
|
||||||
/*008*/ uint32 spellid;
|
|
||||||
/*012*/ int32 duration;
|
|
||||||
/*016*/ uint32 num_hits;
|
|
||||||
/*020*/ uint32 unknown020; //prolly global player ID
|
|
||||||
/*024*/ uint32 slotid;
|
|
||||||
/*028*/ uint32 bufffade;
|
|
||||||
/*032*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Underfoot & later struct.
|
// Underfoot & later struct.
|
||||||
@@ -583,8 +536,8 @@ struct BuffRemoveRequest_Struct
|
|||||||
|
|
||||||
struct PetBuff_Struct {
|
struct PetBuff_Struct {
|
||||||
/*000*/ uint32 petid;
|
/*000*/ uint32 petid;
|
||||||
/*004*/ uint32 spellid[BUFF_COUNT+5];
|
/*004*/ uint32 spellid[PET_BUFF_COUNT];
|
||||||
/*124*/ int32 ticsremaining[BUFF_COUNT+5];
|
/*124*/ int32 ticsremaining[PET_BUFF_COUNT];
|
||||||
/*244*/ uint32 buffcount;
|
/*244*/ uint32 buffcount;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -881,7 +834,7 @@ struct SuspendedMinion_Struct
|
|||||||
/*002*/ uint32 HP;
|
/*002*/ uint32 HP;
|
||||||
/*006*/ uint32 Mana;
|
/*006*/ uint32 Mana;
|
||||||
/*010*/ SpellBuff_Struct Buffs[BUFF_COUNT];
|
/*010*/ SpellBuff_Struct Buffs[BUFF_COUNT];
|
||||||
/*510*/ uint32 Items[EQEmu::legacy::MaterialCount];
|
/*510*/ EQEmu::TextureShortProfile Items;
|
||||||
/*546*/ char Name[64];
|
/*546*/ char Name[64];
|
||||||
/*610*/
|
/*610*/
|
||||||
};
|
};
|
||||||
@@ -895,7 +848,7 @@ struct SuspendedMinion_Struct
|
|||||||
*/
|
*/
|
||||||
static const uint32 MAX_PP_LANGUAGE = 28;
|
static const uint32 MAX_PP_LANGUAGE = 28;
|
||||||
static const uint32 MAX_PP_SPELLBOOK = 480; // Set for all functions
|
static const uint32 MAX_PP_SPELLBOOK = 480; // Set for all functions
|
||||||
static const uint32 MAX_PP_MEMSPELL = 9; // Set to latest client so functions can work right
|
static const uint32 MAX_PP_MEMSPELL = static_cast<uint32>(EQEmu::CastingSlot::MaxGems); // Set to latest client so functions can work right -- 12
|
||||||
static const uint32 MAX_PP_REF_SPELLBOOK = 480; // Set for Player Profile size retain
|
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_REF_MEMSPELL = 9; // Set for Player Profile size retain
|
||||||
|
|
||||||
@@ -976,7 +929,7 @@ struct PlayerProfile_Struct
|
|||||||
/*0245*/ uint8 guildbanker;
|
/*0245*/ uint8 guildbanker;
|
||||||
/*0246*/ uint8 unknown0246[6]; //
|
/*0246*/ uint8 unknown0246[6]; //
|
||||||
/*0252*/ uint32 intoxication;
|
/*0252*/ uint32 intoxication;
|
||||||
/*0256*/ uint32 spellSlotRefresh[MAX_PP_REF_MEMSPELL]; //in ms
|
/*0256*/ uint32 spellSlotRefresh[MAX_PP_MEMSPELL]; //in ms
|
||||||
/*0292*/ uint32 abilitySlotRefresh;
|
/*0292*/ uint32 abilitySlotRefresh;
|
||||||
/*0296*/ uint8 haircolor; // Player hair color
|
/*0296*/ uint8 haircolor; // Player hair color
|
||||||
/*0297*/ uint8 beardcolor; // Player beard color
|
/*0297*/ uint8 beardcolor; // Player beard color
|
||||||
@@ -989,9 +942,9 @@ struct PlayerProfile_Struct
|
|||||||
/*0304*/ uint8 ability_time_minutes;
|
/*0304*/ uint8 ability_time_minutes;
|
||||||
/*0305*/ uint8 ability_time_hours; //place holder
|
/*0305*/ uint8 ability_time_hours; //place holder
|
||||||
/*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag?
|
/*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag?
|
||||||
/*0312*/ uint32 item_material[EQEmu::legacy::MaterialCount]; // Item texture/material of worn/held items
|
/*0312*/ EQEmu::TextureShortProfile item_material; // Item texture/material of worn/held items
|
||||||
/*0348*/ uint8 unknown0348[44];
|
/*0348*/ uint8 unknown0348[44];
|
||||||
/*0392*/ Color_Struct item_tint[EQEmu::legacy::MaterialCount];
|
/*0392*/ EQEmu::TintProfile item_tint;
|
||||||
/*0428*/ AA_Array aa_array[MAX_PP_AA_ARRAY];
|
/*0428*/ AA_Array aa_array[MAX_PP_AA_ARRAY];
|
||||||
/*2348*/ float unknown2384; //seen ~128, ~47
|
/*2348*/ float unknown2384; //seen ~128, ~47
|
||||||
/*2352*/ char servername[32]; // length probably not right
|
/*2352*/ char servername[32]; // length probably not right
|
||||||
@@ -1017,7 +970,7 @@ struct PlayerProfile_Struct
|
|||||||
/*2580*/ uint8 unknown2616[4];
|
/*2580*/ uint8 unknown2616[4];
|
||||||
/*2584*/ uint32 spell_book[MAX_PP_REF_SPELLBOOK];
|
/*2584*/ uint32 spell_book[MAX_PP_REF_SPELLBOOK];
|
||||||
/*4504*/ uint8 unknown4540[128]; // Was [428] all 0xff
|
/*4504*/ uint8 unknown4540[128]; // Was [428] all 0xff
|
||||||
/*4632*/ uint32 mem_spells[MAX_PP_REF_MEMSPELL];
|
/*4632*/ uint32 mem_spells[MAX_PP_MEMSPELL];
|
||||||
/*4668*/ uint8 unknown4704[32]; //
|
/*4668*/ uint8 unknown4704[32]; //
|
||||||
/*4700*/ float y; // Player y position
|
/*4700*/ float y; // Player y position
|
||||||
/*4704*/ float x; // Player x position
|
/*4704*/ float x; // Player x position
|
||||||
@@ -1226,7 +1179,7 @@ struct WearChange_Struct{
|
|||||||
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
||||||
/*014*/ uint32 hero_forge_model; // New to VoA
|
/*014*/ uint32 hero_forge_model; // New to VoA
|
||||||
/*018*/ uint32 unknown18; // New to RoF
|
/*018*/ uint32 unknown18; // New to RoF
|
||||||
/*022*/ Color_Struct color;
|
/*022*/ EQEmu::Tint_Struct color;
|
||||||
/*026*/ uint8 wear_slot_id;
|
/*026*/ uint8 wear_slot_id;
|
||||||
/*027*/
|
/*027*/
|
||||||
};
|
};
|
||||||
@@ -1522,7 +1475,7 @@ enum ItemPacketType
|
|||||||
ItemPacketLoot = 0x66,
|
ItemPacketLoot = 0x66,
|
||||||
ItemPacketTrade = 0x67,
|
ItemPacketTrade = 0x67,
|
||||||
ItemPacketCharInventory = 0x69,
|
ItemPacketCharInventory = 0x69,
|
||||||
ItemPacketSummonItem = 0x6A,
|
ItemPacketLimbo = 0x6A,
|
||||||
ItemPacketWorldContainer = 0x6B,
|
ItemPacketWorldContainer = 0x6B,
|
||||||
ItemPacketTributeItem = 0x6C,
|
ItemPacketTributeItem = 0x6C,
|
||||||
ItemPacketGuildTribute = 0x6D,
|
ItemPacketGuildTribute = 0x6D,
|
||||||
@@ -1536,15 +1489,15 @@ enum ItemPacketType
|
|||||||
// ItemPacketTradeView = /*101*/ 0x65,
|
// ItemPacketTradeView = /*101*/ 0x65,
|
||||||
// ItemPacketLoot = /*102*/ 0x66,
|
// ItemPacketLoot = /*102*/ 0x66,
|
||||||
// ItemPacketTrade = /*103*/ 0x67,
|
// ItemPacketTrade = /*103*/ 0x67,
|
||||||
// ItemPacketCharInventory = /*105*/ 0x69,
|
// ItemPacketCharInventory = /*105*/ 0x69, // 105 looks like raw item packet (no appearance update) thru shared bank..110, possibly possessions with appearance update
|
||||||
// ItemPacketLimbo = /*106*/ 0x6A, // name change
|
// ItemPacketLimbo = /*106*/ 0x6A,
|
||||||
// ItemPacketWorldContainer = /*107*/ 0x6B,
|
// ItemPacketWorldContainer = /*107*/ 0x6B,
|
||||||
// ItemPacketTributeItem = /*108*/ 0x6C,
|
// ItemPacketTributeItem = /*108*/ 0x6C,
|
||||||
// ItemPacketGuildTribute = /*109*/ 0x6D, // missing from EQEmu
|
// ItemPacketGuildTribute = /*109*/ 0x6D, // missing from EQEmu
|
||||||
// ItemPacket10 = /*110*/ 0x6E,
|
// ItemPacket10 = /*110*/ 0x6E,
|
||||||
// ItemPacket11 = /*111*/ 0x6F, // UF+ (equipment slots only) (RoF+ checks '(WORD*)slot + 4 != -1' [(WORD*)]slot + 2 would be bag index - if used) (guess)
|
// ItemPacket11 = /*111*/ 0x6F, // UF+ (equipment slots only) (RoF+ checks '(WORD*)slot + 4 != -1' [(WORD*)]slot + 2 would be bag index - if used) (guess) (appearance (over-level) items?)
|
||||||
// ItemPacket12 = /*112*/ 0x70, // RoF+ (causes stat update) (could be TrophyTribute and GuildTrophyTribute together - two case methodology - is it checking for GuildID?)
|
// ItemPacket12 = /*112*/ 0x70, // RoF+ (causes stat update) (could be TrophyTribute and GuildTrophyTribute together - two case methodology - is it checking for GuildID?)
|
||||||
// ItemPacketRecovery = /*113*/ 0x71, (same handler as merchant..exception: parameter is '1' versus merchant '0' looks like tab id)
|
// ItemPacketMerchantRecovery = /*113*/ 0x71,
|
||||||
// ItemPacket14 = /*115*/ 0x73, (real estate/moving crate?)
|
// ItemPacket14 = /*115*/ 0x73, (real estate/moving crate?)
|
||||||
// ItemPacket__ = /*xxx*/ 0xXX // switch 'default' - all clients
|
// ItemPacket__ = /*xxx*/ 0xXX // switch 'default' - all clients
|
||||||
//};
|
//};
|
||||||
@@ -1981,8 +1934,7 @@ struct Merchant_Sell_Struct {
|
|||||||
/*004*/ uint32 playerid; // Player's entity id
|
/*004*/ uint32 playerid; // Player's entity id
|
||||||
/*008*/ uint32 itemslot;
|
/*008*/ uint32 itemslot;
|
||||||
uint32 unknown12;
|
uint32 unknown12;
|
||||||
/*016*/ uint8 quantity; // Already sold
|
/*016*/ uint32 quantity;
|
||||||
/*017*/ uint8 Unknown016[3];
|
|
||||||
/*020*/ uint32 price;
|
/*020*/ uint32 price;
|
||||||
};
|
};
|
||||||
struct Merchant_Purchase_Struct {
|
struct Merchant_Purchase_Struct {
|
||||||
@@ -2119,7 +2071,7 @@ struct AdventureLeaderboard_Struct
|
|||||||
/*struct Item_Shop_Struct {
|
/*struct Item_Shop_Struct {
|
||||||
uint16 merchantid;
|
uint16 merchantid;
|
||||||
uint8 itemtype;
|
uint8 itemtype;
|
||||||
EQEmu::Item_Struct item;
|
EQEmu::ItemBase item;
|
||||||
uint8 iss_unknown001[6];
|
uint8 iss_unknown001[6];
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
@@ -2145,7 +2097,7 @@ struct Illusion_Struct { //size: 256 - SoF
|
|||||||
/*092*/ uint32 drakkin_heritage; //
|
/*092*/ uint32 drakkin_heritage; //
|
||||||
/*096*/ uint32 drakkin_tattoo; //
|
/*096*/ uint32 drakkin_tattoo; //
|
||||||
/*100*/ uint32 drakkin_details; //
|
/*100*/ uint32 drakkin_details; //
|
||||||
/*104*/ uint32 armor_tint[EQEmu::legacy::MaterialCount]; //
|
/*104*/ EQEmu::TintProfile armor_tint; //
|
||||||
/*140*/ uint8 eyecolor1; // Field Not Identified in any Illusion Struct
|
/*140*/ uint8 eyecolor1; // Field Not Identified in any Illusion Struct
|
||||||
/*141*/ uint8 eyecolor2; // Field Not Identified in any Illusion Struct
|
/*141*/ uint8 eyecolor2; // Field Not Identified in any Illusion Struct
|
||||||
/*142*/ uint8 unknown138[114]; //
|
/*142*/ uint8 unknown138[114]; //
|
||||||
@@ -2556,23 +2508,25 @@ struct BookRequest_Struct {
|
|||||||
*/
|
*/
|
||||||
struct Object_Struct {
|
struct Object_Struct {
|
||||||
/*00*/ uint32 linked_list_addr[2];// They are, get this, prev and next, ala linked list
|
/*00*/ uint32 linked_list_addr[2];// They are, get this, prev and next, ala linked list
|
||||||
/*08*/ uint16 size; //
|
/*08*/ float size; //
|
||||||
/*10*/ uint16 solidtype; //
|
/*10*/ uint16 solidtype; //
|
||||||
/*12*/ uint32 drop_id; // Unique object id for zone
|
/*12*/ uint32 drop_id; // Unique object id for zone
|
||||||
/*16*/ uint16 zone_id; // Redudant, but: Zone the object appears in
|
/*16*/ uint16 zone_id; // Redudant, but: Zone the object appears in
|
||||||
/*18*/ uint16 zone_instance; //
|
/*18*/ uint16 zone_instance; //
|
||||||
/*20*/ uint32 unknown020; //
|
/*20*/ uint32 unknown020; //
|
||||||
/*24*/ uint32 unknown024; //
|
/*24*/ uint32 unknown024; //
|
||||||
/*28*/ float heading; // heading
|
/*28*/ float tilt_x;
|
||||||
/*32*/ float z; // z coord
|
/*32*/ float tilt_y;
|
||||||
/*36*/ float x; // x coord
|
/*36*/ float heading; // heading
|
||||||
/*40*/ float y; // y coord
|
/*40*/ float z; // z coord
|
||||||
/*44*/ char object_name[32]; // Name of object, usually something like IT63_ACTORDEF
|
/*44*/ float x; // x coord
|
||||||
/*76*/ uint32 unknown076; //
|
/*76*/ float y; // y coord
|
||||||
/*80*/ uint32 object_type; // Type of object, not directly translated to OP_OpenObject
|
/*80*/ char object_name[32]; // Name of object, usually something like IT63_ACTORDEF
|
||||||
/*84*/ uint32 unknown084; //set to 0xFF
|
/*84*/ uint32 unknown076; //
|
||||||
/*88*/ uint32 spawn_id; // Spawn Id of client interacting with object
|
/*88*/ uint32 object_type; // Type of object, not directly translated to OP_OpenObject
|
||||||
/*92*/
|
/*92*/ uint32 unknown084; //set to 0xFF
|
||||||
|
uint32 spawn_id; // Spawn Id of client interacting with object
|
||||||
|
|
||||||
};
|
};
|
||||||
// 01 = generic drop, 02 = armor, 19 = weapon
|
// 01 = generic drop, 02 = armor, 19 = weapon
|
||||||
//[13:40] and 0xff seems to be indicative of the tradeskill/openable items that end up returning the old style item type in the OP_OpenObject
|
//[13:40] and 0xff seems to be indicative of the tradeskill/openable items that end up returning the old style item type in the OP_OpenObject
|
||||||
@@ -3415,27 +3369,6 @@ struct PetitionBug_Struct{
|
|||||||
char text[1028];
|
char text[1028];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DyeStruct
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct Color_Struct head;
|
|
||||||
struct Color_Struct chest;
|
|
||||||
struct Color_Struct arms;
|
|
||||||
struct Color_Struct wrists;
|
|
||||||
struct Color_Struct hands;
|
|
||||||
struct Color_Struct legs;
|
|
||||||
struct Color_Struct feet;
|
|
||||||
struct Color_Struct primary; // you can't actually dye this
|
|
||||||
struct Color_Struct secondary; // or this
|
|
||||||
}
|
|
||||||
dyes;
|
|
||||||
struct Color_Struct dye[EQEmu::legacy::MaterialCount];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
uint32 zoneid;
|
uint32 zoneid;
|
||||||
|
|||||||
+4
-16
@@ -241,7 +241,7 @@ class EQStream : public EQStreamInterface {
|
|||||||
virtual bool CheckState(EQStreamState state) { return GetState() == state; }
|
virtual bool CheckState(EQStreamState state) { return GetState() == state; }
|
||||||
virtual std::string Describe() const { return("Direct EQStream"); }
|
virtual std::string Describe() const { return("Direct EQStream"); }
|
||||||
|
|
||||||
void SetOpcodeManager(OpcodeManager **opm) { OpMgr = opm; }
|
virtual void SetOpcodeManager(OpcodeManager **opm) { OpMgr = opm; }
|
||||||
|
|
||||||
void CheckTimeout(uint32 now, uint32 timeout=30);
|
void CheckTimeout(uint32 now, uint32 timeout=30);
|
||||||
bool HasOutgoingData();
|
bool HasOutgoingData();
|
||||||
@@ -250,13 +250,13 @@ class EQStream : public EQStreamInterface {
|
|||||||
void Write(int eq_fd);
|
void Write(int eq_fd);
|
||||||
|
|
||||||
// whether or not the stream has been assigned (we passed our stream match)
|
// whether or not the stream has been assigned (we passed our stream match)
|
||||||
void SetActive(bool val) { streamactive = val; }
|
virtual void SetActive(bool val) { streamactive = val; }
|
||||||
|
|
||||||
//
|
//
|
||||||
inline bool IsInUse() { bool flag; MInUse.lock(); flag=(active_users>0); MInUse.unlock(); return flag; }
|
inline bool IsInUse() { bool flag; MInUse.lock(); flag=(active_users>0); MInUse.unlock(); return flag; }
|
||||||
inline void PutInUse() { MInUse.lock(); active_users++; MInUse.unlock(); }
|
inline void PutInUse() { MInUse.lock(); active_users++; MInUse.unlock(); }
|
||||||
|
|
||||||
inline EQStreamState GetState() { EQStreamState s; MState.lock(); s=State; MState.unlock(); return s; }
|
virtual EQStreamState GetState() { EQStreamState s; MState.lock(); s=State; MState.unlock(); return s; }
|
||||||
|
|
||||||
static SeqOrder CompareSequence(uint16 expected_seq , uint16 seq);
|
static SeqOrder CompareSequence(uint16 expected_seq , uint16 seq);
|
||||||
|
|
||||||
@@ -306,19 +306,7 @@ class EQStream : public EQStreamInterface {
|
|||||||
const uint64 GetPacketsReceived() { return received_packet_count; }
|
const uint64 GetPacketsReceived() { return received_packet_count; }
|
||||||
|
|
||||||
//used for dynamic stream identification
|
//used for dynamic stream identification
|
||||||
class Signature {
|
virtual MatchState CheckSignature(const Signature *sig);
|
||||||
public:
|
|
||||||
//this object could get more complicated if needed...
|
|
||||||
uint16 ignore_eq_opcode; //0=dont ignore
|
|
||||||
uint16 first_eq_opcode;
|
|
||||||
uint32 first_length; //0=dont check length
|
|
||||||
};
|
|
||||||
typedef enum {
|
|
||||||
MatchNotReady,
|
|
||||||
MatchSuccessful,
|
|
||||||
MatchFailed
|
|
||||||
} MatchState;
|
|
||||||
MatchState CheckSignature(const Signature *sig);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ EQStreamIdentifier::~EQStreamIdentifier() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQStreamIdentifier::RegisterPatch(const EQStream::Signature &sig, const char *name, OpcodeManager ** opcodes, const StructStrategy *structs) {
|
void EQStreamIdentifier::RegisterPatch(const EQStreamInterface::Signature &sig, const char *name, OpcodeManager ** opcodes, const StructStrategy *structs) {
|
||||||
auto p = new Patch;
|
auto p = new Patch;
|
||||||
p->signature = sig;
|
p->signature = sig;
|
||||||
p->name = name;
|
p->name = name;
|
||||||
@@ -144,7 +144,7 @@ void EQStreamIdentifier::Process() {
|
|||||||
} //end foreach stream
|
} //end foreach stream
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQStreamIdentifier::AddStream(std::shared_ptr<EQStream> &eqs) {
|
void EQStreamIdentifier::AddStream(std::shared_ptr<EQStreamInterface> &eqs) {
|
||||||
m_streams.push_back(Record(eqs));
|
m_streams.push_back(Record(eqs));
|
||||||
eqs = nullptr;
|
eqs = nullptr;
|
||||||
}
|
}
|
||||||
@@ -157,7 +157,7 @@ EQStreamInterface *EQStreamIdentifier::PopIdentified() {
|
|||||||
return(res);
|
return(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
EQStreamIdentifier::Record::Record(std::shared_ptr<EQStream> s)
|
EQStreamIdentifier::Record::Record(std::shared_ptr<EQStreamInterface> s)
|
||||||
: stream(std::move(s)),
|
: stream(std::move(s)),
|
||||||
expire(STREAM_IDENT_WAIT_MS)
|
expire(STREAM_IDENT_WAIT_MS)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ public:
|
|||||||
~EQStreamIdentifier();
|
~EQStreamIdentifier();
|
||||||
|
|
||||||
//registration interface.
|
//registration interface.
|
||||||
void RegisterPatch(const EQStream::Signature &sig, const char *name, OpcodeManager ** opcodes, const StructStrategy *structs);
|
void RegisterPatch(const EQStreamInterface::Signature &sig, const char *name, OpcodeManager ** opcodes, const StructStrategy *structs);
|
||||||
|
|
||||||
//main processing interface
|
//main processing interface
|
||||||
void Process();
|
void Process();
|
||||||
void AddStream(std::shared_ptr<EQStream> &eqs);
|
void AddStream(std::shared_ptr<EQStreamInterface> &eqs);
|
||||||
EQStreamInterface *PopIdentified();
|
EQStreamInterface *PopIdentified();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -31,7 +31,7 @@ protected:
|
|||||||
class Patch {
|
class Patch {
|
||||||
public:
|
public:
|
||||||
std::string name;
|
std::string name;
|
||||||
EQStream::Signature signature;
|
EQStreamInterface::Signature signature;
|
||||||
OpcodeManager ** opcodes;
|
OpcodeManager ** opcodes;
|
||||||
const StructStrategy *structs;
|
const StructStrategy *structs;
|
||||||
};
|
};
|
||||||
@@ -40,8 +40,8 @@ protected:
|
|||||||
//pending streams..
|
//pending streams..
|
||||||
class Record {
|
class Record {
|
||||||
public:
|
public:
|
||||||
Record(std::shared_ptr<EQStream> s);
|
Record(std::shared_ptr<EQStreamInterface> s);
|
||||||
std::shared_ptr<EQStream> stream; //we own this
|
std::shared_ptr<EQStreamInterface> stream; //we own this
|
||||||
Timer expire;
|
Timer expire;
|
||||||
};
|
};
|
||||||
std::vector<Record> m_streams; //we own these objects, and the streams contained in them.
|
std::vector<Record> m_streams; //we own these objects, and the streams contained in them.
|
||||||
|
|||||||
+19
-1
@@ -4,7 +4,7 @@
|
|||||||
//this is the only part of an EQStream that is seen by the application.
|
//this is the only part of an EQStream that is seen by the application.
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "client_version.h" // inv2 watch
|
#include "emu_versions.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ESTABLISHED,
|
ESTABLISHED,
|
||||||
@@ -15,11 +15,25 @@ typedef enum {
|
|||||||
} EQStreamState;
|
} EQStreamState;
|
||||||
|
|
||||||
class EQApplicationPacket;
|
class EQApplicationPacket;
|
||||||
|
class OpcodeManager;
|
||||||
|
|
||||||
class EQStreamInterface {
|
class EQStreamInterface {
|
||||||
public:
|
public:
|
||||||
virtual ~EQStreamInterface() {}
|
virtual ~EQStreamInterface() {}
|
||||||
|
|
||||||
|
class Signature {
|
||||||
|
public:
|
||||||
|
//this object could get more complicated if needed...
|
||||||
|
uint16 ignore_eq_opcode; //0=dont ignore
|
||||||
|
uint16 first_eq_opcode;
|
||||||
|
uint32 first_length; //0=dont check length
|
||||||
|
};
|
||||||
|
typedef enum {
|
||||||
|
MatchNotReady,
|
||||||
|
MatchSuccessful,
|
||||||
|
MatchFailed
|
||||||
|
} MatchState;
|
||||||
|
|
||||||
virtual void QueuePacket(const EQApplicationPacket *p, bool ack_req=true) = 0;
|
virtual void QueuePacket(const EQApplicationPacket *p, bool ack_req=true) = 0;
|
||||||
virtual void FastQueuePacket(EQApplicationPacket **p, bool ack_req=true) = 0;
|
virtual void FastQueuePacket(EQApplicationPacket **p, bool ack_req=true) = 0;
|
||||||
virtual EQApplicationPacket *PopPacket() = 0;
|
virtual EQApplicationPacket *PopPacket() = 0;
|
||||||
@@ -30,6 +44,10 @@ public:
|
|||||||
virtual uint16 GetRemotePort() const = 0;
|
virtual uint16 GetRemotePort() const = 0;
|
||||||
virtual bool CheckState(EQStreamState state) = 0;
|
virtual bool CheckState(EQStreamState state) = 0;
|
||||||
virtual std::string Describe() const = 0;
|
virtual std::string Describe() const = 0;
|
||||||
|
virtual void SetActive(bool val) { }
|
||||||
|
virtual MatchState CheckSignature(const Signature *sig) { return MatchFailed; }
|
||||||
|
virtual EQStreamState GetState() = 0;
|
||||||
|
virtual void SetOpcodeManager(OpcodeManager **opm) = 0;
|
||||||
|
|
||||||
virtual const uint32 GetBytesSent() const { return 0; }
|
virtual const uint32 GetBytesSent() const { return 0; }
|
||||||
virtual const uint32 GetBytesRecieved() const { return 0; }
|
virtual const uint32 GetBytesRecieved() const { return 0; }
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "struct_strategy.h"
|
#include "struct_strategy.h"
|
||||||
|
|
||||||
|
|
||||||
EQStreamProxy::EQStreamProxy(std::shared_ptr<EQStream> &stream, const StructStrategy *structs, OpcodeManager **opcodes)
|
EQStreamProxy::EQStreamProxy(std::shared_ptr<EQStreamInterface> &stream, const StructStrategy *structs, OpcodeManager **opcodes)
|
||||||
: m_stream(stream),
|
: m_stream(stream),
|
||||||
m_structs(structs),
|
m_structs(structs),
|
||||||
m_opcodes(opcodes)
|
m_opcodes(opcodes)
|
||||||
@@ -26,6 +26,16 @@ const EQEmu::versions::ClientVersion EQStreamProxy::ClientVersion() const
|
|||||||
return m_structs->ClientVersion();
|
return m_structs->ClientVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EQStreamState EQStreamProxy::GetState()
|
||||||
|
{
|
||||||
|
return m_stream->GetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQStreamProxy::SetOpcodeManager(OpcodeManager **opm)
|
||||||
|
{
|
||||||
|
return m_stream->SetOpcodeManager(opm);
|
||||||
|
}
|
||||||
|
|
||||||
void EQStreamProxy::QueuePacket(const EQApplicationPacket *p, bool ack_req) {
|
void EQStreamProxy::QueuePacket(const EQApplicationPacket *p, bool ack_req) {
|
||||||
if(p == nullptr)
|
if(p == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class EQApplicationPacket;
|
|||||||
class EQStreamProxy : public EQStreamInterface {
|
class EQStreamProxy : public EQStreamInterface {
|
||||||
public:
|
public:
|
||||||
//takes ownership of the stream.
|
//takes ownership of the stream.
|
||||||
EQStreamProxy(std::shared_ptr<EQStream> &stream, const StructStrategy *structs, OpcodeManager **opcodes);
|
EQStreamProxy(std::shared_ptr<EQStreamInterface> &stream, const StructStrategy *structs, OpcodeManager **opcodes);
|
||||||
virtual ~EQStreamProxy();
|
virtual ~EQStreamProxy();
|
||||||
|
|
||||||
//EQStreamInterface:
|
//EQStreamInterface:
|
||||||
@@ -29,6 +29,8 @@ public:
|
|||||||
virtual bool CheckState(EQStreamState state);
|
virtual bool CheckState(EQStreamState state);
|
||||||
virtual std::string Describe() const;
|
virtual std::string Describe() const;
|
||||||
virtual const EQEmu::versions::ClientVersion ClientVersion() const;
|
virtual const EQEmu::versions::ClientVersion ClientVersion() const;
|
||||||
|
virtual EQStreamState GetState();
|
||||||
|
virtual void SetOpcodeManager(OpcodeManager **opm);
|
||||||
|
|
||||||
virtual const uint32 GetBytesSent() const;
|
virtual const uint32 GetBytesSent() const;
|
||||||
virtual const uint32 GetBytesRecieved() const;
|
virtual const uint32 GetBytesRecieved() const;
|
||||||
@@ -36,7 +38,7 @@ public:
|
|||||||
virtual const uint32 GetBytesRecvPerSecond() const;
|
virtual const uint32 GetBytesRecvPerSecond() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::shared_ptr<EQStream> const m_stream; //we own this stream object.
|
std::shared_ptr<EQStreamInterface> const m_stream; //we own this stream object.
|
||||||
const StructStrategy *const m_structs; //we do not own this object.
|
const StructStrategy *const m_structs; //we do not own this object.
|
||||||
//this is a pointer to a pointer to make it less likely that a packet will
|
//this is a pointer to a pointer to make it less likely that a packet will
|
||||||
//reference an invalid opcode manager when they are being reloaded.
|
//reference an invalid opcode manager when they are being reloaded.
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ namespace Logs {
|
|||||||
Server_Client_Packet_With_Dump,
|
Server_Client_Packet_With_Dump,
|
||||||
Client_Server_Packet_With_Dump,
|
Client_Server_Packet_With_Dump,
|
||||||
Login_Server,
|
Login_Server,
|
||||||
|
Client_Login,
|
||||||
MaxCategoryID /* Don't Remove this*/
|
MaxCategoryID /* Don't Remove this*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -131,7 +132,8 @@ namespace Logs {
|
|||||||
"Packet :: Client -> Server Unhandled",
|
"Packet :: Client -> Server Unhandled",
|
||||||
"Packet :: Server -> Client (Dump)",
|
"Packet :: Server -> Client (Dump)",
|
||||||
"Packet :: Client -> Server (Dump)",
|
"Packet :: Client -> Server (Dump)",
|
||||||
"Login Server"
|
"Login Server",
|
||||||
|
"Client Login"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -40,7 +40,7 @@ struct ExtendedProfile_Struct {
|
|||||||
uint16 old_pet_hp; /* Not Used */
|
uint16 old_pet_hp; /* Not Used */
|
||||||
uint16 old_pet_mana; /* Not Used */
|
uint16 old_pet_mana; /* Not Used */
|
||||||
SpellBuff_Struct pet_buffs[BUFF_COUNT]; /* Not Used */
|
SpellBuff_Struct pet_buffs[BUFF_COUNT]; /* Not Used */
|
||||||
uint32 pet_items[EQEmu::legacy::MaterialCount]; /* Not Used */
|
EQEmu::TextureShortProfile pet_items; /* Not Used */
|
||||||
char merc_name[64]; /* Used */
|
char merc_name[64]; /* Used */
|
||||||
|
|
||||||
uint32 aa_effects; /* Used */
|
uint32 aa_effects; /* Used */
|
||||||
|
|||||||
+2
-2
@@ -213,8 +213,8 @@ enum { //some random constants
|
|||||||
#define MAX_NPC_FACTIONS 20
|
#define MAX_NPC_FACTIONS 20
|
||||||
|
|
||||||
//individual faction pool
|
//individual faction pool
|
||||||
#define MAX_PERSONAL_FACTION 1200
|
#define MAX_PERSONAL_FACTION 2000
|
||||||
#define MIN_PERSONAL_FACTION -3000
|
#define MIN_PERSONAL_FACTION -2000
|
||||||
|
|
||||||
//The Level Cap:
|
//The Level Cap:
|
||||||
//#define LEVEL_CAP RuleI(Character, MaxLevel) //hard cap is 127
|
//#define LEVEL_CAP RuleI(Character, MaxLevel) //hard cap is 127
|
||||||
|
|||||||
@@ -1,147 +0,0 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
|
||||||
|
|
||||||
Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net)
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; version 2 of the License.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
|
||||||
are required to give you total support for your newly bought product;
|
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "inventory_version.h"
|
|
||||||
|
|
||||||
|
|
||||||
bool EQEmu::versions::IsValidInventoryVersion(InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
if (inventory_version <= InventoryVersion::Unknown || inventory_version > LastInventoryVersion)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EQEmu::versions::IsValidPCInventoryVersion(InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
if (inventory_version <= InventoryVersion::Unknown || inventory_version > LastPCInventoryVersion)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EQEmu::versions::IsValidNonPCInventoryVersion(InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
if (inventory_version <= LastPCInventoryVersion || inventory_version > LastNonPCInventoryVersion)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
EQEmu::versions::InventoryVersion EQEmu::versions::ValidateInventoryVersion(InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
if (inventory_version <= InventoryVersion::Unknown || inventory_version > LastInventoryVersion)
|
|
||||||
return InventoryVersion::Unknown;
|
|
||||||
|
|
||||||
return inventory_version;
|
|
||||||
}
|
|
||||||
|
|
||||||
EQEmu::versions::InventoryVersion EQEmu::versions::ValidatePCInventoryVersion(InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
if (inventory_version <= InventoryVersion::Unknown || inventory_version > LastPCInventoryVersion)
|
|
||||||
return InventoryVersion::Unknown;
|
|
||||||
|
|
||||||
return inventory_version;
|
|
||||||
}
|
|
||||||
|
|
||||||
EQEmu::versions::InventoryVersion EQEmu::versions::ValidateNonPCInventoryVersion(InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
if (inventory_version <= LastPCInventoryVersion || inventory_version > LastNonPCInventoryVersion)
|
|
||||||
return InventoryVersion::Unknown;
|
|
||||||
|
|
||||||
return inventory_version;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* EQEmu::versions::InventoryVersionName(InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
switch (inventory_version) {
|
|
||||||
case InventoryVersion::Unknown:
|
|
||||||
return "Unknown Version";
|
|
||||||
case InventoryVersion::Client62:
|
|
||||||
return "Client 6.2";
|
|
||||||
case InventoryVersion::Titanium:
|
|
||||||
return "Titanium";
|
|
||||||
case InventoryVersion::SoF:
|
|
||||||
return "SoF";
|
|
||||||
case InventoryVersion::SoD:
|
|
||||||
return "SoD";
|
|
||||||
case InventoryVersion::UF:
|
|
||||||
return "UF";
|
|
||||||
case InventoryVersion::RoF:
|
|
||||||
return "RoF";
|
|
||||||
case InventoryVersion::RoF2:
|
|
||||||
return "RoF2";
|
|
||||||
case InventoryVersion::NPC:
|
|
||||||
return "NPC";
|
|
||||||
case InventoryVersion::Merc:
|
|
||||||
return "Merc";
|
|
||||||
case InventoryVersion::Bot:
|
|
||||||
return "Bot";
|
|
||||||
case InventoryVersion::Pet:
|
|
||||||
return "Pet";
|
|
||||||
default:
|
|
||||||
return "Invalid Version";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
EQEmu::versions::ClientVersion EQEmu::versions::ConvertInventoryVersionToClientVersion(InventoryVersion inventory_version)
|
|
||||||
{
|
|
||||||
switch (inventory_version) {
|
|
||||||
case InventoryVersion::Unknown:
|
|
||||||
case InventoryVersion::Client62:
|
|
||||||
return ClientVersion::Unknown;
|
|
||||||
case InventoryVersion::Titanium:
|
|
||||||
return ClientVersion::Titanium;
|
|
||||||
case InventoryVersion::SoF:
|
|
||||||
return ClientVersion::SoF;
|
|
||||||
case InventoryVersion::SoD:
|
|
||||||
return ClientVersion::SoD;
|
|
||||||
case InventoryVersion::UF:
|
|
||||||
return ClientVersion::UF;
|
|
||||||
case InventoryVersion::RoF:
|
|
||||||
return ClientVersion::RoF;
|
|
||||||
case InventoryVersion::RoF2:
|
|
||||||
return ClientVersion::RoF2;
|
|
||||||
default:
|
|
||||||
return ClientVersion::Unknown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EQEmu::versions::InventoryVersion EQEmu::versions::ConvertClientVersionToInventoryVersion(ClientVersion client_version)
|
|
||||||
{
|
|
||||||
switch (client_version) {
|
|
||||||
case ClientVersion::Unknown:
|
|
||||||
case ClientVersion::Client62:
|
|
||||||
return InventoryVersion::Unknown;
|
|
||||||
case ClientVersion::Titanium:
|
|
||||||
return InventoryVersion::Titanium;
|
|
||||||
case ClientVersion::SoF:
|
|
||||||
return InventoryVersion::SoF;
|
|
||||||
case ClientVersion::SoD:
|
|
||||||
return InventoryVersion::SoD;
|
|
||||||
case ClientVersion::UF:
|
|
||||||
return InventoryVersion::UF;
|
|
||||||
case ClientVersion::RoF:
|
|
||||||
return InventoryVersion::RoF;
|
|
||||||
case ClientVersion::RoF2:
|
|
||||||
return InventoryVersion::RoF2;
|
|
||||||
default:
|
|
||||||
return InventoryVersion::Unknown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
|
||||||
|
|
||||||
Copyright (C) 2001-2016 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 COMMON_INVENTORY_VERSION_H
|
|
||||||
#define COMMON_INVENTORY_VERSION_H
|
|
||||||
|
|
||||||
#include "client_version.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace EQEmu
|
|
||||||
{
|
|
||||||
namespace versions {
|
|
||||||
enum class InventoryVersion {
|
|
||||||
Unknown = 0,
|
|
||||||
Client62,
|
|
||||||
Titanium,
|
|
||||||
SoF,
|
|
||||||
SoD,
|
|
||||||
UF,
|
|
||||||
RoF,
|
|
||||||
RoF2,
|
|
||||||
NPC,
|
|
||||||
Merc,
|
|
||||||
Bot,
|
|
||||||
Pet
|
|
||||||
};
|
|
||||||
|
|
||||||
static const InventoryVersion LastInventoryVersion = InventoryVersion::Pet;
|
|
||||||
static const InventoryVersion LastPCInventoryVersion = InventoryVersion::RoF2;
|
|
||||||
static const InventoryVersion LastNonPCInventoryVersion = InventoryVersion::Pet;
|
|
||||||
static const size_t InventoryVersionCount = (static_cast<size_t>(LastInventoryVersion) + 1);
|
|
||||||
|
|
||||||
extern bool IsValidInventoryVersion(InventoryVersion inventory_version);
|
|
||||||
extern bool IsValidPCInventoryVersion(InventoryVersion inventory_version);
|
|
||||||
extern bool IsValidNonPCInventoryVersion(InventoryVersion inventory_version);
|
|
||||||
extern InventoryVersion ValidateInventoryVersion(InventoryVersion inventory_version);
|
|
||||||
extern InventoryVersion ValidatePCInventoryVersion(InventoryVersion inventory_version);
|
|
||||||
extern InventoryVersion ValidateNonPCInventoryVersion(InventoryVersion inventory_version);
|
|
||||||
extern const char* InventoryVersionName(InventoryVersion inventory_version);
|
|
||||||
extern ClientVersion ConvertInventoryVersionToClientVersion(InventoryVersion inventory_version);
|
|
||||||
extern InventoryVersion ConvertClientVersionToInventoryVersion(ClientVersion client_version);
|
|
||||||
|
|
||||||
} /*versions*/
|
|
||||||
|
|
||||||
} /*EQEmu*/
|
|
||||||
|
|
||||||
#endif /*COMMON_INVENTORY_VERSION_H*/
|
|
||||||
+37
-34
@@ -370,7 +370,7 @@ ItemInst* Inventory::PopItem(int16 slot_id)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Inventory::HasSpaceForItem(const EQEmu::Item_Struct *ItemToTry, int16 Quantity) {
|
bool Inventory::HasSpaceForItem(const EQEmu::ItemBase *ItemToTry, int16 Quantity) {
|
||||||
|
|
||||||
if (ItemToTry->Stackable) {
|
if (ItemToTry->Stackable) {
|
||||||
|
|
||||||
@@ -852,23 +852,23 @@ int16 Inventory::CalcSlotFromMaterial(uint8 material)
|
|||||||
{
|
{
|
||||||
switch (material)
|
switch (material)
|
||||||
{
|
{
|
||||||
case EQEmu::legacy::MaterialHead:
|
case EQEmu::textures::TextureHead:
|
||||||
return EQEmu::legacy::SlotHead;
|
return EQEmu::legacy::SlotHead;
|
||||||
case EQEmu::legacy::MaterialChest:
|
case EQEmu::textures::TextureChest:
|
||||||
return EQEmu::legacy::SlotChest;
|
return EQEmu::legacy::SlotChest;
|
||||||
case EQEmu::legacy::MaterialArms:
|
case EQEmu::textures::TextureArms:
|
||||||
return EQEmu::legacy::SlotArms;
|
return EQEmu::legacy::SlotArms;
|
||||||
case EQEmu::legacy::MaterialWrist:
|
case EQEmu::textures::TextureWrist:
|
||||||
return EQEmu::legacy::SlotWrist1; // there's 2 bracers, only one bracer material
|
return EQEmu::legacy::SlotWrist1; // there's 2 bracers, only one bracer material
|
||||||
case EQEmu::legacy::MaterialHands:
|
case EQEmu::textures::TextureHands:
|
||||||
return EQEmu::legacy::SlotHands;
|
return EQEmu::legacy::SlotHands;
|
||||||
case EQEmu::legacy::MaterialLegs:
|
case EQEmu::textures::TextureLegs:
|
||||||
return EQEmu::legacy::SlotLegs;
|
return EQEmu::legacy::SlotLegs;
|
||||||
case EQEmu::legacy::MaterialFeet:
|
case EQEmu::textures::TextureFeet:
|
||||||
return EQEmu::legacy::SlotFeet;
|
return EQEmu::legacy::SlotFeet;
|
||||||
case EQEmu::legacy::MaterialPrimary:
|
case EQEmu::textures::TexturePrimary:
|
||||||
return EQEmu::legacy::SlotPrimary;
|
return EQEmu::legacy::SlotPrimary;
|
||||||
case EQEmu::legacy::MaterialSecondary:
|
case EQEmu::textures::TextureSecondary:
|
||||||
return EQEmu::legacy::SlotSecondary;
|
return EQEmu::legacy::SlotSecondary;
|
||||||
default:
|
default:
|
||||||
return INVALID_INDEX;
|
return INVALID_INDEX;
|
||||||
@@ -880,30 +880,30 @@ uint8 Inventory::CalcMaterialFromSlot(int16 equipslot)
|
|||||||
switch (equipslot)
|
switch (equipslot)
|
||||||
{
|
{
|
||||||
case EQEmu::legacy::SlotHead:
|
case EQEmu::legacy::SlotHead:
|
||||||
return EQEmu::legacy::MaterialHead;
|
return EQEmu::textures::TextureHead;
|
||||||
case EQEmu::legacy::SlotChest:
|
case EQEmu::legacy::SlotChest:
|
||||||
return EQEmu::legacy::MaterialChest;
|
return EQEmu::textures::TextureChest;
|
||||||
case EQEmu::legacy::SlotArms:
|
case EQEmu::legacy::SlotArms:
|
||||||
return EQEmu::legacy::MaterialArms;
|
return EQEmu::textures::TextureArms;
|
||||||
case EQEmu::legacy::SlotWrist1:
|
case EQEmu::legacy::SlotWrist1:
|
||||||
//case SLOT_BRACER02: // non-live behavior
|
//case SLOT_BRACER02: // non-live behavior
|
||||||
return EQEmu::legacy::MaterialWrist;
|
return EQEmu::textures::TextureWrist;
|
||||||
case EQEmu::legacy::SlotHands:
|
case EQEmu::legacy::SlotHands:
|
||||||
return EQEmu::legacy::MaterialHands;
|
return EQEmu::textures::TextureHands;
|
||||||
case EQEmu::legacy::SlotLegs:
|
case EQEmu::legacy::SlotLegs:
|
||||||
return EQEmu::legacy::MaterialLegs;
|
return EQEmu::textures::TextureLegs;
|
||||||
case EQEmu::legacy::SlotFeet:
|
case EQEmu::legacy::SlotFeet:
|
||||||
return EQEmu::legacy::MaterialFeet;
|
return EQEmu::textures::TextureFeet;
|
||||||
case EQEmu::legacy::SlotPrimary:
|
case EQEmu::legacy::SlotPrimary:
|
||||||
return EQEmu::legacy::MaterialPrimary;
|
return EQEmu::textures::TexturePrimary;
|
||||||
case EQEmu::legacy::SlotSecondary:
|
case EQEmu::legacy::SlotSecondary:
|
||||||
return EQEmu::legacy::MaterialSecondary;
|
return EQEmu::textures::TextureSecondary;
|
||||||
default:
|
default:
|
||||||
return EQEmu::legacy::MaterialInvalid;
|
return EQEmu::textures::TextureInvalid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Inventory::CanItemFitInContainer(const EQEmu::Item_Struct *ItemToTry, const EQEmu::Item_Struct *Container) {
|
bool Inventory::CanItemFitInContainer(const EQEmu::ItemBase *ItemToTry, const EQEmu::ItemBase *Container) {
|
||||||
|
|
||||||
if (!ItemToTry || !Container)
|
if (!ItemToTry || !Container)
|
||||||
return false;
|
return false;
|
||||||
@@ -929,7 +929,7 @@ bool Inventory::SupportsClickCasting(int16 slot_id)
|
|||||||
}
|
}
|
||||||
else if (slot_id >= EQEmu::legacy::GENERAL_BAGS_BEGIN && slot_id <= EQEmu::legacy::GENERAL_BAGS_END)
|
else if (slot_id >= EQEmu::legacy::GENERAL_BAGS_BEGIN && slot_id <= EQEmu::legacy::GENERAL_BAGS_END)
|
||||||
{
|
{
|
||||||
if (EQEmu::inventory::AllowClickCastFromBag(m_inventory_version))
|
if (EQEmu::inventory::Lookup(m_inventory_version)->AllowClickCastFromBag)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1440,10 +1440,10 @@ int16 Inventory::_HasItemByLoreGroup(ItemInstQueue& iqueue, uint32 loregroup)
|
|||||||
//
|
//
|
||||||
// class ItemInst
|
// class ItemInst
|
||||||
//
|
//
|
||||||
ItemInst::ItemInst(const EQEmu::Item_Struct* item, int16 charges) {
|
ItemInst::ItemInst(const EQEmu::ItemBase* item, int16 charges) {
|
||||||
m_use_type = ItemInstNormal;
|
m_use_type = ItemInstNormal;
|
||||||
if(item) {
|
if(item) {
|
||||||
m_item = new EQEmu::Item_Struct(*item);
|
m_item = new EQEmu::ItemBase(*item);
|
||||||
} else {
|
} else {
|
||||||
m_item = nullptr;
|
m_item = nullptr;
|
||||||
}
|
}
|
||||||
@@ -1474,7 +1474,7 @@ ItemInst::ItemInst(SharedDatabase *db, uint32 item_id, int16 charges) {
|
|||||||
m_use_type = ItemInstNormal;
|
m_use_type = ItemInstNormal;
|
||||||
m_item = db->GetItem(item_id);
|
m_item = db->GetItem(item_id);
|
||||||
if(m_item) {
|
if(m_item) {
|
||||||
m_item = new EQEmu::Item_Struct(*m_item);
|
m_item = new EQEmu::ItemBase(*m_item);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_item = nullptr;
|
m_item = nullptr;
|
||||||
@@ -1529,7 +1529,7 @@ ItemInst::ItemInst(const ItemInst& copy)
|
|||||||
{
|
{
|
||||||
m_use_type=copy.m_use_type;
|
m_use_type=copy.m_use_type;
|
||||||
if(copy.m_item)
|
if(copy.m_item)
|
||||||
m_item = new EQEmu::Item_Struct(*copy.m_item);
|
m_item = new EQEmu::ItemBase(*copy.m_item);
|
||||||
else
|
else
|
||||||
m_item = nullptr;
|
m_item = nullptr;
|
||||||
|
|
||||||
@@ -1565,7 +1565,7 @@ ItemInst::ItemInst(const ItemInst& copy)
|
|||||||
m_evolveLvl = copy.m_evolveLvl;
|
m_evolveLvl = copy.m_evolveLvl;
|
||||||
m_activated = copy.m_activated;
|
m_activated = copy.m_activated;
|
||||||
if (copy.m_scaledItem)
|
if (copy.m_scaledItem)
|
||||||
m_scaledItem = new EQEmu::Item_Struct(*copy.m_scaledItem);
|
m_scaledItem = new EQEmu::ItemBase(*copy.m_scaledItem);
|
||||||
else
|
else
|
||||||
m_scaledItem = nullptr;
|
m_scaledItem = nullptr;
|
||||||
|
|
||||||
@@ -1800,7 +1800,7 @@ void ItemInst::ClearByFlags(byFlagSetting is_nodrop, byFlagSetting is_norent)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const EQEmu::Item_Struct* item = inst->GetItem();
|
const EQEmu::ItemBase* item = inst->GetItem();
|
||||||
if (item == nullptr) {
|
if (item == nullptr) {
|
||||||
cur = m_contents.erase(cur);
|
cur = m_contents.erase(cur);
|
||||||
continue;
|
continue;
|
||||||
@@ -1863,6 +1863,9 @@ uint8 ItemInst::FirstOpenSlot() const
|
|||||||
|
|
||||||
uint8 ItemInst::GetTotalItemCount() const
|
uint8 ItemInst::GetTotalItemCount() const
|
||||||
{
|
{
|
||||||
|
if (!m_item)
|
||||||
|
return 0;
|
||||||
|
|
||||||
uint8 item_count = 1;
|
uint8 item_count = 1;
|
||||||
|
|
||||||
if (m_item && !m_item->IsClassBag()) { return item_count; }
|
if (m_item && !m_item->IsClassBag()) { return item_count; }
|
||||||
@@ -1941,7 +1944,7 @@ bool ItemInst::UpdateOrnamentationInfo() {
|
|||||||
int32 ornamentationAugtype = RuleI(Character, OrnamentationAugmentType);
|
int32 ornamentationAugtype = RuleI(Character, OrnamentationAugmentType);
|
||||||
if (GetOrnamentationAug(ornamentationAugtype))
|
if (GetOrnamentationAug(ornamentationAugtype))
|
||||||
{
|
{
|
||||||
const EQEmu::Item_Struct* ornamentItem;
|
const EQEmu::ItemBase* ornamentItem;
|
||||||
ornamentItem = GetOrnamentationAug(ornamentationAugtype)->GetItem();
|
ornamentItem = GetOrnamentationAug(ornamentationAugtype)->GetItem();
|
||||||
if (ornamentItem != nullptr)
|
if (ornamentItem != nullptr)
|
||||||
{
|
{
|
||||||
@@ -1968,7 +1971,7 @@ bool ItemInst::UpdateOrnamentationInfo() {
|
|||||||
return ornamentSet;
|
return ornamentSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ItemInst::CanTransform(const EQEmu::Item_Struct *ItemToTry, const EQEmu::Item_Struct *Container, bool AllowAll) {
|
bool ItemInst::CanTransform(const EQEmu::ItemBase *ItemToTry, const EQEmu::ItemBase *Container, bool AllowAll) {
|
||||||
if (!ItemToTry || !Container) return false;
|
if (!ItemToTry || !Container) return false;
|
||||||
|
|
||||||
if (ItemToTry->ItemType == EQEmu::item::ItemTypeArrow || strnlen(Container->CharmFile, 30) == 0)
|
if (ItemToTry->ItemType == EQEmu::item::ItemTypeArrow || strnlen(Container->CharmFile, 30) == 0)
|
||||||
@@ -2102,7 +2105,7 @@ bool ItemInst::IsAmmo() const
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const EQEmu::Item_Struct* ItemInst::GetItem() const
|
const EQEmu::ItemBase* ItemInst::GetItem() const
|
||||||
{
|
{
|
||||||
if (!m_item)
|
if (!m_item)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@@ -2113,7 +2116,7 @@ const EQEmu::Item_Struct* ItemInst::GetItem() const
|
|||||||
return m_item;
|
return m_item;
|
||||||
}
|
}
|
||||||
|
|
||||||
const EQEmu::Item_Struct* ItemInst::GetUnscaledItem() const
|
const EQEmu::ItemBase* ItemInst::GetUnscaledItem() const
|
||||||
{
|
{
|
||||||
// No operator calls and defaults to nullptr
|
// No operator calls and defaults to nullptr
|
||||||
return m_item;
|
return m_item;
|
||||||
@@ -2221,10 +2224,10 @@ void ItemInst::ScaleItem() {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_scaledItem) {
|
if (m_scaledItem) {
|
||||||
memcpy(m_scaledItem, m_item, sizeof(EQEmu::Item_Struct));
|
memcpy(m_scaledItem, m_item, sizeof(EQEmu::ItemBase));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_scaledItem = new EQEmu::Item_Struct(*m_item);
|
m_scaledItem = new EQEmu::ItemBase(*m_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
float Mult = (float)(GetExp()) / 10000; // scaling is determined by exp, with 10,000 being full stats
|
float Mult = (float)(GetExp()) / 10000; // scaling is determined by exp, with 10,000 being full stats
|
||||||
|
|||||||
+11
-13
@@ -29,16 +29,14 @@ class ItemParse; // Parses item packets
|
|||||||
class EvolveInfo; // Stores information about an evolving item family
|
class EvolveInfo; // Stores information about an evolving item family
|
||||||
|
|
||||||
#include "../common/eq_constants.h"
|
#include "../common/eq_constants.h"
|
||||||
#include "../common/item_struct.h"
|
#include "../common/item_base.h"
|
||||||
#include "../common/timer.h"
|
#include "../common/timer.h"
|
||||||
#include "../common/bodytypes.h"
|
#include "../common/bodytypes.h"
|
||||||
#include "../common/deity.h" // aren't we already in '/common'?
|
#include "../common/deity.h"
|
||||||
|
#include "../common/memory_buffer.h"
|
||||||
#include "string_util.h"
|
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
//#include <sstream>
|
|
||||||
|
|
||||||
|
|
||||||
namespace ItemField
|
namespace ItemField
|
||||||
@@ -177,7 +175,7 @@ public:
|
|||||||
ItemInst* PopItem(int16 slot_id);
|
ItemInst* PopItem(int16 slot_id);
|
||||||
|
|
||||||
// Check whether there is space for the specified number of the specified item.
|
// Check whether there is space for the specified number of the specified item.
|
||||||
bool HasSpaceForItem(const EQEmu::Item_Struct *ItemToTry, int16 Quantity);
|
bool HasSpaceForItem(const EQEmu::ItemBase *ItemToTry, int16 Quantity);
|
||||||
|
|
||||||
// Check whether item exists in inventory
|
// Check whether item exists in inventory
|
||||||
// where argument specifies OR'd list of invWhere constants to look
|
// where argument specifies OR'd list of invWhere constants to look
|
||||||
@@ -202,7 +200,7 @@ public:
|
|||||||
static int16 CalcSlotFromMaterial(uint8 material);
|
static int16 CalcSlotFromMaterial(uint8 material);
|
||||||
static uint8 CalcMaterialFromSlot(int16 equipslot);
|
static uint8 CalcMaterialFromSlot(int16 equipslot);
|
||||||
|
|
||||||
static bool CanItemFitInContainer(const EQEmu::Item_Struct *ItemToTry, const EQEmu::Item_Struct *Container);
|
static bool CanItemFitInContainer(const EQEmu::ItemBase *ItemToTry, const EQEmu::ItemBase *Container);
|
||||||
|
|
||||||
// Test for valid inventory casting slot
|
// Test for valid inventory casting slot
|
||||||
bool SupportsClickCasting(int16 slot_id);
|
bool SupportsClickCasting(int16 slot_id);
|
||||||
@@ -279,7 +277,7 @@ public:
|
|||||||
/////////////////////////
|
/////////////////////////
|
||||||
|
|
||||||
// Constructors/Destructor
|
// Constructors/Destructor
|
||||||
ItemInst(const EQEmu::Item_Struct* item = nullptr, int16 charges = 0);
|
ItemInst(const EQEmu::ItemBase* item = nullptr, int16 charges = 0);
|
||||||
|
|
||||||
ItemInst(SharedDatabase *db, uint32 item_id, int16 charges = 0);
|
ItemInst(SharedDatabase *db, uint32 item_id, int16 charges = 0);
|
||||||
|
|
||||||
@@ -348,7 +346,7 @@ public:
|
|||||||
bool IsAugmented();
|
bool IsAugmented();
|
||||||
ItemInst* GetOrnamentationAug(int32 ornamentationAugtype) const;
|
ItemInst* GetOrnamentationAug(int32 ornamentationAugtype) const;
|
||||||
bool UpdateOrnamentationInfo();
|
bool UpdateOrnamentationInfo();
|
||||||
static bool CanTransform(const EQEmu::Item_Struct *ItemToTry, const EQEmu::Item_Struct *Container, bool AllowAll = false);
|
static bool CanTransform(const EQEmu::ItemBase *ItemToTry, const EQEmu::ItemBase *Container, bool AllowAll = false);
|
||||||
|
|
||||||
// Has attack/delay?
|
// Has attack/delay?
|
||||||
bool IsWeapon() const;
|
bool IsWeapon() const;
|
||||||
@@ -357,8 +355,8 @@ public:
|
|||||||
// Accessors
|
// Accessors
|
||||||
const uint32 GetID() const { return ((m_item) ? m_item->ID : NO_ITEM); }
|
const uint32 GetID() const { return ((m_item) ? m_item->ID : NO_ITEM); }
|
||||||
const uint32 GetItemScriptID() const { return ((m_item) ? m_item->ScriptFileID : NO_ITEM); }
|
const uint32 GetItemScriptID() const { return ((m_item) ? m_item->ScriptFileID : NO_ITEM); }
|
||||||
const EQEmu::Item_Struct* GetItem() const;
|
const EQEmu::ItemBase* GetItem() const;
|
||||||
const EQEmu::Item_Struct* GetUnscaledItem() const;
|
const EQEmu::ItemBase* GetUnscaledItem() const;
|
||||||
|
|
||||||
int16 GetCharges() const { return m_charges; }
|
int16 GetCharges() const { return m_charges; }
|
||||||
void SetCharges(int16 charges) { m_charges = charges; }
|
void SetCharges(int16 charges) { m_charges = charges; }
|
||||||
@@ -502,7 +500,7 @@ protected:
|
|||||||
void _PutItem(uint8 index, ItemInst* inst) { m_contents[index] = inst; }
|
void _PutItem(uint8 index, ItemInst* inst) { m_contents[index] = inst; }
|
||||||
|
|
||||||
ItemInstTypes m_use_type; // Usage type for item
|
ItemInstTypes m_use_type; // Usage type for item
|
||||||
const EQEmu::Item_Struct* m_item; // Ptr to item data
|
const EQEmu::ItemBase* m_item; // Ptr to item data
|
||||||
int16 m_charges; // # of charges for chargeable items
|
int16 m_charges; // # of charges for chargeable items
|
||||||
uint32 m_price; // Bazaar /trader price
|
uint32 m_price; // Bazaar /trader price
|
||||||
uint32 m_color;
|
uint32 m_color;
|
||||||
@@ -514,7 +512,7 @@ protected:
|
|||||||
uint32 m_exp;
|
uint32 m_exp;
|
||||||
int8 m_evolveLvl;
|
int8 m_evolveLvl;
|
||||||
bool m_activated;
|
bool m_activated;
|
||||||
EQEmu::Item_Struct* m_scaledItem;
|
EQEmu::ItemBase* m_scaledItem;
|
||||||
EvolveInfo* m_evolveInfo;
|
EvolveInfo* m_evolveInfo;
|
||||||
bool m_scaling;
|
bool m_scaling;
|
||||||
uint32 m_ornamenticon;
|
uint32 m_ornamenticon;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "item_struct.h"
|
#include "item_base.h"
|
||||||
#include "classes.h"
|
#include "classes.h"
|
||||||
#include "races.h"
|
#include "races.h"
|
||||||
//#include "deity.h"
|
//#include "deity.h"
|
||||||
@@ -167,7 +167,7 @@ uint8 EQEmu::item::ConvertAugTypeBitToAugType(uint32 aug_type_bit)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::Item_Struct::IsEquipable(uint16 race_id, uint16 class_id)
|
bool EQEmu::ItemBase::IsEquipable(uint16 race_id, uint16 class_id)
|
||||||
{
|
{
|
||||||
if (!(Races & GetPlayerRaceBit(race_id)))
|
if (!(Races & GetPlayerRaceBit(race_id)))
|
||||||
return false;
|
return false;
|
||||||
@@ -178,32 +178,32 @@ bool EQEmu::Item_Struct::IsEquipable(uint16 race_id, uint16 class_id)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::Item_Struct::IsClassCommon()
|
bool EQEmu::ItemBase::IsClassCommon()
|
||||||
{
|
{
|
||||||
return (ItemClass == item::ItemClassCommon);
|
return (ItemClass == item::ItemClassCommon);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::Item_Struct::IsClassBag()
|
bool EQEmu::ItemBase::IsClassBag()
|
||||||
{
|
{
|
||||||
return (ItemClass == item::ItemClassBag);
|
return (ItemClass == item::ItemClassBag);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::Item_Struct::IsClassBook()
|
bool EQEmu::ItemBase::IsClassBook()
|
||||||
{
|
{
|
||||||
return (ItemClass == item::ItemClassBook);
|
return (ItemClass == item::ItemClassBook);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::Item_Struct::IsType1HWeapon()
|
bool EQEmu::ItemBase::IsType1HWeapon()
|
||||||
{
|
{
|
||||||
return ((ItemType == item::ItemType1HBlunt) || (ItemType == item::ItemType1HSlash) || (ItemType == item::ItemType1HPiercing));
|
return ((ItemType == item::ItemType1HBlunt) || (ItemType == item::ItemType1HSlash) || (ItemType == item::ItemType1HPiercing));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::Item_Struct::IsType2HWeapon()
|
bool EQEmu::ItemBase::IsType2HWeapon()
|
||||||
{
|
{
|
||||||
return ((ItemType == item::ItemType2HBlunt) || (ItemType == item::ItemType2HSlash) || (ItemType == item::ItemType2HPiercing));
|
return ((ItemType == item::ItemType2HBlunt) || (ItemType == item::ItemType2HSlash) || (ItemType == item::ItemType2HPiercing));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::Item_Struct::IsTypeShield()
|
bool EQEmu::ItemBase::IsTypeShield()
|
||||||
{
|
{
|
||||||
return (ItemType == item::ItemTypeShield);
|
return (ItemType == item::ItemTypeShield);
|
||||||
}
|
}
|
||||||
@@ -17,8 +17,8 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 04111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 04111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMMON_ITEM_STRUCT_H
|
#ifndef COMMON_ITEM_BASE_H
|
||||||
#define COMMON_ITEM_STRUCT_H
|
#define COMMON_ITEM_BASE_H
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -336,10 +336,10 @@ namespace EQEmu
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum ItemDataType : uint8 {
|
enum ItemDataType : uint8 {
|
||||||
ItemDataTypeBase = 0,
|
ItemDataBase = 0,
|
||||||
ItemDataTypeScaling,
|
ItemDataScaling,
|
||||||
ItemDataTypeEvolving,
|
ItemDataEvolving,
|
||||||
ItemDataTypeCount
|
ItemDataCount
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ItemEffect_Struct {
|
struct ItemEffect_Struct {
|
||||||
@@ -364,10 +364,10 @@ namespace EQEmu
|
|||||||
const void * inst;
|
const void * inst;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Item_Struct {
|
struct ItemBase {
|
||||||
// Non packet based fields
|
// Non packet based fields
|
||||||
uint8 MinStatus;
|
uint8 MinStatus;
|
||||||
//uint8 ItemDataType;
|
uint8 ItemDataType; // memset to item::ItemDataBase ('0') during mmf load
|
||||||
|
|
||||||
// Packet based fields
|
// Packet based fields
|
||||||
uint8 ItemClass; // Item Type: 0=common, 1=container, 2=book
|
uint8 ItemClass; // Item Type: 0=common, 1=container, 2=book
|
||||||
@@ -551,15 +551,15 @@ namespace EQEmu
|
|||||||
bool IsType2HWeapon();
|
bool IsType2HWeapon();
|
||||||
bool IsTypeShield();
|
bool IsTypeShield();
|
||||||
|
|
||||||
bool IsEquipable(uint16 Race, uint16 Class) const { return const_cast<Item_Struct*>(this)->IsEquipable(Race, Class); }
|
bool IsEquipable(uint16 Race, uint16 Class) const { return const_cast<ItemBase*>(this)->IsEquipable(Race, Class); }
|
||||||
bool IsClassCommon() const { return const_cast<Item_Struct*>(this)->IsClassCommon(); }
|
bool IsClassCommon() const { return const_cast<ItemBase*>(this)->IsClassCommon(); }
|
||||||
bool IsClassBag() const { return const_cast<Item_Struct*>(this)->IsClassBag(); }
|
bool IsClassBag() const { return const_cast<ItemBase*>(this)->IsClassBag(); }
|
||||||
bool IsClassBook() const { return const_cast<Item_Struct*>(this)->IsClassBook(); }
|
bool IsClassBook() const { return const_cast<ItemBase*>(this)->IsClassBook(); }
|
||||||
bool IsType1HWeapon() const { return const_cast<Item_Struct*>(this)->IsType1HWeapon(); }
|
bool IsType1HWeapon() const { return const_cast<ItemBase*>(this)->IsType1HWeapon(); }
|
||||||
bool IsType2HWeapon() const { return const_cast<Item_Struct*>(this)->IsType2HWeapon(); }
|
bool IsType2HWeapon() const { return const_cast<ItemBase*>(this)->IsType2HWeapon(); }
|
||||||
bool IsTypeShield() const { return const_cast<Item_Struct*>(this)->IsTypeShield(); }
|
bool IsTypeShield() const { return const_cast<ItemBase*>(this)->IsTypeShield(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
} /*EQEmu*/
|
} /*EQEmu*/
|
||||||
|
|
||||||
#endif /*COMMON_ITEM_STRUCT_H*/
|
#endif /*COMMON_ITEM_BASE_H*/
|
||||||
@@ -82,14 +82,14 @@ bool EQEmu::lightsource::IsLevelGreater(uint8 left_type, uint8 right_type)
|
|||||||
return (light_levels[left_type] > light_levels[right_type]);
|
return (light_levels[left_type] > light_levels[right_type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
EQEmu::lightsource::Light_Struct::Light_Struct()
|
EQEmu::LightSource_Struct::LightSource_Struct()
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQEmu::lightsource::Light_Struct::Clear()
|
void EQEmu::LightSource_Struct::Clear()
|
||||||
{
|
{
|
||||||
memset(&Slot, 0, (sizeof(uint8) * sizeof(Slot)));
|
memset(&Slot, 0, (sizeof(uint8) * lightsource::LightCount));
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQEmu::LightSourceProfile::Clear()
|
void EQEmu::LightSourceProfile::Clear()
|
||||||
|
|||||||
+12
-13
@@ -34,7 +34,6 @@ namespace EQEmu
|
|||||||
LightCount
|
LightCount
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum LightType {
|
enum LightType {
|
||||||
LightTypeNone = 0,
|
LightTypeNone = 0,
|
||||||
LightTypeCandle,
|
LightTypeCandle,
|
||||||
@@ -70,21 +69,21 @@ namespace EQEmu
|
|||||||
LightLevelCount
|
LightLevelCount
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Light_Struct {
|
|
||||||
uint8 Slot[LightCount];
|
|
||||||
|
|
||||||
Light_Struct();
|
|
||||||
|
|
||||||
void Clear();
|
|
||||||
|
|
||||||
inline uint8& operator[](LightSlot index) { return Slot[index]; }
|
|
||||||
};
|
|
||||||
|
|
||||||
extern uint8 TypeToLevel(uint8 light_type);
|
extern uint8 TypeToLevel(uint8 light_type);
|
||||||
extern bool IsLevelGreater(uint8 left_type, uint8 right_type);
|
extern bool IsLevelGreater(uint8 left_type, uint8 right_type);
|
||||||
|
|
||||||
}; /*lightsource*/
|
}; /*lightsource*/
|
||||||
|
|
||||||
|
struct LightSource_Struct {
|
||||||
|
uint8 Slot[lightsource::LightCount];
|
||||||
|
|
||||||
|
LightSource_Struct();
|
||||||
|
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
inline uint8& operator[](lightsource::LightSlot index) { return Slot[index]; }
|
||||||
|
};
|
||||||
|
|
||||||
struct LightSourceProfile {
|
struct LightSourceProfile {
|
||||||
/*
|
/*
|
||||||
Current criteria (light types):
|
Current criteria (light types):
|
||||||
@@ -103,8 +102,8 @@ namespace EQEmu
|
|||||||
-- The timer-based update cancels out the invalid light source
|
-- The timer-based update cancels out the invalid light source
|
||||||
*/
|
*/
|
||||||
|
|
||||||
lightsource::Light_Struct Type; // Light types (classifications)
|
LightSource_Struct Type; // Light types (classifications)
|
||||||
lightsource::Light_Struct Level; // Light levels (intensities) - used to determine which light source should be active
|
LightSource_Struct Level; // Light levels (intensities) - used to determine which light source should be active
|
||||||
|
|
||||||
LightSourceProfile() { }
|
LightSourceProfile() { }
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,277 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
|
||||||
|
Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "memory_buffer.h"
|
||||||
|
|
||||||
|
|
||||||
|
EQEmu::MemoryBuffer::MemoryBuffer()
|
||||||
|
{
|
||||||
|
buffer_ = nullptr;
|
||||||
|
size_ = 0;
|
||||||
|
capacity_ = 0;
|
||||||
|
read_pos_ = 0;
|
||||||
|
write_pos_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::MemoryBuffer::MemoryBuffer(size_t sz)
|
||||||
|
{
|
||||||
|
buffer_ = nullptr;
|
||||||
|
size_ = 0;
|
||||||
|
capacity_ = 0;
|
||||||
|
read_pos_ = 0;
|
||||||
|
write_pos_ = 0;
|
||||||
|
Resize(sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::MemoryBuffer::MemoryBuffer(const MemoryBuffer &other)
|
||||||
|
{
|
||||||
|
if(other.capacity_) {
|
||||||
|
buffer_ = new uchar[other.capacity_];
|
||||||
|
memcpy(buffer_, other.buffer_, other.capacity_);
|
||||||
|
} else {
|
||||||
|
buffer_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_ = other.size_;
|
||||||
|
capacity_ = other.capacity_;
|
||||||
|
write_pos_ = other.write_pos_;
|
||||||
|
read_pos_ = other.read_pos_;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::MemoryBuffer::MemoryBuffer(MemoryBuffer &&other)
|
||||||
|
{
|
||||||
|
uchar *tbuf = other.buffer_;
|
||||||
|
size_t tsz = other.size_;
|
||||||
|
size_t tcapacity = other.capacity_;
|
||||||
|
size_t twrite_pos = other.write_pos_;
|
||||||
|
size_t tread_pos = other.read_pos_;
|
||||||
|
|
||||||
|
other.buffer_ = nullptr;
|
||||||
|
other.size_ = 0;
|
||||||
|
other.capacity_ = 0;
|
||||||
|
other.read_pos_ = 0;
|
||||||
|
other.write_pos_ = 0;
|
||||||
|
|
||||||
|
buffer_ = tbuf;
|
||||||
|
size_ = tsz;
|
||||||
|
capacity_ = tcapacity;
|
||||||
|
write_pos_ = twrite_pos;
|
||||||
|
read_pos_ = tread_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator=(const MemoryBuffer &other)
|
||||||
|
{
|
||||||
|
if(this == &other) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(buffer_) {
|
||||||
|
delete[] buffer_;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(other.capacity_) {
|
||||||
|
buffer_ = new uchar[other.capacity_];
|
||||||
|
memcpy(buffer_, other.buffer_, other.capacity_);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
buffer_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_ = other.size_;
|
||||||
|
capacity_ = other.capacity_;
|
||||||
|
write_pos_ = other.write_pos_;
|
||||||
|
read_pos_ = other.read_pos_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator=(MemoryBuffer &&other)
|
||||||
|
{
|
||||||
|
uchar *tbuf = other.buffer_;
|
||||||
|
size_t tsz = other.size_;
|
||||||
|
size_t tcapacity = other.capacity_;
|
||||||
|
size_t twrite_pos = other.write_pos_;
|
||||||
|
size_t tread_pos = other.read_pos_;
|
||||||
|
|
||||||
|
other.buffer_ = nullptr;
|
||||||
|
other.size_ = 0;
|
||||||
|
other.capacity_ = 0;
|
||||||
|
other.read_pos_ = 0;
|
||||||
|
other.write_pos_ = 0;
|
||||||
|
|
||||||
|
buffer_ = tbuf;
|
||||||
|
size_ = tsz;
|
||||||
|
capacity_ = tcapacity;
|
||||||
|
write_pos_ = twrite_pos;
|
||||||
|
read_pos_ = tread_pos;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator+=(const MemoryBuffer &rhs)
|
||||||
|
{
|
||||||
|
if(!rhs.buffer_) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(buffer_) {
|
||||||
|
size_t old_size = size_;
|
||||||
|
Resize(size_ + rhs.size_);
|
||||||
|
memcpy(&buffer_[old_size], rhs.buffer_, rhs.size_);
|
||||||
|
} else {
|
||||||
|
buffer_ = new uchar[rhs.capacity_];
|
||||||
|
memcpy(buffer_, rhs.buffer_, rhs.capacity_);
|
||||||
|
size_ = rhs.size_;
|
||||||
|
capacity_ = rhs.capacity_;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::MemoryBuffer::~MemoryBuffer()
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
uchar& EQEmu::MemoryBuffer::operator[](size_t pos)
|
||||||
|
{
|
||||||
|
return buffer_[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
const uchar& EQEmu::MemoryBuffer::operator[](size_t pos) const
|
||||||
|
{
|
||||||
|
return buffer_[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQEmu::MemoryBuffer::Empty()
|
||||||
|
{
|
||||||
|
return size_ == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQEmu::MemoryBuffer::Empty() const
|
||||||
|
{
|
||||||
|
return size_ == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t EQEmu::MemoryBuffer::Size()
|
||||||
|
{
|
||||||
|
return size_;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t EQEmu::MemoryBuffer::Size() const
|
||||||
|
{
|
||||||
|
return size_;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t EQEmu::MemoryBuffer::Capacity()
|
||||||
|
{
|
||||||
|
return capacity_;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t EQEmu::MemoryBuffer::Capacity() const
|
||||||
|
{
|
||||||
|
return capacity_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQEmu::MemoryBuffer::Resize(size_t sz)
|
||||||
|
{
|
||||||
|
if(!buffer_) {
|
||||||
|
size_t new_size = sz + 64;
|
||||||
|
buffer_ = new uchar[new_size];
|
||||||
|
capacity_ = new_size;
|
||||||
|
size_ = sz;
|
||||||
|
memset(buffer_, 0, capacity_);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sz > capacity_) {
|
||||||
|
size_t new_size = sz + 32;
|
||||||
|
uchar *temp = new uchar[new_size];
|
||||||
|
memcpy(temp, buffer_, capacity_);
|
||||||
|
delete[] buffer_;
|
||||||
|
buffer_ = temp;
|
||||||
|
|
||||||
|
capacity_ = new_size;
|
||||||
|
size_ = sz;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
size_ = sz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQEmu::MemoryBuffer::Clear()
|
||||||
|
{
|
||||||
|
if(buffer_) {
|
||||||
|
delete[] buffer_;
|
||||||
|
buffer_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_ = 0;
|
||||||
|
capacity_ = 0;
|
||||||
|
write_pos_ = 0;
|
||||||
|
read_pos_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQEmu::MemoryBuffer::Zero()
|
||||||
|
{
|
||||||
|
if(buffer_) {
|
||||||
|
memset(buffer_, 0, capacity_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQEmu::MemoryBuffer::Write(const char *val, size_t len)
|
||||||
|
{
|
||||||
|
size_t size_needed = write_pos_ + len;
|
||||||
|
Resize(size_needed);
|
||||||
|
|
||||||
|
memcpy(&buffer_[write_pos_], val, len);
|
||||||
|
write_pos_ += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQEmu::MemoryBuffer::Read(uchar *buf, size_t len)
|
||||||
|
{
|
||||||
|
memcpy(buf, &buffer_[read_pos_], len);
|
||||||
|
read_pos_ += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQEmu::MemoryBuffer::Read(char *str)
|
||||||
|
{
|
||||||
|
size_t len = strlen((const char*)&buffer_[read_pos_]);
|
||||||
|
memcpy(str, &buffer_[read_pos_], len);
|
||||||
|
read_pos_ += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQEmu::OutBuffer::overwrite(OutBuffer::pos_type position, const char *_Str, std::streamsize _Count)
|
||||||
|
{
|
||||||
|
auto last_pos = tellp();
|
||||||
|
seekp(position);
|
||||||
|
write(_Str, _Count);
|
||||||
|
seekp(last_pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
uchar* EQEmu::OutBuffer::detach()
|
||||||
|
{
|
||||||
|
size_t buffer_size = tellp();
|
||||||
|
if (buffer_size == 0)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
auto out_buffer = new uchar[buffer_size];
|
||||||
|
memcpy(out_buffer, str().c_str(), buffer_size);
|
||||||
|
flush();
|
||||||
|
|
||||||
|
return out_buffer;
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
|
||||||
|
Copyright (C) 2001-2016 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 COMMON_MEMORY_BUFFER
|
||||||
|
#define COMMON_MEMORY_BUFFER
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <string.h>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
|
||||||
|
namespace EQEmu
|
||||||
|
{
|
||||||
|
class MemoryBuffer {
|
||||||
|
public:
|
||||||
|
MemoryBuffer();
|
||||||
|
MemoryBuffer(size_t sz);
|
||||||
|
MemoryBuffer(const MemoryBuffer &other);
|
||||||
|
MemoryBuffer(MemoryBuffer &&other);
|
||||||
|
MemoryBuffer& operator=(const MemoryBuffer &other);
|
||||||
|
MemoryBuffer& operator=(MemoryBuffer &&other);
|
||||||
|
MemoryBuffer& operator+=(const MemoryBuffer &rhs);
|
||||||
|
friend MemoryBuffer operator+(MemoryBuffer lhs, const MemoryBuffer& rhs) { return lhs += rhs; }
|
||||||
|
~MemoryBuffer();
|
||||||
|
|
||||||
|
uchar& operator[](size_t pos);
|
||||||
|
const uchar& operator[](size_t pos) const;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
operator T*() {
|
||||||
|
return reinterpret_cast<T*>(buffer_);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
operator T*() const {
|
||||||
|
return reinterpret_cast<T*>(buffer_);
|
||||||
|
}
|
||||||
|
|
||||||
|
operator bool() { return buffer_ != nullptr; }
|
||||||
|
operator bool() const { return buffer_ != nullptr; }
|
||||||
|
|
||||||
|
bool Empty();
|
||||||
|
bool Empty() const;
|
||||||
|
size_t Size();
|
||||||
|
size_t Size() const;
|
||||||
|
size_t Capacity();
|
||||||
|
size_t Capacity() const;
|
||||||
|
|
||||||
|
void Resize(size_t sz);
|
||||||
|
void Clear();
|
||||||
|
void Zero();
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void Write(T val) {
|
||||||
|
static_assert(std::is_pod<T>::value, "MemoryBuffer::Write<T>(T val) only works on pod and string types.");
|
||||||
|
Write((const char*)&val, sizeof(T));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T Read() {
|
||||||
|
static_assert(std::is_pod<T>::value, "MemoryBuffer::Read<T>() only works on pod and string types.");
|
||||||
|
T temp;
|
||||||
|
Read((uchar*)&temp, sizeof(T));
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Write(const std::string &val) {
|
||||||
|
Write(val.c_str(), val.length());
|
||||||
|
Write((uint8)0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Write(const char *val) {
|
||||||
|
size_t len = strlen(val);
|
||||||
|
Write(val, len);
|
||||||
|
Write((uint8)0);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ReadString() {
|
||||||
|
std::string ret;
|
||||||
|
size_t len = strlen((const char*)&buffer_[read_pos_]);
|
||||||
|
ret.resize(len);
|
||||||
|
memcpy(&ret[0], &buffer_[read_pos_], len);
|
||||||
|
read_pos_ += len + 1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Write(const char *val, size_t len);
|
||||||
|
void Read(uchar *buf, size_t len);
|
||||||
|
void Read(char *str);
|
||||||
|
|
||||||
|
inline size_t GetWritePosition() { return write_pos_; }
|
||||||
|
inline void SetWritePosition(size_t wp) { write_pos_ = wp; }
|
||||||
|
inline void WriteSkipBytes(size_t skip) { write_pos_ += skip; }
|
||||||
|
inline size_t GetReadPosition() { return read_pos_; }
|
||||||
|
inline void SetReadPosition(size_t rp) { read_pos_ = rp; }
|
||||||
|
inline void ReadSkipBytes(size_t skip) { read_pos_ += skip; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
uchar *buffer_;
|
||||||
|
size_t size_;
|
||||||
|
size_t capacity_;
|
||||||
|
size_t write_pos_;
|
||||||
|
size_t read_pos_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class OutBuffer : public std::stringstream {
|
||||||
|
public:
|
||||||
|
inline size_t size() { return tellp(); }
|
||||||
|
void overwrite(OutBuffer::pos_type position, const char *_Str, std::streamsize _Count);
|
||||||
|
uchar* detach();
|
||||||
|
};
|
||||||
|
|
||||||
|
} /*EQEmu*/
|
||||||
|
|
||||||
|
#endif /*COMMON_MEMORY_BUFFER*/
|
||||||
@@ -173,7 +173,7 @@ IN(OP_TradeAcceptClick, TradeAccept_Struct);
|
|||||||
IN(OP_BoardBoat, EntityId_Struct); //not really the struct, just 4 bytes
|
IN(OP_BoardBoat, EntityId_Struct); //not really the struct, just 4 bytes
|
||||||
INz(OP_LeaveBoat); //?
|
INz(OP_LeaveBoat); //?
|
||||||
IN(OP_RandomReq, RandomReq_Struct);
|
IN(OP_RandomReq, RandomReq_Struct);
|
||||||
IN(OP_Buff, SpellBuffFade_Struct);
|
IN(OP_Buff, SpellBuffPacket_Struct);
|
||||||
IN(OP_GMHideMe, SpawnAppearance_Struct);
|
IN(OP_GMHideMe, SpawnAppearance_Struct);
|
||||||
IN(OP_GMNameChange, GMName_Struct);
|
IN(OP_GMNameChange, GMName_Struct);
|
||||||
IN(OP_GMKill, GMKill_Struct);
|
IN(OP_GMKill, GMKill_Struct);
|
||||||
@@ -415,7 +415,7 @@ OUTv(OP_SendAATable, SendAA_Struct);
|
|||||||
OUT(OP_AAAction, UseAA_Struct);
|
OUT(OP_AAAction, UseAA_Struct);
|
||||||
OUT(OP_Bazaar, BazaarReturnDone_Struct);
|
OUT(OP_Bazaar, BazaarReturnDone_Struct);
|
||||||
//alt:OUT(OP_Bazaar, BazaarWelcome_Struct);
|
//alt:OUT(OP_Bazaar, BazaarWelcome_Struct);
|
||||||
OUT(OP_Buff, SpellBuffFade_Struct);
|
OUT(OP_Buff, SpellBuffPacket_Struct);
|
||||||
OUT(OP_ClickObject, ClickObject_Struct);
|
OUT(OP_ClickObject, ClickObject_Struct);
|
||||||
OUT(OP_ClientUpdate, PlayerPositionUpdateServer_Struct);
|
OUT(OP_ClientUpdate, PlayerPositionUpdateServer_Struct);
|
||||||
OUT(OP_SpawnPositionUpdate, SpawnPositionUpdate_Struct);
|
OUT(OP_SpawnPositionUpdate, SpawnPositionUpdate_Struct);
|
||||||
|
|||||||
+165
-79
@@ -63,6 +63,9 @@ namespace RoF
|
|||||||
// client to server text link converter
|
// client to server text link converter
|
||||||
static inline void RoFToServerTextLink(std::string& serverTextLink, const std::string& rofTextLink);
|
static inline void RoFToServerTextLink(std::string& serverTextLink, const std::string& rofTextLink);
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToRoFCastingSlot(EQEmu::CastingSlot slot);
|
||||||
|
static inline EQEmu::CastingSlot RoFToServerCastingSlot(CastingSlot slot);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
{
|
{
|
||||||
//create our opcode manager if we havent already
|
//create our opcode manager if we havent already
|
||||||
@@ -84,7 +87,7 @@ namespace RoF
|
|||||||
|
|
||||||
//ok, now we have what we need to register.
|
//ok, now we have what we need to register.
|
||||||
|
|
||||||
EQStream::Signature signature;
|
EQStreamInterface::Signature signature;
|
||||||
std::string pname;
|
std::string pname;
|
||||||
|
|
||||||
//register our world signature.
|
//register our world signature.
|
||||||
@@ -405,22 +408,31 @@ namespace RoF
|
|||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_Buff)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Live);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
OUT(entityid);
|
OUT(entityid);
|
||||||
eq->unknown004 = 2;
|
OUT(buff.effect_type);
|
||||||
//eq->level = 80;
|
OUT(buff.level);
|
||||||
//eq->effect = 0;
|
// just so we're 100% sure we get a 1.0f ...
|
||||||
OUT(level);
|
eq->buff.bard_modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
|
||||||
OUT(effect);
|
OUT(buff.spellid);
|
||||||
eq->unknown007 = 0;
|
OUT(buff.duration);
|
||||||
eq->unknown008 = 1.0f;
|
OUT(buff.player_id);
|
||||||
OUT(spellid);
|
OUT(buff.num_hits);
|
||||||
OUT(duration);
|
OUT(buff.y);
|
||||||
eq->playerId = 0x7cde;
|
OUT(buff.x);
|
||||||
OUT(slotid);
|
OUT(buff.z);
|
||||||
OUT(num_hits);
|
uint16 buffslot = emu->slotid;
|
||||||
|
// Not sure if this is needs amending for RoF yet.
|
||||||
|
if (buffslot >= 25)
|
||||||
|
{
|
||||||
|
buffslot += 17;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: implement slot_data stuff
|
||||||
|
eq->slotid = buffslot;
|
||||||
|
|
||||||
if (emu->bufffade == 1)
|
if (emu->bufffade == 1)
|
||||||
eq->bufffade = 1;
|
eq->bufffade = 1;
|
||||||
else
|
else
|
||||||
@@ -432,10 +444,10 @@ namespace RoF
|
|||||||
{
|
{
|
||||||
outapp = new EQApplicationPacket(OP_BuffCreate, 29);
|
outapp = new EQApplicationPacket(OP_BuffCreate, 29);
|
||||||
outapp->WriteUInt32(emu->entityid);
|
outapp->WriteUInt32(emu->entityid);
|
||||||
outapp->WriteUInt32(0x0271); // Unk
|
outapp->WriteUInt32(0); // tic timer
|
||||||
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
|
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
|
||||||
outapp->WriteUInt16(1); // 1 buff in this packet
|
outapp->WriteUInt16(1); // 1 buff in this packet
|
||||||
outapp->WriteUInt32(emu->slotid);
|
outapp->WriteUInt32(buffslot);
|
||||||
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
|
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
|
||||||
outapp->WriteUInt32(0); // Duration
|
outapp->WriteUInt32(0); // Duration
|
||||||
outapp->WriteUInt32(0); // ?
|
outapp->WriteUInt32(0); // ?
|
||||||
@@ -465,10 +477,11 @@ namespace RoF
|
|||||||
for (uint16 i = 0; i < emu->count; ++i)
|
for (uint16 i = 0; i < emu->count; ++i)
|
||||||
{
|
{
|
||||||
uint16 buffslot = emu->entries[i].buff_slot;
|
uint16 buffslot = emu->entries[i].buff_slot;
|
||||||
// Not sure if this is needs amending for RoF yet.
|
if (emu->type == 0) { // only correct for self packets
|
||||||
if (emu->entries[i].buff_slot >= 25)
|
if (emu->entries[i].buff_slot >= 25)
|
||||||
{
|
|
||||||
buffslot += 17;
|
buffslot += 17;
|
||||||
|
if (buffslot == 54)
|
||||||
|
buffslot = 62;
|
||||||
}
|
}
|
||||||
|
|
||||||
__packet->WriteUInt32(buffslot);
|
__packet->WriteUInt32(buffslot);
|
||||||
@@ -498,10 +511,7 @@ namespace RoF
|
|||||||
ENCODE_LENGTH_EXACT(CastSpell_Struct);
|
ENCODE_LENGTH_EXACT(CastSpell_Struct);
|
||||||
SETUP_DIRECT_ENCODE(CastSpell_Struct, structs::CastSpell_Struct);
|
SETUP_DIRECT_ENCODE(CastSpell_Struct, structs::CastSpell_Struct);
|
||||||
|
|
||||||
if (emu->slot == 10)
|
eq->slot = static_cast<uint32>(ServerToRoFCastingSlot(static_cast<EQEmu::CastingSlot>(emu->slot)));
|
||||||
eq->slot = 13;
|
|
||||||
else
|
|
||||||
OUT(slot);
|
|
||||||
|
|
||||||
OUT(spell_id);
|
OUT(spell_id);
|
||||||
eq->inventory_slot = ServerToRoFSlot(emu->inventoryslot);
|
eq->inventory_slot = ServerToRoFSlot(emu->inventoryslot);
|
||||||
@@ -977,8 +987,8 @@ namespace RoF
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->drop_id); // Some unique id
|
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->drop_id); // Some unique id
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Same for all objects in the zone
|
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Same for all objects in the zone
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->heading);
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->heading);
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); // X tilt
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->tilt_x); // X tilt
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); // Y tilt
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->tilt_y); // Y tilt
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt.
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt.
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y);
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y);
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x);
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x);
|
||||||
@@ -1614,7 +1624,8 @@ namespace RoF
|
|||||||
OUT(new_mana);
|
OUT(new_mana);
|
||||||
OUT(stamina);
|
OUT(stamina);
|
||||||
OUT(spell_id);
|
OUT(spell_id);
|
||||||
eq->unknown16 = -1; // Self Interrupt/Success = -1, Fizzle = 1, Other Interrupt = 2?
|
OUT(keepcasting);
|
||||||
|
eq->slot = -1; // this is spell gem slot. It's -1 in normal operation
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -2003,18 +2014,18 @@ namespace RoF
|
|||||||
__packet->WriteUInt8(1); // 1 indicates all buffs on the pet (0 to add or remove a single buff)
|
__packet->WriteUInt8(1); // 1 indicates all buffs on the pet (0 to add or remove a single buff)
|
||||||
__packet->WriteUInt16(emu->buffcount);
|
__packet->WriteUInt16(emu->buffcount);
|
||||||
|
|
||||||
for (uint16 i = 0; i < BUFF_COUNT; ++i)
|
for (uint16 i = 0; i < PET_BUFF_COUNT; ++i)
|
||||||
{
|
{
|
||||||
if (emu->spellid[i])
|
if (emu->spellid[i])
|
||||||
{
|
{
|
||||||
__packet->WriteUInt32(i);
|
__packet->WriteUInt32(i);
|
||||||
__packet->WriteUInt32(emu->spellid[i]);
|
__packet->WriteUInt32(emu->spellid[i]);
|
||||||
__packet->WriteUInt32(emu->ticsremaining[i]);
|
__packet->WriteUInt32(emu->ticsremaining[i]);
|
||||||
__packet->WriteUInt32(0); // Unknown
|
__packet->WriteUInt32(0); // numhits
|
||||||
__packet->WriteString("");
|
__packet->WriteString("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__packet->WriteUInt8(0); // Unknown
|
__packet->WriteUInt8(0); // some sort of type
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -2068,9 +2079,9 @@ namespace RoF
|
|||||||
|
|
||||||
outapp->WriteUInt32(22); // Equipment count
|
outapp->WriteUInt32(22); // Equipment count
|
||||||
|
|
||||||
for (int r = 0; r < 9; r++)
|
for (int r = EQEmu::textures::TextureBegin; r < EQEmu::textures::TextureCount; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(emu->item_material[r]);
|
outapp->WriteUInt32(emu->item_material.Slot[r].Material);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
@@ -2088,9 +2099,9 @@ namespace RoF
|
|||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(9); // Equipment2 count
|
outapp->WriteUInt32(EQEmu::textures::TextureCount); // Equipment2 count
|
||||||
|
|
||||||
for (int r = 0; r < 9; r++)
|
for (int r = EQEmu::textures::TextureBegin; r < EQEmu::textures::TextureCount; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
@@ -2099,21 +2110,21 @@ namespace RoF
|
|||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(9); // Tint Count
|
outapp->WriteUInt32(EQEmu::textures::TextureCount); // Tint Count
|
||||||
|
|
||||||
for (int r = 0; r < 7; r++)
|
for (int r = 0; r < 7; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(emu->item_tint[r].Color);
|
outapp->WriteUInt32(emu->item_tint.Slot[r].Color);
|
||||||
}
|
}
|
||||||
// Write zeroes for extra two tint values
|
// Write zeroes for extra two tint values
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
|
|
||||||
outapp->WriteUInt32(9); // Tint2 Count
|
outapp->WriteUInt32(EQEmu::textures::TextureCount); // Tint2 Count
|
||||||
|
|
||||||
for (int r = 0; r < 7; r++)
|
for (int r = 0; r < 7; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(emu->item_tint[r].Color);
|
outapp->WriteUInt32(emu->item_tint.Slot[r].Color);
|
||||||
}
|
}
|
||||||
// Write zeroes for extra two tint values
|
// Write zeroes for extra two tint values
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
@@ -2250,22 +2261,23 @@ namespace RoF
|
|||||||
|
|
||||||
outapp->WriteUInt32(structs::MAX_PP_MEMSPELL); // Memorised spell slots
|
outapp->WriteUInt32(structs::MAX_PP_MEMSPELL); // Memorised spell slots
|
||||||
|
|
||||||
for (uint32 r = 0; r < MAX_PP_MEMSPELL; r++)
|
for (uint32 r = 0; r < MAX_PP_MEMSPELL; r++) // first 12
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(emu->mem_spells[r]);
|
outapp->WriteUInt32(emu->mem_spells[r]);
|
||||||
}
|
}
|
||||||
// zeroes for the rest of the slots
|
// zeroes for the rest of the slots -- the other 4 which don't work at all!
|
||||||
for (uint32 r = 0; r < structs::MAX_PP_MEMSPELL - MAX_PP_MEMSPELL; r++)
|
for (uint32 r = 0; r < structs::MAX_PP_MEMSPELL - MAX_PP_MEMSPELL; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(0xFFFFFFFFU);
|
outapp->WriteUInt32(0xFFFFFFFFU);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(13); // Unknown count
|
outapp->WriteUInt32(13); // gem refresh count
|
||||||
|
|
||||||
for (uint32 r = 0; r < 13; r++)
|
for (uint32 r = 0; r < MAX_PP_MEMSPELL; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(0); // Unknown
|
outapp->WriteUInt32(emu->spellSlotRefresh[r]); // spell gem refresh
|
||||||
}
|
}
|
||||||
|
outapp->WriteUInt32(0); // also refresh -- historically HT/LoH :P
|
||||||
|
|
||||||
outapp->WriteUInt8(0); // Unknown
|
outapp->WriteUInt8(0); // Unknown
|
||||||
|
|
||||||
@@ -2274,31 +2286,32 @@ namespace RoF
|
|||||||
for (uint32 r = 0; r < BUFF_COUNT; r++)
|
for (uint32 r = 0; r < BUFF_COUNT; r++)
|
||||||
{
|
{
|
||||||
float instrument_mod = 0.0f;
|
float instrument_mod = 0.0f;
|
||||||
uint8 slotid = emu->buffs[r].slotid;
|
uint8 effect_type = emu->buffs[r].effect_type;
|
||||||
uint32 player_id = emu->buffs[r].player_id;;
|
uint32 player_id = emu->buffs[r].player_id;;
|
||||||
|
|
||||||
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
|
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
|
||||||
{
|
{
|
||||||
instrument_mod = 1.0f + (emu->buffs[r].bard_modifier - 10) / 10.0f;
|
instrument_mod = 1.0f + (emu->buffs[r].bard_modifier - 10) / 10.0f;
|
||||||
slotid = 2;
|
effect_type = 2;
|
||||||
player_id = 0x000717fd;
|
player_id = 0x000717fd;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
slotid = 0;
|
effect_type = 0;
|
||||||
}
|
}
|
||||||
outapp->WriteUInt8(0); // Had this as slot, but always appears to be 0 on live.
|
// this is different than the client struct for some reason :P
|
||||||
|
// missing a few things, shuffled around
|
||||||
|
outapp->WriteUInt8(0); // this is an unknown
|
||||||
outapp->WriteFloat(instrument_mod);
|
outapp->WriteFloat(instrument_mod);
|
||||||
outapp->WriteUInt32(player_id);
|
outapp->WriteUInt32(player_id);
|
||||||
outapp->WriteUInt8(0);
|
outapp->WriteUInt8(0);
|
||||||
outapp->WriteUInt32(emu->buffs[r].counters);
|
outapp->WriteUInt32(emu->buffs[r].counters);
|
||||||
//outapp->WriteUInt8(emu->buffs[r].bard_modifier);
|
|
||||||
outapp->WriteUInt32(emu->buffs[r].duration);
|
outapp->WriteUInt32(emu->buffs[r].duration);
|
||||||
outapp->WriteUInt8(emu->buffs[r].level);
|
outapp->WriteUInt8(emu->buffs[r].level);
|
||||||
outapp->WriteUInt32(emu->buffs[r].spellid);
|
outapp->WriteUInt32(emu->buffs[r].spellid);
|
||||||
outapp->WriteUInt32(slotid); // Only ever seen 2
|
outapp->WriteUInt8(effect_type); // Only ever seen 2
|
||||||
|
outapp->WriteUInt32(emu->buffs[r].num_hits);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt8(0);
|
|
||||||
outapp->WriteUInt32(emu->buffs[r].counters); // Appears twice ?
|
outapp->WriteUInt32(emu->buffs[r].counters); // Appears twice ?
|
||||||
|
|
||||||
for (uint32 j = 0; j < 44; ++j)
|
for (uint32 j = 0; j < 44; ++j)
|
||||||
@@ -3046,13 +3059,13 @@ namespace RoF
|
|||||||
eq_cse->Gender = emu_cse->Gender;
|
eq_cse->Gender = emu_cse->Gender;
|
||||||
eq_cse->Face = emu_cse->Face;
|
eq_cse->Face = emu_cse->Face;
|
||||||
|
|
||||||
for (int equip_index = 0; equip_index < EQEmu::legacy::MaterialCount; equip_index++) {
|
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
|
||||||
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
||||||
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
||||||
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
||||||
eq_cse->Equip[equip_index].HeroForgeModel = emu_cse->Equip[equip_index].HeroForgeModel;
|
eq_cse->Equip[equip_index].HeroForgeModel = emu_cse->Equip[equip_index].HeroForgeModel;
|
||||||
eq_cse->Equip[equip_index].Material2 = emu_cse->Equip[equip_index].Material2;
|
eq_cse->Equip[equip_index].Material2 = emu_cse->Equip[equip_index].Material2;
|
||||||
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
|
eq_cse->Equip[equip_index].Color = emu_cse->Equip[equip_index].Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq_cse->Unknown15 = emu_cse->Unknown15;
|
eq_cse->Unknown15 = emu_cse->Unknown15;
|
||||||
@@ -4083,24 +4096,24 @@ namespace RoF
|
|||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
||||||
{
|
{
|
||||||
for (k = 0; k < 9; ++k)
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; ++k)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->colors[k].Color);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment_tint.Slot[k].Color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
|
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
||||||
|
|
||||||
for (k = 0; k < 9; k++) {
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; k++) {
|
||||||
Equipment[k].Material = emu->equipment[k].Material;
|
Equipment[k].Material = emu->equipment.Slot[k].Material;
|
||||||
Equipment[k].Unknown1 = emu->equipment[k].Unknown1;
|
Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
|
||||||
Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial;
|
Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
|
||||||
Equipment[k].HeroForgeModel = emu->equipment[k].HeroForgeModel;
|
Equipment[k].HeroForgeModel = emu->equipment.Slot[k].HeroForgeModel;
|
||||||
Equipment[k].Material2 = emu->equipment[k].Material2;
|
Equipment[k].Material2 = emu->equipment.Slot[k].Material2;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer += (sizeof(structs::EquipStruct) * 9);
|
Buffer += (sizeof(structs::Texture_Struct) * EQEmu::textures::TextureCount);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -4110,13 +4123,13 @@ namespace RoF
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::legacy::MaterialPrimary].Material);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Primary.Material);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::legacy::MaterialSecondary].Material);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Secondary.Material);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
@@ -4290,15 +4303,15 @@ namespace RoF
|
|||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct_Live);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Live);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
IN(entityid);
|
IN(entityid);
|
||||||
//IN(slot);
|
IN(buff.effect_type);
|
||||||
IN(level);
|
IN(buff.level);
|
||||||
IN(effect);
|
IN(buff.unknown003);
|
||||||
IN(spellid);
|
IN(buff.spellid);
|
||||||
IN(duration);
|
IN(buff.duration);
|
||||||
IN(slotid);
|
IN(slotid);
|
||||||
IN(bufffade);
|
IN(bufffade);
|
||||||
|
|
||||||
@@ -4324,10 +4337,7 @@ namespace RoF
|
|||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
||||||
|
|
||||||
if (eq->slot == 13)
|
emu->slot = static_cast<uint32>(RoFToServerCastingSlot(static_cast<CastingSlot>(eq->slot)));
|
||||||
emu->slot = 10;
|
|
||||||
else
|
|
||||||
IN(slot);
|
|
||||||
|
|
||||||
IN(spell_id);
|
IN(spell_id);
|
||||||
emu->inventoryslot = RoFToServerSlot(eq->inventory_slot);
|
emu->inventoryslot = RoFToServerSlot(eq->inventory_slot);
|
||||||
@@ -5201,7 +5211,7 @@ namespace RoF
|
|||||||
|
|
||||||
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
||||||
{
|
{
|
||||||
const EQEmu::Item_Struct *item = inst->GetUnscaledItem();
|
const EQEmu::ItemBase *item = inst->GetUnscaledItem();
|
||||||
|
|
||||||
RoF::structs::ItemSerializationHeader hdr;
|
RoF::structs::ItemSerializationHeader hdr;
|
||||||
|
|
||||||
@@ -5209,7 +5219,7 @@ namespace RoF
|
|||||||
|
|
||||||
snprintf(hdr.unknown000, sizeof(hdr.unknown000), "%016d", item->ID);
|
snprintf(hdr.unknown000, sizeof(hdr.unknown000), "%016d", item->ID);
|
||||||
|
|
||||||
hdr.stacksize = (inst->IsStackable() ? ((inst->GetCharges() > 254) ? 0xFFFFFFFF : inst->GetCharges()) : 1);
|
hdr.stacksize = (inst->IsStackable() ? ((inst->GetCharges() > 1000) ? 0xFFFFFFFF : inst->GetCharges()) : 1);
|
||||||
hdr.unknown004 = 0;
|
hdr.unknown004 = 0;
|
||||||
|
|
||||||
structs::InventorySlot_Struct slot_id = ServerToRoFSlot(slot_id_in);
|
structs::InventorySlot_Struct slot_id = ServerToRoFSlot(slot_id_in);
|
||||||
@@ -5641,11 +5651,11 @@ namespace RoF
|
|||||||
{
|
{
|
||||||
structs::InventorySlot_Struct RoFSlot;
|
structs::InventorySlot_Struct RoFSlot;
|
||||||
RoFSlot.Type = INVALID_INDEX;
|
RoFSlot.Type = INVALID_INDEX;
|
||||||
RoFSlot.Unknown02 = NOT_USED;
|
RoFSlot.Unknown02 = 0;
|
||||||
RoFSlot.Slot = INVALID_INDEX;
|
RoFSlot.Slot = INVALID_INDEX;
|
||||||
RoFSlot.SubIndex = INVALID_INDEX;
|
RoFSlot.SubIndex = INVALID_INDEX;
|
||||||
RoFSlot.AugIndex = INVALID_INDEX;
|
RoFSlot.AugIndex = INVALID_INDEX;
|
||||||
RoFSlot.Unknown01 = NOT_USED;
|
RoFSlot.Unknown01 = 0;
|
||||||
|
|
||||||
uint32 TempSlot = 0;
|
uint32 TempSlot = 0;
|
||||||
|
|
||||||
@@ -5746,7 +5756,7 @@ namespace RoF
|
|||||||
RoFSlot.Slot = INVALID_INDEX;
|
RoFSlot.Slot = INVALID_INDEX;
|
||||||
RoFSlot.SubIndex = INVALID_INDEX;
|
RoFSlot.SubIndex = INVALID_INDEX;
|
||||||
RoFSlot.AugIndex = INVALID_INDEX;
|
RoFSlot.AugIndex = INVALID_INDEX;
|
||||||
RoFSlot.Unknown01 = NOT_USED;
|
RoFSlot.Unknown01 = 0;
|
||||||
|
|
||||||
uint32 TempSlot = 0;
|
uint32 TempSlot = 0;
|
||||||
|
|
||||||
@@ -5999,4 +6009,80 @@ namespace RoF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToRoFCastingSlot(EQEmu::CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case EQEmu::CastingSlot::Gem1:
|
||||||
|
return CastingSlot::Gem1;
|
||||||
|
case EQEmu::CastingSlot::Gem2:
|
||||||
|
return CastingSlot::Gem2;
|
||||||
|
case EQEmu::CastingSlot::Gem3:
|
||||||
|
return CastingSlot::Gem3;
|
||||||
|
case EQEmu::CastingSlot::Gem4:
|
||||||
|
return CastingSlot::Gem4;
|
||||||
|
case EQEmu::CastingSlot::Gem5:
|
||||||
|
return CastingSlot::Gem5;
|
||||||
|
case EQEmu::CastingSlot::Gem6:
|
||||||
|
return CastingSlot::Gem6;
|
||||||
|
case EQEmu::CastingSlot::Gem7:
|
||||||
|
return CastingSlot::Gem7;
|
||||||
|
case EQEmu::CastingSlot::Gem8:
|
||||||
|
return CastingSlot::Gem8;
|
||||||
|
case EQEmu::CastingSlot::Gem9:
|
||||||
|
return CastingSlot::Gem9;
|
||||||
|
case EQEmu::CastingSlot::Gem10:
|
||||||
|
return CastingSlot::Gem10;
|
||||||
|
case EQEmu::CastingSlot::Gem11:
|
||||||
|
return CastingSlot::Gem11;
|
||||||
|
case EQEmu::CastingSlot::Gem12:
|
||||||
|
return CastingSlot::Gem12;
|
||||||
|
case EQEmu::CastingSlot::Item:
|
||||||
|
case EQEmu::CastingSlot::PotionBelt:
|
||||||
|
return CastingSlot::Item;
|
||||||
|
case EQEmu::CastingSlot::Discipline:
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
case EQEmu::CastingSlot::AltAbility:
|
||||||
|
return CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline EQEmu::CastingSlot RoFToServerCastingSlot(CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case CastingSlot::Gem1:
|
||||||
|
return EQEmu::CastingSlot::Gem1;
|
||||||
|
case CastingSlot::Gem2:
|
||||||
|
return EQEmu::CastingSlot::Gem2;
|
||||||
|
case CastingSlot::Gem3:
|
||||||
|
return EQEmu::CastingSlot::Gem3;
|
||||||
|
case CastingSlot::Gem4:
|
||||||
|
return EQEmu::CastingSlot::Gem4;
|
||||||
|
case CastingSlot::Gem5:
|
||||||
|
return EQEmu::CastingSlot::Gem5;
|
||||||
|
case CastingSlot::Gem6:
|
||||||
|
return EQEmu::CastingSlot::Gem6;
|
||||||
|
case CastingSlot::Gem7:
|
||||||
|
return EQEmu::CastingSlot::Gem7;
|
||||||
|
case CastingSlot::Gem8:
|
||||||
|
return EQEmu::CastingSlot::Gem8;
|
||||||
|
case CastingSlot::Gem9:
|
||||||
|
return EQEmu::CastingSlot::Gem9;
|
||||||
|
case CastingSlot::Gem10:
|
||||||
|
return EQEmu::CastingSlot::Gem10;
|
||||||
|
case CastingSlot::Gem11:
|
||||||
|
return EQEmu::CastingSlot::Gem11;
|
||||||
|
case CastingSlot::Gem12:
|
||||||
|
return EQEmu::CastingSlot::Gem12;
|
||||||
|
case CastingSlot::Discipline:
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
case CastingSlot::Item:
|
||||||
|
return EQEmu::CastingSlot::Item;
|
||||||
|
case CastingSlot::AltAbility:
|
||||||
|
return EQEmu::CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
} /*RoF*/
|
} /*RoF*/
|
||||||
|
|||||||
@@ -50,6 +50,24 @@ namespace RoF
|
|||||||
#include "rof_ops.h"
|
#include "rof_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CastingSlot : uint32 {
|
||||||
|
Gem1 = 0,
|
||||||
|
Gem2 = 1,
|
||||||
|
Gem3 = 2,
|
||||||
|
Gem4 = 3,
|
||||||
|
Gem5 = 4,
|
||||||
|
Gem6 = 5,
|
||||||
|
Gem7 = 6,
|
||||||
|
Gem8 = 7,
|
||||||
|
Gem9 = 8,
|
||||||
|
Gem10 = 9,
|
||||||
|
Gem11 = 10,
|
||||||
|
Gem12 = 11,
|
||||||
|
Item = 12,
|
||||||
|
Discipline = 13,
|
||||||
|
AltAbility = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
}; /*RoF*/
|
}; /*RoF*/
|
||||||
|
|
||||||
#endif /*COMMON_ROF_H*/
|
#endif /*COMMON_ROF_H*/
|
||||||
|
|||||||
+181
-80
@@ -63,6 +63,9 @@ namespace RoF2
|
|||||||
// client to server text link converter
|
// client to server text link converter
|
||||||
static inline void RoF2ToServerTextLink(std::string& serverTextLink, const std::string& rof2TextLink);
|
static inline void RoF2ToServerTextLink(std::string& serverTextLink, const std::string& rof2TextLink);
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToRoF2CastingSlot(EQEmu::CastingSlot slot);
|
||||||
|
static inline EQEmu::CastingSlot RoF2ToServerCastingSlot(CastingSlot slot);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
{
|
{
|
||||||
//create our opcode manager if we havent already
|
//create our opcode manager if we havent already
|
||||||
@@ -84,7 +87,7 @@ namespace RoF2
|
|||||||
|
|
||||||
//ok, now we have what we need to register.
|
//ok, now we have what we need to register.
|
||||||
|
|
||||||
EQStream::Signature signature;
|
EQStreamInterface::Signature signature;
|
||||||
std::string pname;
|
std::string pname;
|
||||||
|
|
||||||
//register our world signature.
|
//register our world signature.
|
||||||
@@ -474,22 +477,34 @@ namespace RoF2
|
|||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_Buff)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Live);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
OUT(entityid);
|
OUT(entityid);
|
||||||
eq->unknown004 = 2;
|
OUT(buff.effect_type);
|
||||||
//eq->level = 80;
|
OUT(buff.level);
|
||||||
//eq->effect = 0;
|
// just so we're 100% sure we get a 1.0f ...
|
||||||
OUT(level);
|
eq->buff.bard_modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
|
||||||
OUT(effect);
|
OUT(buff.spellid);
|
||||||
eq->unknown007 = 0;
|
OUT(buff.duration);
|
||||||
eq->unknown008 = 1.0f;
|
OUT(buff.player_id);
|
||||||
OUT(spellid);
|
OUT(buff.num_hits);
|
||||||
OUT(duration);
|
OUT(buff.y);
|
||||||
eq->playerId = 0x7cde;
|
OUT(buff.x);
|
||||||
OUT(slotid);
|
OUT(buff.z);
|
||||||
OUT(num_hits);
|
uint16 buffslot = emu->slotid;
|
||||||
|
// Not sure if this is needs amending for RoF2 yet.
|
||||||
|
if (buffslot >= 25)
|
||||||
|
{
|
||||||
|
buffslot += 17;
|
||||||
|
}
|
||||||
|
// TODO: We should really just deal with these "server side"
|
||||||
|
// so we can have clients not limited to other clients.
|
||||||
|
// This fixes discs, songs were changed to 20
|
||||||
|
if (buffslot == 54)
|
||||||
|
buffslot = 62;
|
||||||
|
eq->slotid = buffslot;
|
||||||
|
// TODO: implement slot_data stuff
|
||||||
if (emu->bufffade == 1)
|
if (emu->bufffade == 1)
|
||||||
eq->bufffade = 1;
|
eq->bufffade = 1;
|
||||||
else
|
else
|
||||||
@@ -501,10 +516,10 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
outapp = new EQApplicationPacket(OP_BuffCreate, 29);
|
outapp = new EQApplicationPacket(OP_BuffCreate, 29);
|
||||||
outapp->WriteUInt32(emu->entityid);
|
outapp->WriteUInt32(emu->entityid);
|
||||||
outapp->WriteUInt32(0x0271); // Unk
|
outapp->WriteUInt32(0); // tic timer
|
||||||
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
|
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
|
||||||
outapp->WriteUInt16(1); // 1 buff in this packet
|
outapp->WriteUInt16(1); // 1 buff in this packet
|
||||||
outapp->WriteUInt32(emu->slotid);
|
outapp->WriteUInt32(buffslot);
|
||||||
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
|
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
|
||||||
outapp->WriteUInt32(0); // Duration
|
outapp->WriteUInt32(0); // Duration
|
||||||
outapp->WriteUInt32(0); // ?
|
outapp->WriteUInt32(0); // ?
|
||||||
@@ -534,16 +549,15 @@ namespace RoF2
|
|||||||
for (uint16 i = 0; i < emu->count; ++i)
|
for (uint16 i = 0; i < emu->count; ++i)
|
||||||
{
|
{
|
||||||
uint16 buffslot = emu->entries[i].buff_slot;
|
uint16 buffslot = emu->entries[i].buff_slot;
|
||||||
// Not sure if this is needs amending for RoF2 yet.
|
if (emu->type == 0) { // only correct for self packets
|
||||||
if (emu->entries[i].buff_slot >= 25)
|
if (emu->entries[i].buff_slot >= 25)
|
||||||
{
|
|
||||||
buffslot += 17;
|
buffslot += 17;
|
||||||
}
|
|
||||||
// TODO: We should really just deal with these "server side"
|
// TODO: We should really just deal with these "server side"
|
||||||
// so we can have clients not limited to other clients.
|
// so we can have clients not limited to other clients.
|
||||||
// This fixes discs, songs were changed to 20
|
// This fixes discs, songs were changed to 20
|
||||||
if (buffslot == 54)
|
if (buffslot == 54)
|
||||||
buffslot = 62;
|
buffslot = 62;
|
||||||
|
}
|
||||||
|
|
||||||
__packet->WriteUInt32(buffslot);
|
__packet->WriteUInt32(buffslot);
|
||||||
__packet->WriteUInt32(emu->entries[i].spell_id);
|
__packet->WriteUInt32(emu->entries[i].spell_id);
|
||||||
@@ -572,10 +586,7 @@ namespace RoF2
|
|||||||
ENCODE_LENGTH_EXACT(CastSpell_Struct);
|
ENCODE_LENGTH_EXACT(CastSpell_Struct);
|
||||||
SETUP_DIRECT_ENCODE(CastSpell_Struct, structs::CastSpell_Struct);
|
SETUP_DIRECT_ENCODE(CastSpell_Struct, structs::CastSpell_Struct);
|
||||||
|
|
||||||
if (emu->slot == 10)
|
eq->slot = static_cast<uint32>(ServerToRoF2CastingSlot(static_cast<EQEmu::CastingSlot>(emu->slot)));
|
||||||
eq->slot = 13;
|
|
||||||
else
|
|
||||||
OUT(slot);
|
|
||||||
|
|
||||||
OUT(spell_id);
|
OUT(spell_id);
|
||||||
eq->inventory_slot = ServerToRoF2Slot(emu->inventoryslot);
|
eq->inventory_slot = ServerToRoF2Slot(emu->inventoryslot);
|
||||||
@@ -1051,8 +1062,8 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->drop_id); // Some unique id
|
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->drop_id); // Some unique id
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Same for all objects in the zone
|
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Same for all objects in the zone
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->heading);
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->heading);
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); // X tilt
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->tilt_x); // X tilt
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); // Y tilt
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->tilt_y); // Y tilt
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt.
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt.
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y);
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y);
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x);
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x);
|
||||||
@@ -1689,7 +1700,8 @@ namespace RoF2
|
|||||||
OUT(new_mana);
|
OUT(new_mana);
|
||||||
OUT(stamina);
|
OUT(stamina);
|
||||||
OUT(spell_id);
|
OUT(spell_id);
|
||||||
eq->unknown16 = -1; // Self Interrupt/Success = -1, Fizzle = 1, Other Interrupt = 2?
|
OUT(keepcasting);
|
||||||
|
eq->slot = -1; // this is spell gem slot. It's -1 in normal operation
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -2087,18 +2099,18 @@ namespace RoF2
|
|||||||
__packet->WriteUInt8(1); // 1 indicates all buffs on the pet (0 to add or remove a single buff)
|
__packet->WriteUInt8(1); // 1 indicates all buffs on the pet (0 to add or remove a single buff)
|
||||||
__packet->WriteUInt16(emu->buffcount);
|
__packet->WriteUInt16(emu->buffcount);
|
||||||
|
|
||||||
for (uint16 i = 0; i < BUFF_COUNT; ++i)
|
for (uint16 i = 0; i < PET_BUFF_COUNT; ++i)
|
||||||
{
|
{
|
||||||
if (emu->spellid[i])
|
if (emu->spellid[i])
|
||||||
{
|
{
|
||||||
__packet->WriteUInt32(i);
|
__packet->WriteUInt32(i);
|
||||||
__packet->WriteUInt32(emu->spellid[i]);
|
__packet->WriteUInt32(emu->spellid[i]);
|
||||||
__packet->WriteUInt32(emu->ticsremaining[i]);
|
__packet->WriteUInt32(emu->ticsremaining[i]);
|
||||||
__packet->WriteUInt32(0); // Unknown
|
__packet->WriteUInt32(0); // num hits
|
||||||
__packet->WriteString("");
|
__packet->WriteString("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__packet->WriteUInt8(0); // Unknown
|
__packet->WriteUInt8(0); // some sort of type
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -2152,9 +2164,9 @@ namespace RoF2
|
|||||||
|
|
||||||
outapp->WriteUInt32(22); // Equipment count
|
outapp->WriteUInt32(22); // Equipment count
|
||||||
|
|
||||||
for (int r = 0; r < 9; r++)
|
for (int r = EQEmu::textures::TextureBegin; r < EQEmu::textures::TextureCount; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(emu->item_material[r]);
|
outapp->WriteUInt32(emu->item_material.Slot[r].Material);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
@@ -2172,9 +2184,9 @@ namespace RoF2
|
|||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(9); // Equipment2 count
|
outapp->WriteUInt32(EQEmu::textures::TextureCount); // Equipment2 count
|
||||||
|
|
||||||
for (int r = 0; r < 9; r++)
|
for (int r = EQEmu::textures::TextureBegin; r < EQEmu::textures::TextureCount; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
@@ -2183,21 +2195,21 @@ namespace RoF2
|
|||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(9); // Tint Count
|
outapp->WriteUInt32(EQEmu::textures::TextureCount); // Tint Count
|
||||||
|
|
||||||
for (int r = 0; r < 7; r++)
|
for (int r = 0; r < 7; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(emu->item_tint[r].Color);
|
outapp->WriteUInt32(emu->item_tint.Slot[r].Color);
|
||||||
}
|
}
|
||||||
// Write zeroes for extra two tint values
|
// Write zeroes for extra two tint values
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
|
|
||||||
outapp->WriteUInt32(9); // Tint2 Count
|
outapp->WriteUInt32(EQEmu::textures::TextureCount); // Tint2 Count
|
||||||
|
|
||||||
for (int r = 0; r < 7; r++)
|
for (int r = 0; r < 7; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(emu->item_tint[r].Color);
|
outapp->WriteUInt32(emu->item_tint.Slot[r].Color);
|
||||||
}
|
}
|
||||||
// Write zeroes for extra two tint values
|
// Write zeroes for extra two tint values
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
@@ -2334,22 +2346,23 @@ namespace RoF2
|
|||||||
|
|
||||||
outapp->WriteUInt32(structs::MAX_PP_MEMSPELL); // Memorised spell slots
|
outapp->WriteUInt32(structs::MAX_PP_MEMSPELL); // Memorised spell slots
|
||||||
|
|
||||||
for (uint32 r = 0; r < MAX_PP_MEMSPELL; r++)
|
for (uint32 r = 0; r < MAX_PP_MEMSPELL; r++) // write first 12
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(emu->mem_spells[r]);
|
outapp->WriteUInt32(emu->mem_spells[r]);
|
||||||
}
|
}
|
||||||
// zeroes for the rest of the slots
|
// zeroes for the rest of the slots the other 4, which actually don't work on the client at all :D
|
||||||
for (uint32 r = 0; r < structs::MAX_PP_MEMSPELL - MAX_PP_MEMSPELL; r++)
|
for (uint32 r = 0; r < structs::MAX_PP_MEMSPELL - MAX_PP_MEMSPELL; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(0xFFFFFFFFU);
|
outapp->WriteUInt32(0xFFFFFFFFU);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(13); // Unknown count
|
outapp->WriteUInt32(13); // gem refresh counts
|
||||||
|
|
||||||
for (uint32 r = 0; r < 13; r++)
|
for (uint32 r = 0; r < MAX_PP_MEMSPELL; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(0); // Unknown
|
outapp->WriteUInt32(emu->spellSlotRefresh[r]); // spell gem refresh
|
||||||
}
|
}
|
||||||
|
outapp->WriteUInt32(0); // also refresh -- historically HT/LoH :P
|
||||||
|
|
||||||
outapp->WriteUInt8(0); // Unknown
|
outapp->WriteUInt8(0); // Unknown
|
||||||
|
|
||||||
@@ -2358,31 +2371,33 @@ namespace RoF2
|
|||||||
for (uint32 r = 0; r < BUFF_COUNT; r++)
|
for (uint32 r = 0; r < BUFF_COUNT; r++)
|
||||||
{
|
{
|
||||||
float instrument_mod = 0.0f;
|
float instrument_mod = 0.0f;
|
||||||
uint8 slotid = emu->buffs[r].slotid;
|
uint8 effect_type = emu->buffs[r].effect_type;
|
||||||
uint32 player_id = emu->buffs[r].player_id;;
|
uint32 player_id = emu->buffs[r].player_id;;
|
||||||
|
|
||||||
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
|
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
|
||||||
{
|
{
|
||||||
instrument_mod = 1.0f + (emu->buffs[r].bard_modifier - 10) / 10.0f;
|
instrument_mod = 1.0f + (emu->buffs[r].bard_modifier - 10) / 10.0f;
|
||||||
slotid = 2;
|
effect_type = 2;
|
||||||
player_id = 0x000717fd;
|
player_id = 0x000717fd;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
slotid = 0;
|
effect_type = 0;
|
||||||
}
|
}
|
||||||
outapp->WriteUInt8(0); // Had this as slot, but always appears to be 0 on live.
|
|
||||||
|
// this is different than the client struct for some reason :P
|
||||||
|
// missing a few things, shuffled around
|
||||||
|
outapp->WriteUInt8(0); // this is an unknown
|
||||||
outapp->WriteFloat(instrument_mod);
|
outapp->WriteFloat(instrument_mod);
|
||||||
outapp->WriteUInt32(player_id);
|
outapp->WriteUInt32(player_id);
|
||||||
outapp->WriteUInt8(0);
|
outapp->WriteUInt8(0);
|
||||||
outapp->WriteUInt32(emu->buffs[r].counters);
|
outapp->WriteUInt32(emu->buffs[r].counters);
|
||||||
//outapp->WriteUInt8(emu->buffs[r].bard_modifier);
|
|
||||||
outapp->WriteUInt32(emu->buffs[r].duration);
|
outapp->WriteUInt32(emu->buffs[r].duration);
|
||||||
outapp->WriteUInt8(emu->buffs[r].level);
|
outapp->WriteUInt8(emu->buffs[r].level);
|
||||||
outapp->WriteUInt32(emu->buffs[r].spellid);
|
outapp->WriteUInt32(emu->buffs[r].spellid);
|
||||||
outapp->WriteUInt32(slotid); // Only ever seen 2
|
outapp->WriteUInt8(effect_type); // Only ever seen 2
|
||||||
|
outapp->WriteUInt32(emu->buffs[r].num_hits);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
outapp->WriteUInt8(0);
|
|
||||||
outapp->WriteUInt32(emu->buffs[r].counters); // Appears twice ?
|
outapp->WriteUInt32(emu->buffs[r].counters); // Appears twice ?
|
||||||
|
|
||||||
for (uint32 j = 0; j < 44; ++j)
|
for (uint32 j = 0; j < 44; ++j)
|
||||||
@@ -3139,13 +3154,13 @@ namespace RoF2
|
|||||||
eq_cse->Gender = emu_cse->Gender;
|
eq_cse->Gender = emu_cse->Gender;
|
||||||
eq_cse->Face = emu_cse->Face;
|
eq_cse->Face = emu_cse->Face;
|
||||||
|
|
||||||
for (int equip_index = 0; equip_index < EQEmu::legacy::MaterialCount; equip_index++) {
|
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
|
||||||
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
||||||
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
||||||
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
||||||
eq_cse->Equip[equip_index].HeroForgeModel = emu_cse->Equip[equip_index].HeroForgeModel;
|
eq_cse->Equip[equip_index].HeroForgeModel = emu_cse->Equip[equip_index].HeroForgeModel;
|
||||||
eq_cse->Equip[equip_index].Material2 = emu_cse->Equip[equip_index].Material2;
|
eq_cse->Equip[equip_index].Material2 = emu_cse->Equip[equip_index].Material2;
|
||||||
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
|
eq_cse->Equip[equip_index].Color = emu_cse->Equip[equip_index].Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq_cse->Unknown15 = emu_cse->Unknown15;
|
eq_cse->Unknown15 = emu_cse->Unknown15;
|
||||||
@@ -4306,24 +4321,24 @@ namespace RoF2
|
|||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
||||||
{
|
{
|
||||||
for (k = 0; k < 9; ++k)
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; ++k)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->colors[k].Color);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment_tint.Slot[k].Color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
|
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
||||||
|
|
||||||
for (k = 0; k < 9; k++) {
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; k++) {
|
||||||
Equipment[k].Material = emu->equipment[k].Material;
|
Equipment[k].Material = emu->equipment.Slot[k].Material;
|
||||||
Equipment[k].Unknown1 = emu->equipment[k].Unknown1;
|
Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
|
||||||
Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial;
|
Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
|
||||||
Equipment[k].HeroForgeModel = emu->equipment[k].HeroForgeModel;
|
Equipment[k].HeroForgeModel = emu->equipment.Slot[k].HeroForgeModel;
|
||||||
Equipment[k].Material2 = emu->equipment[k].Material2;
|
Equipment[k].Material2 = emu->equipment.Slot[k].Material2;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer += (sizeof(structs::EquipStruct) * 9);
|
Buffer += (sizeof(structs::Texture_Struct) * EQEmu::textures::TextureCount);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -4333,13 +4348,13 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::legacy::MaterialPrimary].Material);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Primary.Material);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::legacy::MaterialSecondary].Material);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Secondary.Material);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
@@ -4389,6 +4404,19 @@ namespace RoF2
|
|||||||
delete in;
|
delete in;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_CrystalCountUpdate)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(CrystalCountUpdate_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(CrystalCountUpdate_Struct, structs::CrystalCountUpdate_Struct);
|
||||||
|
|
||||||
|
OUT(CurrentRadiantCrystals);
|
||||||
|
OUT(CareerRadiantCrystals);
|
||||||
|
OUT(CurrentEbonCrystals);
|
||||||
|
OUT(CareerEbonCrystals);
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
// DECODE methods
|
// DECODE methods
|
||||||
|
|
||||||
DECODE(OP_AdventureMerchantSell)
|
DECODE(OP_AdventureMerchantSell)
|
||||||
@@ -4513,15 +4541,15 @@ namespace RoF2
|
|||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct_Live);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Live);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
IN(entityid);
|
IN(entityid);
|
||||||
//IN(slot);
|
IN(buff.effect_type);
|
||||||
IN(level);
|
IN(buff.level);
|
||||||
IN(effect);
|
IN(buff.unknown003);
|
||||||
IN(spellid);
|
IN(buff.spellid);
|
||||||
IN(duration);
|
IN(buff.duration);
|
||||||
IN(slotid);
|
IN(slotid);
|
||||||
IN(bufffade);
|
IN(bufffade);
|
||||||
|
|
||||||
@@ -4547,10 +4575,7 @@ namespace RoF2
|
|||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
||||||
|
|
||||||
if (eq->slot == 13)
|
emu->slot = static_cast<uint32>(RoF2ToServerCastingSlot(static_cast<CastingSlot>(eq->slot)));
|
||||||
emu->slot = 10;
|
|
||||||
else
|
|
||||||
IN(slot);
|
|
||||||
|
|
||||||
IN(spell_id);
|
IN(spell_id);
|
||||||
emu->inventoryslot = RoF2ToServerSlot(eq->inventory_slot);
|
emu->inventoryslot = RoF2ToServerSlot(eq->inventory_slot);
|
||||||
@@ -5476,7 +5501,7 @@ namespace RoF2
|
|||||||
|
|
||||||
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth, ItemPacketType packet_type)
|
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth, ItemPacketType packet_type)
|
||||||
{
|
{
|
||||||
const EQEmu::Item_Struct *item = inst->GetUnscaledItem();
|
const EQEmu::ItemBase *item = inst->GetUnscaledItem();
|
||||||
|
|
||||||
RoF2::structs::ItemSerializationHeader hdr;
|
RoF2::structs::ItemSerializationHeader hdr;
|
||||||
|
|
||||||
@@ -5484,7 +5509,7 @@ namespace RoF2
|
|||||||
|
|
||||||
snprintf(hdr.unknown000, sizeof(hdr.unknown000), "%016d", item->ID);
|
snprintf(hdr.unknown000, sizeof(hdr.unknown000), "%016d", item->ID);
|
||||||
|
|
||||||
hdr.stacksize = (inst->IsStackable() ? ((inst->GetCharges() > 254) ? 0xFFFFFFFF : inst->GetCharges()) : 1);
|
hdr.stacksize = (inst->IsStackable() ? ((inst->GetCharges() > 1000) ? 0xFFFFFFFF : inst->GetCharges()) : 1);
|
||||||
hdr.unknown004 = 0;
|
hdr.unknown004 = 0;
|
||||||
|
|
||||||
structs::InventorySlot_Struct slot_id = ServerToRoF2Slot(slot_id_in, packet_type);
|
structs::InventorySlot_Struct slot_id = ServerToRoF2Slot(slot_id_in, packet_type);
|
||||||
@@ -5926,11 +5951,11 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
structs::InventorySlot_Struct RoF2Slot;
|
structs::InventorySlot_Struct RoF2Slot;
|
||||||
RoF2Slot.Type = INVALID_INDEX;
|
RoF2Slot.Type = INVALID_INDEX;
|
||||||
RoF2Slot.Unknown02 = NOT_USED;
|
RoF2Slot.Unknown02 = 0;
|
||||||
RoF2Slot.Slot = INVALID_INDEX;
|
RoF2Slot.Slot = INVALID_INDEX;
|
||||||
RoF2Slot.SubIndex = INVALID_INDEX;
|
RoF2Slot.SubIndex = INVALID_INDEX;
|
||||||
RoF2Slot.AugIndex = INVALID_INDEX;
|
RoF2Slot.AugIndex = INVALID_INDEX;
|
||||||
RoF2Slot.Unknown01 = NOT_USED;
|
RoF2Slot.Unknown01 = 0;
|
||||||
|
|
||||||
uint32 TempSlot = 0;
|
uint32 TempSlot = 0;
|
||||||
|
|
||||||
@@ -6039,7 +6064,7 @@ namespace RoF2
|
|||||||
RoF2Slot.Slot = INVALID_INDEX;
|
RoF2Slot.Slot = INVALID_INDEX;
|
||||||
RoF2Slot.SubIndex = INVALID_INDEX;
|
RoF2Slot.SubIndex = INVALID_INDEX;
|
||||||
RoF2Slot.AugIndex = INVALID_INDEX;
|
RoF2Slot.AugIndex = INVALID_INDEX;
|
||||||
RoF2Slot.Unknown01 = NOT_USED;
|
RoF2Slot.Unknown01 = 0;
|
||||||
|
|
||||||
uint32 TempSlot = 0;
|
uint32 TempSlot = 0;
|
||||||
|
|
||||||
@@ -6287,4 +6312,80 @@ namespace RoF2
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToRoF2CastingSlot(EQEmu::CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case EQEmu::CastingSlot::Gem1:
|
||||||
|
return CastingSlot::Gem1;
|
||||||
|
case EQEmu::CastingSlot::Gem2:
|
||||||
|
return CastingSlot::Gem2;
|
||||||
|
case EQEmu::CastingSlot::Gem3:
|
||||||
|
return CastingSlot::Gem3;
|
||||||
|
case EQEmu::CastingSlot::Gem4:
|
||||||
|
return CastingSlot::Gem4;
|
||||||
|
case EQEmu::CastingSlot::Gem5:
|
||||||
|
return CastingSlot::Gem5;
|
||||||
|
case EQEmu::CastingSlot::Gem6:
|
||||||
|
return CastingSlot::Gem6;
|
||||||
|
case EQEmu::CastingSlot::Gem7:
|
||||||
|
return CastingSlot::Gem7;
|
||||||
|
case EQEmu::CastingSlot::Gem8:
|
||||||
|
return CastingSlot::Gem8;
|
||||||
|
case EQEmu::CastingSlot::Gem9:
|
||||||
|
return CastingSlot::Gem9;
|
||||||
|
case EQEmu::CastingSlot::Gem10:
|
||||||
|
return CastingSlot::Gem10;
|
||||||
|
case EQEmu::CastingSlot::Gem11:
|
||||||
|
return CastingSlot::Gem11;
|
||||||
|
case EQEmu::CastingSlot::Gem12:
|
||||||
|
return CastingSlot::Gem12;
|
||||||
|
case EQEmu::CastingSlot::Item:
|
||||||
|
case EQEmu::CastingSlot::PotionBelt:
|
||||||
|
return CastingSlot::Item;
|
||||||
|
case EQEmu::CastingSlot::Discipline:
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
case EQEmu::CastingSlot::AltAbility:
|
||||||
|
return CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline EQEmu::CastingSlot RoF2ToServerCastingSlot(CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case CastingSlot::Gem1:
|
||||||
|
return EQEmu::CastingSlot::Gem1;
|
||||||
|
case CastingSlot::Gem2:
|
||||||
|
return EQEmu::CastingSlot::Gem2;
|
||||||
|
case CastingSlot::Gem3:
|
||||||
|
return EQEmu::CastingSlot::Gem3;
|
||||||
|
case CastingSlot::Gem4:
|
||||||
|
return EQEmu::CastingSlot::Gem4;
|
||||||
|
case CastingSlot::Gem5:
|
||||||
|
return EQEmu::CastingSlot::Gem5;
|
||||||
|
case CastingSlot::Gem6:
|
||||||
|
return EQEmu::CastingSlot::Gem6;
|
||||||
|
case CastingSlot::Gem7:
|
||||||
|
return EQEmu::CastingSlot::Gem7;
|
||||||
|
case CastingSlot::Gem8:
|
||||||
|
return EQEmu::CastingSlot::Gem8;
|
||||||
|
case CastingSlot::Gem9:
|
||||||
|
return EQEmu::CastingSlot::Gem9;
|
||||||
|
case CastingSlot::Gem10:
|
||||||
|
return EQEmu::CastingSlot::Gem10;
|
||||||
|
case CastingSlot::Gem11:
|
||||||
|
return EQEmu::CastingSlot::Gem11;
|
||||||
|
case CastingSlot::Gem12:
|
||||||
|
return EQEmu::CastingSlot::Gem12;
|
||||||
|
case CastingSlot::Discipline:
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
case CastingSlot::Item:
|
||||||
|
return EQEmu::CastingSlot::Item;
|
||||||
|
case CastingSlot::AltAbility:
|
||||||
|
return EQEmu::CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
} /*RoF2*/
|
} /*RoF2*/
|
||||||
|
|||||||
@@ -50,6 +50,24 @@ namespace RoF2
|
|||||||
#include "rof2_ops.h"
|
#include "rof2_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CastingSlot : uint32 {
|
||||||
|
Gem1 = 0,
|
||||||
|
Gem2 = 1,
|
||||||
|
Gem3 = 2,
|
||||||
|
Gem4 = 3,
|
||||||
|
Gem5 = 4,
|
||||||
|
Gem6 = 5,
|
||||||
|
Gem7 = 6,
|
||||||
|
Gem8 = 7,
|
||||||
|
Gem9 = 8,
|
||||||
|
Gem10 = 9,
|
||||||
|
Gem11 = 10,
|
||||||
|
Gem12 = 11,
|
||||||
|
Item = 12,
|
||||||
|
Discipline = 13,
|
||||||
|
AltAbility = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
}; /*RoF2*/
|
}; /*RoF2*/
|
||||||
|
|
||||||
#endif /*COMMON_ROF2_H*/
|
#endif /*COMMON_ROF2_H*/
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "../string_util.h"
|
#include "../string_util.h"
|
||||||
|
|
||||||
|
|
||||||
size_t RoF2::invtype::InvTypeSize(int inv_type)
|
size_t RoF2::invtype::GetInvTypeSize(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypePossessions:
|
case invtype::InvTypePossessions:
|
||||||
@@ -80,7 +80,7 @@ size_t RoF2::invtype::InvTypeSize(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF2::invtype::InvTypeName(int inv_type)
|
const char* RoF2::invtype::GetInvTypeName(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypeInvalid:
|
case invtype::InvTypeInvalid:
|
||||||
@@ -140,7 +140,25 @@ const char* RoF2::invtype::InvTypeName(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF2::invslot::InvPossessionsSlotName(int inv_slot)
|
bool RoF2::invtype::IsInvTypePersistent(int inv_type)
|
||||||
|
{
|
||||||
|
switch (inv_type) {
|
||||||
|
case invtype::InvTypePossessions:
|
||||||
|
case invtype::InvTypeBank:
|
||||||
|
case invtype::InvTypeSharedBank:
|
||||||
|
case invtype::InvTypeTrade:
|
||||||
|
case invtype::InvTypeWorld:
|
||||||
|
case invtype::InvTypeLimbo:
|
||||||
|
case invtype::InvTypeTribute:
|
||||||
|
case invtype::InvTypeTrophyTribute:
|
||||||
|
case invtype::InvTypeGuildTribute:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* RoF2::invslot::GetInvPossessionsSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
switch (inv_slot) {
|
switch (inv_slot) {
|
||||||
case invslot::InvSlotInvalid:
|
case invslot::InvSlotInvalid:
|
||||||
@@ -218,12 +236,12 @@ const char* RoF2::invslot::InvPossessionsSlotName(int inv_slot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF2::invslot::InvSlotName(int inv_type, int inv_slot)
|
const char* RoF2::invslot::GetInvSlotName(int inv_type, int inv_slot)
|
||||||
{
|
{
|
||||||
if (inv_type == invtype::InvTypePossessions)
|
if (inv_type == invtype::InvTypePossessions)
|
||||||
return invslot::InvPossessionsSlotName(inv_slot);
|
return invslot::GetInvPossessionsSlotName(inv_slot);
|
||||||
|
|
||||||
size_t type_size = invtype::InvTypeSize(inv_type);
|
size_t type_size = invtype::GetInvTypeSize(inv_type);
|
||||||
|
|
||||||
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
@@ -237,7 +255,7 @@ const char* RoF2::invslot::InvSlotName(int inv_type, int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF2::invbag::InvBagIndexName(int bag_index)
|
const char* RoF2::invbag::GetInvBagIndexName(int bag_index)
|
||||||
{
|
{
|
||||||
if (bag_index == invbag::InvBagInvalid)
|
if (bag_index == invbag::InvBagInvalid)
|
||||||
return "Invalid Bag";
|
return "Invalid Bag";
|
||||||
@@ -251,7 +269,7 @@ const char* RoF2::invbag::InvBagIndexName(int bag_index)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF2::invaug::InvAugIndexName(int aug_index)
|
const char* RoF2::invaug::GetInvAugIndexName(int aug_index)
|
||||||
{
|
{
|
||||||
if (aug_index == invaug::InvAugInvalid)
|
if (aug_index == invaug::InvAugInvalid)
|
||||||
return "Invalid Augment";
|
return "Invalid Augment";
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
#define COMMON_ROF2_LIMITS_H
|
#define COMMON_ROF2_LIMITS_H
|
||||||
|
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
#include "../client_version.h"
|
#include "../emu_versions.h"
|
||||||
#include "../skills.h"
|
#include "../skills.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -32,8 +32,13 @@ namespace RoF2
|
|||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
// pre-declarations
|
// pre-declarations
|
||||||
|
namespace inventory {
|
||||||
|
inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
inline EQEmu::versions::ClientVersion InvTypeRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
||||||
|
|
||||||
@@ -69,7 +74,7 @@ namespace RoF2
|
|||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
namespace invslot {
|
namespace invslot {
|
||||||
inline EQEmu::versions::ClientVersion InvSlotRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
||||||
|
|
||||||
@@ -122,21 +127,21 @@ namespace RoF2
|
|||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
inline EQEmu::versions::ClientVersion InvBagRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
enum : int { InvBagInvalid = -1, InvBagBegin };
|
enum : int { InvBagInvalid = -1, InvBagBegin };
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
inline EQEmu::versions::ClientVersion InvAugRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
enum : int { InvAugInvalid = -1, InvAugBegin };
|
enum : int { InvAugInvalid = -1, InvAugBegin };
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
namespace item {
|
namespace item {
|
||||||
inline EQEmu::versions::ClientVersion ItemRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
//enum Unknown : int { // looks like item class..but, RoF has it too - nothing in UF-
|
//enum Unknown : int { // looks like item class..but, RoF has it too - nothing in UF-
|
||||||
// Unknown1 = 0,
|
// Unknown1 = 0,
|
||||||
@@ -165,27 +170,37 @@ namespace RoF2
|
|||||||
} /*item*/
|
} /*item*/
|
||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
inline EQEmu::versions::ClientVersion ProfileRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
} /*profile*/
|
} /*profile*/
|
||||||
|
|
||||||
namespace constants {
|
namespace constants {
|
||||||
inline EQEmu::versions::ClientVersion ConstantsRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
inline EQEmu::versions::ClientVersion BehaviorRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|
||||||
namespace skills {
|
namespace skills {
|
||||||
inline EQEmu::versions::ClientVersion SkillsRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::RoF2; }
|
||||||
|
|
||||||
} /*skills*/
|
} /*skills*/
|
||||||
|
|
||||||
|
|
||||||
// declarations
|
// declarations
|
||||||
|
namespace inventory {
|
||||||
|
const bool ConcatenateInvTypeLimbo = false;
|
||||||
|
|
||||||
|
const bool AllowOverLevelEquipment = true;
|
||||||
|
|
||||||
|
const bool AllowEmptyBagInBag = true;
|
||||||
|
const bool AllowClickCastFromBag = true;
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
||||||
const size_t InvTypeBankSize = 24;
|
const size_t InvTypeBankSize = 24;
|
||||||
@@ -195,7 +210,7 @@ namespace RoF2
|
|||||||
const size_t InvTypeLimboSize = 36;
|
const size_t InvTypeLimboSize = 36;
|
||||||
const size_t InvTypeTributeSize = 5;
|
const size_t InvTypeTributeSize = 5;
|
||||||
const size_t InvTypeTrophyTributeSize = 0;//unknown
|
const size_t InvTypeTrophyTributeSize = 0;//unknown
|
||||||
const size_t InvTypeGuildTributeSize = 0;//unknown
|
const size_t InvTypeGuildTributeSize = 2;//unverified
|
||||||
const size_t InvTypeMerchantSize = 200;
|
const size_t InvTypeMerchantSize = 200;
|
||||||
const size_t InvTypeDeletedSize = 0;//unknown - "Recovery Tab"
|
const size_t InvTypeDeletedSize = 0;//unknown - "Recovery Tab"
|
||||||
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
||||||
@@ -213,30 +228,30 @@ namespace RoF2
|
|||||||
const size_t InvTypeKronoSize = 0;//unknown
|
const size_t InvTypeKronoSize = 0;//unknown
|
||||||
const size_t InvTypeOtherSize = 0;//unknown
|
const size_t InvTypeOtherSize = 0;//unknown
|
||||||
|
|
||||||
const size_t NPCTradeSize = 4;
|
extern size_t GetInvTypeSize(int inv_type);
|
||||||
|
extern const char* GetInvTypeName(int inv_type);
|
||||||
|
|
||||||
extern size_t InvTypeSize(int inv_type);
|
extern bool IsInvTypePersistent(int inv_type);
|
||||||
extern const char* InvTypeName(int inv_type);
|
|
||||||
|
|
||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
namespace invslot {
|
namespace invslot {
|
||||||
extern const char* InvPossessionsSlotName(int inv_slot);
|
extern const char* GetInvPossessionsSlotName(int inv_slot);
|
||||||
extern const char* InvSlotName(int inv_type, int inv_slot);
|
extern const char* GetInvSlotName(int inv_type, int inv_slot);
|
||||||
|
|
||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
const size_t ItemBagSize = 255; // server Size will be 255..unsure what actual client is (test)
|
const size_t ItemBagSize = 255; // server Size will be 255..unsure what actual client is (test)
|
||||||
|
|
||||||
extern const char* InvBagIndexName(int bag_index);
|
extern const char* GetInvBagIndexName(int bag_index);
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
const size_t ItemAugSize = 6;
|
const size_t ItemAugSize = 6;
|
||||||
|
|
||||||
extern const char* InvAugIndexName(int aug_index);
|
extern const char* GetInvAugIndexName(int aug_index);
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
@@ -246,6 +261,7 @@ namespace RoF2
|
|||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
const size_t TributeSize = invtype::InvTypeTributeSize;
|
const size_t TributeSize = invtype::InvTypeTributeSize;
|
||||||
|
const size_t GuildTributeSize = invtype::InvTypeGuildTributeSize;
|
||||||
|
|
||||||
const size_t BandoliersSize = 20; // number of bandolier instances
|
const size_t BandoliersSize = 20; // number of bandolier instances
|
||||||
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
||||||
@@ -264,13 +280,6 @@ namespace RoF2
|
|||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
const bool ConcatenateInvTypeLimbo = false;
|
|
||||||
|
|
||||||
const bool AllowOverLevelEquipment = true;
|
|
||||||
|
|
||||||
const bool AllowEmptyBagInBag = true;
|
|
||||||
const bool AllowClickCastFromBag = true;
|
|
||||||
|
|
||||||
const bool CoinHasWeight = false;
|
const bool CoinHasWeight = false;
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ E(OP_ZoneEntry)
|
|||||||
E(OP_ZonePlayerToBind)
|
E(OP_ZonePlayerToBind)
|
||||||
E(OP_ZoneServerInfo)
|
E(OP_ZoneServerInfo)
|
||||||
E(OP_ZoneSpawns)
|
E(OP_ZoneSpawns)
|
||||||
|
E(OP_CrystalCountUpdate)
|
||||||
// Begin RoF Decodes
|
// Begin RoF Decodes
|
||||||
D(OP_AdventureMerchantSell)
|
D(OP_AdventureMerchantSell)
|
||||||
D(OP_AltCurrencySell)
|
D(OP_AltCurrencySell)
|
||||||
|
|||||||
+119
-154
@@ -163,7 +163,7 @@ struct AdventureInfo {
|
|||||||
** Merth: Gave struct a name so gcc 2.96 would compile
|
** Merth: Gave struct a name so gcc 2.96 would compile
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
struct Color_Struct
|
struct Tint_Struct
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
@@ -171,21 +171,65 @@ struct Color_Struct
|
|||||||
uint8 Green;
|
uint8 Green;
|
||||||
uint8 Red;
|
uint8 Red;
|
||||||
uint8 UseTint; // if there's a tint this is FF
|
uint8 UseTint; // if there's a tint this is FF
|
||||||
} RGB;
|
};
|
||||||
uint32 Color;
|
uint32 Color;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CharSelectEquip
|
struct TintProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Tint_Struct Head;
|
||||||
|
Tint_Struct Chest;
|
||||||
|
Tint_Struct Arms;
|
||||||
|
Tint_Struct Wrist;
|
||||||
|
Tint_Struct Hands;
|
||||||
|
Tint_Struct Legs;
|
||||||
|
Tint_Struct Feet;
|
||||||
|
Tint_Struct Primary;
|
||||||
|
Tint_Struct Secondary;
|
||||||
|
};
|
||||||
|
Tint_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Visible equiptment.
|
||||||
|
* Size: 20 Octets
|
||||||
|
*/
|
||||||
|
struct Texture_Struct
|
||||||
{
|
{
|
||||||
uint32 Material;
|
uint32 Material;
|
||||||
uint32 Unknown1;
|
uint32 Unknown1;
|
||||||
uint32 EliteMaterial;
|
uint32 EliteMaterial;
|
||||||
uint32 HeroForgeModel;
|
uint32 HeroForgeModel;
|
||||||
uint32 Material2;
|
uint32 Material2; // Same as material?
|
||||||
Color_Struct Color;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Needs more research regarding new slots
|
||||||
|
//struct TextureProfile
|
||||||
|
//{
|
||||||
|
// union {
|
||||||
|
// struct {
|
||||||
|
// Texture_Struct Head;
|
||||||
|
// Texture_Struct Chest;
|
||||||
|
// Texture_Struct Arms;
|
||||||
|
// Texture_Struct Wrist;
|
||||||
|
// Texture_Struct Hands;
|
||||||
|
// Texture_Struct Legs;
|
||||||
|
// Texture_Struct Feet;
|
||||||
|
// Texture_Struct Primary;
|
||||||
|
// Texture_Struct Secondary;
|
||||||
|
// };
|
||||||
|
// Texture_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// TextureProfile();
|
||||||
|
//};
|
||||||
|
|
||||||
|
struct CharSelectEquip : Texture_Struct, Tint_Struct {};
|
||||||
|
|
||||||
struct CharacterSelectEntry_Struct
|
struct CharacterSelectEntry_Struct
|
||||||
{
|
{
|
||||||
/*0000*/ char Name[1]; // Name null terminated
|
/*0000*/ char Name[1]; // Name null terminated
|
||||||
@@ -231,21 +275,6 @@ struct CharacterSelect_Struct
|
|||||||
/*004*/ CharacterSelectEntry_Struct Entries[0];
|
/*004*/ CharacterSelectEntry_Struct Entries[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Visible equiptment.
|
|
||||||
* Size: 20 Octets
|
|
||||||
*/
|
|
||||||
struct EquipStruct
|
|
||||||
{
|
|
||||||
/*00*/ uint32 Material;
|
|
||||||
/*04*/ uint32 Unknown1;
|
|
||||||
/*08*/ uint32 EliteMaterial;
|
|
||||||
/*12*/ uint32 HeroForgeModel;
|
|
||||||
/*16*/ uint32 Material2; // Same as material?
|
|
||||||
/*20*/
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct Membership_Entry_Struct
|
struct Membership_Entry_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300
|
/*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300
|
||||||
@@ -447,39 +476,24 @@ struct Spawn_Struct
|
|||||||
/*0000*/ uint32 unknown18;
|
/*0000*/ uint32 unknown18;
|
||||||
/*0000*/ uint32 unknown19;
|
/*0000*/ uint32 unknown19;
|
||||||
Spawn_Struct_Position Position;
|
Spawn_Struct_Position Position;
|
||||||
/*0000*/ union
|
/*0000*/ TintProfile equipment_tint;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0000*/ Color_Struct color_helmet; // Color of helmet item
|
|
||||||
/*0000*/ Color_Struct color_chest; // Color of chest item
|
|
||||||
/*0000*/ Color_Struct color_arms; // Color of arms item
|
|
||||||
/*0000*/ Color_Struct color_bracers; // Color of bracers item
|
|
||||||
/*0000*/ Color_Struct color_hands; // Color of hands item
|
|
||||||
/*0000*/ Color_Struct color_legs; // Color of legs item
|
|
||||||
/*0000*/ Color_Struct color_feet; // Color of feet item
|
|
||||||
/*0000*/ Color_Struct color_primary; // Color of primary item
|
|
||||||
/*0000*/ Color_Struct color_secondary; // Color of secondary item
|
|
||||||
} equipment_colors;
|
|
||||||
/*0000*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
|
|
||||||
};
|
|
||||||
|
|
||||||
// skip these bytes if not a valid player race
|
// skip these bytes if not a valid player race
|
||||||
/*0000*/ union
|
/*0000*/ union
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
/*0000*/ Texture_Struct equip_helmet; // Equiptment: Helmet visual
|
||||||
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
/*0000*/ Texture_Struct equip_chest; // Equiptment: Chest visual
|
||||||
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
/*0000*/ Texture_Struct equip_arms; // Equiptment: Arms visual
|
||||||
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
/*0000*/ Texture_Struct equip_bracers; // Equiptment: Wrist visual
|
||||||
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
/*0000*/ Texture_Struct equip_hands; // Equiptment: Hands visual
|
||||||
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
/*0000*/ Texture_Struct equip_legs; // Equiptment: Legs visual
|
||||||
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
/*0000*/ Texture_Struct equip_feet; // Equiptment: Boots visual
|
||||||
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
|
/*0000*/ Texture_Struct equip_primary; // Equiptment: Main visual
|
||||||
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
/*0000*/ Texture_Struct equip_secondary; // Equiptment: Off visual
|
||||||
} equip;
|
} equip;
|
||||||
/*0000*/ EquipStruct equipment[9];
|
/*0000*/ Texture_Struct equipment[9];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
||||||
@@ -621,7 +635,7 @@ struct MemorizeSpell_Struct {
|
|||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 unknown12;
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -654,11 +668,12 @@ struct DeleteSpell_Struct
|
|||||||
|
|
||||||
struct ManaChange_Struct
|
struct ManaChange_Struct
|
||||||
{
|
{
|
||||||
uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
uint32 spell_id;
|
/*08*/ uint32 spell_id;
|
||||||
uint32 unknown12;
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
uint32 unknown16;
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SwapSpell_Struct
|
struct SwapSpell_Struct
|
||||||
@@ -705,69 +720,31 @@ struct SpawnAppearance_Struct
|
|||||||
|
|
||||||
struct SpellBuff_Struct
|
struct SpellBuff_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
|
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
|
||||||
/*001*/ float unknown004; // Seen 1 for no buff
|
/*001*/ uint8 level; // Seen 1 for no buff
|
||||||
/*005*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
|
/*002*/ uint8 unknown002; //pretty sure padding now
|
||||||
/*009*/ uint32 unknown016;
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*013*/ uint8 bard_modifier;
|
/*004*/ float bard_modifier;
|
||||||
/*014*/ int32 duration;
|
|
||||||
/*018*/ uint8 level;
|
|
||||||
/*019*/ uint32 spellid;
|
|
||||||
/*023*/ uint32 counters;
|
|
||||||
/*027*/ uint8 unknown0028[53];
|
|
||||||
/*080*/
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SpellBuff_Struct_Old
|
|
||||||
{
|
|
||||||
/*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*/ float unknown004; // Seen 1 for no buff
|
|
||||||
/*008*/ uint32 spellid;
|
/*008*/ uint32 spellid;
|
||||||
/*012*/ int32 duration;
|
/*012*/ uint32 duration;
|
||||||
/*016*/ uint32 unknown016;
|
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
/*020*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
|
/*020*/ uint32 num_hits;
|
||||||
/*024*/ uint32 counters;
|
/*024*/ float y; // referenced by SPA 441
|
||||||
/*028*/ uint8 unknown0028[60];
|
/*028*/ float x; // unsure if all buffs get them
|
||||||
|
/*032*/ float z; // as valid data
|
||||||
|
/*036*/ uint32 unknown036;
|
||||||
|
/*040*/ int32 slot_data[12]; // book keeping stuff per slot (counters, rune/vie)
|
||||||
/*088*/
|
/*088*/
|
||||||
};
|
};
|
||||||
|
|
||||||
// Not functional yet, but this is what the packet looks like on Live
|
struct SpellBuffPacket_Struct {
|
||||||
struct SpellBuffFade_Struct_Live {
|
|
||||||
/*000*/ uint32 entityid; // Player id who cast the buff
|
/*000*/ uint32 entityid; // Player id who cast the buff
|
||||||
/*004*/ uint8 unknown004;
|
/*004*/ SpellBuff_Struct buff;
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown007;
|
|
||||||
/*008*/ float unknown008;
|
|
||||||
/*012*/ uint32 spellid;
|
|
||||||
/*016*/ int32 duration;
|
|
||||||
/*020*/ uint32 playerId; // Global player ID?
|
|
||||||
/*024*/ uint32 num_hits;
|
|
||||||
/*028*/ uint8 unknown0028[64];
|
|
||||||
/*092*/ uint32 slotid;
|
/*092*/ uint32 slotid;
|
||||||
/*096*/ uint32 bufffade;
|
/*096*/ uint32 bufffade;
|
||||||
/*100*/
|
/*100*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpellBuffFade_Struct {
|
|
||||||
/*000*/ uint32 entityid;
|
|
||||||
/*004*/ uint8 slot;
|
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown7;
|
|
||||||
/*008*/ uint32 spellid;
|
|
||||||
/*012*/ int32 duration;
|
|
||||||
/*016*/ uint32 num_hits;
|
|
||||||
/*020*/ uint32 unknown020; // Global player ID?
|
|
||||||
/*024*/ uint32 playerId; // Player id who cast the buff
|
|
||||||
/*028*/ uint32 slotid;
|
|
||||||
/*032*/ uint32 bufffade;
|
|
||||||
/*036*/
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BuffRemoveRequest_Struct
|
struct BuffRemoveRequest_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 SlotID;
|
/*00*/ uint32 SlotID;
|
||||||
@@ -1078,38 +1055,38 @@ union
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
/*00184*/ EquipStruct equip_helmet; // Equipment: Helmet visual
|
/*00184*/ Texture_Struct equip_helmet; // Equipment: Helmet visual
|
||||||
/*00204*/ EquipStruct equip_chest; // Equipment: Chest visual
|
/*00204*/ Texture_Struct equip_chest; // Equipment: Chest visual
|
||||||
/*00224*/ EquipStruct equip_arms; // Equipment: Arms visual
|
/*00224*/ Texture_Struct equip_arms; // Equipment: Arms visual
|
||||||
/*00244*/ EquipStruct equip_bracers; // Equipment: Wrist visual
|
/*00244*/ Texture_Struct equip_bracers; // Equipment: Wrist visual
|
||||||
/*00264*/ EquipStruct equip_hands; // Equipment: Hands visual
|
/*00264*/ Texture_Struct equip_hands; // Equipment: Hands visual
|
||||||
/*00284*/ EquipStruct equip_legs; // Equipment: Legs visual
|
/*00284*/ Texture_Struct equip_legs; // Equipment: Legs visual
|
||||||
/*00304*/ EquipStruct equip_feet; // Equipment: Boots visual
|
/*00304*/ Texture_Struct equip_feet; // Equipment: Boots visual
|
||||||
/*00324*/ EquipStruct equip_primary; // Equipment: Main visual
|
/*00324*/ Texture_Struct equip_primary; // Equipment: Main visual
|
||||||
/*00344*/ EquipStruct equip_secondary; // Equipment: Off visual
|
/*00344*/ Texture_Struct equip_secondary; // Equipment: Off visual
|
||||||
// Below slots are just guesses, but all 0s anyway...
|
// Below slots are just guesses, but all 0s anyway...
|
||||||
/*00364*/ EquipStruct equip_charm; // Equipment: Non-visual
|
/*00364*/ Texture_Struct equip_charm; // Equipment: Non-visual
|
||||||
/*00384*/ EquipStruct equip_ear1; // Equipment: Non-visual
|
/*00384*/ Texture_Struct equip_ear1; // Equipment: Non-visual
|
||||||
/*00404*/ EquipStruct equip_ear2; // Equipment: Non-visual
|
/*00404*/ Texture_Struct equip_ear2; // Equipment: Non-visual
|
||||||
/*00424*/ EquipStruct equip_face; // Equipment: Non-visual
|
/*00424*/ Texture_Struct equip_face; // Equipment: Non-visual
|
||||||
/*00444*/ EquipStruct equip_neck; // Equipment: Non-visual
|
/*00444*/ Texture_Struct equip_neck; // Equipment: Non-visual
|
||||||
/*00464*/ EquipStruct equip_shoulder; // Equipment: Non-visual
|
/*00464*/ Texture_Struct equip_shoulder; // Equipment: Non-visual
|
||||||
/*00484*/ EquipStruct equip_bracer2; // Equipment: Non-visual
|
/*00484*/ Texture_Struct equip_bracer2; // Equipment: Non-visual
|
||||||
/*00504*/ EquipStruct equip_range; // Equipment: Non-visual
|
/*00504*/ Texture_Struct equip_range; // Equipment: Non-visual
|
||||||
/*00524*/ EquipStruct equip_ring1; // Equipment: Non-visual
|
/*00524*/ Texture_Struct equip_ring1; // Equipment: Non-visual
|
||||||
/*00544*/ EquipStruct equip_ring2; // Equipment: Non-visual
|
/*00544*/ Texture_Struct equip_ring2; // Equipment: Non-visual
|
||||||
/*00564*/ EquipStruct equip_waist; // Equipment: Non-visual
|
/*00564*/ Texture_Struct equip_waist; // Equipment: Non-visual
|
||||||
/*00584*/ EquipStruct equip_powersource;// Equipment: Non-visual
|
/*00584*/ Texture_Struct equip_powersource;// Equipment: Non-visual
|
||||||
/*00604*/ EquipStruct equip_ammo; // Equipment: Non-visual
|
/*00604*/ Texture_Struct equip_ammo; // Equipment: Non-visual
|
||||||
} equip;
|
} equip;
|
||||||
/*00184*/ EquipStruct equipment[22]; // Total Slots
|
/*00184*/ Texture_Struct equipment[22]; // Total Slots
|
||||||
};
|
};
|
||||||
/*00624*/ uint32 equip2_count; // Seen 9
|
/*00624*/ uint32 equip2_count; // Seen 9
|
||||||
/*00628*/ EquipStruct equipment2[EQEmu::legacy::MaterialCount]; // Appears to be Visible slots, but all 0s
|
/*00628*/ Texture_Struct equipment2[EQEmu::textures::TextureCount]; // Appears to be Visible slots, but all 0s
|
||||||
/*00808*/ uint32 tint_count; // Seen 9
|
/*00808*/ uint32 tint_count; // Seen 9
|
||||||
/*00812*/ Color_Struct item_tint[EQEmu::legacy::MaterialCount]; // RR GG BB 00
|
/*00812*/ TintProfile item_tint; // RR GG BB 00
|
||||||
/*00848*/ uint32 tint_count2; // Seen 9
|
/*00848*/ uint32 tint_count2; // Seen 9
|
||||||
/*00852*/ Color_Struct item_tint2[EQEmu::legacy::MaterialCount]; // RR GG BB 00
|
/*00852*/ TintProfile item_tint2; // RR GG BB 00
|
||||||
/*00888*/ uint8 haircolor; // Player hair color
|
/*00888*/ uint8 haircolor; // Player hair color
|
||||||
/*00889*/ uint8 beardcolor; // Player beard color
|
/*00889*/ uint8 beardcolor; // Player beard color
|
||||||
/*00890*/ uint32 unknown_rof5; //
|
/*00890*/ uint32 unknown_rof5; //
|
||||||
@@ -1385,7 +1362,7 @@ struct WearChange_Struct{
|
|||||||
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
||||||
/*014*/ uint32 hero_forge_model; // New to VoA
|
/*014*/ uint32 hero_forge_model; // New to VoA
|
||||||
/*018*/ uint32 unknown18; // New to RoF2
|
/*018*/ uint32 unknown18; // New to RoF2
|
||||||
/*022*/ Color_Struct color;
|
/*022*/ Tint_Struct color;
|
||||||
/*026*/ uint8 wear_slot_id;
|
/*026*/ uint8 wear_slot_id;
|
||||||
/*027*/
|
/*027*/
|
||||||
};
|
};
|
||||||
@@ -2446,7 +2423,7 @@ struct AdventureLeaderboard_Struct
|
|||||||
/*struct Item_Shop_Struct {
|
/*struct Item_Shop_Struct {
|
||||||
uint16 merchantid;
|
uint16 merchantid;
|
||||||
uint8 itemtype;
|
uint8 itemtype;
|
||||||
Item_Struct item;
|
ItemBase item;
|
||||||
uint8 iss_unknown001[6];
|
uint8 iss_unknown001[6];
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
@@ -3634,27 +3611,6 @@ struct PetitionBug_Struct{
|
|||||||
char text[1028];
|
char text[1028];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DyeStruct
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct Color_Struct head;
|
|
||||||
struct Color_Struct chest;
|
|
||||||
struct Color_Struct arms;
|
|
||||||
struct Color_Struct wrists;
|
|
||||||
struct Color_Struct hands;
|
|
||||||
struct Color_Struct legs;
|
|
||||||
struct Color_Struct feet;
|
|
||||||
struct Color_Struct primary; // you can't actually dye this
|
|
||||||
struct Color_Struct secondary; // or this
|
|
||||||
}
|
|
||||||
dyes;
|
|
||||||
struct Color_Struct dye[9];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
uint32 zoneid;
|
uint32 zoneid;
|
||||||
@@ -5088,6 +5044,15 @@ struct MercenaryMerchantResponse_Struct {
|
|||||||
/*0004*/
|
/*0004*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Sent by Server to update character crystals.
|
||||||
|
struct CrystalCountUpdate_Struct
|
||||||
|
{
|
||||||
|
/*000*/ uint32 CurrentRadiantCrystals;
|
||||||
|
/*004*/ uint32 CareerRadiantCrystals;
|
||||||
|
/*008*/ uint32 CurrentEbonCrystals;
|
||||||
|
/*012*/ uint32 CareerEbonCrystals;
|
||||||
|
};
|
||||||
|
|
||||||
}; /*structs*/
|
}; /*structs*/
|
||||||
|
|
||||||
}; /*RoF2*/
|
}; /*RoF2*/
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "../string_util.h"
|
#include "../string_util.h"
|
||||||
|
|
||||||
|
|
||||||
size_t RoF::invtype::InvTypeSize(int inv_type)
|
size_t RoF::invtype::GetInvTypeSize(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypePossessions:
|
case invtype::InvTypePossessions:
|
||||||
@@ -78,7 +78,7 @@ size_t RoF::invtype::InvTypeSize(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF::invtype::InvTypeName(int inv_type)
|
const char* RoF::invtype::GetInvTypeName(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypeInvalid:
|
case invtype::InvTypeInvalid:
|
||||||
@@ -136,7 +136,25 @@ const char* RoF::invtype::InvTypeName(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF::invslot::InvPossessionsSlotName(int inv_slot)
|
bool RoF::invtype::IsInvTypePersistent(int inv_type)
|
||||||
|
{
|
||||||
|
switch (inv_type) {
|
||||||
|
case invtype::InvTypePossessions:
|
||||||
|
case invtype::InvTypeBank:
|
||||||
|
case invtype::InvTypeSharedBank:
|
||||||
|
case invtype::InvTypeTrade:
|
||||||
|
case invtype::InvTypeWorld:
|
||||||
|
case invtype::InvTypeLimbo:
|
||||||
|
case invtype::InvTypeTribute:
|
||||||
|
case invtype::InvTypeTrophyTribute:
|
||||||
|
case invtype::InvTypeGuildTribute:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* RoF::invslot::GetInvPossessionsSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
switch (inv_slot) {
|
switch (inv_slot) {
|
||||||
case invslot::InvSlotInvalid:
|
case invslot::InvSlotInvalid:
|
||||||
@@ -214,12 +232,12 @@ const char* RoF::invslot::InvPossessionsSlotName(int inv_slot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF::invslot::InvSlotName(int inv_type, int inv_slot)
|
const char* RoF::invslot::GetInvSlotName(int inv_type, int inv_slot)
|
||||||
{
|
{
|
||||||
if (inv_type == invtype::InvTypePossessions)
|
if (inv_type == invtype::InvTypePossessions)
|
||||||
return invslot::InvPossessionsSlotName(inv_slot);
|
return invslot::GetInvPossessionsSlotName(inv_slot);
|
||||||
|
|
||||||
size_t type_size = invtype::InvTypeSize(inv_type);
|
size_t type_size = invtype::GetInvTypeSize(inv_type);
|
||||||
|
|
||||||
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
@@ -233,7 +251,7 @@ const char* RoF::invslot::InvSlotName(int inv_type, int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF::invbag::InvBagIndexName(int bag_index)
|
const char* RoF::invbag::GetInvBagIndexName(int bag_index)
|
||||||
{
|
{
|
||||||
if (bag_index == invbag::InvBagInvalid)
|
if (bag_index == invbag::InvBagInvalid)
|
||||||
return "Invalid Bag";
|
return "Invalid Bag";
|
||||||
@@ -247,7 +265,7 @@ const char* RoF::invbag::InvBagIndexName(int bag_index)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RoF::invaug::InvAugIndexName(int aug_index)
|
const char* RoF::invaug::GetInvAugIndexName(int aug_index)
|
||||||
{
|
{
|
||||||
if (aug_index == invaug::InvAugInvalid)
|
if (aug_index == invaug::InvAugInvalid)
|
||||||
return "Invalid Augment";
|
return "Invalid Augment";
|
||||||
|
|||||||
+34
-25
@@ -21,7 +21,7 @@
|
|||||||
#define COMMON_ROF_LIMITS_H
|
#define COMMON_ROF_LIMITS_H
|
||||||
|
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
#include "../client_version.h"
|
#include "../emu_versions.h"
|
||||||
#include "../skills.h"
|
#include "../skills.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -32,8 +32,13 @@ namespace RoF
|
|||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
// pre-declarations
|
// pre-declarations
|
||||||
|
namespace inventory {
|
||||||
|
inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
inline EQEmu::versions::ClientVersion InvTypeRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
||||||
|
|
||||||
@@ -68,7 +73,7 @@ namespace RoF
|
|||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
namespace invslot {
|
namespace invslot {
|
||||||
inline EQEmu::versions::ClientVersion InvSlotRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
||||||
|
|
||||||
@@ -121,21 +126,21 @@ namespace RoF
|
|||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
inline EQEmu::versions::ClientVersion InvBagRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
enum : int { InvBagInvalid = -1, InvBagBegin };
|
enum : int { InvBagInvalid = -1, InvBagBegin };
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
inline EQEmu::versions::ClientVersion InvAugRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
enum : int { InvAugInvalid = -1, InvAugBegin };
|
enum : int { InvAugInvalid = -1, InvAugBegin };
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
namespace item {
|
namespace item {
|
||||||
inline EQEmu::versions::ClientVersion ItemRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
enum ItemPacketType : int {
|
enum ItemPacketType : int {
|
||||||
ItemPacketMerchant = 100,
|
ItemPacketMerchant = 100,
|
||||||
@@ -157,27 +162,37 @@ namespace RoF
|
|||||||
} /*item*/
|
} /*item*/
|
||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
inline EQEmu::versions::ClientVersion ProfileRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
} /*profile*/
|
} /*profile*/
|
||||||
|
|
||||||
namespace constants {
|
namespace constants {
|
||||||
inline EQEmu::versions::ClientVersion ConstantsRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
inline EQEmu::versions::ClientVersion BehaviorRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|
||||||
namespace skills {
|
namespace skills {
|
||||||
inline EQEmu::versions::ClientVersion SkillsRef() { return EQEmu::versions::ClientVersion::RoF; }
|
inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::RoF; }
|
||||||
|
|
||||||
} /*skills*/
|
} /*skills*/
|
||||||
|
|
||||||
|
|
||||||
// declarations
|
// declarations
|
||||||
|
namespace inventory {
|
||||||
|
const bool ConcatenateInvTypeLimbo = false;
|
||||||
|
|
||||||
|
const bool AllowOverLevelEquipment = true;
|
||||||
|
|
||||||
|
const bool AllowEmptyBagInBag = true;
|
||||||
|
const bool AllowClickCastFromBag = true;
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
||||||
const size_t InvTypeBankSize = 24;
|
const size_t InvTypeBankSize = 24;
|
||||||
@@ -187,7 +202,7 @@ namespace RoF
|
|||||||
const size_t InvTypeLimboSize = 36;
|
const size_t InvTypeLimboSize = 36;
|
||||||
const size_t InvTypeTributeSize = 5;
|
const size_t InvTypeTributeSize = 5;
|
||||||
const size_t InvTypeTrophyTributeSize = 0;//unknown
|
const size_t InvTypeTrophyTributeSize = 0;//unknown
|
||||||
const size_t InvTypeGuildTributeSize = 0;//unknown
|
const size_t InvTypeGuildTributeSize = 2;//unverified
|
||||||
const size_t InvTypeMerchantSize = 200;
|
const size_t InvTypeMerchantSize = 200;
|
||||||
const size_t InvTypeDeletedSize = 0;//unknown - "Recovery Tab"
|
const size_t InvTypeDeletedSize = 0;//unknown - "Recovery Tab"
|
||||||
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
||||||
@@ -204,30 +219,30 @@ namespace RoF
|
|||||||
const size_t InvTypeGuildTrophyTributeSize = 0;//unknown
|
const size_t InvTypeGuildTrophyTributeSize = 0;//unknown
|
||||||
const size_t InvTypeOtherSize = 0;//unknown
|
const size_t InvTypeOtherSize = 0;//unknown
|
||||||
|
|
||||||
const size_t NPCTradeSize = 4;
|
extern size_t GetInvTypeSize(int inv_type);
|
||||||
|
extern const char* GetInvTypeName(int inv_type);
|
||||||
|
|
||||||
extern size_t InvTypeSize(int inv_type);
|
extern bool IsInvTypePersistent(int inv_type);
|
||||||
extern const char* InvTypeName(int inv_type);
|
|
||||||
|
|
||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
namespace invslot {
|
namespace invslot {
|
||||||
extern const char* InvPossessionsSlotName(int inv_slot);
|
extern const char* GetInvPossessionsSlotName(int inv_slot);
|
||||||
extern const char* InvSlotName(int inv_type, int inv_slot);
|
extern const char* GetInvSlotName(int inv_type, int inv_slot);
|
||||||
|
|
||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
const size_t ItemBagSize = 255; // server Size will be 255..unsure what actual client is (test)
|
const size_t ItemBagSize = 255; // server Size will be 255..unsure what actual client is (test)
|
||||||
|
|
||||||
extern const char* InvBagIndexName(int bag_index);
|
extern const char* GetInvBagIndexName(int bag_index);
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
const size_t ItemAugSize = 6;
|
const size_t ItemAugSize = 6;
|
||||||
|
|
||||||
extern const char* InvAugIndexName(int aug_index);
|
extern const char* GetInvAugIndexName(int aug_index);
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
@@ -237,6 +252,7 @@ namespace RoF
|
|||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
const size_t TributeSize = invtype::InvTypeTributeSize;
|
const size_t TributeSize = invtype::InvTypeTributeSize;
|
||||||
|
const size_t GuildTributeSize = invtype::InvTypeGuildTributeSize;
|
||||||
|
|
||||||
const size_t BandoliersSize = 20; // number of bandolier instances
|
const size_t BandoliersSize = 20; // number of bandolier instances
|
||||||
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
||||||
@@ -255,13 +271,6 @@ namespace RoF
|
|||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
const bool ConcatenateInvTypeLimbo = false;
|
|
||||||
|
|
||||||
const bool AllowOverLevelEquipment = true;
|
|
||||||
|
|
||||||
const bool AllowEmptyBagInBag = true;
|
|
||||||
const bool AllowClickCastFromBag = true;
|
|
||||||
|
|
||||||
const bool CoinHasWeight = false;
|
const bool CoinHasWeight = false;
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|||||||
+110
-154
@@ -163,7 +163,7 @@ struct AdventureInfo {
|
|||||||
** Merth: Gave struct a name so gcc 2.96 would compile
|
** Merth: Gave struct a name so gcc 2.96 would compile
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
struct Color_Struct
|
struct Tint_Struct
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
@@ -171,21 +171,65 @@ struct Color_Struct
|
|||||||
uint8 Green;
|
uint8 Green;
|
||||||
uint8 Red;
|
uint8 Red;
|
||||||
uint8 UseTint; // if there's a tint this is FF
|
uint8 UseTint; // if there's a tint this is FF
|
||||||
} RGB;
|
};
|
||||||
uint32 Color;
|
uint32 Color;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CharSelectEquip
|
struct TintProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Tint_Struct Head;
|
||||||
|
Tint_Struct Chest;
|
||||||
|
Tint_Struct Arms;
|
||||||
|
Tint_Struct Wrist;
|
||||||
|
Tint_Struct Hands;
|
||||||
|
Tint_Struct Legs;
|
||||||
|
Tint_Struct Feet;
|
||||||
|
Tint_Struct Primary;
|
||||||
|
Tint_Struct Secondary;
|
||||||
|
};
|
||||||
|
Tint_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Visible equiptment.
|
||||||
|
* Size: 20 Octets
|
||||||
|
*/
|
||||||
|
struct Texture_Struct
|
||||||
{
|
{
|
||||||
uint32 Material;
|
uint32 Material;
|
||||||
uint32 Unknown1;
|
uint32 Unknown1;
|
||||||
uint32 EliteMaterial;
|
uint32 EliteMaterial;
|
||||||
uint32 HeroForgeModel;
|
uint32 HeroForgeModel;
|
||||||
uint32 Material2;
|
uint32 Material2; // Same as material?
|
||||||
Color_Struct Color;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Needs more research regarding new slots
|
||||||
|
//struct TextureProfile
|
||||||
|
//{
|
||||||
|
// union {
|
||||||
|
// struct {
|
||||||
|
// Texture_Struct Head;
|
||||||
|
// Texture_Struct Chest;
|
||||||
|
// Texture_Struct Arms;
|
||||||
|
// Texture_Struct Wrist;
|
||||||
|
// Texture_Struct Hands;
|
||||||
|
// Texture_Struct Legs;
|
||||||
|
// Texture_Struct Feet;
|
||||||
|
// Texture_Struct Primary;
|
||||||
|
// Texture_Struct Secondary;
|
||||||
|
// };
|
||||||
|
// Texture_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// TextureProfile();
|
||||||
|
//};
|
||||||
|
|
||||||
|
struct CharSelectEquip : Texture_Struct, Tint_Struct {};
|
||||||
|
|
||||||
struct CharacterSelectEntry_Struct
|
struct CharacterSelectEntry_Struct
|
||||||
{
|
{
|
||||||
/*0000*/ char Name[1]; // Name null terminated
|
/*0000*/ char Name[1]; // Name null terminated
|
||||||
@@ -231,21 +275,6 @@ struct CharacterSelect_Struct
|
|||||||
/*004*/ CharacterSelectEntry_Struct Entries[0];
|
/*004*/ CharacterSelectEntry_Struct Entries[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Visible equiptment.
|
|
||||||
* Size: 20 Octets
|
|
||||||
*/
|
|
||||||
struct EquipStruct
|
|
||||||
{
|
|
||||||
/*00*/ uint32 Material;
|
|
||||||
/*04*/ uint32 Unknown1;
|
|
||||||
/*08*/ uint32 EliteMaterial;
|
|
||||||
/*12*/ uint32 HeroForgeModel;
|
|
||||||
/*16*/ uint32 Material2; // Same as material?
|
|
||||||
/*20*/
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct Membership_Entry_Struct
|
struct Membership_Entry_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300
|
/*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300
|
||||||
@@ -441,39 +470,24 @@ struct Spawn_Struct
|
|||||||
/*0000*/ uint32 unknown18;
|
/*0000*/ uint32 unknown18;
|
||||||
/*0000*/ uint32 unknown19;
|
/*0000*/ uint32 unknown19;
|
||||||
Spawn_Struct_Position Position;
|
Spawn_Struct_Position Position;
|
||||||
/*0000*/ union
|
/*0000*/ TintProfile equipment_tint;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0000*/ Color_Struct color_helmet; // Color of helmet item
|
|
||||||
/*0000*/ Color_Struct color_chest; // Color of chest item
|
|
||||||
/*0000*/ Color_Struct color_arms; // Color of arms item
|
|
||||||
/*0000*/ Color_Struct color_bracers; // Color of bracers item
|
|
||||||
/*0000*/ Color_Struct color_hands; // Color of hands item
|
|
||||||
/*0000*/ Color_Struct color_legs; // Color of legs item
|
|
||||||
/*0000*/ Color_Struct color_feet; // Color of feet item
|
|
||||||
/*0000*/ Color_Struct color_primary; // Color of primary item
|
|
||||||
/*0000*/ Color_Struct color_secondary; // Color of secondary item
|
|
||||||
} equipment_colors;
|
|
||||||
/*0000*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
|
|
||||||
};
|
|
||||||
|
|
||||||
// skip these bytes if not a valid player race
|
// skip these bytes if not a valid player race
|
||||||
/*0000*/ union
|
/*0000*/ union
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
/*0000*/ Texture_Struct equip_helmet; // Equiptment: Helmet visual
|
||||||
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
/*0000*/ Texture_Struct equip_chest; // Equiptment: Chest visual
|
||||||
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
/*0000*/ Texture_Struct equip_arms; // Equiptment: Arms visual
|
||||||
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
/*0000*/ Texture_Struct equip_bracers; // Equiptment: Wrist visual
|
||||||
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
/*0000*/ Texture_Struct equip_hands; // Equiptment: Hands visual
|
||||||
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
/*0000*/ Texture_Struct equip_legs; // Equiptment: Legs visual
|
||||||
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
/*0000*/ Texture_Struct equip_feet; // Equiptment: Boots visual
|
||||||
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
|
/*0000*/ Texture_Struct equip_primary; // Equiptment: Main visual
|
||||||
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
/*0000*/ Texture_Struct equip_secondary; // Equiptment: Off visual
|
||||||
} equip;
|
} equip;
|
||||||
/*0000*/ EquipStruct equipment[9];
|
/*0000*/ Texture_Struct equipment[9];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
||||||
@@ -610,7 +624,7 @@ struct MemorizeSpell_Struct {
|
|||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 unknown12;
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -643,11 +657,12 @@ struct DeleteSpell_Struct
|
|||||||
|
|
||||||
struct ManaChange_Struct
|
struct ManaChange_Struct
|
||||||
{
|
{
|
||||||
uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
uint32 spell_id;
|
/*08*/ uint32 spell_id;
|
||||||
uint32 unknown12;
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
uint32 unknown16;
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SwapSpell_Struct
|
struct SwapSpell_Struct
|
||||||
@@ -694,69 +709,31 @@ struct SpawnAppearance_Struct
|
|||||||
|
|
||||||
struct SpellBuff_Struct
|
struct SpellBuff_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
|
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
|
||||||
/*001*/ float unknown004; // Seen 1 for no buff
|
/*001*/ uint8 level; // Seen 1 for no buff
|
||||||
/*005*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
|
/*002*/ uint8 unknown002; //pretty sure padding now
|
||||||
/*009*/ uint32 unknown016;
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*013*/ uint8 bard_modifier;
|
/*004*/ float bard_modifier;
|
||||||
/*014*/ int32 duration;
|
|
||||||
/*018*/ uint8 level;
|
|
||||||
/*019*/ uint32 spellid;
|
|
||||||
/*023*/ uint32 counters;
|
|
||||||
/*027*/ uint8 unknown0028[53];
|
|
||||||
/*080*/
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SpellBuff_Struct_Old
|
|
||||||
{
|
|
||||||
/*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*/ float unknown004; // Seen 1 for no buff
|
|
||||||
/*008*/ uint32 spellid;
|
/*008*/ uint32 spellid;
|
||||||
/*012*/ int32 duration;
|
/*012*/ uint32 duration;
|
||||||
/*016*/ uint32 unknown016;
|
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
/*020*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
|
/*020*/ uint32 num_hits;
|
||||||
/*024*/ uint32 counters;
|
/*024*/ float y; // referenced by SPA 441
|
||||||
/*028*/ uint8 unknown0028[60];
|
/*028*/ float x; // unsure if all buffs get them
|
||||||
|
/*032*/ float z; // as valid data
|
||||||
|
/*036*/ uint32 unknown036;
|
||||||
|
/*040*/ int32 slot_data[12]; // book keeping stuff per slot (counters, rune/vie)
|
||||||
/*088*/
|
/*088*/
|
||||||
};
|
};
|
||||||
|
|
||||||
// Not functional yet, but this is what the packet looks like on Live
|
struct SpellBuffPacket_Struct {
|
||||||
struct SpellBuffFade_Struct_Live {
|
|
||||||
/*000*/ uint32 entityid; // Player id who cast the buff
|
/*000*/ uint32 entityid; // Player id who cast the buff
|
||||||
/*004*/ uint8 unknown004;
|
/*004*/ SpellBuff_Struct buff;
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown007;
|
|
||||||
/*008*/ float unknown008;
|
|
||||||
/*012*/ uint32 spellid;
|
|
||||||
/*016*/ int32 duration;
|
|
||||||
/*020*/ uint32 playerId; // Global player ID?
|
|
||||||
/*024*/ uint32 num_hits;
|
|
||||||
/*028*/ uint8 unknown0028[64];
|
|
||||||
/*092*/ uint32 slotid;
|
/*092*/ uint32 slotid;
|
||||||
/*096*/ uint32 bufffade;
|
/*096*/ uint32 bufffade;
|
||||||
/*100*/
|
/*100*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpellBuffFade_Struct {
|
|
||||||
/*000*/ uint32 entityid;
|
|
||||||
/*004*/ uint8 slot;
|
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown7;
|
|
||||||
/*008*/ uint32 spellid;
|
|
||||||
/*012*/ int32 duration;
|
|
||||||
/*016*/ uint32 num_hits;
|
|
||||||
/*020*/ uint32 unknown020; // Global player ID?
|
|
||||||
/*024*/ uint32 playerId; // Player id who cast the buff
|
|
||||||
/*028*/ uint32 slotid;
|
|
||||||
/*032*/ uint32 bufffade;
|
|
||||||
/*036*/
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BuffRemoveRequest_Struct
|
struct BuffRemoveRequest_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 SlotID;
|
/*00*/ uint32 SlotID;
|
||||||
@@ -1061,38 +1038,38 @@ union
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
/*00184*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
/*00184*/ Texture_Struct equip_helmet; // Equiptment: Helmet visual
|
||||||
/*00204*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
/*00204*/ Texture_Struct equip_chest; // Equiptment: Chest visual
|
||||||
/*00224*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
/*00224*/ Texture_Struct equip_arms; // Equiptment: Arms visual
|
||||||
/*00244*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
/*00244*/ Texture_Struct equip_bracers; // Equiptment: Wrist visual
|
||||||
/*00264*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
/*00264*/ Texture_Struct equip_hands; // Equiptment: Hands visual
|
||||||
/*00284*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
/*00284*/ Texture_Struct equip_legs; // Equiptment: Legs visual
|
||||||
/*00304*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
/*00304*/ Texture_Struct equip_feet; // Equiptment: Boots visual
|
||||||
/*00324*/ EquipStruct equip_primary; // Equiptment: Main visual
|
/*00324*/ Texture_Struct equip_primary; // Equiptment: Main visual
|
||||||
/*00344*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
/*00344*/ Texture_Struct equip_secondary; // Equiptment: Off visual
|
||||||
// Below slots are just guesses, but all 0s anyway...
|
// Below slots are just guesses, but all 0s anyway...
|
||||||
/*00364*/ EquipStruct equip_charm; // Equiptment: Non-visual
|
/*00364*/ Texture_Struct equip_charm; // Equiptment: Non-visual
|
||||||
/*00384*/ EquipStruct equip_ear1; // Equiptment: Non-visual
|
/*00384*/ Texture_Struct equip_ear1; // Equiptment: Non-visual
|
||||||
/*00404*/ EquipStruct equip_ear2; // Equiptment: Non-visual
|
/*00404*/ Texture_Struct equip_ear2; // Equiptment: Non-visual
|
||||||
/*00424*/ EquipStruct equip_face; // Equiptment: Non-visual
|
/*00424*/ Texture_Struct equip_face; // Equiptment: Non-visual
|
||||||
/*00444*/ EquipStruct equip_neck; // Equiptment: Non-visual
|
/*00444*/ Texture_Struct equip_neck; // Equiptment: Non-visual
|
||||||
/*00464*/ EquipStruct equip_shoulder; // Equiptment: Non-visual
|
/*00464*/ Texture_Struct equip_shoulder; // Equiptment: Non-visual
|
||||||
/*00484*/ EquipStruct equip_bracer2; // Equiptment: Non-visual
|
/*00484*/ Texture_Struct equip_bracer2; // Equiptment: Non-visual
|
||||||
/*00504*/ EquipStruct equip_range; // Equiptment: Non-visual
|
/*00504*/ Texture_Struct equip_range; // Equiptment: Non-visual
|
||||||
/*00524*/ EquipStruct equip_ring1; // Equiptment: Non-visual
|
/*00524*/ Texture_Struct equip_ring1; // Equiptment: Non-visual
|
||||||
/*00544*/ EquipStruct equip_ring2; // Equiptment: Non-visual
|
/*00544*/ Texture_Struct equip_ring2; // Equiptment: Non-visual
|
||||||
/*00564*/ EquipStruct equip_waist; // Equiptment: Non-visual
|
/*00564*/ Texture_Struct equip_waist; // Equiptment: Non-visual
|
||||||
/*00584*/ EquipStruct equip_powersource; // Equiptment: Non-visual
|
/*00584*/ Texture_Struct equip_powersource; // Equiptment: Non-visual
|
||||||
/*00604*/ EquipStruct equip_ammo; // Equiptment: Non-visual
|
/*00604*/ Texture_Struct equip_ammo; // Equiptment: Non-visual
|
||||||
} equip;
|
} equip;
|
||||||
/*00184*/ EquipStruct equipment[22];
|
/*00184*/ Texture_Struct equipment[22];
|
||||||
};
|
};
|
||||||
/*00624*/ uint32 equip2_count; // Seen 9
|
/*00624*/ uint32 equip2_count; // Seen 9
|
||||||
/*00628*/ EquipStruct equipment2[9]; // Appears to be Visible slots, but all 0s
|
/*00628*/ Texture_Struct equipment2[9]; // Appears to be Visible slots, but all 0s
|
||||||
/*00808*/ uint32 tint_count; // Seen 9
|
/*00808*/ uint32 tint_count; // Seen 9
|
||||||
/*00812*/ Color_Struct item_tint[9]; // RR GG BB 00
|
/*00812*/ TintProfile item_tint; // RR GG BB 00
|
||||||
/*00848*/ uint32 tint_count2; // Seen 9
|
/*00848*/ uint32 tint_count2; // Seen 9
|
||||||
/*00852*/ Color_Struct item_tint2[9]; // RR GG BB 00
|
/*00852*/ TintProfile item_tint2; // RR GG BB 00
|
||||||
/*00888*/ uint8 haircolor; // Player hair color
|
/*00888*/ uint8 haircolor; // Player hair color
|
||||||
/*00889*/ uint8 beardcolor; // Player beard color
|
/*00889*/ uint8 beardcolor; // Player beard color
|
||||||
/*00890*/ uint32 unknown_rof5; //
|
/*00890*/ uint32 unknown_rof5; //
|
||||||
@@ -1415,7 +1392,7 @@ struct WearChange_Struct{
|
|||||||
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
||||||
/*014*/ uint32 hero_forge_model; // New to VoA
|
/*014*/ uint32 hero_forge_model; // New to VoA
|
||||||
/*018*/ uint32 unknown18; // New to RoF
|
/*018*/ uint32 unknown18; // New to RoF
|
||||||
/*022*/ Color_Struct color;
|
/*022*/ Tint_Struct color;
|
||||||
/*026*/ uint8 wear_slot_id;
|
/*026*/ uint8 wear_slot_id;
|
||||||
/*027*/
|
/*027*/
|
||||||
};
|
};
|
||||||
@@ -2473,7 +2450,7 @@ struct AdventureLeaderboard_Struct
|
|||||||
/*struct Item_Shop_Struct {
|
/*struct Item_Shop_Struct {
|
||||||
uint16 merchantid;
|
uint16 merchantid;
|
||||||
uint8 itemtype;
|
uint8 itemtype;
|
||||||
Item_Struct item;
|
ItemBase item;
|
||||||
uint8 iss_unknown001[6];
|
uint8 iss_unknown001[6];
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
@@ -3634,27 +3611,6 @@ struct PetitionBug_Struct{
|
|||||||
char text[1028];
|
char text[1028];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DyeStruct
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct Color_Struct head;
|
|
||||||
struct Color_Struct chest;
|
|
||||||
struct Color_Struct arms;
|
|
||||||
struct Color_Struct wrists;
|
|
||||||
struct Color_Struct hands;
|
|
||||||
struct Color_Struct legs;
|
|
||||||
struct Color_Struct feet;
|
|
||||||
struct Color_Struct primary; // you can't actually dye this
|
|
||||||
struct Color_Struct secondary; // or this
|
|
||||||
}
|
|
||||||
dyes;
|
|
||||||
struct Color_Struct dye[9];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
uint32 zoneid;
|
uint32 zoneid;
|
||||||
|
|||||||
+118
-41
@@ -59,6 +59,9 @@ namespace SoD
|
|||||||
// client to server text link converter
|
// client to server text link converter
|
||||||
static inline void SoDToServerTextLink(std::string& serverTextLink, const std::string& sodTextLink);
|
static inline void SoDToServerTextLink(std::string& serverTextLink, const std::string& sodTextLink);
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToSoDCastingSlot(EQEmu::CastingSlot slot);
|
||||||
|
static inline EQEmu::CastingSlot SoDToServerCastingSlot(CastingSlot slot);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
{
|
{
|
||||||
//create our opcode manager if we havent already
|
//create our opcode manager if we havent already
|
||||||
@@ -80,7 +83,7 @@ namespace SoD
|
|||||||
|
|
||||||
//ok, now we have what we need to register.
|
//ok, now we have what we need to register.
|
||||||
|
|
||||||
EQStream::Signature signature;
|
EQStreamInterface::Signature signature;
|
||||||
std::string pname;
|
std::string pname;
|
||||||
|
|
||||||
//register our world signature.
|
//register our world signature.
|
||||||
@@ -301,16 +304,17 @@ namespace SoD
|
|||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_Buff)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
OUT(entityid);
|
OUT(entityid);
|
||||||
OUT(slot);
|
OUT(buff.effect_type);
|
||||||
OUT(level);
|
OUT(buff.level);
|
||||||
OUT(effect);
|
OUT(buff.bard_modifier);
|
||||||
//eq->unknown7 = 10;
|
OUT(buff.spellid);
|
||||||
OUT(spellid);
|
OUT(buff.duration);
|
||||||
OUT(duration);
|
OUT(buff.counters);
|
||||||
|
OUT(buff.player_id);
|
||||||
OUT(slotid);
|
OUT(slotid);
|
||||||
OUT(bufffade);
|
OUT(bufffade);
|
||||||
|
|
||||||
@@ -1135,7 +1139,8 @@ namespace SoD
|
|||||||
OUT(new_mana);
|
OUT(new_mana);
|
||||||
OUT(stamina);
|
OUT(stamina);
|
||||||
OUT(spell_id);
|
OUT(spell_id);
|
||||||
eq->unknown16 = -1; // Self Interrupt/Success = -1, Fizzle = 1, Other Interrupt = 2?
|
OUT(keepcasting);
|
||||||
|
eq->slot = -1; // this is spell gem slot. It's -1 in normal operation
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -1498,7 +1503,7 @@ namespace SoD
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petid);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petid);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint16, Buffer, emu->buffcount);
|
VARSTRUCT_ENCODE_TYPE(uint16, Buffer, emu->buffcount);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < BUFF_COUNT; ++i)
|
for (unsigned int i = 0; i < PET_BUFF_COUNT; ++i)
|
||||||
{
|
{
|
||||||
if (emu->spellid[i])
|
if (emu->spellid[i])
|
||||||
{
|
{
|
||||||
@@ -1509,7 +1514,7 @@ namespace SoD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->buffcount);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->buffcount); // I think this is actually some sort of type
|
||||||
|
|
||||||
delete[] __emu_buffer;
|
delete[] __emu_buffer;
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
@@ -1553,14 +1558,14 @@ namespace SoD
|
|||||||
OUT(hairstyle);
|
OUT(hairstyle);
|
||||||
OUT(beard);
|
OUT(beard);
|
||||||
// OUT(unknown00178[10]);
|
// OUT(unknown00178[10]);
|
||||||
for (r = 0; r < 9; r++) {
|
for (r = EQEmu::textures::TextureBegin; r < EQEmu::textures::TextureCount; r++) {
|
||||||
eq->equipment[r].Material = emu->item_material[r];
|
eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material;
|
||||||
eq->equipment[r].Unknown1 = 0;
|
eq->equipment.Slot[r].Unknown1 = 0;
|
||||||
eq->equipment[r].EliteMaterial = 0;
|
eq->equipment.Slot[r].EliteMaterial = 0;
|
||||||
//eq->colors[r].color = emu->colors[r].color;
|
//eq->colors[r].color = emu->colors[r].color;
|
||||||
}
|
}
|
||||||
for (r = 0; r < 7; r++) {
|
for (r = 0; r < 7; r++) {
|
||||||
OUT(item_tint[r].Color);
|
OUT(item_tint.Slot[r].Color);
|
||||||
}
|
}
|
||||||
// OUT(unknown00224[48]);
|
// OUT(unknown00224[48]);
|
||||||
//NOTE: new client supports 300 AAs, our internal rep/PP
|
//NOTE: new client supports 300 AAs, our internal rep/PP
|
||||||
@@ -1602,10 +1607,10 @@ namespace SoD
|
|||||||
OUT(thirst_level);
|
OUT(thirst_level);
|
||||||
OUT(hunger_level);
|
OUT(hunger_level);
|
||||||
for (r = 0; r < structs::BUFF_COUNT; r++) {
|
for (r = 0; r < structs::BUFF_COUNT; r++) {
|
||||||
OUT(buffs[r].slotid);
|
OUT(buffs[r].effect_type);
|
||||||
OUT(buffs[r].level);
|
OUT(buffs[r].level);
|
||||||
OUT(buffs[r].bard_modifier);
|
OUT(buffs[r].bard_modifier);
|
||||||
OUT(buffs[r].effect);
|
OUT(buffs[r].unknown003);
|
||||||
OUT(buffs[r].spellid);
|
OUT(buffs[r].spellid);
|
||||||
OUT(buffs[r].duration);
|
OUT(buffs[r].duration);
|
||||||
OUT(buffs[r].counters);
|
OUT(buffs[r].counters);
|
||||||
@@ -1993,11 +1998,11 @@ namespace SoD
|
|||||||
eq_cse->HairColor = emu_cse->HairColor;
|
eq_cse->HairColor = emu_cse->HairColor;
|
||||||
eq_cse->Face = emu_cse->Face;
|
eq_cse->Face = emu_cse->Face;
|
||||||
|
|
||||||
for (int equip_index = 0; equip_index < EQEmu::legacy::MaterialCount; equip_index++) {
|
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
|
||||||
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
||||||
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
||||||
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
||||||
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
|
eq_cse->Equip[equip_index].Color = emu_cse->Equip[equip_index].Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq_cse->PrimaryIDFile = emu_cse->PrimaryIDFile;
|
eq_cse->PrimaryIDFile = emu_cse->PrimaryIDFile;
|
||||||
@@ -2563,7 +2568,7 @@ namespace SoD
|
|||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)))
|
if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)))
|
||||||
{
|
{
|
||||||
PacketSize -= (sizeof(structs::EquipStruct) * 9);
|
PacketSize -= (sizeof(structs::Texture_Struct) * EQEmu::textures::TextureCount);
|
||||||
|
|
||||||
if (emu->size == 0)
|
if (emu->size == 0)
|
||||||
{
|
{
|
||||||
@@ -2760,10 +2765,10 @@ namespace SoD
|
|||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
||||||
{
|
{
|
||||||
for (k = 0; k < 9; ++k)
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; ++k)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->colors[k].Color);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment_tint.Slot[k].Color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2773,11 +2778,11 @@ namespace SoD
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::legacy::MaterialPrimary].Material);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Primary.Material);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::legacy::MaterialSecondary].Material);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Secondary.Material);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
}
|
}
|
||||||
@@ -2785,15 +2790,15 @@ namespace SoD
|
|||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
||||||
{
|
{
|
||||||
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
|
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
||||||
|
|
||||||
for (k = 0; k < 9; k++) {
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; k++) {
|
||||||
Equipment[k].Material = emu->equipment[k].Material;
|
Equipment[k].Material = emu->equipment.Slot[k].Material;
|
||||||
Equipment[k].Unknown1 = emu->equipment[k].Unknown1;
|
Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
|
||||||
Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial;
|
Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer += (sizeof(structs::EquipStruct) * 9);
|
Buffer += (sizeof(structs::Texture_Struct) * EQEmu::textures::TextureCount);
|
||||||
}
|
}
|
||||||
if (strlen(emu->title))
|
if (strlen(emu->title))
|
||||||
{
|
{
|
||||||
@@ -2907,15 +2912,16 @@ namespace SoD
|
|||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
IN(entityid);
|
IN(entityid);
|
||||||
IN(slot);
|
IN(buff.effect_type);
|
||||||
IN(level);
|
IN(buff.level);
|
||||||
IN(effect);
|
IN(buff.bard_modifier);
|
||||||
IN(spellid);
|
IN(buff.spellid);
|
||||||
IN(duration);
|
IN(buff.duration);
|
||||||
|
IN(buff.counters)
|
||||||
IN(slotid);
|
IN(slotid);
|
||||||
IN(bufffade);
|
IN(bufffade);
|
||||||
|
|
||||||
@@ -2946,6 +2952,7 @@ namespace SoD
|
|||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
||||||
|
|
||||||
|
emu->slot = static_cast<uint32>(SoDToServerCastingSlot(static_cast<CastingSlot>(eq->slot)));
|
||||||
IN(slot);
|
IN(slot);
|
||||||
IN(spell_id);
|
IN(spell_id);
|
||||||
emu->inventoryslot = SoDToServerSlot(eq->inventoryslot);
|
emu->inventoryslot = SoDToServerSlot(eq->inventoryslot);
|
||||||
@@ -3239,8 +3246,10 @@ namespace SoD
|
|||||||
DECODE_LENGTH_EXACT(structs::LoadSpellSet_Struct);
|
DECODE_LENGTH_EXACT(structs::LoadSpellSet_Struct);
|
||||||
SETUP_DIRECT_DECODE(LoadSpellSet_Struct, structs::LoadSpellSet_Struct);
|
SETUP_DIRECT_DECODE(LoadSpellSet_Struct, structs::LoadSpellSet_Struct);
|
||||||
|
|
||||||
for (uint32 i = 0; i < MAX_PP_MEMSPELL; ++i)
|
for (int i = 0; i < structs::MAX_PP_MEMSPELL; ++i)
|
||||||
emu->spell[i] = eq->spell[i];
|
emu->spell[i] = eq->spell[i];
|
||||||
|
for (int i = structs::MAX_PP_MEMSPELL; i < MAX_PP_MEMSPELL; ++i)
|
||||||
|
emu->spell[i] = 0xFFFFFFFF;
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
@@ -3546,7 +3555,7 @@ namespace SoD
|
|||||||
|
|
||||||
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
||||||
{
|
{
|
||||||
const EQEmu::Item_Struct *item = inst->GetUnscaledItem();
|
const EQEmu::ItemBase *item = inst->GetUnscaledItem();
|
||||||
|
|
||||||
SoD::structs::ItemSerializationHeader hdr;
|
SoD::structs::ItemSerializationHeader hdr;
|
||||||
|
|
||||||
@@ -4011,4 +4020,72 @@ namespace SoD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToSoDCastingSlot(EQEmu::CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case EQEmu::CastingSlot::Gem1:
|
||||||
|
return CastingSlot::Gem1;
|
||||||
|
case EQEmu::CastingSlot::Gem2:
|
||||||
|
return CastingSlot::Gem2;
|
||||||
|
case EQEmu::CastingSlot::Gem3:
|
||||||
|
return CastingSlot::Gem3;
|
||||||
|
case EQEmu::CastingSlot::Gem4:
|
||||||
|
return CastingSlot::Gem4;
|
||||||
|
case EQEmu::CastingSlot::Gem5:
|
||||||
|
return CastingSlot::Gem5;
|
||||||
|
case EQEmu::CastingSlot::Gem6:
|
||||||
|
return CastingSlot::Gem6;
|
||||||
|
case EQEmu::CastingSlot::Gem7:
|
||||||
|
return CastingSlot::Gem7;
|
||||||
|
case EQEmu::CastingSlot::Gem8:
|
||||||
|
return CastingSlot::Gem8;
|
||||||
|
case EQEmu::CastingSlot::Gem9:
|
||||||
|
return CastingSlot::Gem9;
|
||||||
|
case EQEmu::CastingSlot::Gem10:
|
||||||
|
return CastingSlot::Gem10;
|
||||||
|
case EQEmu::CastingSlot::Item:
|
||||||
|
case EQEmu::CastingSlot::PotionBelt:
|
||||||
|
return CastingSlot::Item;
|
||||||
|
case EQEmu::CastingSlot::Discipline:
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
case EQEmu::CastingSlot::AltAbility:
|
||||||
|
return CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline EQEmu::CastingSlot SoDToServerCastingSlot(CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case CastingSlot::Gem1:
|
||||||
|
return EQEmu::CastingSlot::Gem1;
|
||||||
|
case CastingSlot::Gem2:
|
||||||
|
return EQEmu::CastingSlot::Gem2;
|
||||||
|
case CastingSlot::Gem3:
|
||||||
|
return EQEmu::CastingSlot::Gem3;
|
||||||
|
case CastingSlot::Gem4:
|
||||||
|
return EQEmu::CastingSlot::Gem4;
|
||||||
|
case CastingSlot::Gem5:
|
||||||
|
return EQEmu::CastingSlot::Gem5;
|
||||||
|
case CastingSlot::Gem6:
|
||||||
|
return EQEmu::CastingSlot::Gem6;
|
||||||
|
case CastingSlot::Gem7:
|
||||||
|
return EQEmu::CastingSlot::Gem7;
|
||||||
|
case CastingSlot::Gem8:
|
||||||
|
return EQEmu::CastingSlot::Gem8;
|
||||||
|
case CastingSlot::Gem9:
|
||||||
|
return EQEmu::CastingSlot::Gem9;
|
||||||
|
case CastingSlot::Gem10:
|
||||||
|
return EQEmu::CastingSlot::Gem10;
|
||||||
|
case CastingSlot::Discipline:
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
case CastingSlot::Item:
|
||||||
|
return EQEmu::CastingSlot::Item;
|
||||||
|
case CastingSlot::AltAbility:
|
||||||
|
return EQEmu::CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
} /*SoD*/
|
} /*SoD*/
|
||||||
|
|||||||
@@ -50,6 +50,22 @@ namespace SoD
|
|||||||
#include "sod_ops.h"
|
#include "sod_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CastingSlot : uint32 {
|
||||||
|
Gem1 = 0,
|
||||||
|
Gem2 = 1,
|
||||||
|
Gem3 = 2,
|
||||||
|
Gem4 = 3,
|
||||||
|
Gem5 = 4,
|
||||||
|
Gem6 = 5,
|
||||||
|
Gem7 = 6,
|
||||||
|
Gem8 = 7,
|
||||||
|
Gem9 = 8,
|
||||||
|
Gem10 = 9,
|
||||||
|
Item = 10,
|
||||||
|
Discipline = 11,
|
||||||
|
AltAbility = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
}; /*SoD*/
|
}; /*SoD*/
|
||||||
|
|
||||||
#endif /*COMMON_SOD_H*/
|
#endif /*COMMON_SOD_H*/
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "../string_util.h"
|
#include "../string_util.h"
|
||||||
|
|
||||||
|
|
||||||
size_t SoD::invtype::InvTypeSize(int inv_type)
|
size_t SoD::invtype::GetInvTypeSize(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypePossessions:
|
case invtype::InvTypePossessions:
|
||||||
@@ -68,7 +68,7 @@ size_t SoD::invtype::InvTypeSize(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoD::invtype::InvTypeName(int inv_type)
|
const char* SoD::invtype::GetInvTypeName(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypeInvalid:
|
case invtype::InvTypeInvalid:
|
||||||
@@ -116,7 +116,24 @@ const char* SoD::invtype::InvTypeName(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoD::invslot::InvPossessionsSlotName(int inv_slot)
|
bool SoD::invtype::IsInvTypePersistent(int inv_type)
|
||||||
|
{
|
||||||
|
switch (inv_type) {
|
||||||
|
case invtype::InvTypePossessions:
|
||||||
|
case invtype::InvTypeBank:
|
||||||
|
case invtype::InvTypeSharedBank:
|
||||||
|
case invtype::InvTypeTrade:
|
||||||
|
case invtype::InvTypeWorld:
|
||||||
|
case invtype::InvTypeLimbo:
|
||||||
|
case invtype::InvTypeTribute:
|
||||||
|
case invtype::InvTypeGuildTribute:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* SoD::invslot::GetInvPossessionsSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
switch (inv_slot) {
|
switch (inv_slot) {
|
||||||
case invslot::InvSlotInvalid:
|
case invslot::InvSlotInvalid:
|
||||||
@@ -190,9 +207,9 @@ const char* SoD::invslot::InvPossessionsSlotName(int inv_slot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoD::invslot::InvCorpseSlotName(int inv_slot)
|
const char* SoD::invslot::GetInvCorpseSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
if (!invtype::InvTypeSize(invtype::InvTypeCorpse) || inv_slot == invslot::InvSlotInvalid)
|
if (!invtype::GetInvTypeSize(invtype::InvTypeCorpse) || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
|
|
||||||
// needs work
|
// needs work
|
||||||
@@ -205,14 +222,14 @@ const char* SoD::invslot::InvCorpseSlotName(int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoD::invslot::InvSlotName(int inv_type, int inv_slot)
|
const char* SoD::invslot::GetInvSlotName(int inv_type, int inv_slot)
|
||||||
{
|
{
|
||||||
if (inv_type == invtype::InvTypePossessions)
|
if (inv_type == invtype::InvTypePossessions)
|
||||||
return invslot::InvPossessionsSlotName(inv_slot);
|
return invslot::GetInvPossessionsSlotName(inv_slot);
|
||||||
else if (inv_type == invtype::InvTypeCorpse)
|
else if (inv_type == invtype::InvTypeCorpse)
|
||||||
return invslot::InvCorpseSlotName(inv_slot);
|
return invslot::GetInvCorpseSlotName(inv_slot);
|
||||||
|
|
||||||
size_t type_size = invtype::InvTypeSize(inv_type);
|
size_t type_size = invtype::GetInvTypeSize(inv_type);
|
||||||
|
|
||||||
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
@@ -226,7 +243,7 @@ const char* SoD::invslot::InvSlotName(int inv_type, int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoD::invbag::InvBagIndexName(int bag_index)
|
const char* SoD::invbag::GetInvBagIndexName(int bag_index)
|
||||||
{
|
{
|
||||||
if (bag_index == invbag::InvBagInvalid)
|
if (bag_index == invbag::InvBagInvalid)
|
||||||
return "Invalid Bag";
|
return "Invalid Bag";
|
||||||
@@ -240,7 +257,7 @@ const char* SoD::invbag::InvBagIndexName(int bag_index)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoD::invaug::InvAugIndexName(int aug_index)
|
const char* SoD::invaug::GetInvAugIndexName(int aug_index)
|
||||||
{
|
{
|
||||||
if (aug_index == invaug::InvAugInvalid)
|
if (aug_index == invaug::InvAugInvalid)
|
||||||
return "Invalid Augment";
|
return "Invalid Augment";
|
||||||
|
|||||||
+39
-27
@@ -21,7 +21,7 @@
|
|||||||
#define COMMON_SOD_LIMITS_H
|
#define COMMON_SOD_LIMITS_H
|
||||||
|
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
#include "../client_version.h"
|
#include "../emu_versions.h"
|
||||||
#include "../skills.h"
|
#include "../skills.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -32,8 +32,13 @@ namespace SoD
|
|||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
// pre-declarations
|
// pre-declarations
|
||||||
|
namespace inventory {
|
||||||
|
inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
inline EQEmu::versions::ClientVersion InvTypeRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
||||||
|
|
||||||
@@ -63,7 +68,7 @@ namespace SoD
|
|||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
namespace invslot {
|
namespace invslot {
|
||||||
inline EQEmu::versions::ClientVersion InvSlotRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
||||||
|
|
||||||
@@ -114,21 +119,21 @@ namespace SoD
|
|||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
inline EQEmu::versions::ClientVersion InvBagRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
enum : int { InvBagInvalid = -1, InvBagBegin };
|
enum : int { InvBagInvalid = -1, InvBagBegin };
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
inline EQEmu::versions::ClientVersion InvAugRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
enum : int { InvAugInvalid = -1, InvAugBegin };
|
enum : int { InvAugInvalid = -1, InvAugBegin };
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
namespace item {
|
namespace item {
|
||||||
inline EQEmu::versions::ClientVersion ItemRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
enum ItemPacketType : int {
|
enum ItemPacketType : int {
|
||||||
ItemPacketMerchant = 100,
|
ItemPacketMerchant = 100,
|
||||||
@@ -146,27 +151,37 @@ namespace SoD
|
|||||||
} /*item*/
|
} /*item*/
|
||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
inline EQEmu::versions::ClientVersion ProfileRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
} /*profile*/
|
} /*profile*/
|
||||||
|
|
||||||
namespace constants {
|
namespace constants {
|
||||||
inline EQEmu::versions::ClientVersion ConstantsRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
inline EQEmu::versions::ClientVersion BehaviorRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|
||||||
namespace skills {
|
namespace skills {
|
||||||
inline EQEmu::versions::ClientVersion SkillsRef() { return EQEmu::versions::ClientVersion::SoD; }
|
inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::SoD; }
|
||||||
|
|
||||||
} /*skills*/
|
} /*skills*/
|
||||||
|
|
||||||
|
|
||||||
// declarations
|
// declarations
|
||||||
|
namespace inventory {
|
||||||
|
const bool ConcatenateInvTypeLimbo = true;
|
||||||
|
|
||||||
|
const bool AllowOverLevelEquipment = false;
|
||||||
|
|
||||||
|
const bool AllowEmptyBagInBag = false;
|
||||||
|
const bool AllowClickCastFromBag = false;
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
||||||
const size_t InvTypeBankSize = 24;
|
const size_t InvTypeBankSize = 24;
|
||||||
@@ -175,7 +190,7 @@ namespace SoD
|
|||||||
const size_t InvTypeWorldSize = 10;
|
const size_t InvTypeWorldSize = 10;
|
||||||
const size_t InvTypeLimboSize = 36;
|
const size_t InvTypeLimboSize = 36;
|
||||||
const size_t InvTypeTributeSize = 5;
|
const size_t InvTypeTributeSize = 5;
|
||||||
const size_t InvTypeGuildTributeSize = 0;//unknown
|
const size_t InvTypeGuildTributeSize = 2;
|
||||||
const size_t InvTypeMerchantSize = 80;
|
const size_t InvTypeMerchantSize = 80;
|
||||||
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
||||||
const size_t InvTypeBazaarSize = 80;
|
const size_t InvTypeBazaarSize = 80;
|
||||||
@@ -188,10 +203,10 @@ namespace SoD
|
|||||||
const size_t InvTypeArchivedSize = 0;//unknown
|
const size_t InvTypeArchivedSize = 0;//unknown
|
||||||
const size_t InvTypeOtherSize = 0;//unknown
|
const size_t InvTypeOtherSize = 0;//unknown
|
||||||
|
|
||||||
const size_t NPCTradeSize = 4;
|
extern size_t GetInvTypeSize(int inv_type);
|
||||||
|
extern const char* GetInvTypeName(int inv_type);
|
||||||
|
|
||||||
extern size_t InvTypeSize(int inv_type);
|
extern bool IsInvTypePersistent(int inv_type);
|
||||||
extern const char* InvTypeName(int inv_type);
|
|
||||||
|
|
||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
@@ -210,14 +225,17 @@ namespace SoD
|
|||||||
const int WorldEnd = (WorldBegin + invtype::InvTypeWorldSize) - 1;
|
const int WorldEnd = (WorldBegin + invtype::InvTypeWorldSize) - 1;
|
||||||
|
|
||||||
const int TributeBegin = 400;
|
const int TributeBegin = 400;
|
||||||
const int TributeEnd = 404;
|
const int TributeEnd = (TributeBegin + invtype::InvTypeTributeSize) - 1;
|
||||||
|
|
||||||
|
const int GuildTributeBegin = 450;
|
||||||
|
const int GuildTributeEnd = (GuildTributeBegin + invtype::InvTypeGuildTributeSize) - 1;
|
||||||
|
|
||||||
const int CorpseBegin = invslot::PossessionsGeneral1;
|
const int CorpseBegin = invslot::PossessionsGeneral1;
|
||||||
const int CorpseEnd = invslot::PossessionsGeneral1 + invslot::PossessionsCursor;
|
const int CorpseEnd = invslot::PossessionsGeneral1 + invslot::PossessionsCursor;
|
||||||
|
|
||||||
extern const char* InvPossessionsSlotName(int inv_slot);
|
extern const char* GetInvPossessionsSlotName(int inv_slot);
|
||||||
extern const char* InvCorpseSlotName(int inv_slot);
|
extern const char* GetInvCorpseSlotName(int inv_slot);
|
||||||
extern const char* InvSlotName(int inv_type, int inv_slot);
|
extern const char* GetInvSlotName(int inv_type, int inv_slot);
|
||||||
|
|
||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
@@ -244,14 +262,14 @@ namespace SoD
|
|||||||
const int TradeBagsSize = invtype::InvTypeTradeSize * ItemBagSize;
|
const int TradeBagsSize = invtype::InvTypeTradeSize * ItemBagSize;
|
||||||
const int TradeBagsEnd = (TradeBagsBegin + TradeBagsSize) - 1;
|
const int TradeBagsEnd = (TradeBagsBegin + TradeBagsSize) - 1;
|
||||||
|
|
||||||
extern const char* InvBagIndexName(int bag_index);
|
extern const char* GetInvBagIndexName(int bag_index);
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
const size_t ItemAugSize = 5;
|
const size_t ItemAugSize = 5;
|
||||||
|
|
||||||
extern const char* InvAugIndexName(int aug_index);
|
extern const char* GetInvAugIndexName(int aug_index);
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
@@ -261,6 +279,7 @@ namespace SoD
|
|||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
const size_t TributeSize = invtype::InvTypeTributeSize;
|
const size_t TributeSize = invtype::InvTypeTributeSize;
|
||||||
|
const size_t GuildTributeSize = invtype::InvTypeGuildTributeSize;
|
||||||
|
|
||||||
const size_t BandoliersSize = 20; // number of bandolier instances
|
const size_t BandoliersSize = 20; // number of bandolier instances
|
||||||
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
||||||
@@ -279,13 +298,6 @@ namespace SoD
|
|||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
const bool ConcatenateInvTypeLimbo = true;
|
|
||||||
|
|
||||||
const bool AllowOverLevelEquipment = false;
|
|
||||||
|
|
||||||
const bool AllowEmptyBagInBag = false;
|
|
||||||
const bool AllowClickCastFromBag = false;
|
|
||||||
|
|
||||||
const bool CoinHasWeight = false;
|
const bool CoinHasWeight = false;
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|||||||
+70
-116
@@ -122,7 +122,7 @@ struct AdventureInfo {
|
|||||||
** Merth: Gave struct a name so gcc 2.96 would compile
|
** Merth: Gave struct a name so gcc 2.96 would compile
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
struct Color_Struct
|
struct Tint_Struct
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
@@ -130,19 +130,62 @@ struct Color_Struct
|
|||||||
uint8 Green;
|
uint8 Green;
|
||||||
uint8 Red;
|
uint8 Red;
|
||||||
uint8 UseTint; // if there's a tint this is FF
|
uint8 UseTint; // if there's a tint this is FF
|
||||||
} RGB;
|
};
|
||||||
uint32 Color;
|
uint32 Color;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CharSelectEquip
|
struct TintProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Tint_Struct Head;
|
||||||
|
Tint_Struct Chest;
|
||||||
|
Tint_Struct Arms;
|
||||||
|
Tint_Struct Wrist;
|
||||||
|
Tint_Struct Hands;
|
||||||
|
Tint_Struct Legs;
|
||||||
|
Tint_Struct Feet;
|
||||||
|
Tint_Struct Primary;
|
||||||
|
Tint_Struct Secondary;
|
||||||
|
};
|
||||||
|
Tint_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Visible equiptment.
|
||||||
|
* Size: 12 Octets
|
||||||
|
*/
|
||||||
|
struct Texture_Struct
|
||||||
{
|
{
|
||||||
uint32 Material;
|
uint32 Material;
|
||||||
uint32 Unknown1;
|
uint32 Unknown1;
|
||||||
uint32 EliteMaterial;
|
uint32 EliteMaterial;
|
||||||
Color_Struct Color;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TextureProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Texture_Struct Head;
|
||||||
|
Texture_Struct Chest;
|
||||||
|
Texture_Struct Arms;
|
||||||
|
Texture_Struct Wrist;
|
||||||
|
Texture_Struct Hands;
|
||||||
|
Texture_Struct Legs;
|
||||||
|
Texture_Struct Feet;
|
||||||
|
Texture_Struct Primary;
|
||||||
|
Texture_Struct Secondary;
|
||||||
|
};
|
||||||
|
Texture_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
TextureProfile();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CharSelectEquip : Texture_Struct, Tint_Struct {};
|
||||||
|
|
||||||
struct CharacterSelectEntry_Struct
|
struct CharacterSelectEntry_Struct
|
||||||
{
|
{
|
||||||
/*0000*/ uint8 Level; //
|
/*0000*/ uint8 Level; //
|
||||||
@@ -152,7 +195,7 @@ struct CharacterSelectEntry_Struct
|
|||||||
/*0000*/ uint8 Beard; //
|
/*0000*/ uint8 Beard; //
|
||||||
/*0001*/ uint8 HairColor; //
|
/*0001*/ uint8 HairColor; //
|
||||||
/*0000*/ uint8 Face; //
|
/*0000*/ uint8 Face; //
|
||||||
/*0000*/ CharSelectEquip Equip[9];
|
/*0000*/ CharSelectEquip Equip[EQEmu::textures::TextureCount];
|
||||||
/*0000*/ uint32 PrimaryIDFile; //
|
/*0000*/ uint32 PrimaryIDFile; //
|
||||||
/*0000*/ uint32 SecondaryIDFile; //
|
/*0000*/ uint32 SecondaryIDFile; //
|
||||||
/*0000*/ uint8 Unknown15; // 0xff
|
/*0000*/ uint8 Unknown15; // 0xff
|
||||||
@@ -185,19 +228,6 @@ struct CharacterSelect_Struct
|
|||||||
/*0008*/ CharacterSelectEntry_Struct Entries[0];
|
/*0008*/ CharacterSelectEntry_Struct Entries[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Visible equiptment.
|
|
||||||
* Size: 12 Octets
|
|
||||||
*/
|
|
||||||
struct EquipStruct
|
|
||||||
{
|
|
||||||
/*00*/ uint32 Material;
|
|
||||||
/*04*/ uint32 Unknown1;
|
|
||||||
/*08*/ uint32 EliteMaterial;
|
|
||||||
/*12*/
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Generic Spawn Struct
|
** Generic Spawn Struct
|
||||||
** Length: 897 Octets
|
** Length: 897 Octets
|
||||||
@@ -314,40 +344,10 @@ struct Spawn_Struct
|
|||||||
/*0000*/ uint32 unknown18;
|
/*0000*/ uint32 unknown18;
|
||||||
/*0000*/ uint32 unknown19;
|
/*0000*/ uint32 unknown19;
|
||||||
Spawn_Struct_Position Position;
|
Spawn_Struct_Position Position;
|
||||||
/*0000*/ union
|
/*0000*/ TintProfile equipment_tint;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0000*/ Color_Struct color_helmet; // Color of helmet item
|
|
||||||
/*0000*/ Color_Struct color_chest; // Color of chest item
|
|
||||||
/*0000*/ Color_Struct color_arms; // Color of arms item
|
|
||||||
/*0000*/ Color_Struct color_bracers; // Color of bracers item
|
|
||||||
/*0000*/ Color_Struct color_hands; // Color of hands item
|
|
||||||
/*0000*/ Color_Struct color_legs; // Color of legs item
|
|
||||||
/*0000*/ Color_Struct color_feet; // Color of feet item
|
|
||||||
/*0000*/ Color_Struct color_primary; // Color of primary item
|
|
||||||
/*0000*/ Color_Struct color_secondary; // Color of secondary item
|
|
||||||
} equipment_colors;
|
|
||||||
/*0000*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
|
|
||||||
};
|
|
||||||
|
|
||||||
// skip these bytes if not a valid player race
|
// skip these bytes if not a valid player race
|
||||||
/*0000*/ union
|
/*0000*/ TextureProfile equipment;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
|
||||||
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
|
||||||
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
|
||||||
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
|
||||||
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
|
||||||
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
|
||||||
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
|
||||||
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
|
|
||||||
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
|
||||||
} equip;
|
|
||||||
/*0000*/ EquipStruct equipment[9];
|
|
||||||
};
|
|
||||||
|
|
||||||
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
||||||
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
|
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
|
||||||
@@ -479,7 +479,7 @@ struct MemorizeSpell_Struct {
|
|||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
//uint32 unknown12;
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -512,11 +512,12 @@ struct DeleteSpell_Struct
|
|||||||
|
|
||||||
struct ManaChange_Struct
|
struct ManaChange_Struct
|
||||||
{
|
{
|
||||||
uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
uint32 spell_id;
|
/*08*/ uint32 spell_id;
|
||||||
uint32 unknown12;
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
uint32 unknown16;
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SwapSpell_Struct
|
struct SwapSpell_Struct
|
||||||
@@ -563,32 +564,22 @@ struct SpawnAppearance_Struct
|
|||||||
// this is used inside profile
|
// this is used inside profile
|
||||||
struct SpellBuff_Struct
|
struct SpellBuff_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
|
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
|
||||||
/*001*/ uint8 level;
|
/*001*/ uint8 level; // Seen 1 for no buff
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 bard_modifier;
|
||||||
/*003*/ uint8 effect; //not real
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ uint32 spellid;
|
/*004*/ uint32 spellid;
|
||||||
/*008*/ int32 duration;
|
/*008*/ uint32 duration;
|
||||||
/*012*/ uint32 counters;
|
/*012*/ uint32 counters;
|
||||||
/*016*/ uint32 unknown004; //Might need to be swapped with player_id
|
/*016*/ uint32 unknown016;
|
||||||
/*020*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
|
/*020*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
/*024*/
|
/*024*/
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct SpellBuffFade_Struct {
|
struct SpellBuffPacket_Struct {
|
||||||
/*000*/ uint32 entityid;
|
/*000*/ uint32 entityid;
|
||||||
/*004*/ uint8 slot;
|
/*004*/ SpellBuff_Struct buff;
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown7;
|
|
||||||
/*008*/ uint32 spellid;
|
|
||||||
/*012*/ int32 duration;
|
|
||||||
/*016*/ uint32 unknown016;
|
|
||||||
/*020*/ uint32 unknown020; //prolly global player ID
|
|
||||||
/*024*/ uint32 playerId; // Player id who cast the buff
|
|
||||||
/*028*/ uint32 slotid;
|
/*028*/ uint32 slotid;
|
||||||
/*032*/ uint32 bufffade;
|
/*032*/ uint32 bufffade;
|
||||||
/*036*/
|
/*036*/
|
||||||
@@ -903,24 +894,9 @@ struct PlayerProfile_Struct
|
|||||||
/*00216*/ uint8 hairstyle; // Player hair style
|
/*00216*/ uint8 hairstyle; // Player hair style
|
||||||
/*00217*/ uint8 beard; // Player beard type
|
/*00217*/ uint8 beard; // Player beard type
|
||||||
/*00218*/ uint8 unknown00178[14]; //[10]14 on Live? was 10
|
/*00218*/ uint8 unknown00178[14]; //[10]14 on Live? was 10
|
||||||
/*00232*/ union
|
/*00232*/ TextureProfile equipment;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*00228*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
|
||||||
/*00240*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
|
||||||
/*00252*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
|
||||||
/*00264*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
|
||||||
/*00276*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
|
||||||
/*00288*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
|
||||||
/*00300*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
|
||||||
/*00312*/ EquipStruct equip_primary; // Equiptment: Main visual
|
|
||||||
/*00324*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
|
||||||
} equip;
|
|
||||||
/*00228*/ EquipStruct equipment[9]; //Live Shows [108] for this part
|
|
||||||
};
|
|
||||||
/*00340*/ uint8 unknown00224[156]; // Live Shows [160]
|
/*00340*/ uint8 unknown00224[156]; // Live Shows [160]
|
||||||
/*00496*/ Color_Struct item_tint[9]; // RR GG BB 00
|
/*00496*/ TintProfile item_tint; // RR GG BB 00
|
||||||
/*00532*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each
|
/*00532*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each
|
||||||
/*04132*/ uint32 points; // Unspent Practice points - RELOCATED???
|
/*04132*/ uint32 points; // Unspent Practice points - RELOCATED???
|
||||||
/*04136*/ uint32 mana; // Current mana
|
/*04136*/ uint32 mana; // Current mana
|
||||||
@@ -1177,7 +1153,7 @@ struct WearChange_Struct{
|
|||||||
/*002*/ uint32 material;
|
/*002*/ uint32 material;
|
||||||
/*006*/ uint32 unknown06;
|
/*006*/ uint32 unknown06;
|
||||||
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
||||||
/*014*/ Color_Struct color;
|
/*014*/ Tint_Struct color;
|
||||||
/*018*/ uint8 wear_slot_id;
|
/*018*/ uint8 wear_slot_id;
|
||||||
/*019*/
|
/*019*/
|
||||||
};
|
};
|
||||||
@@ -1904,8 +1880,7 @@ struct Merchant_Sell_Struct {
|
|||||||
/*004*/ uint32 playerid; // Player's entity id
|
/*004*/ uint32 playerid; // Player's entity id
|
||||||
/*008*/ uint32 itemslot;
|
/*008*/ uint32 itemslot;
|
||||||
/*012*/ uint32 unknown12;
|
/*012*/ uint32 unknown12;
|
||||||
/*016*/ uint8 quantity; // Already sold
|
/*016*/ uint32 quantity;
|
||||||
/*017*/ uint8 Unknown017[3];
|
|
||||||
/*020*/ uint32 Unknown020;
|
/*020*/ uint32 Unknown020;
|
||||||
/*024*/ uint32 price;
|
/*024*/ uint32 price;
|
||||||
/*028*/ uint32 pricehighorderbits; // It appears the price is 64 bits in SoD+
|
/*028*/ uint32 pricehighorderbits; // It appears the price is 64 bits in SoD+
|
||||||
@@ -1995,7 +1970,7 @@ struct AdventureLeaderboard_Struct
|
|||||||
/*struct Item_Shop_Struct {
|
/*struct Item_Shop_Struct {
|
||||||
uint16 merchantid;
|
uint16 merchantid;
|
||||||
uint8 itemtype;
|
uint8 itemtype;
|
||||||
Item_Struct item;
|
ItemBase item;
|
||||||
uint8 iss_unknown001[6];
|
uint8 iss_unknown001[6];
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
@@ -3091,27 +3066,6 @@ struct PetitionBug_Struct{
|
|||||||
char text[1028];
|
char text[1028];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DyeStruct
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct Color_Struct head;
|
|
||||||
struct Color_Struct chest;
|
|
||||||
struct Color_Struct arms;
|
|
||||||
struct Color_Struct wrists;
|
|
||||||
struct Color_Struct hands;
|
|
||||||
struct Color_Struct legs;
|
|
||||||
struct Color_Struct feet;
|
|
||||||
struct Color_Struct primary; // you can't actually dye this
|
|
||||||
struct Color_Struct secondary; // or this
|
|
||||||
}
|
|
||||||
dyes;
|
|
||||||
struct Color_Struct dye[9];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
uint32 zoneid;
|
uint32 zoneid;
|
||||||
|
|||||||
+146
-37
@@ -59,6 +59,9 @@ namespace SoF
|
|||||||
// client to server text link converter
|
// client to server text link converter
|
||||||
static inline void SoFToServerTextLink(std::string& serverTextLink, const std::string& sofTextLink);
|
static inline void SoFToServerTextLink(std::string& serverTextLink, const std::string& sofTextLink);
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToSoFCastingSlot(EQEmu::CastingSlot slot);
|
||||||
|
static inline EQEmu::CastingSlot SoFToServerCastingSlot(CastingSlot slot, uint32 itemlocation);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
{
|
{
|
||||||
//create our opcode manager if we havent already
|
//create our opcode manager if we havent already
|
||||||
@@ -80,7 +83,7 @@ namespace SoF
|
|||||||
|
|
||||||
//ok, now we have what we need to register.
|
//ok, now we have what we need to register.
|
||||||
|
|
||||||
EQStream::Signature signature;
|
EQStreamInterface::Signature signature;
|
||||||
std::string pname;
|
std::string pname;
|
||||||
|
|
||||||
//register our world signature.
|
//register our world signature.
|
||||||
@@ -283,16 +286,17 @@ namespace SoF
|
|||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_Buff)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
OUT(entityid);
|
OUT(entityid);
|
||||||
OUT(slot);
|
OUT(buff.effect_type);
|
||||||
OUT(level);
|
OUT(buff.level);
|
||||||
OUT(effect);
|
OUT(buff.bard_modifier);
|
||||||
//eq->unknown7 = 10;
|
OUT(buff.spellid);
|
||||||
OUT(spellid);
|
OUT(buff.duration);
|
||||||
OUT(duration);
|
OUT(buff.counters);
|
||||||
|
OUT(buff.player_id);
|
||||||
OUT(slotid);
|
OUT(slotid);
|
||||||
OUT(bufffade);
|
OUT(bufffade);
|
||||||
|
|
||||||
@@ -932,7 +936,24 @@ namespace SoF
|
|||||||
OUT(new_mana);
|
OUT(new_mana);
|
||||||
OUT(stamina);
|
OUT(stamina);
|
||||||
OUT(spell_id);
|
OUT(spell_id);
|
||||||
eq->unknown16 = -1; // Self Interrupt/Success = -1, Fizzle = 1, Other Interrupt = 2?
|
OUT(keepcasting);
|
||||||
|
eq->slot = -1; // this is spell gem slot. It's -1 in normal operation
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_MemorizeSpell)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(MemorizeSpell_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(MemorizeSpell_Struct, structs::MemorizeSpell_Struct);
|
||||||
|
|
||||||
|
// Since HT/LoH are translated up, we need to translate down only for memSpellSpellbar case
|
||||||
|
if (emu->scribing == 3)
|
||||||
|
eq->slot = static_cast<uint32>(ServerToSoFCastingSlot(static_cast<EQEmu::CastingSlot>(emu->slot)));
|
||||||
|
else
|
||||||
|
OUT(slot);
|
||||||
|
OUT(spell_id);
|
||||||
|
OUT(scribing);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -1157,9 +1178,9 @@ namespace SoF
|
|||||||
OUT(petid);
|
OUT(petid);
|
||||||
OUT(buffcount);
|
OUT(buffcount);
|
||||||
|
|
||||||
int EQBuffSlot = 0;
|
int EQBuffSlot = 0; // do we really want to shuffle them around like this?
|
||||||
|
|
||||||
for (uint32 EmuBuffSlot = 0; EmuBuffSlot < BUFF_COUNT; ++EmuBuffSlot)
|
for (uint32 EmuBuffSlot = 0; EmuBuffSlot < PET_BUFF_COUNT; ++EmuBuffSlot)
|
||||||
{
|
{
|
||||||
if (emu->spellid[EmuBuffSlot])
|
if (emu->spellid[EmuBuffSlot])
|
||||||
{
|
{
|
||||||
@@ -1209,14 +1230,14 @@ namespace SoF
|
|||||||
OUT(hairstyle);
|
OUT(hairstyle);
|
||||||
OUT(beard);
|
OUT(beard);
|
||||||
// OUT(unknown00178[10]);
|
// OUT(unknown00178[10]);
|
||||||
for (r = 0; r < 9; r++) {
|
for (r = EQEmu::textures::TextureBegin; r < EQEmu::textures::TextureCount; r++) {
|
||||||
eq->equipment[r].Material = emu->item_material[r];
|
eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material;
|
||||||
eq->equipment[r].Unknown1 = 0;
|
eq->equipment.Slot[r].Unknown1 = 0;
|
||||||
eq->equipment[r].EliteMaterial = 0;
|
eq->equipment.Slot[r].EliteMaterial = 0;
|
||||||
//eq->colors[r].color = emu->colors[r].color;
|
//eq->colors[r].color = emu->colors[r].color;
|
||||||
}
|
}
|
||||||
for (r = 0; r < 7; r++) {
|
for (r = 0; r < 7; r++) {
|
||||||
OUT(item_tint[r].Color);
|
OUT(item_tint.Slot[r].Color);
|
||||||
}
|
}
|
||||||
// OUT(unknown00224[48]);
|
// OUT(unknown00224[48]);
|
||||||
//NOTE: new client supports 300 AAs, our internal rep/PP
|
//NOTE: new client supports 300 AAs, our internal rep/PP
|
||||||
@@ -1258,10 +1279,10 @@ namespace SoF
|
|||||||
OUT(thirst_level);
|
OUT(thirst_level);
|
||||||
OUT(hunger_level);
|
OUT(hunger_level);
|
||||||
for (r = 0; r < structs::BUFF_COUNT; r++) {
|
for (r = 0; r < structs::BUFF_COUNT; r++) {
|
||||||
OUT(buffs[r].slotid);
|
OUT(buffs[r].effect_type);
|
||||||
OUT(buffs[r].level);
|
OUT(buffs[r].level);
|
||||||
OUT(buffs[r].bard_modifier);
|
OUT(buffs[r].bard_modifier);
|
||||||
OUT(buffs[r].effect);
|
OUT(buffs[r].unknown003);
|
||||||
OUT(buffs[r].spellid);
|
OUT(buffs[r].spellid);
|
||||||
OUT(buffs[r].duration);
|
OUT(buffs[r].duration);
|
||||||
OUT(buffs[r].counters);
|
OUT(buffs[r].counters);
|
||||||
@@ -1649,11 +1670,11 @@ namespace SoF
|
|||||||
eq_cse->HairColor = emu_cse->HairColor;
|
eq_cse->HairColor = emu_cse->HairColor;
|
||||||
eq_cse->Face = emu_cse->Face;
|
eq_cse->Face = emu_cse->Face;
|
||||||
|
|
||||||
for (int equip_index = 0; equip_index < EQEmu::legacy::MaterialCount; equip_index++) {
|
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
|
||||||
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
||||||
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
||||||
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
||||||
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
|
eq_cse->Equip[equip_index].Color = emu_cse->Equip[equip_index].Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq_cse->PrimaryIDFile = emu_cse->PrimaryIDFile;
|
eq_cse->PrimaryIDFile = emu_cse->PrimaryIDFile;
|
||||||
@@ -2080,11 +2101,11 @@ namespace SoF
|
|||||||
eq->deity = emu->deity;
|
eq->deity = emu->deity;
|
||||||
eq->drakkin_heritage = emu->drakkin_heritage;
|
eq->drakkin_heritage = emu->drakkin_heritage;
|
||||||
eq->gender = emu->gender;
|
eq->gender = emu->gender;
|
||||||
for (k = 0; k < 9; k++) {
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; k++) {
|
||||||
eq->equipment[k].Material = emu->equipment[k].Material;
|
eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
|
||||||
eq->equipment[k].Unknown1 = emu->equipment[k].Unknown1;
|
eq->equipment.Slot[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
|
||||||
eq->equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial;
|
eq->equipment.Slot[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
|
||||||
eq->colors[k].Color = emu->colors[k].Color;
|
eq->equipment_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color;
|
||||||
}
|
}
|
||||||
eq->StandState = emu->StandState;
|
eq->StandState = emu->StandState;
|
||||||
eq->guildID = emu->guildID;
|
eq->guildID = emu->guildID;
|
||||||
@@ -2146,8 +2167,8 @@ namespace SoF
|
|||||||
strcpy(eq->name, emu->name);
|
strcpy(eq->name, emu->name);
|
||||||
eq->petOwnerId = emu->petOwnerId;
|
eq->petOwnerId = emu->petOwnerId;
|
||||||
eq->pvp = 0; // 0 = non-pvp colored name, 1 = red pvp name
|
eq->pvp = 0; // 0 = non-pvp colored name, 1 = red pvp name
|
||||||
for (k = 0; k < 9; k++) {
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; k++) {
|
||||||
eq->colors[k].Color = emu->colors[k].Color;
|
eq->equipment_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color;
|
||||||
}
|
}
|
||||||
eq->anon = emu->anon;
|
eq->anon = emu->anon;
|
||||||
eq->face = emu->face;
|
eq->face = emu->face;
|
||||||
@@ -2343,15 +2364,17 @@ namespace SoF
|
|||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
IN(entityid);
|
IN(entityid);
|
||||||
IN(slot);
|
IN(buff.effect_type);
|
||||||
IN(level);
|
IN(buff.level);
|
||||||
IN(effect);
|
IN(buff.bard_modifier);
|
||||||
IN(spellid);
|
IN(buff.spellid);
|
||||||
IN(duration);
|
IN(buff.duration);
|
||||||
|
IN(buff.counters);
|
||||||
|
IN(buff.player_id);
|
||||||
IN(slotid);
|
IN(slotid);
|
||||||
IN(bufffade);
|
IN(bufffade);
|
||||||
|
|
||||||
@@ -2363,7 +2386,7 @@ namespace SoF
|
|||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
||||||
|
|
||||||
IN(slot);
|
emu->slot = static_cast<uint32>(SoFToServerCastingSlot(static_cast<CastingSlot>(eq->slot), eq->inventoryslot));
|
||||||
IN(spell_id);
|
IN(spell_id);
|
||||||
emu->inventoryslot = SoFToServerSlot(eq->inventoryslot);
|
emu->inventoryslot = SoFToServerSlot(eq->inventoryslot);
|
||||||
IN(target_id);
|
IN(target_id);
|
||||||
@@ -2600,6 +2623,21 @@ namespace SoF
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_LoadSpellSet)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::LoadSpellSet_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(LoadSpellSet_Struct, structs::LoadSpellSet_Struct);
|
||||||
|
|
||||||
|
for (int i = 0; i < structs::MAX_PP_MEMSPELL; ++i)
|
||||||
|
IN(spell[i]);
|
||||||
|
for (int i = structs::MAX_PP_MEMSPELL; i < MAX_PP_MEMSPELL; ++i)
|
||||||
|
emu->spell[i] = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
IN(unknown);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_LootItem)
|
DECODE(OP_LootItem)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::LootingItem_Struct);
|
DECODE_LENGTH_EXACT(structs::LootingItem_Struct);
|
||||||
@@ -2887,7 +2925,7 @@ namespace SoF
|
|||||||
|
|
||||||
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
||||||
{
|
{
|
||||||
const EQEmu::Item_Struct *item = inst->GetUnscaledItem();
|
const EQEmu::ItemBase *item = inst->GetUnscaledItem();
|
||||||
|
|
||||||
SoF::structs::ItemSerializationHeader hdr;
|
SoF::structs::ItemSerializationHeader hdr;
|
||||||
|
|
||||||
@@ -3352,4 +3390,75 @@ namespace SoF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToSoFCastingSlot(EQEmu::CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case EQEmu::CastingSlot::Gem1:
|
||||||
|
return CastingSlot::Gem1;
|
||||||
|
case EQEmu::CastingSlot::Gem2:
|
||||||
|
return CastingSlot::Gem2;
|
||||||
|
case EQEmu::CastingSlot::Gem3:
|
||||||
|
return CastingSlot::Gem3;
|
||||||
|
case EQEmu::CastingSlot::Gem4:
|
||||||
|
return CastingSlot::Gem4;
|
||||||
|
case EQEmu::CastingSlot::Gem5:
|
||||||
|
return CastingSlot::Gem5;
|
||||||
|
case EQEmu::CastingSlot::Gem6:
|
||||||
|
return CastingSlot::Gem6;
|
||||||
|
case EQEmu::CastingSlot::Gem7:
|
||||||
|
return CastingSlot::Gem7;
|
||||||
|
case EQEmu::CastingSlot::Gem8:
|
||||||
|
return CastingSlot::Gem8;
|
||||||
|
case EQEmu::CastingSlot::Gem9:
|
||||||
|
return CastingSlot::Gem9;
|
||||||
|
case EQEmu::CastingSlot::Item:
|
||||||
|
return CastingSlot::Item;
|
||||||
|
case EQEmu::CastingSlot::PotionBelt:
|
||||||
|
return CastingSlot::PotionBelt;
|
||||||
|
case EQEmu::CastingSlot::Discipline:
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
case EQEmu::CastingSlot::AltAbility:
|
||||||
|
return CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline EQEmu::CastingSlot SoFToServerCastingSlot(CastingSlot slot, uint32 itemlocation)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case CastingSlot::Gem1:
|
||||||
|
return EQEmu::CastingSlot::Gem1;
|
||||||
|
case CastingSlot::Gem2:
|
||||||
|
return EQEmu::CastingSlot::Gem2;
|
||||||
|
case CastingSlot::Gem3:
|
||||||
|
return EQEmu::CastingSlot::Gem3;
|
||||||
|
case CastingSlot::Gem4:
|
||||||
|
return EQEmu::CastingSlot::Gem4;
|
||||||
|
case CastingSlot::Gem5:
|
||||||
|
return EQEmu::CastingSlot::Gem5;
|
||||||
|
case CastingSlot::Gem6:
|
||||||
|
return EQEmu::CastingSlot::Gem6;
|
||||||
|
case CastingSlot::Gem7:
|
||||||
|
return EQEmu::CastingSlot::Gem7;
|
||||||
|
case CastingSlot::Gem8:
|
||||||
|
return EQEmu::CastingSlot::Gem8;
|
||||||
|
case CastingSlot::Gem9:
|
||||||
|
return EQEmu::CastingSlot::Gem9;
|
||||||
|
case CastingSlot::Ability:
|
||||||
|
return EQEmu::CastingSlot::Ability;
|
||||||
|
// Tit uses 10 for item and discipline casting, but items have a valid location
|
||||||
|
case CastingSlot::Item:
|
||||||
|
if (itemlocation == INVALID_INDEX)
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
else
|
||||||
|
return EQEmu::CastingSlot::Item;
|
||||||
|
case CastingSlot::PotionBelt:
|
||||||
|
return EQEmu::CastingSlot::PotionBelt;
|
||||||
|
case CastingSlot::AltAbility:
|
||||||
|
return EQEmu::CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
} /*SoF*/
|
} /*SoF*/
|
||||||
|
|||||||
@@ -50,6 +50,23 @@ namespace SoF
|
|||||||
#include "sof_ops.h"
|
#include "sof_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CastingSlot : uint32 {
|
||||||
|
Gem1 = 0,
|
||||||
|
Gem2 = 1,
|
||||||
|
Gem3 = 2,
|
||||||
|
Gem4 = 3,
|
||||||
|
Gem5 = 4,
|
||||||
|
Gem6 = 5,
|
||||||
|
Gem7 = 6,
|
||||||
|
Gem8 = 7,
|
||||||
|
Gem9 = 8,
|
||||||
|
Ability = 9,
|
||||||
|
Item = 10,
|
||||||
|
Discipline = 10,
|
||||||
|
PotionBelt = 11,
|
||||||
|
AltAbility = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
}; /*SoF*/
|
}; /*SoF*/
|
||||||
|
|
||||||
#endif /*COMMON_SOF_H*/
|
#endif /*COMMON_SOF_H*/
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "../string_util.h"
|
#include "../string_util.h"
|
||||||
|
|
||||||
|
|
||||||
size_t SoF::invtype::InvTypeSize(int inv_type)
|
size_t SoF::invtype::GetInvTypeSize(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypePossessions:
|
case invtype::InvTypePossessions:
|
||||||
@@ -68,7 +68,7 @@ size_t SoF::invtype::InvTypeSize(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoF::invtype::InvTypeName(int inv_type)
|
const char* SoF::invtype::GetInvTypeName(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypeInvalid:
|
case invtype::InvTypeInvalid:
|
||||||
@@ -116,7 +116,24 @@ const char* SoF::invtype::InvTypeName(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoF::invslot::InvPossessionsSlotName(int inv_slot)
|
bool SoF::invtype::IsInvTypePersistent(int inv_type)
|
||||||
|
{
|
||||||
|
switch (inv_type) {
|
||||||
|
case invtype::InvTypePossessions:
|
||||||
|
case invtype::InvTypeBank:
|
||||||
|
case invtype::InvTypeSharedBank:
|
||||||
|
case invtype::InvTypeTrade:
|
||||||
|
case invtype::InvTypeWorld:
|
||||||
|
case invtype::InvTypeLimbo:
|
||||||
|
case invtype::InvTypeTribute:
|
||||||
|
case invtype::InvTypeGuildTribute:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* SoF::invslot::GetInvPossessionsSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
switch (inv_slot) {
|
switch (inv_slot) {
|
||||||
case invslot::InvSlotInvalid:
|
case invslot::InvSlotInvalid:
|
||||||
@@ -190,9 +207,9 @@ const char* SoF::invslot::InvPossessionsSlotName(int inv_slot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoF::invslot::InvCorpseSlotName(int inv_slot)
|
const char* SoF::invslot::GetInvCorpseSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
if (!invtype::InvTypeSize(invtype::InvTypeCorpse) || inv_slot == invslot::InvSlotInvalid)
|
if (!invtype::GetInvTypeSize(invtype::InvTypeCorpse) || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
|
|
||||||
// needs work
|
// needs work
|
||||||
@@ -205,14 +222,14 @@ const char* SoF::invslot::InvCorpseSlotName(int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoF::invslot::InvSlotName(int inv_type, int inv_slot)
|
const char* SoF::invslot::GetInvSlotName(int inv_type, int inv_slot)
|
||||||
{
|
{
|
||||||
if (inv_type == invtype::InvTypePossessions)
|
if (inv_type == invtype::InvTypePossessions)
|
||||||
return invslot::InvPossessionsSlotName(inv_slot);
|
return invslot::GetInvPossessionsSlotName(inv_slot);
|
||||||
else if (inv_type == invtype::InvTypeCorpse)
|
else if (inv_type == invtype::InvTypeCorpse)
|
||||||
return invslot::InvCorpseSlotName(inv_slot);
|
return invslot::GetInvCorpseSlotName(inv_slot);
|
||||||
|
|
||||||
size_t type_size = invtype::InvTypeSize(inv_type);
|
size_t type_size = invtype::GetInvTypeSize(inv_type);
|
||||||
|
|
||||||
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
@@ -226,7 +243,7 @@ const char* SoF::invslot::InvSlotName(int inv_type, int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoF::invbag::InvBagIndexName(int bag_index)
|
const char* SoF::invbag::GetInvBagIndexName(int bag_index)
|
||||||
{
|
{
|
||||||
if (bag_index == invbag::InvBagInvalid)
|
if (bag_index == invbag::InvBagInvalid)
|
||||||
return "Invalid Bag";
|
return "Invalid Bag";
|
||||||
@@ -240,7 +257,7 @@ const char* SoF::invbag::InvBagIndexName(int bag_index)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* SoF::invaug::InvAugIndexName(int aug_index)
|
const char* SoF::invaug::GetInvAugIndexName(int aug_index)
|
||||||
{
|
{
|
||||||
if (aug_index == invaug::InvAugInvalid)
|
if (aug_index == invaug::InvAugInvalid)
|
||||||
return "Invalid Augment";
|
return "Invalid Augment";
|
||||||
|
|||||||
+39
-27
@@ -21,7 +21,7 @@
|
|||||||
#define COMMON_SOF_LIMITS_H
|
#define COMMON_SOF_LIMITS_H
|
||||||
|
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
#include "../client_version.h"
|
#include "../emu_versions.h"
|
||||||
#include "../skills.h"
|
#include "../skills.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -32,8 +32,13 @@ namespace SoF
|
|||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
// pre-declarations
|
// pre-declarations
|
||||||
|
namespace inventory {
|
||||||
|
inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
inline EQEmu::versions::ClientVersion InvTypeRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
||||||
|
|
||||||
@@ -63,7 +68,7 @@ namespace SoF
|
|||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
namespace invslot {
|
namespace invslot {
|
||||||
inline EQEmu::versions::ClientVersion InvSlotRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
||||||
|
|
||||||
@@ -114,21 +119,21 @@ namespace SoF
|
|||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
inline EQEmu::versions::ClientVersion InvBagRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
enum : int { InvBagInvalid = -1, InvBagBegin };
|
enum : int { InvBagInvalid = -1, InvBagBegin };
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
inline EQEmu::versions::ClientVersion InvAugRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
enum : int { InvAugInvalid = -1, InvAugBegin };
|
enum : int { InvAugInvalid = -1, InvAugBegin };
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
namespace item {
|
namespace item {
|
||||||
inline EQEmu::versions::ClientVersion ItemRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
enum ItemPacketType : int {
|
enum ItemPacketType : int {
|
||||||
ItemPacketMerchant = 100,
|
ItemPacketMerchant = 100,
|
||||||
@@ -146,27 +151,37 @@ namespace SoF
|
|||||||
} /*item*/
|
} /*item*/
|
||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
inline EQEmu::versions::ClientVersion ProfileRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
} /*profile*/
|
} /*profile*/
|
||||||
|
|
||||||
namespace constants {
|
namespace constants {
|
||||||
inline EQEmu::versions::ClientVersion ConstantsRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
inline EQEmu::versions::ClientVersion BehaviorRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|
||||||
namespace skills {
|
namespace skills {
|
||||||
inline EQEmu::versions::ClientVersion SkillsRef() { return EQEmu::versions::ClientVersion::SoF; }
|
inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::SoF; }
|
||||||
|
|
||||||
} /*skills*/
|
} /*skills*/
|
||||||
|
|
||||||
|
|
||||||
// declarations
|
// declarations
|
||||||
|
namespace inventory {
|
||||||
|
const bool ConcatenateInvTypeLimbo = true;
|
||||||
|
|
||||||
|
const bool AllowOverLevelEquipment = false;
|
||||||
|
|
||||||
|
const bool AllowEmptyBagInBag = false;
|
||||||
|
const bool AllowClickCastFromBag = false;
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
||||||
const size_t InvTypeBankSize = 24;
|
const size_t InvTypeBankSize = 24;
|
||||||
@@ -175,7 +190,7 @@ namespace SoF
|
|||||||
const size_t InvTypeWorldSize = 10;
|
const size_t InvTypeWorldSize = 10;
|
||||||
const size_t InvTypeLimboSize = 36;
|
const size_t InvTypeLimboSize = 36;
|
||||||
const size_t InvTypeTributeSize = 5;
|
const size_t InvTypeTributeSize = 5;
|
||||||
const size_t InvTypeGuildTributeSize = 0;//unknown
|
const size_t InvTypeGuildTributeSize = 2;
|
||||||
const size_t InvTypeMerchantSize = 80;
|
const size_t InvTypeMerchantSize = 80;
|
||||||
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
||||||
const size_t InvTypeBazaarSize = 80;
|
const size_t InvTypeBazaarSize = 80;
|
||||||
@@ -188,10 +203,10 @@ namespace SoF
|
|||||||
const size_t InvTypeArchivedSize = 0;//unknown
|
const size_t InvTypeArchivedSize = 0;//unknown
|
||||||
const size_t InvTypeOtherSize = 0;//unknown
|
const size_t InvTypeOtherSize = 0;//unknown
|
||||||
|
|
||||||
const size_t NPCTradeSize = 4;
|
extern size_t GetInvTypeSize(int inv_type);
|
||||||
|
extern const char* GetInvTypeName(int inv_type);
|
||||||
|
|
||||||
extern size_t InvTypeSize(int inv_type);
|
extern bool IsInvTypePersistent(int inv_type);
|
||||||
extern const char* InvTypeName(int inv_type);
|
|
||||||
|
|
||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
@@ -210,14 +225,17 @@ namespace SoF
|
|||||||
const int WorldEnd = (WorldBegin + invtype::InvTypeWorldSize) - 1;
|
const int WorldEnd = (WorldBegin + invtype::InvTypeWorldSize) - 1;
|
||||||
|
|
||||||
const int TributeBegin = 400;
|
const int TributeBegin = 400;
|
||||||
const int TributeEnd = 404;
|
const int TributeEnd = (TributeBegin + invtype::InvTypeTributeSize) - 1;
|
||||||
|
|
||||||
|
const int GuildTributeBegin = 450;
|
||||||
|
const int GuildTributeEnd = (GuildTributeBegin + invtype::InvTypeGuildTributeSize) - 1;
|
||||||
|
|
||||||
const int CorpseBegin = PossessionsGeneral1;
|
const int CorpseBegin = PossessionsGeneral1;
|
||||||
const int CorpseEnd = PossessionsGeneral1 + PossessionsCursor;
|
const int CorpseEnd = PossessionsGeneral1 + PossessionsCursor;
|
||||||
|
|
||||||
extern const char* InvPossessionsSlotName(int inv_slot);
|
extern const char* GetInvPossessionsSlotName(int inv_slot);
|
||||||
extern const char* InvCorpseSlotName(int inv_slot);
|
extern const char* GetInvCorpseSlotName(int inv_slot);
|
||||||
extern const char* InvSlotName(int inv_type, int inv_slot);
|
extern const char* GetInvSlotName(int inv_type, int inv_slot);
|
||||||
|
|
||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
@@ -244,14 +262,14 @@ namespace SoF
|
|||||||
const int TradeBagsSize = invtype::InvTypeTradeSize * ItemBagSize;
|
const int TradeBagsSize = invtype::InvTypeTradeSize * ItemBagSize;
|
||||||
const int TradeBagsEnd = (TradeBagsBegin + TradeBagsSize) - 1;
|
const int TradeBagsEnd = (TradeBagsBegin + TradeBagsSize) - 1;
|
||||||
|
|
||||||
extern const char* InvBagIndexName(int bag_index);
|
extern const char* GetInvBagIndexName(int bag_index);
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
const size_t ItemAugSize = 5;
|
const size_t ItemAugSize = 5;
|
||||||
|
|
||||||
extern const char* InvAugIndexName(int aug_index);
|
extern const char* GetInvAugIndexName(int aug_index);
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
@@ -261,6 +279,7 @@ namespace SoF
|
|||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
const size_t TributeSize = invtype::InvTypeTributeSize;
|
const size_t TributeSize = invtype::InvTypeTributeSize;
|
||||||
|
const size_t GuildTributeSize = invtype::InvTypeGuildTributeSize;
|
||||||
|
|
||||||
const size_t BandoliersSize = 20; // number of bandolier instances
|
const size_t BandoliersSize = 20; // number of bandolier instances
|
||||||
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
||||||
@@ -279,13 +298,6 @@ namespace SoF
|
|||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
const bool ConcatenateInvTypeLimbo = true;
|
|
||||||
|
|
||||||
const bool AllowOverLevelEquipment = false;
|
|
||||||
|
|
||||||
const bool AllowEmptyBagInBag = false;
|
|
||||||
const bool AllowClickCastFromBag = false;
|
|
||||||
|
|
||||||
const bool CoinHasWeight = true;
|
const bool CoinHasWeight = true;
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ E(OP_LeadershipExpUpdate)
|
|||||||
E(OP_LogServer)
|
E(OP_LogServer)
|
||||||
E(OP_LootItem)
|
E(OP_LootItem)
|
||||||
E(OP_ManaChange)
|
E(OP_ManaChange)
|
||||||
|
E(OP_MemorizeSpell)
|
||||||
E(OP_MoveItem)
|
E(OP_MoveItem)
|
||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
E(OP_NewZone)
|
E(OP_NewZone)
|
||||||
@@ -110,6 +111,7 @@ D(OP_GroupFollow2)
|
|||||||
D(OP_InspectRequest)
|
D(OP_InspectRequest)
|
||||||
D(OP_ItemLinkClick)
|
D(OP_ItemLinkClick)
|
||||||
D(OP_ItemVerifyRequest)
|
D(OP_ItemVerifyRequest)
|
||||||
|
D(OP_LoadSpellSet)
|
||||||
D(OP_LootItem)
|
D(OP_LootItem)
|
||||||
D(OP_MoveItem)
|
D(OP_MoveItem)
|
||||||
D(OP_PetCommands)
|
D(OP_PetCommands)
|
||||||
|
|||||||
+75
-115
@@ -122,7 +122,7 @@ struct AdventureInfo {
|
|||||||
** Merth: Gave struct a name so gcc 2.96 would compile
|
** Merth: Gave struct a name so gcc 2.96 would compile
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
struct Color_Struct
|
struct Tint_Struct
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
@@ -130,19 +130,62 @@ struct Color_Struct
|
|||||||
uint8 Green;
|
uint8 Green;
|
||||||
uint8 Red;
|
uint8 Red;
|
||||||
uint8 UseTint; // if there's a tint this is FF
|
uint8 UseTint; // if there's a tint this is FF
|
||||||
} RGB;
|
};
|
||||||
uint32 Color;
|
uint32 Color;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CharSelectEquip
|
struct TintProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Tint_Struct Head;
|
||||||
|
Tint_Struct Chest;
|
||||||
|
Tint_Struct Arms;
|
||||||
|
Tint_Struct Wrist;
|
||||||
|
Tint_Struct Hands;
|
||||||
|
Tint_Struct Legs;
|
||||||
|
Tint_Struct Feet;
|
||||||
|
Tint_Struct Primary;
|
||||||
|
Tint_Struct Secondary;
|
||||||
|
};
|
||||||
|
Tint_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Visible equiptment.
|
||||||
|
* Size: 12 Octets
|
||||||
|
*/
|
||||||
|
struct Texture_Struct
|
||||||
{
|
{
|
||||||
uint32 Material;
|
uint32 Material;
|
||||||
uint32 Unknown1;
|
uint32 Unknown1;
|
||||||
uint32 EliteMaterial;
|
uint32 EliteMaterial;
|
||||||
Color_Struct Color;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TextureProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Texture_Struct Head;
|
||||||
|
Texture_Struct Chest;
|
||||||
|
Texture_Struct Arms;
|
||||||
|
Texture_Struct Wrist;
|
||||||
|
Texture_Struct Hands;
|
||||||
|
Texture_Struct Legs;
|
||||||
|
Texture_Struct Feet;
|
||||||
|
Texture_Struct Primary;
|
||||||
|
Texture_Struct Secondary;
|
||||||
|
};
|
||||||
|
Texture_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
TextureProfile();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CharSelectEquip : Texture_Struct, Tint_Struct {};
|
||||||
|
|
||||||
struct CharacterSelectEntry_Struct
|
struct CharacterSelectEntry_Struct
|
||||||
{
|
{
|
||||||
/*0000*/ uint8 Level; //
|
/*0000*/ uint8 Level; //
|
||||||
@@ -152,7 +195,7 @@ struct CharacterSelectEntry_Struct
|
|||||||
/*0000*/ uint8 Beard; //
|
/*0000*/ uint8 Beard; //
|
||||||
/*0001*/ uint8 HairColor; //
|
/*0001*/ uint8 HairColor; //
|
||||||
/*0000*/ uint8 Face; //
|
/*0000*/ uint8 Face; //
|
||||||
/*0000*/ CharSelectEquip Equip[9];
|
/*0000*/ CharSelectEquip Equip[EQEmu::textures::TextureCount];
|
||||||
/*0000*/ uint32 PrimaryIDFile; //
|
/*0000*/ uint32 PrimaryIDFile; //
|
||||||
/*0000*/ uint32 SecondaryIDFile; //
|
/*0000*/ uint32 SecondaryIDFile; //
|
||||||
/*0000*/ uint8 Unknown15; // 0xff
|
/*0000*/ uint8 Unknown15; // 0xff
|
||||||
@@ -183,19 +226,6 @@ struct CharacterSelect_Struct
|
|||||||
/*0008*/ CharacterSelectEntry_Struct Entries[0];
|
/*0008*/ CharacterSelectEntry_Struct Entries[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Visible equiptment.
|
|
||||||
* Size: 12 Octets
|
|
||||||
*/
|
|
||||||
struct EquipStruct
|
|
||||||
{
|
|
||||||
/*00*/ uint32 Material;
|
|
||||||
/*04*/ uint32 Unknown1;
|
|
||||||
/*08*/ uint32 EliteMaterial;
|
|
||||||
/*12*/
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Generic Spawn Struct
|
** Generic Spawn Struct
|
||||||
** Length: 897 Octets
|
** Length: 897 Octets
|
||||||
@@ -222,22 +252,7 @@ struct Spawn_Struct {
|
|||||||
/*0018*/ uint8 unknown0018[4]; //
|
/*0018*/ uint8 unknown0018[4]; //
|
||||||
/*0022*/ uint8 gender; // Gender (0=male, 1=female, 2=monster)
|
/*0022*/ uint8 gender; // Gender (0=male, 1=female, 2=monster)
|
||||||
/*0023*/ uint8 unknown0023[4]; //
|
/*0023*/ uint8 unknown0023[4]; //
|
||||||
/*0027*/ union
|
/*0027*/ TextureProfile equipment;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0027*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
|
||||||
/*0039*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
|
||||||
/*0051*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
|
||||||
/*0063*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
|
||||||
/*0075*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
|
||||||
/*0087*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
|
||||||
/*0099*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
|
||||||
/*0111*/ EquipStruct equip_primary; // Equiptment: Main visual
|
|
||||||
/*0123*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
|
||||||
} equip;
|
|
||||||
/*0027*/ EquipStruct equipment[9];
|
|
||||||
};
|
|
||||||
|
|
||||||
/*0135*/ uint8 StandState; // Seems to be required to be set to 0x64 for normal animation.
|
/*0135*/ uint8 StandState; // Seems to be required to be set to 0x64 for normal animation.
|
||||||
/*0136*/ uint8 unknown0136;
|
/*0136*/ uint8 unknown0136;
|
||||||
@@ -314,22 +329,7 @@ union
|
|||||||
/*0775*/ char name[64]; // Player's Name
|
/*0775*/ char name[64]; // Player's Name
|
||||||
/*0839*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner
|
/*0839*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner
|
||||||
/*0843*/ uint8 pvp; // 0 = normal name color, 2 = PVP name color
|
/*0843*/ uint8 pvp; // 0 = normal name color, 2 = PVP name color
|
||||||
/*0844*/ union
|
/*0844*/ TintProfile equipment_tint;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0844*/ Color_Struct color_helmet; // Color of helmet item
|
|
||||||
/*0848*/ Color_Struct color_chest; // Color of chest item
|
|
||||||
/*0852*/ Color_Struct color_arms; // Color of arms item
|
|
||||||
/*0856*/ Color_Struct color_bracers; // Color of bracers item
|
|
||||||
/*0860*/ Color_Struct color_hands; // Color of hands item
|
|
||||||
/*0864*/ Color_Struct color_legs; // Color of legs item
|
|
||||||
/*0868*/ Color_Struct color_feet; // Color of feet item
|
|
||||||
/*0872*/ Color_Struct color_primary; // Color of primary item
|
|
||||||
/*0876*/ Color_Struct color_secondary; // Color of secondary item
|
|
||||||
} equipment_colors;
|
|
||||||
/*0844*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
|
|
||||||
};
|
|
||||||
/*0880*/ uint8 anon; // 0=normal, 1=anon, 2=roleplay
|
/*0880*/ uint8 anon; // 0=normal, 1=anon, 2=roleplay
|
||||||
/*0881*/ uint8 face;
|
/*0881*/ uint8 face;
|
||||||
/*0882*/ uint8 drakkin_details; // Face Details (Spikes) on Drakkin 0 - 7
|
/*0882*/ uint8 drakkin_details; // Face Details (Spikes) on Drakkin 0 - 7
|
||||||
@@ -458,7 +458,7 @@ struct MemorizeSpell_Struct {
|
|||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
//uint32 unknown12;
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -491,11 +491,12 @@ struct DeleteSpell_Struct
|
|||||||
|
|
||||||
struct ManaChange_Struct
|
struct ManaChange_Struct
|
||||||
{
|
{
|
||||||
uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
uint32 spell_id;
|
/*08*/ uint32 spell_id;
|
||||||
uint32 unknown12;
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
uint32 unknown16;
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SwapSpell_Struct
|
struct SwapSpell_Struct
|
||||||
@@ -542,32 +543,23 @@ struct SpawnAppearance_Struct
|
|||||||
// this is used inside profile
|
// this is used inside profile
|
||||||
struct SpellBuff_Struct
|
struct SpellBuff_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
|
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
|
||||||
/*001*/ uint8 level;
|
/*001*/ uint8 level; // Seen 1 for no buff
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 bard_modifier;
|
||||||
/*003*/ uint8 effect; //not real
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ uint32 spellid;
|
/*004*/ uint32 spellid;
|
||||||
/*008*/ int32 duration;
|
/*008*/ uint32 duration;
|
||||||
/*012*/ uint32 counters;
|
/*012*/ uint32 counters;
|
||||||
/*016*/ uint32 unknown004; //Might need to be swapped with player_id
|
/*016*/ uint32 unknown016;
|
||||||
/*020*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
|
/*020*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
|
|
||||||
/*024*/
|
/*024*/
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct SpellBuffFade_Struct {
|
struct SpellBuffPacket_Struct {
|
||||||
/*000*/ uint32 entityid;
|
/*000*/ uint32 entityid;
|
||||||
/*004*/ uint8 slot;
|
/*004*/ SpellBuff_Struct buff;
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown7;
|
|
||||||
/*008*/ uint32 spellid;
|
|
||||||
/*012*/ int32 duration;
|
|
||||||
/*016*/ uint32 unknown016;
|
|
||||||
/*020*/ uint32 unknown020; //prolly global player ID
|
|
||||||
/*024*/ uint32 playerId; // Player id who cast the buff
|
|
||||||
/*028*/ uint32 slotid;
|
/*028*/ uint32 slotid;
|
||||||
/*032*/ uint32 bufffade;
|
/*032*/ uint32 bufffade;
|
||||||
/*036*/
|
/*036*/
|
||||||
@@ -882,24 +874,9 @@ struct PlayerProfile_Struct //23576 Octets
|
|||||||
/*00216*/ uint8 hairstyle; // Player hair style
|
/*00216*/ uint8 hairstyle; // Player hair style
|
||||||
/*00217*/ uint8 beard; // Player beard type
|
/*00217*/ uint8 beard; // Player beard type
|
||||||
/*00218*/ uint8 unknown00178[10]; //[10]14 on Live?
|
/*00218*/ uint8 unknown00178[10]; //[10]14 on Live?
|
||||||
/*00228*/ union
|
/*00228*/ TextureProfile equipment;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*00228*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
|
||||||
/*00240*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
|
||||||
/*00252*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
|
||||||
/*00264*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
|
||||||
/*00276*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
|
||||||
/*00288*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
|
||||||
/*00300*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
|
||||||
/*00312*/ EquipStruct equip_primary; // Equiptment: Main visual
|
|
||||||
/*00324*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
|
||||||
} equip;
|
|
||||||
/*00228*/ EquipStruct equipment[9]; //Live Shows [108] for this part
|
|
||||||
};
|
|
||||||
/*00336*/ uint8 unknown00224[156]; // Live Shows [160]
|
/*00336*/ uint8 unknown00224[156]; // Live Shows [160]
|
||||||
/*00496*/ Color_Struct item_tint[9]; // RR GG BB 00
|
/*00496*/ TintProfile item_tint; // RR GG BB 00
|
||||||
/*00544*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each
|
/*00544*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each
|
||||||
/*04132*/ uint32 points; // Unspent Practice points - RELOCATED???
|
/*04132*/ uint32 points; // Unspent Practice points - RELOCATED???
|
||||||
/*04136*/ uint32 mana; // Current mana
|
/*04136*/ uint32 mana; // Current mana
|
||||||
@@ -1155,7 +1132,7 @@ struct WearChange_Struct{
|
|||||||
/*002*/ uint32 material;
|
/*002*/ uint32 material;
|
||||||
/*006*/ uint32 unknown06;
|
/*006*/ uint32 unknown06;
|
||||||
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
||||||
/*014*/ Color_Struct color;
|
/*014*/ Tint_Struct color;
|
||||||
/*018*/ uint8 wear_slot_id;
|
/*018*/ uint8 wear_slot_id;
|
||||||
/*019*/
|
/*019*/
|
||||||
};
|
};
|
||||||
@@ -1882,8 +1859,7 @@ struct Merchant_Sell_Struct {
|
|||||||
/*004*/ uint32 playerid; // Player's entity id
|
/*004*/ uint32 playerid; // Player's entity id
|
||||||
/*008*/ uint32 itemslot;
|
/*008*/ uint32 itemslot;
|
||||||
uint32 unknown12;
|
uint32 unknown12;
|
||||||
/*016*/ uint8 quantity; // Already sold
|
/*016*/ uint32 quantity;
|
||||||
/*017*/ uint8 Unknown016[3];
|
|
||||||
/*020*/ uint32 price;
|
/*020*/ uint32 price;
|
||||||
};
|
};
|
||||||
struct Merchant_Purchase_Struct {
|
struct Merchant_Purchase_Struct {
|
||||||
@@ -2954,27 +2930,6 @@ struct PetitionBug_Struct{
|
|||||||
char text[1028];
|
char text[1028];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DyeStruct
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct Color_Struct head;
|
|
||||||
struct Color_Struct chest;
|
|
||||||
struct Color_Struct arms;
|
|
||||||
struct Color_Struct wrists;
|
|
||||||
struct Color_Struct hands;
|
|
||||||
struct Color_Struct legs;
|
|
||||||
struct Color_Struct feet;
|
|
||||||
struct Color_Struct primary; // you can't actually dye this
|
|
||||||
struct Color_Struct secondary; // or this
|
|
||||||
}
|
|
||||||
dyes;
|
|
||||||
struct Color_Struct dye[9];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
uint32 zoneid;
|
uint32 zoneid;
|
||||||
@@ -3773,6 +3728,11 @@ struct AnnoyingZoneUnknown_Struct {
|
|||||||
uint32 value; //always 4
|
uint32 value; //always 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct LoadSpellSet_Struct {
|
||||||
|
uint32 spell[MAX_PP_MEMSPELL];
|
||||||
|
uint32 unknown;
|
||||||
|
};
|
||||||
|
|
||||||
struct BlockedBuffs_Struct {
|
struct BlockedBuffs_Struct {
|
||||||
/*000*/ uint8 unknown000[80];
|
/*000*/ uint8 unknown000[80];
|
||||||
/*080*/ uint8 unknown081;
|
/*080*/ uint8 unknown081;
|
||||||
|
|||||||
@@ -17,5 +17,5 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define E(x) static void Encode_##x(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req);
|
#define E(x) static void Encode_##x(EQApplicationPacket **p, std::shared_ptr<EQStreamInterface> dest, bool ack_req);
|
||||||
#define D(x) static void Decode_##x(EQApplicationPacket *p);
|
#define D(x) static void Decode_##x(EQApplicationPacket *p);
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define ENCODE(x) void Strategy::Encode_##x(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req)
|
#define ENCODE(x) void Strategy::Encode_##x(EQApplicationPacket **p, std::shared_ptr<EQStreamInterface> dest, bool ack_req)
|
||||||
#define DECODE(x) void Strategy::Decode_##x(EQApplicationPacket *__packet)
|
#define DECODE(x) void Strategy::Decode_##x(EQApplicationPacket *__packet)
|
||||||
|
|
||||||
#define StructDist(in, f1, f2) (uint32(&in->f2)-uint32(&in->f1))
|
#define StructDist(in, f1, f2) (uint32(&in->f2)-uint32(&in->f1))
|
||||||
|
|||||||
+204
-21
@@ -58,6 +58,9 @@ namespace Titanium
|
|||||||
// client to server text link converter
|
// client to server text link converter
|
||||||
static inline void TitaniumToServerTextLink(std::string& serverTextLink, const std::string& titaniumTextLink);
|
static inline void TitaniumToServerTextLink(std::string& serverTextLink, const std::string& titaniumTextLink);
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToTitaniumCastingSlot(EQEmu::CastingSlot slot);
|
||||||
|
static inline EQEmu::CastingSlot TitaniumToServerCastingSlot(CastingSlot slot, uint32 itemlocation);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
{
|
{
|
||||||
auto Config = EQEmuConfig::get();
|
auto Config = EQEmuConfig::get();
|
||||||
@@ -79,7 +82,7 @@ namespace Titanium
|
|||||||
|
|
||||||
//ok, now we have what we need to register.
|
//ok, now we have what we need to register.
|
||||||
|
|
||||||
EQStream::Signature signature;
|
EQStreamInterface::Signature signature;
|
||||||
std::string pname;
|
std::string pname;
|
||||||
|
|
||||||
//register our world signature.
|
//register our world signature.
|
||||||
@@ -254,6 +257,25 @@ namespace Titanium
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_Buff)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
|
OUT(entityid);
|
||||||
|
OUT(buff.effect_type);
|
||||||
|
OUT(buff.level);
|
||||||
|
OUT(buff.bard_modifier);
|
||||||
|
OUT(buff.spellid);
|
||||||
|
OUT(buff.duration);
|
||||||
|
OUT(buff.counters);
|
||||||
|
OUT(buff.player_id);
|
||||||
|
OUT(slotid);
|
||||||
|
OUT(bufffade);
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
ENCODE(OP_ChannelMessage)
|
ENCODE(OP_ChannelMessage)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
EQApplicationPacket *in = *p;
|
||||||
@@ -573,6 +595,46 @@ namespace Titanium
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_GroundSpawn)
|
||||||
|
{
|
||||||
|
// We are not encoding the spawn_id field here, but it doesn't appear to matter.
|
||||||
|
//
|
||||||
|
EQApplicationPacket *in = *p;
|
||||||
|
*p = nullptr;
|
||||||
|
|
||||||
|
//store away the emu struct
|
||||||
|
unsigned char *__emu_buffer = in->pBuffer;
|
||||||
|
Object_Struct *emu = (Object_Struct *)__emu_buffer;
|
||||||
|
|
||||||
|
in->size = strlen(emu->object_name) + sizeof(structs::Object_Struct) - 1;
|
||||||
|
in->pBuffer = new unsigned char[in->size];
|
||||||
|
|
||||||
|
structs::Object_Struct *eq = (structs::Object_Struct *) in->pBuffer;
|
||||||
|
|
||||||
|
eq->drop_id = emu->drop_id;
|
||||||
|
eq->heading = emu->heading;
|
||||||
|
eq->linked_list_addr[0] = 0;
|
||||||
|
eq->linked_list_addr[1] = 0;
|
||||||
|
strcpy(eq->object_name, emu->object_name);
|
||||||
|
eq->object_type = emu->object_type;
|
||||||
|
eq->spawn_id = 0;
|
||||||
|
eq->unknown008[0] = 0;
|
||||||
|
eq->unknown008[1] = 0;
|
||||||
|
eq->unknown020 = 0;
|
||||||
|
eq->unknown024 = 0;
|
||||||
|
eq->unknown076 = 0;
|
||||||
|
eq->unknown084 = 0xffffffff;
|
||||||
|
eq->z = emu->z;
|
||||||
|
eq->x = emu->x;
|
||||||
|
eq->y = emu->y;
|
||||||
|
eq->zone_id = emu->zone_id;
|
||||||
|
eq->zone_instance = emu->zone_instance;
|
||||||
|
|
||||||
|
|
||||||
|
delete[] __emu_buffer;
|
||||||
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
|
}
|
||||||
|
|
||||||
ENCODE(OP_GuildMemberList)
|
ENCODE(OP_GuildMemberList)
|
||||||
{
|
{
|
||||||
//consume the packet
|
//consume the packet
|
||||||
@@ -814,6 +876,22 @@ namespace Titanium
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_MemorizeSpell)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(MemorizeSpell_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(MemorizeSpell_Struct, structs::MemorizeSpell_Struct);
|
||||||
|
|
||||||
|
// Since HT/LoH are translated up, we need to translate down only for memSpellSpellbar case
|
||||||
|
if (emu->scribing == 3)
|
||||||
|
eq->slot = static_cast<uint32>(ServerToTitaniumCastingSlot(static_cast<EQEmu::CastingSlot>(emu->slot)));
|
||||||
|
else
|
||||||
|
OUT(slot);
|
||||||
|
OUT(spell_id);
|
||||||
|
OUT(scribing);
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
ENCODE(OP_MoveItem)
|
ENCODE(OP_MoveItem)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(MoveItem_Struct);
|
ENCODE_LENGTH_EXACT(MoveItem_Struct);
|
||||||
@@ -853,9 +931,9 @@ namespace Titanium
|
|||||||
OUT(petid);
|
OUT(petid);
|
||||||
OUT(buffcount);
|
OUT(buffcount);
|
||||||
|
|
||||||
int EQBuffSlot = 0;
|
int EQBuffSlot = 0; // do we really want to shuffle them around like this?
|
||||||
|
|
||||||
for (uint32 EmuBuffSlot = 0; EmuBuffSlot < BUFF_COUNT; ++EmuBuffSlot)
|
for (uint32 EmuBuffSlot = 0; EmuBuffSlot < PET_BUFF_COUNT; ++EmuBuffSlot)
|
||||||
{
|
{
|
||||||
if (emu->spellid[EmuBuffSlot])
|
if (emu->spellid[EmuBuffSlot])
|
||||||
{
|
{
|
||||||
@@ -903,9 +981,9 @@ namespace Titanium
|
|||||||
OUT(hairstyle);
|
OUT(hairstyle);
|
||||||
OUT(beard);
|
OUT(beard);
|
||||||
// OUT(unknown00178[10]);
|
// OUT(unknown00178[10]);
|
||||||
for (r = 0; r < 9; r++) {
|
for (r = EQEmu::textures::TextureBegin; r < EQEmu::textures::TextureCount; r++) {
|
||||||
OUT(item_material[r]);
|
OUT(item_material.Slot[r].Material);
|
||||||
OUT(item_tint[r].Color);
|
OUT(item_tint.Slot[r].Color);
|
||||||
}
|
}
|
||||||
// OUT(unknown00224[48]);
|
// OUT(unknown00224[48]);
|
||||||
for (r = 0; r < structs::MAX_PP_AA_ARRAY; r++) {
|
for (r = 0; r < structs::MAX_PP_AA_ARRAY; r++) {
|
||||||
@@ -945,10 +1023,10 @@ namespace Titanium
|
|||||||
OUT(thirst_level);
|
OUT(thirst_level);
|
||||||
OUT(hunger_level);
|
OUT(hunger_level);
|
||||||
for (r = 0; r < structs::BUFF_COUNT; r++) {
|
for (r = 0; r < structs::BUFF_COUNT; r++) {
|
||||||
OUT(buffs[r].slotid);
|
OUT(buffs[r].effect_type);
|
||||||
OUT(buffs[r].level);
|
OUT(buffs[r].level);
|
||||||
OUT(buffs[r].bard_modifier);
|
OUT(buffs[r].bard_modifier);
|
||||||
OUT(buffs[r].effect);
|
OUT(buffs[r].unknown003);
|
||||||
OUT(buffs[r].spellid);
|
OUT(buffs[r].spellid);
|
||||||
OUT(buffs[r].duration);
|
OUT(buffs[r].duration);
|
||||||
OUT(buffs[r].counters);
|
OUT(buffs[r].counters);
|
||||||
@@ -1223,15 +1301,15 @@ namespace Titanium
|
|||||||
if (eq->Race[char_index] > 473)
|
if (eq->Race[char_index] > 473)
|
||||||
eq->Race[char_index] = 1;
|
eq->Race[char_index] = 1;
|
||||||
|
|
||||||
for (int index = 0; index < EQEmu::legacy::MaterialCount; ++index) {
|
for (int index = 0; index < EQEmu::textures::TextureCount; ++index) {
|
||||||
eq->CS_Colors[char_index][index].Color = emu_cse->Equip[index].Color.Color;
|
eq->CS_Colors[char_index].Slot[index].Color = emu_cse->Equip[index].Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq->BeardColor[char_index] = emu_cse->BeardColor;
|
eq->BeardColor[char_index] = emu_cse->BeardColor;
|
||||||
eq->HairStyle[char_index] = emu_cse->HairStyle;
|
eq->HairStyle[char_index] = emu_cse->HairStyle;
|
||||||
|
|
||||||
for (int index = 0; index < EQEmu::legacy::MaterialCount; ++index) {
|
for (int index = 0; index < EQEmu::textures::TextureCount; ++index) {
|
||||||
eq->Equip[char_index][index] = emu_cse->Equip[index].Material;
|
eq->Equip[char_index].Slot[index].Material = emu_cse->Equip[index].Material;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq->SecondaryIDFile[char_index] = emu_cse->SecondaryIDFile;
|
eq->SecondaryIDFile[char_index] = emu_cse->SecondaryIDFile;
|
||||||
@@ -1260,15 +1338,15 @@ namespace Titanium
|
|||||||
for (; char_index < 10; ++char_index) {
|
for (; char_index < 10; ++char_index) {
|
||||||
eq->Race[char_index] = 0;
|
eq->Race[char_index] = 0;
|
||||||
|
|
||||||
for (int index = 0; index < EQEmu::legacy::MaterialCount; ++index) {
|
for (int index = 0; index < EQEmu::textures::TextureCount; ++index) {
|
||||||
eq->CS_Colors[char_index][index].Color = 0;
|
eq->CS_Colors[char_index].Slot[index].Color = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq->BeardColor[char_index] = 0;
|
eq->BeardColor[char_index] = 0;
|
||||||
eq->HairStyle[char_index] = 0;
|
eq->HairStyle[char_index] = 0;
|
||||||
|
|
||||||
for (int index = 0; index < EQEmu::legacy::MaterialCount; ++index) {
|
for (int index = 0; index < EQEmu::textures::TextureCount; ++index) {
|
||||||
eq->Equip[char_index][index] = 0;
|
eq->Equip[char_index].Slot[index].Material = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq->SecondaryIDFile[char_index] = 0;
|
eq->SecondaryIDFile[char_index] = 0;
|
||||||
@@ -1599,9 +1677,9 @@ namespace Titanium
|
|||||||
eq->petOwnerId = emu->petOwnerId;
|
eq->petOwnerId = emu->petOwnerId;
|
||||||
eq->guildrank = emu->guildrank;
|
eq->guildrank = emu->guildrank;
|
||||||
// eq->unknown0194[3] = emu->unknown0194[3];
|
// eq->unknown0194[3] = emu->unknown0194[3];
|
||||||
for (k = 0; k < 9; k++) {
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; k++) {
|
||||||
eq->equipment[k] = emu->equipment[k].Material;
|
eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
|
||||||
eq->colors[k].Color = emu->colors[k].Color;
|
eq->equipment_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color;
|
||||||
}
|
}
|
||||||
for (k = 0; k < 8; k++) {
|
for (k = 0; k < 8; k++) {
|
||||||
eq->set_to_0xFF[k] = 0xFF;
|
eq->set_to_0xFF[k] = 0xFF;
|
||||||
@@ -1688,12 +1766,31 @@ namespace Titanium
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_Buff)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
|
IN(entityid);
|
||||||
|
IN(buff.effect_type);
|
||||||
|
IN(buff.level);
|
||||||
|
IN(buff.bard_modifier);
|
||||||
|
IN(buff.spellid);
|
||||||
|
IN(buff.duration);
|
||||||
|
IN(buff.counters);
|
||||||
|
IN(buff.player_id);
|
||||||
|
IN(slotid);
|
||||||
|
IN(bufffade);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_CastSpell)
|
DECODE(OP_CastSpell)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
||||||
|
|
||||||
IN(slot);
|
emu->slot = static_cast<uint32>(TitaniumToServerCastingSlot(static_cast<CastingSlot>(eq->slot), eq->inventoryslot));
|
||||||
IN(spell_id);
|
IN(spell_id);
|
||||||
emu->inventoryslot = TitaniumToServerSlot(eq->inventoryslot);
|
emu->inventoryslot = TitaniumToServerSlot(eq->inventoryslot);
|
||||||
IN(target_id);
|
IN(target_id);
|
||||||
@@ -1881,6 +1978,21 @@ namespace Titanium
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_LoadSpellSet)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::LoadSpellSet_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(LoadSpellSet_Struct, structs::LoadSpellSet_Struct);
|
||||||
|
|
||||||
|
for (int i = 0; i < structs::MAX_PP_MEMSPELL; ++i)
|
||||||
|
IN(spell[i]);
|
||||||
|
for (int i = structs::MAX_PP_MEMSPELL; i < MAX_PP_MEMSPELL; ++i)
|
||||||
|
emu->spell[i] = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
IN(unknown);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_LootItem)
|
DECODE(OP_LootItem)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::LootingItem_Struct);
|
DECODE_LENGTH_EXACT(structs::LootingItem_Struct);
|
||||||
@@ -2107,7 +2219,7 @@ namespace Titanium
|
|||||||
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
||||||
{
|
{
|
||||||
const char* protection = "\\\\\\\\\\";
|
const char* protection = "\\\\\\\\\\";
|
||||||
const EQEmu::Item_Struct* item = inst->GetUnscaledItem();
|
const EQEmu::ItemBase* item = inst->GetUnscaledItem();
|
||||||
|
|
||||||
ob << StringFormat("%.*s%s", (depth ? (depth - 1) : 0), protection, (depth ? "\"" : "")); // For leading quotes (and protection) if a subitem;
|
ob << StringFormat("%.*s%s", (depth ? (depth - 1) : 0), protection, (depth ? "\"" : "")); // For leading quotes (and protection) if a subitem;
|
||||||
|
|
||||||
@@ -2449,4 +2561,75 @@ namespace Titanium
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToTitaniumCastingSlot(EQEmu::CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case EQEmu::CastingSlot::Gem1:
|
||||||
|
return CastingSlot::Gem1;
|
||||||
|
case EQEmu::CastingSlot::Gem2:
|
||||||
|
return CastingSlot::Gem2;
|
||||||
|
case EQEmu::CastingSlot::Gem3:
|
||||||
|
return CastingSlot::Gem3;
|
||||||
|
case EQEmu::CastingSlot::Gem4:
|
||||||
|
return CastingSlot::Gem4;
|
||||||
|
case EQEmu::CastingSlot::Gem5:
|
||||||
|
return CastingSlot::Gem5;
|
||||||
|
case EQEmu::CastingSlot::Gem6:
|
||||||
|
return CastingSlot::Gem6;
|
||||||
|
case EQEmu::CastingSlot::Gem7:
|
||||||
|
return CastingSlot::Gem7;
|
||||||
|
case EQEmu::CastingSlot::Gem8:
|
||||||
|
return CastingSlot::Gem8;
|
||||||
|
case EQEmu::CastingSlot::Gem9:
|
||||||
|
return CastingSlot::Gem9;
|
||||||
|
case EQEmu::CastingSlot::Item:
|
||||||
|
return CastingSlot::Item;
|
||||||
|
case EQEmu::CastingSlot::PotionBelt:
|
||||||
|
return CastingSlot::PotionBelt;
|
||||||
|
case EQEmu::CastingSlot::Discipline:
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
case EQEmu::CastingSlot::AltAbility:
|
||||||
|
return CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline EQEmu::CastingSlot TitaniumToServerCastingSlot(CastingSlot slot, uint32 itemlocation)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case CastingSlot::Gem1:
|
||||||
|
return EQEmu::CastingSlot::Gem1;
|
||||||
|
case CastingSlot::Gem2:
|
||||||
|
return EQEmu::CastingSlot::Gem2;
|
||||||
|
case CastingSlot::Gem3:
|
||||||
|
return EQEmu::CastingSlot::Gem3;
|
||||||
|
case CastingSlot::Gem4:
|
||||||
|
return EQEmu::CastingSlot::Gem4;
|
||||||
|
case CastingSlot::Gem5:
|
||||||
|
return EQEmu::CastingSlot::Gem5;
|
||||||
|
case CastingSlot::Gem6:
|
||||||
|
return EQEmu::CastingSlot::Gem6;
|
||||||
|
case CastingSlot::Gem7:
|
||||||
|
return EQEmu::CastingSlot::Gem7;
|
||||||
|
case CastingSlot::Gem8:
|
||||||
|
return EQEmu::CastingSlot::Gem8;
|
||||||
|
case CastingSlot::Gem9:
|
||||||
|
return EQEmu::CastingSlot::Gem9;
|
||||||
|
case CastingSlot::Ability:
|
||||||
|
return EQEmu::CastingSlot::Ability;
|
||||||
|
// Tit uses 10 for item and discipline casting, but items have a valid location
|
||||||
|
case CastingSlot::Item:
|
||||||
|
if (itemlocation == INVALID_INDEX)
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
else
|
||||||
|
return EQEmu::CastingSlot::Item;
|
||||||
|
case CastingSlot::PotionBelt:
|
||||||
|
return EQEmu::CastingSlot::PotionBelt;
|
||||||
|
case CastingSlot::AltAbility:
|
||||||
|
return EQEmu::CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
} /*Titanium*/
|
} /*Titanium*/
|
||||||
|
|||||||
@@ -50,6 +50,23 @@ namespace Titanium
|
|||||||
#include "titanium_ops.h"
|
#include "titanium_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CastingSlot : uint32 {
|
||||||
|
Gem1 = 0,
|
||||||
|
Gem2 = 1,
|
||||||
|
Gem3 = 2,
|
||||||
|
Gem4 = 3,
|
||||||
|
Gem5 = 4,
|
||||||
|
Gem6 = 5,
|
||||||
|
Gem7 = 6,
|
||||||
|
Gem8 = 7,
|
||||||
|
Gem9 = 8,
|
||||||
|
Ability = 9,
|
||||||
|
Item = 10,
|
||||||
|
Discipline = 10,
|
||||||
|
PotionBelt = 11,
|
||||||
|
AltAbility = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
}; /*Titanium*/
|
}; /*Titanium*/
|
||||||
|
|
||||||
#endif /*COMMON_TITANIUM_H*/
|
#endif /*COMMON_TITANIUM_H*/
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "../string_util.h"
|
#include "../string_util.h"
|
||||||
|
|
||||||
|
|
||||||
size_t Titanium::invtype::InvTypeSize(int inv_type)
|
size_t Titanium::invtype::GetInvTypeSize(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypePossessions:
|
case invtype::InvTypePossessions:
|
||||||
@@ -68,7 +68,7 @@ size_t Titanium::invtype::InvTypeSize(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Titanium::invtype::InvTypeName(int inv_type)
|
const char* Titanium::invtype::GetInvTypeName(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypeInvalid:
|
case invtype::InvTypeInvalid:
|
||||||
@@ -116,7 +116,24 @@ const char* Titanium::invtype::InvTypeName(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Titanium::invslot::InvPossessionsSlotName(int inv_slot)
|
bool Titanium::invtype::IsInvTypePersistent(int inv_type)
|
||||||
|
{
|
||||||
|
switch (inv_type) {
|
||||||
|
case invtype::InvTypePossessions:
|
||||||
|
case invtype::InvTypeBank:
|
||||||
|
case invtype::InvTypeSharedBank:
|
||||||
|
case invtype::InvTypeTrade:
|
||||||
|
case invtype::InvTypeWorld:
|
||||||
|
case invtype::InvTypeLimbo:
|
||||||
|
case invtype::InvTypeTribute:
|
||||||
|
case invtype::InvTypeGuildTribute:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* Titanium::invslot::GetInvPossessionsSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
switch (inv_slot) {
|
switch (inv_slot) {
|
||||||
case invslot::InvSlotInvalid:
|
case invslot::InvSlotInvalid:
|
||||||
@@ -188,9 +205,9 @@ const char* Titanium::invslot::InvPossessionsSlotName(int inv_slot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Titanium::invslot::InvCorpseSlotName(int inv_slot)
|
const char* Titanium::invslot::GetInvCorpseSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
if (!invtype::InvTypeSize(invtype::InvTypeCorpse) || inv_slot == invslot::InvSlotInvalid)
|
if (!invtype::GetInvTypeSize(invtype::InvTypeCorpse) || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
|
|
||||||
// needs work
|
// needs work
|
||||||
@@ -203,14 +220,14 @@ const char* Titanium::invslot::InvCorpseSlotName(int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Titanium::invslot::InvSlotName(int inv_type, int inv_slot)
|
const char* Titanium::invslot::GetInvSlotName(int inv_type, int inv_slot)
|
||||||
{
|
{
|
||||||
if (inv_type == invtype::InvTypePossessions)
|
if (inv_type == invtype::InvTypePossessions)
|
||||||
return invslot::InvPossessionsSlotName(inv_slot);
|
return invslot::GetInvPossessionsSlotName(inv_slot);
|
||||||
else if (inv_type == invtype::InvTypeCorpse)
|
else if (inv_type == invtype::InvTypeCorpse)
|
||||||
return invslot::InvCorpseSlotName(inv_slot);
|
return invslot::GetInvCorpseSlotName(inv_slot);
|
||||||
|
|
||||||
size_t type_size = invtype::InvTypeSize(inv_type);
|
size_t type_size = invtype::GetInvTypeSize(inv_type);
|
||||||
|
|
||||||
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
@@ -224,7 +241,7 @@ const char* Titanium::invslot::InvSlotName(int inv_type, int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Titanium::invbag::InvBagIndexName(int bag_index)
|
const char* Titanium::invbag::GetInvBagIndexName(int bag_index)
|
||||||
{
|
{
|
||||||
if (bag_index == invbag::InvBagInvalid)
|
if (bag_index == invbag::InvBagInvalid)
|
||||||
return "Invalid Bag";
|
return "Invalid Bag";
|
||||||
@@ -238,7 +255,7 @@ const char* Titanium::invbag::InvBagIndexName(int bag_index)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Titanium::invaug::InvAugIndexName(int aug_index)
|
const char* Titanium::invaug::GetInvAugIndexName(int aug_index)
|
||||||
{
|
{
|
||||||
if (aug_index == invaug::InvAugInvalid)
|
if (aug_index == invaug::InvAugInvalid)
|
||||||
return "Invalid Augment";
|
return "Invalid Augment";
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
#define COMMON_TITANIUM_LIMITS_H
|
#define COMMON_TITANIUM_LIMITS_H
|
||||||
|
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
#include "../client_version.h"
|
#include "../emu_versions.h"
|
||||||
#include "../skills.h"
|
#include "../skills.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -32,8 +32,13 @@ namespace Titanium
|
|||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
// pre-declarations
|
// pre-declarations
|
||||||
|
namespace inventory {
|
||||||
|
inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
inline EQEmu::versions::ClientVersion InvTypeRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
||||||
|
|
||||||
@@ -63,7 +68,7 @@ namespace Titanium
|
|||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
namespace invslot {
|
namespace invslot {
|
||||||
inline EQEmu::versions::ClientVersion InvSlotRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
||||||
|
|
||||||
@@ -113,21 +118,21 @@ namespace Titanium
|
|||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
inline EQEmu::versions::ClientVersion InvBagRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
enum : int { InvBagInvalid = -1, InvBagBegin };
|
enum : int { InvBagInvalid = -1, InvBagBegin };
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
inline EQEmu::versions::ClientVersion InvAugRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
enum : int { InvAugInvalid = -1, InvAugBegin };
|
enum : int { InvAugInvalid = -1, InvAugBegin };
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
namespace item {
|
namespace item {
|
||||||
inline EQEmu::versions::ClientVersion ItemRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
enum ItemPacketType : int {
|
enum ItemPacketType : int {
|
||||||
ItemPacketMerchant = 100,
|
ItemPacketMerchant = 100,
|
||||||
@@ -145,27 +150,37 @@ namespace Titanium
|
|||||||
} /*item*/
|
} /*item*/
|
||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
inline EQEmu::versions::ClientVersion ProfileRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
} /*profile*/
|
} /*profile*/
|
||||||
|
|
||||||
namespace constants {
|
namespace constants {
|
||||||
inline EQEmu::versions::ClientVersion ConstantsRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
inline EQEmu::versions::ClientVersion BehaviorRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|
||||||
namespace skills {
|
namespace skills {
|
||||||
inline EQEmu::versions::ClientVersion SkillsRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::Titanium; }
|
||||||
|
|
||||||
} /*skills*/
|
} /*skills*/
|
||||||
|
|
||||||
|
|
||||||
// declarations
|
// declarations
|
||||||
|
namespace inventory {
|
||||||
|
const bool ConcatenateInvTypeLimbo = true;
|
||||||
|
|
||||||
|
const bool AllowOverLevelEquipment = false;
|
||||||
|
|
||||||
|
const bool AllowEmptyBagInBag = false;
|
||||||
|
const bool AllowClickCastFromBag = false;
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
||||||
const size_t InvTypeBankSize = 16;
|
const size_t InvTypeBankSize = 16;
|
||||||
@@ -174,7 +189,7 @@ namespace Titanium
|
|||||||
const size_t InvTypeWorldSize = 10;
|
const size_t InvTypeWorldSize = 10;
|
||||||
const size_t InvTypeLimboSize = 36;
|
const size_t InvTypeLimboSize = 36;
|
||||||
const size_t InvTypeTributeSize = 5;
|
const size_t InvTypeTributeSize = 5;
|
||||||
const size_t InvTypeGuildTributeSize = 0;//unknown
|
const size_t InvTypeGuildTributeSize = 2;
|
||||||
const size_t InvTypeMerchantSize = 80;
|
const size_t InvTypeMerchantSize = 80;
|
||||||
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
||||||
const size_t InvTypeBazaarSize = 80;
|
const size_t InvTypeBazaarSize = 80;
|
||||||
@@ -187,10 +202,10 @@ namespace Titanium
|
|||||||
const size_t InvTypeArchivedSize = 0;//unknown
|
const size_t InvTypeArchivedSize = 0;//unknown
|
||||||
const size_t InvTypeOtherSize = 0;//unknown
|
const size_t InvTypeOtherSize = 0;//unknown
|
||||||
|
|
||||||
const size_t NPCTradeSize = 4;
|
extern size_t GetInvTypeSize(int inv_type);
|
||||||
|
extern const char* GetInvTypeName(int inv_type);
|
||||||
|
|
||||||
extern size_t InvTypeSize(int inv_type);
|
extern bool IsInvTypePersistent(int inv_type);
|
||||||
extern const char* InvTypeName(int inv_type);
|
|
||||||
|
|
||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
@@ -209,14 +224,17 @@ namespace Titanium
|
|||||||
const int WorldEnd = (WorldBegin + invtype::InvTypeWorldSize) - 1;
|
const int WorldEnd = (WorldBegin + invtype::InvTypeWorldSize) - 1;
|
||||||
|
|
||||||
const int TributeBegin = 400;
|
const int TributeBegin = 400;
|
||||||
const int TributeEnd = 404;
|
const int TributeEnd = (TributeBegin + invtype::InvTypeTributeSize) - 1;
|
||||||
|
|
||||||
|
const int GuildTributeBegin = 450;
|
||||||
|
const int GuildTributeEnd = (GuildTributeBegin + invtype::InvTypeGuildTributeSize) - 1;
|
||||||
|
|
||||||
const int CorpseBegin = PossessionsGeneral1;
|
const int CorpseBegin = PossessionsGeneral1;
|
||||||
const int CorpseEnd = PossessionsGeneral1 + PossessionsCursor;
|
const int CorpseEnd = PossessionsGeneral1 + PossessionsCursor;
|
||||||
|
|
||||||
extern const char* InvPossessionsSlotName(int inv_slot);
|
extern const char* GetInvPossessionsSlotName(int inv_slot);
|
||||||
extern const char* InvCorpseSlotName(int inv_slot);
|
extern const char* GetInvCorpseSlotName(int inv_slot);
|
||||||
extern const char* InvSlotName(int inv_type, int inv_slot);
|
extern const char* GetInvSlotName(int inv_type, int inv_slot);
|
||||||
|
|
||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
@@ -243,14 +261,14 @@ namespace Titanium
|
|||||||
const int TradeBagsSize = invtype::InvTypeTradeSize * ItemBagSize;
|
const int TradeBagsSize = invtype::InvTypeTradeSize * ItemBagSize;
|
||||||
const int TradeBagsEnd = (TradeBagsBegin + TradeBagsSize) - 1;
|
const int TradeBagsEnd = (TradeBagsBegin + TradeBagsSize) - 1;
|
||||||
|
|
||||||
extern const char* InvBagIndexName(int bag_index);
|
extern const char* GetInvBagIndexName(int bag_index);
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
const size_t ItemAugSize = 5;
|
const size_t ItemAugSize = 5;
|
||||||
|
|
||||||
extern const char* InvAugIndexName(int aug_index);
|
extern const char* GetInvAugIndexName(int aug_index);
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
@@ -260,6 +278,7 @@ namespace Titanium
|
|||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
const size_t TributeSize = invtype::InvTypeTributeSize;
|
const size_t TributeSize = invtype::InvTypeTributeSize;
|
||||||
|
const size_t GuildTributeSize = invtype::InvTypeGuildTributeSize;
|
||||||
|
|
||||||
const size_t BandoliersSize = 4; // number of bandolier instances
|
const size_t BandoliersSize = 4; // number of bandolier instances
|
||||||
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
||||||
@@ -278,13 +297,6 @@ namespace Titanium
|
|||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
const bool ConcatenateInvTypeLimbo = true;
|
|
||||||
|
|
||||||
const bool AllowOverLevelEquipment = false;
|
|
||||||
|
|
||||||
const bool AllowEmptyBagInBag = false;
|
|
||||||
const bool AllowClickCastFromBag = false;
|
|
||||||
|
|
||||||
const bool CoinHasWeight = true;
|
const bool CoinHasWeight = true;
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ E(OP_AdventureMerchantSell)
|
|||||||
E(OP_ApplyPoison)
|
E(OP_ApplyPoison)
|
||||||
E(OP_BazaarSearch)
|
E(OP_BazaarSearch)
|
||||||
E(OP_BecomeTrader)
|
E(OP_BecomeTrader)
|
||||||
|
E(OP_Buff)
|
||||||
E(OP_ChannelMessage)
|
E(OP_ChannelMessage)
|
||||||
E(OP_CharInventory)
|
E(OP_CharInventory)
|
||||||
E(OP_Damage)
|
E(OP_Damage)
|
||||||
@@ -39,6 +40,7 @@ E(OP_DzLeaderStatus)
|
|||||||
E(OP_DzMemberList)
|
E(OP_DzMemberList)
|
||||||
E(OP_Emote)
|
E(OP_Emote)
|
||||||
E(OP_FormattedMessage)
|
E(OP_FormattedMessage)
|
||||||
|
E(OP_GroundSpawn)
|
||||||
E(OP_GuildMemberLevelUpdate)
|
E(OP_GuildMemberLevelUpdate)
|
||||||
E(OP_GuildMemberList)
|
E(OP_GuildMemberList)
|
||||||
E(OP_Illusion)
|
E(OP_Illusion)
|
||||||
@@ -49,6 +51,7 @@ E(OP_ItemPacket)
|
|||||||
E(OP_LeadershipExpUpdate)
|
E(OP_LeadershipExpUpdate)
|
||||||
E(OP_LFGuild)
|
E(OP_LFGuild)
|
||||||
E(OP_LootItem)
|
E(OP_LootItem)
|
||||||
|
E(OP_MemorizeSpell)
|
||||||
E(OP_MoveItem)
|
E(OP_MoveItem)
|
||||||
E(OP_OnLevelMessage)
|
E(OP_OnLevelMessage)
|
||||||
E(OP_PetBuffWindow)
|
E(OP_PetBuffWindow)
|
||||||
@@ -74,6 +77,7 @@ E(OP_ZoneSpawns)
|
|||||||
D(OP_AdventureMerchantSell)
|
D(OP_AdventureMerchantSell)
|
||||||
D(OP_ApplyPoison)
|
D(OP_ApplyPoison)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
|
D(OP_Buff)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
D(OP_CharacterCreate)
|
D(OP_CharacterCreate)
|
||||||
@@ -85,6 +89,7 @@ D(OP_InspectAnswer)
|
|||||||
D(OP_InspectRequest)
|
D(OP_InspectRequest)
|
||||||
D(OP_ItemLinkClick)
|
D(OP_ItemLinkClick)
|
||||||
D(OP_LFGuild)
|
D(OP_LFGuild)
|
||||||
|
D(OP_LoadSpellSet)
|
||||||
D(OP_LootItem)
|
D(OP_LootItem)
|
||||||
D(OP_MoveItem)
|
D(OP_MoveItem)
|
||||||
D(OP_PetCommands)
|
D(OP_PetCommands)
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ struct AdventureInfo {
|
|||||||
** Merth: Gave struct a name so gcc 2.96 would compile
|
** Merth: Gave struct a name so gcc 2.96 would compile
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
struct Color_Struct
|
struct Tint_Struct
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
@@ -126,11 +126,53 @@ struct Color_Struct
|
|||||||
uint8 Green;
|
uint8 Green;
|
||||||
uint8 Red;
|
uint8 Red;
|
||||||
uint8 UseTint; // if there's a tint this is FF
|
uint8 UseTint; // if there's a tint this is FF
|
||||||
} RGB;
|
};
|
||||||
uint32 Color;
|
uint32 Color;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TintProfile {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Tint_Struct Head;
|
||||||
|
Tint_Struct Chest;
|
||||||
|
Tint_Struct Arms;
|
||||||
|
Tint_Struct Wrist;
|
||||||
|
Tint_Struct Hands;
|
||||||
|
Tint_Struct Legs;
|
||||||
|
Tint_Struct Feet;
|
||||||
|
Tint_Struct Primary;
|
||||||
|
Tint_Struct Secondary;
|
||||||
|
};
|
||||||
|
Tint_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Texture_Struct
|
||||||
|
{
|
||||||
|
uint32 Material;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TextureProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Texture_Struct Head;
|
||||||
|
Texture_Struct Chest;
|
||||||
|
Texture_Struct Arms;
|
||||||
|
Texture_Struct Wrist;
|
||||||
|
Texture_Struct Hands;
|
||||||
|
Texture_Struct Legs;
|
||||||
|
Texture_Struct Feet;
|
||||||
|
Texture_Struct Primary;
|
||||||
|
Texture_Struct Secondary;
|
||||||
|
};
|
||||||
|
Texture_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
TextureProfile();
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Character Selection Struct
|
** Character Selection Struct
|
||||||
** Length: 1704 Bytes
|
** Length: 1704 Bytes
|
||||||
@@ -139,10 +181,10 @@ struct Color_Struct
|
|||||||
struct CharacterSelect_Struct
|
struct CharacterSelect_Struct
|
||||||
{
|
{
|
||||||
/*0000*/ uint32 Race[10]; // Characters Race
|
/*0000*/ uint32 Race[10]; // Characters Race
|
||||||
/*0040*/ Color_Struct CS_Colors[10][9]; // Characters Equipment Colors
|
/*0040*/ TintProfile CS_Colors[10]; // Characters Equipment Colors - packet requires length for 10 characters..but, client is limited to 8
|
||||||
/*0400*/ uint8 BeardColor[10]; // Characters beard Color
|
/*0400*/ uint8 BeardColor[10]; // Characters beard Color
|
||||||
/*0410*/ uint8 HairStyle[10]; // Characters hair style
|
/*0410*/ uint8 HairStyle[10]; // Characters hair style
|
||||||
/*0420*/ uint32 Equip[10][9]; // 0=helm, 1=chest, 2=arm, 3=bracer, 4=hand, 5=leg, 6=boot, 7=melee1, 8=melee2 (Might not be)
|
/*0420*/ TextureProfile Equip[10]; // Characters texture array
|
||||||
/*0780*/ uint32 SecondaryIDFile[10]; // Characters secondary IDFile number
|
/*0780*/ uint32 SecondaryIDFile[10]; // Characters secondary IDFile number
|
||||||
/*0820*/ uint8 Unknown820[10]; // 10x ff
|
/*0820*/ uint8 Unknown820[10]; // 10x ff
|
||||||
/*0830*/ uint8 Unknown830[2]; // 2x 00
|
/*0830*/ uint8 Unknown830[2]; // 2x 00
|
||||||
@@ -239,22 +281,7 @@ struct Spawn_Struct {
|
|||||||
/*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner
|
/*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner
|
||||||
/*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader
|
/*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader
|
||||||
/*0194*/ uint8 unknown0194[3];
|
/*0194*/ uint8 unknown0194[3];
|
||||||
/*0197*/ union
|
/*0197*/ TextureProfile equipment;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0197*/ uint32 equip_helmet; // Equipment: Helmet Visual
|
|
||||||
/*0201*/ uint32 equip_chest; // Equipment: Chest Visual
|
|
||||||
/*0205*/ uint32 equip_arms; // Equipment: Arms Visual
|
|
||||||
/*0209*/ uint32 equip_bracers; // Equipment: Bracers Visual
|
|
||||||
/*0213*/ uint32 equip_hands; // Equipment: Hands Visual
|
|
||||||
/*0217*/ uint32 equip_legs; // Equipment: Legs Visual
|
|
||||||
/*0221*/ uint32 equip_feet; // Equipment: Feet Visual
|
|
||||||
/*0225*/ uint32 equip_primary; // Equipment: Primary Visual
|
|
||||||
/*0229*/ uint32 equip_secondary; // Equipment: Secondary Visual
|
|
||||||
} equip;
|
|
||||||
/*0197*/ uint32 equipment[9]; // Array elements correspond to struct equipment above
|
|
||||||
};
|
|
||||||
/*0233*/ float runspeed; // Speed when running
|
/*0233*/ float runspeed; // Speed when running
|
||||||
/*0036*/ uint8 afk; // 0=no, 1=afk
|
/*0036*/ uint8 afk; // 0=no, 1=afk
|
||||||
/*0238*/ uint32 guildID; // Current guild
|
/*0238*/ uint32 guildID; // Current guild
|
||||||
@@ -284,22 +311,7 @@ union
|
|||||||
};
|
};
|
||||||
/*0340*/ uint32 spawnId; // Spawn Id
|
/*0340*/ uint32 spawnId; // Spawn Id
|
||||||
/*0344*/ uint8 unknown0344[4];
|
/*0344*/ uint8 unknown0344[4];
|
||||||
/*0348*/ union
|
/*0348*/ TintProfile equipment_tint;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0348*/ Color_Struct color_helmet; // Color of helmet item
|
|
||||||
/*0352*/ Color_Struct color_chest; // Color of chest item
|
|
||||||
/*0356*/ Color_Struct color_arms; // Color of arms item
|
|
||||||
/*0360*/ Color_Struct color_bracers; // Color of bracers item
|
|
||||||
/*0364*/ Color_Struct color_hands; // Color of hands item
|
|
||||||
/*0368*/ Color_Struct color_legs; // Color of legs item
|
|
||||||
/*0372*/ Color_Struct color_feet; // Color of feet item
|
|
||||||
/*0376*/ Color_Struct color_primary; // Color of primary item
|
|
||||||
/*0380*/ Color_Struct color_secondary; // Color of secondary item
|
|
||||||
} equipment_colors;
|
|
||||||
/*0348*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
|
|
||||||
};
|
|
||||||
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
|
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
|
||||||
/*0385*/
|
/*0385*/
|
||||||
|
|
||||||
@@ -378,7 +390,7 @@ struct MemorizeSpell_Struct {
|
|||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 unknown12;
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -408,13 +420,13 @@ struct DeleteSpell_Struct
|
|||||||
/*005*/uint8 unknowndss006[3];
|
/*005*/uint8 unknowndss006[3];
|
||||||
/*008*/
|
/*008*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ManaChange_Struct
|
struct ManaChange_Struct
|
||||||
{
|
{
|
||||||
uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
uint32 spell_id;
|
/*08*/ uint32 spell_id;
|
||||||
uint32 unknown12;
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SwapSpell_Struct
|
struct SwapSpell_Struct
|
||||||
@@ -461,26 +473,19 @@ struct SpawnAppearance_Struct
|
|||||||
// this is used inside profile
|
// this is used inside profile
|
||||||
struct SpellBuff_Struct
|
struct SpellBuff_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
|
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
|
||||||
/*001*/ uint8 level;
|
/*001*/ uint8 level;
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 bard_modifier;
|
||||||
/*003*/ uint8 effect; //not real
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ uint32 spellid;
|
/*004*/ uint32 spellid;
|
||||||
/*008*/ int32 duration;
|
/*008*/ int32 duration;
|
||||||
/*012*/ uint32 counters;
|
/*012*/ uint32 counters; // single book keeping value (counters, rune/vie)
|
||||||
/*016*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
|
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpellBuffFade_Struct {
|
struct SpellBuffPacket_Struct {
|
||||||
/*000*/ uint32 entityid;
|
/*000*/ uint32 entityid;
|
||||||
/*004*/ uint8 slot;
|
/*004*/ SpellBuff_Struct buff;
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown7;
|
|
||||||
/*008*/ uint32 spellid;
|
|
||||||
/*012*/ int32 duration;
|
|
||||||
/*016*/ uint32 unknown016;
|
|
||||||
/*020*/ uint32 unknown020; //prolly global player ID
|
|
||||||
/*024*/ uint32 slotid;
|
/*024*/ uint32 slotid;
|
||||||
/*028*/ uint32 bufffade;
|
/*028*/ uint32 bufffade;
|
||||||
/*032*/
|
/*032*/
|
||||||
@@ -810,9 +815,9 @@ struct PlayerProfile_Struct
|
|||||||
/*00176*/ uint8 hairstyle; // Player hair style
|
/*00176*/ uint8 hairstyle; // Player hair style
|
||||||
/*00177*/ uint8 beard; // Player beard type
|
/*00177*/ uint8 beard; // Player beard type
|
||||||
/*00178*/ uint8 unknown00178[10];
|
/*00178*/ uint8 unknown00178[10];
|
||||||
/*00188*/ uint32 item_material[9]; // Item texture/material of worn items
|
/*00188*/ TextureProfile item_material; // Item texture/material of worn items
|
||||||
/*00224*/ uint8 unknown00224[44];
|
/*00224*/ uint8 unknown00224[44];
|
||||||
/*00268*/ Color_Struct item_tint[9]; // RR GG BB 00
|
/*00268*/ TintProfile item_tint; // RR GG BB 00
|
||||||
/*00304*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // AAs
|
/*00304*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // AAs
|
||||||
/*02224*/ uint32 points; // Unspent Practice points
|
/*02224*/ uint32 points; // Unspent Practice points
|
||||||
/*02228*/ uint32 mana; // Current mana
|
/*02228*/ uint32 mana; // Current mana
|
||||||
@@ -1035,7 +1040,7 @@ struct SpecialMesg_Struct
|
|||||||
struct WearChange_Struct{
|
struct WearChange_Struct{
|
||||||
/*000*/ uint16 spawn_id;
|
/*000*/ uint16 spawn_id;
|
||||||
/*002*/ uint16 material;
|
/*002*/ uint16 material;
|
||||||
/*004*/ Color_Struct color;
|
/*004*/ Tint_Struct color;
|
||||||
/*009*/ uint8 wear_slot_id;
|
/*009*/ uint8 wear_slot_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1652,8 +1657,7 @@ struct Merchant_Sell_Struct {
|
|||||||
/*004*/ uint32 playerid; // Player's entity id
|
/*004*/ uint32 playerid; // Player's entity id
|
||||||
/*008*/ uint32 itemslot;
|
/*008*/ uint32 itemslot;
|
||||||
uint32 unknown12;
|
uint32 unknown12;
|
||||||
/*016*/ uint8 quantity; // Already sold
|
/*016*/ uint32 quantity;
|
||||||
/*017*/ uint8 Unknown016[3];
|
|
||||||
/*020*/ uint32 price;
|
/*020*/ uint32 price;
|
||||||
};
|
};
|
||||||
struct Merchant_Purchase_Struct {
|
struct Merchant_Purchase_Struct {
|
||||||
@@ -2591,27 +2595,6 @@ struct PetitionBug_Struct{
|
|||||||
char text[1028];
|
char text[1028];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DyeStruct
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct Color_Struct head;
|
|
||||||
struct Color_Struct chest;
|
|
||||||
struct Color_Struct arms;
|
|
||||||
struct Color_Struct wrists;
|
|
||||||
struct Color_Struct hands;
|
|
||||||
struct Color_Struct legs;
|
|
||||||
struct Color_Struct feet;
|
|
||||||
struct Color_Struct primary; // you can't actually dye this
|
|
||||||
struct Color_Struct secondary; // or this
|
|
||||||
}
|
|
||||||
dyes;
|
|
||||||
struct Color_Struct dye[9];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
uint32 zoneid;
|
uint32 zoneid;
|
||||||
@@ -3245,6 +3228,11 @@ struct AnnoyingZoneUnknown_Struct {
|
|||||||
uint32 value; //always 4
|
uint32 value; //always 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct LoadSpellSet_Struct {
|
||||||
|
uint32 spell[MAX_PP_MEMSPELL];
|
||||||
|
uint32 unknown;
|
||||||
|
};
|
||||||
|
|
||||||
struct ApplyPoison_Struct {
|
struct ApplyPoison_Struct {
|
||||||
uint32 inventorySlot;
|
uint32 inventorySlot;
|
||||||
uint32 success;
|
uint32 success;
|
||||||
|
|||||||
+149
-65
@@ -59,6 +59,9 @@ namespace UF
|
|||||||
// client to server text link converter
|
// client to server text link converter
|
||||||
static inline void UFToServerTextLink(std::string& serverTextLink, const std::string& ufTextLink);
|
static inline void UFToServerTextLink(std::string& serverTextLink, const std::string& ufTextLink);
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToUFCastingSlot(EQEmu::CastingSlot slot);
|
||||||
|
static inline EQEmu::CastingSlot UFToServerCastingSlot(CastingSlot slot);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
{
|
{
|
||||||
//create our opcode manager if we havent already
|
//create our opcode manager if we havent already
|
||||||
@@ -80,7 +83,7 @@ namespace UF
|
|||||||
|
|
||||||
//ok, now we have what we need to register.
|
//ok, now we have what we need to register.
|
||||||
|
|
||||||
EQStream::Signature signature;
|
EQStreamInterface::Signature signature;
|
||||||
std::string pname;
|
std::string pname;
|
||||||
|
|
||||||
//register our world signature.
|
//register our world signature.
|
||||||
@@ -363,20 +366,29 @@ namespace UF
|
|||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_Buff)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Underfoot);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
OUT(entityid);
|
OUT(entityid);
|
||||||
OUT(slot);
|
OUT(buff.effect_type);
|
||||||
OUT(level);
|
OUT(buff.level);
|
||||||
OUT(effect);
|
// just so we're 100% sure we get a 1.0f ...
|
||||||
//eq->unknown7 = 10;
|
eq->buff.bard_modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
|
||||||
OUT(spellid);
|
OUT(buff.spellid);
|
||||||
OUT(duration);
|
OUT(buff.duration);
|
||||||
OUT(slotid);
|
OUT(buff.num_hits);
|
||||||
|
uint16 buffslot = emu->slotid;
|
||||||
|
if (buffslot >= 25 && buffslot < 37)
|
||||||
|
{
|
||||||
|
buffslot += 5;
|
||||||
|
}
|
||||||
|
else if (buffslot >= 37)
|
||||||
|
{
|
||||||
|
buffslot += 14;
|
||||||
|
}
|
||||||
|
// TODO: implement slot_data stuff
|
||||||
|
eq->slotid = buffslot;
|
||||||
OUT(bufffade); // Live (October 2011) sends a 2 rather than 0 when a buff is created, but it doesn't seem to matter.
|
OUT(bufffade); // Live (October 2011) sends a 2 rather than 0 when a buff is created, but it doesn't seem to matter.
|
||||||
OUT(num_hits);
|
|
||||||
eq->unknown008 = 1.0f;
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -398,12 +410,10 @@ namespace UF
|
|||||||
for (uint16 i = 0; i < emu->count; ++i)
|
for (uint16 i = 0; i < emu->count; ++i)
|
||||||
{
|
{
|
||||||
uint16 buffslot = emu->entries[i].buff_slot;
|
uint16 buffslot = emu->entries[i].buff_slot;
|
||||||
|
if (emu->type == 0) { // only correct for self packets
|
||||||
if (emu->entries[i].buff_slot >= 25 && emu->entries[i].buff_slot < 37)
|
if (emu->entries[i].buff_slot >= 25 && emu->entries[i].buff_slot < 37)
|
||||||
{
|
|
||||||
buffslot += 5;
|
buffslot += 5;
|
||||||
}
|
|
||||||
else if (emu->entries[i].buff_slot >= 37)
|
else if (emu->entries[i].buff_slot >= 37)
|
||||||
{
|
|
||||||
buffslot += 14;
|
buffslot += 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -865,8 +875,8 @@ namespace UF
|
|||||||
// This next field is actually a float. There is a groundspawn in freeportwest (sack of money sitting on some barrels) which requires this
|
// This next field is actually a float. There is a groundspawn in freeportwest (sack of money sitting on some barrels) which requires this
|
||||||
// field to be set to (float)255.0 to appear at all, and also the size field below to be 5, to be the correct size. I think SoD has the same
|
// field to be set to (float)255.0 to appear at all, and also the size field below to be 5, to be the correct size. I think SoD has the same
|
||||||
// issue.
|
// issue.
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); //X tilt
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->tilt_x); //X tilt
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, 0); //Y tilt
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->tilt_y); //Y tilt
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt.
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->size != 0 && (float)emu->size < 5000.f ? (float)((float)emu->size / 100.0f) : 1.f ); // This appears to be the size field. Hackish logic because some PEQ DB items were corrupt.
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y);
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->y);
|
||||||
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x);
|
VARSTRUCT_ENCODE_TYPE(float, OutBuffer, emu->x);
|
||||||
@@ -1374,7 +1384,8 @@ namespace UF
|
|||||||
OUT(new_mana);
|
OUT(new_mana);
|
||||||
OUT(stamina);
|
OUT(stamina);
|
||||||
OUT(spell_id);
|
OUT(spell_id);
|
||||||
eq->unknown16 = -1; // Self Interrupt/Success = -1, Fizzle = 1, Other Interrupt = 2?
|
OUT(keepcasting);
|
||||||
|
eq->slot = -1; // this is spell gem slot. It's -1 in normal operation
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -1752,18 +1763,18 @@ namespace UF
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 1);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 1);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint16, Buffer, emu->buffcount);
|
VARSTRUCT_ENCODE_TYPE(uint16, Buffer, emu->buffcount);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < BUFF_COUNT; ++i)
|
for (unsigned int i = 0; i < PET_BUFF_COUNT; ++i)
|
||||||
{
|
{
|
||||||
if (emu->spellid[i])
|
if (emu->spellid[i])
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, i);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, i);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->spellid[i]);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->spellid[i]);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->ticsremaining[i]);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->ticsremaining[i]);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // numhits
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // This is a string. Name of the caster of the buff.
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // This is a string. Name of the caster of the buff.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->buffcount);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->buffcount); /// I think this is actually some sort of type
|
||||||
|
|
||||||
delete[] __emu_buffer;
|
delete[] __emu_buffer;
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
@@ -1806,14 +1817,14 @@ namespace UF
|
|||||||
OUT(hairstyle);
|
OUT(hairstyle);
|
||||||
OUT(beard);
|
OUT(beard);
|
||||||
// OUT(unknown00178[10]);
|
// OUT(unknown00178[10]);
|
||||||
for (r = 0; r < 9; r++) {
|
for (r = EQEmu::textures::TextureBegin; r < EQEmu::textures::TextureCount; r++) {
|
||||||
eq->equipment[r].Material = emu->item_material[r];
|
eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material;
|
||||||
eq->equipment[r].Unknown1 = 0;
|
eq->equipment.Slot[r].Unknown1 = 0;
|
||||||
eq->equipment[r].EliteMaterial = 0;
|
eq->equipment.Slot[r].EliteMaterial = 0;
|
||||||
//eq->colors[r].color = emu->colors[r].color;
|
//eq->colors[r].color = emu->colors[r].color;
|
||||||
}
|
}
|
||||||
for (r = 0; r < 7; r++) {
|
for (r = 0; r < 7; r++) {
|
||||||
OUT(item_tint[r].Color);
|
OUT(item_tint.Slot[r].Color);
|
||||||
}
|
}
|
||||||
// OUT(unknown00224[48]);
|
// OUT(unknown00224[48]);
|
||||||
//NOTE: new client supports 300 AAs, our internal rep/PP
|
//NOTE: new client supports 300 AAs, our internal rep/PP
|
||||||
@@ -1858,26 +1869,26 @@ namespace UF
|
|||||||
OUT(thirst_level);
|
OUT(thirst_level);
|
||||||
OUT(hunger_level);
|
OUT(hunger_level);
|
||||||
//PS this needs to be figured out more; but it was 'good enough'
|
//PS this needs to be figured out more; but it was 'good enough'
|
||||||
for (r = 0; r < structs::BUFF_COUNT; r++)
|
for (r = 0; r < BUFF_COUNT; r++)
|
||||||
{
|
{
|
||||||
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
|
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
|
||||||
{
|
{
|
||||||
eq->buffs[r].unknown004 = 0x3f800000;
|
eq->buffs[r].bard_modifier = 1.0f + (emu->buffs[r].bard_modifier - 10) / 10.0f;
|
||||||
eq->buffs[r].slotid = 2;
|
eq->buffs[r].effect_type= 2;
|
||||||
eq->buffs[r].player_id = 0x000717fd;
|
eq->buffs[r].player_id = 0x000717fd;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
eq->buffs[r].slotid = 0;
|
eq->buffs[r].effect_type = 0;
|
||||||
|
eq->buffs[r].bard_modifier = 1.0f;
|
||||||
}
|
}
|
||||||
//OUT(buffs[r].slotid);
|
OUT(buffs[r].effect_type);
|
||||||
OUT(buffs[r].level);
|
OUT(buffs[r].level);
|
||||||
//OUT(buffs[r].bard_modifier);
|
OUT(buffs[r].unknown003);
|
||||||
//OUT(buffs[r].effect);
|
|
||||||
OUT(buffs[r].spellid);
|
OUT(buffs[r].spellid);
|
||||||
OUT(buffs[r].duration);
|
OUT(buffs[r].duration);
|
||||||
OUT(buffs[r].counters);
|
OUT(buffs[r].num_hits);
|
||||||
//OUT(buffs[r].player_id);
|
OUT(buffs[r].player_id);
|
||||||
}
|
}
|
||||||
for (r = 0; r < MAX_PP_DISCIPLINES; r++) {
|
for (r = 0; r < MAX_PP_DISCIPLINES; r++) {
|
||||||
OUT(disciplines.values[r]);
|
OUT(disciplines.values[r]);
|
||||||
@@ -2290,11 +2301,11 @@ namespace UF
|
|||||||
eq_cse->HairColor = emu_cse->HairColor;
|
eq_cse->HairColor = emu_cse->HairColor;
|
||||||
eq_cse->Face = emu_cse->Face;
|
eq_cse->Face = emu_cse->Face;
|
||||||
|
|
||||||
for (int equip_index = 0; equip_index < EQEmu::legacy::MaterialCount; equip_index++) {
|
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
|
||||||
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material;
|
||||||
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1;
|
||||||
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial;
|
||||||
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
|
eq_cse->Equip[equip_index].Color = emu_cse->Equip[equip_index].Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
eq_cse->PrimaryIDFile = emu_cse->PrimaryIDFile;
|
eq_cse->PrimaryIDFile = emu_cse->PrimaryIDFile;
|
||||||
@@ -2858,7 +2869,7 @@ namespace UF
|
|||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)))
|
if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)))
|
||||||
{
|
{
|
||||||
PacketSize -= (sizeof(structs::EquipStruct) * 9);
|
PacketSize -= (sizeof(structs::Texture_Struct) * EQEmu::textures::TextureCount);
|
||||||
|
|
||||||
if (emu->size == 0)
|
if (emu->size == 0)
|
||||||
{
|
{
|
||||||
@@ -3057,10 +3068,10 @@ namespace UF
|
|||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
||||||
{
|
{
|
||||||
for (k = 0; k < 9; ++k)
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; ++k)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->colors[k].Color);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment_tint.Slot[k].Color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3070,19 +3081,19 @@ namespace UF
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
|
|
||||||
if (emu->equipment[EQEmu::legacy::MaterialPrimary].Material > 99999) {
|
if (emu->equipment.Primary.Material > 99999) {
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63);
|
||||||
} else {
|
} else {
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::legacy::MaterialPrimary].Material);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Primary.Material);
|
||||||
}
|
}
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
|
|
||||||
if (emu->equipment[EQEmu::legacy::MaterialSecondary].Material > 99999) {
|
if (emu->equipment.Secondary.Material > 99999) {
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63);
|
||||||
} else {
|
} else {
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::legacy::MaterialSecondary].Material);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Secondary.Material);
|
||||||
}
|
}
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
@@ -3091,19 +3102,19 @@ namespace UF
|
|||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
||||||
{
|
{
|
||||||
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer;
|
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
||||||
|
|
||||||
for (k = 0; k < 9; k++) {
|
for (k = EQEmu::textures::TextureBegin; k < EQEmu::textures::TextureCount; k++) {
|
||||||
if (emu->equipment[k].Material > 99999) {
|
if (emu->equipment.Slot[k].Material > 99999) {
|
||||||
Equipment[k].Material = 63;
|
Equipment[k].Material = 63;
|
||||||
} else {
|
} else {
|
||||||
Equipment[k].Material = emu->equipment[k].Material;
|
Equipment[k].Material = emu->equipment.Slot[k].Material;
|
||||||
}
|
}
|
||||||
Equipment[k].Unknown1 = emu->equipment[k].Unknown1;
|
Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
|
||||||
Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial;
|
Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer += (sizeof(structs::EquipStruct) * 9);
|
Buffer += (sizeof(structs::Texture_Struct) * EQEmu::textures::TextureCount);
|
||||||
}
|
}
|
||||||
if (strlen(emu->title))
|
if (strlen(emu->title))
|
||||||
{
|
{
|
||||||
@@ -3216,15 +3227,15 @@ namespace UF
|
|||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct_Underfoot);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Underfoot);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
|
|
||||||
IN(entityid);
|
IN(entityid);
|
||||||
IN(slot);
|
IN(buff.effect_type);
|
||||||
IN(level);
|
IN(buff.level);
|
||||||
IN(effect);
|
IN(buff.unknown003);
|
||||||
IN(spellid);
|
IN(buff.spellid);
|
||||||
IN(duration);
|
IN(buff.duration);
|
||||||
IN(slotid);
|
IN(slotid);
|
||||||
IN(bufffade);
|
IN(bufffade);
|
||||||
|
|
||||||
@@ -3250,10 +3261,7 @@ namespace UF
|
|||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
SETUP_DIRECT_DECODE(CastSpell_Struct, structs::CastSpell_Struct);
|
||||||
|
|
||||||
if (eq->slot == 13)
|
emu->slot = static_cast<uint32>(UFToServerCastingSlot(static_cast<CastingSlot>(eq->slot)));
|
||||||
emu->slot = 10;
|
|
||||||
else
|
|
||||||
IN(slot);
|
|
||||||
|
|
||||||
IN(spell_id);
|
IN(spell_id);
|
||||||
emu->inventoryslot = UFToServerSlot(eq->inventoryslot);
|
emu->inventoryslot = UFToServerSlot(eq->inventoryslot);
|
||||||
@@ -3841,11 +3849,11 @@ namespace UF
|
|||||||
|
|
||||||
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
void SerializeItem(EQEmu::OutBuffer& ob, const ItemInst *inst, int16 slot_id_in, uint8 depth)
|
||||||
{
|
{
|
||||||
const EQEmu::Item_Struct *item = inst->GetUnscaledItem();
|
const EQEmu::ItemBase *item = inst->GetUnscaledItem();
|
||||||
|
|
||||||
UF::structs::ItemSerializationHeader hdr;
|
UF::structs::ItemSerializationHeader hdr;
|
||||||
|
|
||||||
hdr.stacksize = (inst->IsStackable() ? ((inst->GetCharges() > 254) ? 0xFFFFFFFF : inst->GetCharges()) : 1);
|
hdr.stacksize = (inst->IsStackable() ? ((inst->GetCharges() > 1000) ? 0xFFFFFFFF : inst->GetCharges()) : 1);
|
||||||
hdr.unknown004 = 0;
|
hdr.unknown004 = 0;
|
||||||
|
|
||||||
int32 slot_id = ServerToUFSlot(slot_id_in);
|
int32 slot_id = ServerToUFSlot(slot_id_in);
|
||||||
@@ -3885,7 +3893,7 @@ namespace UF
|
|||||||
int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType);
|
int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType);
|
||||||
uint16 ornaIcon = 0;
|
uint16 ornaIcon = 0;
|
||||||
if (inst->GetOrnamentationAug(ornamentationAugtype)) {
|
if (inst->GetOrnamentationAug(ornamentationAugtype)) {
|
||||||
const EQEmu::Item_Struct *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem();
|
const EQEmu::ItemBase *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem();
|
||||||
ornaIcon = aug_weap->Icon;
|
ornaIcon = aug_weap->Icon;
|
||||||
|
|
||||||
ob.write(aug_weap->IDFile, strlen(aug_weap->IDFile));
|
ob.write(aug_weap->IDFile, strlen(aug_weap->IDFile));
|
||||||
@@ -4369,4 +4377,80 @@ namespace UF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline CastingSlot ServerToUFCastingSlot(EQEmu::CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case EQEmu::CastingSlot::Gem1:
|
||||||
|
return CastingSlot::Gem1;
|
||||||
|
case EQEmu::CastingSlot::Gem2:
|
||||||
|
return CastingSlot::Gem2;
|
||||||
|
case EQEmu::CastingSlot::Gem3:
|
||||||
|
return CastingSlot::Gem3;
|
||||||
|
case EQEmu::CastingSlot::Gem4:
|
||||||
|
return CastingSlot::Gem4;
|
||||||
|
case EQEmu::CastingSlot::Gem5:
|
||||||
|
return CastingSlot::Gem5;
|
||||||
|
case EQEmu::CastingSlot::Gem6:
|
||||||
|
return CastingSlot::Gem6;
|
||||||
|
case EQEmu::CastingSlot::Gem7:
|
||||||
|
return CastingSlot::Gem7;
|
||||||
|
case EQEmu::CastingSlot::Gem8:
|
||||||
|
return CastingSlot::Gem8;
|
||||||
|
case EQEmu::CastingSlot::Gem9:
|
||||||
|
return CastingSlot::Gem9;
|
||||||
|
case EQEmu::CastingSlot::Gem10:
|
||||||
|
return CastingSlot::Gem10;
|
||||||
|
case EQEmu::CastingSlot::Gem11:
|
||||||
|
return CastingSlot::Gem11;
|
||||||
|
case EQEmu::CastingSlot::Gem12:
|
||||||
|
return CastingSlot::Gem12;
|
||||||
|
case EQEmu::CastingSlot::Item:
|
||||||
|
case EQEmu::CastingSlot::PotionBelt:
|
||||||
|
return CastingSlot::Item;
|
||||||
|
case EQEmu::CastingSlot::Discipline:
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
case EQEmu::CastingSlot::AltAbility:
|
||||||
|
return CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline EQEmu::CastingSlot UFToServerCastingSlot(CastingSlot slot)
|
||||||
|
{
|
||||||
|
switch (slot) {
|
||||||
|
case CastingSlot::Gem1:
|
||||||
|
return EQEmu::CastingSlot::Gem1;
|
||||||
|
case CastingSlot::Gem2:
|
||||||
|
return EQEmu::CastingSlot::Gem2;
|
||||||
|
case CastingSlot::Gem3:
|
||||||
|
return EQEmu::CastingSlot::Gem3;
|
||||||
|
case CastingSlot::Gem4:
|
||||||
|
return EQEmu::CastingSlot::Gem4;
|
||||||
|
case CastingSlot::Gem5:
|
||||||
|
return EQEmu::CastingSlot::Gem5;
|
||||||
|
case CastingSlot::Gem6:
|
||||||
|
return EQEmu::CastingSlot::Gem6;
|
||||||
|
case CastingSlot::Gem7:
|
||||||
|
return EQEmu::CastingSlot::Gem7;
|
||||||
|
case CastingSlot::Gem8:
|
||||||
|
return EQEmu::CastingSlot::Gem8;
|
||||||
|
case CastingSlot::Gem9:
|
||||||
|
return EQEmu::CastingSlot::Gem9;
|
||||||
|
case CastingSlot::Gem10:
|
||||||
|
return EQEmu::CastingSlot::Gem10;
|
||||||
|
case CastingSlot::Gem11:
|
||||||
|
return EQEmu::CastingSlot::Gem11;
|
||||||
|
case CastingSlot::Gem12:
|
||||||
|
return EQEmu::CastingSlot::Gem12;
|
||||||
|
case CastingSlot::Discipline:
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
case CastingSlot::Item:
|
||||||
|
return EQEmu::CastingSlot::Item;
|
||||||
|
case CastingSlot::AltAbility:
|
||||||
|
return EQEmu::CastingSlot::AltAbility;
|
||||||
|
default: // we shouldn't have any issues with other slots ... just return something
|
||||||
|
return EQEmu::CastingSlot::Discipline;
|
||||||
|
}
|
||||||
|
}
|
||||||
} /*UF*/
|
} /*UF*/
|
||||||
|
|||||||
@@ -50,6 +50,24 @@ namespace UF
|
|||||||
#include "uf_ops.h"
|
#include "uf_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CastingSlot : uint32 {
|
||||||
|
Gem1 = 0,
|
||||||
|
Gem2 = 1,
|
||||||
|
Gem3 = 2,
|
||||||
|
Gem4 = 3,
|
||||||
|
Gem5 = 4,
|
||||||
|
Gem6 = 5,
|
||||||
|
Gem7 = 6,
|
||||||
|
Gem8 = 7,
|
||||||
|
Gem9 = 8,
|
||||||
|
Gem10 = 9,
|
||||||
|
Gem11 = 10,
|
||||||
|
Gem12 = 11,
|
||||||
|
Item = 12,
|
||||||
|
Discipline = 13,
|
||||||
|
AltAbility = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
}; /*UF*/
|
}; /*UF*/
|
||||||
|
|
||||||
#endif /*COMMON_UF_H*/
|
#endif /*COMMON_UF_H*/
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "../string_util.h"
|
#include "../string_util.h"
|
||||||
|
|
||||||
|
|
||||||
size_t UF::invtype::InvTypeSize(int inv_type)
|
size_t UF::invtype::GetInvTypeSize(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypePossessions:
|
case invtype::InvTypePossessions:
|
||||||
@@ -68,7 +68,7 @@ size_t UF::invtype::InvTypeSize(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* UF::invtype::InvTypeName(int inv_type)
|
const char* UF::invtype::GetInvTypeName(int inv_type)
|
||||||
{
|
{
|
||||||
switch (inv_type) {
|
switch (inv_type) {
|
||||||
case invtype::InvTypeInvalid:
|
case invtype::InvTypeInvalid:
|
||||||
@@ -116,7 +116,24 @@ const char* UF::invtype::InvTypeName(int inv_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* UF::invslot::InvPossessionsSlotName(int inv_slot)
|
bool UF::invtype::IsInvTypePersistent(int inv_type)
|
||||||
|
{
|
||||||
|
switch (inv_type) {
|
||||||
|
case invtype::InvTypePossessions:
|
||||||
|
case invtype::InvTypeBank:
|
||||||
|
case invtype::InvTypeSharedBank:
|
||||||
|
case invtype::InvTypeTrade:
|
||||||
|
case invtype::InvTypeWorld:
|
||||||
|
case invtype::InvTypeLimbo:
|
||||||
|
case invtype::InvTypeTribute:
|
||||||
|
case invtype::InvTypeGuildTribute:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* UF::invslot::GetInvPossessionsSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
switch (inv_slot) {
|
switch (inv_slot) {
|
||||||
case invslot::InvSlotInvalid:
|
case invslot::InvSlotInvalid:
|
||||||
@@ -190,9 +207,9 @@ const char* UF::invslot::InvPossessionsSlotName(int inv_slot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* UF::invslot::InvCorpseSlotName(int inv_slot)
|
const char* UF::invslot::GetInvCorpseSlotName(int inv_slot)
|
||||||
{
|
{
|
||||||
if (!invtype::InvTypeSize(invtype::InvTypeCorpse) || inv_slot == invslot::InvSlotInvalid)
|
if (!invtype::GetInvTypeSize(invtype::InvTypeCorpse) || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
|
|
||||||
// needs work
|
// needs work
|
||||||
@@ -205,14 +222,14 @@ const char* UF::invslot::InvCorpseSlotName(int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* UF::invslot::InvSlotName(int inv_type, int inv_slot)
|
const char* UF::invslot::GetInvSlotName(int inv_type, int inv_slot)
|
||||||
{
|
{
|
||||||
if (inv_type == invtype::InvTypePossessions)
|
if (inv_type == invtype::InvTypePossessions)
|
||||||
return invslot::InvPossessionsSlotName(inv_slot);
|
return invslot::GetInvPossessionsSlotName(inv_slot);
|
||||||
else if (inv_type == invtype::InvTypeCorpse)
|
else if (inv_type == invtype::InvTypeCorpse)
|
||||||
return invslot::InvCorpseSlotName(inv_slot);
|
return invslot::GetInvCorpseSlotName(inv_slot);
|
||||||
|
|
||||||
size_t type_size = invtype::InvTypeSize(inv_type);
|
size_t type_size = invtype::GetInvTypeSize(inv_type);
|
||||||
|
|
||||||
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
if (!type_size || inv_slot == invslot::InvSlotInvalid)
|
||||||
return "Invalid Slot";
|
return "Invalid Slot";
|
||||||
@@ -226,7 +243,7 @@ const char* UF::invslot::InvSlotName(int inv_type, int inv_slot)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* UF::invbag::InvBagIndexName(int bag_index)
|
const char* UF::invbag::GetInvBagIndexName(int bag_index)
|
||||||
{
|
{
|
||||||
if (bag_index == invbag::InvBagInvalid)
|
if (bag_index == invbag::InvBagInvalid)
|
||||||
return "Invalid Bag";
|
return "Invalid Bag";
|
||||||
@@ -240,7 +257,7 @@ const char* UF::invbag::InvBagIndexName(int bag_index)
|
|||||||
return ret_str.c_str();
|
return ret_str.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* UF::invaug::InvAugIndexName(int aug_index)
|
const char* UF::invaug::GetInvAugIndexName(int aug_index)
|
||||||
{
|
{
|
||||||
if (aug_index == invaug::InvAugInvalid)
|
if (aug_index == invaug::InvAugInvalid)
|
||||||
return "Invalid Augment";
|
return "Invalid Augment";
|
||||||
|
|||||||
+39
-27
@@ -21,7 +21,7 @@
|
|||||||
#define COMMON_UF_LIMITS_H
|
#define COMMON_UF_LIMITS_H
|
||||||
|
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
#include "../client_version.h"
|
#include "../emu_versions.h"
|
||||||
#include "../skills.h"
|
#include "../skills.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -32,8 +32,13 @@ namespace UF
|
|||||||
enum : bool { False = false, True = true };
|
enum : bool { False = false, True = true };
|
||||||
|
|
||||||
// pre-declarations
|
// pre-declarations
|
||||||
|
namespace inventory {
|
||||||
|
inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
inline EQEmu::versions::ClientVersion InvTypeRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
enum : int { InvTypeInvalid = -1, InvTypeBegin };
|
||||||
|
|
||||||
@@ -63,7 +68,7 @@ namespace UF
|
|||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
namespace invslot {
|
namespace invslot {
|
||||||
inline EQEmu::versions::ClientVersion InvSlotRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
enum : int { InvSlotInvalid = -1, InvSlotBegin };
|
||||||
|
|
||||||
@@ -114,21 +119,21 @@ namespace UF
|
|||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
inline EQEmu::versions::ClientVersion InvBagRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
enum : int { InvBagInvalid = -1, InvBagBegin };
|
enum : int { InvBagInvalid = -1, InvBagBegin };
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
inline EQEmu::versions::ClientVersion InvAugRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
enum : int { InvAugInvalid = -1, InvAugBegin };
|
enum : int { InvAugInvalid = -1, InvAugBegin };
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
namespace item {
|
namespace item {
|
||||||
inline EQEmu::versions::ClientVersion ItemRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
enum ItemPacketType : int {
|
enum ItemPacketType : int {
|
||||||
ItemPacketMerchant = 100,
|
ItemPacketMerchant = 100,
|
||||||
@@ -147,27 +152,37 @@ namespace UF
|
|||||||
} /*item*/
|
} /*item*/
|
||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
inline EQEmu::versions::ClientVersion ProfileRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
} /*profile*/
|
} /*profile*/
|
||||||
|
|
||||||
namespace constants {
|
namespace constants {
|
||||||
inline EQEmu::versions::ClientVersion ConstantsRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
inline EQEmu::versions::ClientVersion BehaviorRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|
||||||
namespace skills {
|
namespace skills {
|
||||||
inline EQEmu::versions::ClientVersion SkillsRef() { return EQEmu::versions::ClientVersion::UF; }
|
inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::UF; }
|
||||||
|
|
||||||
} /*skills*/
|
} /*skills*/
|
||||||
|
|
||||||
|
|
||||||
// declarations
|
// declarations
|
||||||
|
namespace inventory {
|
||||||
|
const bool ConcatenateInvTypeLimbo = true;
|
||||||
|
|
||||||
|
const bool AllowOverLevelEquipment = true;
|
||||||
|
|
||||||
|
const bool AllowEmptyBagInBag = false;
|
||||||
|
const bool AllowClickCastFromBag = false;
|
||||||
|
|
||||||
|
} /*inventory*/
|
||||||
|
|
||||||
namespace invtype {
|
namespace invtype {
|
||||||
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
const size_t InvTypePossessionsSize = invslot::PossessionsCount;
|
||||||
const size_t InvTypeBankSize = 24;
|
const size_t InvTypeBankSize = 24;
|
||||||
@@ -176,7 +191,7 @@ namespace UF
|
|||||||
const size_t InvTypeWorldSize = 10;
|
const size_t InvTypeWorldSize = 10;
|
||||||
const size_t InvTypeLimboSize = 36;
|
const size_t InvTypeLimboSize = 36;
|
||||||
const size_t InvTypeTributeSize = 5;
|
const size_t InvTypeTributeSize = 5;
|
||||||
const size_t InvTypeGuildTributeSize = 0;//unknown
|
const size_t InvTypeGuildTributeSize = 2;
|
||||||
const size_t InvTypeMerchantSize = 80;
|
const size_t InvTypeMerchantSize = 80;
|
||||||
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
const size_t InvTypeCorpseSize = InvTypePossessionsSize;
|
||||||
const size_t InvTypeBazaarSize = 80;
|
const size_t InvTypeBazaarSize = 80;
|
||||||
@@ -189,10 +204,10 @@ namespace UF
|
|||||||
const size_t InvTypeArchivedSize = 0;//unknown
|
const size_t InvTypeArchivedSize = 0;//unknown
|
||||||
const size_t InvTypeOtherSize = 0;//unknown
|
const size_t InvTypeOtherSize = 0;//unknown
|
||||||
|
|
||||||
const size_t NPCTradeSize = 4;
|
extern size_t GetInvTypeSize(int inv_type);
|
||||||
|
extern const char* GetInvTypeName(int inv_type);
|
||||||
|
|
||||||
extern size_t InvTypeSize(int inv_type);
|
extern bool IsInvTypePersistent(int inv_type);
|
||||||
extern const char* InvTypeName(int inv_type);
|
|
||||||
|
|
||||||
} /*invtype*/
|
} /*invtype*/
|
||||||
|
|
||||||
@@ -211,14 +226,17 @@ namespace UF
|
|||||||
const int WorldEnd = (WorldBegin + invtype::InvTypeWorldSize) - 1;
|
const int WorldEnd = (WorldBegin + invtype::InvTypeWorldSize) - 1;
|
||||||
|
|
||||||
const int TributeBegin = 400;
|
const int TributeBegin = 400;
|
||||||
const int TributeEnd = 404;
|
const int TributeEnd = (TributeBegin + invtype::InvTypeTributeSize) - 1;
|
||||||
|
|
||||||
|
const int GuildTributeBegin = 450;
|
||||||
|
const int GuildTributeEnd = (GuildTributeBegin + invtype::InvTypeGuildTributeSize) - 1;
|
||||||
|
|
||||||
const int CorpseBegin = invslot::PossessionsGeneral1;
|
const int CorpseBegin = invslot::PossessionsGeneral1;
|
||||||
const int CorpseEnd = invslot::PossessionsGeneral1 + invslot::PossessionsCursor;
|
const int CorpseEnd = invslot::PossessionsGeneral1 + invslot::PossessionsCursor;
|
||||||
|
|
||||||
extern const char* InvPossessionsSlotName(int inv_slot);
|
extern const char* GetInvPossessionsSlotName(int inv_slot);
|
||||||
extern const char* InvCorpseSlotName(int inv_slot);
|
extern const char* GetInvCorpseSlotName(int inv_slot);
|
||||||
extern const char* InvSlotName(int inv_type, int inv_slot);
|
extern const char* GetInvSlotName(int inv_type, int inv_slot);
|
||||||
|
|
||||||
} /*invslot*/
|
} /*invslot*/
|
||||||
|
|
||||||
@@ -245,14 +263,14 @@ namespace UF
|
|||||||
const int TradeBagsSize = invtype::InvTypeTradeSize * ItemBagSize;
|
const int TradeBagsSize = invtype::InvTypeTradeSize * ItemBagSize;
|
||||||
const int TradeBagsEnd = (TradeBagsBegin + TradeBagsSize) - 1;
|
const int TradeBagsEnd = (TradeBagsBegin + TradeBagsSize) - 1;
|
||||||
|
|
||||||
extern const char* InvBagIndexName(int bag_index);
|
extern const char* GetInvBagIndexName(int bag_index);
|
||||||
|
|
||||||
} /*invbag*/
|
} /*invbag*/
|
||||||
|
|
||||||
namespace invaug {
|
namespace invaug {
|
||||||
const size_t ItemAugSize = 5;
|
const size_t ItemAugSize = 5;
|
||||||
|
|
||||||
extern const char* InvAugIndexName(int aug_index);
|
extern const char* GetInvAugIndexName(int aug_index);
|
||||||
|
|
||||||
} /*invaug*/
|
} /*invaug*/
|
||||||
|
|
||||||
@@ -262,6 +280,7 @@ namespace UF
|
|||||||
|
|
||||||
namespace profile {
|
namespace profile {
|
||||||
const size_t TributeSize = invtype::InvTypeTributeSize;
|
const size_t TributeSize = invtype::InvTypeTributeSize;
|
||||||
|
const size_t GuildTributeSize = invtype::InvTypeGuildTributeSize;
|
||||||
|
|
||||||
const size_t BandoliersSize = 20; // number of bandolier instances
|
const size_t BandoliersSize = 20; // number of bandolier instances
|
||||||
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
const size_t BandolierItemCount = 4; // number of equipment slots in bandolier instance
|
||||||
@@ -280,13 +299,6 @@ namespace UF
|
|||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
namespace behavior {
|
namespace behavior {
|
||||||
const bool ConcatenateInvTypeLimbo = true;
|
|
||||||
|
|
||||||
const bool AllowOverLevelEquipment = true;
|
|
||||||
|
|
||||||
const bool AllowEmptyBagInBag = false;
|
|
||||||
const bool AllowClickCastFromBag = false;
|
|
||||||
|
|
||||||
const bool CoinHasWeight = false;
|
const bool CoinHasWeight = false;
|
||||||
|
|
||||||
} /*behavior*/
|
} /*behavior*/
|
||||||
|
|||||||
+80
-147
@@ -26,7 +26,7 @@ namespace UF
|
|||||||
namespace structs {
|
namespace structs {
|
||||||
|
|
||||||
|
|
||||||
static const uint32 BUFF_COUNT = 25;
|
static const uint32 BUFF_COUNT = 30;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Compiler override to ensure
|
** Compiler override to ensure
|
||||||
@@ -122,27 +122,70 @@ struct AdventureInfo {
|
|||||||
** Merth: Gave struct a name so gcc 2.96 would compile
|
** Merth: Gave struct a name so gcc 2.96 would compile
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
struct Color_Struct
|
struct Tint_Struct
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
uint8 blue;
|
uint8 Blue;
|
||||||
uint8 Green;
|
uint8 Green;
|
||||||
uint8 Red;
|
uint8 Red;
|
||||||
uint8 UseTint; // if there's a tint this is FF
|
uint8 UseTint; // if there's a tint this is FF
|
||||||
} RGB;
|
};
|
||||||
uint32 Color;
|
uint32 Color;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CharSelectEquip
|
struct TintProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Tint_Struct Head;
|
||||||
|
Tint_Struct Chest;
|
||||||
|
Tint_Struct Arms;
|
||||||
|
Tint_Struct Wrist;
|
||||||
|
Tint_Struct Hands;
|
||||||
|
Tint_Struct Legs;
|
||||||
|
Tint_Struct Feet;
|
||||||
|
Tint_Struct Primary;
|
||||||
|
Tint_Struct Secondary;
|
||||||
|
};
|
||||||
|
Tint_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Visible equiptment.
|
||||||
|
* Size: 12 Octets
|
||||||
|
*/
|
||||||
|
struct Texture_Struct
|
||||||
{
|
{
|
||||||
uint32 Material;
|
uint32 Material;
|
||||||
uint32 Unknown1;
|
uint32 Unknown1;
|
||||||
uint32 EliteMaterial;
|
uint32 EliteMaterial;
|
||||||
Color_Struct Color;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TextureProfile
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Texture_Struct Head;
|
||||||
|
Texture_Struct Chest;
|
||||||
|
Texture_Struct Arms;
|
||||||
|
Texture_Struct Wrist;
|
||||||
|
Texture_Struct Hands;
|
||||||
|
Texture_Struct Legs;
|
||||||
|
Texture_Struct Feet;
|
||||||
|
Texture_Struct Primary;
|
||||||
|
Texture_Struct Secondary;
|
||||||
|
};
|
||||||
|
Texture_Struct Slot[EQEmu::textures::TextureCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
TextureProfile();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CharSelectEquip : Texture_Struct, Tint_Struct {};
|
||||||
|
|
||||||
struct CharacterSelectEntry_Struct
|
struct CharacterSelectEntry_Struct
|
||||||
{
|
{
|
||||||
/*0000*/ uint8 Level; //
|
/*0000*/ uint8 Level; //
|
||||||
@@ -152,7 +195,7 @@ struct CharacterSelectEntry_Struct
|
|||||||
/*0000*/ uint8 Beard; //
|
/*0000*/ uint8 Beard; //
|
||||||
/*0001*/ uint8 HairColor; //
|
/*0001*/ uint8 HairColor; //
|
||||||
/*0000*/ uint8 Face; //
|
/*0000*/ uint8 Face; //
|
||||||
/*0000*/ CharSelectEquip Equip[9];
|
/*0000*/ CharSelectEquip Equip[EQEmu::textures::TextureCount];
|
||||||
/*0000*/ uint32 PrimaryIDFile; //
|
/*0000*/ uint32 PrimaryIDFile; //
|
||||||
/*0000*/ uint32 SecondaryIDFile; //
|
/*0000*/ uint32 SecondaryIDFile; //
|
||||||
/*0000*/ uint8 Unknown15; // 0xff
|
/*0000*/ uint8 Unknown15; // 0xff
|
||||||
@@ -185,19 +228,6 @@ struct CharacterSelect_Struct
|
|||||||
/*0008*/ CharacterSelectEntry_Struct Entries[0];
|
/*0008*/ CharacterSelectEntry_Struct Entries[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Visible equiptment.
|
|
||||||
* Size: 12 Octets
|
|
||||||
*/
|
|
||||||
struct EquipStruct
|
|
||||||
{
|
|
||||||
/*00*/ uint32 Material;
|
|
||||||
/*04*/ uint32 Unknown1;
|
|
||||||
/*08*/ uint32 EliteMaterial;
|
|
||||||
/*12*/
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Generic Spawn Struct
|
** Generic Spawn Struct
|
||||||
** Length: 897 Octets
|
** Length: 897 Octets
|
||||||
@@ -314,40 +344,10 @@ struct Spawn_Struct
|
|||||||
/*0000*/ uint32 unknown18;
|
/*0000*/ uint32 unknown18;
|
||||||
/*0000*/ uint32 unknown19;
|
/*0000*/ uint32 unknown19;
|
||||||
Spawn_Struct_Position Position;
|
Spawn_Struct_Position Position;
|
||||||
/*0000*/ union
|
/*0000*/ TintProfile equipment_tint;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0000*/ Color_Struct color_helmet; // Color of helmet item
|
|
||||||
/*0000*/ Color_Struct color_chest; // Color of chest item
|
|
||||||
/*0000*/ Color_Struct color_arms; // Color of arms item
|
|
||||||
/*0000*/ Color_Struct color_bracers; // Color of bracers item
|
|
||||||
/*0000*/ Color_Struct color_hands; // Color of hands item
|
|
||||||
/*0000*/ Color_Struct color_legs; // Color of legs item
|
|
||||||
/*0000*/ Color_Struct color_feet; // Color of feet item
|
|
||||||
/*0000*/ Color_Struct color_primary; // Color of primary item
|
|
||||||
/*0000*/ Color_Struct color_secondary; // Color of secondary item
|
|
||||||
} equipment_colors;
|
|
||||||
/*0000*/ Color_Struct colors[9]; // Array elements correspond to struct equipment_colors above
|
|
||||||
};
|
|
||||||
|
|
||||||
// skip these bytes if not a valid player race
|
// skip these bytes if not a valid player race
|
||||||
/*0000*/ union
|
/*0000*/ TextureProfile equipment;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
|
||||||
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
|
||||||
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
|
||||||
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
|
||||||
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
|
||||||
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
|
||||||
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
|
||||||
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
|
|
||||||
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
|
||||||
} equip;
|
|
||||||
/*0000*/ EquipStruct equipment[9];
|
|
||||||
};
|
|
||||||
|
|
||||||
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
||||||
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
|
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
|
||||||
@@ -479,7 +479,7 @@ struct MemorizeSpell_Struct {
|
|||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
//uint32 unknown12;
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -512,11 +512,12 @@ struct DeleteSpell_Struct
|
|||||||
|
|
||||||
struct ManaChange_Struct
|
struct ManaChange_Struct
|
||||||
{
|
{
|
||||||
uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
uint32 spell_id;
|
/*08*/ uint32 spell_id;
|
||||||
uint32 unknown12;
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
uint32 unknown16;
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SwapSpell_Struct
|
struct SwapSpell_Struct
|
||||||
@@ -566,55 +567,28 @@ struct SpawnAppearance_Struct
|
|||||||
// Size 76 (was 24)
|
// Size 76 (was 24)
|
||||||
struct SpellBuff_Struct
|
struct SpellBuff_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
|
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
|
||||||
/*001*/ uint8 level;
|
/*001*/ uint8 level; // Seen 1 for no buff
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 unknown002; //pretty sure padding now
|
||||||
/*003*/ uint8 effect; // not real
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ uint32 unknown004; // Seen 1 for no buff
|
/*004*/ float bard_modifier;
|
||||||
/*008*/ uint32 spellid;
|
/*008*/ uint32 spellid;
|
||||||
/*012*/ int32 duration;
|
/*012*/ uint32 duration;
|
||||||
/*016*/ uint32 unknown016;
|
/*016*/ uint32 num_hits;
|
||||||
/*020*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
|
/*020*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
/*024*/ uint32 counters;
|
/*024*/ uint32 unknown036;
|
||||||
/*028*/ uint8 unknown0028[48];
|
/*028*/ int32 slot_data[12]; // book keeping stuff per slot (counters, rune/vie)
|
||||||
/*076*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Not functional yet, but this is what the packet looks like on Underfoot
|
// Not functional yet, but this is what the packet looks like on Underfoot
|
||||||
struct SpellBuffFade_Struct_Underfoot {
|
struct SpellBuffPacket_Struct {
|
||||||
/*000*/ uint32 entityid; // Player id who cast the buff
|
/*000*/ uint32 entityid; // Player id who cast the buff
|
||||||
/*004*/ uint8 slot;
|
/*004*/ SpellBuff_Struct buff;
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown7;
|
|
||||||
/*008*/ float unknown008;
|
|
||||||
/*012*/ uint32 spellid;
|
|
||||||
/*016*/ int32 duration;
|
|
||||||
/*020*/ uint32 num_hits;
|
|
||||||
/*024*/ uint32 playerId; // Global player ID?
|
|
||||||
/*028*/ uint32 unknown020;
|
|
||||||
/*032*/ uint8 unknown0028[48];
|
|
||||||
/*080*/ uint32 slotid;
|
/*080*/ uint32 slotid;
|
||||||
/*084*/ uint32 bufffade;
|
/*084*/ uint32 bufffade;
|
||||||
/*088*/
|
/*088*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpellBuffFade_Struct {
|
|
||||||
/*000*/ uint32 entityid;
|
|
||||||
/*004*/ uint8 slot;
|
|
||||||
/*005*/ uint8 level;
|
|
||||||
/*006*/ uint8 effect;
|
|
||||||
/*007*/ uint8 unknown7;
|
|
||||||
/*008*/ uint32 spellid;
|
|
||||||
/*012*/ int32 duration;
|
|
||||||
/*016*/ uint32 unknown016;
|
|
||||||
/*020*/ uint32 unknown020; // Global player ID?
|
|
||||||
/*024*/ uint32 playerId; // Player id who cast the buff
|
|
||||||
/*028*/ uint32 slotid;
|
|
||||||
/*032*/ uint32 bufffade;
|
|
||||||
/*036*/
|
|
||||||
};
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
struct BuffIconEntry_Struct {
|
struct BuffIconEntry_Struct {
|
||||||
/*000*/ uint32 buff_slot;
|
/*000*/ uint32 buff_slot;
|
||||||
@@ -873,7 +847,7 @@ struct BindStruct {
|
|||||||
*/
|
*/
|
||||||
static const uint32 MAX_PP_LANGUAGE = 25; //
|
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_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_MEMSPELL = 12; //was 9 now 10 on Underfoot
|
||||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 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_PP_AA_ARRAY = 300; //was 299
|
||||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||||
@@ -943,7 +917,7 @@ struct PlayerProfile_Struct
|
|||||||
/*00160*/ uint32 deity; // deity
|
/*00160*/ uint32 deity; // deity
|
||||||
/*00164*/ uint32 intoxication; // Alcohol level (in ticks till sober?)
|
/*00164*/ uint32 intoxication; // Alcohol level (in ticks till sober?)
|
||||||
/*00168*/ uint32 spellSlotRefresh[MAX_PP_MEMSPELL]; // Refresh time (millis) - 4 Octets Each
|
/*00168*/ uint32 spellSlotRefresh[MAX_PP_MEMSPELL]; // Refresh time (millis) - 4 Octets Each
|
||||||
/*00208*/ uint8 unknown00208[14]; // Seen 00 00 00 00 00 00 00 00 00 00 00 00 02 01
|
/*00208*/ uint8 unknown00208[6]; // Seen 00 00 00 00 00 00 00 00 00 00 00 00 02 01
|
||||||
/*00222*/ uint32 abilitySlotRefresh;
|
/*00222*/ uint32 abilitySlotRefresh;
|
||||||
/*00226*/ uint8 haircolor; // Player hair color
|
/*00226*/ uint8 haircolor; // Player hair color
|
||||||
/*00227*/ uint8 beardcolor; // Player beard color
|
/*00227*/ uint8 beardcolor; // Player beard color
|
||||||
@@ -952,24 +926,9 @@ struct PlayerProfile_Struct
|
|||||||
/*00230*/ uint8 hairstyle; // Player hair style
|
/*00230*/ uint8 hairstyle; // Player hair style
|
||||||
/*00231*/ uint8 beard; // Player beard type
|
/*00231*/ uint8 beard; // Player beard type
|
||||||
/*00232*/ uint8 unknown00232[4]; // was 14
|
/*00232*/ uint8 unknown00232[4]; // was 14
|
||||||
/*00236*/ union
|
/*00236*/ TextureProfile equipment;
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/*00236*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
|
|
||||||
/*00248*/ EquipStruct equip_chest; // Equiptment: Chest visual
|
|
||||||
/*00260*/ EquipStruct equip_arms; // Equiptment: Arms visual
|
|
||||||
/*00272*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
|
|
||||||
/*00284*/ EquipStruct equip_hands; // Equiptment: Hands visual
|
|
||||||
/*00296*/ EquipStruct equip_legs; // Equiptment: Legs visual
|
|
||||||
/*00308*/ EquipStruct equip_feet; // Equiptment: Boots visual
|
|
||||||
/*00320*/ EquipStruct equip_primary; // Equiptment: Main visual
|
|
||||||
/*00332*/ EquipStruct equip_secondary; // Equiptment: Off visual
|
|
||||||
} equip;
|
|
||||||
/*00236*/ EquipStruct equipment[9]; //Underfoot Shows [108] for this part
|
|
||||||
};
|
|
||||||
/*00344*/ uint8 unknown00344[168]; // Underfoot Shows [160]
|
/*00344*/ uint8 unknown00344[168]; // Underfoot Shows [160]
|
||||||
/*00512*/ Color_Struct item_tint[9]; // RR GG BB 00
|
/*00512*/ TintProfile item_tint; // RR GG BB 00
|
||||||
/*00548*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each
|
/*00548*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each
|
||||||
/*04148*/ uint32 points; // Unspent Practice points - RELOCATED???
|
/*04148*/ uint32 points; // Unspent Practice points - RELOCATED???
|
||||||
/*04152*/ uint32 mana; // Current mana
|
/*04152*/ uint32 mana; // Current mana
|
||||||
@@ -986,7 +945,7 @@ struct PlayerProfile_Struct
|
|||||||
/*04217*/ uint8 unknown04217[147]; // was [175]
|
/*04217*/ uint8 unknown04217[147]; // was [175]
|
||||||
/*04364*/ uint32 spell_book[MAX_PP_SPELLBOOK]; // List of the Spells in spellbook 720 = 90 pages [2880] was [1920]
|
/*04364*/ uint32 spell_book[MAX_PP_SPELLBOOK]; // List of the Spells in spellbook 720 = 90 pages [2880] was [1920]
|
||||||
/*07244*/ uint32 mem_spells[MAX_PP_MEMSPELL]; // List of spells memorized
|
/*07244*/ uint32 mem_spells[MAX_PP_MEMSPELL]; // List of spells memorized
|
||||||
/*07284*/ uint8 unknown07284[28]; //#### uint8 unknown04396[32]; in Titanium ####[28]
|
/*07284*/ uint8 unknown07284[20]; //#### uint8 unknown04396[32]; in Titanium ####[28]
|
||||||
/*07312*/ uint32 platinum; // Platinum Pieces on player
|
/*07312*/ uint32 platinum; // Platinum Pieces on player
|
||||||
/*07316*/ uint32 gold; // Gold Pieces on player
|
/*07316*/ uint32 gold; // Gold Pieces on player
|
||||||
/*07320*/ uint32 silver; // Silver Pieces on player
|
/*07320*/ uint32 silver; // Silver Pieces on player
|
||||||
@@ -1000,8 +959,7 @@ struct PlayerProfile_Struct
|
|||||||
/*07880*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
/*07880*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
||||||
/*07884*/ uint32 thirst_level; // Drink (ticks till next drink)
|
/*07884*/ uint32 thirst_level; // Drink (ticks till next drink)
|
||||||
/*07888*/ uint32 hunger_level; // Food (ticks till next eat)
|
/*07888*/ uint32 hunger_level; // Food (ticks till next eat)
|
||||||
/*07892*/ SpellBuff_Struct buffs[BUFF_COUNT]; // [1900] Buffs currently on the player (30 Max) - (Each Size 76)
|
/*07892*/ SpellBuff_Struct buffs[BUFF_COUNT]; // [2280] Buffs currently on the player (30 Max) - (Each Size 76)
|
||||||
/*09792*/ uint8 unknown09792[380]; // BUFF_COUNT has been left at 25. These are the extra 5 buffs in Underfoot
|
|
||||||
/*10172*/ Disciplines_Struct disciplines; // [400] Known disciplines
|
/*10172*/ Disciplines_Struct disciplines; // [400] Known disciplines
|
||||||
/*10972*/ uint32 recastTimers[MAX_RECAST_TYPES]; // Timers (UNIX Time of last use)
|
/*10972*/ uint32 recastTimers[MAX_RECAST_TYPES]; // Timers (UNIX Time of last use)
|
||||||
/*11052*/ uint8 unknown11052[160]; // Some type of Timers
|
/*11052*/ uint8 unknown11052[160]; // Some type of Timers
|
||||||
@@ -1232,7 +1190,7 @@ struct WearChange_Struct{
|
|||||||
/*002*/ uint32 material;
|
/*002*/ uint32 material;
|
||||||
/*006*/ uint32 unknown06;
|
/*006*/ uint32 unknown06;
|
||||||
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
/*010*/ uint32 elite_material; // 1 for Drakkin Elite Material
|
||||||
/*014*/ Color_Struct color;
|
/*014*/ Tint_Struct color;
|
||||||
/*018*/ uint8 wear_slot_id;
|
/*018*/ uint8 wear_slot_id;
|
||||||
/*019*/
|
/*019*/
|
||||||
};
|
};
|
||||||
@@ -1963,8 +1921,7 @@ struct Merchant_Sell_Struct {
|
|||||||
/*004*/ uint32 playerid; // Player's entity id
|
/*004*/ uint32 playerid; // Player's entity id
|
||||||
/*008*/ uint32 itemslot;
|
/*008*/ uint32 itemslot;
|
||||||
/*012*/ uint32 unknown12;
|
/*012*/ uint32 unknown12;
|
||||||
/*016*/ uint8 quantity; // Already sold
|
/*016*/ uint32 quantity;
|
||||||
/*017*/ uint8 Unknown017[3];
|
|
||||||
/*020*/ uint32 Unknown020;
|
/*020*/ uint32 Unknown020;
|
||||||
/*024*/ uint32 price;
|
/*024*/ uint32 price;
|
||||||
/*028*/ uint32 pricehighorderbits; // It appears the price is 64 bits in Underfoot+
|
/*028*/ uint32 pricehighorderbits; // It appears the price is 64 bits in Underfoot+
|
||||||
@@ -2054,7 +2011,7 @@ struct AdventureLeaderboard_Struct
|
|||||||
/*struct Item_Shop_Struct {
|
/*struct Item_Shop_Struct {
|
||||||
uint16 merchantid;
|
uint16 merchantid;
|
||||||
uint8 itemtype;
|
uint8 itemtype;
|
||||||
Item_Struct item;
|
ItemBase item;
|
||||||
uint8 iss_unknown001[6];
|
uint8 iss_unknown001[6];
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
@@ -2209,9 +2166,7 @@ struct GroupFollow_Struct { // Underfoot Follow Struct
|
|||||||
|
|
||||||
struct InspectBuffs_Struct {
|
struct InspectBuffs_Struct {
|
||||||
/*000*/ uint32 spell_id[BUFF_COUNT];
|
/*000*/ uint32 spell_id[BUFF_COUNT];
|
||||||
/*100*/ uint32 filler100[5]; // BUFF_COUNT is really 30...
|
|
||||||
/*120*/ int32 tics_remaining[BUFF_COUNT];
|
/*120*/ int32 tics_remaining[BUFF_COUNT];
|
||||||
/*220*/ uint32 filler220[5]; // BUFF_COUNT is really 30...
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -3162,27 +3117,6 @@ struct PetitionBug_Struct{
|
|||||||
char text[1028];
|
char text[1028];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DyeStruct
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct Color_Struct head;
|
|
||||||
struct Color_Struct chest;
|
|
||||||
struct Color_Struct arms;
|
|
||||||
struct Color_Struct wrists;
|
|
||||||
struct Color_Struct hands;
|
|
||||||
struct Color_Struct legs;
|
|
||||||
struct Color_Struct feet;
|
|
||||||
struct Color_Struct primary; // you can't actually dye this
|
|
||||||
struct Color_Struct secondary; // or this
|
|
||||||
}
|
|
||||||
dyes;
|
|
||||||
struct Color_Struct dye[9];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
uint32 zoneid;
|
uint32 zoneid;
|
||||||
@@ -3994,7 +3928,6 @@ struct AnnoyingZoneUnknown_Struct {
|
|||||||
|
|
||||||
struct LoadSpellSet_Struct {
|
struct LoadSpellSet_Struct {
|
||||||
uint8 spell[MAX_PP_MEMSPELL]; // 0 if no action
|
uint8 spell[MAX_PP_MEMSPELL]; // 0 if no action
|
||||||
uint16 unknown2; // is this two more spell gems?
|
|
||||||
uint32 unknown; // there seems to be an extra field in this packet...
|
uint32 unknown; // there seems to be an extra field in this packet...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -37,10 +37,12 @@ enum { //values for pTimerType
|
|||||||
pTimerSenseTraps = 12,
|
pTimerSenseTraps = 12,
|
||||||
pTimerDisarmTraps = 13,
|
pTimerDisarmTraps = 13,
|
||||||
pTimerDisciplineReuseStart = 14,
|
pTimerDisciplineReuseStart = 14,
|
||||||
pTimerDisciplineReuseEnd = 24,
|
pTimerDisciplineReuseEnd = 24, // client actually has 20 ids, but still no disc go that high even on live
|
||||||
pTimerCombatAbility = 25,
|
pTimerCombatAbility = 25,
|
||||||
pTimerCombatAbility2 = 26, // RoF2+ Tiger Claw is unlinked from other monk skills, generic in case other classes ever need it
|
pTimerCombatAbility2 = 26, // RoF2+ Tiger Claw is unlinked from other monk skills, generic in case other classes ever need it
|
||||||
pTimerBeggingPickPocket = 27,
|
pTimerBeggingPickPocket = 27,
|
||||||
|
pTimerLinkedSpellReuseStart = 28,
|
||||||
|
pTimerLinkedSpellReuseEnd = 48,
|
||||||
|
|
||||||
pTimerLayHands = 87, //these IDs are used by client too
|
pTimerLayHands = 87, //these IDs are used by client too
|
||||||
pTimerHarmTouch = 89, //so dont change them
|
pTimerHarmTouch = 89, //so dont change them
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
#define TIGER 63
|
#define TIGER 63
|
||||||
#define ELEMENTAL 75
|
#define ELEMENTAL 75
|
||||||
#define ALLIGATOR 91
|
#define ALLIGATOR 91
|
||||||
|
#define OGGOK_CITIZEN 93
|
||||||
#define EYE_OF_ZOMM 108
|
#define EYE_OF_ZOMM 108
|
||||||
#define WOLF_ELEMENTAL 120
|
#define WOLF_ELEMENTAL 120
|
||||||
#define INVISIBLE_MAN 127
|
#define INVISIBLE_MAN 127
|
||||||
|
|||||||
+15
-1
@@ -142,6 +142,11 @@ RULE_INT(Character, InvSnapshotMinRetryM, 30) // Time (in minutes) to re-attempt
|
|||||||
RULE_INT(Character, InvSnapshotHistoryD, 30) // Time (in days) to keep snapshot entries
|
RULE_INT(Character, InvSnapshotHistoryD, 30) // Time (in days) to keep snapshot entries
|
||||||
RULE_BOOL(Character, RestrictSpellScribing, false) // Restricts spell scribing to allowable races/classes of spell scroll, if true
|
RULE_BOOL(Character, RestrictSpellScribing, false) // Restricts spell scribing to allowable races/classes of spell scroll, if true
|
||||||
RULE_BOOL(Character, UseStackablePickPocketing, true) // Allows stackable pickpocketed items to stack instead of only being allowed in empty inventory slots
|
RULE_BOOL(Character, UseStackablePickPocketing, true) // Allows stackable pickpocketed items to stack instead of only being allowed in empty inventory slots
|
||||||
|
RULE_BOOL(Character, EnableAvoidanceCap, false)
|
||||||
|
RULE_INT(Character, AvoidanceCap, 750) // 750 Is a pretty good value, seen people dodge all attacks beyond 1,000 Avoidance
|
||||||
|
RULE_BOOL(Character, AllowMQTarget, false) // Disables putting players in the 'hackers' list for targeting beyond the clip plane or attempting to target something untargetable
|
||||||
|
RULE_BOOL(Character, UseOldBindWound, false) // Uses the original bind wound behavior
|
||||||
|
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Mercs)
|
RULE_CATEGORY(Mercs)
|
||||||
@@ -203,6 +208,7 @@ RULE_INT(World, ExemptMaxClientsStatus, -1) // Exempt accounts from the MaxClien
|
|||||||
RULE_INT(World, AddMaxClientsPerIP, -1) // Maximum number of clients allowed to connect per IP address if account status is < ExemptMaxClientsStatus. Default value: -1 (feature disabled)
|
RULE_INT(World, AddMaxClientsPerIP, -1) // Maximum number of clients allowed to connect per IP address if account status is < ExemptMaxClientsStatus. Default value: -1 (feature disabled)
|
||||||
RULE_INT(World, AddMaxClientsStatus, -1) // Accounts with status >= this rule will be allowed to use the amount of accounts defined in the AddMaxClientsPerIP. Default value: -1 (feature disabled)
|
RULE_INT(World, AddMaxClientsStatus, -1) // Accounts with status >= this rule will be allowed to use the amount of accounts defined in the AddMaxClientsPerIP. Default value: -1 (feature disabled)
|
||||||
RULE_BOOL(World, MaxClientsSetByStatus, false) // If True, IP Limiting will be set to the status on the account as long as the status is > MaxClientsPerIP
|
RULE_BOOL(World, MaxClientsSetByStatus, false) // If True, IP Limiting will be set to the status on the account as long as the status is > MaxClientsPerIP
|
||||||
|
RULE_BOOL(World, EnableIPExemptions, false) // If True, ip_exemptions table is used, if there is no entry for the IP it will default to RuleI(World, MaxClientsPerIP)
|
||||||
RULE_BOOL(World, ClearTempMerchantlist, true) // Clears temp merchant items when world boots.
|
RULE_BOOL(World, ClearTempMerchantlist, true) // Clears temp merchant items when world boots.
|
||||||
RULE_BOOL(World, DeleteStaleCorpeBackups, true) // Deletes stale corpse backups older than 2 weeks.
|
RULE_BOOL(World, DeleteStaleCorpeBackups, true) // Deletes stale corpse backups older than 2 weeks.
|
||||||
RULE_INT(World, AccountSessionLimit, -1) //Max number of characters allowed on at once from a single account (-1 is disabled)
|
RULE_INT(World, AccountSessionLimit, -1) //Max number of characters allowed on at once from a single account (-1 is disabled)
|
||||||
@@ -250,6 +256,7 @@ RULE_INT(Zone, WeatherTimer, 600) // Weather timer when no duration is available
|
|||||||
RULE_BOOL(Zone, EnableLoggedOffReplenishments, true)
|
RULE_BOOL(Zone, EnableLoggedOffReplenishments, true)
|
||||||
RULE_INT(Zone, MinOfflineTimeToReplenishments, 21600) // 21600 seconds is 6 Hours
|
RULE_INT(Zone, MinOfflineTimeToReplenishments, 21600) // 21600 seconds is 6 Hours
|
||||||
RULE_BOOL(Zone, UseZoneController, true) // Enables the ability to use persistent quest based zone controllers (zone_controller.pl/lua)
|
RULE_BOOL(Zone, UseZoneController, true) // Enables the ability to use persistent quest based zone controllers (zone_controller.pl/lua)
|
||||||
|
RULE_BOOL(Zone, EnableZoneControllerGlobals, false) // Enables the ability to use quest globals with the zone controller NPC
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Map)
|
RULE_CATEGORY(Map)
|
||||||
@@ -329,7 +336,7 @@ RULE_INT(Spells, MaxBuffSlotsNPC, 25)
|
|||||||
RULE_INT(Spells, MaxSongSlotsNPC, 10)
|
RULE_INT(Spells, MaxSongSlotsNPC, 10)
|
||||||
RULE_INT(Spells, MaxDiscSlotsNPC, 1)
|
RULE_INT(Spells, MaxDiscSlotsNPC, 1)
|
||||||
RULE_INT(Spells, MaxTotalSlotsNPC, 36)
|
RULE_INT(Spells, MaxTotalSlotsNPC, 36)
|
||||||
RULE_INT(Spells, MaxTotalSlotsPET, 25) // do not set this higher than 25 until the player profile is removed from the blob
|
RULE_INT(Spells, MaxTotalSlotsPET, 30) // do not set this higher than 25 until the player profile is removed from the blob
|
||||||
RULE_BOOL (Spells, EnableBlockedBuffs, true)
|
RULE_BOOL (Spells, EnableBlockedBuffs, true)
|
||||||
RULE_INT(Spells, ReflectType, 1) //0 = disabled, 1 = single target player spells only, 2 = all player spells, 3 = all single target spells, 4 = all spells
|
RULE_INT(Spells, ReflectType, 1) //0 = disabled, 1 = single target player spells only, 2 = all player spells, 3 = all single target spells, 4 = all spells
|
||||||
RULE_INT(Spells, VirusSpreadDistance, 30) // The distance a viral spell will jump to its next victim
|
RULE_INT(Spells, VirusSpreadDistance, 30) // The distance a viral spell will jump to its next victim
|
||||||
@@ -379,6 +386,8 @@ RULE_BOOL(Spells, UseAdditiveFocusFromWornSlot, false) // Allows an additive foc
|
|||||||
RULE_BOOL(Spells, AlwaysSendTargetsBuffs, false) // ignore LAA level if true
|
RULE_BOOL(Spells, AlwaysSendTargetsBuffs, false) // ignore LAA level if true
|
||||||
RULE_BOOL(Spells, FlatItemExtraSpellAmt, false) // allow SpellDmg stat to affect all spells, regardless of cast time/cooldown/etc
|
RULE_BOOL(Spells, FlatItemExtraSpellAmt, false) // allow SpellDmg stat to affect all spells, regardless of cast time/cooldown/etc
|
||||||
RULE_BOOL(Spells, IgnoreSpellDmgLvlRestriction, false) // ignore the 5 level spread on applying SpellDmg
|
RULE_BOOL(Spells, IgnoreSpellDmgLvlRestriction, false) // ignore the 5 level spread on applying SpellDmg
|
||||||
|
RULE_BOOL(Spells, AllowItemTGB, false) // TGB doesn't work with items on live, custom servers want it though
|
||||||
|
RULE_BOOL(Spells, NPCInnateProcOverride, true) // NPC innate procs override the target type to single target.
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Combat)
|
RULE_CATEGORY(Combat)
|
||||||
@@ -502,6 +511,8 @@ RULE_BOOL(NPC, LiveLikeEnrage, false) // If set to true then only player control
|
|||||||
RULE_BOOL(NPC, EnableMeritBasedFaction, false) // If set to true, faction will given in the same way as experience (solo/group/raid)
|
RULE_BOOL(NPC, EnableMeritBasedFaction, false) // If set to true, faction will given in the same way as experience (solo/group/raid)
|
||||||
RULE_INT(NPC, NPCToNPCAggroTimerMin, 500)
|
RULE_INT(NPC, NPCToNPCAggroTimerMin, 500)
|
||||||
RULE_INT(NPC, NPCToNPCAggroTimerMax, 6000)
|
RULE_INT(NPC, NPCToNPCAggroTimerMax, 6000)
|
||||||
|
RULE_BOOL(NPC, UseClassAsLastName, true) // Uses class archetype as LastName for npcs with none
|
||||||
|
RULE_BOOL(NPC, NewLevelScaling, true) // Better level scaling, use old if new formulas would break your server
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Aggro)
|
RULE_CATEGORY(Aggro)
|
||||||
@@ -517,6 +528,7 @@ RULE_REAL(Aggro, TunnelVisionAggroMod, 0.75) //people not currently the top hate
|
|||||||
RULE_INT(Aggro, MaxScalingProcAggro, 400) // Set to -1 for no limit. Maxmimum amount of aggro that HP scaling SPA effect in a proc will add.
|
RULE_INT(Aggro, MaxScalingProcAggro, 400) // Set to -1 for no limit. Maxmimum amount of aggro that HP scaling SPA effect in a proc will add.
|
||||||
RULE_INT(Aggro, IntAggroThreshold, 75) // Int <= this will aggro regardless of level difference.
|
RULE_INT(Aggro, IntAggroThreshold, 75) // Int <= this will aggro regardless of level difference.
|
||||||
RULE_BOOL(Aggro, AllowTickPulling, false) // tick pulling is an exploit in an NPC's call for help fixed sometime in 2006 on live
|
RULE_BOOL(Aggro, AllowTickPulling, false) // tick pulling is an exploit in an NPC's call for help fixed sometime in 2006 on live
|
||||||
|
RULE_BOOL(Aggro, UseLevelAggro, true) // Level 18+ and Undead will aggro regardless of level difference. (this will disabled Rule:IntAggroThreshold if set to true)
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(TaskSystem)
|
RULE_CATEGORY(TaskSystem)
|
||||||
@@ -531,6 +543,7 @@ RULE_CATEGORY_END()
|
|||||||
#ifdef BOTS
|
#ifdef BOTS
|
||||||
RULE_CATEGORY(Bots)
|
RULE_CATEGORY(Bots)
|
||||||
RULE_INT(Bots, AAExpansion, 8) // Bots get AAs through this expansion
|
RULE_INT(Bots, AAExpansion, 8) // Bots get AAs through this expansion
|
||||||
|
RULE_BOOL(Bots, AllowCamelCaseNames, false) // Allows the use of 'MyBot' type names
|
||||||
RULE_INT(Bots, CommandSpellRank, 1) // Filters bot command spells by rank (1, 2 and 3 are valid filters - any other number allows all ranks)
|
RULE_INT(Bots, CommandSpellRank, 1) // Filters bot command spells by rank (1, 2 and 3 are valid filters - any other number allows all ranks)
|
||||||
RULE_INT(Bots, CreationLimit, 150) // Number of bots that each account can create
|
RULE_INT(Bots, CreationLimit, 150) // Number of bots that each account can create
|
||||||
RULE_BOOL(Bots, FinishBuffing, false) // Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.
|
RULE_BOOL(Bots, FinishBuffing, false) // Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.
|
||||||
@@ -664,6 +677,7 @@ RULE_CATEGORY_END()
|
|||||||
|
|
||||||
RULE_CATEGORY(Client)
|
RULE_CATEGORY(Client)
|
||||||
RULE_BOOL(Client, UseLiveFactionMessage, false) // Allows players to see faction adjustments like Live
|
RULE_BOOL(Client, UseLiveFactionMessage, false) // Allows players to see faction adjustments like Live
|
||||||
|
RULE_BOOL(Client, UseLiveBlockedMessage, false) // Allows players to see faction adjustments like Live
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
#undef RULE_CATEGORY
|
#undef RULE_CATEGORY
|
||||||
|
|||||||
+78
-78
@@ -22,16 +22,64 @@
|
|||||||
|
|
||||||
#include "string_util.h"
|
#include "string_util.h"
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "item_struct.h"
|
#include "item_base.h"
|
||||||
#include "../zone/zonedb.h"
|
#include "../zone/zonedb.h"
|
||||||
|
|
||||||
|
|
||||||
EQEmu::saylink::SayLinkEngine::SayLinkEngine()
|
bool EQEmu::saylink::DegenerateLinkBody(SayLinkBody_Struct& say_link_body_struct, const std::string& say_link_body)
|
||||||
|
{
|
||||||
|
memset(&say_link_body_struct, 0, sizeof(say_link_body_struct));
|
||||||
|
if (say_link_body.length() != EQEmu::legacy::TEXT_LINK_BODY_LENGTH)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
say_link_body_struct.unknown_1 = (uint8)strtol(say_link_body.substr(0, 1).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.item_id = (uint32)strtol(say_link_body.substr(1, 5).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.augment_1 = (uint32)strtol(say_link_body.substr(6, 5).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.augment_2 = (uint32)strtol(say_link_body.substr(11, 5).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.augment_3 = (uint32)strtol(say_link_body.substr(16, 5).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.augment_4 = (uint32)strtol(say_link_body.substr(21, 5).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.augment_5 = (uint32)strtol(say_link_body.substr(26, 5).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.augment_6 = (uint32)strtol(say_link_body.substr(31, 5).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.is_evolving = (uint8)strtol(say_link_body.substr(36, 1).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.evolve_group = (uint32)strtol(say_link_body.substr(37, 4).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.evolve_level = (uint8)strtol(say_link_body.substr(41, 2).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.ornament_icon = (uint32)strtol(say_link_body.substr(43, 5).c_str(), nullptr, 16);
|
||||||
|
say_link_body_struct.hash = (int)strtol(say_link_body.substr(48, 8).c_str(), nullptr, 16);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQEmu::saylink::GenerateLinkBody(std::string& say_link_body, const SayLinkBody_Struct& say_link_body_struct)
|
||||||
|
{
|
||||||
|
say_link_body = StringFormat(
|
||||||
|
"%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%02X" "%05X" "%08X",
|
||||||
|
(0x0F & say_link_body_struct.unknown_1),
|
||||||
|
(0x000FFFFF & say_link_body_struct.item_id),
|
||||||
|
(0x000FFFFF & say_link_body_struct.augment_1),
|
||||||
|
(0x000FFFFF & say_link_body_struct.augment_2),
|
||||||
|
(0x000FFFFF & say_link_body_struct.augment_3),
|
||||||
|
(0x000FFFFF & say_link_body_struct.augment_4),
|
||||||
|
(0x000FFFFF & say_link_body_struct.augment_5),
|
||||||
|
(0x000FFFFF & say_link_body_struct.augment_6),
|
||||||
|
(0x0F & say_link_body_struct.is_evolving),
|
||||||
|
(0x0000FFFF & say_link_body_struct.evolve_group),
|
||||||
|
(0xFF & say_link_body_struct.evolve_level),
|
||||||
|
(0x000FFFFF & say_link_body_struct.ornament_icon),
|
||||||
|
(0xFFFFFFFF & say_link_body_struct.hash)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (say_link_body.length() != EQEmu::legacy::TEXT_LINK_BODY_LENGTH)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::SayLinkEngine::SayLinkEngine()
|
||||||
{
|
{
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string EQEmu::saylink::SayLinkEngine::GenerateLink()
|
std::string EQEmu::SayLinkEngine::GenerateLink()
|
||||||
{
|
{
|
||||||
m_Link.clear();
|
m_Link.clear();
|
||||||
m_LinkBody.clear();
|
m_LinkBody.clear();
|
||||||
@@ -59,25 +107,25 @@ std::string EQEmu::saylink::SayLinkEngine::GenerateLink()
|
|||||||
return m_Link;
|
return m_Link;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQEmu::saylink::SayLinkEngine::Reset()
|
void EQEmu::SayLinkEngine::Reset()
|
||||||
{
|
{
|
||||||
m_LinkType = SayLinkBlank;
|
m_LinkType = saylink::SayLinkBlank;
|
||||||
m_ItemData = nullptr;
|
m_ItemData = nullptr;
|
||||||
m_LootData = nullptr;
|
m_LootData = nullptr;
|
||||||
m_ItemInst = nullptr;
|
m_ItemInst = nullptr;
|
||||||
m_Proxy_unknown_1 = NOT_USED;
|
m_Proxy_unknown_1 = 0;
|
||||||
m_ProxyItemID = NOT_USED;
|
m_ProxyItemID = 0;
|
||||||
m_ProxyAugment1ID = NOT_USED;
|
m_ProxyAugment1ID = 0;
|
||||||
m_ProxyAugment2ID = NOT_USED;
|
m_ProxyAugment2ID = 0;
|
||||||
m_ProxyAugment3ID = NOT_USED;
|
m_ProxyAugment3ID = 0;
|
||||||
m_ProxyAugment4ID = NOT_USED;
|
m_ProxyAugment4ID = 0;
|
||||||
m_ProxyAugment5ID = NOT_USED;
|
m_ProxyAugment5ID = 0;
|
||||||
m_ProxyAugment6ID = NOT_USED;
|
m_ProxyAugment6ID = 0;
|
||||||
m_ProxyIsEvolving = NOT_USED;
|
m_ProxyIsEvolving = 0;
|
||||||
m_ProxyEvolveGroup = NOT_USED;
|
m_ProxyEvolveGroup = 0;
|
||||||
m_ProxyEvolveLevel = NOT_USED;
|
m_ProxyEvolveLevel = 0;
|
||||||
m_ProxyOrnamentIcon = NOT_USED;
|
m_ProxyOrnamentIcon = 0;
|
||||||
m_ProxyHash = NOT_USED;
|
m_ProxyHash = 0;
|
||||||
m_ProxyText = nullptr;
|
m_ProxyText = nullptr;
|
||||||
m_TaskUse = false;
|
m_TaskUse = false;
|
||||||
m_Link.clear();
|
m_Link.clear();
|
||||||
@@ -86,7 +134,7 @@ void EQEmu::saylink::SayLinkEngine::Reset()
|
|||||||
m_Error = false;
|
m_Error = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQEmu::saylink::SayLinkEngine::generate_body()
|
void EQEmu::SayLinkEngine::generate_body()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Current server mask: EQClientRoF2
|
Current server mask: EQClientRoF2
|
||||||
@@ -99,19 +147,19 @@ void EQEmu::saylink::SayLinkEngine::generate_body()
|
|||||||
|
|
||||||
memset(&m_LinkBodyStruct, 0, sizeof(SayLinkBody_Struct));
|
memset(&m_LinkBodyStruct, 0, sizeof(SayLinkBody_Struct));
|
||||||
|
|
||||||
const EQEmu::Item_Struct* item_data = nullptr;
|
const EQEmu::ItemBase* item_data = nullptr;
|
||||||
|
|
||||||
switch (m_LinkType) {
|
switch (m_LinkType) {
|
||||||
case SayLinkBlank:
|
case saylink::SayLinkBlank:
|
||||||
break;
|
break;
|
||||||
case SayLinkItemData:
|
case saylink::SayLinkItemData:
|
||||||
if (m_ItemData == nullptr) { break; }
|
if (m_ItemData == nullptr) { break; }
|
||||||
m_LinkBodyStruct.item_id = m_ItemData->ID;
|
m_LinkBodyStruct.item_id = m_ItemData->ID;
|
||||||
m_LinkBodyStruct.evolve_group = m_ItemData->LoreGroup; // this probably won't work for all items
|
m_LinkBodyStruct.evolve_group = m_ItemData->LoreGroup; // this probably won't work for all items
|
||||||
//m_LinkBodyStruct.evolve_level = m_ItemData->EvolvingLevel;
|
//m_LinkBodyStruct.evolve_level = m_ItemData->EvolvingLevel;
|
||||||
// TODO: add hash call
|
// TODO: add hash call
|
||||||
break;
|
break;
|
||||||
case SayLinkLootItem:
|
case saylink::SayLinkLootItem:
|
||||||
if (m_LootData == nullptr) { break; }
|
if (m_LootData == nullptr) { break; }
|
||||||
item_data = database.GetItem(m_LootData->item_id);
|
item_data = database.GetItem(m_LootData->item_id);
|
||||||
if (item_data == nullptr) { break; }
|
if (item_data == nullptr) { break; }
|
||||||
@@ -126,7 +174,7 @@ void EQEmu::saylink::SayLinkEngine::generate_body()
|
|||||||
//m_LinkBodyStruct.evolve_level = item_data->EvolvingLevel;
|
//m_LinkBodyStruct.evolve_level = item_data->EvolvingLevel;
|
||||||
// TODO: add hash call
|
// TODO: add hash call
|
||||||
break;
|
break;
|
||||||
case SayLinkItemInst:
|
case saylink::SayLinkItemInst:
|
||||||
if (m_ItemInst == nullptr) { break; }
|
if (m_ItemInst == nullptr) { break; }
|
||||||
if (m_ItemInst->GetItem() == nullptr) { break; }
|
if (m_ItemInst->GetItem() == nullptr) { break; }
|
||||||
m_LinkBodyStruct.item_id = m_ItemInst->GetItem()->ID;
|
m_LinkBodyStruct.item_id = m_ItemInst->GetItem()->ID;
|
||||||
@@ -195,29 +243,29 @@ void EQEmu::saylink::SayLinkEngine::generate_body()
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQEmu::saylink::SayLinkEngine::generate_text()
|
void EQEmu::SayLinkEngine::generate_text()
|
||||||
{
|
{
|
||||||
if (m_ProxyText != nullptr) {
|
if (m_ProxyText != nullptr) {
|
||||||
m_LinkText = m_ProxyText;
|
m_LinkText = m_ProxyText;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const EQEmu::Item_Struct* item_data = nullptr;
|
const EQEmu::ItemBase* item_data = nullptr;
|
||||||
|
|
||||||
switch (m_LinkType) {
|
switch (m_LinkType) {
|
||||||
case SayLinkBlank:
|
case saylink::SayLinkBlank:
|
||||||
break;
|
break;
|
||||||
case SayLinkItemData:
|
case saylink::SayLinkItemData:
|
||||||
if (m_ItemData == nullptr) { break; }
|
if (m_ItemData == nullptr) { break; }
|
||||||
m_LinkText = m_ItemData->Name;
|
m_LinkText = m_ItemData->Name;
|
||||||
return;
|
return;
|
||||||
case SayLinkLootItem:
|
case saylink::SayLinkLootItem:
|
||||||
if (m_LootData == nullptr) { break; }
|
if (m_LootData == nullptr) { break; }
|
||||||
item_data = database.GetItem(m_LootData->item_id);
|
item_data = database.GetItem(m_LootData->item_id);
|
||||||
if (item_data == nullptr) { break; }
|
if (item_data == nullptr) { break; }
|
||||||
m_LinkText = item_data->Name;
|
m_LinkText = item_data->Name;
|
||||||
return;
|
return;
|
||||||
case SayLinkItemInst:
|
case saylink::SayLinkItemInst:
|
||||||
if (m_ItemInst == nullptr) { break; }
|
if (m_ItemInst == nullptr) { break; }
|
||||||
if (m_ItemInst->GetItem() == nullptr) { break; }
|
if (m_ItemInst->GetItem() == nullptr) { break; }
|
||||||
m_LinkText = m_ItemInst->GetItem()->Name;
|
m_LinkText = m_ItemInst->GetItem()->Name;
|
||||||
@@ -228,51 +276,3 @@ void EQEmu::saylink::SayLinkEngine::generate_text()
|
|||||||
|
|
||||||
m_LinkText = "null";
|
m_LinkText = "null";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQEmu::saylink::DegenerateLinkBody(SayLinkBody_Struct& say_link_body_struct, const std::string& say_link_body)
|
|
||||||
{
|
|
||||||
memset(&say_link_body_struct, 0, sizeof(say_link_body_struct));
|
|
||||||
if (say_link_body.length() != EQEmu::legacy::TEXT_LINK_BODY_LENGTH)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
say_link_body_struct.unknown_1 = (uint8)strtol(say_link_body.substr(0, 1).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.item_id = (uint32)strtol(say_link_body.substr(1, 5).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.augment_1 = (uint32)strtol(say_link_body.substr(6, 5).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.augment_2 = (uint32)strtol(say_link_body.substr(11, 5).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.augment_3 = (uint32)strtol(say_link_body.substr(16, 5).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.augment_4 = (uint32)strtol(say_link_body.substr(21, 5).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.augment_5 = (uint32)strtol(say_link_body.substr(26, 5).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.augment_6 = (uint32)strtol(say_link_body.substr(31, 5).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.is_evolving = (uint8)strtol(say_link_body.substr(36, 1).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.evolve_group = (uint32)strtol(say_link_body.substr(37, 4).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.evolve_level = (uint8)strtol(say_link_body.substr(41, 2).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.ornament_icon = (uint32)strtol(say_link_body.substr(43, 5).c_str(), nullptr, 16);
|
|
||||||
say_link_body_struct.hash = (int)strtol(say_link_body.substr(48, 8).c_str(), nullptr, 16);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EQEmu::saylink::GenerateLinkBody(std::string& say_link_body, const SayLinkBody_Struct& say_link_body_struct)
|
|
||||||
{
|
|
||||||
say_link_body = StringFormat(
|
|
||||||
"%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%02X" "%05X" "%08X",
|
|
||||||
(0x0F & say_link_body_struct.unknown_1),
|
|
||||||
(0x000FFFFF & say_link_body_struct.item_id),
|
|
||||||
(0x000FFFFF & say_link_body_struct.augment_1),
|
|
||||||
(0x000FFFFF & say_link_body_struct.augment_2),
|
|
||||||
(0x000FFFFF & say_link_body_struct.augment_3),
|
|
||||||
(0x000FFFFF & say_link_body_struct.augment_4),
|
|
||||||
(0x000FFFFF & say_link_body_struct.augment_5),
|
|
||||||
(0x000FFFFF & say_link_body_struct.augment_6),
|
|
||||||
(0x0F & say_link_body_struct.is_evolving),
|
|
||||||
(0x0000FFFF & say_link_body_struct.evolve_group),
|
|
||||||
(0xFF & say_link_body_struct.evolve_level),
|
|
||||||
(0x000FFFFF & say_link_body_struct.ornament_icon),
|
|
||||||
(0xFFFFFFFF & say_link_body_struct.hash)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (say_link_body.length() != EQEmu::legacy::TEXT_LINK_BODY_LENGTH)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
+19
-24
@@ -28,24 +28,25 @@
|
|||||||
struct ServerLootItem_Struct;
|
struct ServerLootItem_Struct;
|
||||||
class ItemInst;
|
class ItemInst;
|
||||||
|
|
||||||
|
|
||||||
namespace EQEmu
|
namespace EQEmu
|
||||||
{
|
{
|
||||||
struct Item_Struct;
|
struct ItemBase;
|
||||||
|
struct SayLinkBody_Struct;
|
||||||
|
|
||||||
namespace saylink {
|
namespace saylink {
|
||||||
struct SayLinkBody_Struct; // Current server mask: EQClientRoF2
|
enum SayLinkType {
|
||||||
|
SayLinkBlank = 0,
|
||||||
class SayLinkEngine;
|
SayLinkItemData,
|
||||||
|
SayLinkLootItem,
|
||||||
|
SayLinkItemInst
|
||||||
|
};
|
||||||
|
|
||||||
extern bool DegenerateLinkBody(SayLinkBody_Struct& say_Link_body_struct, const std::string& say_link_body);
|
extern bool DegenerateLinkBody(SayLinkBody_Struct& say_Link_body_struct, const std::string& say_link_body);
|
||||||
extern bool GenerateLinkBody(std::string& say_link_body, const SayLinkBody_Struct& say_link_body_struct);
|
extern bool GenerateLinkBody(std::string& say_link_body, const SayLinkBody_Struct& say_link_body_struct);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
} /*saylink*/
|
||||||
|
|
||||||
struct EQEmu::saylink::SayLinkBody_Struct
|
struct SayLinkBody_Struct {
|
||||||
{
|
|
||||||
uint8 unknown_1; /* %1X */
|
uint8 unknown_1; /* %1X */
|
||||||
uint32 item_id; /* %05X */
|
uint32 item_id; /* %05X */
|
||||||
uint32 augment_1; /* %05X */
|
uint32 augment_1; /* %05X */
|
||||||
@@ -59,22 +60,14 @@ struct EQEmu::saylink::SayLinkBody_Struct
|
|||||||
uint8 evolve_level; /* %02X */
|
uint8 evolve_level; /* %02X */
|
||||||
uint32 ornament_icon; /* %05X */
|
uint32 ornament_icon; /* %05X */
|
||||||
int hash; /* %08X */
|
int hash; /* %08X */
|
||||||
};
|
|
||||||
|
|
||||||
class EQEmu::saylink::SayLinkEngine
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum SayLinkType {
|
|
||||||
SayLinkBlank = 0,
|
|
||||||
SayLinkItemData,
|
|
||||||
SayLinkLootItem,
|
|
||||||
SayLinkItemInst
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SayLinkEngine {
|
||||||
|
public:
|
||||||
SayLinkEngine();
|
SayLinkEngine();
|
||||||
|
|
||||||
void SetLinkType(SayLinkType link_type) { m_LinkType = link_type; }
|
void SetLinkType(saylink::SayLinkType link_type) { m_LinkType = link_type; }
|
||||||
void SetItemData(const EQEmu::Item_Struct* item_data) { m_ItemData = item_data; }
|
void SetItemData(const EQEmu::ItemBase* item_data) { m_ItemData = item_data; }
|
||||||
void SetLootData(const ServerLootItem_Struct* loot_data) { m_LootData = loot_data; }
|
void SetLootData(const ServerLootItem_Struct* loot_data) { m_LootData = loot_data; }
|
||||||
void SetItemInst(const ItemInst* item_inst) { m_ItemInst = item_inst; }
|
void SetItemInst(const ItemInst* item_inst) { m_ItemInst = item_inst; }
|
||||||
|
|
||||||
@@ -105,12 +98,12 @@ public:
|
|||||||
|
|
||||||
void Reset();
|
void Reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void generate_body();
|
void generate_body();
|
||||||
void generate_text();
|
void generate_text();
|
||||||
|
|
||||||
int m_LinkType;
|
int m_LinkType;
|
||||||
const EQEmu::Item_Struct* m_ItemData;
|
const ItemBase* m_ItemData;
|
||||||
const ServerLootItem_Struct* m_LootData;
|
const ServerLootItem_Struct* m_LootData;
|
||||||
const ItemInst* m_ItemInst;
|
const ItemInst* m_ItemInst;
|
||||||
|
|
||||||
@@ -134,6 +127,8 @@ private:
|
|||||||
std::string m_LinkBody;
|
std::string m_LinkBody;
|
||||||
std::string m_LinkText;
|
std::string m_LinkText;
|
||||||
bool m_Error;
|
bool m_Error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} /*EQEmu*/
|
||||||
|
|
||||||
#endif /*COMMON_SAY_LINK_H*/
|
#endif /*COMMON_SAY_LINK_H*/
|
||||||
|
|||||||
@@ -193,6 +193,7 @@
|
|||||||
#define ServerOP_QSSendQuery 0x5016
|
#define ServerOP_QSSendQuery 0x5016
|
||||||
#define ServerOP_CZSignalNPC 0x5017
|
#define ServerOP_CZSignalNPC 0x5017
|
||||||
#define ServerOP_CZSetEntityVariableByNPCTypeID 0x5018
|
#define ServerOP_CZSetEntityVariableByNPCTypeID 0x5018
|
||||||
|
#define ServerOP_WWMarquee 0x5019
|
||||||
|
|
||||||
/* Query Serv Generic Packet Flag/Type Enumeration */
|
/* Query Serv Generic Packet Flag/Type Enumeration */
|
||||||
enum { QSG_LFGuild = 0 };
|
enum { QSG_LFGuild = 0 };
|
||||||
@@ -1254,6 +1255,15 @@ struct CZMessagePlayer_Struct {
|
|||||||
char Message[512];
|
char Message[512];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct WWMarquee_Struct {
|
||||||
|
uint32 Type;
|
||||||
|
uint32 Priority;
|
||||||
|
uint32 FadeIn;
|
||||||
|
uint32 FadeOut;
|
||||||
|
uint32 Duration;
|
||||||
|
char Message[512];
|
||||||
|
};
|
||||||
|
|
||||||
struct CZSetEntVarByNPCTypeID_Struct {
|
struct CZSetEntVarByNPCTypeID_Struct {
|
||||||
uint32 npctype_id;
|
uint32 npctype_id;
|
||||||
char id[256];
|
char id[256];
|
||||||
|
|||||||
+18
-17
@@ -364,7 +364,7 @@ bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) {
|
|||||||
|
|
||||||
bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) {
|
bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) {
|
||||||
|
|
||||||
const EQEmu::Item_Struct* myitem;
|
const EQEmu::ItemBase* myitem;
|
||||||
|
|
||||||
std::string query = StringFormat("SELECT itemid, item_charges, slot FROM starting_items "
|
std::string query = StringFormat("SELECT itemid, item_charges, slot FROM starting_items "
|
||||||
"WHERE (race = %i or race = 0) AND (class = %i or class = 0) AND "
|
"WHERE (race = %i or race = 0) AND (class = %i or class = 0) AND "
|
||||||
@@ -436,7 +436,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory *inv, bool is_charid)
|
|||||||
aug[4] = (uint32)atoi(row[7]);
|
aug[4] = (uint32)atoi(row[7]);
|
||||||
aug[5] = (uint32)atoi(row[8]);
|
aug[5] = (uint32)atoi(row[8]);
|
||||||
|
|
||||||
const EQEmu::Item_Struct *item = GetItem(item_id);
|
const EQEmu::ItemBase *item = GetItem(item_id);
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
Log.Out(Logs::General, Logs::Error,
|
Log.Out(Logs::General, Logs::Error,
|
||||||
@@ -455,7 +455,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory *inv, bool is_charid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (row[9]) {
|
if (inst && row[9]) {
|
||||||
std::string data_str(row[9]);
|
std::string data_str(row[9]);
|
||||||
std::string idAsString;
|
std::string idAsString;
|
||||||
std::string value;
|
std::string value;
|
||||||
@@ -480,6 +480,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory *inv, bool is_charid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// theoretically inst can be nullptr ... this would be very bad ...
|
||||||
put_slot_id = inv->PutItem(slot_id, *inst);
|
put_slot_id = inv->PutItem(slot_id, *inst);
|
||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
|
|
||||||
@@ -538,7 +539,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory *inv)
|
|||||||
uint32 ornament_idfile = (uint32)atoul(row[13]);
|
uint32 ornament_idfile = (uint32)atoul(row[13]);
|
||||||
uint32 ornament_hero_model = (uint32)atoul(row[14]);
|
uint32 ornament_hero_model = (uint32)atoul(row[14]);
|
||||||
|
|
||||||
const EQEmu::Item_Struct *item = GetItem(item_id);
|
const EQEmu::ItemBase *item = GetItem(item_id);
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
Log.Out(Logs::General, Logs::Error,
|
Log.Out(Logs::General, Logs::Error,
|
||||||
@@ -595,8 +596,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory *inv)
|
|||||||
|
|
||||||
if (charges == 0x7FFF)
|
if (charges == 0x7FFF)
|
||||||
inst->SetCharges(-1);
|
inst->SetCharges(-1);
|
||||||
else if (charges == 0 &&
|
else if (charges == 0 && inst->IsStackable()) // Stackable items need a minimum charge of 1 remain moveable.
|
||||||
inst->IsStackable()) // Stackable items need a minimum charge of 1 remain moveable.
|
|
||||||
inst->SetCharges(1);
|
inst->SetCharges(1);
|
||||||
else
|
else
|
||||||
inst->SetCharges(charges);
|
inst->SetCharges(charges);
|
||||||
@@ -679,7 +679,7 @@ bool SharedDatabase::GetInventory(uint32 account_id, char *name, Inventory *inv)
|
|||||||
uint32 ornament_idfile = (uint32)atoul(row[13]);
|
uint32 ornament_idfile = (uint32)atoul(row[13]);
|
||||||
uint32 ornament_hero_model = (uint32)atoul(row[14]);
|
uint32 ornament_hero_model = (uint32)atoul(row[14]);
|
||||||
|
|
||||||
const EQEmu::Item_Struct *item = GetItem(item_id);
|
const EQEmu::ItemBase *item = GetItem(item_id);
|
||||||
int16 put_slot_id = INVALID_INDEX;
|
int16 put_slot_id = INVALID_INDEX;
|
||||||
if (!item)
|
if (!item)
|
||||||
continue;
|
continue;
|
||||||
@@ -816,7 +816,7 @@ bool SharedDatabase::LoadItems(const std::string &prefix) {
|
|||||||
mutex.Lock();
|
mutex.Lock();
|
||||||
std::string file_name = Config->SharedMemDir + prefix + std::string("items");
|
std::string file_name = Config->SharedMemDir + prefix + std::string("items");
|
||||||
items_mmf = std::unique_ptr<EQEmu::MemoryMappedFile>(new EQEmu::MemoryMappedFile(file_name));
|
items_mmf = std::unique_ptr<EQEmu::MemoryMappedFile>(new EQEmu::MemoryMappedFile(file_name));
|
||||||
items_hash = std::unique_ptr<EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct>>(new EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct>(reinterpret_cast<uint8*>(items_mmf->Get()), items_mmf->Size()));
|
items_hash = std::unique_ptr<EQEmu::FixedMemoryHashSet<EQEmu::ItemBase>>(new EQEmu::FixedMemoryHashSet<EQEmu::ItemBase>(reinterpret_cast<uint8*>(items_mmf->Get()), items_mmf->Size()));
|
||||||
mutex.Unlock();
|
mutex.Unlock();
|
||||||
} catch(std::exception& ex) {
|
} catch(std::exception& ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error Loading Items: %s", ex.what());
|
Log.Out(Logs::General, Logs::Error, "Error Loading Items: %s", ex.what());
|
||||||
@@ -828,7 +828,7 @@ bool SharedDatabase::LoadItems(const std::string &prefix) {
|
|||||||
|
|
||||||
void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id)
|
void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id)
|
||||||
{
|
{
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(reinterpret_cast<uint8 *>(data), size, items, max_item_id);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(reinterpret_cast<uint8 *>(data), size, items, max_item_id);
|
||||||
|
|
||||||
std::string ndbuffer;
|
std::string ndbuffer;
|
||||||
bool disableNoRent = false;
|
bool disableNoRent = false;
|
||||||
@@ -856,7 +856,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EQEmu::Item_Struct item;
|
EQEmu::ItemBase item;
|
||||||
|
|
||||||
const std::string query = "SELECT source,"
|
const std::string query = "SELECT source,"
|
||||||
#define F(x) "`"#x"`,"
|
#define F(x) "`"#x"`,"
|
||||||
@@ -869,7 +869,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
memset(&item, 0, sizeof(EQEmu::Item_Struct));
|
memset(&item, 0, sizeof(EQEmu::ItemBase));
|
||||||
|
|
||||||
item.ItemClass = (uint8)atoi(row[ItemField::itemclass]);
|
item.ItemClass = (uint8)atoi(row[ItemField::itemclass]);
|
||||||
strcpy(item.Name, row[ItemField::name]);
|
strcpy(item.Name, row[ItemField::name]);
|
||||||
@@ -1086,7 +1086,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const EQEmu::Item_Struct* SharedDatabase::GetItem(uint32 id) {
|
const EQEmu::ItemBase* SharedDatabase::GetItem(uint32 id) {
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@@ -1105,7 +1105,7 @@ const EQEmu::Item_Struct* SharedDatabase::GetItem(uint32 id) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const EQEmu::Item_Struct* SharedDatabase::IterateItems(uint32* id) {
|
const EQEmu::ItemBase* SharedDatabase::IterateItems(uint32* id) {
|
||||||
if(!items_hash || !id) {
|
if(!items_hash || !id) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -1253,7 +1253,7 @@ bool SharedDatabase::LoadNPCFactionLists(const std::string &prefix) {
|
|||||||
// Create appropriate ItemInst class
|
// Create appropriate ItemInst class
|
||||||
ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned)
|
ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned)
|
||||||
{
|
{
|
||||||
const EQEmu::Item_Struct* item = nullptr;
|
const EQEmu::ItemBase* item = nullptr;
|
||||||
ItemInst* inst = nullptr;
|
ItemInst* inst = nullptr;
|
||||||
|
|
||||||
item = GetItem(item_id);
|
item = GetItem(item_id);
|
||||||
@@ -1280,7 +1280,7 @@ ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1,
|
|||||||
|
|
||||||
|
|
||||||
// Create appropriate ItemInst class
|
// Create appropriate ItemInst class
|
||||||
ItemInst* SharedDatabase::CreateItem(const EQEmu::Item_Struct* item, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned)
|
ItemInst* SharedDatabase::CreateItem(const EQEmu::ItemBase* item, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned)
|
||||||
{
|
{
|
||||||
ItemInst* inst = nullptr;
|
ItemInst* inst = nullptr;
|
||||||
if (item) {
|
if (item) {
|
||||||
@@ -1304,7 +1304,7 @@ ItemInst* SharedDatabase::CreateItem(const EQEmu::Item_Struct* item, int16 charg
|
|||||||
return inst;
|
return inst;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemInst* SharedDatabase::CreateBaseItem(const EQEmu::Item_Struct* item, int16 charges) {
|
ItemInst* SharedDatabase::CreateBaseItem(const EQEmu::ItemBase* item, int16 charges) {
|
||||||
ItemInst* inst = nullptr;
|
ItemInst* inst = nullptr;
|
||||||
if (item) {
|
if (item) {
|
||||||
// if maxcharges is -1 that means it is an unlimited use item.
|
// if maxcharges is -1 that means it is an unlimited use item.
|
||||||
@@ -1664,7 +1664,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
|
|||||||
|
|
||||||
sp[tempid].uninterruptable=atoi(row[146]) != 0;
|
sp[tempid].uninterruptable=atoi(row[146]) != 0;
|
||||||
sp[tempid].ResistDiff=atoi(row[147]);
|
sp[tempid].ResistDiff=atoi(row[147]);
|
||||||
sp[tempid].dot_stacking_exempt=atoi(row[148]);
|
sp[tempid].dot_stacking_exempt = atoi(row[148]) != 0;
|
||||||
sp[tempid].RecourseLink = atoi(row[150]);
|
sp[tempid].RecourseLink = atoi(row[150]);
|
||||||
sp[tempid].no_partial_resist = atoi(row[151]) != 0;
|
sp[tempid].no_partial_resist = atoi(row[151]) != 0;
|
||||||
|
|
||||||
@@ -1689,6 +1689,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
|
|||||||
sp[tempid].pvpresistcalc=atoi(row[178]);
|
sp[tempid].pvpresistcalc=atoi(row[178]);
|
||||||
sp[tempid].pvpresistcap=atoi(row[179]);
|
sp[tempid].pvpresistcap=atoi(row[179]);
|
||||||
sp[tempid].spell_category=atoi(row[180]);
|
sp[tempid].spell_category=atoi(row[180]);
|
||||||
|
sp[tempid].cast_not_standing = atoi(row[184]) != 0;
|
||||||
sp[tempid].can_mgb=atoi(row[185]);
|
sp[tempid].can_mgb=atoi(row[185]);
|
||||||
sp[tempid].dispel_flag = atoi(row[186]);
|
sp[tempid].dispel_flag = atoi(row[186]);
|
||||||
sp[tempid].MinResist = atoi(row[189]);
|
sp[tempid].MinResist = atoi(row[189]);
|
||||||
|
|||||||
+7
-6
@@ -42,9 +42,10 @@ struct SPDat_Spell_Struct;
|
|||||||
struct NPCFactionList;
|
struct NPCFactionList;
|
||||||
struct LootTable_Struct;
|
struct LootTable_Struct;
|
||||||
struct LootDrop_Struct;
|
struct LootDrop_Struct;
|
||||||
|
|
||||||
namespace EQEmu
|
namespace EQEmu
|
||||||
{
|
{
|
||||||
struct Item_Struct;
|
struct ItemBase;
|
||||||
class MemoryMappedFile;
|
class MemoryMappedFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,8 +100,8 @@ class SharedDatabase : public Database
|
|||||||
Item Methods
|
Item Methods
|
||||||
*/
|
*/
|
||||||
ItemInst* CreateItem(uint32 item_id, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0);
|
ItemInst* CreateItem(uint32 item_id, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0);
|
||||||
ItemInst* CreateItem(const EQEmu::Item_Struct* item, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0);
|
ItemInst* CreateItem(const EQEmu::ItemBase* item, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0);
|
||||||
ItemInst* CreateBaseItem(const EQEmu::Item_Struct* item, int16 charges = 0);
|
ItemInst* CreateBaseItem(const EQEmu::ItemBase* item, int16 charges = 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Shared Memory crap
|
Shared Memory crap
|
||||||
@@ -110,8 +111,8 @@ class SharedDatabase : public Database
|
|||||||
void GetItemsCount(int32 &item_count, uint32 &max_id);
|
void GetItemsCount(int32 &item_count, uint32 &max_id);
|
||||||
void LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id);
|
void LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id);
|
||||||
bool LoadItems(const std::string &prefix);
|
bool LoadItems(const std::string &prefix);
|
||||||
const EQEmu::Item_Struct* IterateItems(uint32* id);
|
const EQEmu::ItemBase* IterateItems(uint32* id);
|
||||||
const EQEmu::Item_Struct* GetItem(uint32 id);
|
const EQEmu::ItemBase* GetItem(uint32 id);
|
||||||
const EvolveInfo* GetEvolveInfo(uint32 loregroup);
|
const EvolveInfo* GetEvolveInfo(uint32 loregroup);
|
||||||
|
|
||||||
//faction lists
|
//faction lists
|
||||||
@@ -148,7 +149,7 @@ class SharedDatabase : public Database
|
|||||||
|
|
||||||
std::unique_ptr<EQEmu::MemoryMappedFile> skill_caps_mmf;
|
std::unique_ptr<EQEmu::MemoryMappedFile> skill_caps_mmf;
|
||||||
std::unique_ptr<EQEmu::MemoryMappedFile> items_mmf;
|
std::unique_ptr<EQEmu::MemoryMappedFile> items_mmf;
|
||||||
std::unique_ptr<EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct>> items_hash;
|
std::unique_ptr<EQEmu::FixedMemoryHashSet<EQEmu::ItemBase>> items_hash;
|
||||||
std::unique_ptr<EQEmu::MemoryMappedFile> faction_mmf;
|
std::unique_ptr<EQEmu::MemoryMappedFile> faction_mmf;
|
||||||
std::unique_ptr<EQEmu::FixedMemoryHashSet<NPCFactionList>> faction_hash;
|
std::unique_ptr<EQEmu::FixedMemoryHashSet<NPCFactionList>> faction_hash;
|
||||||
std::unique_ptr<EQEmu::MemoryMappedFile> loot_table_mmf;
|
std::unique_ptr<EQEmu::MemoryMappedFile> loot_table_mmf;
|
||||||
|
|||||||
+16
-136
@@ -17,7 +17,6 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "types.h"
|
|
||||||
#include "skills.h"
|
#include "skills.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -111,6 +110,20 @@ bool EQEmu::skills::IsBardInstrumentSkill(SkillType skill)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EQEmu::skills::IsCastingSkill(SkillType skill)
|
||||||
|
{
|
||||||
|
switch (skill) {
|
||||||
|
case SkillAbjuration:
|
||||||
|
case SkillAlteration:
|
||||||
|
case SkillConjuration:
|
||||||
|
case SkillDivination:
|
||||||
|
case SkillEvocation:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const std::map<EQEmu::skills::SkillType, std::string>& EQEmu::skills::GetSkillTypeMap()
|
const std::map<EQEmu::skills::SkillType, std::string>& EQEmu::skills::GetSkillTypeMap()
|
||||||
{
|
{
|
||||||
/* VS2013 code
|
/* VS2013 code
|
||||||
@@ -291,142 +304,9 @@ const std::map<EQEmu::skills::SkillType, std::string>& EQEmu::skills::GetSkillTy
|
|||||||
return skill_type_map;
|
return skill_type_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EQEmu::SkillProfile // prototype - not implemented
|
|
||||||
{
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
uint32 _1HBlunt;
|
|
||||||
uint32 _1HSlashing;
|
|
||||||
uint32 _2HBlunt;
|
|
||||||
uint32 _2HSlashing;
|
|
||||||
uint32 Abjuration;
|
|
||||||
uint32 Alteration;
|
|
||||||
uint32 ApplyPoison;
|
|
||||||
uint32 Archery;
|
|
||||||
uint32 Backstab;
|
|
||||||
uint32 BindWound;
|
|
||||||
uint32 Bash;
|
|
||||||
uint32 Block;
|
|
||||||
uint32 BrassInstruments;
|
|
||||||
uint32 Channeling;
|
|
||||||
uint32 Conjuration;
|
|
||||||
uint32 Defense;
|
|
||||||
uint32 Disarm;
|
|
||||||
uint32 DisarmTraps;
|
|
||||||
uint32 Divination;
|
|
||||||
uint32 Dodge;
|
|
||||||
uint32 DoubleAttack;
|
|
||||||
union {
|
|
||||||
uint32 DragonPunch;
|
|
||||||
uint32 TailRake;
|
|
||||||
};
|
|
||||||
uint32 DualWield;
|
|
||||||
uint32 EagleStrike;
|
|
||||||
uint32 Evocation;
|
|
||||||
uint32 FeignDeath;
|
|
||||||
uint32 FlyingKick;
|
|
||||||
uint32 Forage;
|
|
||||||
uint32 HandtoHand;
|
|
||||||
uint32 Hide;
|
|
||||||
uint32 Kick;
|
|
||||||
uint32 Meditate;
|
|
||||||
uint32 Mend;
|
|
||||||
uint32 Offense;
|
|
||||||
uint32 Parry;
|
|
||||||
uint32 PickLock;
|
|
||||||
uint32 _1HPiercing;
|
|
||||||
uint32 Riposte;
|
|
||||||
uint32 RoundKick;
|
|
||||||
uint32 SafeFall;
|
|
||||||
uint32 SenseHeading;
|
|
||||||
uint32 Singing;
|
|
||||||
uint32 Sneak;
|
|
||||||
uint32 SpecializeAbjure;
|
|
||||||
uint32 SpecializeAlteration;
|
|
||||||
uint32 SpecializeConjuration;
|
|
||||||
uint32 SpecializeDivination;
|
|
||||||
uint32 SpecializeEvocation;
|
|
||||||
uint32 PickPockets;
|
|
||||||
uint32 StringedInstruments;
|
|
||||||
uint32 Swimming;
|
|
||||||
uint32 Throwing;
|
|
||||||
uint32 TigerClaw;
|
|
||||||
uint32 Tracking;
|
|
||||||
uint32 WindInstruments;
|
|
||||||
uint32 Fishing;
|
|
||||||
uint32 MakePoison;
|
|
||||||
uint32 Tinkering;
|
|
||||||
uint32 Research;
|
|
||||||
uint32 Alchemy;
|
|
||||||
uint32 Baking;
|
|
||||||
uint32 Tailoring;
|
|
||||||
uint32 SenseTraps;
|
|
||||||
uint32 Blacksmithing;
|
|
||||||
uint32 Fletching;
|
|
||||||
uint32 Brewing;
|
|
||||||
uint32 AlcoholTolerance;
|
|
||||||
uint32 Begging;
|
|
||||||
uint32 JewelryMaking;
|
|
||||||
uint32 Pottery;
|
|
||||||
uint32 PercussionInstruments;
|
|
||||||
uint32 Intimidation;
|
|
||||||
uint32 Berserking;
|
|
||||||
uint32 Taunt;
|
|
||||||
uint32 Frenzy;
|
|
||||||
uint32 RemoveTraps;
|
|
||||||
uint32 TripleAttack;
|
|
||||||
uint32 _2HPiercing;
|
|
||||||
uint32 unused1;
|
|
||||||
uint32 unused2;
|
|
||||||
uint32 unused3;
|
|
||||||
uint32 unused4;
|
|
||||||
uint32 unused5;
|
|
||||||
uint32 unused6;
|
|
||||||
uint32 unused7;
|
|
||||||
uint32 unused8;
|
|
||||||
uint32 unused9;
|
|
||||||
uint32 unused10;
|
|
||||||
uint32 unused11;
|
|
||||||
uint32 unused12;
|
|
||||||
uint32 unused13;
|
|
||||||
uint32 unused14;
|
|
||||||
uint32 unused15;
|
|
||||||
uint32 unused16;
|
|
||||||
uint32 unused17;
|
|
||||||
uint32 unused18;
|
|
||||||
uint32 unused19;
|
|
||||||
uint32 unused20;
|
|
||||||
uint32 unused21;
|
|
||||||
uint32 unused22;
|
|
||||||
};
|
|
||||||
uint32 skill[PACKET_SKILL_ARRAY_SIZE];
|
|
||||||
};
|
|
||||||
|
|
||||||
SkillProfile();
|
|
||||||
|
|
||||||
uint32* GetSkills() { return reinterpret_cast<uint32*>(&skill); }
|
|
||||||
|
|
||||||
skills::SkillType GetLastUseableSkill() { return EQEmu::skills::Skill2HPiercing; }
|
|
||||||
|
|
||||||
size_t GetSkillsArraySize() { return PACKET_SKILL_ARRAY_SIZE; }
|
|
||||||
uint32 GetSkill(int skill_id);
|
|
||||||
|
|
||||||
uint32 operator[](int skill_id) { return GetSkill(skill_id); }
|
|
||||||
|
|
||||||
// const
|
|
||||||
uint32* GetSkills() const { return const_cast<SkillProfile*>(this)->GetSkills(); }
|
|
||||||
|
|
||||||
skills::SkillType GetLastUseableSkill() const { return const_cast<SkillProfile*>(this)->GetLastUseableSkill(); }
|
|
||||||
|
|
||||||
size_t GetSkillsArraySize() const { return const_cast<SkillProfile*>(this)->GetSkillsArraySize(); }
|
|
||||||
uint32 GetSkill(int skill_id) const { return const_cast<SkillProfile*>(this)->GetSkill(skill_id); }
|
|
||||||
|
|
||||||
uint32 operator[](int skill_id) const { return const_cast<SkillProfile*>(this)->GetSkill(skill_id); }
|
|
||||||
};
|
|
||||||
|
|
||||||
EQEmu::SkillProfile::SkillProfile()
|
EQEmu::SkillProfile::SkillProfile()
|
||||||
{
|
{
|
||||||
memset(&skill, 0, (sizeof(uint32) * PACKET_SKILL_ARRAY_SIZE));
|
memset(&Skill, 0, (sizeof(uint32) * PACKET_SKILL_ARRAY_SIZE));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 EQEmu::SkillProfile::GetSkill(int skill_id)
|
uint32 EQEmu::SkillProfile::GetSkill(int skill_id)
|
||||||
@@ -434,5 +314,5 @@ uint32 EQEmu::SkillProfile::GetSkill(int skill_id)
|
|||||||
if (skill_id < 0 || skill_id >= PACKET_SKILL_ARRAY_SIZE)
|
if (skill_id < 0 || skill_id >= PACKET_SKILL_ARRAY_SIZE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return skill[skill_id];
|
return Skill[skill_id];
|
||||||
}
|
}
|
||||||
|
|||||||
+138
-5
@@ -20,6 +20,8 @@
|
|||||||
#ifndef COMMON_SKILLS_H
|
#ifndef COMMON_SKILLS_H
|
||||||
#define COMMON_SKILLS_H
|
#define COMMON_SKILLS_H
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
@@ -159,16 +161,147 @@ namespace EQEmu
|
|||||||
// server profile does not reflect this yet..so, prefixed with 'PACKET_'
|
// server profile does not reflect this yet..so, prefixed with 'PACKET_'
|
||||||
#define PACKET_SKILL_ARRAY_SIZE 100
|
#define PACKET_SKILL_ARRAY_SIZE 100
|
||||||
|
|
||||||
extern bool IsTradeskill(SkillType skill);
|
bool IsTradeskill(SkillType skill);
|
||||||
extern bool IsSpecializedSkill(SkillType skill);
|
bool IsSpecializedSkill(SkillType skill);
|
||||||
extern float GetSkillMeleePushForce(SkillType skill);
|
float GetSkillMeleePushForce(SkillType skill);
|
||||||
extern bool IsBardInstrumentSkill(SkillType skill);
|
bool IsBardInstrumentSkill(SkillType skill);
|
||||||
|
bool IsCastingSkill(SkillType skill);
|
||||||
|
|
||||||
extern const std::map<SkillType, std::string>& GetSkillTypeMap();
|
extern const std::map<SkillType, std::string>& GetSkillTypeMap();
|
||||||
|
|
||||||
} /*skills*/
|
} /*skills*/
|
||||||
|
|
||||||
struct SkillProfile;
|
struct SkillProfile { // prototype - not implemented
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
uint32 _1HBlunt;
|
||||||
|
uint32 _1HSlashing;
|
||||||
|
uint32 _2HBlunt;
|
||||||
|
uint32 _2HSlashing;
|
||||||
|
uint32 Abjuration;
|
||||||
|
uint32 Alteration;
|
||||||
|
uint32 ApplyPoison;
|
||||||
|
uint32 Archery;
|
||||||
|
uint32 Backstab;
|
||||||
|
uint32 BindWound;
|
||||||
|
uint32 Bash;
|
||||||
|
uint32 Block;
|
||||||
|
uint32 BrassInstruments;
|
||||||
|
uint32 Channeling;
|
||||||
|
uint32 Conjuration;
|
||||||
|
uint32 Defense;
|
||||||
|
uint32 Disarm;
|
||||||
|
uint32 DisarmTraps;
|
||||||
|
uint32 Divination;
|
||||||
|
uint32 Dodge;
|
||||||
|
uint32 DoubleAttack;
|
||||||
|
union {
|
||||||
|
uint32 DragonPunch;
|
||||||
|
uint32 TailRake;
|
||||||
|
};
|
||||||
|
uint32 DualWield;
|
||||||
|
uint32 EagleStrike;
|
||||||
|
uint32 Evocation;
|
||||||
|
uint32 FeignDeath;
|
||||||
|
uint32 FlyingKick;
|
||||||
|
uint32 Forage;
|
||||||
|
uint32 HandtoHand;
|
||||||
|
uint32 Hide;
|
||||||
|
uint32 Kick;
|
||||||
|
uint32 Meditate;
|
||||||
|
uint32 Mend;
|
||||||
|
uint32 Offense;
|
||||||
|
uint32 Parry;
|
||||||
|
uint32 PickLock;
|
||||||
|
uint32 _1HPiercing;
|
||||||
|
uint32 Riposte;
|
||||||
|
uint32 RoundKick;
|
||||||
|
uint32 SafeFall;
|
||||||
|
uint32 SenseHeading;
|
||||||
|
uint32 Singing;
|
||||||
|
uint32 Sneak;
|
||||||
|
uint32 SpecializeAbjure;
|
||||||
|
uint32 SpecializeAlteration;
|
||||||
|
uint32 SpecializeConjuration;
|
||||||
|
uint32 SpecializeDivination;
|
||||||
|
uint32 SpecializeEvocation;
|
||||||
|
uint32 PickPockets;
|
||||||
|
uint32 StringedInstruments;
|
||||||
|
uint32 Swimming;
|
||||||
|
uint32 Throwing;
|
||||||
|
uint32 TigerClaw;
|
||||||
|
uint32 Tracking;
|
||||||
|
uint32 WindInstruments;
|
||||||
|
uint32 Fishing;
|
||||||
|
uint32 MakePoison;
|
||||||
|
uint32 Tinkering;
|
||||||
|
uint32 Research;
|
||||||
|
uint32 Alchemy;
|
||||||
|
uint32 Baking;
|
||||||
|
uint32 Tailoring;
|
||||||
|
uint32 SenseTraps;
|
||||||
|
uint32 Blacksmithing;
|
||||||
|
uint32 Fletching;
|
||||||
|
uint32 Brewing;
|
||||||
|
uint32 AlcoholTolerance;
|
||||||
|
uint32 Begging;
|
||||||
|
uint32 JewelryMaking;
|
||||||
|
uint32 Pottery;
|
||||||
|
uint32 PercussionInstruments;
|
||||||
|
uint32 Intimidation;
|
||||||
|
uint32 Berserking;
|
||||||
|
uint32 Taunt;
|
||||||
|
uint32 Frenzy;
|
||||||
|
uint32 RemoveTraps;
|
||||||
|
uint32 TripleAttack;
|
||||||
|
uint32 _2HPiercing;
|
||||||
|
uint32 unused1;
|
||||||
|
uint32 unused2;
|
||||||
|
uint32 unused3;
|
||||||
|
uint32 unused4;
|
||||||
|
uint32 unused5;
|
||||||
|
uint32 unused6;
|
||||||
|
uint32 unused7;
|
||||||
|
uint32 unused8;
|
||||||
|
uint32 unused9;
|
||||||
|
uint32 unused10;
|
||||||
|
uint32 unused11;
|
||||||
|
uint32 unused12;
|
||||||
|
uint32 unused13;
|
||||||
|
uint32 unused14;
|
||||||
|
uint32 unused15;
|
||||||
|
uint32 unused16;
|
||||||
|
uint32 unused17;
|
||||||
|
uint32 unused18;
|
||||||
|
uint32 unused19;
|
||||||
|
uint32 unused20;
|
||||||
|
uint32 unused21;
|
||||||
|
uint32 unused22;
|
||||||
|
};
|
||||||
|
uint32 Skill[PACKET_SKILL_ARRAY_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
SkillProfile();
|
||||||
|
|
||||||
|
uint32* GetSkills() { return reinterpret_cast<uint32*>(&Skill); }
|
||||||
|
|
||||||
|
skills::SkillType GetLastUseableSkill() { return EQEmu::skills::Skill2HPiercing; }
|
||||||
|
|
||||||
|
size_t GetSkillsArraySize() { return PACKET_SKILL_ARRAY_SIZE; }
|
||||||
|
uint32 GetSkill(int skill_id);
|
||||||
|
|
||||||
|
uint32 operator[](int skill_id) { return GetSkill(skill_id); }
|
||||||
|
|
||||||
|
// const
|
||||||
|
uint32* GetSkills() const { return const_cast<SkillProfile*>(this)->GetSkills(); }
|
||||||
|
|
||||||
|
skills::SkillType GetLastUseableSkill() const { return const_cast<SkillProfile*>(this)->GetLastUseableSkill(); }
|
||||||
|
|
||||||
|
size_t GetSkillsArraySize() const { return const_cast<SkillProfile*>(this)->GetSkillsArraySize(); }
|
||||||
|
uint32 GetSkill(int skill_id) const { return const_cast<SkillProfile*>(this)->GetSkill(skill_id); }
|
||||||
|
|
||||||
|
uint32 operator[](int skill_id) const { return const_cast<SkillProfile*>(this)->GetSkill(skill_id); }
|
||||||
|
};
|
||||||
|
|
||||||
} /*EQEmu*/
|
} /*EQEmu*/
|
||||||
|
|
||||||
|
|||||||
+105
-6
@@ -235,8 +235,11 @@ bool IsBeneficialSpell(uint16 spell_id)
|
|||||||
// If the resisttype is magic and SpellAffectIndex is Calm/memblur/dispell sight
|
// If the resisttype is magic and SpellAffectIndex is Calm/memblur/dispell sight
|
||||||
// it's not beneficial
|
// it's not beneficial
|
||||||
if (spells[spell_id].resisttype == RESIST_MAGIC) {
|
if (spells[spell_id].resisttype == RESIST_MAGIC) {
|
||||||
if (sai == SAI_Calm || sai == SAI_Dispell_Sight ||
|
// checking these SAI cause issues with the rng defensive proc line
|
||||||
sai == SAI_Memory_Blur || sai == SAI_Calm_Song)
|
// So I guess instead of fixing it for real, just a quick hack :P
|
||||||
|
if (spells[spell_id].effectid[0] != SE_DefensiveProc &&
|
||||||
|
(sai == SAI_Calm || sai == SAI_Dispell_Sight || sai == SAI_Memory_Blur ||
|
||||||
|
sai == SAI_Calm_Song))
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
// If the resisttype is not magic and spell is Bind Sight or Cast Sight
|
// If the resisttype is not magic and spell is Bind Sight or Cast Sight
|
||||||
@@ -669,9 +672,7 @@ bool IsDisciplineBuff(uint16 spell_id)
|
|||||||
if (!IsValidSpell(spell_id))
|
if (!IsValidSpell(spell_id))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (spells[spell_id].mana == 0 && spells[spell_id].short_buff_box == 0 &&
|
if (spells[spell_id].IsDisciplineBuff && spells[spell_id].targettype == ST_Self)
|
||||||
(spells[spell_id].EndurCost || spells[spell_id].EndurUpkeep) &&
|
|
||||||
spells[spell_id].targettype == ST_Self)
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -704,7 +705,7 @@ bool IsCombatSkill(uint16 spell_id)
|
|||||||
bool IsResurrectionEffects(uint16 spell_id)
|
bool IsResurrectionEffects(uint16 spell_id)
|
||||||
{
|
{
|
||||||
// spell id 756 is Resurrection Effects spell
|
// spell id 756 is Resurrection Effects spell
|
||||||
if(IsValidSpell(spell_id) && spell_id == 756)
|
if(IsValidSpell(spell_id) && (spell_id == 756 || spell_id == 757))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -1100,6 +1101,104 @@ bool NoDetrimentalSpellAggro(uint16 spell_id)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsStackableDot(uint16 spell_id)
|
||||||
|
{
|
||||||
|
// rules according to client
|
||||||
|
if (!IsValidSpell(spell_id))
|
||||||
|
return false;
|
||||||
|
const auto &spell = spells[spell_id];
|
||||||
|
if (spell.dot_stacking_exempt || spell.goodEffect || !spell.buffdurationformula)
|
||||||
|
return false;
|
||||||
|
return IsEffectInSpell(spell_id, SE_CurrentHP) || IsEffectInSpell(spell_id, SE_GravityEffect);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsCastWhileInvis(uint16 spell_id)
|
||||||
|
{
|
||||||
|
if (!IsValidSpell(spell_id))
|
||||||
|
return false;
|
||||||
|
const auto &spell = spells[spell_id];
|
||||||
|
if (spell.sneak || spell.cast_not_standing)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsEffectIgnoredInStacking(int spa)
|
||||||
|
{
|
||||||
|
// this should match RoF2
|
||||||
|
switch (spa) {
|
||||||
|
case SE_SeeInvis:
|
||||||
|
case SE_DiseaseCounter:
|
||||||
|
case SE_PoisonCounter:
|
||||||
|
case SE_Levitate:
|
||||||
|
case SE_InfraVision:
|
||||||
|
case SE_UltraVision:
|
||||||
|
case SE_CurrentHPOnce:
|
||||||
|
case SE_CurseCounter:
|
||||||
|
case SE_ImprovedDamage:
|
||||||
|
case SE_ImprovedHeal:
|
||||||
|
case SE_SpellResistReduction:
|
||||||
|
case SE_IncreaseSpellHaste:
|
||||||
|
case SE_IncreaseSpellDuration:
|
||||||
|
case SE_IncreaseRange:
|
||||||
|
case SE_SpellHateMod:
|
||||||
|
case SE_ReduceReagentCost:
|
||||||
|
case SE_ReduceManaCost:
|
||||||
|
case SE_FcStunTimeMod:
|
||||||
|
case SE_LimitMaxLevel:
|
||||||
|
case SE_LimitResist:
|
||||||
|
case SE_LimitTarget:
|
||||||
|
case SE_LimitEffect:
|
||||||
|
case SE_LimitSpellType:
|
||||||
|
case SE_LimitSpell:
|
||||||
|
case SE_LimitMinDur:
|
||||||
|
case SE_LimitInstant:
|
||||||
|
case SE_LimitMinLevel:
|
||||||
|
case SE_LimitCastTimeMin:
|
||||||
|
case SE_LimitCastTimeMax:
|
||||||
|
case SE_StackingCommand_Block:
|
||||||
|
case SE_StackingCommand_Overwrite:
|
||||||
|
case SE_PetPowerIncrease:
|
||||||
|
case SE_SkillDamageAmount:
|
||||||
|
case SE_ChannelChanceSpells:
|
||||||
|
case SE_Blank:
|
||||||
|
case SE_FcDamageAmt:
|
||||||
|
case SE_SpellDurationIncByTic:
|
||||||
|
case SE_FcSpellVulnerability:
|
||||||
|
case SE_FcDamageAmtIncoming:
|
||||||
|
case SE_FcDamagePctCrit:
|
||||||
|
case SE_FcDamageAmtCrit:
|
||||||
|
case SE_ReduceReuseTimer:
|
||||||
|
case SE_LimitCombatSkills:
|
||||||
|
case SE_BlockNextSpellFocus:
|
||||||
|
case SE_SpellTrigger:
|
||||||
|
case SE_LimitManaMin:
|
||||||
|
case SE_CorruptionCounter:
|
||||||
|
case SE_ApplyEffect:
|
||||||
|
case SE_NegateSpellEffect:
|
||||||
|
case SE_LimitSpellGroup:
|
||||||
|
case SE_LimitManaMax:
|
||||||
|
case SE_FcHealAmt:
|
||||||
|
case SE_FcHealPctIncoming:
|
||||||
|
case SE_FcHealAmtIncoming:
|
||||||
|
case SE_FcHealPctCritIncoming:
|
||||||
|
case SE_FcHealAmtCrit:
|
||||||
|
case SE_LimitClass:
|
||||||
|
case SE_LimitRace:
|
||||||
|
case SE_FcBaseEffects:
|
||||||
|
case 415:
|
||||||
|
case SE_SkillDamageAmount2:
|
||||||
|
case SE_FcLimitUse:
|
||||||
|
case SE_FcIncreaseNumHits:
|
||||||
|
case SE_LimitUseMin:
|
||||||
|
case SE_LimitUseType:
|
||||||
|
case SE_GravityEffect:
|
||||||
|
case 425:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32 GetNimbusEffect(uint16 spell_id)
|
uint32 GetNimbusEffect(uint16 spell_id)
|
||||||
{
|
{
|
||||||
if (IsValidSpell(spell_id))
|
if (IsValidSpell(spell_id))
|
||||||
|
|||||||
+159
-136
@@ -100,23 +100,23 @@ typedef enum {
|
|||||||
/* 09 */ ST_Animal = 0x09,
|
/* 09 */ ST_Animal = 0x09,
|
||||||
/* 10 */ ST_Undead = 0x0a,
|
/* 10 */ ST_Undead = 0x0a,
|
||||||
/* 11 */ ST_Summoned = 0x0b,
|
/* 11 */ ST_Summoned = 0x0b,
|
||||||
/* 12 */ // NOT USED
|
/* 12 */ // NOT USED error is 218 (This spell only works on things that are flying.)
|
||||||
/* 13 */ ST_Tap = 0x0d,
|
/* 13 */ ST_Tap = 0x0d,
|
||||||
/* 14 */ ST_Pet = 0x0e,
|
/* 14 */ ST_Pet = 0x0e,
|
||||||
/* 15 */ ST_Corpse = 0x0f,
|
/* 15 */ ST_Corpse = 0x0f,
|
||||||
/* 16 */ ST_Plant = 0x10,
|
/* 16 */ ST_Plant = 0x10,
|
||||||
/* 17 */ ST_Giant = 0x11, //special giant
|
/* 17 */ ST_Giant = 0x11, //special giant
|
||||||
/* 18 */ ST_Dragon = 0x12, //special dragon
|
/* 18 */ ST_Dragon = 0x12, //special dragon
|
||||||
/* 19 */ // NOT USED
|
/* 19 */ // NOT USED error is 227 (This spell only works on specific coldain.)
|
||||||
/* 20 */ ST_TargetAETap = 0x14,
|
/* 20 */ ST_TargetAETap = 0x14,
|
||||||
/* 21 */ // NOT USED
|
/* 21 */ // NOT USED same switch case as ST_Undead
|
||||||
/* 22 */ // NOT USED
|
/* 22 */ // NOT USED same switch case as ST_Summoned
|
||||||
/* 23 */ // NOT USED
|
/* 23 */ // NOT USED same switch case as ST_Animal
|
||||||
/* 24 */ ST_UndeadAE = 0x18,
|
/* 24 */ ST_UndeadAE = 0x18,
|
||||||
/* 25 */ ST_SummonedAE = 0x19,
|
/* 25 */ ST_SummonedAE = 0x19,
|
||||||
/* 26 */ // NOT USED
|
/* 26 */ // NOT USED
|
||||||
/* 27 */ // NOT USED
|
/* 27 */ // NOT USED error is 223 (This spell only works on insects.)
|
||||||
/* 28 */ // NOT USED
|
/* 28 */ // NOT USED error is 223 (This spell only works on insects.)
|
||||||
/* 29 */ // NOT USED
|
/* 29 */ // NOT USED
|
||||||
/* 30 */ // NOT USED
|
/* 30 */ // NOT USED
|
||||||
/* 31 */ // NOT USED
|
/* 31 */ // NOT USED
|
||||||
@@ -446,7 +446,7 @@ typedef enum {
|
|||||||
#define SE_IncreaseRunSpeedCap 290 // implemented[AA] - increases run speed over the hard cap
|
#define SE_IncreaseRunSpeedCap 290 // implemented[AA] - increases run speed over the hard cap
|
||||||
#define SE_Purify 291 // implemented - Removes determental effects
|
#define SE_Purify 291 // implemented - Removes determental effects
|
||||||
#define SE_StrikeThrough2 292 // implemented[AA] - increasing chance of bypassing an opponent's special defenses, such as dodge, block, parry, and riposte.
|
#define SE_StrikeThrough2 292 // implemented[AA] - increasing chance of bypassing an opponent's special defenses, such as dodge, block, parry, and riposte.
|
||||||
#define SE_FrontalStunResist 293 // implemented[AA] - Reduce chance to be stunned from front.
|
#define SE_FrontalStunResist 293 // implemented[AA] - Reduce chance to be stunned from front. -- live descriptions sounds like this isn't limited to frontal anymore
|
||||||
#define SE_CriticalSpellChance 294 // implemented - increase chance to critical hit and critical damage modifier.
|
#define SE_CriticalSpellChance 294 // implemented - increase chance to critical hit and critical damage modifier.
|
||||||
//#define SE_ReduceTimerSpecial 295 // not used
|
//#define SE_ReduceTimerSpecial 295 // not used
|
||||||
#define SE_FcSpellVulnerability 296 // implemented - increase in incoming spell damage
|
#define SE_FcSpellVulnerability 296 // implemented - increase in incoming spell damage
|
||||||
@@ -643,139 +643,159 @@ typedef enum {
|
|||||||
|
|
||||||
struct SPDat_Spell_Struct
|
struct SPDat_Spell_Struct
|
||||||
{
|
{
|
||||||
/* 000 */ int id; // not used
|
/* 000 */ int id; // not used -- SPELLINDEX
|
||||||
/* 001 */ char name[64]; // Name of the spell
|
/* 001 */ char name[64]; // Name of the spell -- SPELLNAME
|
||||||
/* 002 */ char player_1[32]; // "PLAYER_1"
|
/* 002 */ char player_1[32]; // "PLAYER_1" -- ACTORTAG
|
||||||
/* 003 */ char teleport_zone[64]; // Teleport zone, pet name summoned, or item summoned
|
/* 003 */ char teleport_zone[64]; // Teleport zone, pet name summoned, or item summoned -- NPC_FILENAME
|
||||||
/* 004 */ char you_cast[64]; // Message when you cast
|
/* 004 */ char you_cast[64]; // Message when you cast -- CASTERMETXT
|
||||||
/* 005 */ char other_casts[64]; // Message when other casts
|
/* 005 */ char other_casts[64]; // Message when other casts -- CASTEROTHERTXT
|
||||||
/* 006 */ char cast_on_you[64]; // Message when spell is cast on you
|
/* 006 */ char cast_on_you[64]; // Message when spell is cast on you -- CASTEDMETXT
|
||||||
/* 007 */ char cast_on_other[64]; // Message when spell is cast on someone else
|
/* 007 */ char cast_on_other[64]; // Message when spell is cast on someone else -- CASTEDOTHERTXT
|
||||||
/* 008 */ char spell_fades[64]; // Spell fades
|
/* 008 */ char spell_fades[64]; // Spell fades -- SPELLGONE
|
||||||
/* 009 */ float range;
|
/* 009 */ float range; // -- RANGE
|
||||||
/* 010 */ float aoerange;
|
/* 010 */ float aoerange; // -- IMPACTRANGE
|
||||||
/* 011 */ float pushback;
|
/* 011 */ float pushback; // -- OUTFORCE
|
||||||
/* 012 */ float pushup;
|
/* 012 */ float pushup; // -- UPFORCE
|
||||||
/* 013 */ uint32 cast_time; // Cast time
|
/* 013 */ uint32 cast_time; // Cast time -- CASTINGTIME
|
||||||
/* 014 */ uint32 recovery_time; // Recovery time
|
/* 014 */ uint32 recovery_time; // Recovery time -- RECOVERYDELAY
|
||||||
/* 015 */ uint32 recast_time; // Recast same spell time
|
/* 015 */ uint32 recast_time; // Recast same spell time -- SPELLDELAY
|
||||||
/* 016 */ uint32 buffdurationformula;
|
/* 016 */ uint32 buffdurationformula; // -- DURATIONBASE
|
||||||
/* 017 */ uint32 buffduration;
|
/* 017 */ uint32 buffduration; // -- DURATIONCAP
|
||||||
/* 018 */ uint32 AEDuration; // sentinel, rain of something
|
/* 018 */ uint32 AEDuration; // sentinel, rain of something -- IMPACTDURATION
|
||||||
/* 019 */ uint16 mana; // Mana Used
|
/* 019 */ uint16 mana; // Mana Used -- MANACOST
|
||||||
/* 020 */ int base[EFFECT_COUNT]; //various purposes
|
/* 020 */ int base[EFFECT_COUNT]; //various purposes -- BASEAFFECT1 .. BASEAFFECT12
|
||||||
/* 032 */ int base2[EFFECT_COUNT]; //various purposes
|
/* 032 */ int base2[EFFECT_COUNT]; //various purposes -- BASE_EFFECT2_1 ... BASE_EFFECT2_12
|
||||||
/* 044 */ int32 max[EFFECT_COUNT];
|
/* 044 */ int32 max[EFFECT_COUNT]; // -- AFFECT1CAP ... AFFECT12CAP
|
||||||
/* 056 */ //uint16 icon; // Spell icon
|
/* 056 */ //uint16 icon; // Spell icon -- IMAGENUMBER
|
||||||
/* 057 */ //uint16 memicon; // Icon on membarthing
|
/* 057 */ //uint16 memicon; // Icon on membarthing -- MEMIMAGENUMBER
|
||||||
/* 058 */ int32 components[4]; // reagents
|
/* 058 */ int32 components[4]; // reagents -- EXPENDREAGENT1 ... EXPENDREAGENT4
|
||||||
/* 062 */ int component_counts[4]; // amount of regents used
|
/* 062 */ int component_counts[4]; // amount of regents used -- EXPENDQTY1 ... EXPENDQTY4
|
||||||
/* 066 */ int NoexpendReagent[4]; // focus items (Need but not used; Flame Lick has a Fire Beetle Eye focus.)
|
/* 066 */ int NoexpendReagent[4]; // focus items (Need but not used; Flame Lick has a Fire Beetle Eye focus.)
|
||||||
// If it is a number between 1-4 it means components[number] is a focus and not to expend it
|
// If it is a number between 1-4 it means components[number] is a focus and not to expend it
|
||||||
// If it is a valid itemid it means this item is a focus as well
|
// If it is a valid itemid it means this item is a focus as well
|
||||||
/* 070 */ uint16 formula[EFFECT_COUNT]; // Spell's value formula
|
// -- NOEXPENDREAGENT1 ... NOEXPENDREAGENT4
|
||||||
/* 082 */ //int LightType; // probaly another effecttype flag
|
/* 070 */ uint16 formula[EFFECT_COUNT]; // Spell's value formula -- LEVELAFFECT1MOD ... LEVELAFFECT12MOD
|
||||||
/* 083 */ int8 goodEffect; //0=detrimental, 1=Beneficial, 2=Beneficial, Group Only
|
/* 082 */ //int LightType; // probaly another effecttype flag -- LIGHTTYPE
|
||||||
/* 084 */ int Activated; // probably another effecttype flag
|
/* 083 */ int8 goodEffect; //0=detrimental, 1=Beneficial, 2=Beneficial, Group Only -- BENEFICIAL
|
||||||
/* 085 */ int resisttype;
|
/* 084 */ int Activated; // probably another effecttype flag -- ACTIVATED
|
||||||
/* 086 */ int effectid[EFFECT_COUNT]; // Spell's effects
|
/* 085 */ int resisttype; // -- RESISTTYPE
|
||||||
/* 098 */ SpellTargetType targettype; // Spell's Target
|
/* 086 */ int effectid[EFFECT_COUNT]; // Spell's effects -- SPELLAFFECT1 ... SPELLAFFECT12
|
||||||
/* 099 */ int basediff; // base difficulty fizzle adjustment
|
/* 098 */ SpellTargetType targettype; // Spell's Target -- TYPENUMBER
|
||||||
/* 100 */ EQEmu::skills::SkillType skill;
|
/* 099 */ int basediff; // base difficulty fizzle adjustment -- BASEDIFFICULTY
|
||||||
/* 101 */ int8 zonetype; // 01=Outdoors, 02=dungeons, ff=Any
|
/* 100 */ EQEmu::skills::SkillType skill; // -- CASTINGSKILL
|
||||||
/* 102 */ int8 EnvironmentType;
|
/* 101 */ int8 zonetype; // 01=Outdoors, 02=dungeons, ff=Any -- ZONETYPE
|
||||||
/* 103 */ int8 TimeOfDay;
|
/* 102 */ int8 EnvironmentType; // -- ENVIRONMENTTYPE
|
||||||
/* 104 */ uint8 classes[PLAYER_CLASS_COUNT]; // Classes, and their min levels
|
/* 103 */ int8 TimeOfDay; // -- TIMEOFDAY
|
||||||
/* 120 */ uint8 CastingAnim;
|
/* 104 */ uint8 classes[PLAYER_CLASS_COUNT]; // Classes, and their min levels -- WARRIORMIN ... BERSERKERMIN
|
||||||
/* 121 */ //uint8 TargetAnim;
|
/* 120 */ uint8 CastingAnim; // -- CASTINGANIM
|
||||||
/* 122 */ //uint32 TravelType;
|
/* 121 */ //uint8 TargetAnim; // -- TARGETANIM
|
||||||
/* 123 */ uint16 SpellAffectIndex;
|
/* 122 */ //uint32 TravelType; // -- TRAVELTYPE
|
||||||
/* 124 */ int8 disallow_sit; // 124: high-end Yaulp spells (V, VI, VII, VIII [Rk 1, 2, & 3], & Gallenite's Bark of Fury
|
/* 123 */ uint16 SpellAffectIndex; // -- SPELLAFFECTINDEX
|
||||||
/* 125 */ int8 diety_agnostic;// 125: Words of the Skeptic
|
/* 124 */ int8 disallow_sit; // 124: high-end Yaulp spells (V, VI, VII, VIII [Rk 1, 2, & 3], & Gallenite's Bark of Fury -- CANCELONSIT
|
||||||
|
/* 125 */ int8 diety_agnostic;// 125: Words of the Skeptic -- DIETY_AGNOSTIC
|
||||||
/* 126 */ int8 deities[16]; // Deity check. 201 - 216 per http://www.eqemulator.net/wiki/wikka.php?wakka=DeityList
|
/* 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
|
// -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
|
// the client actually stores deities in a single int32_t
|
||||||
// 143: always set to 0
|
// -- DIETY_BERTOXXULOUS ... DIETY_VEESHAN
|
||||||
/* 144 */ //int16 new_icon // Spell icon used by the client in uifiles/default/spells??.tga, both for spell gems & buff window. Looks to depreciate icon & memicon
|
/* 142 */ //int8 npc_no_cast; // 142: between 0 & 100 -- NPC_NO_CAST
|
||||||
/* 145 */ //int16 spellanim; // Doesn't look like it's the same as #doanim, so not sure what this is
|
/* 143 */ //int ai_pt_bonus; // 143: always set to 0, client doesn't save this -- AI_PT_BONUS
|
||||||
/* 146 */ int8 uninterruptable; // Looks like anything != 0 is uninterruptable. Values are mostly -1, 0, & 1 (Fetid Breath = 90?)
|
/* 144 */ //int16 new_icon // Spell icon used by the client in uifiles/default/spells??.tga, both for spell gems & buff window. Looks to depreciate icon & memicon -- NEW_ICON
|
||||||
/* 147 */ int16 ResistDiff;
|
/* 145 */ //int16 spellanim; // Doesn't look like it's the same as #doanim, so not sure what this is, particles I think -- SPELL_EFFECT_INDEX
|
||||||
/* 148 */ int8 dot_stacking_exempt; // If 1 doesn't stack with self cast by others. If -1 (not implemented) doesn't stack with same effect (???)
|
/* 146 */ bool uninterruptable; // Looks like anything != 0 is uninterruptable. Values are mostly -1, 0, & 1 (Fetid Breath = 90?) -- NO_INTERRUPT
|
||||||
/* 149 */ //int deletable;
|
/* 147 */ int16 ResistDiff; // -- RESIST_MOD
|
||||||
/* 150 */ uint16 RecourseLink;
|
/* 148 */ bool dot_stacking_exempt; // -- NOT_STACKABLE_DOT
|
||||||
/* 151 */ bool no_partial_resist; // 151: -1, 0, or 1
|
/* 149 */ //int deletable; // -- DELETE_OK
|
||||||
// 152 & 153: all set to 0
|
/* 150 */ uint16 RecourseLink; // -- REFLECT_SPELLINDEX
|
||||||
/* 154 */ int8 short_buff_box; // != 0, goes to short buff box.
|
/* 151 */ bool no_partial_resist; // 151: -1, 0, or 1 -- NO_PARTIAL_SAVE
|
||||||
/* 155 */ int descnum; // eqstr of description of spell
|
/* 152 */ //bool small_targets_only; // -- SMALL_TARGETS_ONLY
|
||||||
/* 156 */ int typedescnum; // eqstr of type description
|
/* 153 */ //bool uses_persistent_particles; // -- USES_PERSISTENT_PARTICLES
|
||||||
/* 157 */ int effectdescnum; // eqstr of effect description
|
/* 154 */ int8 short_buff_box; // != 0, goes to short buff box. -- BARD_BUFF_BOX
|
||||||
/* 158 */ //Category Desc ID 3
|
/* 155 */ int descnum; // eqstr of description of spell -- DESCRIPTION_INDEX
|
||||||
/* 159 */ bool npc_no_los;
|
/* 156 */ int typedescnum; // eqstr of type description -- PRIMARY_CATEGORY
|
||||||
/* 161 */ bool reflectable;
|
/* 157 */ int effectdescnum; // eqstr of effect description -- SECONDARY_CATEGORY_1
|
||||||
/* 162 */ int bonushate;
|
/* 158 */ //int secondary_category_2; //Category Desc ID 3 -- SECONDARY_CATEGORY_2
|
||||||
/* 163 */
|
/* 159 */ bool npc_no_los; // -- NO_NPC_LOS
|
||||||
/* 164 */ // for most spells this appears to mimic ResistDiff
|
/* 160 */ //bool feedbackable; // -- FEEDBACKABLE
|
||||||
/* 165 */ bool ldon_trap; //Flag found on all LDON trap / chest related spells.
|
/* 161 */ bool reflectable; // -- REFLECTABLE
|
||||||
/* 166 */ int EndurCost;
|
/* 162 */ int bonushate; // -- HATE_MOD
|
||||||
/* 167 */ int8 EndurTimerIndex;
|
/* 163 */ //int resist_per_level; // -- RESIST_PER_LEVEL
|
||||||
/* 168 */ bool IsDisciplineBuff; //Will goto the combat window when cast
|
/* 164 */ //int resist_cap; // for most spells this appears to mimic ResistDiff -- RESIST_CAP
|
||||||
/* 169 - 172*/ //These are zero for ALL spells
|
/* 165 */ bool ldon_trap; //Flag found on all LDON trap / chest related spells. -- AFFECT_INANIMATE
|
||||||
/* 173 */ int HateAdded;
|
/* 166 */ int EndurCost; // -- STAMINA_COST
|
||||||
/* 174 */ int EndurUpkeep;
|
/* 167 */ int8 EndurTimerIndex; // bad name, used for all spells -- TIMER_INDEX
|
||||||
/* 175 */ int numhitstype; // defines which type of behavior will tick down the numhit counter.
|
/* 168 */ bool IsDisciplineBuff; //Will goto the combat window when cast -- IS_SKILL
|
||||||
/* 176 */ int numhits;
|
/* 169 - 172*/ //These are zero for ALL spells, also removed from live -- ATTACK_OPENING, DEFENSE_OPENING, SKILL_OPENING, NPC_ERROR_OPENING
|
||||||
/* 177 */ int pvpresistbase;
|
/* 173 */ int HateAdded; // -- SPELL_HATE_GIVEN
|
||||||
/* 178 */ int pvpresistcalc;
|
/* 174 */ int EndurUpkeep; // -- ENDUR_UPKEEP
|
||||||
/* 179 */ int pvpresistcap;
|
/* 175 */ int numhitstype; // defines which type of behavior will tick down the numhit counter. -- LIMITED_USE_TYPE
|
||||||
/* 180 */ int spell_category;
|
/* 176 */ int numhits; // -- LIMITED_USE_COUNT
|
||||||
/* 181 */ //unknown - likely buff duration related
|
/* 177 */ int pvpresistbase; // -- PVP_RESIST_MOD
|
||||||
/* 182 */ //unknown - likely buff duration related
|
/* 178 */ int pvpresistcalc; // -- PVP_RESIST_PER_LEVEL
|
||||||
/* 183 */
|
/* 179 */ int pvpresistcap; // -- PVP_RESIST_CAP
|
||||||
/* 184 */
|
/* 180 */ int spell_category; // -- GLOBAL_GROUP
|
||||||
/* 185 */ int8 can_mgb; // 0=no, -1 or 1 = yes
|
/* 181 */ //int pvp_duration; // buffdurationformula for PvP -- PVP_DURATION
|
||||||
/* 186 */ int dispel_flag;
|
/* 182 */ //int pvp_duration_cap; // buffduration for PvP -- PVP_DURATION_CAP
|
||||||
/* 187 */ //int npc_category;
|
/* 183 */ //int pcnpc_only_flag; // valid values are 0, 1 = PCs (and mercs), and 2 = NPCs (and not mercs) -- PCNPC_ONLY_FLAG
|
||||||
/* 188 */ //int npc_usefulness;
|
/* 184 */ bool cast_not_standing; // this is checked in the client's EQ_Spell::IsCastWhileInvisSpell, this also blocks SE_InterruptCasting from affecting this spell -- CAST_NOT_STANDING
|
||||||
/* 189 */ int MinResist;
|
/* 185 */ bool can_mgb; // 0=no, -1 or 1 = yes -- CAN_MGB
|
||||||
/* 190 */ int MaxResist;
|
/* 186 */ int dispel_flag; // -- NO_DISPELL
|
||||||
/* 191 */ uint8 viral_targets;
|
/* 187 */ //int npc_category; // -- NPC_MEM_CATEGORY
|
||||||
/* 192 */ uint8 viral_timer;
|
/* 188 */ //int npc_usefulness; // -- NPC_USEFULNESS
|
||||||
/* 193 */ int NimbusEffect;
|
/* 189 */ int MinResist; // -- MIN_RESIST
|
||||||
/* 194 */ float directional_start; //Cone Start Angle:
|
/* 190 */ int MaxResist; // -- MAX_RESIST
|
||||||
/* 195 */ float directional_end; // Cone End Angle:
|
/* 191 */ uint8 viral_targets; // -- MIN_SPREAD_TIME
|
||||||
/* 196 */ bool sneak; // effect can only be used if sneaking (rogue 'Daggerfall' ect)
|
/* 192 */ uint8 viral_timer; // -- MAX_SPREAD_TIME
|
||||||
/* 197 */ bool not_focusable; //prevents focus effects from being applied to spell
|
/* 193 */ int NimbusEffect; // -- DURATION_PARTICLE_EFFECT
|
||||||
/* 198 */ bool no_detrimental_spell_aggro;
|
/* 194 */ float directional_start; //Cone Start Angle: -- CONE_START_ANGLE
|
||||||
/* 199 */
|
/* 195 */ float directional_end; // Cone End Angle: -- CONE_END_ANGLE
|
||||||
/* 200 */ bool suspendable; // buff is suspended in suspended buff zones
|
/* 196 */ bool sneak; // effect can only be used if sneaking (rogue 'Daggerfall' ect) -- SNEAK_ATTACK
|
||||||
/* 201 */ int viral_range;
|
/* 197 */ bool not_focusable; //prevents focus effects from being applied to spell -- NOT_FOCUSABLE
|
||||||
/* 202 */ int songcap; // individual song cap
|
/* 198 */ bool no_detrimental_spell_aggro; // -- NO_DETRIMENTAL_SPELL_AGGRO
|
||||||
/* 203 */
|
/* 199 */ //bool show_wear_off_message; // -- SHOW_WEAR_OFF_MESSAGE
|
||||||
/* 204 */
|
/* 200 */ bool suspendable; // buff is suspended in suspended buff zones -- IS_COUNTDOWN_HELD
|
||||||
/* 205 */ bool no_block;
|
/* 201 */ int viral_range; // -- SPREAD_RADIUS
|
||||||
/* 206 */
|
/* 202 */ int songcap; // individual song cap -- BASE_EFFECTS_FOCUS_CAP
|
||||||
/* 207 */ int spellgroup;
|
/* 203 */ //bool stacks_with_self; // -- STACKS_WITH_SELF
|
||||||
/* 208 */ int rank; //increments AA effects with same name
|
/* 204 */ //int not_shown_to_player; // client skips this -- NOT_SHOWN_TO_PLAYER
|
||||||
/* 209 */ int no_resist; //makes spells unresistable, which makes charms unbreakable as well.
|
/* 205 */ bool no_block; // -- NO_BUFF_BLOCK
|
||||||
/* 210 */ // bool DurationFrozen; ???
|
/* 206 */ //int8 anim_variation; // -- ANIM_VARIATION
|
||||||
/* 211 */ int CastRestriction; //Various restriction categories for spells most seem targetable race related but have also seen others for instance only castable if target hp 20% or lower or only if target out of combat
|
/* 207 */ int spellgroup; // -- SPELL_GROUP
|
||||||
/* 212 */ bool AllowRest;
|
/* 208 */ int rank; //increments AA effects with same name -- SPELL_GROUP_RANK
|
||||||
/* 213 */ bool InCombat; //Allow spell if target is in combat
|
/* 209 */ int no_resist; //makes spells unresistable, which makes charms unbreakable as well. -- NO_RESIST
|
||||||
/* 214 */ bool OutofCombat; //Allow spell if target is out of combat
|
/* 210 */ // bool allow_spellscribe; // -- ALLOW_SPELLSCRIBE
|
||||||
/* 215 - 216 */
|
/* 211 */ int CastRestriction; //Various restriction categories for spells most seem targetable race related but have also seen others for instance only castable if target hp 20% or lower or only if target out of combat -- SPELL_REQ_ASSOCIATION_ID
|
||||||
/* 217 */ int override_crit_chance; //Places a cap on the max chance to critical
|
/* 212 */ bool AllowRest; // -- BYPASS_REGEN_CHECK
|
||||||
/* 218 */ int aemaxtargets; //Is used for various AE effects
|
/* 213 */ bool InCombat; //Allow spell if target is in combat -- CAN_CAST_IN_COMBAT
|
||||||
/* 219 */ int no_heal_damage_item_mod;
|
/* 214 */ bool OutofCombat; //Allow spell if target is out of combat -- CAN_CAST_OUT_OF_COMBAT
|
||||||
/* 220 - 223 */
|
/* 215 */ //bool show_dot_message; // -- SHOW_DOT_MESSAGE
|
||||||
/* 224 */ bool persistdeath; // buff doesn't get stripped on death
|
/* 216 */ //bool invalid; // -- INVALID
|
||||||
/* 225 - 226 */
|
/* 217 */ int override_crit_chance; //Places a cap on the max chance to critical -- OVERRIDE_CRIT_CHANCE
|
||||||
/* 227 */ float min_dist; //spell power modified by distance from caster (Min Distance)
|
/* 218 */ int aemaxtargets; //Is used for various AE effects -- MAX_TARGETS
|
||||||
/* 228 */ float min_dist_mod; //spell power modified by distance from caster (Modifier at Min Distance)
|
/* 219 */ int no_heal_damage_item_mod; // -- NO_HEAL_DAMAGE_ITEM_MOD
|
||||||
/* 229 */ float max_dist; //spell power modified by distance from caster (Max Distance)
|
/* 220 */ //int caster_requirement_id; // -- CASTER_REQUIREMENT_ID
|
||||||
/* 230 */ float max_dist_mod; //spell power modified by distance from caster (Modifier at Max Distance)
|
/* 221 */ //int spell_class; // -- SPELL_CLASS
|
||||||
/* 231 */ float min_range; //Min casting range
|
/* 222 */ //int spell_subclass; // -- SPELL_SUBCLASS
|
||||||
/* 232 */ bool no_remove; //prevents buff from being removed by click
|
/* 223 */ //int ai_valid_targets; // -- AI_VALID_TARGETS
|
||||||
/* 233 - 236 */
|
/* 224 */ bool persistdeath; // buff doesn't get stripped on death -- NO_STRIP_ON_DEATH
|
||||||
|
/* 225 */ //float base_effects_focus_slope; // -- BASE_EFFECTS_FOCUS_SLOPE
|
||||||
|
/* 226 */ //float base_effects_focus_offset; // -- BASE_EFFECTS_FOCUS_OFFSET
|
||||||
|
/* 227 */ float min_dist; //spell power modified by distance from caster (Min Distance) -- DISTANCE_MOD_CLOSE_DIST
|
||||||
|
/* 228 */ float min_dist_mod; //spell power modified by distance from caster (Modifier at Min Distance) -- DISTANCE_MOD_CLOSE_MULT
|
||||||
|
/* 229 */ float max_dist; //spell power modified by distance from caster (Max Distance) -- DISTANCE_MOD_FAR_DIST
|
||||||
|
/* 230 */ float max_dist_mod; //spell power modified by distance from caster (Modifier at Max Distance) -- DISTANCE_MOD_FAR_MULT
|
||||||
|
/* The client also does this
|
||||||
|
* v26 = *(float *)&v4->DistanceModFarDist - *(float *)&v4->DistanceModCloseDist;
|
||||||
|
* if ( v26 > -0.00000011920929 && v26 < 0.00000011920929 )
|
||||||
|
* v26 = 1.0;
|
||||||
|
* v27 = (st7_0 - *(float *)&v4->DistanceModCloseMult) / v26;
|
||||||
|
* *(float *)&v4->DistanceMod = v27;
|
||||||
|
*/
|
||||||
|
/* 231 */ float min_range; //Min casting range -- MIN_RANGE
|
||||||
|
/* 232 */ bool no_remove; //prevents buff from being removed by click -- NO_REMOVE
|
||||||
|
/* 233 */ //int spell_recourse_type; // -- SPELL_RECOURSE_TYPE
|
||||||
|
/* 234 */ //bool only_during_fast_regen; // -- ONLY_DURING_FAST_REGEN
|
||||||
|
/* 235 */ //bool is_beta_only; // -- IS_BETA_ONLY
|
||||||
|
/* 236 */ //int spell_subgroup; // -- SPELL_SUBGROUP
|
||||||
uint8 DamageShieldType; // This field does not exist in spells_us.txt
|
uint8 DamageShieldType; // This field does not exist in spells_us.txt
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -882,6 +902,9 @@ uint32 GetPartialMagicRuneReduction(uint32 spell_id);
|
|||||||
uint32 GetPartialMeleeRuneAmount(uint32 spell_id);
|
uint32 GetPartialMeleeRuneAmount(uint32 spell_id);
|
||||||
uint32 GetPartialMagicRuneAmount(uint32 spell_id);
|
uint32 GetPartialMagicRuneAmount(uint32 spell_id);
|
||||||
bool NoDetrimentalSpellAggro(uint16 spell_id);
|
bool NoDetrimentalSpellAggro(uint16 spell_id);
|
||||||
|
bool IsStackableDot(uint16 spell_id);
|
||||||
|
bool IsCastWhileInvis(uint16 spell_id);
|
||||||
|
bool IsEffectIgnoredInStacking(int spa);
|
||||||
|
|
||||||
int CalcPetHp(int levelb, int classb, int STA = 75);
|
int CalcPetHp(int levelb, int classb, int STA = 75);
|
||||||
const char *GetRandPetName();
|
const char *GetRandPetName();
|
||||||
|
|||||||
@@ -415,46 +415,3 @@ void find_replace(std::string& string_subject, const std::string& search_string,
|
|||||||
index = string_subject.find_first_of(search_string);
|
index = string_subject.find_first_of(search_string);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* EQEMu: Everquest Server Emulator
|
|
||||||
|
|
||||||
Copyright (C) 2001-2016 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void EQEmu::OutBuffer::overwrite(OutBuffer::pos_type position, const char *_Str, std::streamsize _Count)
|
|
||||||
{
|
|
||||||
auto last_pos = tellp();
|
|
||||||
seekp(position);
|
|
||||||
write(_Str, _Count);
|
|
||||||
seekp(last_pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
uchar* EQEmu::OutBuffer::detach()
|
|
||||||
{
|
|
||||||
size_t buffer_size = tellp();
|
|
||||||
if (buffer_size == 0)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
auto out_buffer = new uchar[buffer_size];
|
|
||||||
memcpy(out_buffer, str().c_str(), buffer_size);
|
|
||||||
flush();
|
|
||||||
|
|
||||||
return out_buffer;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -53,36 +53,4 @@ void MakeLowerString(const char *source, char *target);
|
|||||||
void RemoveApostrophes(std::string &s);
|
void RemoveApostrophes(std::string &s);
|
||||||
void find_replace(std::string& string_subject, const std::string& search_string, const std::string& replace_string);
|
void find_replace(std::string& string_subject, const std::string& search_string, const std::string& replace_string);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* EQEMu: Everquest Server Emulator
|
|
||||||
|
|
||||||
Copyright (C) 2001-2016 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
namespace EQEmu
|
|
||||||
{
|
|
||||||
class OutBuffer : public std::stringstream {
|
|
||||||
public:
|
|
||||||
inline size_t size() { return tellp(); }
|
|
||||||
void overwrite(OutBuffer::pos_type position, const char *_Str, std::streamsize _Count);
|
|
||||||
uchar* detach();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ StructStrategy::StructStrategy() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StructStrategy::Encode(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req) const {
|
void StructStrategy::Encode(EQApplicationPacket **p, std::shared_ptr<EQStreamInterface> dest, bool ack_req) const {
|
||||||
if((*p)->GetOpcodeBypass() != 0) {
|
if((*p)->GetOpcodeBypass() != 0) {
|
||||||
PassEncoder(p, dest, ack_req);
|
PassEncoder(p, dest, ack_req);
|
||||||
return;
|
return;
|
||||||
@@ -36,7 +36,7 @@ void StructStrategy::Decode(EQApplicationPacket *p) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void StructStrategy::ErrorEncoder(EQApplicationPacket **in_p, std::shared_ptr<EQStream> dest, bool ack_req) {
|
void StructStrategy::ErrorEncoder(EQApplicationPacket **in_p, std::shared_ptr<EQStreamInterface> dest, bool ack_req) {
|
||||||
EQApplicationPacket *p = *in_p;
|
EQApplicationPacket *p = *in_p;
|
||||||
*in_p = nullptr;
|
*in_p = nullptr;
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ void StructStrategy::ErrorDecoder(EQApplicationPacket *p) {
|
|||||||
p->SetOpcode(OP_Unknown);
|
p->SetOpcode(OP_Unknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StructStrategy::PassEncoder(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req) {
|
void StructStrategy::PassEncoder(EQApplicationPacket **p, std::shared_ptr<EQStreamInterface> dest, bool ack_req) {
|
||||||
dest->FastQueuePacket(p, ack_req);
|
dest->FastQueuePacket(p, ack_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
#define STRUCTSTRATEGY_H_
|
#define STRUCTSTRATEGY_H_
|
||||||
|
|
||||||
class EQApplicationPacket;
|
class EQApplicationPacket;
|
||||||
class EQStream;
|
class EQStreamInterface;
|
||||||
#include "emu_opcodes.h"
|
#include "emu_opcodes.h"
|
||||||
#include "client_version.h" // inv2 watch
|
#include "emu_versions.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@@ -12,7 +12,7 @@ class EQStream;
|
|||||||
class StructStrategy {
|
class StructStrategy {
|
||||||
public:
|
public:
|
||||||
//the encoder takes ownership of the supplied packet, and may enqueue multiple resulting packets into the stream
|
//the encoder takes ownership of the supplied packet, and may enqueue multiple resulting packets into the stream
|
||||||
typedef void(*Encoder)(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req);
|
typedef void(*Encoder)(EQApplicationPacket **p, std::shared_ptr<EQStreamInterface> dest, bool ack_req);
|
||||||
//the decoder may only edit the supplied packet, producing a single packet for eqemu to consume.
|
//the decoder may only edit the supplied packet, producing a single packet for eqemu to consume.
|
||||||
typedef void (*Decoder)(EQApplicationPacket *p);
|
typedef void (*Decoder)(EQApplicationPacket *p);
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
virtual ~StructStrategy() {}
|
virtual ~StructStrategy() {}
|
||||||
|
|
||||||
//this method takes an eqemu struct, and enqueues the produced structs into the stream.
|
//this method takes an eqemu struct, and enqueues the produced structs into the stream.
|
||||||
void Encode(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req) const;
|
void Encode(EQApplicationPacket **p, std::shared_ptr<EQStreamInterface> dest, bool ack_req) const;
|
||||||
//this method takes an EQ wire struct, and converts it into an eqemu struct
|
//this method takes an EQ wire struct, and converts it into an eqemu struct
|
||||||
void Decode(EQApplicationPacket *p) const;
|
void Decode(EQApplicationPacket *p) const;
|
||||||
|
|
||||||
@@ -30,10 +30,10 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
//some common coders:
|
//some common coders:
|
||||||
//Print an error saying unknown struct/opcode and drop it
|
//Print an error saying unknown struct/opcode and drop it
|
||||||
static void ErrorEncoder(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req);
|
static void ErrorEncoder(EQApplicationPacket **p, std::shared_ptr<EQStreamInterface> dest, bool ack_req);
|
||||||
static void ErrorDecoder(EQApplicationPacket *p);
|
static void ErrorDecoder(EQApplicationPacket *p);
|
||||||
//pass the packet through without modification (emu == EQ) (default)
|
//pass the packet through without modification (emu == EQ) (default)
|
||||||
static void PassEncoder(EQApplicationPacket **p, std::shared_ptr<EQStream> dest, bool ack_req);
|
static void PassEncoder(EQApplicationPacket **p, std::shared_ptr<EQStreamInterface> dest, bool ack_req);
|
||||||
static void PassDecoder(EQApplicationPacket *p);
|
static void PassDecoder(EQApplicationPacket *p);
|
||||||
|
|
||||||
Encoder encoders[_maxEmuOpcode];
|
Encoder encoders[_maxEmuOpcode];
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
|
||||||
|
Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "textures.h"
|
||||||
|
//#include "inventory_slot.h"
|
||||||
|
|
||||||
|
#include <string.h> // temp
|
||||||
|
|
||||||
|
|
||||||
|
//int EQEmu::textures::ConvertEquipmentSlotToTextureSlot(int equipment_slot)
|
||||||
|
//{
|
||||||
|
// switch (equipment_slot) {
|
||||||
|
// case inventory::PossessionsHead:
|
||||||
|
// return textures::TextureHead;
|
||||||
|
// case inventory::PossessionsChest:
|
||||||
|
// return textures::TextureChest;
|
||||||
|
// case inventory::PossessionsArms:
|
||||||
|
// return textures::TextureArms;
|
||||||
|
// case inventory::PossessionsWrist1:
|
||||||
|
// return textures::TextureWrist;
|
||||||
|
// case inventory::PossessionsHands:
|
||||||
|
// return textures::TextureHands;
|
||||||
|
// case inventory::PossessionsLegs:
|
||||||
|
// return textures::TextureLegs;
|
||||||
|
// case inventory::PossessionsFeet:
|
||||||
|
// return textures::TextureFeet;
|
||||||
|
// case inventory::PossessionsPrimary:
|
||||||
|
// return textures::TexturePrimary;
|
||||||
|
// case inventory::PossessionsSecondary:
|
||||||
|
// return textures::TextureSecondary;
|
||||||
|
// default:
|
||||||
|
// return textures::TextureInvalid;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//int EQEmu::textures::ConvertEquipmentSlotToTextureSlot(const InventorySlot &equipment_slot)
|
||||||
|
//{
|
||||||
|
// if (equipment_slot.Type() != inventory::InvTypePossessions || equipment_slot.Bag() != inventory::InvBagInvalid || equipment_slot.Aug() != inventory::InvAugInvalid)
|
||||||
|
// return textures::TextureInvalid;
|
||||||
|
//
|
||||||
|
// return ConvertEquipmentSlotToTextureSlot(equipment_slot.Slot());
|
||||||
|
//}
|
||||||
|
|
||||||
|
//EQEmu::InventorySlot EQEmu::textures::ConvertTextureSlotToEquipmentSlot(int texture_slot)
|
||||||
|
//{
|
||||||
|
// switch (texture_slot) {
|
||||||
|
// case textures::TextureHead:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsHead);
|
||||||
|
// case textures::TextureChest:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsChest);
|
||||||
|
// case textures::TextureArms:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsArms);
|
||||||
|
// case textures::TextureWrist:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsWrist1);
|
||||||
|
// case textures::TextureHands:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsHands);
|
||||||
|
// case textures::TextureLegs:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsLegs);
|
||||||
|
// case textures::TextureFeet:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsFeet);
|
||||||
|
// case textures::TexturePrimary:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsPrimary);
|
||||||
|
// case textures::TextureSecondary:
|
||||||
|
// return EQEmu::InventorySlot(inventory::InvTypePossessions, inventory::PossessionsSecondary);
|
||||||
|
// default:
|
||||||
|
// return EQEmu::InventorySlot();
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
EQEmu::TextureProfile::TextureProfile()
|
||||||
|
{
|
||||||
|
memset(&Slot, 0, (sizeof(Texture_Struct) * textures::TextureCount));
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::TextureShortProfile::TextureShortProfile()
|
||||||
|
{
|
||||||
|
memset(&Slot, 0, (sizeof(uint32) * textures::TextureCount));
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::TintProfile::TintProfile()
|
||||||
|
{
|
||||||
|
memset(&Slot, 0, (sizeof(uint32) * textures::TextureCount));
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
|
||||||
|
Copyright (C) 2001-2016 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 COMMON_TEXTURES_H
|
||||||
|
#define COMMON_TEXTURES_H
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace EQEmu
|
||||||
|
{
|
||||||
|
//class InventorySlot;
|
||||||
|
|
||||||
|
namespace textures {
|
||||||
|
//enum : int { TextureInvalid = -1, TextureBegin };
|
||||||
|
enum : uint8 { TextureInvalid = 255, TextureBegin = 0 };
|
||||||
|
|
||||||
|
//enum TextureSlot : int {
|
||||||
|
enum TextureSlot : uint8 {
|
||||||
|
TextureHead = TextureBegin,
|
||||||
|
TextureChest,
|
||||||
|
TextureArms,
|
||||||
|
TextureWrist,
|
||||||
|
TextureHands,
|
||||||
|
TextureLegs,
|
||||||
|
TextureFeet,
|
||||||
|
TexturePrimary,
|
||||||
|
TextureSecondary,
|
||||||
|
TextureCount
|
||||||
|
};
|
||||||
|
|
||||||
|
const int LastTexture = TextureSecondary;
|
||||||
|
const int LastTintableTexture = TextureFeet;
|
||||||
|
|
||||||
|
//extern int ConvertEquipmentSlotToTextureSlot(int equipment_slot);
|
||||||
|
//extern int ConvertEquipmentSlotToTextureSlot(const InventorySlot &equipment_slot);
|
||||||
|
//extern InventorySlot ConvertTextureSlotToEquipmentSlot(int texture_slot);
|
||||||
|
|
||||||
|
} /*textures*/
|
||||||
|
|
||||||
|
struct Texture_Struct {
|
||||||
|
uint32 Material;
|
||||||
|
uint32 Unknown1;
|
||||||
|
uint32 EliteMaterial;
|
||||||
|
uint32 HeroForgeModel;
|
||||||
|
uint32 Material2; // Same as material?
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TextureProfile {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Texture_Struct Head;
|
||||||
|
Texture_Struct Chest;
|
||||||
|
Texture_Struct Arms;
|
||||||
|
Texture_Struct Wrist;
|
||||||
|
Texture_Struct Hands;
|
||||||
|
Texture_Struct Legs;
|
||||||
|
Texture_Struct Feet;
|
||||||
|
Texture_Struct Primary;
|
||||||
|
Texture_Struct Secondary;
|
||||||
|
};
|
||||||
|
Texture_Struct Slot[textures::TextureCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
TextureProfile();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TextureShort_Struct {
|
||||||
|
uint32 Material;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TextureShortProfile {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
TextureShort_Struct Head;
|
||||||
|
TextureShort_Struct Chest;
|
||||||
|
TextureShort_Struct Arms;
|
||||||
|
TextureShort_Struct Wrist;
|
||||||
|
TextureShort_Struct Hands;
|
||||||
|
TextureShort_Struct Legs;
|
||||||
|
TextureShort_Struct Feet;
|
||||||
|
TextureShort_Struct Primary;
|
||||||
|
TextureShort_Struct Secondary;
|
||||||
|
};
|
||||||
|
TextureShort_Struct Slot[textures::TextureCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
TextureShortProfile();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Tint_Struct {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
uint8 Blue;
|
||||||
|
uint8 Green;
|
||||||
|
uint8 Red;
|
||||||
|
uint8 UseTint; // if there's a tint this is FF
|
||||||
|
};
|
||||||
|
uint32 Color;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Tint_Struct();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TintProfile {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Tint_Struct Head;
|
||||||
|
Tint_Struct Chest;
|
||||||
|
Tint_Struct Arms;
|
||||||
|
Tint_Struct Wrist;
|
||||||
|
Tint_Struct Hands;
|
||||||
|
Tint_Struct Legs;
|
||||||
|
Tint_Struct Feet;
|
||||||
|
Tint_Struct Primary;
|
||||||
|
Tint_Struct Secondary;
|
||||||
|
};
|
||||||
|
Tint_Struct Slot[textures::TextureCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
TintProfile();
|
||||||
|
};
|
||||||
|
|
||||||
|
} /*EQEmu*/
|
||||||
|
|
||||||
|
#endif /*COMMON_TEXTURES_H*/
|
||||||
+2
-2
@@ -30,9 +30,9 @@
|
|||||||
Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CURRENT_BINARY_DATABASE_VERSION 9096
|
#define CURRENT_BINARY_DATABASE_VERSION 9100
|
||||||
#ifdef BOTS
|
#ifdef BOTS
|
||||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9006
|
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9008
|
||||||
#else
|
#else
|
||||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 0 // must be 0
|
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 0 // must be 0
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
extern EQEmuLogSys Log;
|
extern EQEmuLogSys Log;
|
||||||
extern LoginServer server;
|
extern LoginServer server;
|
||||||
|
|
||||||
Client::Client(std::shared_ptr<EQStream> c, LSClientVersion v)
|
Client::Client(std::shared_ptr<EQStreamInterface> c, LSClientVersion v)
|
||||||
{
|
{
|
||||||
connection = c;
|
connection = c;
|
||||||
version = v;
|
version = v;
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Constructor, sets our connection to c and version to v
|
* Constructor, sets our connection to c and version to v
|
||||||
*/
|
*/
|
||||||
Client(std::shared_ptr<EQStream> c, LSClientVersion v);
|
Client(std::shared_ptr<EQStreamInterface> c, LSClientVersion v);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destructor.
|
* Destructor.
|
||||||
@@ -129,11 +129,11 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Gets the connection for this client.
|
* Gets the connection for this client.
|
||||||
*/
|
*/
|
||||||
std::shared_ptr<EQStream> GetConnection() { return connection; }
|
std::shared_ptr<EQStreamInterface> GetConnection() { return connection; }
|
||||||
|
|
||||||
EQEmu::Random random;
|
EQEmu::Random random;
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<EQStream> connection;
|
std::shared_ptr<EQStreamInterface> connection;
|
||||||
LSClientVersion version;
|
LSClientVersion version;
|
||||||
LSClientStatus status;
|
LSClientStatus status;
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ ClientManager::~ClientManager()
|
|||||||
void ClientManager::Process()
|
void ClientManager::Process()
|
||||||
{
|
{
|
||||||
ProcessDisconnect();
|
ProcessDisconnect();
|
||||||
std::shared_ptr<EQStream> cur = titanium_stream->Pop();
|
std::shared_ptr<EQStreamInterface> cur = titanium_stream->Pop();
|
||||||
while(cur)
|
while(cur)
|
||||||
{
|
{
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
@@ -142,8 +142,8 @@ void ClientManager::ProcessDisconnect()
|
|||||||
list<Client*>::iterator iter = clients.begin();
|
list<Client*>::iterator iter = clients.begin();
|
||||||
while(iter != clients.end())
|
while(iter != clients.end())
|
||||||
{
|
{
|
||||||
std::shared_ptr<EQStream> c = (*iter)->GetConnection();
|
std::shared_ptr<EQStreamInterface> c = (*iter)->GetConnection();
|
||||||
if(c->CheckClosed())
|
if(c->CheckState(CLOSED))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Client disconnected from the server, removing client.");
|
Log.Out(Logs::General, Logs::Login_Server, "Client disconnected from the server, removing client.");
|
||||||
delete (*iter);
|
delete (*iter);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "../common/ipc_mutex.h"
|
#include "../common/ipc_mutex.h"
|
||||||
#include "../common/memory_mapped_file.h"
|
#include "../common/memory_mapped_file.h"
|
||||||
#include "../common/eqemu_exception.h"
|
#include "../common/eqemu_exception.h"
|
||||||
#include "../common/item_struct.h"
|
#include "../common/item_base.h"
|
||||||
|
|
||||||
void LoadItems(SharedDatabase *database, const std::string &prefix) {
|
void LoadItems(SharedDatabase *database, const std::string &prefix) {
|
||||||
EQEmu::IPCMutex mutex("items");
|
EQEmu::IPCMutex mutex("items");
|
||||||
@@ -35,7 +35,7 @@ void LoadItems(SharedDatabase *database, const std::string &prefix) {
|
|||||||
EQ_EXCEPT("Shared Memory", "Unable to get any items from the database.");
|
EQ_EXCEPT("Shared Memory", "Unable to get any items from the database.");
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 size = static_cast<uint32>(EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct>::estimated_size(items, max_item));
|
uint32 size = static_cast<uint32>(EQEmu::FixedMemoryHashSet<EQEmu::ItemBase>::estimated_size(items, max_item));
|
||||||
|
|
||||||
auto Config = EQEmuConfig::get();
|
auto Config = EQEmuConfig::get();
|
||||||
std::string file_name = Config->SharedMemDir + prefix + std::string("items");
|
std::string file_name = Config->SharedMemDir + prefix + std::string("items");
|
||||||
|
|||||||
+23
-23
@@ -27,7 +27,7 @@ class FixedMemoryHashTest : public Test::Suite {
|
|||||||
typedef void(FixedMemoryHashTest::*TestFunction)(void);
|
typedef void(FixedMemoryHashTest::*TestFunction)(void);
|
||||||
public:
|
public:
|
||||||
FixedMemoryHashTest() {
|
FixedMemoryHashTest() {
|
||||||
size_ = EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct>::estimated_size(72000, 190000);
|
size_ = EQEmu::FixedMemoryHashSet<EQEmu::ItemBase>::estimated_size(72000, 190000);
|
||||||
data_ = new uint8[size_];
|
data_ = new uint8[size_];
|
||||||
memset(data_, 0, size_);
|
memset(data_, 0, size_);
|
||||||
TEST_ADD(FixedMemoryHashTest::InitTest);
|
TEST_ADD(FixedMemoryHashTest::InitTest);
|
||||||
@@ -49,7 +49,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void InitTest() {
|
void InitTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_, 72000, 190000);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_, 72000, 190000);
|
||||||
TEST_ASSERT(!hash.exists(1001));
|
TEST_ASSERT(!hash.exists(1001));
|
||||||
TEST_ASSERT(hash.size() == 0);
|
TEST_ASSERT(hash.size() == 0);
|
||||||
TEST_ASSERT(hash.max_size() == 72000);
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
@@ -57,7 +57,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LoadTest() {
|
void LoadTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
TEST_ASSERT(!hash.exists(1001));
|
TEST_ASSERT(!hash.exists(1001));
|
||||||
TEST_ASSERT(hash.size() == 0);
|
TEST_ASSERT(hash.size() == 0);
|
||||||
TEST_ASSERT(hash.max_size() == 72000);
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
@@ -65,8 +65,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void InsertTest() {
|
void InsertTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
EQEmu::Item_Struct item;
|
EQEmu::ItemBase item;
|
||||||
memset(&item, 0, sizeof(item));
|
memset(&item, 0, sizeof(item));
|
||||||
strcpy(item.Name, "Iron Sword");
|
strcpy(item.Name, "Iron Sword");
|
||||||
item.ID = 1001;
|
item.ID = 1001;
|
||||||
@@ -79,20 +79,20 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RetrieveTest() {
|
void RetrieveTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
TEST_ASSERT(hash.exists(1001));
|
TEST_ASSERT(hash.exists(1001));
|
||||||
TEST_ASSERT(hash.size() == 1);
|
TEST_ASSERT(hash.size() == 1);
|
||||||
TEST_ASSERT(hash.max_size() == 72000);
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
TEST_ASSERT(!hash.empty());
|
TEST_ASSERT(!hash.empty());
|
||||||
|
|
||||||
EQEmu::Item_Struct item = hash[1001];
|
EQEmu::ItemBase item = hash[1001];
|
||||||
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
||||||
TEST_ASSERT(item.ID == 1001);
|
TEST_ASSERT(item.ID == 1001);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OverwriteTest() {
|
void OverwriteTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
EQEmu::Item_Struct item;
|
EQEmu::ItemBase item;
|
||||||
memset(&item, 0, sizeof(item));
|
memset(&item, 0, sizeof(item));
|
||||||
strcpy(item.Name, "Steel Sword");
|
strcpy(item.Name, "Steel Sword");
|
||||||
item.ID = 1001;
|
item.ID = 1001;
|
||||||
@@ -105,20 +105,20 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OverwriteRetrieveTest() {
|
void OverwriteRetrieveTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
TEST_ASSERT(hash.exists(1001));
|
TEST_ASSERT(hash.exists(1001));
|
||||||
TEST_ASSERT(hash.size() == 1);
|
TEST_ASSERT(hash.size() == 1);
|
||||||
TEST_ASSERT((hash.max_size() == 72000));
|
TEST_ASSERT((hash.max_size() == 72000));
|
||||||
TEST_ASSERT(!hash.empty());
|
TEST_ASSERT(!hash.empty());
|
||||||
|
|
||||||
EQEmu::Item_Struct item = hash[1001];
|
EQEmu::ItemBase item = hash[1001];
|
||||||
TEST_ASSERT(strcmp(item.Name, "Steel Sword") == 0);
|
TEST_ASSERT(strcmp(item.Name, "Steel Sword") == 0);
|
||||||
TEST_ASSERT(item.ID == 1001);
|
TEST_ASSERT(item.ID == 1001);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InsertAgainTest() {
|
void InsertAgainTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
EQEmu::Item_Struct item;
|
EQEmu::ItemBase item;
|
||||||
memset(&item, 0, sizeof(item));
|
memset(&item, 0, sizeof(item));
|
||||||
strcpy(item.Name, "Iron Sword");
|
strcpy(item.Name, "Iron Sword");
|
||||||
item.ID = 1000;
|
item.ID = 1000;
|
||||||
@@ -132,14 +132,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RetrieveAgainTest() {
|
void RetrieveAgainTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
TEST_ASSERT(hash.exists(1000));
|
TEST_ASSERT(hash.exists(1000));
|
||||||
TEST_ASSERT(hash.exists(1001));
|
TEST_ASSERT(hash.exists(1001));
|
||||||
TEST_ASSERT(hash.size() == 2);
|
TEST_ASSERT(hash.size() == 2);
|
||||||
TEST_ASSERT(hash.max_size() == 72000);
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
TEST_ASSERT(!hash.empty());
|
TEST_ASSERT(!hash.empty());
|
||||||
|
|
||||||
EQEmu::Item_Struct item = hash[1000];
|
EQEmu::ItemBase item = hash[1000];
|
||||||
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
||||||
TEST_ASSERT(item.ID == 1000);
|
TEST_ASSERT(item.ID == 1000);
|
||||||
|
|
||||||
@@ -149,8 +149,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void InsertBeginTest() {
|
void InsertBeginTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
EQEmu::Item_Struct item;
|
EQEmu::ItemBase item;
|
||||||
memset(&item, 0, sizeof(item));
|
memset(&item, 0, sizeof(item));
|
||||||
strcpy(item.Name, "Bronze Sword");
|
strcpy(item.Name, "Bronze Sword");
|
||||||
item.ID = 0;
|
item.ID = 0;
|
||||||
@@ -165,7 +165,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RetrieveBeginTest() {
|
void RetrieveBeginTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
TEST_ASSERT(hash.exists(1000));
|
TEST_ASSERT(hash.exists(1000));
|
||||||
TEST_ASSERT(hash.exists(1001));
|
TEST_ASSERT(hash.exists(1001));
|
||||||
TEST_ASSERT(hash.exists(0));
|
TEST_ASSERT(hash.exists(0));
|
||||||
@@ -173,7 +173,7 @@ public:
|
|||||||
TEST_ASSERT(hash.max_size() == 72000);
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
TEST_ASSERT(!hash.empty());
|
TEST_ASSERT(!hash.empty());
|
||||||
|
|
||||||
EQEmu::Item_Struct item = hash[1000];
|
EQEmu::ItemBase item = hash[1000];
|
||||||
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
||||||
TEST_ASSERT(item.ID == 1000);
|
TEST_ASSERT(item.ID == 1000);
|
||||||
|
|
||||||
@@ -187,8 +187,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void InsertEndTest() {
|
void InsertEndTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
EQEmu::Item_Struct item;
|
EQEmu::ItemBase item;
|
||||||
memset(&item, 0, sizeof(item));
|
memset(&item, 0, sizeof(item));
|
||||||
strcpy(item.Name, "Jade Sword");
|
strcpy(item.Name, "Jade Sword");
|
||||||
item.ID = 190000;
|
item.ID = 190000;
|
||||||
@@ -204,7 +204,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RetrieveEndTest() {
|
void RetrieveEndTest() {
|
||||||
EQEmu::FixedMemoryHashSet<EQEmu::Item_Struct> hash(data_, size_);
|
EQEmu::FixedMemoryHashSet<EQEmu::ItemBase> hash(data_, size_);
|
||||||
TEST_ASSERT(hash.exists(1000));
|
TEST_ASSERT(hash.exists(1000));
|
||||||
TEST_ASSERT(hash.exists(1001));
|
TEST_ASSERT(hash.exists(1001));
|
||||||
TEST_ASSERT(hash.exists(0));
|
TEST_ASSERT(hash.exists(0));
|
||||||
@@ -213,7 +213,7 @@ public:
|
|||||||
TEST_ASSERT(hash.max_size() == 72000);
|
TEST_ASSERT(hash.max_size() == 72000);
|
||||||
TEST_ASSERT(!hash.empty());
|
TEST_ASSERT(!hash.empty());
|
||||||
|
|
||||||
EQEmu::Item_Struct item = hash[1000];
|
EQEmu::ItemBase item = hash[1000];
|
||||||
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0);
|
||||||
TEST_ASSERT(item.ID == 1000);
|
TEST_ASSERT(item.ID == 1000);
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -485,7 +485,7 @@ Clientlist::Clientlist(int ChatPort) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Client::Client(std::shared_ptr<EQStream> eqs) {
|
Client::Client(std::shared_ptr<EQStreamInterface> eqs) {
|
||||||
|
|
||||||
ClientStream = eqs;
|
ClientStream = eqs;
|
||||||
|
|
||||||
@@ -574,7 +574,7 @@ void Clientlist::CheckForStaleConnections(Client *c) {
|
|||||||
|
|
||||||
void Clientlist::Process()
|
void Clientlist::Process()
|
||||||
{
|
{
|
||||||
std::shared_ptr<EQStream> eqs;
|
std::shared_ptr<EQStreamInterface> eqs;
|
||||||
|
|
||||||
while ((eqs = chatsf->Pop())) {
|
while ((eqs = chatsf->Pop())) {
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
@@ -592,7 +592,7 @@ void Clientlist::Process()
|
|||||||
auto it = ClientChatConnections.begin();
|
auto it = ClientChatConnections.begin();
|
||||||
while (it != ClientChatConnections.end()) {
|
while (it != ClientChatConnections.end()) {
|
||||||
(*it)->AccountUpdate();
|
(*it)->AccountUpdate();
|
||||||
if ((*it)->ClientStream->CheckClosed()) {
|
if ((*it)->ClientStream->CheckState(CLOSED)) {
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
in.s_addr = (*it)->ClientStream->GetRemoteIP();
|
in.s_addr = (*it)->ClientStream->GetRemoteIP();
|
||||||
|
|
||||||
@@ -1985,7 +1985,7 @@ void Client::ChannelGrantVoice(std::string CommandString) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(RequiredChannel->IsOwner(RequiredClient->GetName()) || RequiredChannel->IsModerator(RequiredClient->GetName())) {
|
if(RequiredClient && (RequiredChannel->IsOwner(RequiredClient->GetName()) || RequiredChannel->IsModerator(RequiredClient->GetName()))) {
|
||||||
|
|
||||||
GeneralChannelMessage("The channel owner and moderators automatically have voice.");
|
GeneralChannelMessage("The channel owner and moderators automatically have voice.");
|
||||||
return;
|
return;
|
||||||
|
|||||||
+2
-2
@@ -84,10 +84,10 @@ struct CharacterEntry {
|
|||||||
class Client {
|
class Client {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Client(std::shared_ptr<EQStream> eqs);
|
Client(std::shared_ptr<EQStreamInterface> eqs);
|
||||||
~Client();
|
~Client();
|
||||||
|
|
||||||
std::shared_ptr<EQStream> ClientStream;
|
std::shared_ptr<EQStreamInterface> ClientStream;
|
||||||
void AddCharacter(int CharID, const char *CharacterName, int Level);
|
void AddCharacter(int CharID, const char *CharacterName, int Level);
|
||||||
void ClearCharacters() { Characters.clear(); }
|
void ClearCharacters() { Characters.clear(); }
|
||||||
void SendMailBoxes();
|
void SendMailBoxes();
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user