Ir para o conteúdo principal

· Leitura de 7 minutos
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.

Módulos

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!

· Leitura de 8 minutos
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
Package.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

Tela de carregamento

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! 💖

· Leitura de 6 minutos
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 Client.TraceLineSingle() and Client.TraceLineMulti() 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!!!

· Leitura de 7 minutos
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!

· Leitura de 10 minutos
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!

Tela de carregamento

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! 🥰

· Leitura de 7 minutos
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! 💝

· Leitura de 9 minutos
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".

Mídias

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!

· Leitura de 9 minutos
Gabriel T. Nardy

New Steam Store Page, Performance Optimization, Databases & Blueprint Integration!

Steam Store Page

Recently we got a hitch in our Store Page which required us from getting a brand new one. And now we finally are re-releasing it! It got new screenshots, videos and a better description!

Please WISHLIST NOW!!!

A downside of this whole situation is that the old store and the old game entry will be deactivated. Soonish everyone will receive a new Steam Key to activate the new nanos world in your library!

Also we embedded a tool to export (then import) your Achievements and Stats from the old game to the new one. You just need to launch the old game once before launching the new one and everything is imported automatically!

Performance Optimization

Everyone knows that one of the great aspects of nanos world is the performance and the optimization. And in the last month we had a significant advance in improving some internal critical points of our framework.

Memory

The first one to mention was a huge improvement in the memory usage of our spawned entities.

Internally, we use a special system to handle sending and syncing data through the network. Our approach is to have a similar system to Unreal's Replication system. But until then this system was responsible for most of part of the memory usage in each spawned Entity.

With that in mind we aimed to solve this problem, not to mention most of these memory usage was duplicated in all entities unnecessarily. And fortunately we succeeded on reducing up to 90% of the memory usage of the entities. Right now it occupies exactly the data which is strictly needed for it's existence!

We did a small test to compare, spawning 10.000 Characters through Scripting, check the memory usage difference:

Before:

After:

Comparison of some Entities Memory Usage Before x After:

EntityMemory Usage BeforeMemory Usage AfterReduction
Cable5.4 KB1.1 KB80%
Character13.1 KB1.8 KB86%
Light4.8 KB1.0 KB79%
Melee7.1 KB1.5 KB79%
Particle4.6 KB1.0 KB78%
Player3.1 KB0.3 KB90%
Prop4.8 KB1.0 KB79%
StaticMesh4.5 KB1.0 KB78%
TextRender5.3 KB1.1 KB79%
Trigger4.0 KB0.8 KB80%
Vehicle7.9 KB2.0 KB75%
Weapon11.1 KB2.0 KB82%
note

This usage was calculated on Server side. On Client side the values would be a little bit bigger, not to mention to the Assets which are loaded together.

This was achieved just by improving one single system, we didn't even start looking for active compression techniques or reducing some variables sizes which are unnecessarily bigger than it needs. 🙏

Network

Another great optimization was in our network packets, each data sent through the network has a common "header" to identify some operations. This is a constant "cost" for the network which we managed to reduce up to 75% of it's size, making all data being sent through the network statically lower!

Client Side

We started advancing into optimizing the game in the client side. Which normally is trickier than on Server side because it concerns to dealing to Unreal Engine subsystems. But we managed to add some optimizations based on the Quality Settings selected. For example on the Blood or Bullet Holes particles, now depending on the distance and on the Effects Quality selected, they will be less or not spawned at all.

We've also tweaked the Vehicle System to do similar optimizations using this system. There is still a lot which we can improve! 😀

New Class: Blueprint

A very required class is being introduced: Blueprint! Now it is possible to spawn any Blueprint Actor in nanos world!

We've managed to implement the method: CallBlueprintEvent() which you can create any Event or Function with any number of parameters in your Blueprint and call it from Scripting! This expands many possibilities!

Also, you can spawn it on server and it will follow the same rules as any other Actor Entity, and it will be synchronized with other players using the Network Authority system as well!

New Class: Database

Something that is extremely fundamental for some game-modes such as roleplay is the Database. Until then we were providing a MySQL Module to be used as a third-party Lua library, but due it's complexity to integrate with your server and also because it wasn't possible to make async queries we dug into a more robust solution.

