Vendetta Online

Its the end of July, and the next version of Neoloader has [finally] dropped! It took quite a lot of work to get the features of this update working, mostly regarding a feature that I've thought was necessary before Neoloader would ever be out of beta. Consequently, the Init process has gotten a lot slimmer, which should help improve the initial loading time. The official changelog is attached below, but I want to cover a few key changes.

  • Mods can now declare a range of version numbers for their dependencies
Wow, this was a lot of work to implement in a sane way, mostly through my own fault. Plugins can now add a "maximum" value to their dependency's version in the lib.resolve_dep_table function and in their declaration file. If a maximum value is identified, the previous "version" value becomes the minimum of the range, and the latest in-range plugin, should a valid one be located, will be returned.

  • Configuring the LME in-game must now be done through the lib.lme_configure function
As with the previous update, where load states were enforced based on known values, Neoloader's configuration will now be enforced as well. This comes down to my philosophy that the user should have control over their system, and changes should not be made errantly (or maliciously) by a plugin. Most configuration can be done on the fly, but systems related to how plugins load are locked behind the authorization system.

  • Logged events are now (optionally) formatted
I noticed in other game titles, event logs would be formatted to a particular standard, and lib.log_error will now emulate this formatting by default. anything handled with lib.log_error will now include date, time, and the error level of the message. Plugins can also direct the log to be added to their own "error table" retrieved through lib.get_state.

  • resolving files is better protected from crashes
Its kinda silly that I overlooked this change that was intended for the previous update; lib.resolve_file will now pcall the files passed to it. This should greatly improve game launch stability. 



Neoloader July 2023 Public Beta

Neoloader Changes:
major:5
minor:4
patch:0

CHANGEDmod registration file dependency declaration options
CHANGEDlaunch handling of plugins with dependencies
CHANGEDlog formatting options
CHANGEDlogging information during initialization

API Changes:
API Version3
minor level 8
patch level 0

CHANGEDlib.resolve_file
CHANGEDlib.log_error
CHANGEDlib.get_latest
CHANGEDlib.resolve_dep_table
CHANGEDlib.get_state
CHANGEDlib.get_gstate
NEWlib.set_waiting
NEWlib.lme_configure

Mods can now delay execution of their dependents
using the new lib.set_waiting, it is possible for mods to delay their dependents. This is intended for use by mods made in a more classical manner but patched/altered to ALSO support Neoloader, such as DroidButtons. A mod can set up its bare essentials through Neoloader, then "freeze" until its main body is executed at default loader time.

Configuring Neoloader must now be done through lib.lme_configure
As certain LME configuration options directly control how plugins are loaded through Neoloader, allowing these options to be managed directly through the config.ini made little sense. Just as load states were enforced in the previous update, configuration of the LME provider is now done through a control function. Certain options can be changed freely, while others will require an auth key.

lib.log_error now formats its input based on LME configuration
message formatting mirrors usual logs found in other games; every message posts the time of execution, and can be filtered between one of four potential error states: "debug", "info", "warning", and "error".

lib.log_error can now store the provided message in a calling plugin's error table.
use arguments 3 and 4 of lib.log_error to push a log towards a plugin in particular. Plugins can now independently store and list their own errors; the error table can be retrieved with lib.get_state like always.

lib.get_state and lib.get_gstate now retrieve the new relevant options
lib.get_state will now list if a plugin is "frozen" or not, which determines if a plugin's dependents are executed or not. lib.get_gstate now list log formatting options, and will deliver a string representing the LME's/Neoloader's versions, relevant for use with lib.compare_sem_ver.

Mods can finally declare a range of versions as valid for dependencies!
Plugins can now rely on a primary range of versions instead of only a single version. In a mod's declaration file, if a dependency index includes a "modmx" entry, then the prior modid entry is treated as a minimum value and the mx (or maximum) is treated as the maximum value of a version range. lib.require, lib.resolve_dep_table, and lib.get_latest all have been modified to support this feature.

in a lib.require soft dependency table, use the ver_max key to signify a range along with the previously standard id/version keys.

