Skip to main content

ยท 8 min read
Gabriel T. Nardy

New Character, Weather System, Console Commands/Layout & much more!

New Character Classโ€‹

This month we worked hard on refactoring our internal Player/Character implementations and all things that it interacts to (Weapon, Props, Vehicles). Our internal code was still very strongly linked to the main Character entity, everything having direct references to it. So we worked hard to modularizing them, which allowed new "Sub" Character classes to be added.

And as an initial version, we created the new CharacterSimple class. A "simple" but powerful new class, it has no special features besides basic movement (based on Unreal base Character), but it allows to be constructed by passing a customized Animation Blueprint! Also it supports passing a StaticMesh as a mesh, which we automatically adjusts the Capsule Size of it based on the mesh size, perfect for Prop Hunt!

This new Character entity can then be used by anything, Custom NPCs, Animals, Props, etc. And them all can be possessed by Players!

info

We will be studying the ability to add more features to this class (e.g. Drive Vehicles or Handle Weapons). As this class is aimed to be simple, those features weren't added so far.

Read more in the CharacterSimple class page.

Docs Improvementsโ€‹

A summary of important changes in the docs.

Sandbox Sectionโ€‹

I added a new section just for the Sandbox game-mode. This has examples on how the Spawn Menu, Context Menu and the Tool Guns work, and teaches how you can create scripts to extend or create new features which integrate with it! It is a great new Quick Start we have!

Changelogโ€‹

We've got a new Changelog tab with the most recent updates of nanos world!

Compatibility Versionโ€‹

I moved the Compatibility Version pages to a new single page under Core Concepts / Packages section. Now all Compatibility Versions changes and the it's guide will be centralized there.

Improved CSSโ€‹

We've got some improvements on the docs layout and CSS. The Mobile visualization was improved and we got new dividers between API definitions, making all look neat!

Troubleshoot Assetsโ€‹

I added a new section of Troubleshooting for Assets with the most common problems and their fixes.

ADK is on Steamโ€‹

Now it is possible to download and use the Assets Development Kit through Steam directly! This new Steam Tool Entry for nanos world makes the ADK to be always updated! It launches the Unreal Editor automatically.

New Console Colorsโ€‹

We reworked our Console Layout and now it is more colorful and pretty! It got much more robust and modern! Hope you like it!

Console Commandsโ€‹

We've introduced the official Console Commands system. This new system allows adding custom console commands to both Server and Client consoles, and integrates it with the Available commands list when typing help on it.

It is a simple initial implementation which you can define the name of the parameters and the description of it, in the future we may expand it to define which type to expect, default values and more:

Console.RegisterCommand("myawesomecommand",
function(parameter_one, parameter_two)
-- Do something with parameter_one and parameter_two
end,
"this command executes awesome codes", -- Description
{ "parameter one", "parameter two" } -- Parameters
)

Read more in the Console.RegisterCommand method page.

Steam Avatarโ€‹

Now it is possible to retrieve the Player's Steam Avatar! We've added a new method Player:GetPlayerIconURL() which returns a special URL which can be load the Steam Avatar on WebUIs:

Sky & Weatherโ€‹

We integrated the Weather system from Ultra Dynamic Sky into the Sky class! Now it is possible to change the current weather through Sky.ChangeWeather() and even have it integrated in your maps by using Ultra Dynamic Sky Material Functions from it's Assets Content if you have the UDS!

We've added a new dropdown to Context Menu to allow you changing the Weather from there:

Also the Sandbox Context Menu has a new section only for controlling Weather & Sky, and also an automatic Weather change system which synchronizes the current Weather with all connected players!

New Config.toml Formatโ€‹

The Server configuration file was completely reworked. Now we have several different sections and many more settings available to set through that. Almost all settings available through command line parameters now can be defined there persistently.

See the full configuration file schema here.

Compressionโ€‹

A new setting which has been added is the compression, which allows you configuring the amount of compression (0 is none, 9 is extreme) applied to some network operations. For now we are testing this new compression system for small files transfer and server requirements manifest, we managed to see up to 90% reduction of the size of those files when having it enabled!

tip

Using high level of compression affects the server and client performance as we add a new layer of computation processing to the CPU.

Level Entities Settingsโ€‹

Now it is possible to toggle in the Package.toml if you wish to load Level Entities, a.k.a. loading Level StaticMeshes as entities. This setting acts as a global OR setting which if we have at least one Package which enabled it, the setting will be enabled globally.

This setting allows we skipping a lot of processing and runtime performance loss if we don't need to use or reference level's StaticMeshes through scripting.

New Settings to Map.tomlโ€‹

We added two new settings to Map.toml: package_requirements and compatibility_version, allowing Map Packages to work better on their own.

Level Streaming Supportโ€‹

We implemented the full support to Level Streaming and World Partition. Before they weren't properly integrated into our Level class but now the events are triggered for auto-streaming and chunks from World Partition being loaded/unloaded as well! Also it is now integrated with Level Entities making the Level StaticMeshes to load/unload as entities on demand as well!

Large World Coordinatesโ€‹

Our Vector structs were refactored and now we have support for double-precision to Vector struct! Meaning huge Levels are now possible in nanos world! Read more about it in the Unreal Official Documentation page.

WebUI Layoutโ€‹

We added a new method to WebUI which although seems simple, it expands a lot the possibilities and modularity with UIs. Now it is possible to change the WebUI Canvas layout through WebUI:SetLayout.

This method allows changing the Canvas Layout (anchors, offset, alignment) of it, meaning we can have WebUIs working just as small popups, allowing you clicking on background WebUIs while having others small ones in the front of the screen!

WebUI ExecuteJavaScriptโ€‹

We added a new experimental method to WebUI: WebUI:ExecuteJavaScript. This allows executing arbitrary JavaScript code in your WebUI.

note

This method only works on local WebUIs.

In the last month we removed the logo settings from Config, Package and Asset Packs, as now they all must be locally-placed jpg images. But now we added back the --logo command line parameter to the server allowing it to auto download it as the Server.jpg image! Allowing you to easily setup a remote server and add a logo to it.

New Graphic Settingsโ€‹

We've added a new setting allowing to change the Shadow Map method to use the new experimental Virtual Shadow Maps method!

CEF Framerateโ€‹

We've improved our CEF implementation by dynamically configuring it's render/update rate, and now it refreshes at the same rate as the game improving a lot the perception of fluidity.

HTTP & Database Renamesโ€‹

We've renamed HTTP and Database methods to follow the correct standard of names.

E.g. We've changed HTTP:Select to become a synchronous method and added a new HTTP:SelectAsync method which is the new async. See more information about this new Compatibility Version in the official Documentation Page.

Conclusionโ€‹

Since a few months now, we have had major significant changes internally in codebase (which until now were only served to add random bugs to the game ๐Ÿ˜œ), but finally we can start to see the good results of that, being able to extend the API by having new classes coming up, such as the new CharacterSimple!

I love to make these improvements like the Console Layout or Config.toml changes because they greatly add to our Quality of Life as devs, and give things a refreshing air.

I was surprised on how the Ultra Dynamic Sky and specially the Weather integration was really easy to do. It was literally just drag'n dropping the Blueprint into the map! And that adds much more immersion to the players!

In this update, we solved several impasses we had so far, such as Large World Coordinates or Level Streaming/World Partition which were uncertain whether or not they would work. Not to mention the new added class of Character that was a much requested thing and will add a lot more possibilities to the game! And that's just the beginning!

Thanks for another month of support! I hope you enjoyed this news blog! See you next time!

ยท 9 min read
Gabriel T. Nardy

One Lua Virtual Machine to Rule Them All!

One Lua Virtual Machineโ€‹

After much analysis, study and refactoring. I am happily introducing the new way the Packages will work! This was heavily motivated by the lack of possibility of creating extensions or customized items in an easy way.

In addition to the last new Entity System update, this change will heavily add to the possibilities of modding & scripting capabilities to nanos world!

info

Those changes are meant to have as little as possible impact and breaking changes, all tests I did so far assured everything is still backward compatible!

So far, we had one VM (Virtual Machine - or lua_State) created per Package. This caused each Package to be completely isolated from each other. Therefore it was necessary to create mechanisms for communication between the Packages, such as Events and Package.Export/Package.Call methods, which allowed (in a limited way) Packages to communicate with each other.

But as mentioned, this brought many limitations, such as it was not possible for Packages to access variables or call functions directly from other Packages, or even worse (which become more evident from the last update of Entity System): It was not possible to share custom classes between Packages!

However now all of this will be solved! I reworked the entire internal scripting system, and now instead of having a new virtual machine per Package, we will have a virtualized sandboxed environment (using Lua environment _ENV feature), separating the scope of each Package but allowing them to access a global shared environment!

This will allow the Packages to define classes, expose functions and share libraries globally! So that everyone else can use without the need for workaround mechanisms to do so!

Now, for example you can just load additional scripts together the sandbox game-mode which loads custom Classes of tools or weapons, and those will appear automatically in the Spawn Menu, no need for manually adding them anymore!

Each Package will still have it's own sub-global environment, so defining global variables or functions will not make them available to other packages immediately.

Call & Exportโ€‹

Package.Call and Package.Export are not necessary in the traditional way anymore. As now we can share the global environment, we can define methods and expose them to be called directly, without the need to Package.Call them.

The Package.Export will still exist and work similarly. But now it will be possible to "expose" any value to the global scope! Example:

package-01/Server/Index.lua
local my_table = { 123, 456 }

function DoSomething(var1)
return var1 + 123
end

