NokiMo
neosvr
neosvr

patreon


Introducing Cloud Variables, interviewing Creator Jam, over concurrent 300 users

Hello and welcome to another of our weekly updates!

We have very  exciting updates for you. This week we have released our Cloud Variable  system, a new powerful tool for persistence independently of objects and  worlds, allowing you to sync settings across worlds and avatars, build  world with progression system, synchronize values between your private  UI and the world in real time, sync data across sessions and instances  of items and much more!

The system is designed for many different  use cases and usage patterns, to learn more about how you can start  using it, check out the details below.

The weekly Creator Jam has  also reached the magical number 100! On our last Friday live stream, we  have interviewed Medra, VegasX and Cataena to learn more about Creator  Jam, their background and experiences, if you missed the interview  definitely give it a watch!

In more great news, we have reached  over 300 concurrent users a few days ago! Our community has been  constantly growing for past two and half years and we're very excited  every time we reach a new record number. While it's not as high as the  absolute peak at the New Years, it's one that appeared organically  almost out of nowhere.

We also showcase some amazing community  creations and events, like a brand new MurderX game by the Japanese  community, DJ event and talk about new mentor applications. Check out  the details below!

Interview with Medra, VegasX and Cataena from Creator Jam

Creator  Jam is the longest running weekly collaborative event on Neos started  by Medra. Every Sunday users both old and new come together to build  something fun and awesome based on a theme. Last Sunday, the Creator Jam  hit the magical 100 - a hundred creator jams!

In preparation  for this amazing achievement, we have interviewed Medra along with  VegasX and Cataena on our last Friday stream, to learn more about their  background, how they got to Neos, Creator Jam and their experiences. If  you missed the live stream, watch the interview here:

https://youtu.be/sYuWYRnv6E8

Introducing Cloud Variables

This  week, we have implemented a new powerful system for persistence, dubbed  cloud variables! While persisting individual objects and worlds is at  the core of Neos, sometimes it’s necessary to persist and synchronize  data across multiple objects, worlds and sessions for each user and  that’s where the cloud variables come in!

We have designed this  system with a high degree of flexibility, making it useful for several  different scenarios and workflows, from being able to sync settings and  toggles on objects, avatars and worlds across sessions without having to  save a separate copy to your inventory, saving a state, scores and  progression in game worlds, to syncing state across multiple worlds and  sessions or between your private Userspace UI and the world or tagging  users by external applications for custom tailored experiences and  events.

https://youtu.be/fbpDt4cW0Ao

This way one powerful system tackles multiple different problems that  content creators and event organizers have been facing for a while,  adding to the repertoire of powerful world building tools and improving  the overall user experience.

Variable Definitions and Variable Values

To  understand the cloud variables, you must first understand two core  concepts - what are variable definitions and what are variable values.  To use a variable in your creations, you must first create a definition -  a structure of said variable - its name, data type, default value and  access permissions.

Variable definitions can be owned by both  users and groups, with the latter having greater flexibility in both the  usage patterns, permission settings and higher limit for number of  definitions. To create a definition, you’d use following commands:

/createUserVar <name>
/createGroupVar <group> <name>

Once  a definition is created, a value can be stored and read for every  individual user and group based on this definition. Typically as content  builder, you’d define variables for your worlds and items, for example  “Quality.Shadows” if you’d like users to be able to toggle shadows on  and off in your world.

Within the world, you’ll then link the  fields, for example the Enabled boolean of the shadow casting light to  the cloud variable using the CloudValueVariableDriver<T>  component, using the full path of the variable you have created.

The  full path is obtained by prefixing the ID of the user or group who owns  the variable definition to the variable name. For example if you have  created the variable definition “Quality.Shadows” on your user account  with ID “U-MyUsername”, the full path will be  “U-MyUsername.Quality.Shadows”.

Neos will then sync the boolean  to the corresponding value of each user and automatically update their  cloud variable if they change the setting, without you having to do  anything extra!

Read, Write and List Permissions

To  provide control over how the variable values and definitions are used  and give them a lot of their flexibility in access patterns, each  variable definition has a list of read, write and list permissions.

Read  and Write permissions do pretty much what you’d expect them to -  control who can read the value and who can write to it. The List  permission is specifically for the variable definition and determines  who can see a given definition on the profile of the owner (group or  user). By default this is private, allowing you to create private  variables that nobody will know that they exist, unless you publish  their name somewhere.

Currently following permissions are  available, with each permission type supporting any combination of these  (although some are redundant):

There is  also an important distinction between User and Group variable  definitions - variables defined by Users can only have variable_owner or  variable_owner_unsafe write permission. This means that you cannot  write the value on behalf of another user - they can only do that  themselves.

This still lets you make items and worlds with  settings, toggles and other persistent state for each individual user,  but disallows for usage patterns where you (or someone else) modifies  those values without the user being present - e.g. tagging them for an  event. You will need to use Groups for that.

Supported data types

