Hey all, and welcome to the June 2025 EQOAEmu update.
It’s been a long year with a lot happening, and though we’ve been quiet, we’ve still been hard at work in one way or another. Many of us have been tied up with real-life things from time to time, but we’re still pushing forward and seeing good progress.
Just as a reminder, if you missed last year’s update, you can find it here: https://eqoaemu.com/index.php/2024/06/05/big-update-june-2024/.
This year has mostly been about refinements to existing systems, rewrites for stability, and “getting things right.” We’re trying to focus on those last little things that really make the game shine, and honestly, we’re getting there.
I’m away on vacation right now so I can’t easily get any in-game pictures or video, but I will do my best to capture some when I get back. In the meantime, I’ll include a few various recent pictures and videos where I’m able.
Quests, Dialogue, and NPC Interactions, Oh My!
Things have been a little quieter lately on new quests, but a lot of refinements have been made, and we’ve started expanding some quests to other cities. Just last week, I was testing quests in Moradhim and Klick Anon. All the mechanisms are built out for the most part to support all the quests now, and it’s mostly just a matter of finding the time and resources to get them all implemented across Tunaria. Our focus is still on class-specific quests first, but soon we should be rolling out things like 17s, 23s, etc. as well. Wolf/Vamp quests are still a ways off most likely, but all the mechanisms are there to move forward on those.
Merchant Inventories
This is still far from perfect, but it’s getting much better. I recently took data from the Prima guide as far as what NPCs in each starting zone should have specific class spells, then wrote an SQL query to find the spell scrolls in the item tables matching the levels and class requirements of those NPCs and matched them so they’d go in the correct inventories. We still have a lot to do adding items to various NPC inventories around Tunaria, but the new tool we’ll talk about a little further down is making that easier than ever.
Massive NPC/Player Stat Rework
This was a large quantity of work when we realized last year during combat mechanics that it seemed very one-sided. Apparently, that was because we had never actually given our NPCs stats. So, Bwiz undertook a significant journey into reworking all the stats for players and npcs to not only be more streamlined but also just creating programmatic ways to give NPCs stats to begin with and we’ve gotten some mechanisms in place to dynamically generate those values both based on level, potential one off modifiers, and then of course mob classes which exists, but we haven’t gone through NPCs with a fine tooth comb assigning specific classes to each one.
NPC Behavior
This is kind of a multi-pronged piece here as a lot goes into it. NPCs can cast spells but the behavior trees aren’t quite there yet. This will be something I’m turning my attention to soon as it’s important for combat and I’ve been heavily focusing on combat math tuning. Due to a large amount of William’s work, NPC behavior in most other aspects is very solid.
NPCs roam correctly on spawning now following somewhat randomized pathing as well as randomized spawning around their spawnpoint now instead of spawning in static spots in the wild. This is allowing us to create many fewer spawn points for roaming wildlife, creating a density parameter you’ll see later in the admin tool and spawn a lot of mobs in various positions tied to a single point. This cuts down on resources used for spawning and is a bit easier to manage while still really filling up these empty areas.
NPCs also have the ability to patrol and that can be seen with a handful of the guards we’ve got positioned around starting cities as they patrol the halls of places like Qeynos. This will soon be expanded to other cities as the mechanisms are there and honestly pretty easy to add the paths for NPCs, again just a matter of finding time from the content team to get it added for various patrollers.
In both cases and many others, NPCs have appropriate behavior trees than handle chasing, roaming, leashing, attacking, backing off, and just about everything else that goes along with mob behaviors. There may be some corner cases but even in the event that a player is aggro’d while they have a pet, the pet NPC will appropriately perform the correct behavior based on stance. This should also be reflected for NPCs that have pets when you engage that NPC but there aren’t many instances of that engaged yet in EQOAEmu. Some goofiness remains that I’m ironing out with aggro but this is mostly correct.
Which leads into another big piece that was worked on heavily lately. Mobs also leash correctly based on water volumes. This means mobs will not chase you outside of water volumes, but for fairness you also can’t attack water only mobs without being in the water with them to be attacked. Additionally, land mobs will chase you into the water as well and swim to get you.
I’ve begun adding some intelligence to various systems of the game that existed in live where in instances like a mob leashing back to it’s aggro’d point, the mob also full heals to prevent players from trying to leash kite over a greater distance than you would have been able to in live.
Player State Update
Another big component of William’s work recently has been player state in volumes of water(breath), lava(damage), and mud(movement speed). We added some spell animations to signify damage for now depending on type of damage whether it’s lava or breathing. Might not be quite right but it’s an ok placeholder as we figure that out. Player’s now have an active breath meter while underwater and will take damage appropriately to live once you’re out of breath. Your breath as expected will refill once you’re no longer fully submerged in the water.
Lava based zones will now have a fire damage tick on you as you wade through the lava as expected.
Mud/Sludge based areas will now appropriately slow movement when moving through those types of terrain s well.
HoT/PoT fully functioning as expected. There have been bugs around this in the past that I’m pretty sure we’ve finallly squashed.
Spellcasting Refinements
I recently did a massive rework of the our Lua framework as I identified a huge bug with the help of Random when it comes to our Lua implementation. Without getting into the technical nuts and bolts too much – Lua stores everything in a global table if not declared as a local variable. The way Nlua works with the hooks if you hook an object is it enters it into the global table. It took a very large rework to move to parameterized Lua functions different than how I had originally written it but that’s on me as a misunderstanding of how the language worked when I implemented it probably three years ago now.
The good news is that this is fixed and led to a renaissance of getting new spells and abilities wired up in game. Leuko has been super hard at work fleshing out a TON of spells so now most spells work in some capacity and the ones that don’t are just a matter of implementing the files using templates of sorts for similar types. The one thing that I can think of we still need to tackle is charm pets but that will be coming soon I believe.
Other spell improvements were made as well. After looking at it we had a system where spell name lookups would lookup in a larger directory listing than they really needed to be in so I whittled it down to search explicitly for the spell for that class/master class. This is a minor improvement but will speed up lua script lookups so won’t be noticed by the player but will help with offloading resources from the backend.
The other complicated piece of this that I’ve heavily cleaned up is better handling of the server honoring/forcing target scope of spells. So previously there were a lot of instances where you could cast spells on targets you shouldn’t be able to as well as instances of being unable to cast on targets you should be able to. Now this is all handled in the server code to force targeting behind the scenes so for instance if you’re casting return home but you’re targeting Merchant Yulia, the server knows it’s a Self only spell and forces self as the target. In other instances if a spell is target based but is target ally only, it prevents and auto corrects the target if possible or lets you know you currently have the incorrect target type in that chat box.
Poor Man’s Shard Server
Shard server turned out to be a bit of a bigger bear than we’re willing to tackle right now with the resources and timelines we’re looking at. That said William and Bwiz in different pieces have fleshed out what we dubbed as “poor man’s shard server” where effectively we diced up certain components of the game into their own structures so we’re not constantly checking things that simply aren’t doing anything. The most obvious place this occurs is that if a player is not in a zone currently or has not been in a zone for a short period of time we stop processing behavior trees, respawns, etc until a player enters the zone again. We don’t have to worry about it right now but we have separate ways of processing things like random timer based raid spawns and whatnot and can tackle that a little later. Doing this heavily offloads the amount of resources needed to run the game as there’s a tremendous number of objects in the game as well as number of zones and the fact is the vast majority of the time we won’t have players in every single zone.
Factions
Factions have been refined a bit more but still need a little bit of work. All the functionality is effectively there in the code and really just time and care needs to be put in to verify everything and wire it all up database side for various mob types. It wasn’t a massive number of things that awarded factions as a % of the total mob type count so this probably isn’t that big a lift we just need some team hours on it to get it knocked out and tested.
The big piece to this that we added since the last update is the “Cares about” faction piece that we call it internally. It’s really just faction associations effectively. So we have more data to fill out but the code and database schema is there now to support the ability for chained faction changes. So if you killed something like a Faithful of Marr, you’d lose faction with not only the temple of Marr but also potentially the citizens of Freeport. I totally made that connection up but just as a for example. I need to coordinate adding something in for the content team into the new web admin tool I made. It’s on my to do list which feels miles long sometimes but more about that tool in a bit.
NEW Web Admin Tool
Our old tooling was written with and/react JS and was honestly kind of awful. I’m not a web developer though so it was the best I could throw together at the time. I threw basically all of that in the trash.
Revealing today the new and improved web admin tool. This is only accessible via OAuth to the EQOAEmu team including our content folks and devs.
Map Editor
This is by far the biggest new piece and one I’m most proud of. William threw together the navmeshes baked into this in an html document initially that rendered the entirety of Tunaria and I expanded on that by turning it into a full react JS frontend with a python fastapi backend. I also trimmed it down to only render a single zone at a time because it took monster amounts of memory for a browser based task and was very slow moving about in the entire rendered world.
Item Editor
Basically a place to add, edit, or in the future delete any items that just aren’t correct. I’ve added item icon mapping and model image mapping to make it easier for content folks to update things without knowing any of the database stored values as those aren’t really human readable.
NPC Editor
With this new tool it’s a one stop shop for the content team to be able to add any mobs they find missing or edit ones that are currently there that are not 100% correct. Not currently a feature but I’ll be adding a delete in the near future too as somehow we’ve inherited over time some mobs that just shouldn’t exist or are there for joke reasons. Fear not, some of the contributor avatars will remain like Faxonate. Thought I do intend to give him his own questline at some point as a thank you for the large contributions he’d made to the EQOA effort in its early days.
NPC Inventory Editor
There is a bit of nuance here as loot tables and inventory work a little differently. This is for some technical reasons like we don’t want to store all loot tables for all mobs all the time before they’re actually killed as it provides no benefit and adds additional overhead of managing those objects when we don’t need to. This also is because there are instances like Freeport Guards where you could kill them and loot their shield and sword, but also instances where merchants have inventory, but not loot tables because you can’t kill them in most instances anyway.
Loot Table Editor
Loot tables are important. Loot tables are also a pain to manage without a UI tool. Enter the loot table editor. Content team folks are now able to look up loot tables options by the mob name, edit them, adjust the % time different items should drop within the loot table, and many other features.
SpawnGroup Editor
This is one of the things I’m really proud of for EQOAEmu and love. We all remember that spawn points in live didn’t necessarily always spit out the exact same mob every time. Welcome to spawn groups. This feature adds the granularity to potentially have a single spawn node that can spit out any number of different mob types based on location. This tool now allows EQOAEmu folks to assign spawn group mob type entries that then tie to spawn points to create some dynamism where it’s needed. This could range from the % change to spawn a named mob, or just one of those spawn nodes that would spit out Warrior, Ranger, or the surprise caster mob depending on the respawn.
Loot Updates
The content team has spent a bunch of time correcting things they found wrong with items in the database. I also was able to write a converter to take some data given to me by Tkain and Rhaanu(I believe that was them) and ingest bulk fixes into our database for both spells and items. As part of this they’re also hard at work at perfecting loot tables so badgers drop badger eyes and not snake scales and the like. It’s all coming together.
I need to work on some additional code refinement and testing to make sure we’re getting the %’s right for drops but it’s a work in progress.
Combat Calculation Adjustments
So this is a sticky wicket as they say. The good news is that similar to the other project out there, we were able to thankfully get the original live combat formulas which were similar to some we already had but gave a little bit more context than we previously had. The bad news is that there is still a little bit of ambiguity with some of the terms of the combat formula so we’re still doing some tinkering. We are taking AC into account currently and various stats as expected by the formula but we haven’t exactly hammered down “Absorp” yet which we’re pretty sure is mostly related to resists as far as we can tell from the information we’ve been relayed from previous dev sources. There’s still plenty more to tinker with in this area and “get right” as I often say but we’re moving in the right direction.
Triggered Events
Triggered events are fully in game and working now but still need to be implemented in more cases. The three big ones that are in game but need a little bit of polishing are
New Player Intro, Combat Tutorial, and Spellcasting Tutorial. These are all in game but things like the combat tutorial need triggering more consistently as players leave their starting towns exits.
Aside from that, we can now trigger events like mob spawns, pop up dialogue, quest progression, etc based on player/npc location.
Bug Fixes
-
- NPCs Faced the opposite direction of whatever the player is facing – So it was discovered that I accidentally didn’t make NPCs face the player when they talked but they actually faced the inverse of the player’s direction. Which pseudo made the expected behavior work most the time but our testers found if you faced away from the NPC and talked to them, the NPC would face back to back with you. Thanks to William for helping me with an algorithm that found the NPCs correct facing based on the player’s position instead of the players facing.
-
- Sending Pets at targets you shouldn’t be able to. – Originally you were able to incorrectly send your pet to attack things like merchants. We’ve refined this so this behavior tree honors the “NoAttack” flag.
-
- Unable to memorize spells past the 5th slot. – This was caused by an issue where I was saving player state inconsistently and it was leading to weird phantom assignments of spells to the hotbar and causing strange visual experiences in the UI. Fixed the saving state issue and it cleared up both problems.
-
- Spells casting out of range even if they fizzle – As addressed above, we cleaned up the spell casting logic immensely to honor all the various requirements of spells such as range, target, spell requirements, etc.
-
- Can only cast pet only spells if conning an NPC. – As addressed above with the spell targeting fixes.
-
- Casting on dead mobs. – Again addressed above with the spell targeting fixes.
-
- Various player class/race combos spawning in incorrect locations. – Did some cleanup on this to correct things spawning where they should when you first enter the game.
-
- We still have a small laundry list of bugs but these are getting knocked out as fast as we can while constantly adding more while we plumb in and refine more features.
WRAPUP
As we wrap up just a few things to say. I’m sure there’s stuff not in this document that I’ve left out, I’ll try to retroactively add it if I come across it, otherwise it’ll make it in the next update. Which if all goes to plan won’t be another year away this time.
It’s been a big year for EQOAEmu, both in terms of development but also for our members in life. I’m still cancer free as far as we know which is better than we were a year ago. Some of us have taken new jobs, promotions, etc and just major life changes in general.
As always, a MASSIVE thank you to the EQOAEmu team members and contributors that make all this magic happen. Huge thank you to the community as well for believing in us and supporting us and having patience as we work on this massive undertaking.
We’re still hard at work. There’s still more to do. We still plan on releasing all our code in the near future as open source as we’ve always promised when we feel it’s ready for prime time.
If you or anyone you know is interested in contributing either to code or content development please reach out over discord as we’re always looking for more help however we can get it.
Thanks for a great year EQOA Community.