Package.Export("MyTable", my_table)
Package.Export("DoSomething", DoSomething)
package-02/Server/Index.lua
Console.Log(MyTable[1])
-- 123

Console.Log(DoSomething(456))
-- 579

Inherited Classesโ€‹

Now all Inherited Classes will be available to all Packages, as they will be created and exposed to the Global scope automatically.

The first parameter of it will now be used as the variable name to set the class in the global scope. Also, it just got a new optional 2nd parameter to define a custom table contained custom values to be set in the class table before it's created:

-- Note we are assigning the return of Inherit to a variable called
-- MyPropClassLocal, but also MyPropClass will be defined globally
-- as being our class, both variables points to the same Class table
MyPropClassLocal = Prop.Inherit("MyPropClass", {
"my_custom_value" = 123,
"my_another_value" = "hello"
})

local val = MyPropClass.my_custom_value
-- val == 123

We've also added a new static event for getting when a new Inherited Class is registered: ClassRegister:

Prop.Subscribe("ClassRegister", function(class)
-- Do something with the new class
end)

Library Package Typeโ€‹

With this new way Package work, library types are no longer needed. As now we can communicate directly with other packages with exposed global methods, we can just define the methods to be exported with Package.Export and use them whenever we want.

In this way we will only have two types of "lua script" Packages: game-mode and script. All existing library packages will be automatically converted to script when loaded.

RequirePackageโ€‹

Therefore, Package.RequirePackage will becomes unnecessary as well. As we can now reuse the same script globally, this method will be depreciated in favor of adding your package in the package_dependencies list of your Package's Package.toml.

Package requiring the default nanos-world-vehicles or nanos-world-weapons will load them as a standalone Package, as now they export the NanosWorldWeapons and NanosWorldVehicles tables globally.

GameMode Settingsโ€‹

We are introducing the concept of custom settings for game-modes! These settings can be defined in Package.toml like that:

# game-mode custom settings configurations
[custom_settings]
my_toggle = { label = "enable PVP", type = "boolean", description = "whether to enable PVP or not", default = true }
my_text_input = { label = "type anything", type = "text", description = "custom text!", default = "hello world!" }

These settings can be configured through server arguments --custom_settings "my_toggle = true, my_text_input = 'awesome text!', ...", or through the New Game screen, which parses and displays the configuration dynamically when creating a new game:

The values defined can be accessed through the new method Server.GetCustomSettings().

Please refer to the updated Documentation Page for more information.

Configuration Filesโ€‹

As announced on previous blogs, the format of the configuration files are changing in the next update!

tip

All Package.toml and Assets.toml in the old format will automatically self-convert to the new format as soon as they load for the first time.

Meta Blockโ€‹

Now we have a new common header among all Assets.toml and Package.toml: [meta].

It will have the following format, which will be used to define general configurations mainly used by the store:

_meta.toml
loading...

Packageโ€‹

For the Packages, we will have a new format to differentiate their Types. Each Package type will have an independent and different block of configurations. Now the Package type will be determined by defining a block [game_mode], [script] or [loading-screen].

This is how a game-mode Package.toml will look like:

_game_mode.toml
loading...

Configuration Imagesโ€‹

As you may have noticed, there is no more setting image on Package.toml, the same applies to Assets.toml and for the server image in the Config.toml.

Now, the images should be physically placed next to the .toml file with the name Package.jpg, Assets.jpg or Server.jpg.

This is a standardization to solve the image inconsistency between the store and the config file, as well as to avoid external and malicious links to be placed there. But this brings the drawback that only dedicated servers can display an image on the Server List from now on.

New Static Classesโ€‹

Finally we are releasing the update with all the Static Class refactoring! This will give us a great new organization to find things at the docs, as now specific methods will be grouped into classes with names that make sense!

List of all new Static Classes:

Also, ๐Ÿ•น๏ธ Input got a bunch of new methods and events as well from Client.

Many of the methods from โŒจ๏ธ Client and the old ๐ŸŒ World were migrated to those classes! Check their pages for accurate information!

Renamed Eventsโ€‹

Due our last poll, we are starting to change all events names which were with wrong names. We are standardizing them to the present tense, so events like CharacterEntered will be renamed to CharacterEnter for example.

All changes will keep the old event working as deprecated. Please get attention to the new warnings to update them to the newer version!

Assets Plugin Contentโ€‹

Now it is possible to create Asset Packs from Plugin Content, this will be the preferred way of creating content from now on as it prevents assets paths colliding with others.

For that, we added a new setting in Assets.toml to define if the Asset Pack is a plugin content: is_plugin_content.

Please refer to the updated Documentation Page for more information.

Store Improvementsโ€‹

Last month MegaThorx launched an update to the store, which greatly improves the upload flow of new versions. Now we have a progress bar, as well as special scripts to verify for syntax errors and potential problems. More features will be added in the future as well!

Conclusionโ€‹

I was not very much satisfied on how nanos world was handling the possibilities of modding and scripting. It felt very limited and non natural the way scripters had to do to make packages to communicate with each other, it wasn't allowing much customization or extensibility.

With the last month's Entity System and now with this change to how Packages work, I feel that a huge door of possibilities has just opened even more, which will give a good breath to new things to be added!

An excellent example of what now is possible to achieve is creating a blank script package with a custom special inherited Weapon, and just loading the Sandbox game-mode together with your script to make it show up in the Spawn Menu, without needing any special call or workaround! This is huge and tie all the remaining knots! ๐Ÿฅณ

This change to a single VM was a big change, at first I thought it was not going to work, but after done and performing tests I was very surprised and happy with the results! Now we have to refine and improve it even more!

Modding goes brrr!! Thank you for the support! See you next month! ๐Ÿ’ช๐Ÿ’ช

ยท 9 min read
Gabriel T. Nardy

Entity System, UDS & UE5.1!

Refactor Releasesโ€‹

As announced in the last Blog News, we are performing a series of refactoring in the API to standardize it better. We have a long list of changes and I'm doing them gradually.

The main one that allowed us to make more changes without breaking compatibility is the compatibility_version released in the last update. This configuration on Package.toml will ensure that the package continues to work in future updates in cases of breakage changes.

Also we've already got our first feature to try the compatibility_version system: the new Events.SubscribeRemote method! This method will subscribe only for remote called methods, splitting completely the behavior of subscribing for Local and Remote events. The change of this method caused a breaking change because all existing Events.Subscribe will no longer trigger with remote Events. But compatibility_version ensures that they continue to work until you update the value to version 1.22 or more recent.

I'm working on several Static Class refactoring as well and also changing some names of methods (e.g. HTTP.RequestSync will be standardized into just HTTP.Request and the async version would become HTTP.RequestAsync).

I reinforce again that if you have suggestions on other changes such as event or methods names, do not hesitate to say it! Big refactoring opportunities like this are rare!

Entity & Inheriting Systemโ€‹

This is a very special update which I've been working in the past months! ๐Ÿฅณ

The new Inheriting System is an addition that completely changes the paradigm of creating scripts! This system allows you to inherit existing classes to create your own custom classes and spawn them as if they were native!

-- Creates a new Class called "MyNewClass" inheriting from Prop
MyNewClass = Prop.Inherit("MyNewClass")

-- Spawn it using the default constructor
local ent = MyNewClass(Vector(), Rotator(), "nanos-world::SM_Cube")

Built-in Eventsโ€‹

Native events will return your class instead of the native class. E.g.:

-- This will trigger for all Props and it's descendents,
-- and the value of 'prop' will be the children itself
Prop.Subscribe("Destroy", function(prop)
-- You can check if an entity is from a inherited Class type!
-- IsA checks recursively if any parent is from that type
if (NanosUtils.IsA(prop, MyCube)) then
-- prop is of type MyCube
end
end)

Custom Methodsโ€‹

Easily add new methods to your class!

MyNewClass = Prop.Inherit("MyNewClass")

function MyNewClass:MyMethod()
-- Do something
end

Custom Constructorsโ€‹

This system also allows the creation of personalized constructors:

-- Creates a new Class called "MyCube" inheriting from Prop
MyCube = Prop.Inherit("MyCube")

-- Defines my constructor with any parameters you desire
function MyCube:Constructor(loc, rot)
-- Do any kind of logic here
loc = loc + Vector(0, 0, 100)

-- Calls Super Constructor to finalize the construction
self.Super:Constructor(loc, rot, "nanos-world::SM_Cube")
end

-- Spawn it using your custom constructor
local cube = MyCube(Vector(123, 456, 100), Rotator())

Multiple Inheritanceโ€‹

We can inherit from other inherited classes as well!

MyCube = Prop.Inherit("MyCube")
MyMiniCube = MyCube.Inherit("MyMiniCube")
MySuperMiniCube = MyMiniCube.Inherit("MySuperMiniCube")

Custom Entity Eventsโ€‹

Now we have the possibility to trigger remote events on custom Classes, to allow easy networking communication:

Client/Index.lua
function MyCube:OnMyAnotherEvent(my_param)
Console.Log(my_param)
end

MyCube.SubscribeRemote("MyAnotherEvent", MyCube.OnMyAnotherEvent)

local my_cube = MyCube()
my_cube:CallRemoteEvent("MyCustomEvent", 123)
Server/Index.lua
function MyCube:OnMyCustomEvent(player, my_param)
self:BroadcastRemoteEvent("MyAnotherCustomEvent", "hello")
end

MyCube.SubscribeRemote("MyCustomEvent", MyCube.OnMyCustomEvent)

Global Registryโ€‹

Through the parent class, we can get a list of all children classes of that class, having a global registry of all existing classes!

