Hylian Modding

Full Version: OoT Online Development Blog
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi everyone, this blog is dedicated to posting updates about the development of OoT Online. We'll try to update as often as we can when we reach points we wish to show off. 

OoT Online Team:
Ideka
glank
MelonSpeedruns
Denoflions
Psi-Hate

One of us will update through new posts when we get the chance, so stay tuned!

[Image: logo.png?width=885&height=498]
Greetings everyone, I'm the network programmer for OotOnline.

Since taking over the network role from Melon a couple of months ago I've rewritten the client and server from the ground up. In this post I'll go into some technical aspects of the project to give you a better idea of what is going into this.

Part 1: OotModLoader

This is the very core of the project. It is a mod loader that I've designed for making Oot mods with netplay support. It gives you a modding API that allows temporary ROM patching, RAM monitoring/editing, and high level actor hooking systems to abstract away much of the meaty bits of modding to get straight to what you really want. The system contains an event bus for detecting basic things about the game state without hooking specific memory addresses. Events such as scene change (pre and post), room change, void out, and link's various states. These events are being expanded all the time as new functionality is required for OotOnline.

The mod loader also contains the Master Server. The server is capable of hosting many individual lobbies of players simultaneously. This works by specifying a unique identifier for your play session and optionally a password.

Mods are written in Javascript (ES6, Node 8) and can load external resources from within their mod folder.

Part 2: OotOnline

This is the first mod made for the mod loader. It loads a ROM payload that contains our 'puppet' Link actor that represents other players in your game world. It utilizes the mod loader's API to detect the game state and track player movements. A puppet actor is spawned when a player enters the same scene as yourself and remains until they leave or disconnect from the server. Link's position, animation, rotation, and equipment data are monitored and transformed into commands for the puppet that represents you to other people.

The puppet is currently compatible with Adult Link with everything but Iron and Hover boots.

Part 3: SceneSync

This is the scene context module. Its purpose it to sync everything within the context of the scene so that co-op game play is possible. This includes any actors and the scene's switch, chest, and clear flags. Each actor instance is assigned a uuid (Universally unique identifier) to facilitate networked synchronization. The entire actor sync system is dynamic and works anywhere so long as the system understands the actors in play. This dynamic approach should make basic ROM hacks work right out of the box, but more sophisticated ones may require their own mod to act as a compatibility layer.

Current development goals:

We're currently in Alpha. This means we are adding content as quickly as possible. In general our Alpha goals are as follows:
  • All major dungeon actors synced.
  • All save context data synced.
  • Puppet support for boots and Child Link.
Development Update: October 22, 2018

This last week focused mostly on Dodongo's Cavern. Most of the dungeon is now synced.

The other thing on the agenda this week has been getting the missing pieces of the puppet into place.

Child Link + Masks
[Image: unknown.png]

Adult Link + Boots
[Image: unknown.png]


Adult Link + Gauntlets
[Image: unknown.png]

These have been hurdles we've been looking to get past for a while as they barred the way to porting the puppet to the 1.0 rom.

Work has been going into the mod loader itself as well. It can now load up entire scene replacements from external files.

This week is slated to be mostly focused on puppet stability as we move towards 1.0 rom support.
Development Update: October 29, 2018

Last week was focused on puppet stability and crash fixes. The addition of Child Link support added some new challenges that needed to be tackled.

Changelog:

- Fixes - New Content
  • We added the option of having time be controlled server side. This means the time is the same for everyone at all times including when in normally frozen scenes like Kakariko Village. This has obvious gameplay implications which is why it is entirely optional.
Child Link is mostly complete and stable now with the exceptions of Deku Sticks and Bottles. Displaying these on the puppet is more challenging than you might think, so it is taking significant research on the part of Ideka to decipher how to do this in a way that is performance friendly.

A large amount of work near the end of the week went into getting the save context module assembled. This module will be responsible for allowing players to share items and quest progress in co-op mode.

This week will be further work on the save context module and continuing to improve the puppet to perfect parity with the real Link actor.

See you next week.
Development Update: November 5, 2018

Last week was spent on the save context.

Changelog:

-Fixes
  • Soft resets no longer corrupt certain actors in the scene you left.
  • Obtaining an actor lock no longer causes the actor to momentarily freeze.
- New Content
  • The item subscreen is shared with all players in co-op mode.
  • The quest subscreen is shared with all players in co-op mode.
  • The equipment subscreen is shared with all players in co-op mode.
  • Quest progress is shared with all players in co-op mode.
  • Scenes save their flags when the flag is set instead of when you manually save or leave the scene.
The co-op sharing system is server-side and only allows the game state to progress forwards.

This week we're back on the dungeon grind with a goal of finishing out the child segment of the game.
Development Update: November 12, 2018

Last week was suppose to be a dungeon week, but that work got pushed back in favor of optimizing last week's save context additions.

Changelog:

-Fixes
  • Clients can no longer disagree about the state of a scene's flags.
  • Save context updates are now done asynchronously.
  • Save context updates are now cached to prevent writing redundant data.
  • The game no longer crashes when Mido comes into view after reentering Kokiri Forest from the sword chest room.
-New Content
  • The script, when enabled, no longer needs to restart the game to do setup if setup was already done this session.
  • The script now auto-reconnects to the client if the connection is lost.
-API Changes
  • Returning null from the callback for api.registerPacketTransformer now deletes the target packet outright.

Development Update: November 19, 2018

Last week was spent refactoring the actor hook system on the client.

Changelog

-Changes
  • Actor hook refactor. The system is functionally identical to before, but is far more maintainable going forward and adding new actors is far easier.

Technical details

The old system required that each actor have its data (actor id, offset, hook size, etc.) input and two callbacks defined (incoming and outgoing). This caused a lot of code bloat and a bunch of nearly identical callbacks that made things really unpleasant to maintain.

The new system checks the plugins folder for .opm files. These files can contain JSON, an exported Javascript object, or an exported ES6 class. Each one defines an actor and uses templates to generate the necessary callbacks.


Code:
// Movable Block
{
    actor: "Obj_Oshihiki",
    version_offsets: {
        debug: 0x24
    },
    readHandler: "range",
    writeHandler: "actorRange",
    size: 0xC,
    actorid: 0x00FF,
    actorCategory: 6,
    template: "Pushable"
}

This example uses the 'Pushable' template to generate the appropriate callbacks to make the actor's position sync when Link interacts with it. Should an actor be highly specific where a template doesn't make sense we can use an ES6 class instead and define the callbacks manually in code.

This week we're putting the new system to work hooking up more dungeons.

[Image: ThunderousAntiqueAfricanfisheagle.gif]
Development Update: November 26, 2018

Most of this week was taken off due to Thanksgiving in the US.

Changelog

-New Content:
  • Plugins created in C# and compiled with Bridge.NET are now loaded properly by the plugin loader.


We're working on the port to 1.0, so not a lot of major progress will be made on content in the coming weeks. Stay tuned.
Development Update: December 3, 2018

Changelog:

-Changes
  • The puppet actor handles display list swapping itself instead of having the netcode handling it.
  • The puppet actor displays Deku Sticks correctly.
  • The puppet actor displays Bottles correctly.
  • Puppet Child Link no longer floats above the ground while idle. (This was pseudo fixed with an anim hack, but its properly fixed now.)
  • Animation data is now handled by the mod loader instead of by the puppet instances.
The port to 1.0 has begun. Updates in coming weeks will likely be entirely 1.0 port related.