Skip to content



  • Trevius (RoF2) Aug Type 21 no longer shows the "Buy Now" button in the aug slot of items.
  • Trevius (RoF2) Identified the "Copied" item flag with the help of Uleat.


  • Trevius (RoF2) Identified a few Item Fields and resolved an issue with cloth armor not accepting certain augments that they should.
  • Akkadius Updated $client->UpdateTaskActivity to have optional argument ignore_quest_update IE: Client::UpdateTaskActivity(THIS, TaskID, ActivityID, Count, [ignore_quest_update])
  • Akkadius Also updated internal UpdateTaskActivity methods to optionally ignore quest based task updates to prevent feedback


  • Uleat Implemented class Client::TextLink as a replacement for the dozens of individual link formatters.


  • Akkadius Add option to automatic database upgrade script 5) Download latest Opcodes from Github
  • Trevius (RoF2) Fixed dropping items on the ground so they go to ground level instead of camera height.
  • Trevius Show Helm Option should be functional again.
  • Kayen Implemented npc special ability (43) CASTING_RESIST_DIFF which sets innate resist modifier on ALL spells used by that NPC. Ie. 43,1,-200 will set a -200 innate resist diff, so if your npc cast

a spell that has a -10 resist modifier the final resist diff would be -210.


  • Uleat Updated 'links' code for all clients


  • Trevius (RoF+) Added herosforgemodel field to the npc_types table.
  • Trevius (RoF2) Updated item links from #npcstat command output.
  • Trevius (RoF+) Implemented Hero's Forge Armor for NPCs. Set the herosforgemodel field in npc_types table to the model (example: 84 for full set, or 12107 for robe).
  • Trevius (RoF+) Hero's Forge Armor now overrides NPC texture settings. To display Hero's Forge Armor Helms, set helmtexture field to anything other than 0.


  • Uleat Tidied up some ItemInst* declarations and added some nullptr checks.
  • Trevius (RoF+) Added support for Hero's Forge Robe Models. Set herosforgemodel field in items table to exact model such as 11607, 11707, etc.


  • Trevius (RoF2) Fixed Tracking.
  • Trevius (RoF+) Added a work-around for the cursor buffer issue.


  • Trevius (RoF2) Fixed Extended Targets Window by correcting opcodes.
  • Trevius (RoF/RoF2) Fixed Guild Rank in the Player Profile, which prevents the guild rank message on login/zone.


  • Akkadius Updated #cvs to display RoF2 Client Stream count


  • Trevius (RoF2) Fixed Leadership AA Purchasing and Recipe Search by correcting opcodes.
  • Trevius Fixed Armor Tinting (players and NPCs) that was broken during a previous update.
  • Trevius (RoF2) Fixed Rest Timer, Show Helm Option, Auto-Consent Options, and identified Krono in the PP.
  • Trevius Fixed Selling for Alternate Currency Merchants for RoF and RoF2.


  • Trevius Finished lining up the RoF2 Player Profile Struct. Zone times are now normal, and everything from the PP is accurate in game now.
  • Trevius Fixed zoning after death for RoF2.


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


  • Trevius (RoF+) Implemented the 6th Augment Slot for Items.
  • Trevius Player Corpses now saved attuned settings for Items.


Required SQL utils/sql/git/required/2014_12_15_multiple_table_updates.sql


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


Required SQL utils/sql/git/required/2014_12_13_inventory_table_update.sql


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


  • 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).
  • mackal SoF+ swarm pets will no longer be F8able (without a hack!)


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


  • Kayen Ranged attacks will now more accurately check MAX firing range, fixing the issue where you would

hit ranged attack and nothing would happpen due to incorrect server side range checks.

  • Trevius Initial addition of the RoF2 client from May 10th 2013 (currently available on Steam as the F2P client).
  • Trevius RoF2 is disabled by default, but you can enable by editing /common/patches/patches.cpp (see comments)


  • Trevius Mercenaries now spawn as the same Gender and Size of the Merchant they are purchased from.
  • Trevius Mercenaries now spawn with randomized facial features when purchased.
  • Trevius Setting a lastname for NPCs will now override any hard coded lastname (such as GM Trainers).


Required SQL utils/sql/git/required/2014_12_01_mercs_table_update.sql


  • Trevius Fixed a zone crash related to numhits for spells.
  • Trevius Fixed a query related to group leaders logging in.

Trevius (Natedog): Fixed a world crash related to attempting to join an adventure with Mercenaries.


  • Kayen Projectiles (ie Arrows) fired from archery will now do damage upon impact instead of instantly (consistent w/ live).


Optional SQL utils/sql/git/optional/2014_11_27_ProjectileDmgOnImpact.sql


  • Trevius Spells that modify model size are now limited to 2 size adjustments from the base size.
  • Trevius Fix to prevent Mercenaries from being set as Group Leader.


  • Trevius Added Rule NPC:EnableMeritBasedFaction (disabled by default) * Allows faction gain to work similar to experience.


  • Trevius Grouping with Mercenaries is now considerably less buggy.
  • Trevius Fixed an issue with Spell Globals related to high Character IDs.
  • Trevius Crash fix for Swarm Pets.


  • Trevius Mercenaries now Dismiss, Suspend, Unsuspend, and Die correctly.


  • Trevius Mercenaries can now zone once again.


  • mackal Correct OP_AugmentInfo reply. This fixes RoF display issue with Adventurer's Stone. Still issues with UF/SoF/SoD though.


  • 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
  • This revision define will need to be incremented each time a database update is made
  • Along with a revision define increment, you will need to update the db_update manifest located in:

    • An entry needs to be made at the bottom of the manifest, the entry is quite simple
    • Example: 9057|2014_11_13_spells_new_updates.sql|SHOW COLUMNS FROM spells_new LIKE 'disallow_sit'|empty|
    • This latest example is checking to see if the spells_new table contains the column 'disallow_sit', if its empty, the update needs to be ran

      • More examples of match types below:

      Example: Version|Filename.sql|Query_to_Check_Condition_For_Needed_Update|match type|text to match

      0 = Database Version

      1 = Filename.sql

      2 = Query_to_Check_Condition_For_Needed_Update

      3 = Match Type * If condition from match type to Value 4 is true, update will flag for needing to be ran

      contains = If query results contains text from 4th value

      match = If query results matches text from 4th value

      missing = If query result is missing text from 4th value

      empty = If the query results in no results

      not_empty = If the query is not empty

      4 = Text to match * The manifest contains all database updates 'Required' to be made to the schema, and it will contain a working backport all the way back to SVN -

    currently it is tested and backported through the beginning of our Github repo

  • On world bootup or standalone run of, users will be prompted with a simple menu that we will expand upon later:


  • Uleat (Natedog) A better fix for OP_ShopPlayerBuy * doesn't cause the issues that I introduced
  • Kayen Implemented NPC Special Ability 41 'Allow To Tank', gives NPC opportunity to take aggro over a client in melee range.
  • Kayen Updated swarm pet AI to be consistent with live.

Old AI

Swarm pet would lock on to target until target died, then depop as soon as target died.

New AI