local children_classes = ToolGun.GetInheritedClasses()
for _, class in pairs(children_classes) do
-- 'class' is a custom inherited class! we can spawn it
local p = class()
end

Further Readingโ€‹

There's much more! Like entity events or calling parent methods! Read about everything at the Dedicated Documentation Page.

Sandbox Improvementsโ€‹

With this new Entity System, I'm taking the time to do some improvements in Sandbox game-mode, as now this system allows a better organization of how things interacts with each other.

Entitiesโ€‹

I'm converting almost everything into this Entity System, for example the Torch (Melee at spawn menu) now becomes a Torch entity inherited from Melee:

Server/Index.lua
Torch = Melee.Inherit("Torch")

function Torch:Constructor(location, rotation)
self.Super:Constructor(location or Vector(), rotation or Rotator(), "nanos-world::SM_Torch")
self:AddAnimationCharacterUse("nanos-world::AM_Mannequin_Torch_Attack")
self:SetImpactSound(SurfaceType.Flesh, "nanos-world::A_Punch_Cue")
self:SetDamageSettings(0.5, 0.25)
self:SetCooldown(1.5)
self:SetBaseDamage(25)

local light = Light(Vector(), Rotator(), Color(1, 0.7, 0.4), LightType.Point, 100, 1000)
light:AttachTo(self, AttachmentRule.SnapToTarget, "", 0)
light:SetRelativeLocation(Vector(0, 0, 75))

local particle = Particle(Vector(), Rotator(), "nanos-world::P_Fire", false)
particle:AttachTo(self, AttachmentRule.SnapToTarget, "", 0)
particle:SetRelativeLocation(Vector(0, 0, 50))
end

And we can spawn it like that:

Server/Index.lua
local my_torch = Torch(Vector(), Rotator())

Spawn Menuโ€‹

I'm trying to get rid of the "AddSpawnMenuItem" functions. And instead replace everything by the Inherit Registry System which you inherit from a Class and it shows up in the Spawn Menu like magic!

For example we are be able to Melee.GetInheritedClasses() and get all custom Melees Classes (like Torch) which were defined in this Package, and display them in the Spawn Menu automatically!

Toolsโ€‹

Now we will have a base class for the Tools called ToolGun. With that we can just inherit from this class to create new Tools, which will be automatically displayed on Spawn Menu and work as a Tool Gun!

See how the Balloon Gun is defined now:

Server/Index.lua
BalloonGun = ToolGun.Inherit("BalloonGun")

function BalloonGun:Constructor(location, rotation)
-- Calls parent ToolGun constructor
ToolGun.Constructor(self, location, rotation, Color.VIOLET)
end

function BalloonGun:OnSpawnBalloon(player, location, ...)
-- Do the original logic here...
...

-- Spawns a Balloon entity!
local balloon = Balloon(location, rotation, ...)
end

BalloonGun.SubscribeRemote("SpawnBalloon", BalloonGun.OnSpawnBalloon)

And on Client we just define it and set some properties which will be read from the Tool Gun and the Spawn Menu:

Client/Index.lua
BalloonGun = ToolGun.Inherit("BalloonGun")

-- Defines some properties used by ToolGun and SpawnMenu
BalloonGun.name = "Balloon"
BalloonGun.image = "package://sandbox/Client/Tools/BalloonGun.webp"
BalloonGun.tutorials = {
{ key = "LeftClick", text = "spawn balloon" },
{ key = "Undo", text = "undo spawn" },
{ key = "ContextMenu", text = "balloon settings" },
}

function BalloonGun:OnFire(shooter)
-- Do the original logic here...
...

-- Calls remote to spawn the Balloon
self:CallRemoteEvent("SpawnBalloon", location, rotation, ...)
end

BalloonGun.Subscribe("Fire", BalloonGun.OnFire)

And that's it! No needs to call any "AddToSpawnMenu" function anymore! We just need to inherit a known class of it!

tip

Note we have defined a class called Balloon which is the new implementation of the balloon. ๐Ÿ˜‰

Context Menuโ€‹

Also, I'm doing some improvements on the Context Menu and make it more modular. Now it allows adding new entries dynamically, which I'll be integrating with the ToolGun systems to allow tools customization, look at this example of using the Balloon Gun with it:

This new ContextMenu allows customizing it 100% through Lua, without needing to add new hardcoded HTML/JS entries on it.

Unreal Engine 5.1โ€‹

This month, Epic Games released Unreal Engine 5.1. This is a long-awaited version for us, especially for the expected corrections.

The upgrade is being smooth, the hardest part of those upgrades is forcing everyone to upgrade it's assets and projects too.

Physics and Cablesโ€‹

Cables rendering and Physics Constraints were completely broken since 5.0, I've even reported that as bug to Epic and they fixed both problems but delayed the release just to 5.1.

But finally we can be happy again with the balloons physics working perfectly! ๐Ÿ˜Ž

Nanite & Lumenโ€‹

Both system got great upgrades since 5.0, but one drawback of using the newest technologies is that we will need to enforce the game client uses DirectX 12, as it's a requirement for Nanite and some Lumen features to work.

I will still do some studies on if we should or not force DX12, I don't want to have unforeseen consequences in the future by taking a decision like that.

Ultra Dynamic Skyโ€‹

Ultra Dynamic Sky is one of best Unreal Marketplace Asset Packs, it provides a dynamic sky and weather solution for games!

I decided to include this sky system natively in nanos world. It will replace our existing DefaultSun (on World class) with a new Static Class: Sky, which will be released soonโ„ข along with the Unreal 5.1 update!

If you don't know it yet, see this product video of your features:

Conclusionโ€‹

The update of the new entity system is huge! And I am very happy with the result, it's usability got really simple and that opens too many new possibilities!

This change will allow nanos world to advance to another level on scripting capabilities. I'm studying more ways to allow even easier methods for creating custom scripts extensions, such as a way for you to create your entities that are dynamically loaded on a package, without you need to manually load them by Package.Require in the original package.

Just by the fact that now we can simply define a new class inheriting from another and that is enough for it to be displayed in the Sandbox's Spawn Menu is already amazing!

I wish to finish the still-going refactoring of the Static Classes, and also to start renaming some non-standardized Class methods. The compatibility mode feature will help a lot of us keeping things working with those changes. And as soon as possible my wish to release the UE 5.1 update to everyone, this last one will be the most painful one as require us to recook and update all assets in the store. ๐Ÿ˜œ

Also, I wish to start a discussion at Discord about the future of the Extending Classes, it's currently working regardless of the new Inheriting system, but it has several problems that I want your opinion to decide the future of it.

Hope you enjoy it! Feedback appreciated! See you next month!

ยท 7 min read
Gabriel T. Nardy

Halloween Playtest, Big API Refactor and more!

Halloween Playtestโ€‹

This month we had our annual Halloween ๐ŸŽƒ event! As always, it has always been a moment of great evolution for nanos world! I would like to thank everyone who participated playing and the testers who participated creating content and game-modes for this event!

This year we had 4x more registered Playtesters than last year, and we hit several records in simultaneous players. And best of all, the game server managed to handle them all with ease ๐Ÿ™! (except by the Vault that we had to increase the download limit during the event ๐Ÿ˜œ).

Due to the event, we halted the updates for two weeks to focus only on bug corrections and improvements. We pushed more than 10 small patches with many bug fixes and improvements we've found before the event to grant it's stability!

Vehicle Improvementsโ€‹

I did several improvements on the Vehicle class, allowing bigger customization on them.

New Default Vehiclesโ€‹

We've added a new Vehicle Pack to the default nanos world vehicles pack. 4 of them are from a Feature free Marketplace pack (from the same creator of our previous one), and the Offroad is from Epic Games.

Animation Blueprintsโ€‹

I've added the possibility of loading custom Animation Blueprints on Vehicles, allowing the opportunity to have custom suspension animations like this one of the new Offroad vehicle:

Dynamic Lights Textureโ€‹

Now it is possible to configure your vehicle with custom Material Parameters to turn it's Lights ON or OFF dynamically. You can find more info on how to configure your vehicles materials here.

New Subtle SFXโ€‹

Also, I've added new custom sounds effects to vehicles, such as pulling the handbrake, or wheels brake screeching for example which adds to the realism and immersion.

Vault Text HTML Parserโ€‹

Previously, as Vault item descriptions and changelogs were generated with HTML, we had CEF Browsers (WebUI) rendering them, but it was too much overkill and also quite disconnected from the rest of the UI.

So I decided to implement a custom HTML Parser to convert the HTML into proper Unreal Rich Text, having then a native renderer for the descriptions and changelog, making everything pretty again.

Native JSON Parserโ€‹

I am migrating our current built-in JSON library to a native more-efficient JSON parser. With this new parser, we've managed to reach 10x speed when parsing JSON strings! All methods will remain the same, just the implementation will change.

Benchmark comparison: (9.5 MB JSON file)
Benchmark 'Lua JSON Parser' (x10) took 9964ms.
Benchmark 'Native JSON Parser' (x10) took 1057ms.

Kill Zโ€‹

I implemented a built-in system for Kill Z. This is a system to destroying entities automatically when they reach too low heights, preventing some problems such as value overloading.

Currently the Kill Z offset is hardcoded for testing.

Big API Refactoringโ€‹

This refactoring update will come in a future update and it's not completely done yet, but I would like to advance some things that are planned to change. We know refactoring usually comes with several breaking changes, but this time I'm working harder to make this update with zero breaking changes, keeping backwards compatibilities until you update your packages.

If you have more ideas for dramatical changes (such as renaming methods to maintain standard for example), please let us know so we can include in this big update!

Package Compatibilityโ€‹

