Hoookay, I think it's about time that I did another blog post. To those who thought the project was dead, fear not! It's been chugging along on/off. While I haven't posted any blog posts since then, I have posted a few videos of various features that were completed. One of the people helping me; Jorge, had kept a list of thing I've completed since then... omg this will be a lot to go through!
Overhaul of the Actor and Script Systems; Doors, Npcs Galore!
When I first started the project, the server could only spawn one instance of a "class" of actor. This meant only one Goobbue, one crab, one door, etc. This would not do as obviously there would be multiple copies of these actor classes. The table got split into two. The gamedata_actor_class table which defines what script to load for this class id, the attributes about the class, and the trigger events. More specific things like the position and idle animation were moved to a spawn_location table.
Following this addition, it opened up a huuuge amount of possibilities. Most of Limsa, Gridania, and Ul'dah is populated (if not all). All doors work in those cities work as well. This allows for free movement of the city w.o having to resort to warp.
Scripts Part 2
Later I rewrote how the system handles calling client functions. You used to have to keep track of where the client is since the last call and have these huge if statements. Now it's as simple as:
choice = callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent020_9");
The client runs the "processEvent020_9" function in it's internal scripts, and sends the response back as a "choice" variable. I have just finished overhauling the lua engine (again), and will soon be able to support "waiting" as well, for X seconds or a signal for even more advance scripts.
Tons of Opcodes
I probably have 90% of the opcodes in the game figured out. Things from the "pushEvent triggers" which setup an event to fire when you "touch" something, to the generic data packet, to even the full cutscene book packet, which means no more crashing on the "Path Companion" cutscenes!
Rework of the Server Architecture
Back then all communication between client and server was done through one program. This would not do for a multi-server architecture which FFXIV was. I have split the server into a "World" server which controls all global things (zoning, linkshells, friendlists, etc), and a "Zone" server which controls all game stuff for each zone (battle, events, updates).
Airships, ferries, and doors oh my! Another set of opcodes figured out was the bg object opcodes. BG Objects are... objects saved in the client's map file that can be told to animate or show/hide by the server. These are things like above mentioned, but also things like doors, clams (from that dungeon I am forgetting to spell), etc. I've even figured out how to find other ids in the map to control even more objects!
Currently on the dev branch are some other features waiting to finishing completion or bugtesting. Groups are done, which covers parties, linkshells, and soon; content groups. Directors have also been completed allowing for finer control of content. Private Areas; instanced sub areas of a zone, are also mostly done. With those two features, I was able to build the entire opening event for Limsa sans the battle itself. We also dabbled a bit in getting read for a battle system.... successfully extracting the map files into an OBJ format. I'll be posting more, but subscribe to my Youtube channel as well, as I post videos a bit more often. There are tons of smaller features I haven't written about, but hopefully this satiates some of your appetite. Until next time!
Just a thank you to Devi, Demo, Jorge, Mordred and all those in Discord for helping and supporting along the way.