Swarm pet will attack cast on target, NOT perma locked it can change targets if attacked by something else that generate more hate. When target dies swarm pet will follow owner, if owner is attacked by something else the swarm pet will attack it (until duration timer despawns the pet).

  • Kayen Updated perl quest function: MakeTempPet(Tspell_id, name=nullptr, duration=0, target=nullptr, sticktarg=0)
  • Kayen Implemented perl quest function: Mob::TypesTempPet(npctypesid, name=nullptr, duration=0, follow=0, target=nullptr, sticktarg=0)

Note: 'sticktarg' field will cause the swarm pet to use the OLD AI

Rule to use OLD AI only * default is disabled


Optional SQL utils/sql/git/optional/2014_11_15_SwarmPetTargetLock.sql


  • Secrets Identified object size and solidtype as flags. Exported them as functions to Perl.
  • 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)


  • Kayen Implemented target type (44) 'Beams' (which projects an AE infront of caster with a specified length and width).
  • Kayen Implemented target type (32) AE Target HateList
  • Kayen Implemented target type (36) Area Client Only
  • Kayen Implemented target type (37) Area PC Only
  • Kayen Implemented target type (39) Group No Pet
  • Uleat PlayerLogMerchantTransactions does not support partial stack purchase logging at this time


  • Uleat Changed 'GMTrainee' struct to reflect the actual client hard-coded max skill count (100) * applies to all currently supported clients (6.2->RoF)


  • Uleat Third attempt at a fix for GM trainer zone crashes... (this is starting to look like a KLS fix...)


  • Uleat Fix for GM Trainer crashing server (really!)
  • JJ Yellow faction messages.


  • Kayen Implemented support for spell target type (45) 'Target Rings' on Underfoot (does work earlier expansions). Thanks to Lecht for figuring out the op_code side.
  • JJ Implement new Live-like faction adjustment message using rule Client:UseLiveFactionMessage.

Optional SQL: utils/sql/git/optional/2014_11_09_LiveFactionMessages.sql


  • mackal Tracking default sort will now be correct order
  • Trevius Fixed dynamic merchant list loading. Allows any merchant to be used in any zone.


  • Secrets Fixed an overflow in melee lifetap calculations (int16 vs int32)
  • Secrets Fixed overflow on AC and ATK values that can go out of range.
  • Secrets Merc/Bot fixes for previous updates.
  • Secrets Changed a lot of int16s for stat-related functions to int32 because they were causing combat formula overflows (int16/int32 mismatch).
  • Secrets Linux fix?


  • Akkadius Added out of range checking for Spell Save/Loads



  • Uleat Added Client::InterrogateInventory(). Can be invoked by #interrogateinv and is also called when Handle_OP_MoveItem() calls for SwapItemResync()


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


  • mackal Inspect Buffs rank 1 will now show NPC buffs in target window (SoD+)


  • Uleat Updated command #peekinv to display item links properly in RoF clients
  • 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


  • mackal Implement group mentor, sharing leadership exp (SoF+ only)
  • mackal Add gaining of group leadership while in raids


  • Uleat Fixed the auto-conversion view naming error and renamed the views in the script files. Added a fix sql for databases that auto-converted.

Fix SQL: ../sql/git/bots/deprecated/2014_10_16_Lower_Case_View_Fix.sql


  • Uleat Cleaned up load/drop bots sqls, added '../utils/sql/git/bots/deprecated' and '../deprecated/load_bots_old.sql' (use this file on pre-player blob conversion databases.)

Notes: I modifed the behavior of both load and drop bots to fail on the first operation if their modifications have been performed already.

 'load_bots.sql' will explicitly add bot schema, while 'drop_bots.sql' will explicitly drop it. I also added a few lines to change
 a few altered tables back to their original state * as of the date in the file.


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


  • Akkadius Fix for LDON Character Stat load


  • mackal Implement Raid MOTD for UF

Don't forget 2014_10_11_RaidMOTD.sql!


  • Uleat Added 'BOTS' conversion code to supplement the database 'PlayerProfile' blob conversion that Akkadius recently implemented


  • mackal Identified tutorial flag in all charcreate packets, reworked logic to correctly set homes binds


  • Uleat Added Server<->Corpse slot translators needed for re-enumeration (inactive until phased in)


  • Uleat Fixed Ti(6.2) OP_AugmentInfo translation that I broke (does not currently need and I mis-read a process)
  • Uleat Moved client patch OP_LootItem slot translation to external handlers


  • Kayen Exported to PERL $client->SendSpellAnim(targetid, spellid)

This function sends the spell graphic of a spell without actually having to cast the spell.


  • Uleat First round of Ti/6.2 translators added * needed for re-enumeration


  • Kayen Exported to PERL $client->SendColoredText(color, msg)
  • mackal Exported SendColoredText to lua


  • Uleat Implemented click-casting from bag slots for clients that natively support it (RoF)


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


  • Kayen Implemented perl function $mob->GetSpellStat(spell_id, identifier, slot);

Note: identifier is the stat field in spells_new, slot is used for certain effects like effectid, base,base2, max ect.

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.

  • 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 = haste) to ...
  • mackal Correct Hundred Hands effect and use formula provided by devs


  • Uleat Re-ordered server opcodes and handlers to give them some predictability of location (I need this for the inventory re-enumeration.)
  • mackal Added helper function bool EQEmu::IsTradeskill(uint32 skill)


  • Kayen Spell recourse effects will now be applied AFTER the base spells effects have been applied (consistent with live).
  • Kayen SE_ApplySpell and SE_TriggerSpell will now be applied based on which effect slot they are used in (instead of always before all spell effects are checked).