I will be introducing a new setting in the Package.toml for the "Compatibility Version", where you can configure the current version of the game that works with that package and if the game updates and any method that your package uses get modified, it will continue to work in a "compatibility mode" (with deprecated alerts).

This differs from the usual "deprecated warnings" because now in cases where the signature of a method changes the package will not stop working (as it happens today), and the old implementation/interface will still exist internally.

Eventsโ€‹

Currently events work by just subscribing and calling them local or remotely, but we cannot strict if we just want to receive them on a specific side. A new addition will be the subscription of remote-only events:

Events.SubscribeRemote()

This way only events called with Events.CallRemote() on the other side will trigger it. And also events subscribed with Events.Subscribe() will not receive remote events anymore.

Modulesโ€‹

Modules (Lua external binaries) will be reformed to become a type of Package. This way they can be shared easily and used by other packages, including through Vault.

Configuration Filesโ€‹

Now different Packages types will have different configuration files format (toml).

For example, the loading-screen package configuration currently have a lot of configuration which is not used by it (dependencies, assets, lua settings, etc). I want to have specific configuration files for each kind of Package (Modules, Loading Screen, Game-Modes, Libraries and Scripts), as also they will be loaded in different ways internally.

Server, Package & Assets Imageโ€‹

I'm removing the image URL setting inside the configuration .toml files, instead the image should be placed besides the .toml with the name Package.jpg, Assets.jpg or Server.jpg. This will avoid some problems of the client accessing dangerous or bad external URLs.

Multiple Constructorsโ€‹

A feature that will be included is the possibility of multiple Constructors, a very good example is the Sound Class that has several parameters that depend if the sound is 2D or 3D:

-- Current Constructor
Sound(location, asset, is_2D_sound, auto_destroy, sound_type, volume, pitch, inner_radius, falloff_distance, attenuation_function, keep_playig_when_silent, loop_mode)

-- New 2D Sound Constructor
Sound(asset, auto_destroy, sound_type, volume, pitch, loop_mode)

-- New 3D Sound Constructor
Sound(location, asset, auto_destroy, sound_type, volume, pitch, inner_radius, falloff_distance, attenuation_function, keep_playig_when_silent, loop_mode)

This way you can spawn a 2D or 3D sound just by choosing the right constructor!

Static Classes Renamesโ€‹

This will be a big organizational change! With each new update, some of our Static Classes are starting to accumulate lots of methods, and many of these are unrelated to each other.

With this in mind, we will split some Static Classes into new Static Classes, aiming at the best organization and especially the easy search and understanding of scripting API functions, some of the following listed methods may be renamed to reduce redundancy (e.g. to Chat.SendMessage).

We will have several new Static Classes, to list a few:

Chat, Console, Trace, Navigation, Debug, Viewport, Steam, Discord and others.

The full list with all changes will be listed when the update is released. All of these changes, including it's Events will be warned as deprecated for use.

Class Renamesโ€‹

Some classes will also be renamed for better standardization. For example Character and Vehicle could become CharacterMannequin and VehicleWheeled, which allows new classes of other types e.g. VehicleWater or CharacterGeneric.

Conclusionโ€‹

This was a month of several fixes, improvements and rethinking the API as a whole, refactor is always a challenge as I need to maintain everything working and still rearrange the new interfaces of it, I don't want to rush this change.

My main objective now is finishing the organization of the API refactoring (please give me feedback of the changes mentioned on this blog!). Once this get finished, I will get more comfortable on adding new things and classes into it, I have many new features being developed in parallel that have not yet been announced, several of them are from your suggestions from Canny (cof cof vote! cof cof).

The result of the PlayTest was awesome! We had very few crashes and the server managed to handle very well the large amount of players!

I'm sure these upcoming improvements, including some not announced, will raise nanos world to another level of robustness!

Finally, thank you for all the support!! See you next time!

ยท 8 min read
Gabriel T. Nardy

Dimensions!

Dimensions ๐ŸŒŒโ€‹

Proudly I announce the implementation of one of the most requested features to be integrated into nanos world: Dimensions! ๐Ÿฅณ

note

In this initial version, bugs, desyncs and weird things can happen, please let me know immediately!

Dimensions are separated worlds in the client-side, where players and actors are separated. By default all players and entities are in the dimension 1. By moving a Player to another dimension, all entities that are not from that dimension will be destroyed to that player, and all entities in the new dimension will spawn for him.

The API is very simple:

actor:SetDimension(number)

By sending an entity, their "children" will move too, examples:

  • When sending an Actor, all the other attached Actors will move as well.
  • When sending a Player, the Character will move along.
  • When sending a Character, the Player is not moved together. The Weapons or Props (and attached) will move.
  • When sending a Vehicle, all passengers will also be sent.

I also added a new method to facilitate the use of events:

Events.BroadcastRemoteDimension(dimension, event_name, params...)

This event will be sent to all players in that dimension.

If you send an entity through remote events that is not in the same dimension as the Player, the argument will be replaced by nil and a warning will show up.

New Aim Block Animationsโ€‹

I've reworked the way weapons get blocked when facing obstacles. Before it was switching the AimMode to unaimed causing a really bad effect and even moving the crosshair a little.

Now the weapon will bend procedurally and the AimMode won't change, improving a lot the game-play!

Server Sync Valuesโ€‹

Now it is possible to have global synced Values between Server and Client using Server.SetValue() method, with a new bool parameter sync_on_clients. Those values will exist on all clients through Client.GetValue() as usual.

Blueprint Improvementsโ€‹

Our Blueprint functionalities got boosted!

Event Dispatchersโ€‹

It is now possible to bind to Blueprint Event Dispatchers from Lua! Making the communication from Blueprint to Lua now possible!

-- Spawns the Blueprint
local blueprint = Blueprint(Vector(), Rotator(), "my-asset-pack::BP_AwesomeBlueprint",)

-- Subscribes to a Blueprint Event Dispatcher
blueprint:BindBlueprintEventDispatcher("GorgeousDispatcher", function(self, arg1, arg2)
-- arg1 is a string and arg2 is an integer
Console.Log("Called from Blueprint!", arg1, arg2)
end)

You can find more examples at our new documentation page: Blueprint Communication!

Function Return Valuesโ€‹

It is also now possible to retrieve return values in Lua from Blueprint Functions!

Passing Actors throughโ€‹

And we can pass actors through parameters into and from Blueprints calls, they will be properly parsed into the correct entity when receiving or sending from Lua! E.g. You can create a Blueprint event which receives a Character or Actor as parameter, and pass it through Lua, it will be automatically parsed and marshalled to the correct Blueprint variable type!

Scripting Events Variablesโ€‹

Now our internal variables use 8 bytes for passing floats and integers, allowing higher values from being passed through events (network ones too)!

Tick Performance Boostโ€‹

