Skip to main content

2023 May: Widget 3D, Asset Meta Data!

· 7 min read
Gabriel T. Nardy
nanos world developer (SyedMuhammad)

Widget 3D, Asset Meta Data, Vault Upload, Client Side Trigger & more!

Tune in for a roundup of the latest updates from May!

Easier Upload to Vault

We're excited to announce new easier ways to upload new versions of your Packages and Asset Packs to the Vault!

Upload through CLI

We are adding a new CLI command, package upload and assets upload, that allows you to effortlessly upload new versions of your Package or Asset Pack through the CLI (Command Line Interface).

This system validates, compresses, and uploads the new version of your local resource directly to the Vault. It streamlines the process, saving you time and effort.

Terminal
./NanosWorldServer.exe --cli upload package default-weapons

Upload through the UI

We've also made it possible to upload new Packages or Asset Packs versions directly from the Vault Manage tab.

This new system now automatically detects when you have a newer local version than the remote one, displaying the upload button.

Vault Manage Tab when having a new version available to upload

Once the upload is complete, a popup will appear, reminding you to approve the release in the Store. It's a seamless and convenient way to manage and update your resources.

PopUp shown after uploading a new Version

Watch the Upload Process in Action:

Uploading a Package through the Vault

New Class: Widget3D

We're happy to introduce the new Class: Widget3D. This class provides a 3D representation of an existing Widget! Allowing us to have Widgets to be rendered as Actors in 3D world!

You can spawn Widget3D classes from the new Widget method SpawnWidget:

Client/Index.lua
-- Spawns and configures a Widget
local my_widget = Widget(NativeWidget.Image)
my_widget:CallBlueprintEvent("SetBrushFromTexture", "package://testing/Client/MyImage.jpg")

-- Spawns the Widget3D from the Widget
local my_widget_3d = my_widget:SpawnWidget3D(Vector(0, 0, 200), Rotator(0, 90, 0))

Widget3D spawned in World

Widget 3D Classnext/scripting-reference/classes/widget3d

Map Package Create Flow

We've made significant improvements to the Map Package creation flow through the UI.

Now, selecting the Map Asset is way easier! The system automatically fetches all the Map Assets contained in the selected Asset Pack, allowing you to conveniently select the desired Map Asset, simplifying the Map Package creation process!

Map Package Creation Workflow

Watch the Map Creation Process in Action:

Creating a Map Package through the Vault

Assets Meta Data

Now we can define Meta Data (custom values) to individual assets inside our Asset.toml! Before we could only define assets by it's path:

Assets.toml
[assets.static_meshes]
SM_Flower_01 = "MyFolder/SM_Awesome_Flower_01"
SM_Rock_01 = "MyFolder/SM_Rock_01"
SM_MyAsset_01 = "MyFolder/SM_MyAsset_01"
# ...

And now we can also define them as a table, allowing custom values to be set on each asset!

Assets.toml
[assets.static_meshes]
SM_Flower_01 = { path = "MyFolder/SM_Awesome_Flower_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_Flower_01.jpg" }
SM_Rock_01 = { path = "MyFolder/SM_Rock_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_Rock_01.jpg" }
SM_MyAsset_01 = { path = "MyFolder/SM_MyAsset_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_MyAsset_01.jpg" }
# ...

Read more in the Asset Meta Data docs section:

Asset Meta Datanext/core-concepts/assets

Trigger Client Side

Now, our Trigger class can be spawned on the client side as well! Allowing scripters to have Triggers being used on client-side the same way as on server!

Attached Meshes Features

We got a bunch of improvements and new methods to Attached Meshes functionalities!

We've introduced new methods that enable you to customize the materials of attached meshes directly on them: SetMaterialScalarParameterOnAttached(), and SetMaterialVectorParameterOnAttached(). This eliminates (and deprecates) the need for the attachable:// pattern when setting Material Parameters with the usual methods.

Additionally, we've added convenient getters such as GetAll[Static/Skeletal]MeshAttached() to retrieve all currently attached meshes and their paths.

And finally, we got SetStaticMeshAttachedTransform(), allowing scripters to change the transform (location/rotation) of attached meshes during runtime!

P2P Improvements

We've addressed several issues in the implementation of our P2P (non-dedicated server) functionality, particularly related to connecting to P2P localhost servers. We developed a new hybrid solution that has solved most of these issues.

P2P servers use Steam backbone to instantiate a new Fake IP which is provided to other players to connect to your server, without the need of your to forward ports in the router.

The problem with that is that you can only connect through this new Fake IP, making it impossible to connect through localhost (127.0.0.1) for example, so we had a hacky implementation that identified you were connecting to a localhost server and attempted to retrieve this fake IP directly from it, it was really dirty and with lots of flaws and unforeseen consequences/bugs.

But finally and fortunately we managed to implement a solution that solves all the problems having now a hybrid approach! Now all P2P servers also allows "dedicated" connections, making them possible to be connected through localhost and also the Fake IP, at the same time!

Misc Improvements

Compatib. Version 1.54

Lastly, worth mention this month we introduced a new Compatibility Version 1.54, with changes to Level.CallLevelBlueprintEvent, aligning it with the usual Blueprint functions by enabling variadic parameters. And also Client.GetPackages(), making it work like Server.GetPackages() as well!

Multi Package Reload

Now it is possible to reload/load/unload multiple packages at once with console commands! E.g.:

package reload sandbox battlefield-kill-ui

Updated CEF & Steam

We've updated CEF (114) & Steam SDK (1.57) libraries to the latest versions! We were almost 1 year outdated with CEF due some problems with Linux (Proton), but they now seem to be all fixed and we are up-to-date again!

UFont & UClass Params

Now Blueprint supports receiving UFont from Font TTF Path and UClass from Unreal usual paths (/Game/MyAsset/MyClass.MyClass_C)!

Vault Refresh

We added the refresh button to the Vault Item screen too! It is located at the right side of the navigation bar:

Conclusion

This month was aimed to increase the encouragement of scripters/modders to upload their resources to Vault. As now pushing new versions requires just few clicks, many of the barriers have been knocked down as the process was greatly automated!

The new workflow of creating Map Packages also aims to encourage scripters/modders to create the Map Packages from his Asset Packs way easier and faster!

A next step I want to do is the ability to create Packages/Asset Packs and approve releases on Store directly through the Vault UI (currently we still need to use the website to do so), then we will have the complete flow of creation and upload resources all inside the game!

I see that resource sharing is a crucial factor for Sandbox games, and I want to improve our design for that as much as possible to make it even easier!

In conclusion, this month we had significant improvements in various aspects of modularization and scripting capabilities!

Widget3D will allow numerous improvements in 3D UI creation (such as name-tags or simple custom 3D texts/signs).

And Asset Meta Data is a gigantic step to improve an area that was a little hazy on assets categorization. Soon I will update all standard assets adding tags, categories and also update the Sandbox package to make use of these in a more standardized way!

Thanks for another month of support and assistance! See you next month! 🤗🤗