lib.resolve_file will now pcall any files it resolves, assuming the option is set in the LME configuration.
This provides further safety-netting to any code being launched by Neoloader than the previous mere loadfile method.

The initialization process now just uses lib.require.
The old brute-force sorting algorithm used by Neoloader has been removed, improving Neoloader's execution time. This also fixed minor issues that were cropping up with the old loader; plugins with multiple dependencies are more likely to not stumble due to incorrect sorting, and all code for handling dependencies is more unified.

All of these features have been dedicated to ensuring that porting plugins to be Neoloader compatible is even more seamless and easy, while protecting the end user even more.



Changes expected in the next update:

  • Improved language support
As Vendetta Online improves its own language capabilities, the community will grow more diverse, and to reach these new pilots, embracing multi-lingual support is imperitive. Luckily, we can mostly rely on an existing library to provide this functionality: Babel. However, there is also one section of Neoloader that is incapable of being updated through babel, and that's the setup process. Here, instead, we will need to hardcode language support into the setup process. 

  • Compliance with Vendetta Online's "disable plugins" configuration option
Added just yesterday in Vendetta Online 1.8.653/.1, the default plugin loader can now be completely disabled by the user. However, it appears that this system does not affect custom interfaces, which Neoloader technically counts as, as it loads through the if= option in the config.ini. Until this is patched, should it ever be patched, Neoloader will need to provide its own compliance with this feature. The plan is to follow the game's configuration as much as possible unless the user specifically wants to run Neoloader without the Default Loader.

Other ongoing work:

  • glib/element10/CCD1
Element10 is the advanced alternative to neomgr. glib, or GeneralLibrary, is a multifunctional library mostly containing preset UI generation systems. E10 was teased on the forums alongside the Neoloader June update. Improvements and standardization to glib is holding back Element10 from release. CCD1 is an optional plugin class standard that allows for easy configuration of plugins, similar to the design of Skyrim/SkyUI's MCM system. CCD1 support is provided by a plugin like Element10.
  • Neoloader Documentation
Documentation of the LME API and usage of Neoloader is running two updates behind. 

  • Babel
Babel will attempt to set the default user language to their selected game language, if available, during first run

  • NeoPatcher
A complete redesign of NeoPatcher. NeoPatcher is a utility to fix old plugins so they can be loaded through Neoloader. The original concept was designed through Clickteam Fusion 2.5, which unfortunately creates binaries that trip many Antivirus solutions. Plus, it wouldn't work on non-windows systems. The new version is currently written in Lua with the iuplua, lfs, and inifile libraries. All it needs now is a wrapper solution for distribution.
Not yet started, in planning

  • EasyDoc
This library will provide a simplified way to construct help files, similar in result to the "chm" file format on windows. While the primary purpose is to improve how plugins can provide usage information in-game, the document reader can also be called as a standalone system and embedded in other plugins. I intend to use this system in a custom mission player.
  • Services Core
This library inserts itself into the game's idle execution, which should allow for sub-one-millisecond execution of functions. The intention is to provide an experience-aware scalable tasking system - if the functions being called begin to slow down the user's experience, tasks would be delayed or even stalled outright. This will be necessary for some of the more complex visual systems I want to introduce in a custom interface in the future.

  • httplib
Currently managed by Haxmeister, I would like to make httplib support Neoloader and use its design philosophy; plugins cannot open sockets without first being authorized, and individual socket information can be polled by the user to see what is going on. Admittedly, I don't know much about networking, so there's a chance I don't do this...

  • pInfo (Plugin Information Services)
Connects to an external service to poll plugin information, including whether updates are available. A system to do this was designed during 2022 summer using Haxmeister's server, called VVC (version verification control), but Neoloader has evolved a LOT since then, and the functionality I want to offer needs to match.

  • Project Q
A complete redesign of the game's interface from the ground up, inspired by modern graphics-heavy interfaces. More Drag-and-Drop, better joystick compatibility, and a redesigned way to navigate the universe, all in an interface made for extensibility through Neoloader. Death to text walls!




Anyways, besides the "next month update" stuff, that's all on the back burner. IRL exists too. Cheers!

Article information

Added on

Edited on

Written by

LuxenDM

0 comments