I managed to improve a lot the performance when having thousands of entities spawned (most were caused by Level StaticMeshes. I implemented smart algorithms to improve when they will perform Tick calculations for certain entities based on distance and real need to tick an entity.

This improved the CPU usage in almost 10x in some cases!

Client Side Network Authorityโ€‹

An experimental feature which has been added is the ability to allow methods of being called in the client-side if the player is the network authority of that entity.

For example now it is possible to call TranslateTo, RotateTo, SetForce, AddImpulse, SetWeaponAimMode and SetViewMode from client side! Which can improve a lot of Sandbox Physics Gun behavior for example!

WebUI Native Tablesโ€‹

Now you don't need to JSON.stringify() tables to pass to WebUI events anymore! You can pass them directly as the arguments and it will be natively parsed, which means much more performance when passing big tables around, and also you don't need to worry about stringifying or parsing them anymore as they already come as native table as the parameter!

File JSON Parserโ€‹

Our File entity got a new method to natively load a JSON file and get it's table into Lua:

File.ReadJSONAsync()
File.ReadJSON()

And we've got a big performance improvement compared to reading it as raw string and using the Lua JSON library:

Benchmark comparison loadinga big JSON file (9.5 MB)
Parsing it with Lua JSON library: took 9964ms.
Parsing it with Native JSON parser: took 1057ms.

CEF Improvementsโ€‹

Loading Screenโ€‹

I finished integrating CEF into the Loading Screen and now Ultralight has been completely removed from nanos world.

Also we got a new feature for Loading Screen: the ability to stop the Main Menu music! For that you need to call an event from JS:

Events.Call("StopMenuMusic");

Better Error Handlingโ€‹

The error handling has been improved as well, before we didn't get feedback of errors when loading invalid files and now we have.

Character Blend Spacesโ€‹

Now it is possible to import custom Locomotion Blend Spaces to your Characters. You can override Standing, Crouching and Proning animations. And also set the transition animation between them!

We've got new API methods for that:

Character.SetAnimationIdleWalkRunStanding(anim_path, enable_tip)
Character.SetAnimationIdleWalkRunCrouching(anim_path, enable_tip)
Character.SetAnimationIdleWalkRunProning(anim_path)

Character.SetAnimationsTransitionStandingCrouching(anim_standing_to_crouching, anim_crouching_to_standing)
Character.SetAnimationsTransitionCrouchingProning(anim_crouching_to_proning, anim_proning_to_crouching)

You can find more examples at our new documentation page: Character Locomotion Animations!

Precaching Assetsโ€‹

Now it is possible to precache assets to make them load in Loading Screen (avoiding FPS spikes during game), for that you can just call:

Assets.Precache(asset_path)
note

All Assets are already precached automatically once referenced, so this new method is useful when you need to precache Assets which will be used in the future or loaded dynamically.

Better Wallbangโ€‹

Our firing wallbangs were not working properly and I decided to rework it. Now wallbanging water reaches 10x further and causes more damage (before it was not possible to penetrate Water with bullets).

We've also got a new Debug settings to draw Weapon's bullet traces in the world, very useful for debugging:

Framerateโ€‹

Our Main Menu got some improvements, we FPS limit has been hardcoded increased to 120 (was 60) and during loading to 60 (was 30), it is still not great as I want to limit it to monitor refresh rate automatically.

Labelsโ€‹

Our tabs got new labels to improve the User Experience, mainly when creating a New Game. Now it is possible to know how many dependencies you have selected without needing to enter that menus:

New Gameโ€‹

Also in the New Game menu, now all configuration (including dependencies) are loaded from disk's Config.toml file. So we don't need to keep reconfiguring it every time when starting a server!

Debug Settingsโ€‹

We got 3 new debug settings:

  • Visualize Bullet Traces
  • Visualize Vehicle Doors
  • Visualize Character Capsule

Miscellaneous Improvementsโ€‹

Some other improvements and small new features we've got during this month:

  • Vehicle now receives TakeDamage event!
  • It is now possible to toggle a bunch of SceneCapture rendering features with SetShowFlags() new method.
  • Our console got several improvements on client side.
  • It is now possible to draw Materials, WebUI and SceneCapture into Canvas (experimental)!
  • I implemented in the scripting API a way to have multiple return values, so some methods will start getting that!
  • Now Databases will return an error parameter if anything failed.
  • All Character interaction (grab Prop, pickup Weapons, enter vehicles) were reworked, and now the traces are 100% precise when interacting with big objects. Also I striped the extra components needed for that, which will improve performance with too many interactable objects spawned.

Conclusionโ€‹

We had many significant advances this month! Blueprint improvements were a great achievement for me because I had to do a monstrous reverse engineering on Unreal and several memory magic to intercept events.

The addition of dimensions was a very much requested feature and greatly expands the limits for game creation!

Performance improvements are always very welcome and I love to make them, we still have a lot of room for further improvements!

Furthermore, I devoted some time to work on some big refactoring internally, some parts of the code were starting to get dumped and messy, and they are not using the most modern C++20 techniques. Sometimes these refactoring are great to take the control back over our own code. ๐Ÿ˜„

In the next updates, I plan to reorganize the API (as discussed in our last #poll), we added methods which started accumulating in Static Classes without much cohesion between them. I intend to separate them and create new static classes for each, making the understanding and search for methods in the API much easier.

Another improvement I started to implement is the possibility of multiple constructors for entities. Which will allow we to have smaller ways to spawn the entities. This will be very useful if we want to spawn a Sound 2D or 3D for example (2D sound does not need the location parameter).

This is all this month, I see you next month with many more improvements and news! Thank you so much! ๐Ÿ’–

ยท 6 min read
Gabriel T. Nardy

Open Source API, Auto-generated Documentation & More!

Another month has passed, and here is a summary with the things that happened during that!

Open Source APIโ€‹

This month we, with the help of the entire community, created the Official nanos world API, which is an organized set of all Classes, Static Classes, Utility Classes, Structs, and all their Functions and Events. We made this in order to have an official place where all the scripting of nanos world can be obtained.

VSCode Extensionโ€‹

With the API, it was possible to professionalize the extension of nanos world for VSCode, created by @Derpius. Now it uses the API to generate all the Lua stubs!

This way, all updates made in the API reflect directly on the extension for VSCode, being always updated!

Don't forget to rate it ๐Ÿ˜‰.

Smart Documentationโ€‹

Our docs pass through a complete refactor under the hood! Now all Scripting Reference pages are generated automatically using our new API! This is a big step forward as before I was writing each function separately in each page. Now I just need to update a single JSON and the docs gets structured properly!

Not only the automatization, but now we have some interactive popups, which display more information of a Class/Struct/Function when you hover it! This will help a lot newcomers understanding the basics of nanos world!

New UI (Console & Chat)โ€‹

I've updated our remaining old design UIs for the Console and the Chat! Now they belong to the same style as the menus!

New Profiling Statsโ€‹

I've added a real time profiling view to display performance information of the game and scripting. It displays the accumulated time spent on an operation and the average in the frame in the last second.

It is really useful for debugging and finding bottlenecks in both core game and in your packages! It displays individual events for each packages and the time they are taking to execute.

Trigger Whitelistโ€‹

Now Trigger can have a list passed in the constructor to only trigger for specific classes! This helps scripters to care more about performance and reduces the amount of validation needed in Lua side to check if an entity triggered is of the type we want!

-- Triggers only Characters and Vehicles
local trigger = Trigger(
Vector(), -- location
Rotator(), -- rotation
Vector(100), -- extent
TriggerType.Sphere, -- trigger_type
true, -- is_visible
Color(1, 0, 0), -- color
{ "Character", "Vehicle" } -- overlap_only_classes
)

SceneCapture Render Onlyโ€‹

SceneCapture got new methods to render only actors set manually through parameters. This allow transparent backgrounds when rendering just a specific Entity (a Character for example).

SceneCapture.AddRenderActor(actor)
SceneCapture.RemoveRenderActor(actor)
SceneCapture.ClearRenderActors()

Melee Improvementsโ€‹

The Melee class got several improvements including new methods and events to make it even more flexible. You can now set a list of Attack Animations and Impact Sounds depending on the surface it hits! Also it got a new event Attack when the attack happens. Not to mention several bug fixes and improvements have been made on Melees too!

Melee.AddAnimationCharacterUse(asset_path, play_rate, slot_Type)
Melee.SetImpactSound(surface_type, asset_path, volume, pitch)

New Tracesโ€‹

I added two new Trace methods Trace.LineSingle() and Trace.LineMulti() replacing the old Trace. Those new methods now receive a trace_mode parameter which supports several parameters being passed as bitwise flags, this new way of passing parameters is great for future updates as it doesn't add breaking changes and also reduces the amount of parameters needed in the method.

You can for example pass it like:

-- Traces complex collisions, returns the entity as the Entity table value and draws a debug line in the world.
TraceMode.TraceComplex | TraceMode.ReturnEntity | TraceMode.DrawDebug

Performance Improvementsโ€‹

I am constantly working on improving the performance, this is one of my main priorities. And now with the new profiling stats, we are being able to find the bottlenecks faster!

We've got great improvement on performance while Aiming and on Blood decals/particle spawns. Now Blood takes into consideration all levels of Effects Scalability settings to spawn more/less depending on that.

I am aware of a "problem" causing performance hit when spawning some dozens of thousands of entities (Entity Tick time) and I'm thinking on a solution to solve that. The problem comes because each entity is "ticked" every frame, so thousands of entities means thousands of more ticks per frame.

Native LoadPackageโ€‹

I did an great improvement on Package.LoadPackage() method to make a native load of Lua code. So anything you return in the loaded file will be properly receiving in the loader side! Before it was doing an ugly and weird serialization/deserialization of the returned data, and now it behaves like the native operator!

CEF Improvementsโ€‹

I am still constantly improving and adjusting the edges of integration with CEF. This last month I fixed several bugs and crashes and worked on performance improvements, there are still some points to be improved and there is one bug in my concern to be corrected.

Also, I'm always going to keep our CEF version up-to-date, it was just updated to 104.4.26 so our version did to!

New Game Settingsโ€‹

Our Settings got new options which can be changed:

  • draw network debug in the world
  • display network stats in the screen
  • auto realign camera
  • fov can be altered by gameplay

Auth Website Redesignโ€‹

@MegaThorx worked on big refactoring on our Auth website, it now supports Dark Mode and a new UI/UX for better usability!

Tons of Bug Fixesโ€‹

It worth mentioning the tons of bug fixes and improvements we got this month, it's all written in the changelogs in our Discord.

Some examples are: a bug causing a Deadlock in the server when using Triggers (the server was freezing), a bug causing crashes when using coroutines, duplicating logs, UX problems, Server Cache not working (loading taking minutes), Main Menu crashes, and much more!

Community Highlightsโ€‹

A huge shoutout for the French ๐Ÿ‡ซ๐Ÿ‡ท community hich has grown a lot on the server! And especially to Mouloud that is creating amazing packages for nanos world!

Conclusionโ€‹

A lot of things being improved and bugs being fixed, the creation of API and Docs's self-generation are life changing (especially for me as it's now much easier to update docs with new things) and also for all scripters that can rely on the VSCode extension which is 100% backed on the official API.

Once again I reinforce the importance of posting and voting for ideas in our Feedback Hub. E.g. it's clear that the greatest need for everyone at the moment are the Dimensions ๐Ÿ˜œ.

And also don't be reluctant to post bugs in our Issue tracker. The chances of your bug being fixed increases by 10000% if you post it there.

That's it for this month, once again thank you all for the support!!!

ยท 7 min read
Gabriel T. Nardy

CEF, Settings Menu & several Improvements!

After a long time and after innumerous requests (and death threats), I finally announce the big surprise of the integration with the Framework CEF (Chromium embedded framework)!

Chromium Embedded Frameworkโ€‹

For those who are not familiar, CEF is a framework for embedding chromium-based browsers in other applications. Roughly our WebUI.

Until then we have been using our dear Ultralight, which at first was very promising, but as it is a proprietary library and unfortunately the dev ended up devoting less time to the project, we started to get harmed by missing features or unsolved bugs.

And since we can't be dependent on that, I made the decision to try to integrate the much consolidated framework CEF. But it was not an easy implementation at all. CEF uses various sub-processes to work, which I figured out I would have to implement on my own. I got several chills while remembering my Operating Systems classes from College. ๐Ÿ˜œ

In the end, I managed to create a totally proper integration, including a build automation to always get the latest CEF safety updates on D+1!

Processesโ€‹

But since not everything is flowers, there are advantages and disadvantages in using CEF. Due to its multi-process characteristics, on the one hand we have everything running in parallel (+++performance), on the other we have the drawback that rendering will always be 1 or 2 frames late, which may cause an "input lag" effect, but in practice it is not a big problem and is almost imperceptible.

CEF uses sub-processes, which means that each WebUI will run totally independent of the game and other WebUIs, making usage of 100% of computational power with great efficiency!

And that means now all communication is asynchronous. Thus, all the events between Lua <-> WebUI are also asynchronous and this is a paradigm that has changed, which should not be a problem in most cases. But this is an "effect" from having parallelism.

Another thing that changed is that we will have several sub-process starting and closing (like Chrome ๐Ÿ˜) while playing nanos world. It depends on the amount of spawned WebUIs and is automatically managed by CEF.

Soundsโ€‹

Another thing we gained was the Sounds! I have added a new method to the WebUI class: WebUI:SpawnSound() that spawns a Sound object (100% customizable as usual). In other words, you can spawn as many 3D sound entities and even set up a 7:1 cinema with them! ๐Ÿ˜†

Performanceโ€‹

As said, we gained a lot of performance. Surely I will continue to improve the implementation and boost it even more over time, but we can already see great improvements! Watch this video of me spawning dozens of WebUIs at the same time and rendering them on 3D objects in the world without a single stutter:

How many videos can it handle at the same time? YES.

Debug Toolsโ€‹

It is now possible to inspect your WebUI directly by third party tools, such as Chrome Developer Tools for example! ๐Ÿฅณ

Migrationโ€‹

Also, another good news: this migration will have 0% breaking changes! No script will need to be updated to keep working with CEF! ๐Ÿ’ƒ

Obviously some things have changed, especially in relation to CSS. In WebKit browsers (as it was before) some styles behaved differently from Chromium ones. Some layouts can appear ill-adjusted (e.g. different scroll bars) now.

Settings Menuโ€‹

Finally our Settings Menu received the UI Update too! I recreated it from scratch adapting to the new interface style!

Video Settings:โ€‹

KeyBinding Settings:โ€‹

We got a new setting tab for House Keeping, where it will be possible to clean up cache files, logs and other files from your installation:

We also had the addition of a new setting: Force no Custom Loading Screen which disables server's custom Loading Screens.

Stats & Achievementsโ€‹

This month I devoted a time to adjust our stats and achievements. And the new Profile Stats tab have been implemented:

I created some new Stats such as swimming or driving, and also I created the concept of "Achievements Ranks", adding levels bronze, silver and gold to them. Let's see how this model stands out. ๐Ÿ˜‰

A great improvement in the notifications of achievements has been made: now they are shown immediately when reached! (Before they were only synchronized once per minute, delaying the notifications).

New Achievements Ideasโ€‹

I created a new page on Canny to receive suggestions of new Steam Achievements! Please take a look, vote and add new ones! I will always be integrating new ones into the game!

https://feedback.nanos.world/achievements

Vault Changelogโ€‹

In Vault side, I implemented the Updates Tab for the items, where you can see all changes in their updates!

Caching and Loadingโ€‹

A great improvement I made was the refactoring of the caching system. We already had a cache system that cached the loaded assets in the client side, so then the file validation was instantaneous when re-connecting to a server.

I refactored this system, and now all cache files are in an external folder (inside Packages/ and Assets/ called .cache/), which even facilitates their cleaning.

In addition, when opening a server, every time the assets were loaded and cached in memory, which was really slow. And with this new system, they are still loaded but much faster, the system intelligently identifies changes and only re-caches the files that get dirty since the last load.

This will greatly improve the opening speed of the servers.

Docs Improvementsโ€‹

I took some time to update some pages here in the docs.

  • Quick Start is now even more quick and easy!
  • Server Installation was reworked and split and now is straight to the point.
  • Assets & Modding category got a rewrite so the guides are more linear and have less ambiguity.
  • Static Mesh was completely rewritten and now have lots of new information and tips!

I will continue to improve the docs aiming to reduce redundancy and to make it even more simple for modders and scripters to hop in! I see the docs was starting to get a little big confusing due some duplicities and some tutorials in weird places, that will be improved too!

Notable Changesโ€‹

Some smaller but notable changes.

WebUI 3D Interactionโ€‹

This is not totally related to CEF but I took the moment to integrate methods which allow injecting events into WebUI and create a Remote Control for it: ๐Ÿ˜œ

It uses traces to retrieve the UV location from the hit on the TV mesh, then redirects it as WebUI events.

Packages Mapsโ€‹

I added a new setting to Packages: compatible_maps to make pair with the map settings: compatible_game_modes. Both settings are united to display compatible maps in the New Game popup when starting a new server.

Discord FAQ Channelโ€‹

Our Discord got a new FAQ channel, which contains the most common question about the nanos world. More will be added as the time goes!

Unreal 5.0.3โ€‹

I've updated the game Unreal Engine version to the last patch 5.0.3 containing lots of engine bug fixes. This update had no breaking change.

Conclusionโ€‹

This was a month of great advances, several bug fixes and structural improvements in nanos world. We further evolved our IU and solved the WebUI problem that had been haunting us for a long time.

I emphasize the importance of creating and supporting ideas at https://feedback.nanos.world/. It is very important to have them officialized that to know your most request demands! Here's July Feedback summary:

Thank you a lot! You are the best!

ยท 10 min read
Gabriel T. Nardy

Birthday, Rebrand & UI Redesign!

nanos world Birthday ๐Ÿฅณโ€‹

First of all, we would like to announce that this last week was the birthday of 3 years of nanos world under heavy development! Of course the idea of creating it is older than that.

It has been already a long time since we started working on it, and it has been a time of much learning for me and a lot of progress for nanos world!

I would like (again) to thank you all for the great support over all this time! I really love working on nanos world and love seeing you playing, using and creating on it! Making nanos world has become one of the great passions of my life ๐Ÿ˜!

Rebrandโ€‹

nanos world always has been about multiple worlds, more specifically YOUR worlds which you can express yourself and create the universe you always wanted to.

With the progress of the game development, it has become necessary to evolve in some aspects. When it comes to marketing, the main objective is to deliver nanos world to the right potential players and for this to be possible we had to rethink some things, and one of the things was to recreate our visual identity!

Our old identity lacked in some aspects regarding discoverability and professionalism, so we decided that it was time to make a new version of it! We know that it is possible that this is not yet the definitive version and it will be improved over time, however it's already a big step towards our short-medium term goals!

For the logos we aimed to have something more minimalistic yet professional.

Since nanos world represents a wide range of game-modes and diverse worlds, we decided to create a new version of our current logo, with:

  • ๐Ÿ˜ฎ A flat outlined style.
  • ๐Ÿคฏ New title and the subtitle design & fonts.
  • ๐Ÿ˜ถโ€๐ŸŒซ๏ธ The ring became an infinity symbol bringing the sense of unlimited.

New Cover Artโ€‹

To express the idea of diversity, we are creating a new cover art to be used as Capsule Arts on Steam and of course to contribute to the visual identity!

So we idealized the creation of a living planet with many things happening representing the variety of game-modes in nanos world, as a Sandbox game should be.

This will be a huge image (8-16K), which each time you zoom in you will find something new (the full size image will be available in-game and on the websiteโ„ข ๐Ÿ˜‰)!

note

The Cover Arts are not final and are still in development by the artistโ„ข, some adjusts will still be made for the final version!

Some WIP Capsule Art sketches:

tip

Credits to Pablo (PG Ninja) for creating the Art.

Motivationโ€‹

A very important factor, even within Steam, is how your game promotes itself. And this happens due to two main factors: Capsule Arts & Steam Tags.

The Steam Tags determine whether or not your game will be displayed to the ones browsing Steam store. And the Capsule quality determines whether they will click on your game, Capsule Arts are the first thing seen by the shoppers, they appear in store browser list or when opening the game page.

Our current Capsule is this tedious screenshot with a simple text overlay ๐Ÿ˜…:

This is even extremely contraindicated because it shows amateurism and makes those who browse Steam unconsciously ignore it, in addition to the fact that the image does not convey the genre of the game, making those interested in sandbox games do not click on the page.

Then for this first version of our Cover Art we wanted to make it a little bit more professional and that at least minimally communicates the "Sandbox" genre.

Inspirationsโ€‹

Our idea was to create an image of a living planet with various things happening, representing the variety of a sandbox game, so we got some inspiration from game arts and images that represent this idea, like the game Universim and some found stock images:

Sketchesโ€‹

Our creative process went through some sketches made in Paint, until reaching the current on-going version: ๐Ÿ˜œ

In addition to the rebrand, we worked hard on redesigning the main menus of nanos world!

First of all, we would like to thank everyone who gave ideas and suggestions for the new design, especially Falaxir who created several threads of ideas related to it, which served as extreme inspiration for us to develop this new version!

Motivationโ€‹

The main menu is the gateway for all players and the first impression when playing, it needs to be intuitive and to encourage the right actions to be chosen.

We take into account the following pillars:

  • ๐ŸŽฎ Players First: It must take into consideration the common player as first, those who will choose a game-mode or just connect to a server to play and have fun.
  • ๐Ÿฃ Noob Friendly: It should be extremely easy and intuitive to start a new game or adding custom addons to it. Even those who don't know anything about servers should be able to easily start a game to play with friends.
  • ๐Ÿค Less is More: The User Experience must be the best possible. Buttons and Navigation must be intuitive without need of explicit tutorials or texts.
  • ๐Ÿƒ Fluidity: New pages must open immediately, no stutters should happen, filters should apply changes instantly, no desync between pages and data should happen.
  • ๐Ÿฅฐ Cozy Place: It must be welcoming, players must want to spend time inside the game, they must want to open the game to see what's going on.
  • ๐Ÿคฉ Motivates Modders & Scripters: It must encourage content creators to create and upload to the vault.
  • ๐Ÿ“ฐ News should be exciting: Updates of vault items and even the game should be pleasant and exciting to read and to update.
  • ๐Ÿ” Facilitated Discovery: New game-modes and content should be found easily, as well as the best ones should be praised.
  • ๐Ÿ†• Expand the Possibilities: The new menu should allow new horizons, it should be easy to integrate notification systems, lobby, favorites, etc.

Home Screenโ€‹

In the old Home we had friends, achievements and news divided into separate tabs:

Before long we present the new Home page: a HUB where you can view a summary of your friends, your achievements, favorite servers, vault news and game updates!

note

Some buttons and features are not yet enabled and will be available soonโ„ข. This initial version was aimed to contain all old features and some more ๐Ÿ˜‰.

Vaultโ€‹

Our Vault was basically just for downloading/managing additional content, where it was possible to browse the store/remote and your local content and see a brief information about them:

Now it has been redesigned for a completely new User Experience, providing filters and a new layout:

The new vault navigation, in addition to continuing to provide quick install/update/uninstall buttons, now also provides a quick Update All button, which updates all outdated items installed at once. Not to mention the improved performance and the interconnection with other pages and systems!

tip

This new version has several optimization improvements, such as disk images caching or virtualized list visualization ๐Ÿ˜!

Vault Detailsโ€‹

We've completely rethought the Vault concept and created a new details screen, which will open when a Vault (or New Game) item is opened:

The purpose of this screen is to bring all possible information about the Package or Asset Pack: description, screenshots, updates, version, size, reviews, dependencies, and now the possibility of rating and soonโ„ข configuring them through the interface.

You can manage your review, the installation and updates on the right side!

And when selecting a game-mode, a Host New Game button will appear in the lower right corner, this will be explained better below on this blog.

New Game Screenโ€‹

On the old New Game page, game-modes were separated into two different lists: installed and local, where it was possible to select one of the game-modes (or the "none" one) to start a server.

In the new design, the flow of New Game -> Selecting game-mode -> Play remains. But now we've got a new interface and filters, also it is now possible to order by popular, recently updated or top rating game-modes, and it is possible to filter them by name or by the filter toggles.

Also, now this flow allows you to start a new game even without having the package installed, removing the need to browse and install from Vault before!

When selecting a game-mode, the same detail page will appear (just like Vault). And by pressing Host New Game, a Server Setup popup will appear:

We created the concept of "single-player" game, which actually under-the-hood is the same server but configured to allow only one person and not announced at Server List.

We also improved the selection of additional Packages/Assets Packs, making the choice more functional and intuitive, you are now able to select multiple at a time before closing the selection popup.

The main idea of this new flow is to allow a new game to be created quickly, with less information required right away.

note

Soonโ„ข we have plans to integrate a new concept of "game-mode" config, which each game-mode can setup it's own configuration before starting!

Find Serversโ€‹

Find Servers's old interface was quite simple:

The new version got some improvements aesthetically and now we got custom filters and improvement of the buttons display (they only appear when hovered):

And now it is possible to favorite โญ a server!

Loading Screenโ€‹

The loading screen was not left out! We reformulated it so you can have a real notion of the loading progress. Now besides the background color lightening as loading is near the end, there are 4 bars in the lower left corner showing every step needed for the loading to finish!

note

It is planned to have a further improvement on the loading screen, as now when starting a New Game we still don't have "much" information on the server startup progress.

Profile & Friendsโ€‹

We also got dedicated screens for your profile and to see your friends. In this screen you will be able to see information from someone or to follow him into a server.

By clicking on your own profile, you willโ„ข have access to additional tabs like Achievements, Stats and soon Account Config as well!

Conclusionโ€‹

And this was just the beginning! You know that our evolution always has been very organic, adopting and adapting suggestions and new ideas to make nanos world the best modern sandbox experience ever! And that's what matters most for us!

If you have ideas or suggestions for improvement for both Logos and UI, feel free to make them in our Discord, we will be all ears for you!

Also, if you have content uploaded to the nanos world Store, please update it's description, screenshots and also your Team (now it supports image ๐Ÿ˜‰) so it get prettier in-game!

We will push this blog updates to the game and all official pages as soon as possible in the next days, stay tuned!

Thank you for the support and dedication for this month! ๐Ÿฅฐ

ยท 7 min read
Gabriel T. Nardy

Bugs obliteration, P2P Servers, Better Sync & more!

Bugs shall not pass!โ€‹

In this month, we proudly achieved the incredible mark of 666 issues closed (fixed and/or resolved) in our Issue Tracker!

You may say it doesn't count because some of them were just duplicated, invalid or even were closed to move to the Feedback Hub, that's okay. But we are not even mentioning our internal issue tracker which we already had another 500+ issues closed: ๐Ÿ˜

Only in May we got 60 reported bugs fixed:

This is a special indicator that demonstrates that all your suggestions and ideas are read and given due attention and ALL bugs are fixed! Thank you all for contributing to that, in special @Voltaism and @Ayanokoji which really do the tap monkey job and find the most unnoticeable bugs! ๐Ÿ˜‚

tip

You can find the endless list of all the bug fixes in our Discord Changelog Channel:

New Feedback Pageโ€‹

Recently, we've launched a new feedback page to collect ideas & suggestions. Before we were doing it on the GitHub's Issue Tracker, but now we have a dedicated platform only for ideas and now the GitHub is not only for bugs.

This new platform is powered by Canny, where you can add a new suggestion and vote for others. Feel free to sign in and upvote the best ideas! It is extremely useful for us to know if a feature is something really required so we can give the right priority to that!

It also provides a roadmap tab which groups all accepted/planned and in-progress ideas! The old Trello board is not going to be used anymore.

Check it out! ๐Ÿ‘‰ https://feedback.nanos.world/

P2P Serversโ€‹

Something that is fundamentally important is the ability to start a game from menu to play with friends, without worrying about dedicated servers or forwarding router ports stuff.

And now this is possible thanks to the new P2P servers option! This allows you to open a server in P2P mode, which relays all traffic through the Steam Relay Servers and establish a connection between the server and client with the security of none of those knowing each other IPs and so on! ๐Ÿคฏ

For this to happen, we had to re-implement our file transfer system (when connecting to a server) which used an HTTP connection for this purpose, and now it can use the built-in connection system to to transfer them! (HTTP transfer is still faster than using the internal sockets, although on P2P connection this is the only possible approach).

note

Transferring files through HTTP is still faster than P2P. We're working to improve this performance as well!

When a server is opened as P2P all transferring are redirected to use the built-in transfer system. In the other hand, opening a server as Dedicated Server will use as it is today: small files through the built-in transfer system and big files through HTTP.

Finally, we are introducing two new "types" of servers: Dedicated Server and P2P, this is just a configuration you can set in the Config.toml or as a parameter --dedicated_server 0/1 to enable it or not. Starting a server through the menu will start it as P2P by default unless explicitly set in the advanced tab.

When starting a P2P server, the Steam Relay Server will generate a new temporary random "fake" IP address which will be used by others to connect to your server. Without the need to forward router ports!

As the connection is established through the Steam Relay Servers, even connecting to localhost all traffic will pass through the closest Steam Server of your computer, meaning even on localhost your ping will not be zero. If you want to test or play alone, we recommend start it as dedicated server.

New Sync Interpolationโ€‹

Since UE 5.0, some interpolation started to get weird/flickering when syncing location/rotation with the clients. To fix and improve that, we managed to integrate all our network to the Unreal's build in Physics Replication system!

This system works by being fed by network snapshot packets and handling all interpolation, extrapolation, desyncs and high pings automatically! ๐Ÿ˜Ž It greatly increased the quality of the physics sync!

Currently, all physics entities (Props, Weapons, Melee, Grenade and Vehicles) are simulated using this new system. Other entities (or non simulating physics) are still using the standard method of interpolation which is totally fine and suitable for that.

We are still looking to include Characters in the new system. As they use a separate movement system, it requires a different approach and special attention. ๐Ÿ˜‰

New In-game Consoleโ€‹

We've extended our in-game console to provide a new raw visualization. As Unreal Widgets don't provide a better approach to have both colored texts and the ability to select them, we've decided to add a new tab which converts the console into raw text, which you can freely copy them to the clipboard:

Also we added a button to open the log file directly! ๐Ÿ˜‰

Noteworthy Changesโ€‹

Network Debug Statsโ€‹

In addition to the Network Debug drawings in the world, we've included a new screen debug tool which shows network stats information in the screen, it will be displayed if you enable Draw Network Debug in the settings -> debug.

Outlineโ€‹

Now you can also enable an Outline effect in actors by :SetOutlineEnabled() on it! It works like :SetHighlightEnabled, and you can customize it's color and thickness as well!

We've already replaced the Sandbox Physics Gun effect with this too!

Animation Settingsโ€‹

We started implementing a new interface for setting animations parameters on entities, it now supports a new parameter play_rate which you can define directly in the :SetAnimation...() of entities.

note

Currently this new interface is only available to Weapons. Soon it will come to all entities!

Sounds Settingsโ€‹

The same as Animation Settings, but for sounds as well! Now you can define per-entity-per-asset common sound settings on it, it supports volume and pitch parameters:

note

Currently this new interface is only available to Weapons. Soon it will come to all entities!

Internal Control Rigsโ€‹

With our efforts to modularize and remove some internal dependencies (mainly related to animations and animation blueprint), we started creating some Control Rigs to replace our old approaches of procedural animations (before they were hardcoded in the Animation Blueprint, and now they are split into several Control Rigs), which also provides better performance and modularization!

We already created and are using Control Rigs for Driving and Aiming, which provides procedural animations for aiming with weapons and for driving wheels.

Sandbox Improvementsโ€‹

The sandbox game-mode got some improvements as well, such as new icons for the tools:

As well improved PhysicsGun & Resizer linear scaling to have a better handling, a reworked system to attaching entities with the tools (before we were having wrong attach locations due the ping, now the client-side relative location is taken into account), and of course we've got several bugs fixes!

Also we got a PR from Voltaism which added the option to respawn and freeze the time through the Context Menu.

New Docs Tutorialsโ€‹

Custom Weapon Reload Animationsโ€‹

We've created a new tutorial page for adding Custom Weapon Reload Animations. This was possible due our efforts to modularizing more and more the game. Reload animations are special because they trigger gameplay actions during it's execution, which needs to be configured inside the Animation Montage!

Conclusionโ€‹

With the achievement of implementing P2P servers, we managed to make immensely easier the ability to play and test with friends! Now everyone can start a server and play with friends immediately, without the need of port forwarding and so on! ๐Ÿฅณ

Also, with the introduction of the new Roadmap & Suggestions, we are moving even more towards in the feedback-driven approach, so please put all your ideas in there, and vote for the ones you like! We really consider that to take the next steps!

Ah, it's worth mention we got a hit tweet ๐Ÿ˜! If you don't follow us yet, please do that now!

Foo

Thank you for more this month, you're loved! ๐Ÿ’

ยท 9 min read
Gabriel T. Nardy

Unreal Engine 5 is now the official engine of nanos world!

Unreal Engine 5โ€‹

We are thrilled to announce that Unreal Engine 5 is now the default engine of nanos world!!!โ€‹

It was an intense month of updates, improvements and bug fixes for reaching a reasonable stable version of nanos world. We are very thankful to the testers who helped to test the stability, the migration of assets and finding bugs on it!

It's worth mention that even that UE5 "stable" was released officially by epic, there are still some bugs and improvements that need to be done, in the end of this blog we will list all known bugs we already found on UE5 and are waiting for an official fix.

With this release we are aiming to have the same experience and stability as before on nanos world. We are going to introduce more and more Unreal Engine 5 features in the upcoming updates from now on, granting they will have the proper stability and integration.

Amazing new UE5 Featuresโ€‹

Here's some noteworthy new Unreal Engine 5 features which will be very useful for nanos world Asset creators!

New UIโ€‹

Unreal Engine 5 brings a suite of improvements to the look, feel, and efficiency of the user interface, creating a modern, improved workflow for all users.

It's a way better and pleasant workflow for modders and asset creators!

Geometry Toolsโ€‹

Creating meshes and maps got even easier with the built-in modeling and mesh editing tools inside UE5!

Quixel Bridgeโ€‹

The Quixel Bridge plugin for Unreal Engine gives you full-featured access to the Megascans library within the Unreal Editor. You can browse Collections, search for specific assets, and easily add assets to your Unreal Engine projects.

It comes built-in with UE5! Just drag'n drop and you have the asset!

tip

We are actively looking for a way to improve the Quixel Bridge pipeline into nanos world.

Chaos Destructionโ€‹

The Chaos Destruction system is a collection of tools that can be used to achieve cinematic-quality levels of destruction in real time.

We've managed to already integrate an initial version of it with nanos world, you can spawn any Geometry Collection as a StaticMesh, check it out!

tip

We are actively working on improving even more the integration with Chaos Destruction entities!

Lumenโ€‹

Lumen is Unreal Engine 5's new fully dynamic global illumination and reflections system.

It provides a software-calculated Ray Tracing methods! This is a new very efficient technique for achieving Global Illumination, but it still has a cost. In our tests Lumen in Epic quality hit 50% of the FPS, and 25% on Medium. You can enable/disable it in the Game Settings.

Lumen also provides a Hardware Ray Tracing method for compatible GPUs, this is also now a setting in the Game Settings ;)