Note: If a spell has multiple SE_TriggerSpell effects within it. Only one will be able to trigger. (If you want multiple spells use SE_ApplySpell)


  • Akkadius #resetaa now covers the function of #resetaa and #refundaa
  • resetaa will wipe all AA data, refund the spent points into the available points and send character to character select properly
  • Akkadius Removed #refundaa
  • Akkadius Removed a lot of debug code for blob conversion
  • Akkadius Changed status logging for loads/saves to Debug category


  • Akkadius Player Profile Blob to Database Conversion
  • Summary: HUGE difference in database speeds reads/writes and 1:10 datasize difference

    • The new character storage engine unlike the character_ table before, is able to properly index data and make use of

    proper MySQL/MariaDB caching optimizations and performance has increased phenominally


    • EZ Server Character data size of 2.6GB character_ table alone now takes up approx 600MB
    • Character Data Loads take approx .03 seconds BEFORE MySQL/MariaDB cache
    • Character Data Loads take approx .001-.0035 seconds AFTER MySQL/MariaDB cache
    • Character Data Saves take approx .0001 * .003 for any particular save operation
    • Database Auto Conversion: When the 'character_' table exists, World boot-up will queue an auto-conversion prompt and convert all of your characters, BACKUP

    YOUR DATABASE BEFORE CONVERTING, here is an EASY backup script:

    • On auto conversion, the following tables are created automatically:
      • Table: character_skills * Stores Character Skills
      • Table: character_languages * Stores Character Language
      • Table: character_bind * Stores Character Bind point and Home Bind point designated by is_home bool field
      • Table: character_alternate_abilities * Stores all Character AA
      • Table: character_currency * Stores all Platinum/Gold/Silver/Copper and character related currencies
      • Table: character_data * Stores basic character data (Fields from character_ table migrated to this table)
      • Table: character_spells * Stores character spells
      • Table: character_memmed_spells * Stores character memorized spells
      • Table: character_disciplines * Stores character disciplines
      • Table: character_material * Stores character armor dye textures
      • Table: character_tribute * Stores character tributes
      • Table: character_bandolier * Stores character bandoliers
      • Table: character_inspect_messages * Stores character inspection messages (Moved from character_ table)
      • Table: character_leadership_abilities * Stores character Leadership AAs
    • Loads: Majority of Player profile loads now occur at Client::Handle_Connect_OP_ZoneEntry

    LoadCharacterFactionValues(uint32 character_id, faction_map & val_list);

    LoadCharacterSpellBook(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterMemmedSpells(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterLanguages(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterDisciplines(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterSkills(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterData(uint32 character_id, PlayerProfile_Struct pp, ExtendedProfile_Struct m_epp);

    LoadCharacterCurrency(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterBindPoint(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterMaterialColor(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterBandolier(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterTribute(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterPotions(uint32 character_id, PlayerProfile_Struct* pp);

    LoadCharacterLeadershipAA(uint32 character_id, PlayerProfile_Struct* pp);

  • Saves: Occur all over the code now instead of calling full saves

    SaveCharacterBindPoint(uint32 character_id, uint32 zone_id, uint32 instance_id, float x, float y, float z, float heading, uint8 is_home);

    SaveCharacterCurrency(uint32 character_id, PlayerProfile_Struct* pp);

    SaveCharacterData(uint32 character_id, uint32 account_id, PlayerProfile_Struct pp, ExtendedProfile_Struct m_epp);

    SaveCharacterAA(uint32 character_id, uint32 aa_id, uint32 current_level);

    SaveCharacterSpell(uint32 character_id, uint32 spell_id, uint32 slot_id);

    SaveCharacterMemorizedSpell(uint32 character_id, uint32 spell_id, uint32 slot_id);

    SaveCharacterMaterialColor(uint32 character_id, uint32 slot_id, uint32 color);

    SaveCharacterSkill(uint32 character_id, uint32 skill_id, uint32 value);

    SaveCharacterLanguage(uint32 character_id, uint32 lang_id, uint32 value);

    SaveCharacterDisc(uint32 character_id, uint32 slot_id, uint32 disc_id);

    SaveCharacterTribute(uint32 character_id, PlayerProfile_Struct* pp);

    SaveCharacterBandolier(uint32 character_id, uint8 bandolier_id, uint8 bandolier_slot, uint32 item_id, uint32 icon, const char* bandolier_name);

    SaveCharacterPotionBelt(uint32 character_id, uint8 potion_id, uint32 item_id, uint32 icon);

    SaveCharacterLeadershipAA(uint32 character_id, PlayerProfile_Struct* pp);

  • Deletes:

    DeleteCharacterSpell(uint32 character_id, uint32 spell_id, uint32 slot_id);

    DeleteCharacterMemorizedSpell(uint32 character_id, uint32 spell_id, uint32 slot_id);

    DeleteCharacterDisc(uint32 character_id, uint32 slot_id);

    DeleteCharacterBandolier(uint32 character_id, uint32 band_id);

    DeleteCharacterLeadershipAAs(uint32 character_id);

  • Now occur all over the code and only trigger when necessary

  • Two FULL saves when looting a corpse, this has been reduced to just currency saves on initial loot and trimmed to one save since AddToMoneyPP did it already
  • Every time a player moves coin with any situation (Splits/Trades/Merchant/Skills/Bank Coin Exchange/Coin Moves), a full save is made, this is now just a currency save
  • Every time a player skilled up at a skill vendor, a full blob save hit was made, this is not just a currency hit
  • Every time an AA was purchased, a full save was made
  • Every time a spell was scribed/swapped, disc was trained
  • When a client exists a zone, when a client enters a zone
  • NOTE: These amount of excessive saves have caused scalability issues that cause the character_ table to hang which causes process hangs that affect the whole server

    because of the slowness of the character_ table and the blob not allowing any indexing to occur

  • All functions that once depended on the character_ table are now rewritten to appropriately read from the character_data table

  • Database query errors that occur during conversion or from and load/save/delete character functions are now leveraged via ThrowDBError and logs now go to

    Server_Folder_Root/eqemu_query_error_log.txt (You cannot log errors natively through MySQL)

  • DBASYNC IS NOW COMPLETELY REMOVED * This was mainly for Character data async loads/saves and merchantlist loads

  • Side implementations: Perl Exports:

    • quest::crosszonesetentityvariablebynpctypeid(npctype_id, id, m_var) * Sets entity variables world wide with specified npctype_id
    • quest::crosszonesignalnpcbynpctypeid(npctype_id, data) * Signals all NPC entities world wide with specified npctype_id
    • $client->GetTaskActivityDoneCount(TaskID, ActivityID) * Gets task activity done count by task id and activity id for client entity


    SELECT CONCAT(table_schema, '.', table_name) as table_name, CONCAT(ROUND(table_rows / 1000000, 2), 'M') rows, CONCAT(ROUND(data_length / ( 1024 1024 1024 ), 2), 'G') DATA, CONCAT(ROUND(index_length / ( 1024 1024 1024 ), 2), 'G') idx, CONCAT(ROUND(( data_length + index_length ) / ( 1024 1024 1024 ), 2), 'G') total_size, ROUND(index_length / data_length, 2) idxfrac FROM information_schema.TABLES WHERE table_name LIKE 'character_%' ORDER BY DATA DESC;


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


  • 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


  • 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


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

  • mackal Fix some effect calcs + implement more (derived from the client)


  • Kayen Nimbus effects will now be reapplied after zoning and will be removed when associated buff fades.


  • mackal Fix rogues not having Thieves' Cant


  • mackal Incrase Mob kick/bash timer by 3


  • mackal Fix slow effect on NPC special attack reuse timers


  • mackal Slow fixes to bots!
  • mackal Revamped how NPC attack rate is set

SQL: 2014_09_09_attack_delay.sql

  • mackal Added attackdelay to #npcedit


  • mackal Fix slow calc



  • Akkadius Fixed ROF Augment item dupe with not checking for available slots properly and adding items to the virtual instance


  • Uleat Tweaked 'Smart' trading code to return main slots before sub slots in stackable and free space search processes. (If enough people ask for it, I'll add an optional rule to allow 'bag packing' * the original implementation behavior)


  • Uleat Fix for cursor item loss when zoning. (Thanks to the other devs who traced and fixed the 'macro' issue!)
  • mackal Fix size getting nuked with lua's SendIllusionPacket


  • 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.
  • mackal Added work around command to show numhits on your buffs (#shownumhits)
  • Uleat Fix for timer issue introduced by Zone::ShutDown() fix.


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

  • 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


  • KLS Fixed a bug in fishing in S3D zones
  • KLS Fixed a bug in turnins with new any abstraction
  • KLS Fixed a few quest related inconsistencies.
  • KLS Added Lua EntityList::ChannelMessage(from, type, msg, language)


  • mackal (noudess) Merchants should be more descriptive of why they don't sell to you


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

Note: QueryServ logs previously listed 'Items' on the main entry table. This indicated the number of slots affected and not the actual number of items.

This field now indicates the actual number of items transferred. For non-stackable, the value is '1' and stackable is the number of charges. A _detail_count

property has been added to both 'Trade' and 'Handin' structs to indicate the number of details recorded..though, not could be added.


  • Uleat Fix (attempted) for zone crashes related to zone shut-down. This change disables all Mob AI and disables/deletes all Mob timers once Zone::ShutDown() is called. More areas will be addressed as reports come in.

Note: Perl and Lua quests tested to work..please post any aberrant behavior. (I finally set my spell-check to US English...)

  • Akkadius Character creation process crash fix and query cleanup
  • Akkadius Created character_lookup table for applications that mirrors all character_ table fields minus blob fields for application lookups
  • A 2.4GB character_ table will take 7 seconds to query on a SSD versus .1s on the character_lookup table
  • This also causes applications like Magelo to burst reads of the entire character table because of the blob fields that come with the reads, as much as 500-600MB/s even if a indexed id filter is provided
  • This field is synchronized on player save and has 0.001s DB hit
  • When we split out from the blob, ideally this table can be removed
  • Required SQL: utils\sql\git\required\2014_08_24_character_lookup.sql


  • Akkadius Changed zone process window title format, example: 'crushbone :: clients: 6 inst_id: 1 inst_ver: 0 :: port: 7015'
  • Akkadius Most of the following changes are QueryServ related, fully implemented its original functionality to be able to offload

intensive or metric based logging to a remote server process that could exist on another server entirely

  • Akkadius Implemented Player Event Logging Types (Go to table qs_player_events)
      1 = Player_Log_Quest,
      2 = Player_Log_Zoning,
      3 = Player_Log_Deaths,
      4 = Player_Log_Connect_State,
      5 = Player_Log_Levels,
      6 = Player_Log_Keyring_Addition,
      7 = Player_Log_QGlobal_Update,
      8 = Player_Log_Task_Updates,
      9 = Player_Log_AA_Purchases,
      10 = Player_Log_Trade_Skill_Events,
      11 = Player_Log_Issued_Commands,
      12 = Player_Log_Money_Transactions,
      13 = Player_Log_Alternate_Currency_Transactions,
  * All QueryServ logging will be implemented with a front end in EoC 2.0 very soon
  * Architecture page:
  • Akkadius Changed all QS Error related logging to 'QUERYSERV__ERROR'
  • Akkadius (Natedog) (Crash Fix) Legacy MySQL bug revert for loading AA's
  • Akkadius Implemented Perl Quest objects (LUA still needed to be exported):
  • quest::qs_send_query("MySQL query") * Will send a raw query to the QueryServ process, useful for custom logging
  • quest::qs_player_event(char_id, event_desc); * Will process a quest type event to table qs_player_events
  • Akkadius Added MySQL Tables
  • qs_player_aa_rate_hourly
  • qs_player_events
  • Source table structures from:

    • utils\sql\git\queryserv\required\08_23_2014_player_events_and_player_aa_rate_hourly

    To get the complete QueryServ schema, source from here:

    • utils\sql\git\queryserv\required\Complete_QueryServ_Table_Structures.sql
    • Akkadius Added rules for each logging type, source rules here with them enabled by default:
    • utils\sql\git\queryserv\required\Complete_QueryServ_Rules_Enabled.sql
    • Akkadius Spawn related logging cleanup
    • Akkadius General code cleanup
    • Akkadius More to come for QueryServ


  • Uleat Rework of Trade::FinishedTrade() and Trade::ResetTrade() to parse items a little more intelligently.

Trade window items are now sent to client inventory in this order:

  • Bags
  • Partial stack movements
  • All remaining items

If any of these procedures cause any problems, please post them immediately.


  • Uleat Rework of Trade::AddEntity() * function used to move items into the trade window. Now accepts argument for 'stack_size' and updates client properly.

Note: I tested trade with Titanium:{SoF,SoD,UF,RoF} in both directions and no client generated an OP_MoveItem event for attempting to place a stackable

onto a partial stack already in the trade window. The only way to achieve stacking is to click on the receiving client. If there is a partial stack remaining

on the cursor after the OP_MoveItem event, and there is room available, the client will generate subsequent events to move the remaining count.


  • Akkadius Implemented a Stop_Return feature (Accidental item handin prevention) that will be symmetrically used with plugin::return_items that I am currently running live testing on EZ before releasing to EQEmu. This does not hurt to have this in the source.
  • Akkadius Fixed crash where 'attacker' validation is not being checked
  • Akkadius Removed petition console spam that does not follow traditional logging and is useless
  • Akkadius Made fix with SympatheticProcChances where it was checking for TempItem->Focus.Effect instead of TempItemAug->Focus.Effect



  • KLS (addmoreice) Trying out some unstable DB changes. Do backup your database before trying them as master will be considered unstable for a few days at least.

Uleat (Noudness): Fixed a floating-point comparison error that led to the notorious 'client bounce' (this is not related to the

'mob falling' due to not having maps installed.) This fix also eliminates a sizeable amount of unnecessary out-going packets due

to invalid orientation corrections.

Note: This patch is probably of significant enough importance that admins may wish to manually apply this to older server builds.

The number of packets reduced per second should be approximately (num_stationary_close_clients (num_close_clients 1)). This will

likely have the most effect in zones like: Nexus, Bazaar, Guilds (Halls) and RAID INSTANCES * where players don't move around a lot.


  • Uleat Reactivated the Bot::Spawn() code for sending post-spawn wear change updates..temporary until I can sort out the proper usage.


Uleat (Kingly_Krab): Fix for bot chest armor graphic glitch. (fix also caused RoF #wc to work properly)


  • Kayen Implemented spell_news fields
  • npc_no_los (check if LOS is required for spells)
  • InCombat, OutofCombat * Used together to restrict spells to only be cast while

in/out of combat (beneficial) or if target is in/out of combat (detrimental).

-min_dist, min_dist_mod, max_dist, max_dist_mod * Scales spell power based on targets distance from caster.

*This will require further work to fully implement but will work with 90% of live spells as is.

*If making custom spells do not include effects that can't be scaled (like a spell trigger)

  • min_rage sets minimum distance range that must be away from target.


Required SQL utils/sql/git/required/2014_08_02_spells_new.sql


  • Uleat More inventory slot constant conversions. This should be the bulk of everything..but, due to the size of the server code, there

may be some hidden ones. (client_packet.cpp and the client translators still need a thorough review.)

Note: Please report any abnormal behaviour with inventory-related content..each diff file was reviewed 3 times..but, things CAN be missed.

  • Uleat Test fix for client crashes in Bazaar, while actively selling, with a charm in the Trader's Satchel.


  • Uleat More updates to the dictionary. Added a 'constants' file for each client translator..these will tie-in to the dictionary. Started

replacement of hard-coded numeric values with a pre-defined constant. This will help in the transition.


  • Uleat Initial commit of new client/server 'dictionaries' * work in-progress... Changed equipment slot references to reflect new naming

conventions. Lua enumerations maintain both the old and new names as to not break existing scripts..but, the old names are deprecated.


  • KLS Changes to CMake build
  • Lua builds by default now
  • Common has been renamed common
  • Binary files will now be put into ${CMAKE_BINARY_DIR}/bin instead of ${CMAKE_BINARY_DIR}/Bin
  • The last two are of note to people on non-windows systems as case sensitivity is important. Edit your scripts accordingly, thank you.


  • Kayen Updated table npc_spells to now support defensive and ranged procs.

Note: Proc rate modifier work as it does for spell effects (ie 200 = 200% baseline chance modifier)

Table is also now contains 12 AI spell casting variables that can be set to fine tune casting behaviors per spell set.

Global default rules have also been added that can further fine tune all content if no specific variables are set.

Descriptions of new AI casting fields in npc_spells 'fail_recast' AI spell recast time(MS) when an spell is cast but fails (ie stunned) 'engaged_no_sp_recast_min' AI spell recast time(MS) checked when no spell is cast while engaged in combat. (min time in random) 'engaged_no_sp_recast_max' AI spell recast time(MS) checked when no spell is cast while engaged in combat. (max time in random) 'engaged_b_self_chance' Chance during first AI Cast check to do a beneficial spell on self (ie check to heal self) 'engaged_b_other_chance' Chance during second AI Cast check to do a beneficial spell on others.(ie check to heal others) 'engaged_d_chance' 'Chance during third AI Cast check to do a determental spell on others (ie check to nuke others) 'pursue_no_sp_recast_min' AI spell recast time(MS) checked when no spell is cast while chasing target. (min time in random) 'pursue_no_sp_recast_max' AI spell recast time(MS) checked when no spell is cast while chasing target. (max time in random) 'pursue_d_chance' Chance while chasing target to cast a detrimental spell. 'idle_no_sp_recast_min' AI spell recast time(MS) checked when no spell is cast while idle. (min time in random) 'idle_no_sp_recast_max' AI spell recast time(MS) checked when no spell is cast while idle. (max time in random) 'idle_b_chance' Chance to cast a beneficial spell while idle (ie cast heal on self while out of combat).

  • Kayen Updated table npc_types, adding field 'ranged_type' and 'ammo_idfile' 'ranged_type' Will set what skill / animation is used when NPC uses a ranged attacked (special ability 11) 'ammo_idfile' Will set what projectile graphic an NPC uses in a ranged attacked (special ability 11) Format IT#### (same as item 'idfile') (Set to IT11118 for some fun) Added parameters: SPECATK_RANGED_ATK = 11 Param0: Min Ranged distance (default: 25) Param1: Max Ranged distance (default: 250) Param2: Percent Chance to Hit modifier Param3: Percent Total Damage modifier
  • Kayen Updated to Chance to Hit code with how bonuses are applied to be consistent for all effects. Added field to npc_types 'Avoidance' which will modify chance to avoid melee Added rules to set max and min chance to hit from melee/ranged (Default 95% / 5%)

Required SQL: utils/sql/git/required/2014_07_10_npc_spells.sql Optional SQL: utils/sql/git/optional/2014_07_10_AICastingRules.sql


  • Kayen Updated SE_Sanctuary * Adjust way hate lowering effect worked to be more accurate
  • Kayen Updated SE_SympatheticProc * Revised proc rate formula to be accurate to live.

Sympathetic foci on items with proc rate mod will now benefit from that modifier.

Sympathetic foci can now be placed on AA's (This should always be slot1 in the AA)

  • Kayen Implemented SE_IllusionPersistence* Allows illusions to last until you die or the illusion is forcibly removed.
  • Kayen Added rule 'PreNerftBardAEDot' for SE_BardAEDot to allow it to once again do damage to moving targets. (Set to true)
  • Kayen Completely revised SE_SkillProc, SE_LimitToSkill, SE_SkillProcSuccess to overall just work better and more accurately, AA support.

Required SQL: utils/sql/git/required/2014_07_04_AA_Update.sql


  • Kayen Implemented SE_Sanctuary * Places caster at bottom hate list, effect fades if caster cast spell on targets other than self.
  • Kayen Implemented SE_ResourceTap * Coverts a percent of dmg from dmg spells(DD/DoT) to hp/mana/end.
  • Kayen Implemented SE_FactionModPct * Modifies faction gains and losses by percent.
  • Kayen Re-Implemented SE_TriggerMeleeThreshold and SE_TriggerSpellThreshold correctly * Trigger spell if owner of buff

takes more than the specified damage amount in a SINGLE hit, then fade the buff.

  • Kayen Implemented SE_LimitSpellClass * Focus Limits spell to pre defined categories. (3=Cures,3=Offensive, 6=Lifetap)
  • Kayen Changed SE_LimitMaxMana to SE_MeleeVulnerability * Weakness/Mitigation verse melee damage

(Despite lives SPA lable as the former it clearly is not what the effect does from all spell examples)

  • Kayen Updated SE_BardAEDot to no longer damage target while target is moving (consistent with live)
  • Kayen Update SE_InterruptCasting: Will now work for instant spells (as well as over time).


  • Kayen Updated SE_Hate (Renamed from SE_Hate2) to now properly work for instant +/* hate spells.
  • Kayen Updated SE_FadingMemories * Base value will be properly utilized to set % chance for fade effect to work.
  • Kayen Implemented SE_StrikeThough (Was incorrectly defined as implemented previously) * Works same as item bonus.
  • Kayen Update SE_Taunt * Limit value if present will now add instant hate.
  • Kayen Implemented SE_MassGroupBuff * Allows next group buff cast to be a MGB (AA now uses this)
  • Kayen Implemented SE_IllusionOther * Allows next Illusion buff (self only) cast to be cast on target. (AA now uses this)
  • Kayen Update SE_AETaunt * Base value will now determine AE taunt range (This will not result in any change to currently used spells).
  • Kayen Updated SE_ReclaimPet * Correct forumla for mana returned to properly return 75% of actual pet spell mana cost.
  • Kayen Implemented SE_ImprovedReclaimEnergy * Modifies % mana returned from SE_ReclaimPet.
  • Kayen Implemented SE_HeadShot, SE_HeadShotLevel * Defines headshot damage and level requirements.

Revised HeadShot mechanic so damage now receives all archery bonuses, proc chance can be set to either (lives new Proc Per minute

system, or flat chance based on dex (formula updated).

  • Kayen Implemented SE_Assassinate, SE_AssassinateLevel * Defines assassinate damage and level requirements.

Revised Assassinate mechanic so damage now receives all backstab bonuses, proc chance can be set to either (lives new Proc Per minute

system, or flat chance based on dex (formula updated). Assassinate can now proc from THROW if behind target, various other adjustments.

  • Kayen Fix to AA Finishing Blow missing aa_effects data, update required SQL.

Revised Finishing blow so that damage now receives all melee bonus. Support also for this effect if placed on items or spells.

  • Kayen Implemented SE_PetMeleeMitigation * Bonus applied to pet owner. Gives AC to owner's pet.


Required SQL utils/sql/git/required/2014_06_25_AA_Update.sql

Optional SQL utils/sql/git/optiional/2014_06_29_HeadShotRules.sql


  • Kayen Implemented SE_AStacker, SE_BStacker, SE_CStacker, SE_DStacker.

These effects when present in buffs prevent each other from stacking,

Any effect with B prevents A, C prevents B, D prevents C.

  • Kayen Implemented SE_DamageModifier2 (Stacks with SE_DamageModifier, mods damage by skill type)
  • Kayen Implemented SE_AddHatePct (Modifies +/* your total hate on NPC by percent)
  • Kayen Implemented SE_AddHateOverTimePct (Modifies +/* your total hate on NPC by percent over time)
  • Kayen Implemented SE_DoubleRiposte (Modifies +/ your double riposte chance) Not used in any live effects
  • Kayen Implemented SE_Berserk (Sets client as 'Berserk' giving chance to crippling blow) *Not used in any live effects
  • Kayen Implemented SE_Vampirsm (Stackable lifetap from melee effect) *Not used in any live effects
  • Kayen Minor fixes to how lifetap from melee effects are calced. Removed arbitrary hard cap of 100%, Negative value will now dmg client.
  • Kayen Fix to issue that prevented NPC's from receiving HP Regeneration derived from spell buffs.
  • Kayen Fixes and Updates for melee and spell mitigation runes.
  • Kayen Update to SE_NegateAttack, 'max' value can now set upper limit of damage absorbed. DOT ticks will no longer be absorbed.
  • Kayen Implemented SE_Metabolism * Modifies food/drink consumption rates. [Data for AA is already in database]
  • Kayen Update to SE_BalanaceMana, SE_BalanceHP to support limit value which caps max mana/hp that can be taken per player.


  • Kayen For table 'npc_spell_effects_entries' setting se_max for damage shield effects (59) will now determine the DS Type (ie burning)

Setting se_max to 1 for SkillDamageTaken effects (127) will allow for stackable mitigation/weakness same as quest function ModSkillDmgTaken.

  • Kayen Implemented SE_AlterNPCLevel (not currently used on live). Will +/* to NPC level. When fade will revert back to original level.
  • Kayen Implemented 'special_abilities' 38 ALLOW_BENEFICIAL (Allows an NPC to recieve player buffs/heals)
  • Kayen Implemented 'special_abilities' 39 DISABLE_MELEE (Prevents NPC from auto attacking, will still aggro)

Note: These two special abilities were previously implemented and still remain as quest functions. (SetDisableMelee() and SetAllowBeneficial())


  • KLS Changed lua API: eq.get_globals(client, npc) has been removed. Use eq.get_globals(npc, client) instead.

There's a bug with something in gcc 4.6.3 (maybe other versions) on x86 that this is attempting to combat.


  • Secrets Identified the opcode/struct for guild ranks in Rain of Fear+ clients.
  • Secrets Implemented a work-around for Rain of Fear clients to have all guild permissions until proper database support is added for newer ranks.


  • Kayen Rooted NPC's will no longer target players with Divine Aura effect if they are the closest target and other targets exist on the hate list.


  • Uleat Re-arranged functions in Item.cpp to somewhat match the order they are declared in Item.h. Should make finding their location a little easier when using declarations as a guide. (This will facilitate readability of an upcoming change...)


  • Kayen AA/Item/Spells that allow pets to critical and flurry will now work on the owners swarm pets consistent with live.


  • Uleat Oops! Wrong state check (conn_state != client_state)
  • Uleat Test fix to eliminate seemingly random crashes when an AE spell is being used. (Possible access to uninstantiated pointers during client connection process when someone casts a beneficial AE spell within range of a connecting client.)


  • KLS Implemented new map code based on some of Derision's earlier work. Old maps still work with this system and don't need to be regenerated. We're still working on a new azone solution for better/more efficient maps.


  • Kayen Implemented new table 'npc_spells_effects' and 'npc_spells_effects_entires'
  • Implemented new field in 'npc_spell_effects_id' in npc_types.
  • These are used to directly apply spell effect bonuses to NPC's without requirings spells/buffs. Example: Allow an npc to spawn with an innate 50 pt damage shield and a 5% chance to critical hit. Please see the wiki page: for details. *NPC's can now do critical heals / damage spells if bonus is applied from table.


  • cavedude Corrected a crash in spawn_conditions caused by NPCs on a one way path.
  • cavedude Added strict column to spawn_events which will prevent an event from enabling if it's mid-cycle.
  • cavedude Prevented disabled or strict spawn_events from enabling when the zone first boots.
  • cavedude Fixed the quest function toggle_spawn_event under Perl.

If you're using the quest function toggle_spawn_event (worked on Lua only) it has changed syntax to: toggle_spawn_event(int event_id, bool enable, bool strict, bool reset_base)


Required SQL utils/sql/git/required/2014_04_25_spawn_events.sql


  • Kayen Improved SE_LimitCombatSkills will now more accurately determine if a spell is a combat proc.
  • Kayen SE_LimitInstant will now also work when set to include instant spells


Optional SQL utils/sql/git/optional/2014_04_23_FocusComabtProcs.sql Note: Set to false, if enabled will allow all combat procs to receive spell focuses.


  • Secrets Crash fix for more hatelist crashes.
  • Secrets Hate list fixes, again.
  • Secrets Revert of hatelist changes.


  • Secrets Changed the functionality of EQDEBUG cmake flag. It now suppresses logs, but shows crashes in any scenario when set to 1. It will also now show crashes even if the log system is disabled.
  • KLS Change to how quest signals work, signals with no delay will now be added to the signal queue. This addresses an odd timing issue where NPCs are in a state of life/death flux when a signal from event_death goes off.
  • KLS Added cmake flags to define how logging behavior works for each different log type.
  • Secrets Crash fix for Hatelist crash observed


  • Akkadius Added #command error message suppression for those who don't want to see 'Command is not recognized' constantly
  • You need to have rule 'Chat:SuppressCommandErrors' set to true, this is set to false by default


Required SQL 2014_04_18_Suppress_Command_Error.sql


  • Akkadius Exported $client->SendMarqueeMessage(type, priority, fade_in, fade_out, duration, msg) * Will be available for simple plugin use
  • Akkadius Exported $client->ExpeditionMessage(THIS, ExpdID, Message)
  • In use with custom expedition mod that will be released soon


  • Kayen Fixed an with the slow mitigation code that would cause it to spam the message. Optimized the way the variable is handled for slow mitigation.


Required SQL utils/sql/git/required/2014_04_12_SlowMitigation.sql

This changes the variable type in the sql table from FLOAT to INT and updates your database

(When setting slow mitigation 50 = 50%, 100 = 100% ect. You can also set > 100 which will cause slow to become haste now with appropriate in game msg given)


  • Kayen Added 'no_target_hotkey' field to npc_types table. This will prevent the NPC from being targeted with F8 ( *Warning Will also turn it's name YELLOW)
  • Kayen Added a rule to make all (Player cast) Swarm Pets not targetable with F8 (nearest NPC) by default ( *Warning Will also turn pets names YELLOW). This is semi-hack but it works.
  • Kayen Player cast swarm pets can now be healed and buffed consistent with live.


Optional SQL utils/sql/git/optional/2014_04_10_SwarmPetNotTargetableWithHotKey.sql

Required SQL utils/sql/git/required/2014_04_10_No_Target_With_Hotkey.sql

Note: For the required new npc_types field you DO NOT need to set values for swarm pets if you enable the above rule.


  • Kayen Implemented ability to use the actual live spell projectile graphics that are defined in the modern spell file.

*This is disabled by default. Recommend enabling if your server uses an UF+ spell file AND most of your players use UF+ clients.

  • Kayen Expanded the PERL ProjectileAnim(mob, item_id, [IsArrow?, speed, angle, tilt, arc, IDFile]) so you can now just set the weapon model graphic IT####

Example: ProjectileAnim($npc, 0, 0, 1, 0, 0, 0, "IT10747") This will shoot an SK 2.0 sword.

  • Kayen Updated wizard innate critical damage modifier to be from 20-70% of base damage (based on live parses)


Optional SQL utils/sql/git/optional/2014_04_09_SpellProjectileRule.sql Note: This sql also contains a query to check if your spell file is compatible.


  • Uleat Changed Mob::CanThisClassDualWield() behavior. This should let non-monk/beastlord dual-wielding classes attack with either fist as long as the other hand is occupied.

Notes: See this thread for more information and to provide feedback:


  • Akkadius Fix for the Fix for the Fix: Rule Combat:OneProcPerWeapon was created so that you can revert to the original proc functionality for custom servers that have balanced their content around having more than 1 aug proc on weapons. By having this rule set to 'false' you revert this functionality. This rule is set to 'true' by default as the original functionality from Live was intended to be
  • Akkadius (Performance Adjustment) Removed AsyncLoadVariables from InterserverTimer.Check() in both zone and world. By watching the MySQL general.log file on mass zone idle activity, you can see that the query 'SELECT varname, value, unix_timestamp() FROM variables where unix_timestamp(ts) >= timestamp' is called every 10 seconds. This function is loading variables that are initially loaded on World and Zone bootup. When running a large amount of zone servers, the amount of MySQL chatter that is produced is enormous and unnecessary. For example, if I ran 400 zone servers, I would see 3,456,000 unnecessary queries from all idle or active zone processes in a 24 hour interval.
  • Secrets Added a rule to enable multiple procs from the same weapon's other slots if a proc is deemed to trigger, Defaults to true.If Combat:OneProcPerWeapon is not enabled, we reset the try for that weapon regardless of if we procced or not. This is for some servers that may want to have as many procs triggering from weapons as possible in a single round.


Optional SQL utils/sql/git/optional/2014_04_05_ProcRules.sql


  • Kayen Implemented 'Physical Resists' (Resist Type 9) to be consistent with live based on extensive parsing. SQL will add new field to npc_types 'PhR' and fill in database with values consistent with observations


Required SQL utils/sql/git/optional/2014_04_04_PhysicalResists.sql


  • Kayen Implemented live like spell projectiles (ie. Mage Bolts).


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.


  • 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
  • Trevius Fixed potential endless quest loop with EVENT_COMBAT and WipeHateList().


  • Uleat Fix for unconscious skillups.
  • Uleat Fix for crash issue with nullptr reference in recent Client::SummonItem() work.
  • Uleat Added rule for GM Status check code in Client::SummonItem().

Note: Rule default is set to 250..but, implementation is on hold until load item code handles the database 'minstatus' field.

  • Uleat Added RuleB(Bots, BotLevelsWithOwner). Bots will auto-update as their owner levels/de-levels. Appearance packets are sent to show the 'leveling effect' as well as updating client entities.
  • Trevius Prevented an endless loop crash related to EVENT_TASK_STAGE_COMPLETE.

Optional Bot SQL: utils/sql/git/bot/optional/2014_03_31_BotLevelsWithOwnerRule.sql Note: This sql is required to activate the optional behavior.


  • Kayen SE_Gate will now use have a fail chance as defined by its base value in the spell data.
  • Kayen SE_Succor will now have a baseline fail chance of (2%). Rule added to adjust this as needed.
  • Kayen SE_FeignDeath will now have a fail chance as defined by its base value in the spell data.

Optional SQL: utils/sql/git/optional/2014_03_27_SuccorFailRule.sql


  • Uleat Moved the existing 'load_bots' and 'drop_bots' sqls into the emu git repository for the time being. Look to the

/utils/sql/git/bots/ folder to find them. The 'load_bots' sql has been updated to include the below fix, as well as

collecting the multiple files into one. This should allow HeidiSQL to now run it properly. (You will still need to

search for the optional scripts for the time being.)

  • Uleat Fixed bot guild script failure. For existing bot databases only, use this sql file to update the affected table and view.

Required Bot SQL: 2014_03_22_BotGuildMember_ScriptFailureFix.sql


  • Kayen Further refinements to root, charm, mez and fear behaviors * See commit message for full details

New rule for 'Fear' break chance, and updates to default settings of various rules. Optional SQL: utils/sql/git/optional/2014_03_19_RulesUpdates.sql


  • Uleat Fixed the name/account discrepancy in the Client::SummonItem() code as well as the origin of the mistake (thanks K_K!)
  • Uleat Condensed and rearranged certain snippets of code in SummonItem(). Added a 'augslotvisible' check to validation check.

Note: If you are experiencing issues with SummonItem, please enable 'INVENTORY_ERROR' logging if it not active on your server.


  • Uleat Updated Client::SummonItem() to check for valid item combinations when augmentations are passed.
  • Uleat Changed the return type of Client::SummonItem() from void to bool. Calling methods and APIs have not been update as yet.
  • Uleat Fixed the RoF Item structure to properly pass the 'augrestrict' variable. RoF clients now show restrictions in the Item Information window.

Optional SQL: 2014/03/17_EnforceAugmentRules.sql Note: This adds the rules Inventory:EnforceAugmentRestriction, Inventory:EnforceAugmentUsability and Inventory:EnforceAugmentWear. If you run into script/recipe issues, running this sql file will set the default enforcement rules to false. If you still run into issues, you may want to check that your scripts are not trying to augment non-common items. Please post any failures as bugs and be sure to include the base item ID, as well as any augment IDs that you are using.


  • Kayen Melee/Magic runes are now calculated as bonuses. Resolved issues with runes not working and not fading properly.


  • Kayen Revision to lull/harmony/pacification code to be consistent with live based on extensive personal parsing.

*Lulls on initial cast do not check regular resists (MR ect) but only apply a flat ~7.5 % resist chance + level modifier

*If Lull is resisted, a second resistance check is made this time using regular resists and a charisma modifier (same as charm)

which if 'resisted' will cause the caster to gain aggro.


  • mackal Corrected rogue's evade to be single target
  • sorvani fixed crash issue 119


  • Sorvani Created RemoveFromInstance and RemoveAllFromInstance to remove a single player or all players in an instance.
  • Sorvani Exported to Lua as eq.remove_from_instance(instance_id) and eq.remove_all_from_instance(instance_id).
  • Kayen Revision to root code to be consistent with live based on extensive personal parsing.

*ROOT has a 40% chance to do a resist check to break each buff tick.

*If multiple roots on target. Root in first slot will always and only be check to break from nukes.

*If multiple roots on target and broken by spell. Roots are removed ONE at a time in order of buff slot.

*Roots on beneficial spells can not be broken by spell damage.

Optional SQL: utils/sql/git/optional/2014_03_04_RootRule.sql


  • 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


  • Kayen Revision to charm code to be consistent with live based on extensive personal parsing.

*Charisma ONLY effects the initial resist check when charm is cast with 10 CHA = -1 Resist mod up to 200 CHA

*Charisma DOES NOT extend charm durations.

Optional SQL: utils/sql/git/optional/2014_03_02_CharmRules.sql

  • 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


  • cavedude Exported TrainDisc to Lua.


  • Kayen Implemented SE_FrenziedDevestation * increase critical spell chacnce and 2x mana cost for DD spells
  • Kayen Fixed SE_SpellProcChance * Now works on spell dervived procs
  • cavedude Added two new NPC special_abilities. ALWAYS_FLEE, which forces the NPC to always flee ignoring FleeIfNotAlone and FLEE_PERCENT which allows you to change the HP an individual NPC will flee at. If no value is set, the rule is used as normal.
  • cavedude Fixed an issue where rectangular roamboxes could cause an NPC to get stuck on a single coord.
  • cavedude Added a new roambox column, mindelay allowing you to have more control over the roambox delay.
  • Uleat Fix for 'sqrt' failure on vs2010 clients
  • image Added idle zone timer to save CPU cycles.

Required SQL: utils/sql/git/required/2014_02_26_roambox_update.sql


  • cavedude Better flee runspeed calculation. Added rule Combat:FleeMultiplier to alter this behavior.
  • Sorvani Updated GetUnusedInstanceID to not recycle instance ID's unless it has reached max (65535)


  • Secrets Exported the client object SendTargetCommand to Perl.
  • cavedude Merchants will now keep better track of charges.


  • Kayen Implemented SE_MitigateDotDamage * dot spell mitigation rune with max value
  • Kayen Implemented SE_DistanceRemoval * removed from target when target moves X amount of distance away from where initially hit.

Required SQL: utils/sql/git/2014_02_20_buff_updates.sql


  • Kayen Implemented SE_TriggerOnReqCaster * triggers a spell which a certain criteria are met (below X amount of hp,mana,end, number of pets on hatelist)
  • Kayen Implemented SE_ImprovedTaunt * Locks Aggro On Caster and Decrease other Players Aggro by X% on NPC targets below level Y
  • Kayen Fixed an error where SE_ChangeAggro was adding its bonus x 2 for spell generated aggro. (this applies also to spell casting subtlety AA reduction)


  • Kayen Fixes for buffs not fading under certain conditions in revised numhits system, and other fixes.
  • Kayen Implemented support for spell_new field CastRestrictions (limits what type of targets spells can effect).

A detailed list describing what the values used in this field do can be found in Mob::PassCastRestriction

  • Kayen Implemented support for spell_new field not_reflectable, no_partial_resists.

Required SQL: utils/sql/git/2014_02_13_spells_new_updates.sql Names many unknown fields in the table.


  • Sorvani Renamed the instance_lockout and instance_lockout_player tables to instance_list and instance_list_player. Cleaned up the Database::GetUnusedInstanceID logic.

Required SQL: utils/sql/git/2014_02_13_Rename_instance_lockout_tables.sql


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.
  • Kayen Various updates/fixes/clean-ups to focus effect related code. Focus effect limits should now all work properly.


  • Sorvani Added new spawn condition onchange action: DoRepopIfReady. Choosing this will not repop mobs when the spawn condition is enabled if they have an existing respawn timer. Additionally, this condition will not even attempt repop when the condition is is changed to disabled. Will be in use on PEQ for: Cragbeast Queen in Natimbi.
  • Secrets Fixed a weird crash issue with deletion of pointers if task loading fails.


  • Kayen Revised how spell/dot damage is calculated to properly incorporate all current focus effects/bonuses.

Required SQL: utils/sql/git/2014_02_02_SpellCriticalsAA.sql


  • Kayen Implemented SE_CriticalMend (chance to critical monk mend)
  • Kayen Implemented SE_IncreaseChanceMemwipe (increases the chance to wipe hate with memory blurr)
  • Kayen Implemented SE_FcStunTimeMod (modify stun duration from casted spells)
  • Kayen Implemented SE_StunBashChance (increase chance to stun from bash)

Required SQL: utils/sql/git/2014_01_27_CritcalMendAA.sql


  • Kayen Revised 'dispel' type spell effects (ie cancel magic) to be consistent with live


  • Kayen Implemented SE_FfLimitUseType (focus limit to numhits type)


  • cavedude Live-Like weather system (Thanks to robregen for figuring it out!)
  • 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.


  • sorvani Implemented for Lua eq.get_characters_in_instance(uint16 instance_id), return a Lua HashTable
  • mackal NPCs will now cast their charms.


  • Kayen Numerous minor fixes to spell effects.
  • Kayen Changed SE_ArcheryDoubleAttack -> SE_DoubleRangedAttack (now works with throwing ect)
  • Kayen Changed SE_IncreaseHitDmgTaken -> SE_TriggerMeleeThreshold (now only works on melee)
  • Kayen Changed SE_MitigateMeleeDamageSP -> SE_MeleeThresholdGuard
  • Kayen Implemented SE_SpellThresholdGuard (Partial Spell Rune that only is lowered if spell hits are over X amount of damage)
  • Kayen Implemented SE_TriggerSpellThreshold (implemented Trigger effect on X amount of spell damage taken)
  • Kayen Changed SE_ReduceHealing -> SE_FcHealAmtIncoming (focus limited Add/Remove amount of healing on target by X amount)
  • Kayen Change SE_CriticalHealChance2 -> SE_CriticalHealDecay
  • Kayen Change SE_CriticalHealOverTime2 -> SE_CriticalRegenDecay
  • Kayen Implemented SE_CriticalDotDecay

Note: 'Decay' effects means the chance to critical decays based on the level of the spell using the effect (like focus decay)

  • Kayen Implemented SE_FfLimitUseMin (focus limit to require a min amount of numhits value)
  • Kayen Implemented SE_FcLimitUse (focus to increases numhits count by percent)
  • 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


  • mackal Add pet size preservation like live (zone, camp, etc)


  • mackal Moved pet can attack check to before it tries to attack, which is more live like.


  • mackal Crash prevention for emote.


  • mackal Stuns from beneficial spells (Harvest) ignore immunity