Minerva | Changelogs

Description

Updates made towards the development of my Minerva framework will be logged on this thread for the purposes of better organization.


:key: Update Key

Entries in a log are categorized into separate sections so that it’s easy to find information about a specific update.


Click to toggle update key
  • :sparkles: Quality of Life

    • These entries are centered around improvements that make the player’s life a little bit easier.
  • :rocket: Updates

    • These entries are centered around completely new features or big changes made to existing ones.
  • :bug: Patches

    • These entries are centered around fixing existing features that didn’t work quite as intended.

:scroll: Changelogs

Click on one of the links below in order to jump down to the log that you want to view. The most recent update is shown at the top of the list, with the oldest update being at the bottom.


Click to toggle logs

Log w31y21a


:rocket: Updates


  • Added :runSuperMethod(method, …) to the framework adaptor. This allows inherited modules to search through their parents to gather all methods of the same name and run them.

    • Primary use is for the object :created() method, which gets triggered whenever a new object is made. If it’s inheriting from another module then it will also trigger that module’s created() method and so on.
  • Switched the Signal class over to the GoodSignal implementation.

  • Property signals created by the :registerProperty() method are automatically added to the object’s maid for easy clean-up (helps prevent memory leaks after the game has been running for a while).

  • Swapped out existing coroutines and heartbeat waits in the framework for the task library instead.

  • Created the Registry class for keeping track of objects and easily grabbing them by their ID from any module in the game.

    • When an object is being destroyed, it will automatically be removed from all registries that it has previously been added to.
  • Created the Replicator classes on the server and client.

    • Property changes are automatically replicated.

    • For non-property values to replicate, you must set the index as replicatable by using the :replicates() method. From then on, any changes made to that index will automatically replicate.

    • Objects keep a “replicatedTo” list that makes it easy to replicate objects only to players that they haven’t already been replicated to.

  • Added a getAsset(directory, name) method to make fetching shared assets easier.

  • Changed :addSignal(name) to :addSignal(…) so that you can add multiple signals at once.

  • Added object:compare(otherObject, ignoreIndices, getDifferences). Typical use would be comparing stackable objects in an inventory to see if there are different values that would result in the object not stacking.

  • Added inventory methods. An inventory created for a PlayerManager will automatically be added to the PM’s maid. Objects registered to an inventory will automatically be assigned the inventories PM.

    • :canStore(object)

      • Returns true if the inventory has space for the specified object (accounting for stack sizes).

      • Uses an object’s :compare() method to check for similarities for stacking. If two objects are the same class but have different attributes (pretend weapons are stackable and say you have two “Iron Swords” but one of them is enchanted, meaning that the comparison should fail and cause the two items to be unstackable).

    • :deposit(object)

      • Adds an item to the inventory (using the :canStore() method above to check for storage capacity). Automatically fires the “Deposited” signal [i.e; inventory.Deposited:Connect(function(item) end)]
    • :withdraw(object)

      • Removes an item from the inventory. Automatically fires the “Withdrawn” signal [i.e; inventory.Withdrawn:Connect(function(item) end)]

:bug: Patches


  • The object :compare() method with the “get differences” variable toggled on would result in incorrect comparisons between properties (it was mistakenly checking for the property.Value rather than the property.Name on one of the objects).

Log w33y21a


:rocket: Updates


  • Added :replicated(index, value) method for objects that might want to overwrite the default replication behavior (which the Registry object does).

  • The Registry object compares newly replicated object lists to the old one and properly calls the :registered() or :unregistered() methods on the client.

    • This has the added effect of allowing the Client inventory to trigger the Deposited and Withdrawn signals appropriately.

Green = Server, Blue = Client

Log w34y21a


:rocket: Updates


  • Changed the plugin to have a launch button rather than automatically running by default. Pressing launch will add missing Minerva folders into the game and show the Minerva Explorer.

    • Sets the “enabled” setting so that the plugin remembers whether or not you previously had it open each time you launch studio.
  • Added an “Upload” button to the plugin that automatically selects the Minerva folders in game and prompts you to upload to Roblox.

    • This allows for more easily updating the game without going through the hassle of opening up every individual place to update packages.
  • Made some additions to the Animations controller to make animating a bit easier.

    • Parameters for new are now Animations.new(animationId, optionalName, optionalTarget)

      • “optionalTarget” allows for animations to be applied to an NPC rather than defaulting to the local player.
    • Added a “waitForTrack” method. When an animation is created, it has to wait for the Humanoid of the target or the local player’s character to exist before it can load the track on to said Humanoid. waitForTrack will pause the thread until this has happened.

      • Most of the existing methods that exist in the Animations controller will implement waitForTrack. For example, if you call animation:play() then the current thread will pause until the track exists, if it doesn’t already.

      • This prevents issues where some code might attempt to play an animation before it has actually been loaded on to the humanoid.

    • Animations existing inside of the controller (i.e; ones not created by code via .new()) are automatically created and loaded on to the local player’s character.

      • Animations not intended for the character should NOT be placed here.

  • Changed the Maid class to the Janitor class instead for performance reasons.
    • Went through and changed all exising references that were for Maid to the Janitor instead.

  • Added Promise module. Working on implementing.

:bug: Patches


  • UI component elements weren’t being added to the janitor properly after a recent change.

  • Multiple of the same indices could be unnecessarily added to the processing table when replicating.

  • Index prioritization was backwards in the class metatable. Created objects were incorrectly indexing the generic object first, which would result in unexpected values.

  • Property changes were replicating even when the “changes” were the same value (i.e; changing Health to 20 when it’s already 20 would still send data to the client unnecessarily).

  • Adaptor :get() wasn’t traversing the framework properly, resulting in child classes starting up without their parents.

    • Rewrote Adaptor:get(name: string, recursive: boolean?, directory)

      • Added Adaptor:getByInstance(instance), which the new get method uses. getByInstance traverses through the framework to return the module linked to the instance.

        • Changed getById(id: string) to also take advantage of the new getByInstance method.
1 Like