DirectX 12โ€‹

Now nanos world comes with DX12 as the default RHI. Some new features such as Nanite, Lumen, and Virtual Shadow Maps run more efficiently in DX12 than in DX11.

You can switch from DX11 <-> DX12 in the Game Settings. *DX12 is required to use Hardware Ray Tracing.

Much Moreโ€‹

You can see a list of all the new features in the Official UE5 Roadmap and also in the Official UE5 Release Notes.

It's worth mentioning other amazing features like MetaHumans, Nanite and Runtime Retargeting. Those (and many others) are still going to be tested to be actively supported on nanos world!

Reworked Water Physicsโ€‹

Also this month we managed to tweak a little bit our Water Physics settings. We use Unreal's Water System integrated into nanos world, and it uses a Pontoon system to make buoyancy on the objects. Props, Pickables and Vehicles have the pontoons spawned automatically in game, and since then the algorithm to calculate the size and it's force was quite primitive.

After several hours testing and doing several extremely hard math calculations we've managed to implement a new procedural algorithm which dynamically spawns pontoons through the object depending on it's size and mass. This makes rectangular objects to react properly for example (before we had only one sphere pontoon which made objects to keep rotating weirdly in water).

This new algorithm fixes the problem of having some Props being ejected and kicking infinitely over the water, and also normalizes their floating capabilities. Right now they all floats equally, we still intend to improve it by allowing custom pontoons to be set through scripting and also through the engine, and also to use Physical Materials to change the buoyancy force depending on it.