Currently  cloud variables support all the basic Neos primitives - numbers,  booleans, vectors, colors, matrices, strings and URLs. Picking the right  data type is important, as it ensures that any stored values are  properly validated - e.g. when you pick float3, the User won’t be able  to store arbitrary string.

The string datatype specifically  allows for additional validation - you can specify maximum length, using  string:<length> as the datatype. For example string:8 won’t allow  strings that are longer than 8 characters.

By default, string  can be 256 characters, but you can manually increase this limit to 8192.  We’ll likely revisit those limits in the future and provide a way to  increase them. We also plan to allow for more complex datatypes as well,  such as arrays and other collections.

Here is the full list of supported primitives:

bool,
sbyte, short, int, long,
byte, ushort, uint, ulong,
float, double, decimal,
float2, float3, float4,
double2, double3, double4,
int2, int3, int4,
uint2, uint3, uint4,
long2, long3, long4,
ulong2, ulong3, ulong4,
floatQ, doubleQ,
bool2, bool3, bool4,
color,
float2x2, float3x3, float4x4,
double2x2, double3x3, double4x4,
datetime, timespan
string,
string:<max_length>

Cloud variable management commands

Currently  cloud variables are created and managed using commands sent to the Neos  account in your Contacts list. Alternatively you can use the AdminX  (requires .NET 5.0 runtime) tool bundled with the Steam installation  (under Tools folder), which lets you type those commands directly - if  you use that one omit the forward slash.

Here is the list of commands you can use:
/getUserVar <path> - lists definition
/getGroupVar <group> <path>
/getUserVarValue (<user>) <path> (<target user>) - gets current value of given variable for given user
/getGroupVarValue <group> <path> (<target user>)
/setUserVarValue (<user>) <path> <value> - sets current value of given variable for yourself
/setGroupVarValue <group> <path> <value> (<target user>) <value> - sets current value of given variable for specific user
/listUserVars (<user>) - lists all variable definitions
/listGroupVars <group>
/createUserVar <path> - creates new user variable definition
/createGroupVar <group> <path> - creates new group variable definition
/setUserVarType <path> <type> - sets the datatype of given variable definition
/setGroupVarType <group> <path> <type>
/setUserVarDefaultValue <path> <value> - sets the default value for given definition
/setGroupVarDefaultValue <group> <path> <value>
/setUserVarPerms <path> <perm_types> <permissions> - sets read/write/list permissions for given variable definition
/setGroupVarPerms <group> <path> <perm_types> <permissions>

Usage patterns

To  get started, here are a few samples for some common usage patterns for  the cloud variable that you can use and how to set them up:

User settings and toggles

You  can use this pattern to create items and worlds that have  user-customizable settings that persist/sync across sessions or to have  toggles for your own avatars (e.g. switching clothing options that  persists without having to save the avatar itself).

For example this will allow you to create a toggle for fancy graphics in your world that persist:

/createUserVar myWorld.fancyGraphics
/setUserVarType myWorld.fancyGraphics bool
/setUserVarPerms myWorld.fancyGraphics read,write variable_owner_unsafe

Then  use component CloudValueVariableDriver<bool> to drive whatever  you need in the world to toggle the fancy graphics on and off and make a  visual toggle that toggles the boolean value. That’s all you need, once  the user toggles the value, the state will automatically be synced to  their cloud variable value!

Controlling avatar/world options securely from private UI (dash)

If  you’d like to make private UI to control settings in your worlds or on  your avatar without any gadgets in the world being able to alter the  value for you, you can use similar pattern to above:

/createUserVar myAvatar.glowColor
/setUserVarType myAvatar.glowColor color
/setUserVarPerms myAvatar.glowColor read variable_owner_unsafe
/setUserVarPerms myAvatar.glowColor write variable_owner

This  will allow the variable to be read in the world, but won’t allow the  world to write the value. However you can still make a custom UI as a  Facet and place it on your dash to control it. Neos will sync the value  in real time!

Globally syncing state across worlds/items

If  you’d like to control some aspect of your world across all of its  sessions or perhaps display a global announcement/message on an item you  distribute (for example when there’s a new version available), you  could use the following pattern:

/createGroupVar MyGroup gadget.globalMessage
/setGroupVarType MyGroup gadget.globalMessage string
/setGroupVarPerms MyGroup gadget.globalMessage read anyone
/setGroupVarPerms MyGroup gadget.globalMessage write definition_owner

Once  you set this up, use the CloudValueVariable<string> component to  get the current value. Instead of getting the value for each individual  user, you get the value owned by the same group:

Path = G-MyGroup.gadget.globalMessage
VariableOwnerId = G-MyGroup

Then set the value as such:
/setGroupVarValue MyGroup gadget.globalMessage “Eat plenty of fruits!”

If  you don’t own a group, you can use similar pattern with user variables  too and simply link the component to the variable value of your user  account:

