Skip to content




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


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


  • 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



Renaming Work

  • Renamed struct EQEmu::ItemBase to EQEmu::ItemData and class ItemInst to EQEmu::ItemInstance
  • Added class EQEmu::InventorySlot. Re-attached pertinent inventory token references to EQDictionary


Uleat Changed filenames to facilitate future inventory naming conventions


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)



Massive Overhaul of the Update System and EQEmu Server Management Utility Framework

  • is now a general EQEmu Server management utility framework that can be used to extend to many purposes. It's main purpose is to simplify server management
  • 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 Updates

  • 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 can execute the same name-based operations that

    are present in the interactive menu

    • Example: "perl opcodes" will download opcodes
    • Example: "perl backup_player_tables" will backup and export player tables


  • 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:


Usage analytics

Info now collects usage analytics, this is very helpful for our developers

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 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


noudess Task system experience based on a % of a level did not take into account the hell levels rule. Now it does.


Uleat Changed 'Bind Wound' behavior to match the best references that I could find for post-2004 era.


If you wish to retain the old method, source in the optional 2016_09_03_old_bind_wound_rule.sql script file.



Added Pptional 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 in ip_exemptions with exemption_amount of 1 will allow only 1 account to login from IP
  • Note: If there is no exemption, the amount of accounts logged in from a singular IP will default to World:MaxClientsPerIP


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 didn't think this will be much of a performance problem. Once they path and depop, no more cpu usage.



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



Implemented **O**ptional 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)



Changed "SendZoneSpawnsBulk" Behavior to Use Near/Far Criteria (live-like)

  • 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



Implemented 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



Implemented Zone Memory-Mapped File Usage

  • Zone map files are converted to pre-loaded binary files, bypassing the (sometimes) time-consuming raw data transform process
  • There are three ways to convert files
  -* Do nothing! The zone bootup process will check for a mmf file and load it, if found, or create it after the 'normal' transform process is complete
  -* Use the command line option: zone convert_map <zone_name>.map (for singular conversions)
  -* Drop the '' 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 encounter 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)



Fix up the SpellBuff Struct

  • there shouldn't though, most of the hackery was from badly named fields causing confusion



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


  • 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


  • Noudess Changes personal faction earned min/max to -2000/2000 from -3000/1200


  • Uleat Reworked EQEmuDictionary to use class LookupEntry


  • Uleat Implemented EQEmu::TintProfile
  • Uleat Implemented EQEmu::TextureProfile


  • Uleat Converted enumeration MaterialSlots to EQEmu::textures::TextureSlot


  • Uleat Merged client_version and inventory_version into emu_versions files


  • Uleat Renamed EQEmu::Item_Struct to EQEmu::ItemBase (and appropriate files) to coincide with new inventory naming conventions


  • Uleat Renamed and moved enumeration SkillUseTypes to EQEmu::skill::SkillType * added class EQEmu::SkillProfile, though not implemented at this time
  • Uleat Some more work on eq_dictionary


  • Uleat 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


  • Uleat Changed client 'constants' files to 'limits'


  • 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


  • Uleat Re-coded Titanium client translator 'SerializeItem()' to use coded property assignments over file enumerated ones


  • 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)


  • 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


  • Uleat Reworked EQDictionary into namespace EQEmu


  • 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


  • Uleat Rework of eq_dictionary to facilitate inventory work


  • Uleat Moved database query code out of bot.cpp and into the new BotDatabase class


  • 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.


AE Taunt Fixes, New Bot Command System

  • 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 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



Implement Extra Bind Points (Secondary Recall)

  • For SE_Gate, base2 is which bind to use (starting at 1)
  • For SE_BindAffinity, base1 is which bind to set (starting at 1)
  • For SE_GateCastersBindpoint, base1 is which bind to use (starting at 1)

There was actually no spells that don't send to the main bind, but it uses a base1 of 1 which matches with SE_Gate This also doesn't break anything


  • Uleat Fix for LDoN treasure 'npcs' not leaving a corpse (please report any issues..)


  • Uleat Change in AddItemBonuses now includes ammo slot for skill mods only. Defined SoD client SkillModMax packet property (client does not show..but, does enforce.)


  • Hateborne Added IgnoreSpellDmgLvlRestriction rule (boolean) to ignore the 5 level spread when checking to add SpellDmg


  • Hateborne Added FlatItemExtraSpellAmt rule (boolean) to allow SpellDmg on items to be added as raw damage versus scaled.



Berserker Piercing Fixes, Item Weight Conversions

Fix for Berserker 'Piercing' skill issues. Server Admins: If you run custom skill sets, this patch touches the code segments that you will need to modify if you have changed the default berserker 1H-/2H-piercing skill values.

Uleat (Daerath): Fix for precision-loss item weight conversions in older clients.

  • Note: Cmake must be re-run to include/exclude the required files


  • Kinglykrab Modified #flag so you can refresh your target's account status (GM status level) without them having to relog.
  • 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'


  • Athrogate Adding ClearCompassMark() to Lua.
  • Lua didn't have ClearCompassMark(). Perl already had this.


  • Uleat Fix for tradeskill containers remaining locked after a RoF+ client leaves. Intermediary fix for RoF+ clients accessing tradeskill containers when in use by another player (thanks Natedog!)