Current source code now resides at https://github.com/emagi/eq2emu/
Changelog is based originally on Open Source Code Base for EQ2Emu at https://git.eq2emu.com/devn00b/EQ2EMu/ (to be defunct)
0.9.5-EpsilonCMa started in September 2022, this page only includes 2023 changelog entries.
- Add R_World, LoreAndLegendAccept
- Rewrite of DeleteCharacter DB function
- Memory leak fix for maintained effects
- Restore access to Oct 2004 EQ2 Classic Release Disc
- Corner case crash fix for EQ2 Classic Release Disc
- EQ2Voice Recovery Project Open Sourced
- DoF inventory improvements, performance and memory leak fixes
- Address NPCs attacking each other or players when their attackable state is 0
- Fix #549 - DoF inventory can now remove/add items freely. The lower bounds index <=255 is assigned to existing items on zone-in or replacing items in that existing index. Indexed items 256+ will represent new items that have to grow the clients item index array. This will distinguish properly what the client is trying to examine when requests come in (versus getting no index).
- Fixed server crashing trying to send spawn packets when handling a bad version of the client entering zone (or malformed packets causing bad versioning).
- Character History is now only saved on requirement, reduced DB load.
- Avoidance of reuse for Query class as it can cause crashes
- Fixed a potential issue with AoM/DoF inventory, in which it would continually build up the array instead of re-using the first slot, eventually causing the client to crash
- Query deconstructor fix (single use runquery)
- Compiler fix for newer linux installs
- Fix ZoneServer::GetClientBySpawn removed, no longer using the MutexMap to track the client, use the Player class instead.
Addressed a crash cancelling a player trade
Addressed a crash with spawn change packets overflowing during Pack()
- Fix #550 - recast timers are accurate with UI and data, linked timers no longer indirectly impact recast time incorrectly, we do not call self spell on linked timer additionally with fix here
- Fix #496 ITEM_STAT_ABILITYCASTINGSPEED (664) and ITEM_STAT_SPELLREUSESPEED (665) now supported
Fix #109 Soulrend does not knock down target (finish spell cast, ZoneServer::SendCastSpellPacket spell_visual is disabled) when no damage applied
* alter table character_spell_effects add column has_damaged tinyint(3) unsigned not null default 0 after resisted;
Fix #536, SpellDamage now can drain power. Also Fixed AoM and DoF client WS_HearSiphonSpellDamage
- SpellDamage LUA Function now returns a boolean whether damage is dealt (or spell resisted) -- (true is damage/false is no damage or resisted). See Spells/Fighter/Crusader/Shadowknight/Soulrend.lua for a sample.
DamageSpawn LUA Function now returns a boolean whether damage is dealt, updated to allow take_power argument DamageSpawn(Attacker, Victim, victim, type, dmg_type, low_dmg, high_dmg, spell_name, crit_mod, is_tick, no_calcs, ignore_attacker, take_power)
- New LUA Functions (both can be used in and outside of a LUA Spell):
* SpellDamageExt(Target, type, min_damage, max_damage, crit_mod, no_calcs, override_packet_type, take_power, class_id_reqs...) -- extends support for take_power field (SpellDamage function does not have this and would break other potential spells)
* SendHearCast(Spawn, spell_visual_id, cast_time, Caster, Target) -- lets the Spawn see a spell visual on Target. If Caster is not defined, we use Spawn, same goes for Target.
- Fixed WS_HearHeal struct for DoF client (displays critically heal vs heal) and proper spell name. DoF does not support absorb or other types.
- Support for translation of spell_visual (spells table) aka spellcast.dat from assets vpl.
CREATE TABLE `spell_visuals` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL,
`alternate_spell_visual` varchar(128) DEFAULT NOT NULL '',
`spell_visual_id` int(10) unsigned NOT NULL DEFAULT 0,
`min_version_range` int(10) unsigned NOT NULL DEFAULT 0,
`max_version_range` int(10) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
** MAKE SURE TO GET spell_visuals sql included with update inserted!
- DoF bags support up to 36 slots now instead of the restricted 20 for "classic" client
- DoF and classic equipment restricts to 22 slots instead of trying to send client 25 slots (the additional do not exist)
- Fix crash on signs due to lack of nullptr check on entity_command
- SetInfoStructString / GetInfoStructString now supports combat_action_state -- can be used without overriding action_state outside of combat.
- First revision for marking signs. Issue #403. TODO: Refresh after marking, and timed remarking.
- Fix #544 - login server now correctly loads skin color for appearance data in character select, matches in-game color.
AoM and DoF now properly sync their appearance properties (hair, face, chest, legs). This is limited to classic (non-SOGA). SOGA will be reviewed in Issue #443
Fixed inventory being unable to move items around after moving a equipped item to inventory
DoF: Ranged weapons now properly display in examine, this means they also work in quest accept display windows(Hawk Hunt quest).
Fixed merchants freezing up on DoF client. DoF and earlier disabled the merchant flag in serialization of items (different structures that were not updated for DoF).
Disabled item types in DoF (not supported): 'Thrown','House Container','Adornment','Profile','Pattern Set','Item Set','Book','Decoration','Dungeon Maker','Marketplace','Reward Crate2','Infuser1','Infuser2','Experience Vial','Overseer'
Fixed DoF client crash with merchants (eg. Scion of Khaalista in NorthFreeport).
DoF bauble items set to generic item packet until structure is properly identified.
- Fix #542 - DoF will now properly roll/pitch spawns/objects as expected
Fix #538 - Item quest offer color and part of quest color mapping corrected
Fix #519 - DoF broker now supports multiple pages, properly displays item name in the field area expected.
Fix #518 - DoF client mender / repair fixed.
Negated Control Effect 32 from DoF client, was causing low gravity when safe fall was on a spell.
Fixed some LUA Functions handling of dead pointers and cleanup of the LUA stack.
Fixed SpiritShard.lua to convert the timestamp to numerical from string
Fixed a memory leak on PacketStruct handling of WS_Resurrected
Fixed being dead allowing you to move around/jump on DoF client
Fixed DoF control flags when revived/resurrecting to allow movement again
Fixed reviving not setting HP and leaving player as a corpse (in any client)
Fixed LUA Function SetSpellData, it was resetting the stack before we pulled the variable so we got no variable data
DoF client restricted to 20 slots for backpacks (by client limitation, enforced server side to avoid bugs)
DoF bagged inventory now behaves correctly (bags were only showing items up to the 11th slot on login, DoF supports up to slot 20)
Fixed mender having NO_RENT flag checked incorrectly not allowing individual repair of items (was checking flags vs flags2)
- Fix for issue #242. Added GetCanEvac/SetCanEvac lua function. Example code found in server/spells/scout/escape.lua
- October 1st Patch
- Fix #537 - DoF client health, power, concentration display on items correctly, AoM and DoF client no longer have issues with hide hood/helm in options impacting self and other options
- Fix #531 - DoF house support, AoM client also fixed inside house for door widget
- Fix #543 - Addressed AE/other spells including unattackable spawns
- Support for LUA Function InFront(Spawn, Target)
- Fix AE max targets exceeding cap
- September 23rd Patch
- Fix #533 - Group support for DoF, fixed /acceptinvite and group member display
- Fix #541 - Support for world server to use non-3306 port for mysql by using port=3307 in world_db.ini
- Fix #540 - Added GetDifficulty(Spawn) command. No longer do spawns have a "encounter_level" all translated to "difficulty"
- HateList now no longer allows negative hate from deaggro
- more protection on player_quests to avoid crash
- September 11th Patch
- Disabled ClearDataMsg going to AoM+ clients, not a valid opcode (100)
- HO Spell logs moved to debug, previously was error
- Prevent zone shutting down state from causing a crash when running spell process -> procs (we no longer run any spell processing during zone shutdown)
- September 6th Patch
- Fix #515 display spawn name and database id when /spawn set or /spawn remove is used successfully.
- Fix #534 when drowning death occurs, proper kill message (kill blow type 10) is sent to clients for appropriate 'glug glug' message.
- AoM client WS_HearDeath structure fixed, blow type was in wrong place
- Addressed a number of memory leaks in handling of packet structures through configReader.getStruct and LoadPacketData
- Addressed buffer overflow of packets trying to match opcodes that do not exist (beyond bounds of the opcode list)
- Addressed issues with trying to read memory in packet data when a packet is not loaded correctly, where we should instead bypass and just delete the bogus packet (avoid crash)
- Tracking icon for DoF set to 231
- DoF client part #3, plus crash fixes (reload spells, entering zone shutting down)
- Addressed DoF inventory causing items to be put in the wrong slot or disappearing
- Fixed instances serving a client a zone currently shutting down
- Added more enforcement of the client count for a zone so it does not prematurely shutdown when a client is entering the zone
- Addressed NPCs in DoF client "looking at" them when they should not. "interaction_flag" in SetInfoStructUInt(Spawn, "interaction_flag", 255) will now enforce not looking at a player.
- resolved /reload spells crash
- Control Effects now work for DoF client
- /flymode now supports values 1 and 2. 1 = flymode, 2 = noclip + flymode. DoF client flymode is not the same as AOM, it doesn't support up/down/jump
- added /gm controleffects (select entity target) will display their active control effects
- DoF client: can now right-click examine items in base inventory and inside bags of inventory
- can no longer put bags inside of other bags
- fixed the classic icons for collecting, fishing, gathering, foresting, mining, trapping, tracking put in temp icon until we determine right one.
- Player quests crash fix
- Crash fix on missing housing packet for earlier clients
- DoF recipe support stage 1 of 2
- /info command now has recipe_product support
- /delete_quest crash fix
- knowledge sorting for DoF client now supported (ability book cannot be resorted in DoF)
- fixed copying of Recipe::Recipe class
- OP_RequestRecipeDetailsMsg and WS_RecipeDetailList support for earlier clients (DoF and probably similar classic)
- fixed HandleExamineInfoRequest to properly map the "id" for DoF client
- Quest mutex updated for pending quests to avoid crashes
- PacketStruct::serializeCountPacket better defined for larger sizes
- Addressed one hit killing mobs not giving credit
- Address deadlock with spell targets
- Crash fix sorting spell book with a dead spell
- DoF and earlier clients restricted to one ear slot
- Address NPC “spells casted on” causing a crash when zoneserver deconstructed
- PlayFlavor will now handle emotes for DoF client without a message field being populated in DB
- LUA Spell Crash Fix
- DoF Update #2
- DoF now properly shows recipe books (struct fix in ItemStructs.xml)
- AoM and DoF both properly display recipes inside recipe book examine
- Adding recipes from a book to a player will now add correctly (via CRC ID) if we cannot identify recipe book by its book name
¶ - DoF Client Profile(Character) -> Options all the checkboxes set the wrong thing (afk, roleplaying, camping, linkdead, lfg, so on)
- DoF client Quest complete reward now includes temp rewards item data, previously you would see an empty quest reward window.
- DoF client properly in combat (no re-sheething of weapon while in combat)
- DoF client fixed spells to do start and end cast at appropriate times (struct fix).
- DoF client casting on self says "not a friend" -- now says not an enemy. When being too far away, instead of saying "too close" now says "too far away".
- DoF fixed selecting self interrupts /camp
- DoF client server/client properly synched for inventory (food/drink and other equipped slots previously not working right)
- DoF Broker no longer crashes client, limited implementation to get first 8 results. WIP
- DoF fixed examine equipped items didn't work for drink/potentially mismatched other slots
- DoF item stat review of resists now properly display
- DoF client is constantly sending HandleExamineInfoRequest packets for spells, fixed. Greatly improved performance of DoF cause it was constantly sending these packets for all spells in your book per second!
- DoF collections window is fixed, collections now display correctly in journal window. Upon turning in complete collections, client no longer crashes. Outstanding note: DoF client has EXP show up as % of level (60?) instead of just bare XP points. This might need more discovery, but isn't a huge issue right now.
- DoF player profile inspection inventory, DoF and AoM both display inventory (DoF does not support appearance gear). Cross client inspection works also. Avoidance (DoF and AOM) / ATK (DoF) stats need to be reviewed and matched in the structure, but not a big priority.
- DoF client /who list is broken (if more than one player, by myself /who works) -- structure updated for some unknown bytes tail of packet
- DoF client gestures now show up visually and not as an /emote-
- DoF item display fixed for house items (the items themselves in inventory/broker/so on were previosuly displayed corrupted)
- DoF Merchant "sell to merchant" just shows buy window, sell window was displaying buy items, there is already a sell window with the buy window.
- DoF merchant mender/repair no longer crashes the client -- currently worked around by sending buy screen then repair screen.. displays both, need to get buy screen disabled, will be its own git issue.
- Remove/Add skills via LUA will now properly update/reflect the database.
- starting_skills and starting_spells no longer applies on each login, this will stop the restoring of spells/skills on zoning that are removed with LUA
- Login sequence into world now initially load spells/skills (and also sync if first time into the world for the character). This will allow us to avoid an unneccessary blocking behavior with World::SyncCharAbilities (it waited for 5 loops and hold the thread to see if the DB is updating the character). Now we enforce this behavior with an updated state machine for the login, no longer blocking/holding the thread.
alter table characters add column first_world_login tinyint(1) unsigned not null default 0;
- R_World, DisplayItemTiers rule made to display item tiers (1) / disable (0)
- Bots are no longer impacted by /depop or /repop
- fixed crash with Player::CheckQuestFlag where we try to send updates based on quest, dead quest ptr when calling CheckQuestChatUpdate
- revive points now support an always_included option, otherwise it only shows the closest distance
- Database updates:
alter table revive_points add column always_included tinyint(1) unsigned not null default 0;
alter table characters add column first_world_login tinyint(1) unsigned not null default 0;
- LoginServer
* LoginServer.ini now supports (integer) fields expansionsflag, citiesflag, defaultsubscriptionlevel, enabledraces under the "LoginConfig" block
eg. enabledraces = 65535 allows all races
enabledraces = 57343 removes sarnak as playable race (-8192), another -4096 would remove Arasai. -2048 removes Fae.
Default values (in hex, you can only use integer in the ini):
// full support = 0x7CFF
// 1 << 12 (-4096) = missing echoes of faydwer, disables Fae and Arasai (black portraits) and kelethin as starting city
// 1 << 13 (-8192) = disables sarnak (black portraits) and gorowyn as starting city
expansionFlag = 0x7CFF; // 0x4CF5
/* dword_1ECBA18 operand for race flag packs (sublevel 0,1,2?) -- (sublevel -1) controls starting zones omission 0xEE vs 0xCF (CF misses halas)
1 = city of qeynos
2 = city of freeport
4 = city of kelethin
8 = city of neriak
16 = gorowyn
32 = new halas
64 = queens colony
128 = outpost overlord
*/
citiesFlag = 0xFF;
// sub_level 0xFFFFFFFF = blacks out all portraits for class alignments, considered non membership
// sub_level > 0 = class alignments still required, but portraits are viewable and race selectable
// sub_level = 2 membership, you can 'create characters on time locked servers' vs standard
// sub_level = 0 forces popup on close to web browser
defaultSubscriptionLevel = 0xFFFFFFFF;
// disable extra races FAE(16) ARASAI (17) SARNAK (18) -- with 4096/8192 flags, no visibility of portraits
enabledRaces = 0xFFFF; // 0xCFFF
¶ - Fix #314 Encounter states, locked, overmatched and broken now supported up to group level (raids and functionality to them will be done in a later milestone). This also entails all the functionality within, npcs go gray when in an encounter or yelled, you cant heal or damage a player or npc in an encounter.
- Fix #351 /yell now available, yell with self target breaks all active encounters, yell with direct target breaks that encounter, no target breaks first encounter
- WorldStructs.xml update required for /yell so others know you are yelling!
- /spawn details aggro (NPC only) added, view active encounter list (who receives credit, locked encounter) and hate list (actual damage/hate)
- InfoStruct now has a new UINT8 "engaged_encounter", set to 1 for being in an active encounter, 0 for out of encounter (allows regen/speed recovery)
- Returning from linkdead DB load reduced
- Returning from linkdead you won't see ghost versions of yourself
- Addressed returning from linkdead and spells missing, would despawn your pet or remove buffs for examples.
- Protections around private spawns aggroing/attacking players that cannot see them
- Additional spell crash protection when spell caster is not in zone
DeleteSpellBook(Player, type)
type = bit operand combination of:
DELETE_TRADESKILLS = 1,
DELETE_SPELLS = 2,
DELETE_COMBAT_ART = 4,
DELETE_ABILITY = 8,
DELETE_NOT_SHOWN = 16
Eg. tradeskills and spells = (1+2) = 3
SendNewAdventureSpells(Player) - sends adventure spells by their level
SendNewTradeskillSpells(Player) - sends tradeskill spells by their level
RemoveSpellBookEntry(Player, spell_id)