For that, we present the new class: Database. A all-in-one solution for connecting to a database, it supports MySQL, PostgreSQL and SQLite out of the box! Not to mention the async and thread-safe queries!

Check it's page for complete documentation and examples!

Vehicles Tire Skid Mark

A small but cool addition we did for vehicles was adding Tire marks when it skids:

Also, an awesome detail was added: the wheels get smeared with blood!

It is 100% dynamic and procedural!

Sandbox Improvements

We got several improvements regarding the sandbox game-mode! The first one is the sandbox "API": we listed all functions and events it exports so you can integrate your own entities/tools or use it's features.

Also we've modularized the menu, categories and tabs, and you can add your own from your external package!

Check it out the sandbox API in the GitHub page: https://github.com/nanos-world/nanos-world-sandbox.

Finally, we've improved our Physics Gun tool, now you can control it using the mouse and also have a 'snap-to-grid' movement!

Several other adjustments and bug fixes were made on Sandbox as well.

New Particle Methods

We've expanded the possibilities for Particles! Now it's possible to set Material parameters on it, and also use any Texture, WebUI and Canvas as parameters as well!

For example you can spawn a Canvas, draw on it and use as a Material Particle parameter!

The following video shows using the WebUI https://nanos.world as a Material parameter into the Particle! Rendering in runtime!

Notable Improvements

Music Concurrency

We finally managed to fix the Music problem, which was making Sounds of type Music from stopping when too many sounds were spawned.

Client-side Props

Props can now be spawned on Client side as well! This allows having "unnetworked" dynamic meshes spawned on client, intended for use as visual effects and non-gameplay features.

We've already updated the Sandbox's Destructable entities to use client-side debris!

Level Static Meshes

Now all StaticMeshActors from a Map are automatically loaded as StaticMesh entity on Client Side! It is possible to paint, destroy, move and everything else on them on client-side!

Async Texture Loading

We've improved our Client loading system and now textures (e.g. .jpg) are asynchronously loaded and the texture is applied in a deferred way. This system currently is implemented under SetMaterialTextureParameter() for testing, soon we can use it in other methods as well.

Async File Loading

In addition to the above, we've expanded our Async implementation into File class, which now have the :ReadAsync() method!

New Light Methods

We've added a bunch of missing Light setters and getters methods, also the ability to toggle it on/off with SetVisibility().

Assets.toml Changes

The Asset.toml got a new category: unreal, where we must specify a new setting unreal_version (the unreal version this Asset Pack was compiled on), this will be an important feature to prevent old Assets versions from crashing the game.

Also it got the new blueprints category for listing Blueprints 😉.

Vehicle Collisions

We've tweaked and improved our Collision configurations and now Vehicles interact better when colliding with other objects, including Networked Characters, Props and other Vehicles.

Before other Networked Characters were desyncing when colliding with vehicles (they started to fly and weird things happened when objects hit the Vehicles wheels), and also the hit between two vehicles were extremely rigid, which has been fixed too and will be more organic now.

Sun Improvements

The Default Sun light and shadows has been improved, specially during sunrise/sunset which we had some artifacts and shadows disappearing, now it must be smoother and prettier (and hopefully more efficient).

Conclusion

Thank you for another month of support! There were incredible advances with Blueprint and Database Classes, and also to finally lining up our Steam Page again!

Our north is to continue advancing performance and memory optimizations, as well as bringing essential new features to nanos world!

We also have some important challenges of bringing distance based culling and dimensions system for entities, which is essential for creating special environments.

There are some essential Classes that we want to implement as well, like custom Characters (e.g. for Animals) and other types of Vehicles (Air, Sea).

Finally, we are very excited with the release of Unreal Engine 5 (yesterday 05 April), as with it comes with several solutions to important questions in nanos world (such as Runtime Retargetting which promises solving several animations compatibility issues) and tons of new features to be used! We gonna have good news soon™ for you!

See you next month! 🥳

· Leitura de 9 minutos
Gabriel T. Nardy

Unreal Engine 5 Preview, new Network Authority System, Store API and more

Network Authority System