New Default Mapsโ€‹

We are shipping two new default maps to nanos world: OceanMap and BlankMap. The first contains a small island and a vast ocean (good for testing Water stuff), and the second is literally Empty and all black, good for dynamic scripting created maps!

We've also tweaked the size of BlankMap and it's surface texture to have a modern and UE5 look.

nanos world Migrationโ€‹

As we stated in the last blog we are moving to a new Store Page, the new nanos world version on UE5 will already be on this new game entry, and the old entry will be completely deactivated.

Gameโ€‹

All the current testers will receive a new Steam Key to activate nanos world in your Steam accounts. Here's how to get the new nanos world game key:

  1. WISHLIST the new game entry first ๐Ÿ˜
  1. optional: Launch the old game at least once to store your achievements to automatically import them when launching the new game (this is a built-in tool to automatically export and import your stats).
  2. optional: Make a backup of your Server/ folder (if you are developing Packages/Assets).
  3. optional: Uninstall the old game, although it is not obligatory, it's recommended because some problems may happen if you don't, as both games use the same folder name.
  4. You will receive the new Steam Key at the Auth Website. If you didn't, please reach us.
caution

All old game keys will be revoked. You will receive an warning on Steam saying that the "Beta Test has ended".

Assetsโ€‹

The pipeline of exporting assets from Unreal Engine didn't change, all old tutorials are still valid but some are still using the old UE4 interface, we are constantly updating the docs to update the images and add more information to this workflow.

