diff --git a/CMakeLists.txt b/CMakeLists.txt
index 494959cbc..ec126b241 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -30,6 +30,7 @@
#EQEMU_BUILD_LUA
#EQEMU_SANITIZE_LUA_LIBS
#EQEMU_BUILD_CLIENT_FILES
+#EQEMU_USE_MAP_MMFS
#EQEMU_MAP_DIR
#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)
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.")
ADD_DEFINITIONS(-DEQDEBUG=${EQEMU_DEBUG_LEVEL})
diff --git a/README.md b/README.md
index 0c973ed43..057937a0c 100644
--- a/README.md
+++ b/README.md
@@ -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
-- libperl-dev
-- liblua5.1-0-dev (5.2 should work as well)
-- libboost-dev
+## Supported Clients
-Further instructions on building the source can be found on the
-[wiki](http://wiki.eqemulator.org/i?M=Wiki).
+|Titanium Edition|Secrets of Faydwer|Seeds of Destruction|Underfoot|Rain of Fear|
+|:---:|:---:|:---:|:---:|:---:|
+|
|
|
|
|
|
-Bug reports
----
-
-Please use the [issue tracker](https://github.com/EQEmu/Server/issues) provided by GitHub to send us bug
+## Bug Reports
+* Please use the [issue tracker](https://github.com/EQEmu/Server/issues) provided by GitHub to send us bug
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
-bugs/get help with bugs.
+## Contributions
-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
-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)
forum, although pull requests will be much quicker and easier on all parties.
-Contact
----
- - **User IRC Channel**: `#eqemu` on `irc.eqemulator.net`
- - **Developer IRC Channel**: `#eqemucoders` on `irc.eqemulator.net`
+## Contact
+ - Discord Channel: https://discord.gg/QHsm7CD
+ - **User Discord Channel**: `#general`
+ - **Developer Discord Channel**: `#eqemucoders`
+
+Resources
+---
- [EQEmulator Forums](http://www.eqemulator.org/forums)
- [EQEmulator Wiki](http://wiki.eqemulator.org/i?M=Wiki)
-
diff --git a/changelog.txt b/changelog.txt
index e3762b3dd..7386c7602 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,449 @@
EQEMu Changelog (Started on Sept 24, 2003 15:50)
-------------------------------------------------------
+== 4/1/2017 ==
+Akkadius: Cleaned up some of the NPC to NPC aggro code, only do aggro checks to other NPC's when the NPC is flagged for it
+Akkadius: [Performance] Reworked how all log calls are made in the source
+ - Before we used Log.Out, we will now use a macro Log(
+ - Before: Log.Out(Logs::General, Logs::Status, "Importing Spells...");
+ - After: Log(Logs::General, Logs::Status, "Importing Spells...");
+ - The difference is
+ 1) It's 200-300x faster especially when log statements are inside very hot code paths. We already
+ had most hot paths checked before we logged them, but this blankets all existing logging calls now and not just the
+ select few we had picked out in the source.
+ 2) Strings don't get copied to the stack, popped and pushed constantly even when we hit a log statement that
+ actually isn't going to log anything.
+ - We do an 'if (LogSys.log_settings[log_category].is_category_enabled == 1)' before we call a log function
+ in the log macro so the log function doesn't get called at all if we're not logging the category
+ - This has increased binary executables roughly 15KB
+ - The old extern for EQEmuLogSys is now named LogSys appropriately instead of Log (Ex: LogSys.StartFileLogs())
+ - The result keeps logging footprint non-existent for when we're not logging that category
+
+== 03/30/2017 ==
+Akkadius: [Performance] Fixed an overhead issue where many hot paths would trigger quest subroutines and beneath that the code would
+ try to see if a quest existed perpetually (checking if file exists) even though it should have determined the quest
+ didn't exist the first time.
+ - This caused a lot of overhead in an instance where an entire zone of NPC's is pathing, triggering EVENT_WAYPOINT_ARRIVE
+ and EVENT_WAYPOINT_DEPART when there is no global_npc.pl/lua, or all NPC's pathing don't have a quest assigned, similar
+ behavior would occur. This goes for any other type of quests: spells, items, encounters etc.
+
+== 03/28/2017 ==
+Akkadius: [Performance] Fixed a large overhead issue where every single NPC in a zone was checking to depop themselves
+ as a swarm pet every 3ms regardless of being a swarm pet or not. Swarm pets now check to depop only when their timer is up
+Akkadius: [Performance] Removed a timer where clients would constantly calculate light amount on equipment every 600ms, instead
+ clients will update light when changing equipment or entering a zone
+Akkadius: [Performance] Disabled enraged timer checks for NPC's that do not actually have enrage as a special attack
+Akkadius: [Performance] Don't process ProjectileAttack checks for NPC's that are not engaged in any combat
+
+== 03/27/2017 ==
+Akkadius: [Performance] Reworked how client to NPC aggro checks are made
+ - Before when reverse aggro checks were done (client to NPC), checks would happen every 750 millseconds where a client would
+ check an entire entity list with distance calcs and other checks for aggro, with many clients in a zone and many NPC's this would
+ add a lot of unecessary overhead. A temporary adjustment on 3/25 was made and upped the check to 6 seconds.
+ - Now, there is a new methodology to scanning. The client will build a cache list of NPC's within close range as defined in new rule:
+ RULE_INT(Range, ClientNPCScan, 300) and will also get any NPC that has an aggro range beyond that defined range to use in
+ the frequent checks for aggro, the result is far less overhead
+ - Client scanning changes when moving versus not moving, the client will scan aggro every 500 milliseconds while moving, and
+ 3000 millseconds aggro check when not moving, with a 6000ms re-fetch for close NPC's
+ - A demo of these changes can be found here:
+ https://youtu.be/aGroiwLSTVU
+
+== 03/25/2017 ==
+Akkadius: [Performance] Reduced CPU footprint in non-combat zones doing constant checks for combat related activities
+Akkadius: [Performance] Reduced CPU footprint in cases where a client is checking for aggro excessively every 750 millseconds. This has
+ been adjusted to 6 seconds per new rule RULE_INT(Aggro, ClientAggroCheckInterval)
+ - When zones have many players, with many NPC's, this adds up quickly
+
+== 03/12/2017 ==
+Akkadius: [Performance]
+- Implemented range rules for packets and other functions
+ RULE_INT ( Range, Say, 135 )
+ RULE_INT ( Range, Emote, 135 )
+ RULE_INT ( Range, BeginCast, 200)
+ RULE_INT ( Range, Anims, 135)
+ RULE_INT ( Range, SpellParticles, 135)
+ RULE_INT ( Range, DamageMessages, 50)
+ RULE_INT ( Range, SpellMessages, 75)
+ RULE_INT ( Range, SongMessages, 75)
+ RULE_INT ( Range, MobPositionUpdates, 600)
+ RULE_INT ( Range, CriticalDamage, 80)
+
+ - (Readability) Also cleaned up some formatting in messaging and packets so it is easier to understand what is going on with the code
+
+== 03/09/2017 ==
+Uleat: Fixed a few glitches related to bot trading and other affected code
+ - Added a temporary fail clause for partial stack transfers to prevent client item overwrites
+ - Return messages no longer repeat the top cursor item when multiple items are pushed there
+ - Test slot for client returns is now handled appropriately for parent and bag searches
+ - FindFreeSlotForTradeItem() now begins at the correct bag index on subsequent parent iterations
+Uleat: First step of implementing inventory v2.0
+
+== 03/08/2017 ==
+Uleat: Complete rework of the bot trading system
+ - Equipment slot priority can now be tailored..though, a recompile will be required
+ - All item validations and slot assignments for trades and returns are now performed before any actual item movements occur
+ - Failed trade/returned items will now go straight into the client's inventory, just like a normal trade transaction
+ - A 'green' message appears at the end of each successful trade informing the trader of 'accepted' and 'returned' item counts
+ - Bots respond to the trader directly now instead of using BotGroupSay()
+ - Bots will still only allow trades from their owner (currently, too high a risk of exploit and/or malicious activity)
+ - Partial stack movements (i.e., ammo refills) have been scoped..but, not implemented
+ - I have not been able to reproduce any 'illegal' weapon combinations with this code
+ - NOTE: The report of item duplication with bot return items appears to be an inventory desync condition
+ - I experienced this condition both before and after the rework with RoF+ clients (UF- appears ok)
+ - The bug lies within the actual client inventory system and not with bot trades
+ - Please post any issues with this change as they arise
+
+== 02/27/2017 ==
+Uleat: Notes on bot movement speed changes:
+ - Clients (players) appear to be on a different speed scale than other entities (NPCs, etc...)
+ - The server does not calculate deltas/velocities for moving players..those come the client itself
+ - GetBotWalkspeed() and GetBotRunspeed() are specific to bot movement calculations
+ - The class Mob equivilents are not scalared so that a 'client-oriented' value can still be attained
+ - The value of ~1.786f is derived from the ratio of 1.25f/0.7f (npc speed/client speed)
+ - Modifying the two speeds like this is a rough guess-timate..but, appears to at least bring the incongruous behavior to acceptable levels
+
+== 02/26/2017 ==
+Uleat: Moved bot `npc_spells` entries from '701-712' to 3000 + .. also, added melee types for future expansion
+Uleat: Moved bot spell casting chance values into database - this will allow admins to tailor their bots without having to rebuild server code
+ - Each entry uses a 3-dimensional identifier: [spell type index][class id][stance index]
+ - [spell type index] is not the SpellType_## bit value..use SpellType_##Index instead
+ - [class id] values of 1-16 are valid and hold a direct correlation to server-coded player class values
+ - [stance index] is a direct correlation (0-6)
+ - the 'conditional fields' are currently predicated on 4 compounded boolean states:
+ - `pH_value` represents bit '0'
+ - `pS_value` represents bit '1'
+ - `pN_value` represents bit '2'
+ - `pD_value` represents bit '3'
+ - all other conditional fields are masked based on these 4 predicates
+ - the full conditional field enumeration is as follows:
+ - `nHSND_value` - negative Healer/Slower/Nuker/Doter
+ - `pH_value` - positive Healer
+ - `pS_value` - positive Slower
+ - `pHS_value` - positive Healer/Slower
+ - `pN_value` - positive Nuker
+ - `pHN_value` - positive Healer/Nuker
+ - `pSN_value` - positive Slower/Nuker
+ - `pHSN_value` - positive Healer/Slower/Nuker
+ - `pD_value` - positive Doter
+ - `pHD_value` - positive Healer/Doter
+ - `pSD_value` - positive Slower/Doter
+ - `pHSD_value` - positive Healer/Slower/Doter
+ - `pND_value` - positive Nuker/Doter
+ - `pHND_value` - positive Healer/Nuker/Doter
+ - `pSND_value` - positive Slower/Nuker/Doter
+ - `pHSND_value` - positive Healer/Slower/Nuker/Doter
+ - Single- and mixed-bits fields should be filled-in based on the boolean 'AND' concept
+ - (i.e., if 'healer' then `pH_value`=x; if 'slower' then `pS_value`=y; if 'healer' AND 'slower' then `pHS_value`=z; )
+ - most cases can allow the same value across all fields..but, there are some that shouldn't and this format allows for their discrimination
+ - Valid `##_value` entries are 0-100..though, the field accepts up to 255... Anything above 100 is clamped to 100 upon loading, however...
+ - Not all conditions are currently coded and changing a field may not produce any results
+ - The 'default' database values will be changed and tweaked as bot spell code modifications occur
+
+== 02/25/2017 ==
+Uleat: Implemented rule-based node pathing for bots
+ - This currently applies to out-of-combat following movement and blocked los in-combat movement
+ - The default is set to 'true' (use node pathing)..so, consider disabling it if cpu use is too high
+ - If you want to disable node pathing, apply the optional sql '2017_02_25_bots_use_pathing_rule.sql' file located in the utils/sql/git/bots/optional sub-directory. This will apply a 'false' rule..but, it can be changed as desired
+ - This helps with bot movement..but, there are still issues...
+Uleat: Implemented rule-based position update packet with movement timer check for bots
+ - This currently only applies to out-of-combat movement
+ - The default is set to 'false' (original behavior) to help save bandwidth (each bot will send an update packet every 1/10th of a second when enabled)
+ - If you want to enable the position update packet, apply the optional sql '2017_02_25_bots_update_position_with_timer_rule.sql' file located in the utils/sql/git/bots/optional sub-directory. This will apply a 'true' rule..but, it can be changed as desired
+ - This appears to help with/eliminate rubber banding
+
+== 02/23/2017 ==
+** THIS NOTE HAS BEEN SUPERCEDED ON 02/26/2017 **
+Uleat: Moved bot spell casting chance values into database - this will allow admins to tailor their bots without having to rebuild server code
+ - Each entry uses a 4-dimensional identifier: [spell type index][class index][stance index][conditional index]
+ - [spell type index] is not the SpellType_## bit value..use SpellType_##Index instead
+ - [class index] values of 0-15 are valid and determined by subtracting 1 from the actual class value
+ - [stance index] is a direct correlation (0-6)
+ - the [conditional index] is currently predicated on 2 compounded boolean states:
+ - not primary healer/not primary slower: 0
+ - primary healer/not primary slower: 1
+ - not primary healer/ primary slower: 2
+ - primary healer/primary slower: 3
+ - Valid `value` entries are 0-100..though, the field accepts up to 255... Anything above 100 is clamped to 100 upon loading, however
+ - Not all conditions are currently coded and changing a field may not produce any results
+ - The 'default' database values will be changed and tweaked as bot spell code modifications occur
+
+== 02/20/2017 ==
+Uleat: Reworked bard bot spell twisting and updated their spell (song) list
+Uleat: Added ability to shift to pre-combat song buffing by selecting a non-pet npc target, eliminating the need to mix all bard buff songs together
+
+== 2/19/2017 ==
+Akkadius: Added a fix for limiting the amount of items sold in a stack when the resulting return coin is higher than the supporting struct for returning coin
+
+== 01/31/2017 ==
+Uleat: Modifed bot movement behavior in an attempt to 'normalize' it. This is a hack fix and will be revisited at some point. (Probably just need a follow function rather than use movement, when the leader of the follow chain is moving.)
+
+== 01/26/2017 ==
+Uleat: Change rogue bot behavior to eliminate twirling combat. They will only get behind the mob if they are not the mob's target or if the mob is feared or fleeing. This may lower rogue bot dps a small fraction..but, is more in-line with realistic game mechanics.
+
+== 01/17/2017 ==
+Mackal: Combat Revamp
+ - This change brings melee combat into line with how combat is done on live.
+ - This correctly applies the PC damage tables and corrects stacking order of many spells
+ - Given the scope of what had to be rewritten, it was not feasible to preserve the old combat system.
+ This means you will likely have to rebalance your server, which sucks, but this is very
+ accurate so shouldn't require any more changes, at least none that would cause you to have
+ to rebalance your server again.
+ - For rebalancing, I would recommend running the optional SQL and tweaking from there.
+ - To help with rebalancing there is a simulator included at utils/combat-sim.
+ - You can enter the mitigation or offense values you would like to balance around (#showstats will show you them)
+ a 1 on the sim is min damage 20 is max.
+ - Quick recommendations for best ways to improve PC DPS, give them some worn (or AA) SE_DamageModifier and/or SE_MinDamageModifier
+== 12/03/2016 ==
+Uleat: Added hack detection to trade code
+ - If illegal items are found in trade slots when the 'trade' button is clicked, the trade is cancelled and a message is sent to the offending player
+ - Future revisions will, at a minimum, log the player as a hacker once the quirks have been worked out
+
+== 12/01/2016 ==
+Uleat: Disabled RoF+ clients from augmenting items not in their possessions slots (0-29, 9999, 251-330) to abate an exploit in the current code
+
+== 10/17/2016 ==
+Uleat: Moved namespace ItemField from item_instance.h to shareddb.cpp - the only place it is used
+Uleat: Separated class Inventory from item_instance files into inventory_profile files
+Uleat: Renamed class Inventory to EQEmu::InventoryProfile
+Uleat: Renamed enum class InventoryVersion to MobVersion
+
+== 10/16/2016 ==
+Uleat: Renamed struct EQEmu::ItemBase to EQEmu::ItemData and class ItemInst to EQEmu::ItemInstance
+Uleat: Added class EQEmu::InventorySlot. Re-attached pertinent inventory token references to EQDictionary
+
+== 10/15/2016 ==
+Uleat: Changed filenames to facilitate future inventory naming conventions
+
+== 10/09/2016 ==
+Noudess: Rogue usage of merchants while utilizing sneak was limited to
+temporary items, as the code that checked faction per item sold did not
+take into account that rogue was sneaking. Now sneaking rogues can see full
+inventory on merchants (well, unless an item requires a + faction value).
+
+== 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 .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 ==
+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
+
+== 05/21/2016 ==
+Uleat: Moved struct Item_Struct into namespace EQEmu along with associated enumerations - enumerations into namespace EQEmu::item (run shared_memory)
+Uleat: Fixed a few possible crash points in linux builds associated with augments/ornamentations
+
+== 05/18/2016 ==
+Uleat: Changed client 'constants' files to 'limits'
+
+== 05/10/2016 ==
+Uleat: Converted client translators' 'SerializeItem()' to recursive, single buffer methodology. Titanium SerializeItem() now adds a null term between parent items instead of the invoking function
+Uleat: Converted server 'BulkSendInventoryItems()' to use single buffer methodology
+Uleat: Added 'ItemInst::Serialize()' overload to make use of the above single buffer methodology
+
+== 05/08/2016 ==
+Uleat: Re-coded Titanium client translator 'SerializeItem()' to use coded property assignments over file enumerated ones
+
+== 04/22/2016 ==
+Uleat: Reworked ClientVersion into namespace EQEmu; Added InventoryVersion
+Uleat: Delinked current inventory slot enumeration and constants from EQEmu::constants and global definition (inv2 pre-work)
+
+== 04/19/2016 ==
+Uleat: Changed the recent EQEmu rework to eliminate the nested class design (possible cause of VS2015 update crashes - unverified)
+Uleat: Some more inv2 convergence work
+
+== 04/15/2016 ==
+Uleat: Reworked EQDictionary into namespace EQEmu
+
+== 04/08/2016 ==
+Uleat: Added Heal Rotation HOTs (Heal Override Targets) that can be set for proactive healing (default HR behavior is reactive)
+Uleat: Added the ability to save/load/delete Heal Rotations based on targeted member - load is automatic when ^hrcreate is used on a bot that has a saved HR entry
+
+== 04/07/2016 ==
+Uleat: Rework of eq_dictionary to facilitate inventory work
+
+== 04/05/2016 ==
+Uleat: Moved database query code out of bot.cpp and into the new BotDatabase class
+
+== 03/25/2016 ==
+Uleat: Fix for heal rotation 'Stack Overflow' error
+Kayen: Defensive procs will now only proc once per attack round (instead of every attack chance).
+ Live like modifier added that decreases defensive proc chance if you are higher level then your attacker.
+
+== 03/24/2016 ==
+Kayen: Fix for AE taunt to use correct range and hate modifier.
+ Fix for spell effect version of taunt to use correct range.
+Uleat: Activation of new 'Bots' command system
+ - You will need to re-run cmake to capture the file additions and then re-compile your server binaries
+ - You will also need to manually run eqemu_update.pl and select the bots update option - you should have 2 pending updates: 9001 & 9002
+ - The new command system is accessed with the '^' character - start with '^help' and see where that takes you
+ - More information can be found on the eqemu forums
+
== 03/05/2016 ==
mackal: Implement extra bind points (secondary recall)
For SE_Gate, base2 is which bind to use (starting at 1)
@@ -31,7 +475,7 @@ Kinglykrab: Modified #flag so you can refresh your target's account status (GM s
- Just target the person whose flag you want to refresh and type #flag.
Uleat: Added itemlink functionality to the #summonitem command. Current use is limited to extracting the item id from the link.
- Invoking by item link '#summonitem Arrow' produces the same result as by item id '#summonitem 8005'
-
+
== 01/12/2016 ==
Athrogate: Adding ClearCompassMark() to Lua.
- Lua didn't have ClearCompassMark(). Perl already had this.
@@ -61,7 +505,7 @@ Kinglykrab: Added GetInstanceTimer() to Perl and Lua.
- Note: If you do not provide an instance id in the method it defaults to instance id 0 and returns 0 for time remaining.
- Added UpdateZoneHeader(type, value) to Perl and Lua.
- Note: UpdateZoneHeader allows you to manipulate fog color, fog density, and many other zone header settings on the fly in Perl and Lua.
-
+
== 12/21/2015 ==
Natedog: Updated item table fields and added a few missing fields for evolving items
-DO NOT implement Heirloom items till the inventory code is fixed to allow placing NO DROP
@@ -70,7 +514,7 @@ Natedog: Updated item table fields and added a few missing fields for evolving i
100% 2HSlashing (Max 50) - can only increase 2hslash by 50 MAX! (item field located though)
Kinglykrab: Added GetMeleeMitigation() for NPCs and Clients in Perl and Lua.
- This allows you to check total item, spell, and AA melee mitigation contribution.
-
+
== 12/19/2015 ==
Kinglykrab: Added many methods to Perl and Lua, list below:
- SeeInvisible()
@@ -92,7 +536,7 @@ Kinglykrab: Added many methods to Perl and Lua, list below:
- HasPet()
- IsSilenced()
- IsAmnesiad()
-
+
== 12/16/2015 ==
Noudess: Repaired issue with Bind Wounds on someone else. Message was not coming out on client (hold still) and a bind wounds on someone already binding their wounds would interrupt their bind and make them stand. Also removed some duplicate messaging.
@@ -101,7 +545,7 @@ Kinglykrab: Added IsBlind() and IsFeared() functionality to Perl and Lua.
- Note: Both methods are Mob methods and may be used on NPCs or PCs.
Natedog: Added Discipline functions, UpdateInstanceTimer function, and UnmemSpellBySpellID to lua and perl
-Examples: http://wiki.eqemulator.org/i?M=Pastebin&Paste=BJ0ygmNM
-
+
== 12/07/2015 ==
Uleat: Command aliases are no longer handled through the command_add() function.
- To add a command alias, edit the database table `command_settings` - here, you will find three columns: `command`, `access` and `aliases`
@@ -114,7 +558,7 @@ Uleat: Command aliases are no longer handled through the command_add() function.
- If you need need more name space for aliases, simply edit the `command_settings` table and increase the size of the `aliases` column
- The old `commands` table has been renamed to `commands_old` for reference
- All of the current 'standard' commands have been added to the new `command_settings` table
-
+
- YOU WILL NEED TO VERIFY/IMPORT OLD ACCESS VALUES AS THIS CHANGE REVERTS ALL COMMAND ACCESS VALUES TO THEIR PEQDB DEFAULTS
== 11/30/2015 ==
@@ -136,7 +580,7 @@ Akkadius: Performance boost (exponential) - Adjusted default idle cast check tim
- Database version 9089 will take care of this update automatically only if you used the default values
- The CPU cost of NPC's checking the entire entity list to cast beneficial spells (Heals/Buffs) becomes extremely high when higher NPC count zones exist (Based off of process profiling)
- Distance checks for every single NPC to every single other NPC who are casting beneficial spells occur every .5 - 2 seconds unless npc_spells dictates other values, which most of the time it does not
- - Zones that once fluctuated from 1-8% CPU with no activity (Idle but players present) now idle at .5% based on my testings due
+ - Zones that once fluctuated from 1-8% CPU with no activity (Idle but players present) now idle at .5% based on my testings due
to this change in conjunction with the past few performance commits, these are zones that have 600-800 NPC's in them
- These values normally are overidden by the spells table (npc_spells), fields (idle_no_sp_recast_min, idle_no_sp_recast_max)
@@ -144,7 +588,7 @@ Akkadius: Performance boost (exponential) - Adjusted default idle cast check tim
Akkadius: Made many performance optimizing oriented code changes in the source
- Added Rate limit the rate in which signals are processed for NPC's (.5 seconds instead of .01 seconds)
Akkadius: Added Perl Export Settings which should heavily reduce the Perl footprint
- - Normally when any sub EVENT_ gets triggered, all kinds of variables have to get exported every single time an event is triggered and
+ - Normally when any sub EVENT_ gets triggered, all kinds of variables have to get exported every single time an event is triggered and
this can make Perl very slow when events are triggered constantly
- The two most taxing variable exports are the item variables ($itemcount{} $hasitem{} $oncursor{}) and qglobals ($qglobals{})
- qglobals can pose to be an issue quickly when global qglobals build up, it is highly recommend to use the GetGlobal() and SetGlobal()
@@ -172,7 +616,7 @@ Akkadius: Added Perl Export Settings which should heavily reduce the Perl footpr
| 4 | EVENT_ATTACK | 0 | 1 | 1 | 0 | 1 |
| 5 | EVENT_COMBAT | 1 | 1 | 1 | 0 | 1 |
+----------+-----------------------------------------+-----------------+------------+-------------+-------------+--------------+
-
+
- If a change is made to this table while the server is live and running, you can hot reload all zone process settings via:
#reloadperlexportsettings
- For those who wonder what "exports" are, they are reference to variables that are made available at runtime of the sub event, such as:
@@ -181,7 +625,7 @@ Akkadius: Added Perl Export Settings which should heavily reduce the Perl footpr
(export_zone) : $zoneid, $instanceid, $zoneln etc. https://github.com/EQEmu/Server/blob/master/zone/embparser.cpp#L1083
(export_mob) : $x, $y, $z, $h, $hpratio etc. https://github.com/EQEmu/Server/blob/master/zone/embparser.cpp#L1032
(export_event) : (event specific) IE: EVENT_SAY ($text) https://github.com/EQEmu/Server/blob/master/zone/embparser.cpp#L1141
-
+
== 10/16/2015 ==
Uleat: Added command '#bot clearfollowdistance [ | spawned | all ]' to coincide with the activation of the load/save feature for follow_distance
@@ -213,7 +657,7 @@ rules:
commands:
'#invsnapshot' - Takes a snapshot of target client's inventory (feature active or inactive)
'#clearinvsnapshots [use rule]' - Clears snapshot entries based on bool argument ([true] - honors the 'InvSnapshotHistoryD' rule, [false] - erases all)
-
+
== 08/02/2015 ==
Shendare: VS2013 query StringFormat glitches when "%f" is passed for the int GetRunSpeed().
Shendare: In CreateNewNPCCommand(), the npc_type_id and spawngroupid are created in the database, but never set in the spawn class, so later it can't delete them with #npcspawn remove or #npcspawn delete.
@@ -264,10 +708,10 @@ mackal: Reworked the activated avoidace skills (riposte, dodge, etc) based on de
Also riposte immunity from the increase riposte chance spell effect.
== 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/Demonstar55: 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/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: AA system has been rewritten fixing a ton of bugs and extending functionality while making it easier to create new AA points.
+KLS/mackal: New tables are needed and so older data will need to be migrated to the new system.
+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/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 ==
Akkadius: Fix an issue where emote messages would overflow the buffer of 256 by increasing the size and changing some of the initialization
@@ -297,7 +741,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
== 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
== 05/18/2015 ==
@@ -307,7 +751,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
== 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
PCs are always pushed, need to do more testing to verify.
@@ -361,7 +805,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.
== 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)
== 02/18/2015 ==
@@ -380,7 +824,7 @@ Notes:
== 02/16/2015 ==
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 ==
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.
@@ -430,7 +874,7 @@ Akkadius: Implement Packet logs with dumps
See: http://wiki.eqemulator.org/p?Logging_System_Overhaul#packet-logging-levels
== 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 explicit 1", 1)
eq.debug("Test debug level explicit 2", 2)
@@ -623,7 +1067,7 @@ Trevius: Finished lining up the RoF2 Player Profile Struct. Zone times are now
Trevius: Fixed zoning after death for RoF2.
== 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.
== 12/15/2014 ==
@@ -633,7 +1077,7 @@ Trevius: Player Corpses now saved attuned settings for Items.
Required SQL: utils/sql/git/required/2014_12_15_multiple_table_updates.sql
== 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+) Added command #heromodel (#hm for short) - Usage: #heromodel [hero forge model] [ [slot] ] (example: #heromodel 63)
@@ -641,11 +1085,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
== 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 ==
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 ==
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.
@@ -691,10 +1135,10 @@ Trevius: Mercenaries now Dismiss, Suspend, Unsuspend, and Die correctly.
Trevius: Mercenaries can now zone once again.
== 11/17/2014 ==
-demonstar55: Correct OP_AugmentInfo reply. This fixes RoF display issue with Adventurer's Stone. Still issues with UF/SoF/SoD though.
+mackal: Correct OP_AugmentInfo reply. This fixes RoF display issue with Adventurer's Stone. Still issues with UF/SoF/SoD though.
== 11/16/2014 ==
-demonstar55: fix size issue with ControlBoat_Struct and exploit fix in OP_BoardBoat
+mackal: fix size issue with ControlBoat_Struct and exploit fix in OP_BoardBoat
Akkadius: Implemented Automatic Database update and versioning system
Akkadius: Created database revision define, this is located in version.h in common #define CURRENT_BINARY_DATABASE_VERSION 9057
@@ -771,12 +1215,12 @@ Optional SQL: utils/sql/git/optional/2014_11_15_SwarmPetTargetLock.sql
== 11/14/2014 ==
Secrets: Identified object size and solidtype as flags. Exported them as functions to Perl.
-demonstar55: Don't use the hack for charms that doesn't work on RoF
-demonstar55: UF too
-demonstar55: Tit
-demonstar55: SoF
-demonstar55: SoD
-demonstar55: 62 (untested)
+mackal: Don't use the hack for charms that doesn't work on RoF
+mackal: UF too
+mackal: Tit
+mackal: SoF
+mackal: SoD
+mackal: 62 (untested)
== 11/13/2014 ==
Kayen: Implemented target type (44) 'Beams' (which projects an AE infront of caster with a specified length and width).
@@ -802,7 +1246,7 @@ JJ: Implement new Live-like faction adjustment message using rule Client:UseLive
Optional SQL: utils/sql/git/optional/2014_11_09_LiveFactionMessages.sql
== 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.
== 11/03/2014 ==
@@ -826,17 +1270,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.
== 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 ==
Uleat: Updated command #peekinv to display item links properly in RoF clients
-demonstar55: Group Mentoring in raids
-demonstar55: Inspect Buffs (text only version) works in raid groups
-demonstar55: Make use of the Inspect Buffs op/packet. 62 SOL until someone finds its op
+mackal: Group Mentoring in raids
+mackal: Inspect Buffs (text only version) works in raid groups
+mackal: Make use of the Inspect Buffs op/packet. 62 SOL until someone finds its op
== 10/18/2014==
-demonstar55: Implement group mentor, sharing leadership exp (SoF+ only)
-demonstar55: Add gaining of group leadership while in raids
+mackal: Implement group mentor, sharing leadership exp (SoF+ only)
+mackal: Add gaining of group leadership while in raids
== 10/16/2014 ==
Uleat: Fixed the auto-conversion view naming error and renamed the views in the script files. Added a fix sql for databases that auto-converted.
@@ -849,7 +1293,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.
== 10/13/2014 ==
-demonstar55: Partially implement leadership and raids
+mackal: Partially implement leadership and raids
Currently working: client side only effects and stat bonuses.
Not working: Mark NPC, and other stuff that need extra server side support
Currently only UF tested (Tit and 62 may just work, others need packet work)
@@ -858,7 +1302,7 @@ demonstar55: Partially implement leadership and raids
Akkadius: Fix for LDON Character Stat load
== 10/11/2014 ==
-demonstar55: Implement Raid MOTD for UF
+mackal: Implement Raid MOTD for UF
Don't forget 2014_10_11_RaidMOTD.sql!
== 10/09/2014 ==
@@ -871,7 +1315,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 **
== 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 ==
Uleat: Added Server<->Corpse slot translators needed for re-enumeration (inactive until phased in)
@@ -889,13 +1333,13 @@ Uleat: First round of Ti/6.2 translators added - needed for re-enumeration
== 10/01/2014 ==
Kayen: Exported to PERL $client->SendColoredText(color, msg)
-demonstar55: Exported SendColoredText to lua
+mackal: Exported SendColoredText to lua
== 09/30/2014 ==
Uleat: Implemented click-casting from bag slots for clients that natively support it (RoF)
== 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+
== 09/27/2014 ==
@@ -904,15 +1348,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, "effectid", 1); //Returns the the value of effectid1
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
-demonstar55: Correct haste/slow "stacking" rules
-demonstar55: Correct SE_AttackSpeed4 to respect unslowable
-demonstar55: 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: Move the client's SetAttackTimer to the end of Client::CalcBonuses to keep the haste in sync
+mackal: Correct haste/slow "stacking" rules
+mackal: Correct SE_AttackSpeed4 to respect unslowable
+mackal: Make the haste be between 1-225 like the client (<100 = slow, >100 = haste) to ...
+mackal: Correct Hundred Hands effect and use formula provided by devs
== 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.)
-demonstar55: Added helper function bool EQEmu::IsTradeskill(uint32 skill)
+mackal: Added helper function bool EQEmu::IsTradeskill(uint32 skill)
== 09/23/2014 ==
Kayen: Spell recourse effects will now be applied AFTER the base spells effects have been applied (consistent with live).
@@ -1021,46 +1465,46 @@ Akkadius: Player Profile Blob to Database Conversion
ORDER BY DATA DESC;
== 09/20/2014 ==
-demonstar55: Fix crash in SendEnterWorld on illegally long names
-demonstar55: 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: Fix crash in SendEnterWorld on illegally long names
+mackal: The client only lets you enter 15 characters for your name (UF at least)
+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.
== 09/19/2014 ==
-demonstar55: Added Client::Tell_StringID (used in tell queue messages)
-demonstar55: Tell queues (and offline) messages now show correctly
-demonstar55: Fix starting with capital check
+mackal: Added Client::Tell_StringID (used in tell queue messages)
+mackal: Tell queues (and offline) messages now show correctly
+mackal: Fix starting with capital check
== 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+)
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
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 ==
-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.
-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 ==
Kayen: Nimbus effects will now be reapplied after zoning and will be removed when associated buff fades.
== 09/13/2014 ==
-demonstar55: Fix rogues not having Thieves' Cant
+mackal: Fix rogues not having Thieves' Cant
== 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
-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
-demonstar55: Slow fixes to bots!
-demonstar55: Revamped how NPC attack rate is set
+mackal: Slow fixes to bots!
+mackal: Revamped how NPC attack rate is set
SQL: 2014_09_09_attack_delay.sql
-demonstar55: Added attackdelay to #npcedit
+mackal: Added attackdelay to #npcedit
== 09/08/2014 ==
-demonstar55: Fix slow calc
+mackal: Fix slow calc
see: http://www.eqemulator.org/forums/showthread.php?t=38734
== 09/07/2014 ==
@@ -1071,18 +1515,18 @@ Uleat: Tweaked 'Smart' trading code to return main slots before sub slots in sta
== 09/05/2014 ==
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 ==
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.
== 09/02/2014 ==
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/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.
Uleat: Changed #loc to report the same precision as /loc for Cartesians
@@ -1093,7 +1537,7 @@ KLS: Fixed a few quest related inconsistencies.
KLS: Added Lua EntityList::ChannelMessage(from, type, msg, language)
== 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 ==
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.
@@ -1471,7 +1915,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.
== 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()
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
@@ -1537,7 +1981,7 @@ Kayen: Revision to lull/harmony/pacification code to be consistent with live bas
which if 'resisted' will cause the caster to gain aggro.
== 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
== 03/04/2014 ==
@@ -1552,7 +1996,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
== 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
Defaults should give fairly close to live results
@@ -1564,7 +2008,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
-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
note: some newer clients have a 'mine only' option for HoTs but it functions the same as show
@@ -1616,7 +2060,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
== 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.
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.
@@ -1647,14 +2091,14 @@ Kayen: Implemented SE_FfLimitUseType (focus limit to numhits type)
== 01/20/2014 ==
cavedude: Live-Like weather system (Thanks to robregen for figuring it out!)
-demonstar55: Implemented not_extendable spell flag
-demonstar55: Moved Spell Casting Reinforcement to DB
-demonstar55: Moved Mez Mastery to DB
+mackal: Implemented not_extendable spell flag
+mackal: Moved Spell Casting Reinforcement to DB
+mackal: Moved Mez Mastery to DB
Kayen: Complete revision of the numhits systems to utilize 'numhits type' field in spell file.
== 01/18/2014 ==
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 ==
Kayen: Numerous minor fixes to spell effects.
@@ -1674,19 +2118,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
== 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 ==
-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 ==
-demonstar55: Crash prevention for emote.
+mackal: Crash prevention for emote.
== 01/02/2014 ==
-demonstar55: Stuns from beneficial spells (Harvest) ignore immunity
+mackal: Stuns from beneficial spells (Harvest) ignore immunity
== 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 ==
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
@@ -1707,14 +2151,14 @@ Kayen: Implemented SE_TriggerOnAmountValue (Trigger spell if HP/Mana/End bellow
Kayen: Fix to SE_BlockNextSpellFocus to make it functional again.
== 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_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: More fixes for various spell triggers/procs to now properly use their resist modifier.
== 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.
== 12/13/2013 ==
@@ -1725,52 +2169,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.
== 12/11/2013 ==
-demonstar55: Fixed issue with crippling blow from berserker frenzy not actually doing anything
-demonstar55: Fix haste caps
+mackal: Fixed issue with crippling blow from berserker frenzy not actually doing anything
+mackal: Fix haste caps
== 12/04/2013 ==
-demonstar55: Fixed SpellType_Charm case in AICastSpell
+mackal: Fixed SpellType_Charm case in AICastSpell
== 12/03/2013 ==
-demonstar55: Added #showspellslist to view a mobs spell list
-demonstar55: Fix procing off of unattackable things
+mackal: Added #showspellslist to view a mobs spell list
+mackal: Fix procing off of unattackable things
== 12/02/2013 ==
JJ: Bandaid fix to CopyCharacter function.
== 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 ==
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 ==
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 ==
-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 ==
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.
== 11/16/2013 ==
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 ==
-demonstar55: Fixed Mob::CalcFocusEffect()'s SE_LimitEffect
+mackal: Fixed Mob::CalcFocusEffect()'s SE_LimitEffect
Leere: Fixed a stacking issue for SE_StackingCommand_Block
== 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.
-demonstar55: 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 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: Fix Echo of Taelosia and Ayonae's Tutelage to increase the mod cap instead of further improving the instrument mod
+mackal: Implemented Singing/Instrument Mastery as an AA bonus.
== 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 ==
Leere: Fixed Bard mana regen, they now only are affected by items and AA.
@@ -1820,50 +2264,50 @@ Uleat: Converted SkillType typedef enumeration to SkillUseTypes enumeration - So
Uleat: Prepped the client patch files for larger skill buffer size (not active)
== 10/24/2013 ==
-demonstar55: Fix some memory leaks in Mob::SpellOnTarget
+mackal: Fix some memory leaks in Mob::SpellOnTarget
== 10/21/2013 ==
-demonstar55: 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: Changed GetMinLevel return 0 for more cases that EQ uses for some reason ...
+mackal: Added buff level restrictions, set the Spells:BuffLevelRestrictions to false to have the old behavior.
== 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: Cleaned up some unused enumerations to show a move towards standardization. More to come...
== 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: Bots- added out of combat bard songs & #bot bardoutofcombat on|off command to turn them on/off.
== 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 ==
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.
== 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 ==
-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
-demonstar55: 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
-demonstar55: Fixed issues that arose from the 10/03/2013 change
+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
+mackal: Replaced instances of using CalcBuffDuration to determine if a spell was a buff with IsBuffSpell
+mackal: Removed Mob::HasBuffIcon since it was doing what IsBuffSpell does in a more convoluted way with a rather misleading name
+mackal: Fixed issues that arose from the 10/03/2013 change
== 10/05/2013 ==
Sorvani: fixed issue with stackable items being created with 0 charges cause by fix to SummonItems
== 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 ==
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 ==
-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 ==
KLS: Removed Common Profiler and Zone Profiler. They're well past outdated status and are just code bloat.
@@ -2009,8 +2453,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.
== 07/01/2013 ==
-demonstar55: Fix Monster Summoning related to giants/cyclops
-demonstar55: Prevent Monster Summoning from summoning a portal in bothunder
+mackal: Fix Monster Summoning related to giants/cyclops
+mackal: Prevent Monster Summoning from summoning a portal in bothunder
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.
Upgrade notes:
@@ -2078,35 +2522,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.
== 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
== 04/08/2013 ==
-demonstar55: Implemented Salvage AA
+mackal: Implemented Salvage AA
required SQL: 2013_04_08_Salvage.sql
script: generate_salvage.py - will generate the entries for some exceptions for salvage returns.
== 04/04/2013 ==
-demonstar55: Implemented SE_ForageAdditionalItems as a bonus
+mackal: Implemented SE_ForageAdditionalItems as a bonus
required SQL: 2013_04_04_NaturesBounty.sql
== 04/03/2013 ==
-demonstar55: 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: Overloaded Mob::Say_StringID with the option to provide a message type
+mackal: Switched rest of the Pet Messages to MT_PetResponse (Leader commands intentionally left the old way)
== 04/2/2013 ==
Bad_Captain: Fixed Merc lack of use of heal over time spells (causing excessive healing).
Bad_Captain: Fixed pet mitigation/AC issues.
== 04/01/2013 ==
-demonstar55: 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: AA reuse timers now start when you hit the button and are reset upon failure
+mackal: Instant Cast bard AAs can now be used while singing a song
== 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 ==
-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
Fading Memories now only uses the AA Action to eat mana
@@ -2116,7 +2560,7 @@ Bad_Captain: Added checks before dismissing merc to prevent possible bugged merc
Bad_Captain: Merged in Secret's merc memory leak fixes.
== 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 ==
Bad_Captain: Fixed zone crash due to merc focus effects & tribute.
@@ -2179,7 +2623,7 @@ KLS: Changed how shared memory works:
af4t: Add Touch of the Wicked AA redux to SK Improved Harm Touch and Leech Touch.
== 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 ==
Derision: World should no longer crash if the start_zone query fails at character creation.
@@ -2188,7 +2632,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.
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.
-demonstar55: Added potionbelt tool tip
+mackal: Added potionbelt tool tip
KLS: Added EVENT_DEATH to Player Quests
REQUIRED SQL: 2013_02_18_Merc_Rules_and_Tables.sql
@@ -2200,8 +2644,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.
== 02/16/2013 ==
-demonstar55: 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: Fix AA reuse timer calc
+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 ==
Kayen: AA fix
@@ -2212,7 +2656,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.
== 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.
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.
@@ -2248,7 +2692,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)
== 01/31/2013 ==
-cavedude00: (demonstar55) Rune aggro fix
+cavedude00: (mackal) Rune aggro fix
cavedude00: (Drajor) Tradeskill skillneeded fix.
== 01/30/2013 ==
@@ -2282,7 +2726,7 @@ Bad_Captain: Mercs - Initial spell casting AI committed.
KLS: Added crash logging for Windows builds.
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.
-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
@@ -2733,9 +3177,9 @@ references:
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
-cavedude: (demonstar55) 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: (demonstar55) AAs with shorter reuse timers should now reset if the cast failed (interrupted.)
+cavedude: (mackal) Damage shields by default will no longer count towards EXP gain. (Rule also added to change this behaviour.)
+cavedude: (mackal) Extended targets should now clear when aggro is lost using skills.
+cavedude: (mackal) AAs with shorter reuse timers should now reset if the cast failed (interrupted.)
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.');
@@ -3112,7 +3556,7 @@ Kayen: Implemented Perl Mob Quest Object GetModVulnerability(resist type) - Retu
Optional SQL: utils/sql/svn/2154_optional_rule_spell_procs_resists_falloff.sql
==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.
==06/03/2012==
@@ -5267,10 +5711,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.
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.
-cavedude: (demonstar55) 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: (demonstar55) 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) Pets will now be amiable to their owners, indifferent to all else.
+cavedude: (mackal) Added $client->KeyRingCheck() and $client->KeyRingAdd() to allow Perl to manipulate the keyring.
+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: (mackal) Corrected message string for heal spells.
cavedude: Added rule to determine at what HP a fleeing NPC will halt due to being snared.
==08/07/2009==
@@ -5906,7 +6350,7 @@ KLS: Fixed the /bug structure and updated the table to be more useful.
Required SQL: .\utils\sql\svn\503_bugs.sql
==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.
KLS: Fix for potentially dangerous typo in spawn conditions code.
KLS: Removed some non-functioning but still taking up database resources database code.
@@ -6207,7 +6651,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 XP bonus for Warrior, Rogue, and Halfling.
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.
Please note: XP gain has pretty much been overhauled. You may need tweak the multiplier rules for your server.
@@ -6341,7 +6785,7 @@ AndMetal: Augments are now visible when linking items.
Trevius: SoF - Adjusted the new Item Structure to align more fields
Trevius: SoF - Added OP_Consume and OP_LootRequest opcodes
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.
Required and Optional SQL: utils/sql/svn/326_aas.sql
KLS: SoF - Fix for item slots in bags.
diff --git a/client_files/export/main.cpp b/client_files/export/main.cpp
index 708d48456..8009e81b4 100644
--- a/client_files/export/main.cpp
+++ b/client_files/export/main.cpp
@@ -27,7 +27,7 @@
#include "../../common/rulesys.h"
#include "../../common/string_util.h"
-EQEmuLogSys Log;
+EQEmuLogSys LogSys;
void ExportSpells(SharedDatabase *db);
void ExportSkillCaps(SharedDatabase *db);
@@ -36,46 +36,46 @@ void ExportDBStrings(SharedDatabase *db);
int main(int argc, char **argv) {
RegisterExecutablePlatform(ExePlatformClientExport);
- Log.LoadLogSettingsDefaults();
+ LogSys.LoadLogSettingsDefaults();
set_exception_handler();
- Log.Out(Logs::General, Logs::Status, "Client Files Export Utility");
+ Log(Logs::General, Logs::Status, "Client Files Export Utility");
if(!EQEmuConfig::LoadConfig()) {
- Log.Out(Logs::General, Logs::Error, "Unable to load configuration file.");
+ Log(Logs::General, Logs::Error, "Unable to load configuration file.");
return 1;
}
- const EQEmuConfig *config = EQEmuConfig::get();
+ auto Config = EQEmuConfig::get();
SharedDatabase database;
- Log.Out(Logs::General, Logs::Status, "Connecting to database...");
- if(!database.Connect(config->DatabaseHost.c_str(), config->DatabaseUsername.c_str(),
- config->DatabasePassword.c_str(), config->DatabaseDB.c_str(), config->DatabasePort)) {
- Log.Out(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
+ Log(Logs::General, Logs::Status, "Connecting to database...");
+ if(!database.Connect(Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(),
+ Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) {
+ Log(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
"database connection");
return 1;
}
/* Register Log System and Settings */
- database.LoadLogSettings(Log.log_settings);
- Log.StartFileLogs();
+ database.LoadLogSettings(LogSys.log_settings);
+ LogSys.StartFileLogs();
ExportSpells(&database);
ExportSkillCaps(&database);
ExportBaseData(&database);
ExportDBStrings(&database);
- Log.CloseFileLogs();
+ LogSys.CloseFileLogs();
return 0;
}
void ExportSpells(SharedDatabase *db) {
- Log.Out(Logs::General, Logs::Status, "Exporting Spells...");
+ Log(Logs::General, Logs::Status, "Exporting Spells...");
FILE *f = fopen("export/spells_us.txt", "w");
if(!f) {
- Log.Out(Logs::General, Logs::Error, "Unable to open export/spells_us.txt to write, skipping.");
+ Log(Logs::General, Logs::Error, "Unable to open export/spells_us.txt to write, skipping.");
return;
}
@@ -142,11 +142,11 @@ int GetSkill(SharedDatabase *db, int skill_id, int class_id, int level) {
}
void ExportSkillCaps(SharedDatabase *db) {
- Log.Out(Logs::General, Logs::Status, "Exporting Skill Caps...");
+ Log(Logs::General, Logs::Status, "Exporting Skill Caps...");
FILE *f = fopen("export/SkillCaps.txt", "w");
if(!f) {
- Log.Out(Logs::General, Logs::Error, "Unable to open export/SkillCaps.txt to write, skipping.");
+ Log(Logs::General, Logs::Error, "Unable to open export/SkillCaps.txt to write, skipping.");
return;
}
@@ -171,11 +171,11 @@ void ExportSkillCaps(SharedDatabase *db) {
}
void ExportBaseData(SharedDatabase *db) {
- Log.Out(Logs::General, Logs::Status, "Exporting Base Data...");
+ Log(Logs::General, Logs::Status, "Exporting Base Data...");
FILE *f = fopen("export/BaseData.txt", "w");
if(!f) {
- Log.Out(Logs::General, Logs::Error, "Unable to open export/BaseData.txt to write, skipping.");
+ Log(Logs::General, Logs::Error, "Unable to open export/BaseData.txt to write, skipping.");
return;
}
@@ -202,11 +202,11 @@ void ExportBaseData(SharedDatabase *db) {
}
void ExportDBStrings(SharedDatabase *db) {
- Log.Out(Logs::General, Logs::Status, "Exporting DB Strings...");
+ Log(Logs::General, Logs::Status, "Exporting DB Strings...");
FILE *f = fopen("export/dbstr_us.txt", "w");
if(!f) {
- Log.Out(Logs::General, Logs::Error, "Unable to open export/dbstr_us.txt to write, skipping.");
+ Log(Logs::General, Logs::Error, "Unable to open export/dbstr_us.txt to write, skipping.");
return;
}
diff --git a/client_files/import/main.cpp b/client_files/import/main.cpp
index 72ae6fd5d..a8e2ad0fe 100644
--- a/client_files/import/main.cpp
+++ b/client_files/import/main.cpp
@@ -25,7 +25,7 @@
#include "../../common/rulesys.h"
#include "../../common/string_util.h"
-EQEmuLogSys Log;
+EQEmuLogSys LogSys;
void ImportSpells(SharedDatabase *db);
void ImportSkillCaps(SharedDatabase *db);
@@ -34,35 +34,35 @@ void ImportDBStrings(SharedDatabase *db);
int main(int argc, char **argv) {
RegisterExecutablePlatform(ExePlatformClientImport);
- Log.LoadLogSettingsDefaults();
+ LogSys.LoadLogSettingsDefaults();
set_exception_handler();
- Log.Out(Logs::General, Logs::Status, "Client Files Import Utility");
+ Log(Logs::General, Logs::Status, "Client Files Import Utility");
if(!EQEmuConfig::LoadConfig()) {
- Log.Out(Logs::General, Logs::Error, "Unable to load configuration file.");
+ Log(Logs::General, Logs::Error, "Unable to load configuration file.");
return 1;
}
- const EQEmuConfig *config = EQEmuConfig::get();
+ auto Config = EQEmuConfig::get();
SharedDatabase database;
- Log.Out(Logs::General, Logs::Status, "Connecting to database...");
- if(!database.Connect(config->DatabaseHost.c_str(), config->DatabaseUsername.c_str(),
- config->DatabasePassword.c_str(), config->DatabaseDB.c_str(), config->DatabasePort)) {
- Log.Out(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
+ Log(Logs::General, Logs::Status, "Connecting to database...");
+ if(!database.Connect(Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(),
+ Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) {
+ Log(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
"database connection");
return 1;
}
- database.LoadLogSettings(Log.log_settings);
- Log.StartFileLogs();
+ database.LoadLogSettings(LogSys.log_settings);
+ LogSys.StartFileLogs();
ImportSpells(&database);
ImportSkillCaps(&database);
ImportBaseData(&database);
ImportDBStrings(&database);
- Log.CloseFileLogs();
+ LogSys.CloseFileLogs();
return 0;
}
@@ -97,10 +97,10 @@ bool IsStringField(int i) {
}
void ImportSpells(SharedDatabase *db) {
- Log.Out(Logs::General, Logs::Status, "Importing Spells...");
+ Log(Logs::General, Logs::Status, "Importing Spells...");
FILE *f = fopen("import/spells_us.txt", "r");
if(!f) {
- Log.Out(Logs::General, Logs::Error, "Unable to open import/spells_us.txt to read, skipping.");
+ Log(Logs::General, Logs::Error, "Unable to open import/spells_us.txt to read, skipping.");
return;
}
@@ -173,23 +173,23 @@ void ImportSpells(SharedDatabase *db) {
spells_imported++;
if(spells_imported % 1000 == 0) {
- Log.Out(Logs::General, Logs::Status, "%d spells imported.", spells_imported);
+ Log(Logs::General, Logs::Status, "%d spells imported.", spells_imported);
}
}
if(spells_imported % 1000 != 0) {
- Log.Out(Logs::General, Logs::Status, "%d spells imported.", spells_imported);
+ Log(Logs::General, Logs::Status, "%d spells imported.", spells_imported);
}
fclose(f);
}
void ImportSkillCaps(SharedDatabase *db) {
- Log.Out(Logs::General, Logs::Status, "Importing Skill Caps...");
+ Log(Logs::General, Logs::Status, "Importing Skill Caps...");
FILE *f = fopen("import/SkillCaps.txt", "r");
if(!f) {
- Log.Out(Logs::General, Logs::Error, "Unable to open import/SkillCaps.txt to read, skipping.");
+ Log(Logs::General, Logs::Error, "Unable to open import/SkillCaps.txt to read, skipping.");
return;
}
@@ -220,11 +220,11 @@ void ImportSkillCaps(SharedDatabase *db) {
}
void ImportBaseData(SharedDatabase *db) {
- Log.Out(Logs::General, Logs::Status, "Importing Base Data...");
+ Log(Logs::General, Logs::Status, "Importing Base Data...");
FILE *f = fopen("import/BaseData.txt", "r");
if(!f) {
- Log.Out(Logs::General, Logs::Error, "Unable to open import/BaseData.txt to read, skipping.");
+ Log(Logs::General, Logs::Error, "Unable to open import/BaseData.txt to read, skipping.");
return;
}
@@ -265,11 +265,11 @@ void ImportBaseData(SharedDatabase *db) {
}
void ImportDBStrings(SharedDatabase *db) {
- Log.Out(Logs::General, Logs::Status, "Importing DB Strings...");
+ Log(Logs::General, Logs::Status, "Importing DB Strings...");
FILE *f = fopen("import/dbstr_us.txt", "r");
if(!f) {
- Log.Out(Logs::General, Logs::Error, "Unable to open import/dbstr_us.txt to read, skipping.");
+ Log(Logs::General, Logs::Error, "Unable to open import/dbstr_us.txt to read, skipping.");
return;
}
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 09ed7e02c..cecb47d12 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -11,15 +11,20 @@ SET(common_sources
database_conversions.cpp
database_instances.cpp
dbcore.cpp
+ deity.cpp
+ emu_constants.cpp
+ emu_legacy.cpp
+ emu_limits.cpp
emu_opcodes.cpp
emu_tcp_connection.cpp
emu_tcp_server.cpp
- eq_dictionary.cpp
+ emu_versions.cpp
eqdb.cpp
eqdb_res.cpp
eqemu_exception.cpp
eqemu_config.cpp
eqemu_logsys.cpp
+ eq_limits.cpp
eq_packet.cpp
eq_stream.cpp
eq_stream_factory.cpp
@@ -30,9 +35,14 @@ SET(common_sources
faction.cpp
guild_base.cpp
guilds.cpp
+ inventory_profile.cpp
+ inventory_slot.cpp
ipc_mutex.cpp
- item.cpp
+ item_data.cpp
+ item_instance.cpp
+ light_source.cpp
md5.cpp
+ memory_buffer.cpp
memory_mapped_file.cpp
misc.cpp
misc_functions.cpp
@@ -51,6 +61,7 @@ SET(common_sources
races.cpp
rdtsc.cpp
rulesys.cpp
+ say_link.cpp
serverinfo.cpp
shareddb.cpp
skills.cpp
@@ -59,6 +70,7 @@ SET(common_sources
struct_strategy.cpp
tcp_connection.cpp
tcp_server.cpp
+ textures.cpp
timeoutmgr.cpp
timer.cpp
unix.cpp
@@ -67,11 +79,17 @@ SET(common_sources
platform.cpp
patches/patches.cpp
patches/sod.cpp
+ patches/sod_limits.cpp
patches/sof.cpp
+ patches/sof_limits.cpp
patches/rof.cpp
+ patches/rof_limits.cpp
patches/rof2.cpp
+ patches/rof2_limits.cpp
patches/titanium.cpp
+ patches/titanium_limits.cpp
patches/uf.cpp
+ patches/uf_limits.cpp
SocketLib/Base64.cpp
SocketLib/File.cpp
SocketLib/HttpdCookies.cpp
@@ -104,12 +122,15 @@ SET(common_headers
database.h
dbcore.h
deity.h
+ emu_constants.h
+ emu_legacy.h
+ emu_limits.h
emu_opcodes.h
emu_oplist.h
emu_tcp_connection.h
emu_tcp_server.h
+ emu_versions.h
eq_constants.h
- eq_dictionary.h
eq_packet_structs.h
eqdb.h
eqdb_res.h
@@ -117,6 +138,7 @@ SET(common_headers
eqemu_config.h
eqemu_config_elements.h
eqemu_logsys.h
+ eq_limits.h
eq_packet.h
eq_stream.h
eq_stream_factory.h
@@ -135,15 +157,19 @@ SET(common_headers
global_define.h
guild_base.h
guilds.h
+ inventory_profile.h
+ inventory_slot.h
ipc_mutex.h
- item.h
+ item_data.h
item_fieldlist.h
- item_struct.h
+ item_instance.h
languages.h
+ light_source.h
linked_list.h
loottable.h
mail_oplist.h
md5.h
+ memory_buffer.h
memory_mapped_file.h
misc.h
misc_functions.h
@@ -166,6 +192,7 @@ SET(common_headers
rdtsc.h
rulesys.h
ruletypes.h
+ say_link.h
seperator.h
serverinfo.h
servertalk.h
@@ -177,6 +204,7 @@ SET(common_headers
tcp_basic_server.h
tcp_connection.h
tcp_server.h
+ textures.h
timeoutmgr.h
timer.h
types.h
@@ -188,38 +216,30 @@ SET(common_headers
zone_numbers.h
patches/patches.h
patches/sod.h
- patches/sod_constants.h
- patches/sod_itemfields.h
+ patches/sod_limits.h
patches/sod_ops.h
patches/sod_structs.h
patches/sof.h
- patches/sof_constants.h
- patches/sof_itemfields.h
- patches/sof_opcode_list.h
+ patches/sof_limits.h
patches/sof_ops.h
patches/sof_structs.h
patches/ss_declare.h
patches/ss_define.h
patches/ss_register.h
patches/rof.h
- patches/rof_constants.h
- patches/rof_itemfields.h
+ patches/rof_limits.h
patches/rof_ops.h
patches/rof_structs.h
patches/rof2.h
- patches/rof2_constants.h
- patches/rof2_itemfields.h
+ patches/rof2_limits.h
patches/rof2_ops.h
patches/rof2_structs.h
patches/titanium.h
- patches/titanium_constants.h
- patches/titanium_itemfields_a.h
- patches/titanium_itemfields_b.h
+ patches/titanium_limits.h
patches/titanium_ops.h
patches/titanium_structs.h
patches/uf.h
- patches/uf_constants.h
- patches/uf_itemfields.h
+ patches/uf_limits.h
patches/uf_ops.h
patches/uf_structs.h
SocketLib/Base64.h
@@ -242,47 +262,45 @@ SET(common_headers
SOURCE_GROUP(Patches FILES
patches/patches.h
patches/sod.h
- patches/sod_itemfields.h
+ patches/sod_limits.h
patches/sod_ops.h
- patches/sod_constants.h
patches/sod_structs.h
patches/sof.h
- patches/sof_itemfields.h
- patches/sof_opcode_list.h
+ patches/sof_limits.h
patches/sof_ops.h
- patches/sof_constants.h
patches/sof_structs.h
patches/ss_declare.h
patches/ss_define.h
patches/ss_register.h
patches/rof.h
- patches/rof_itemfields.h
+ patches/rof_limits.h
patches/rof_ops.h
- patches/rof_constants.h
patches/rof_structs.h
patches/rof2.h
- patches/rof2_itemfields.h
+ patches/rof2_limits.h
patches/rof2_ops.h
- patches/rof2_constants.h
patches/rof2_structs.h
patches/titanium.h
- patches/titanium_itemfields_a.h
- patches/titanium_itemfields_b.h
+ patches/titanium_limits.h
patches/titanium_ops.h
- patches/titanium_constants.h
patches/titanium_structs.h
patches/uf.h
- patches/uf_itemfields.h
+ patches/uf_limits.h
patches/uf_ops.h
- patches/uf_constants.h
patches/uf_structs.h
patches/patches.cpp
patches/sod.cpp
+ patches/sod_limits.cpp
patches/sof.cpp
+ patches/sof_limits.cpp
patches/rof.cpp
+ patches/rof_limits.cpp
patches/rof2.cpp
+ patches/rof2_limits.cpp
patches/titanium.cpp
+ patches/titanium_limits.cpp
patches/uf.cpp
+ patches/uf_limits.cpp
)
SOURCE_GROUP(SocketLib FILES
diff --git a/common/base_packet.h b/common/base_packet.h
index 16a527ade..bdd774aa2 100644
--- a/common/base_packet.h
+++ b/common/base_packet.h
@@ -22,10 +22,10 @@
#include
#include
-#ifdef WIN32
+#ifdef _WINDOWS
#include
- #include
#include
+ #include
#else
#include
#include
diff --git a/common/classes.cpp b/common/classes.cpp
index 1f54c9234..58aa56602 100644
--- a/common/classes.cpp
+++ b/common/classes.cpp
@@ -1,5 +1,5 @@
/* EQEMu: Everquest Server Emulator
- Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
+ Copyright (C) 2001-2016 EQEMu Development Team (http://eqemu.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -18,275 +18,576 @@
#include "../common/global_define.h"
#include "../common/classes.h"
-const char* GetEQClassName(uint8 class_, uint8 level) {
- switch(class_) {
- case WARRIOR:
- if (level >= 70)
- return "Vanquisher";
- else if (level >= 65)
- return "Overlord"; //Baron-Sprite: LEAVE MY CLASSES ALONE.
- else if (level >= 60)
- return "Warlord";
- else if (level >= 55)
- return "Myrmidon";
- else if (level >= 51)
- return "Champion";
- else
- return "Warrior";
- case CLERIC:
- if (level >= 70)
- return "Prelate";
- else if (level >= 65)
- return "Archon";
- else if (level >= 60)
- return "High Priest";
- else if (level >= 55)
- return "Templar";
- else if (level >= 51)
- return "Vicar";
- else
- return "Cleric";
- case PALADIN:
- if (level >= 70)
- return "Lord";
- else if (level >= 65)
- return "Lord Protector";
- else if (level >= 60)
- return "Crusader";
- else if (level >= 55)
- return "Knight";
- else if (level >= 51)
- return "Cavalier";
- else
- return "Paladin";
- case RANGER:
- if (level >= 70)
- return "Plainswalker";
- else if (level >= 65)
- return "Forest Stalker";
- else if (level >= 60)
- return "Warder";
- else if (level >= 55)
- return "Outrider";
- else if (level >= 51)
- return "Pathfinder";
- else
- return "Ranger";
- case SHADOWKNIGHT:
- if (level >= 70)
- return "Scourge Knight";
- else if (level >= 65)
- return "Dread Lord";
- else if (level >= 60)
- return "Grave Lord";
- else if (level >= 55)
- return "Revenant";
- else if (level >= 51)
- return "Reaver";
- else
- return "Shadowknight";
- case DRUID:
- if (level >= 70)
- return "Natureguard";
- else if (level >= 65)
- return "Storm Warden";
- else if (level >= 60)
- return "Hierophant";
- else if (level >= 55)
- return "Preserver";
- else if (level >= 51)
- return "Wanderer";
- else
- return "Druid";
- case MONK:
- if (level >= 70)
- return "Stone Fist";
- else if (level >= 65)
- return "Transcendent";
- else if (level >= 60)
- return "Grandmaster";
- else if (level >= 55)
- return "Master";
- else if (level >= 51)
- return "Disciple";
- else
- return "Monk";
- case BARD:
- if (level >= 70)
- return "Performer";
- else if (level >= 65)
- return "Maestro";
- else if (level >= 60)
- return "Virtuoso";
- else if (level >= 55)
- return "Troubadour";
- else if (level >= 51)
- return "Minstrel";
- else
- return "Bard";
- case ROGUE:
- if (level >= 70)
- return "Nemesis";
- else if (level >= 65)
- return "Deceiver";
- else if (level >= 60)
- return "Assassin";
- else if (level >= 55)
- return "Blackguard";
- else if (level >= 51)
- return "Rake";
- else
- return "Rogue";
- case SHAMAN:
- if (level >= 70)
- return "Soothsayer";
- else if (level >= 65)
- return "Prophet";
- else if (level >= 60)
- return "Oracle";
- else if (level >= 55)
- return "Luminary";
- else if (level >= 51)
- return "Mystic";
- else
- return "Shaman";
- case NECROMANCER:
- if (level >= 70)
- return "Wraith";
- else if (level >= 65)
- return "Arch Lich";
- else if (level >= 60)
- return "Warlock";
- else if (level >= 55)
- return "Defiler";
- else if (level >= 51)
- return "Heretic";
- else
- return "Necromancer";
- case WIZARD:
- if (level >= 70)
- return "Grand Arcanist";
- else if (level >= 65)
- return "Arcanist";
- else if (level >= 60)
- return "Sorcerer";
- else if (level >= 55)
- return "Evoker";
- else if (level >= 51)
- return "Channeler";
- else
- return "Wizard";
- case MAGICIAN:
- if (level >= 70)
- return "Arch Magus";
- else if (level >= 65)
- return "Arch Convoker";
- else if (level >= 60)
- return "Arch Mage";
- else if (level >= 55)
- return "Conjurer";
- if (level >= 51)
- return "Elementalist";
- else
- return "Magician";
- case ENCHANTER:
- if (level >= 70)
- return "Bedazzler";
- else if (level >= 65)
- return "Coercer";
- else if (level >= 60)
- return "Phantasmist";
- else if (level >= 55)
- return "Beguiler";
- else if (level >= 51)
- return "Illusionist";
- else
- return "Enchanter";
- case BEASTLORD:
- if (level >= 70)
- return "Wildblood";
- else if (level >= 65)
- return "Feral Lord";
- else if (level >= 60)
- return "Savage Lord";
- else if (level >= 55)
- return "Animist";
- else if (level >= 51)
- return "Primalist";
- else
- return "Beastlord";
- case BERSERKER:
- if (level >= 70)
- return "Ravager";
- else if (level >= 65)
- return "Fury";
- else if (level >= 60)
- return "Rager";
- else if (level >= 55)
- return "Vehement";
- else if (level >= 51)
- return "Brawler";
- else
- return "Berserker";
- case BANKER:
- if (level >= 70)
- return "Master Banker";
- else if (level >= 65)
- return "Elder Banker";
- else if (level >= 60)
- return "Oldest Banker";
- else if (level >= 55)
- return "Older Banker";
- else if (level >= 51)
- return "Old Banker";
- else
- return "Banker";
- case WARRIORGM:
- return "Warrior Guildmaster";
- case CLERICGM:
- return "Cleric Guildmaster";
- case PALADINGM:
- return "Paladin Guildmaster";
- case RANGERGM:
- return "Ranger Guildmaster";
- case SHADOWKNIGHTGM:
- return "Shadowknight Guildmaster";
- case DRUIDGM:
- return "Druid Guildmaster";
- case MONKGM:
- return "Monk Guildmaster";
- case BARDGM:
- return "Bard Guildmaster";
- case ROGUEGM:
- return "Rogue Guildmaster";
- case SHAMANGM:
- return "Shaman Guildmaster";
- case NECROMANCERGM:
- return "Necromancer Guildmaster";
- case WIZARDGM:
- return "Wizard Guildmaster";
- case MAGICIANGM:
- return "Magician Guildmaster";
- case ENCHANTERGM:
- return "Enchanter Guildmaster";
- case BEASTLORDGM:
- return "Beastlord Guildmaster";
- case BERSERKERGM:
- return "Berserker Guildmaster";
- case MERCHANT:
- return "Merchant";
- case ADVENTURERECRUITER:
- return "Adventure Recruiter";
- case ADVENTUREMERCHANT:
- return "Adventure Merchant";
- case CORPSE_CLASS:
- return "Corpse Class";
- case TRIBUTE_MASTER:
- return "Tribute Master";
- case GUILD_TRIBUTE_MASTER:
- return "Guild Tribute Master";
- default:
- return "Unknown";
+const char* GetClassIDName(uint8 class_id, uint8 level)
+{
+ switch (class_id) {
+ case WARRIOR:
+ if (level >= 70)
+ return "Vanquisher";
+ else if (level >= 65)
+ return "Overlord"; //Baron-Sprite: LEAVE MY CLASSES ALONE.
+ else if (level >= 60)
+ return "Warlord";
+ else if (level >= 55)
+ return "Myrmidon";
+ else if (level >= 51)
+ return "Champion";
+ else
+ return "Warrior";
+ case CLERIC:
+ if (level >= 70)
+ return "Prelate";
+ else if (level >= 65)
+ return "Archon";
+ else if (level >= 60)
+ return "High Priest";
+ else if (level >= 55)
+ return "Templar";
+ else if (level >= 51)
+ return "Vicar";
+ else
+ return "Cleric";
+ case PALADIN:
+ if (level >= 70)
+ return "Lord";
+ else if (level >= 65)
+ return "Lord Protector";
+ else if (level >= 60)
+ return "Crusader";
+ else if (level >= 55)
+ return "Knight";
+ else if (level >= 51)
+ return "Cavalier";
+ else
+ return "Paladin";
+ case RANGER:
+ if (level >= 70)
+ return "Plainswalker";
+ else if (level >= 65)
+ return "Forest Stalker";
+ else if (level >= 60)
+ return "Warder";
+ else if (level >= 55)
+ return "Outrider";
+ else if (level >= 51)
+ return "Pathfinder";
+ else
+ return "Ranger";
+ case SHADOWKNIGHT:
+ if (level >= 70)
+ return "Scourge Knight";
+ else if (level >= 65)
+ return "Dread Lord";
+ else if (level >= 60)
+ return "Grave Lord";
+ else if (level >= 55)
+ return "Revenant";
+ else if (level >= 51)
+ return "Reaver";
+ else
+ return "Shadowknight";
+ case DRUID:
+ if (level >= 70)
+ return "Natureguard";
+ else if (level >= 65)
+ return "Storm Warden";
+ else if (level >= 60)
+ return "Hierophant";
+ else if (level >= 55)
+ return "Preserver";
+ else if (level >= 51)
+ return "Wanderer";
+ else
+ return "Druid";
+ case MONK:
+ if (level >= 70)
+ return "Stone Fist";
+ else if (level >= 65)
+ return "Transcendent";
+ else if (level >= 60)
+ return "Grandmaster";
+ else if (level >= 55)
+ return "Master";
+ else if (level >= 51)
+ return "Disciple";
+ else
+ return "Monk";
+ case BARD:
+ if (level >= 70)
+ return "Performer";
+ else if (level >= 65)
+ return "Maestro";
+ else if (level >= 60)
+ return "Virtuoso";
+ else if (level >= 55)
+ return "Troubadour";
+ else if (level >= 51)
+ return "Minstrel";
+ else
+ return "Bard";
+ case ROGUE:
+ if (level >= 70)
+ return "Nemesis";
+ else if (level >= 65)
+ return "Deceiver";
+ else if (level >= 60)
+ return "Assassin";
+ else if (level >= 55)
+ return "Blackguard";
+ else if (level >= 51)
+ return "Rake";
+ else
+ return "Rogue";
+ case SHAMAN:
+ if (level >= 70)
+ return "Soothsayer";
+ else if (level >= 65)
+ return "Prophet";
+ else if (level >= 60)
+ return "Oracle";
+ else if (level >= 55)
+ return "Luminary";
+ else if (level >= 51)
+ return "Mystic";
+ else
+ return "Shaman";
+ case NECROMANCER:
+ if (level >= 70)
+ return "Wraith";
+ else if (level >= 65)
+ return "Arch Lich";
+ else if (level >= 60)
+ return "Warlock";
+ else if (level >= 55)
+ return "Defiler";
+ else if (level >= 51)
+ return "Heretic";
+ else
+ return "Necromancer";
+ case WIZARD:
+ if (level >= 70)
+ return "Grand Arcanist";
+ else if (level >= 65)
+ return "Arcanist";
+ else if (level >= 60)
+ return "Sorcerer";
+ else if (level >= 55)
+ return "Evoker";
+ else if (level >= 51)
+ return "Channeler";
+ else
+ return "Wizard";
+ case MAGICIAN:
+ if (level >= 70)
+ return "Arch Magus";
+ else if (level >= 65)
+ return "Arch Convoker";
+ else if (level >= 60)
+ return "Arch Mage";
+ else if (level >= 55)
+ return "Conjurer";
+ if (level >= 51)
+ return "Elementalist";
+ else
+ return "Magician";
+ case ENCHANTER:
+ if (level >= 70)
+ return "Bedazzler";
+ else if (level >= 65)
+ return "Coercer";
+ else if (level >= 60)
+ return "Phantasmist";
+ else if (level >= 55)
+ return "Beguiler";
+ else if (level >= 51)
+ return "Illusionist";
+ else
+ return "Enchanter";
+ case BEASTLORD:
+ if (level >= 70)
+ return "Wildblood";
+ else if (level >= 65)
+ return "Feral Lord";
+ else if (level >= 60)
+ return "Savage Lord";
+ else if (level >= 55)
+ return "Animist";
+ else if (level >= 51)
+ return "Primalist";
+ else
+ return "Beastlord";
+ case BERSERKER:
+ if (level >= 70)
+ return "Ravager";
+ else if (level >= 65)
+ return "Fury";
+ else if (level >= 60)
+ return "Rager";
+ else if (level >= 55)
+ return "Vehement";
+ else if (level >= 51)
+ return "Brawler";
+ else
+ return "Berserker";
+ case BANKER:
+ if (level >= 70)
+ return "Master Banker";
+ else if (level >= 65)
+ return "Elder Banker";
+ else if (level >= 60)
+ return "Oldest Banker";
+ else if (level >= 55)
+ return "Older Banker";
+ else if (level >= 51)
+ return "Old Banker";
+ else
+ return "Banker";
+ case WARRIORGM:
+ return "Warrior Guildmaster";
+ case CLERICGM:
+ return "Cleric Guildmaster";
+ case PALADINGM:
+ return "Paladin Guildmaster";
+ case RANGERGM:
+ return "Ranger Guildmaster";
+ case SHADOWKNIGHTGM:
+ return "Shadowknight Guildmaster";
+ case DRUIDGM:
+ return "Druid Guildmaster";
+ case MONKGM:
+ return "Monk Guildmaster";
+ case BARDGM:
+ return "Bard Guildmaster";
+ case ROGUEGM:
+ return "Rogue Guildmaster";
+ case SHAMANGM:
+ return "Shaman Guildmaster";
+ case NECROMANCERGM:
+ return "Necromancer Guildmaster";
+ case WIZARDGM:
+ return "Wizard Guildmaster";
+ case MAGICIANGM:
+ return "Magician Guildmaster";
+ case ENCHANTERGM:
+ return "Enchanter Guildmaster";
+ case BEASTLORDGM:
+ return "Beastlord Guildmaster";
+ case BERSERKERGM:
+ return "Berserker Guildmaster";
+ case MERCHANT:
+ return "Merchant";
+ case ADVENTURERECRUITER:
+ return "Adventure Recruiter";
+ case ADVENTUREMERCHANT:
+ return "Adventure Merchant";
+ case CORPSE_CLASS:
+ return "Corpse Class";
+ case TRIBUTE_MASTER:
+ return "Tribute Master";
+ case GUILD_TRIBUTE_MASTER:
+ return "Guild Tribute Master";
+ default:
+ return "Unknown";
}
}
+const char* GetPlayerClassName(uint32 player_class_value, uint8 level)
+{
+ return GetClassIDName(GetClassIDFromPlayerClassValue(player_class_value), level);
+}
+
+uint32 GetPlayerClassValue(uint8 class_id)
+{
+ switch (class_id) {
+ case WARRIOR:
+ case CLERIC:
+ case PALADIN:
+ case RANGER:
+ case SHADOWKNIGHT:
+ case DRUID:
+ case MONK:
+ case BARD:
+ case ROGUE:
+ case SHAMAN:
+ case NECROMANCER:
+ case WIZARD:
+ case MAGICIAN:
+ case ENCHANTER:
+ case BEASTLORD:
+ case BERSERKER:
+ return class_id;
+ default:
+ return PLAYER_CLASS_UNKNOWN; // watch
+ }
+}
+
+uint32 GetPlayerClassBit(uint8 class_id)
+{
+ switch (class_id) {
+ case WARRIOR:
+ return PLAYER_CLASS_WARRIOR_BIT;
+ case CLERIC:
+ return PLAYER_CLASS_CLERIC_BIT;
+ case PALADIN:
+ return PLAYER_CLASS_PALADIN_BIT;
+ case RANGER:
+ return PLAYER_CLASS_RANGER_BIT;
+ case SHADOWKNIGHT:
+ return PLAYER_CLASS_SHADOWKNIGHT_BIT;
+ case DRUID:
+ return PLAYER_CLASS_DRUID_BIT;
+ case MONK:
+ return PLAYER_CLASS_MONK_BIT;
+ case BARD:
+ return PLAYER_CLASS_BARD_BIT;
+ case ROGUE:
+ return PLAYER_CLASS_ROGUE_BIT;
+ case SHAMAN:
+ return PLAYER_CLASS_SHAMAN_BIT;
+ case NECROMANCER:
+ return PLAYER_CLASS_NECROMANCER_BIT;
+ case WIZARD:
+ return PLAYER_CLASS_WIZARD_BIT;
+ case MAGICIAN:
+ return PLAYER_CLASS_MAGICIAN_BIT;
+ case ENCHANTER:
+ return PLAYER_CLASS_ENCHANTER_BIT;
+ case BEASTLORD:
+ return PLAYER_CLASS_BEASTLORD_BIT;
+ case BERSERKER:
+ return PLAYER_CLASS_BERSERKER_BIT;
+ default:
+ return PLAYER_CLASS_UNKNOWN_BIT;
+ }
+}
+
+uint8 GetClassIDFromPlayerClassValue(uint32 player_class_value)
+{
+ switch (player_class_value) {
+ case PLAYER_CLASS_WARRIOR:
+ case PLAYER_CLASS_CLERIC:
+ case PLAYER_CLASS_PALADIN:
+ case PLAYER_CLASS_RANGER:
+ case PLAYER_CLASS_SHADOWKNIGHT:
+ case PLAYER_CLASS_DRUID:
+ case PLAYER_CLASS_MONK:
+ case PLAYER_CLASS_BARD:
+ case PLAYER_CLASS_ROGUE:
+ case PLAYER_CLASS_SHAMAN:
+ case PLAYER_CLASS_NECROMANCER:
+ case PLAYER_CLASS_WIZARD:
+ case PLAYER_CLASS_MAGICIAN:
+ case PLAYER_CLASS_ENCHANTER:
+ case PLAYER_CLASS_BEASTLORD:
+ case PLAYER_CLASS_BERSERKER:
+ return player_class_value;
+ default:
+ return PLAYER_CLASS_UNKNOWN; // watch
+ }
+}
+
+uint8 GetClassIDFromPlayerClassBit(uint32 player_class_bit)
+{
+ switch (player_class_bit) {
+ case PLAYER_CLASS_WARRIOR_BIT:
+ return WARRIOR;
+ case PLAYER_CLASS_CLERIC_BIT:
+ return CLERIC;
+ case PLAYER_CLASS_PALADIN_BIT:
+ return PALADIN;
+ case PLAYER_CLASS_RANGER_BIT:
+ return RANGER;
+ case PLAYER_CLASS_SHADOWKNIGHT_BIT:
+ return SHADOWKNIGHT;
+ case PLAYER_CLASS_DRUID_BIT:
+ return DRUID;
+ case PLAYER_CLASS_MONK_BIT:
+ return MONK;
+ case PLAYER_CLASS_BARD_BIT:
+ return BARD;
+ case PLAYER_CLASS_ROGUE_BIT:
+ return ROGUE;
+ case PLAYER_CLASS_SHAMAN_BIT:
+ return SHAMAN;
+ case PLAYER_CLASS_NECROMANCER_BIT:
+ return NECROMANCER;
+ case PLAYER_CLASS_WIZARD_BIT:
+ return WIZARD;
+ case PLAYER_CLASS_MAGICIAN_BIT:
+ return MAGICIAN;
+ case PLAYER_CLASS_ENCHANTER_BIT:
+ return ENCHANTER;
+ case PLAYER_CLASS_BEASTLORD_BIT:
+ return BEASTLORD;
+ case PLAYER_CLASS_BERSERKER_BIT:
+ return BERSERKER;
+ default:
+ return PLAYER_CLASS_UNKNOWN; // watch
+ }
+}
+
+bool IsFighterClass(uint8 class_id)
+{
+ switch (class_id) {
+ case WARRIOR:
+ case PALADIN:
+ case RANGER:
+ case SHADOWKNIGHT:
+ case MONK:
+ case BARD:
+ case ROGUE:
+ case BEASTLORD:
+ case BERSERKER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsSpellFighterClass(uint8 class_id)
+{
+ switch (class_id) {
+ case PALADIN:
+ case RANGER:
+ case SHADOWKNIGHT:
+ case BEASTLORD:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsNonSpellFighterClass(uint8 class_id)
+{
+ switch (class_id) {
+ case WARRIOR:
+ case MONK:
+ case BARD:
+ case ROGUE:
+ case BERSERKER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsCasterClass(uint8 class_id)
+{
+ switch (class_id) {
+ case CLERIC:
+ case DRUID:
+ case SHAMAN:
+ case NECROMANCER:
+ case WIZARD:
+ case MAGICIAN:
+ case ENCHANTER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsINTCasterClass(uint8 class_id)
+{
+ switch (class_id) {
+ case NECROMANCER:
+ case WIZARD:
+ case MAGICIAN:
+ case ENCHANTER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsWISCasterClass(uint8 class_id)
+{
+ switch (class_id) {
+ case CLERIC:
+ case DRUID:
+ case SHAMAN:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsPlateClass(uint8 class_id)
+{
+ switch (class_id) {
+ case WARRIOR:
+ case CLERIC:
+ case PALADIN:
+ case SHADOWKNIGHT:
+ case BARD:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsChainClass(uint8 class_id)
+{
+ switch (class_id) {
+ case RANGER:
+ case ROGUE:
+ case SHAMAN:
+ case BERSERKER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsLeatherClass(uint8 class_id)
+{
+ switch (class_id) {
+ case DRUID:
+ case MONK:
+ case BEASTLORD:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool IsClothClass(uint8 class_id)
+{
+ switch (class_id) {
+ case NECROMANCER:
+ case WIZARD:
+ case MAGICIAN:
+ case ENCHANTER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+uint8 ClassArmorType(uint8 class_id)
+{
+ switch (class_id) {
+ case WARRIOR:
+ case CLERIC:
+ case PALADIN:
+ case SHADOWKNIGHT:
+ case BARD:
+ return ARMOR_TYPE_PLATE;
+ case RANGER:
+ case ROGUE:
+ case SHAMAN:
+ case BERSERKER:
+ return ARMOR_TYPE_CHAIN;
+ case DRUID:
+ case MONK:
+ case BEASTLORD:
+ return ARMOR_TYPE_LEATHER;
+ case NECROMANCER:
+ case WIZARD:
+ case MAGICIAN:
+ case ENCHANTER:
+ return ARMOR_TYPE_CLOTH;
+ default:
+ return ARMOR_TYPE_UNKNOWN;
+ }
+}
diff --git a/common/classes.h b/common/classes.h
index c2f0c8acf..2ca9a3c4d 100644
--- a/common/classes.h
+++ b/common/classes.h
@@ -1,5 +1,5 @@
/* EQEMu: Everquest Server Emulator
- Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
+ Copyright (C) 2001-2016 EQEMu Development Team (http://eqemu.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -17,26 +17,25 @@
*/
#ifndef CLASSES_CH
#define CLASSES_CH
+
#include "../common/types.h"
-#define Array_Class_UNKNOWN 0
-#define WARRIOR 1
-#define CLERIC 2
-#define PALADIN 3
-#define RANGER 4
-#define SHADOWKNIGHT 5
-#define DRUID 6
-#define MONK 7
-#define BARD 8
-#define ROGUE 9
-#define SHAMAN 10
-#define NECROMANCER 11
-#define WIZARD 12
-#define MAGICIAN 13
-#define ENCHANTER 14
-#define BEASTLORD 15
-#define BERSERKER 16
-#define PLAYER_CLASS_COUNT 16 // used for array defines, must be the count of playable classes
+#define WARRIOR 1
+#define CLERIC 2
+#define PALADIN 3
+#define RANGER 4
+#define SHADOWKNIGHT 5
+#define DRUID 6
+#define MONK 7
+#define BARD 8
+#define ROGUE 9
+#define SHAMAN 10
+#define NECROMANCER 11
+#define WIZARD 12
+#define MAGICIAN 13
+#define ENCHANTER 14
+#define BEASTLORD 15
+#define BERSERKER 16
#define WARRIORGM 20
#define CLERICGM 21
#define PALADINGM 22
@@ -58,33 +57,92 @@
#define DISCORD_MERCHANT 59
#define ADVENTURERECRUITER 60
#define ADVENTUREMERCHANT 61
-#define LDON_TREASURE 62 //objects you can use /open on first seen in LDONs
-#define CORPSE_CLASS 62 //only seen on Danvi's Corpse in Akheva so far..
-#define TRIBUTE_MASTER 63
-#define GUILD_TRIBUTE_MASTER 64 //not sure
+#define LDON_TREASURE 62 // objects you can use /open on first seen in LDONs
+#define CORPSE_CLASS 62 // only seen on Danvi's Corpse in Akheva so far..
+#define TRIBUTE_MASTER 63
+#define GUILD_TRIBUTE_MASTER 64 // not sure
#define NORRATHS_KEEPERS_MERCHANT 67
#define DARK_REIGN_MERCHANT 68
#define FELLOWSHIP_MASTER 69
#define ALT_CURRENCY_MERCHANT 70
#define MERCERNARY_MASTER 71
-#define warrior_1 1
-#define monk_1 64
-#define paladin_1 4
-#define shadow_1 16
-#define bard_1 128
-#define cleric_1 2
-#define necromancer_1 1024
-#define ranger_1 8
-#define druid_1 32
-#define mage_1 4096
-#define wizard_1 2048
-#define enchanter_1 8192
-#define rogue_1 256
-#define shaman_1 512
-#define beastlord_1 16384
-#define berserker_1 32768
-#define call_1 65536
-const char* GetEQClassName(uint8 class_, uint8 level = 0);
+
+// player class values
+#define PLAYER_CLASS_UNKNOWN 0
+#define PLAYER_CLASS_WARRIOR 1
+#define PLAYER_CLASS_CLERIC 2
+#define PLAYER_CLASS_PALADIN 3
+#define PLAYER_CLASS_RANGER 4
+#define PLAYER_CLASS_SHADOWKNIGHT 5
+#define PLAYER_CLASS_DRUID 6
+#define PLAYER_CLASS_MONK 7
+#define PLAYER_CLASS_BARD 8
+#define PLAYER_CLASS_ROGUE 9
+#define PLAYER_CLASS_SHAMAN 10
+#define PLAYER_CLASS_NECROMANCER 11
+#define PLAYER_CLASS_WIZARD 12
+#define PLAYER_CLASS_MAGICIAN 13
+#define PLAYER_CLASS_ENCHANTER 14
+#define PLAYER_CLASS_BEASTLORD 15
+#define PLAYER_CLASS_BERSERKER 16
+
+#define PLAYER_CLASS_COUNT 16
+
+
+// player class bits
+#define PLAYER_CLASS_UNKNOWN_BIT 0
+#define PLAYER_CLASS_WARRIOR_BIT 1
+#define PLAYER_CLASS_CLERIC_BIT 2
+#define PLAYER_CLASS_PALADIN_BIT 4
+#define PLAYER_CLASS_RANGER_BIT 8
+#define PLAYER_CLASS_SHADOWKNIGHT_BIT 16
+#define PLAYER_CLASS_DRUID_BIT 32
+#define PLAYER_CLASS_MONK_BIT 64
+#define PLAYER_CLASS_BARD_BIT 128
+#define PLAYER_CLASS_ROGUE_BIT 256
+#define PLAYER_CLASS_SHAMAN_BIT 512
+#define PLAYER_CLASS_NECROMANCER_BIT 1024
+#define PLAYER_CLASS_WIZARD_BIT 2048
+#define PLAYER_CLASS_MAGICIAN_BIT 4096
+#define PLAYER_CLASS_ENCHANTER_BIT 8192
+#define PLAYER_CLASS_BEASTLORD_BIT 16384
+#define PLAYER_CLASS_BERSERKER_BIT 32768
+
+#define PLAYER_CLASS_ALL_MASK 65535 // was 65536
+
+
+#define ARMOR_TYPE_UNKNOWN 0
+#define ARMOR_TYPE_CLOTH 1
+#define ARMOR_TYPE_LEATHER 2
+#define ARMOR_TYPE_CHAIN 3
+#define ARMOR_TYPE_PLATE 4
+
+#define ARMOR_TYPE_FIRST ARMOR_TYPE_UNKNOWN
+#define ARMOR_TYPE_LAST ARMOR_TYPE_PLATE
+#define ARMOR_TYPE_COUNT 5
+
+
+const char* GetClassIDName(uint8 class_id, uint8 level = 0);
+const char* GetPlayerClassName(uint32 player_class_value, uint8 level = 0);
+
+uint32 GetPlayerClassValue(uint8 class_id);
+uint32 GetPlayerClassBit(uint8 class_id);
+
+uint8 GetClassIDFromPlayerClassValue(uint32 player_class_value);
+uint8 GetClassIDFromPlayerClassBit(uint32 player_class_bit);
+
+bool IsFighterClass(uint8 class_id);
+bool IsSpellFighterClass(uint8 class_id);
+bool IsNonSpellFighterClass(uint8 class_id);
+bool IsCasterClass(uint8 class_id);
+bool IsINTCasterClass(uint8 class_id);
+bool IsWISCasterClass(uint8 class_id);
+
+bool IsPlateClass(uint8 class_id);
+bool IsChainClass(uint8 class_id);
+bool IsLeatherClass(uint8 class_id);
+bool IsClothClass(uint8 class_id);
+uint8 ClassArmorType(uint8 class_id);
+
#endif
-
diff --git a/common/clientversions.h b/common/clientversions.h
deleted file mode 100644
index 308a5f091..000000000
--- a/common/clientversions.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
-EQEMu: Everquest Server Emulator
-
-Copyright (C) 2001-2015 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 CLIENTVERSIONS_H
-#define CLIENTVERSIONS_H
-
-#include "types.h"
-
-static const uint32 BIT_Client62 = 0x00000001; // 1 (unsupported - placeholder for scripts)
-
-static const uint32 BIT_Titanium = 0x00000002; // 2
-static const uint32 BIT_SoF = 0x00000004; // 4
-static const uint32 BIT_SoD = 0x00000008; // 8
-static const uint32 BIT_UF = 0x00000010; // 16
-static const uint32 BIT_RoF = 0x00000020; // 32
-static const uint32 BIT_RoF2 = 0x00000040; // 64
-
-static const uint32 BIT_TitaniumAndEarlier = 0x00000003; // 3
-static const uint32 BIT_SoFAndEarlier = 0x00000007; // 7
-static const uint32 BIT_SoDAndEarlier = 0x0000000F; // 15
-static const uint32 BIT_UFAndEarlier = 0x0000001F; // 31
-static const uint32 BIT_RoFAndEarlier = 0x0000003F; // 63
-
-static const uint32 BIT_SoFAndLater = 0xFFFFFFFC; // 4294967292
-static const uint32 BIT_SoDAndLater = 0xFFFFFFF8; // 4294967288
-static const uint32 BIT_UFAndLater = 0xFFFFFFF0; // 4294967280
-static const uint32 BIT_RoFAndLater = 0xFFFFFFE0; // 4294967264
-static const uint32 BIT_RoF2AndLater = 0xFFFFFFC0; // 4294967232
-
-static const uint32 BIT_AllClients = 0xFFFFFFFF;
-
-enum class ClientVersion
-{
- Unknown = 0,
- Client62, // Build: 'Aug 4 2005 15:40:59'
- Titanium, // Build: 'Oct 31 2005 10:33:37'
- SoF, // Build: 'Sep 7 2007 09:11:49'
- SoD, // Build: 'Dec 19 2008 15:22:49'
- UF, // Build: 'Jun 8 2010 16:44:32'
- RoF, // Build: 'Dec 10 2012 17:35:44'
- RoF2, // Build: 'May 10 2013 23:30:08'
-
- MobNPC,
- MobMerc,
- MobBot,
- MobPet,
-};
-
-#define CLIENT_VERSION_COUNT 12
-#define LAST_PC_CLIENT ClientVersion::RoF2
-#define LAST_NPC_CLIENT ClientVersion::MobPet
-
-
-static const char* ClientVersionName(ClientVersion version)
-{
- switch (version)
- {
- case ClientVersion::Unknown:
- return "Unknown";
- case ClientVersion::Client62:
- return "Client62";
- 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";
- case ClientVersion::MobNPC:
- return "MobNPC";
- case ClientVersion::MobMerc:
- return "MobMerc";
- case ClientVersion::MobBot:
- return "MobBot";
- case ClientVersion::MobPet:
- return "MobPet";
- default:
- return " Invalid ClientVersion";
- };
-}
-
-static uint32 ClientBitFromVersion(ClientVersion clientVersion)
-{
- switch (clientVersion)
- {
- case ClientVersion::Unknown:
- case ClientVersion::Client62:
- return 0;
- case ClientVersion::Titanium:
- case ClientVersion::SoF:
- case ClientVersion::SoD:
- case ClientVersion::UF:
- case ClientVersion::RoF:
- case ClientVersion::RoF2:
- case ClientVersion::MobNPC:
- case ClientVersion::MobMerc:
- case ClientVersion::MobBot:
- case ClientVersion::MobPet:
- return ((uint32)1 << (static_cast(clientVersion) - 1));
- default:
- return 0;
- }
-}
-
-static ClientVersion ClientVersionFromBit(uint32 clientVersionBit)
-{
- switch (clientVersionBit)
- {
- case (uint32)static_cast(ClientVersion::Unknown):
- case ((uint32)1 << (static_cast(ClientVersion::Client62) - 1)):
- return ClientVersion::Unknown;
- case ((uint32)1 << (static_cast(ClientVersion::Titanium) - 1)):
- return ClientVersion::Titanium;
- case ((uint32)1 << (static_cast(ClientVersion::SoF) - 1)):
- return ClientVersion::SoF;
- case ((uint32)1 << (static_cast(ClientVersion::SoD) - 1)):
- return ClientVersion::SoD;
- case ((uint32)1 << (static_cast(ClientVersion::UF) - 1)):
- return ClientVersion::UF;
- case ((uint32)1 << (static_cast(ClientVersion::RoF) - 1)):
- return ClientVersion::RoF;
- case ((uint32)1 << (static_cast(ClientVersion::RoF2) - 1)):
- return ClientVersion::RoF2;
- case ((uint32)1 << (static_cast(ClientVersion::MobNPC) - 1)):
- return ClientVersion::MobNPC;
- case ((uint32)1 << (static_cast(ClientVersion::MobMerc) - 1)):
- return ClientVersion::MobMerc;
- case ((uint32)1 << (static_cast(ClientVersion::MobBot) - 1)):
- return ClientVersion::MobBot;
- case ((uint32)1 << (static_cast(ClientVersion::MobPet) - 1)):
- return ClientVersion::MobPet;
- default:
- return ClientVersion::Unknown;
- }
-}
-
-static uint32 ExpansionFromClientVersion(ClientVersion clientVersion)
-{
- switch(clientVersion)
- {
- 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;
- }
-}
-
-#endif /* CLIENTVERSIONS_H */
diff --git a/common/crash.cpp b/common/crash.cpp
index 1f700f151..522d5f171 100644
--- a/common/crash.cpp
+++ b/common/crash.cpp
@@ -25,7 +25,7 @@ public:
}
}
- Log.Out(Logs::General, Logs::Crash, buffer);
+ Log(Logs::General, Logs::Crash, buffer);
StackWalker::OnOutput(szText);
}
};
@@ -35,67 +35,67 @@ LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *ExceptionInfo)
switch(ExceptionInfo->ExceptionRecord->ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_ACCESS_VIOLATION");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_ACCESS_VIOLATION");
break;
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
break;
case EXCEPTION_BREAKPOINT:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_BREAKPOINT");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_BREAKPOINT");
break;
case EXCEPTION_DATATYPE_MISALIGNMENT:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_DATATYPE_MISALIGNMENT");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_DATATYPE_MISALIGNMENT");
break;
case EXCEPTION_FLT_DENORMAL_OPERAND:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_DENORMAL_OPERAND");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_DENORMAL_OPERAND");
break;
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_DIVIDE_BY_ZERO");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_DIVIDE_BY_ZERO");
break;
case EXCEPTION_FLT_INEXACT_RESULT:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_INEXACT_RESULT");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_INEXACT_RESULT");
break;
case EXCEPTION_FLT_INVALID_OPERATION:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_INVALID_OPERATION");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_INVALID_OPERATION");
break;
case EXCEPTION_FLT_OVERFLOW:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_OVERFLOW");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_OVERFLOW");
break;
case EXCEPTION_FLT_STACK_CHECK:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_STACK_CHECK");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_STACK_CHECK");
break;
case EXCEPTION_FLT_UNDERFLOW:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_UNDERFLOW");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_UNDERFLOW");
break;
case EXCEPTION_ILLEGAL_INSTRUCTION:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_ILLEGAL_INSTRUCTION");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_ILLEGAL_INSTRUCTION");
break;
case EXCEPTION_IN_PAGE_ERROR:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_IN_PAGE_ERROR");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_IN_PAGE_ERROR");
break;
case EXCEPTION_INT_DIVIDE_BY_ZERO:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_INT_DIVIDE_BY_ZERO");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_INT_DIVIDE_BY_ZERO");
break;
case EXCEPTION_INT_OVERFLOW:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_INT_OVERFLOW");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_INT_OVERFLOW");
break;
case EXCEPTION_INVALID_DISPOSITION:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_INVALID_DISPOSITION");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_INVALID_DISPOSITION");
break;
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_NONCONTINUABLE_EXCEPTION");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_NONCONTINUABLE_EXCEPTION");
break;
case EXCEPTION_PRIV_INSTRUCTION:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_PRIV_INSTRUCTION");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_PRIV_INSTRUCTION");
break;
case EXCEPTION_SINGLE_STEP:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_SINGLE_STEP");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_SINGLE_STEP");
break;
case EXCEPTION_STACK_OVERFLOW:
- Log.Out(Logs::General, Logs::Crash, "EXCEPTION_STACK_OVERFLOW");
+ Log(Logs::General, Logs::Crash, "EXCEPTION_STACK_OVERFLOW");
break;
default:
- Log.Out(Logs::General, Logs::Crash, "Unknown Exception");
+ Log(Logs::General, Logs::Crash, "Unknown Exception");
break;
}
diff --git a/common/data_verification.h b/common/data_verification.h
index 9da85a579..fe1152cb4 100644
--- a/common/data_verification.h
+++ b/common/data_verification.h
@@ -1,5 +1,6 @@
/* 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
it under the terms of the GNU General Public License as published by
@@ -13,36 +14,42 @@
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
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+
#ifndef COMMON_DATA_VERIFICATION_H
#define COMMON_DATA_VERIFICATION_H
#include
+
namespace EQEmu
{
+ template
+ T Clamp(const T& value, const T& lower, const T& upper) {
+ return std::max(lower, std::min(value, upper));
+ }
-template
-T Clamp(const T& value, const T& lower, const T& upper) {
- return std::max(lower, std::min(value, upper));
-}
+ template
+ T ClampLower(const T& value, const T& lower) {
+ return std::max(lower, value);
+ }
-template
-T ClampLower(const T& value, const T& lower) {
- return std::max(lower, value);
-}
+ template
+ T ClampUpper(const T& value, const T& upper) {
+ return std::min(value, upper);
+ }
-template
-T ClampUpper(const T& value, const T& upper) {
- return std::min(value, upper);
-}
+ template
+ bool ValueWithin(const T& value, const T& lower, const T& upper) {
+ return value >= lower && value <= upper;
+ }
-template
-bool ValueWithin(const T& value, const T& lower, const T& upper) {
- return value >= lower && value <= upper;
-}
+ template
+ bool ValueWithin(const T1& value, const T2& lower, const T3& upper) {
+ return value >= (T1)lower && value <= (T1)upper;
+ }
-}
+} /*EQEmu*/
-#endif
+#endif /*COMMON_DATA_VERIFICATION_H*/
diff --git a/common/database.cpp b/common/database.cpp
index cdafaa165..62a8453d1 100644
--- a/common/database.cpp
+++ b/common/database.cpp
@@ -23,6 +23,7 @@
#include
#include
#include