As everyone knows, nanos world relies on a "server-less" solution for physics and other world operations. All the sync relies of sharing data between the players and replicating in each client. This approach brings several advantages and of course some drawbacks, in the advantages we can include a very lightweight server, where we have all the control over it, without needing to rely on Unreal's server executable or the way it handles the network.

In the other hand we got some challenges on how to distribute physics information and other stuff. Then in the beginning we created our first Network Authority system in which each player is responsible for sharing a specific set of entities from the server to others, similar to Roblox Solution.

However, just like in Roblox, some problems become more noticeable when we have many players connected with many different pings. As some players will receive the "network authority" over entities faster than others, they will start sharing their location/rotation to other players while the 'old' network authority is still the authority over that because he didn't receive the "lost network authority" message yet.

We created this diagram to exemplify the problem:

As you could notice, there is a "gap" and a "overlap" when switching network authority if we have discrepancies between players ping, causing several weird behaviors on physics objects.

Considering this and after much study, we improved our Network Authority system to make it more robust, this new way aims to fill up the gaps and ignore overlaps:

While still in a "beta" version, with this new system we intend to improve all the "warnings" and flickering problems that were occurring since then, all feedback is appreciated!

New Debug Modes

With the addition of the new Network Authority system, we are adding a new Debug section in the Settings.

A cool setting is the Draw Network Debug which draws on World all network information:

You can find more information in the Network Authority page.

Also you can fake "packet loss" which will simulate some Sync Data being discarded.

Store API

Last month we released our Store, a place to share and download community Assets & Packages, integrated with the game.

Now we are releasing the Store API: You can download, upload and edit your resources through HTTP requests, check it the Swagger documentation at https://api.nanos.world/store/docs. More tutorials coming soon™.

Documentation Changes

Módulos

We've added a new tutorial for creating your own C Module. You can check it out at the Modules page.

Unreal Engine 5: Preview

A week ago, Epic Games gave us the wonderful news that they were releasing Unreal Engine 5: Preview. A Preview release means most of the features are already present and almost ready for a final shipping version.

And we, as good enthusiasts, and in addition to our other blog news (November: Unreal Engine 5?) decided to give another try on converting nanos world into Unreal Engine 5. And let's move to our impressions:

Migrating nanos world

This time migrating nanos world to Unreal Engine 5: Preview was more trickier, we've got even more deprecated methods and some functionalities changed and/or removed, which required more hard work converting and debugging what has changed.

We've had to update a lot more code and files than the Early Access version to be able just to launch the Project. Also Vehicles had to be disabled due the new Chaos engine, which completely changes how Vehicles need to be implemented and we didn't want to bother on converting them right now.

Graphics

Unreal Engine 5 introduces Lumen, a new dynamic Global Illumination method, and playing with it is very cool and impressive. Here's some screenshots taken from our Testing Map:

tip

Next you can see how the object colors can reflect dynamically in the environment lights.

tip

Here we can see the contribution of Emissive Materials to the environment.

A cool feature is that we can enable Hardware-Accelerated for calculating Lumen (which replaces Hardware Ray Tracing), and tested with a RTX 3070 makes it even more beauty at a really low GPU cost.

Technical

In the technical aspect, the biggest changes Unreal 5 brings are:

  • Lumen (Dynamic Global Illumination)
  • Nanite (Mesh Virtualization)
  • Chaos (new Physics Engine)
  • and also not less important, the new features regarding World/Level creation (One File Per Actor and World Partition)

While Lumen, Nanite and World features can be toggled on or off (we can choose to use it or not), the same truth is not valid for Chaos. Unreal is completely removing PhysX and replacing by it's new Physics Engine: Chaos. Although we are open to new things, unfortunately Chaos doesn't seem to be in a totally good state, neither at least at the same level/stability as PhysX.

We could experience several Collision glitches, such as objects flickering, wrong "collision boxes", objects flying through walls, bugs with Rope (Cable), objects sleeping randomly, bad Hit events callbacks and so on.