We've already updated the Importing Custom Assets and also the Assets Development Kit pages. There is a new workflow which has been updated to export assets, so now you don't need to package the project, just need to cook the assets - but the old way is still valid tho, the new is just easier.

The Assets Development Kit GitHub Project was updated as well, the only things that changed were the following files:

  • Config/DefaultEngine.ini
  • NanosWorldADK.uproject

You can pull into your current ADK downloaded project or just replace your project with the new files. If you get problems, try deleting the following folders in your project, so you have a clean project (without the old compiled stuff):

  • Binaries/
  • Saved/
  • Intermediate/
note

All Assets will need to be recooked in Unreal Engine 5 to work with the new nanos world version. This is needed as from time to time the shader code or the serialized binaries are changed when the Engine changes, so we need to get in the same version otherwise the game may crash expecting to load a newer version but the file is old.

We already managed to update the official asset packs.

New Testersโ€‹

We are very sorry for making the recently players which registered to become a tester to wait that long, since we are moving to the new game entry, we didn't want to give you the old keys anymore, but now we are backing to our testing invitations!

tip

We are still aiming to invite only Modders and Scripters, if you are just a player, keep the eye on the future open Playtest sessions!

Known Bugsโ€‹

Some bugs are known and are listed below, most of them we don't have much to do and are much likely an internal UE5 bug, I am reporting them all to Epic, let's pray they accept the report and fix it.

  • Cables rendering not working sometimes (Epic accepted my report).
  • Balloons/Cables square constraint (Epic accepted my report and already fixed it for 5.1).
  • Hit events/sounds not always triggering (report not accepted yet).
  • SceneCapture not bounces anymore (report not accepted yet).
  • Chaos Physics sometimes freeze an object if he stands still for some small time, I did some workaround to fix it in certain cases on nanos world (when grabbing or dropping props).

Conclusionโ€‹

This release of nanos world on UE5 represents our efforts to always bring the bleeding edge technology to the game. It is our main pillar to develop a platform with quality, efficiency and modularity. And by doing it right, these updates and new features become easy to integrate or make ๐Ÿ˜.

We want to be the reference in sandbox games for the Unreal Engine (5), and we are moving in that direction!

We really appreciate everyone who has supported us so far! Every like, react, emoji or comment makes us much happier! Thank you!