/createUserVar gadget.globalMessage
/setUserVarType gadget.globalMessage string
/setUserVarPerms gadget.globalMessage read anyone
/setUserVarPerms gadget.globalMessage write variable_owner

Path = U-SomeUser.gadget.globalMessage
VariableOwnerId = U-SomeUser

Tagging users for events

If  you’re hosting an event and you’d like to assign different users  different roles and trigger things to happen depending on their role.  You can do following:

/createGroupVar MyGroup experience.role
/setGroupVarType MyGroup experience.role string
/setGroupVarPerms MyGroup experience.role write definition_owner
/setGroupVarPerms MyGroup experience.role read definition_owner_unsafe

Make  sure that your sessions are hosted by an account that is part of the  MyGroup so it can read the variable value. Once you have this setup, you  can tag users, either using the command or in the future through the  API with OAuth 2.0 integration:

/setGroupVarValue MyGroup experience.role U-Visitor VIP

You  can read the current variable using the ReadCloudVariable LogiX node,  by firing an impulse with the path of the variable, ID of the user who  joined and then perform arbitrary logic based on its value.

Current limitations of real time synchronization of cloud variables

One  of the current limitations of the cloud variable system is that they  won’t be synchronized in real time across different sessions, unless  they run on the same host/user. If you host multiple worlds/sessions on a  single headless (or your own computer), the changes to the cloud  variable will sync in real time within those sessions.

However if  different users host the same world, changes in one world won’t be  immediately reflected in another and will take a few minutes to refresh.  Our current plan is to add full real time synchronization in such cases  by integrating SignalR into our cloud infrastructure, which will help  the cloud scale better for other things like active sessions or the  messaging system as well, but is a bigger chunk of work.

Even  with this current limitation the cloud variables should be a very  powerful and flexible tool for many use cases and one that will grow as  we continue pushing forward. We’re just at the beginning of its  possibilities and we can’t wait to see all the awesome stuff you’ll make  with it!

Community Highlights

Hello  everyone! Your friendly neighborhood Turk is here! I hope your weekend  was fun because boy was Neos jam packed this weekend! Let dig into some  of the goodies!

Community Achievements

Guess  what happened this week folks? We hit the milestone of 300 users  organically this week! Not without other platforms just having issues  and using Neos as an alternative! We had about 3-4 different music  events this weekend on top of folks just checking out the platform! This  means so much for us and Neos as a platform going forward as well too!  This means we are going to have more Mentors and more things are in  store too soon(™)


Community Maps

MurderX by NEJ and NOF

A  recreation and upgrade of a popular game mode across multiple  platforms, it’s MurderCross! In this map you can actively live build,  and live create your murder map, allowing you to have templates or all  kinds of interesting setups, so you not beholden to just one map all the  time! Thanks Neos East Japan and Neos Onaka Force! This map is sooo  cool!


https://twitter.com/mikan3134/status/1385171527319101441

CJ 100: Ghost Talk & Centijampaede

This  week at Creator Jam we have Creator Jam 100! That means the folks at CJ  have done 100 events where every week they have had a creation theme  different each week! This week they went through all previous 100 jams  to find the goodies and treats that folks really enjoyed from past jams,  along with a surprise! Some folks at the CJ have been hard at work this  week to make Ghost Talk! A game akin to Jar’s Spirit Speak from VRC, we  now have our own version in Neos! So grab a bunch of friends and hop in  and try to see how you can hint what cards are which to you friends.  (P.S Yes the hints are still horrible, good luck)

Community Events

Rebirth

Some  folks from the Wave Community have been starting to run shows in Neos!  This is only the start of the weekend parties that will usually happen  in VR! Orchestrated and Assisted by Rez in “Rez-A-Light” folks got  together and got their boogie down in Neos!

The Bassarisk

This  weekend on Saturday we had a DJ event that is run by Kulza and has a  different DJ each time! This week we had FuzeWasTrash doing some nice  Synthstep tracks for folks to dance and groove too. It was pretty  popping, there were people dancing on bread!

Skywatch Saturday

This  weekend was Porter Robinson’s Music Festival SkyWatch. Being well known  in the VR Community, it’s a VR Music Festival that folks can throw on a  headset and chat and tune into a live performance all within the  confines of a nice session to chill and chat with friends. We had about a  couple different watch parties full to the brim with a whole collective  of users!


Neos hit 300: More Mentors Unlocked

Congrats  Neos you did it! You achieved the secret (not so secret achievement) We  now can onboard more mentors to be a part of the Mentor Program!  Mentors are a mixture of Community Helpers but also Community Guides and  help keep Neos with its charm and community. If you're interested in  joining and want to help with the community, feel free to put in an  application! https://wiki.neos.com/Mentors If you want to know more and contribute to helping out Neos!



---------------------------------------------------------

Anyway  that's all for this update! And as usual, huge thanks to you, our  community, Patrons and everyone else for supporting this project.  Without you none of this would be possible and we couldn't dedicate our  time to improving the platform every day. See you next week for more  Neos news!


Related Creators