Most of the problems we could find an workaround (like applying force to some objects so they don't sleep, or finding a workaround on the Cables settings), but the main problem we've found using Chaos is the Hit feedback event, which are totally inconsistent, sometimes they are triggered with force 0, which annoys the hit sounds and also the nanos world Hit events from being triggered, and this can break gameplay/scripting functionalities.

Not to mention the objects flickering/disappearing/losing collisions which gives a really bad impression on the game quality.

And we didn't even started implementing the new Chaos Vehicles, can't wait what we gonna find there 😅.

Stability

Actually, this version of Unreal surprised us positively, it had less crashes than in early access, but still had some, but in this case it was when we were stressing the game really hard using several balloons, cables and props flying around. Although I was a little disappointed as most of the bugs I found in the Early Access were still prevent in this Preview and weren't yet fixed.

Also some rare bugs could be noticed, like suddenly being teleported to the 0, 0, 0 location, which we couldn't yet find the reason.

UE5 worth it now?

Summing up, we've created a list of positive and negative points according to our view regarding if we should or not migrate to Unreal 5 "right now":

Also, another point to consider: we are going to migrate to Unreal Engine 5 soon or later, the decision is "when". 😉

Negative Points 👎

  • Gameplay Bugs related to Physics, objects jumping, flickering, bad collisions happening, objects passing through floor/walls due Chaos.
  • Visual Artifacts, not only related to Lumen, but to the standard Rendering methods as well.
  • Random Unreal internal Crashes, which we cannot fix by ourselves.
  • More frequent Unreal updates, much probably we are going to have other Preview version, and after the UE5 release we are going to get several hotfixes, and each one will much likely require us from rebuilding all assets and publishing a new version of them, otherwise they won't work in the new versions. This means the Asset Packs won't work in newer Unreal versions.
  • Using Lumen has it's drawbacks, such as the performance, which can hit from 25% to 50% of the FPS (but can be toggled on/off).

Positive Points 👍

  • We are going to be the first ones to explore Unreal Engine 5 (which can be bad because some problems no one figured out yet, but personally I love exploring new features and using new tools).
  • nanos world will have a great self-marketing potential, and also can bring lots of new enthusiasts on UE5 to know, play and create with the game.
  • Lumen is fun and beautiful.
  • New World/Level tools which allows creating big maps and also improves a lot the co-creations pipelines using the One File Per Actor system and World Partition!
  • New Unreal Editor which has a fresh and pleasing look.
  • Lots of new tools and technology to use, including Nanite, Chaos Destruction, Animation tools (which can help us from dynamically linking your custom Animation Blueprint) and the new MetaSounds.
  • It's really hard to convert nanos world from scratch every update to test it's stability, I can't reuse the previous conversion because many changes are in blueprints (UI) that I can't merge and lots had changed since then. So converting once and right now we can already start digging, fixing stuff and the next unreal updates will be easier and faster to test and maintain.

Unlike Early Access, this version seemed to have more positives than negatives points, and it seems like a better opportunity than before to officially migrate nanos world. Come to our Discord to discuss this idea with us! We are going to make a poll to bring all feedback from the community!

Community Spotlight

Here we'd like to share all amazing stuff our community is doing the last weeks!

Timmy is doing an amazing job, and is sharing it's new Inventory System:

Also Timmy created a nice smooth Weather system transition:

MegaThorx released it's brand new EGUI library. A Package for creating GUIs from scripting! It also contains it's own complete documentation!

Voltaism shared a very cool implementation of Bots playing his game-mode VZombies by themselves with no Players:

· Leitura de 10 minutos
Gabriel T. Nardy

Introducing Store, New Classes and all Retroactive Updates!

This blog will also summary up the highlights of everything that has been developed since the last blog in November! Detailed Changelog is available in our Discord! Stay tuned!

Introducing: Store & Vault!

It is with great joy that we finally announce the long-awaited Store! The Store is a marketplace where everyone will be able to upload their Assets, Packages, release new versions, create Teams and much more! 100% integrated with the Vault and the CLI!

tip

The store development is being headed by @MegaThorx! This is the initial version and several updates will come! All feedback is appreciated!

Features Highlights

  • Creation of Asset Packs & Packages pages, including images and description.

  • Upload of new Versions, with ability to tag as Draft, Beta and Stable.

  • Create a Team and add Team members.

  • Tag & Category system.

tip

Check out the complete documentation here.

nanos world Store available now on https://store.nanos.world/

Server Token

With the addition of the Store, we've got a new feature: Server Token.

This token is required when downloading any content from the Store using the CLI (and soon™ when using other integration features), you must set it in your Config.toml file as token setting.

To generate a token please refer to https://store.nanos.world/settings/tokens/.

New Class: Canvas

We've added a new class to completely replace our old Render Static Class: Canvas! Canvas is like a painting frame, you can draw anything onto it, from Lines, Squares to Materials and Textures!

You can also use it as UI or paint any object with a Canvas using :SetMaterialFromCanvas()!

Now it's way easier to create a basic UI!

-- Spawns a Canvas
local canvas = Canvas(true, Color.TRANSPARENT, 0, true)

-- Subscribes for Update, we can only Draw inside this event
canvas:Subscribe("Update", function(self, width, height)
-- Draws a Text in the middle of the screen
self:DrawText("Hello World!", Vector2D(width / 2, height / 2))

-- Draws a red line Horizontally
self:DrawLine(Vector2D(0, height / 2), Vector2D(width, height / 2), 10, Color.RED)
end)

The Basic HUD (Canvas) Tutorial has been updated as well!

Steam Input + Controller

We've managed to integrate Steam Input. If you are not familiar with that, Steam Input allows you to set up and play with any Controller, and also configure it through Steam Interface.

It is a nice integration because it's a relatively simple implementation that allows nanos world to be played with controllers, and it gives users the possibility to customize bindings and share with the community.

An initial version has been released in the latest update, more bindings and configurations will come next.

New built-in Key Glyphs

We've added a utility method to retrieve a Glyph/Image from a given Key. Just use Input.GetKeyIcon(key_name) and it will return the path of the image which can be used as Texture or as an usual image <img> in the HTML!

You can use it combined with Input.GetMappedKey() to dynamically get the Key Glyph based on the user's key binding configuration.

Bullet Trails Improvement

We have reworked our default Bullet Trail particles. Before, depending on the point of view you could see a big sphere passing through and also several glitches in the sky. Now it was reworked to be more realistic and without any artifact!

New Map Configurations

Now it is possible to create individual Configuration files for each Map, in which you can define all compatible game-modes, spawn locations and add custom data as well!

Also, it is possible to set up a complete Package which will automatically load when this map is loaded.

Map.toml
# map configurations
[map]
# compatible game-modes
compatible_game_modes = [
"sandbox",
"deathmatch"
]

# list of spawn points
spawn_points = [
{ location = "Vector(100, 200, 100)", rotation = "Rotator(0, 90, 0)" },
{ location = "Vector(200, 300, 100)", rotation = "Rotator(0, 90, 0)" },
]

[custom_data]
whatever = "anything"

Check the complete documentation at Map Script & Data.

tip

The following changes were added back in 1.1.0-1.3.0 update, we gonna highlight the best ones here!

Interactive CLI

An amazing and extremely useful functionality that has been added to the CLI is the creation of Asset Packs & Packages interactively.

Use add [package|assets] NAME and it will create the Asset Pack or Package interactively, it will create the Configuration and Default files as well!

Actor Tags

At the request of our testers, we implemented a interface to access Unreal's Actor Tags, with Actor.SetActorTag() and Actor.GetActorTag() you can set/get unreal Actor Tags directly from Scripting (client side).

Actor Tags are just an array of strings which can be accessed from anywhere, including from Unreal Blueprint. This small addition increases the range of possibilities for integration with blueprints and external implementations.

New Class: SceneCapture

This is a very cool feature released back in 1.1.0 update.

SceneCapture is a Camera Actor which captures the environment in real time, and we can get the outputted result with :SetMaterialFromSceneCapture() into any other Actor!

It has several configurable performance tweaks which makes it more efficient if you are not looking at the actors and also reduces the capture rate if you are too far!

Assets Caching

We've implemented a great feature which improves the performance and reduce stuttering when (re)loading Assets in runtime. Stuttering usually happen when using HDD and when loading something from Disk. Now every loaded asset (including files from disk - .ogg and .jpg) is cached and reused when loading again automatically. We still intend to add some options to auto load all assets from all loaded Asset Packs when entering a server and also a scriptable option to async load an Asset prior the use to further improve the stuttering and add more freedom to the scripters.

Light Profiles

We've added a new cool setting for Lights: Light Profile, which allows changing the Light Profile Texture of a Light with Light:SetTextureLightProfile().

It is possible to set to one of our built-in Light Profiles. All built-in Light Profiles were imported from IES Light Profile Pack.

This can add a realistic Flashlight effect to your Lights for example.

Vehicle Improvements

Now it is possible to manually control if the Vehicle Engine is started or not, also if it auto starts when a driver gets in with Vehicle:SetAutoStartEngine().

Also we added a small detail: Taillights, it gets Red when braking and White when going backwards, it is customizable with Vehicle:SetTaillightsSetup():

note

The Vehicle Mesh colors are still not in sync with the Headlights neither the Taillights, this will be improved in the next updates!

Parachute Customization

We've added an useful customization to the built-in parachute, now it's possible to change it's texture with Character:SetParachuteTexture(texture). Also, all built-in Textures can be found at nanos-world/NanosWorld/Content/NanosWorld/Textures/Parachute/ and used like assets://nanos-world/Textures/Parachute.

Community Spotlight

Our community has been working hard on several amazing stuff, we would like to share it with you!

T-Drones

by Timmy

Timmy worked on very cool fully functional Drone package, check it out! Fully integrated with the new SceneCapture for a "3D Camera System". Also the Drone has a function to back to home! Amazing!

T-Drones is a script designed to emulate the behavior of hobby drones, and thought to run on the vast majority of game-modes.

It has been conceived to be as modular as possible and to adapt to the needs of anyone who wants to make modifications or additions easily.

KOTOR RP

by ERO Team (NegativeName, Mougel, False & Tark)

The ERO Team is working hard on a blasting Star Wars RP game-mode (KOTOR RP), this gonna be dope! Here's some screenshots of the worlds and the Combo system of the Light Saber!

Star Wars KOTOR RP is a french role-play game-mode in the Star Wars universe.

You will play a character in this distant galaxy. Your role will depend on you. Will you join the Sith Empire to enslave the galaxy, protect it by joining the Galactic Republic, or take no side.

The choice is yours! Become a Jedi, a Sith, a soldier, a mercenary, or a simple merchant.

T-Bomber

by Timmy

Also Timmy is creating a Bomberman game-mode! Excellent work, I can't wait to play it!

T-Bomber is a Bomberman-like game-mode Heavily inspired by the famous maze game.

It aims to replicate the original Bomberman experience with some extra spice, and to show off some of the scripting possibilities of nanos world.

The rules are very simple, the last one alive wins!

VZombies

by Voltaism

Voltaism is working on his Zombies game-mode based on COD's one. It's incredibly fun and horrifying!

Nearly finished game-mode that is basically a clone of the classic Call Of Duty: Zombies mode where you have to survive against zombies the longer as you can!

This game-mode also has bots that can play with you.

nanos BattleField 2043

by LighterChu, Trevor & MemeFrug

Battlefield 2042 came out, we expected the best. Why did we make nanos battlefield 2043, well it is not just Battlefield 2042 it's all battlefields mixed in the future of combine titles are here.

Conclusion

Thank you again for your feedback and support, every suggestion and bug found makes the nanos world wheel spin faster and faster!

note

This blog contained several highlights of our progress in the last month. Note that countless improvements, bug fixes and some other new features are available in the changelog on our Discord and also in-game.

We are aware of your biggest requests and we want to implement them as soon as possible to make the nanos world API more and more complete. We still have a long roadmap to go through, and we have big pillars of goals to bring new types of vehicles (including air and sea), customizable characters (any skeleton), direct Blueprint support and more!

Right away we desire to rework our Steam Store Page, it was left behind due to some technical issues and we want to revive it, with that we desire to do a rebranding of the nanos world, we know that logos and great capsule images that relate to the game theme are of great importance for Steam self-marketing to attract new players!

See you in the next! Thank you!