Dec: One VM to Rule Them All!
One Lua Virtual Machine to Rule Them All!
Une Seule Machine Virtuelle
Après beaucoup d'analyse, d'étude et de refactorisation. Je suis heureux de vous présenter la nouvelle façon dont les paquets fonctionneront ! Cela était fortement motivé par le manque de possibilité de créer des extensions ou des éléments personnalisés de manière simple.
In addition to the last new Entity System update, this change will heavily add to the possibilities of modding & scripting capabilities to nanos world!
Ces changements sont censés avoir le moins d'impact possible et de changements cassés. Tous les tests que j'ai faits jusqu'à présent ont assuré que Tous est toujours rétrocompatible !
So far, we had one VM (Virtual Machine - or lua_State
) created per Package. Cela a fait que chaque paquet est complètement isolé les uns des autres. Therefore it was necessary to create mechanisms for communication between the Packages, such as Events and Package.Export/Package.Call methods, which allowed (in a limited way) Packages to communicate with each other.
Mais comme cela a été mentionné, cela a entraîné de nombreuses limitations, comme il n'était pas possible pour les paquets d'accéder à des variables ou d'appeler des fonctions directement à partir d'autres paquets, ou encore pire (qui devient plus évidente depuis la dernière mise à jour de Entity System): Il n'était pas possible de partager des classes personnalisées entre les paquets !
Cependant maintenant tout cela sera résolu ! I reworked the entire internal scripting system, and now instead of having a new virtual machine per Package, we will have a virtualized sandboxed environment (using Lua environment _ENV
feature), separating the scope of each Package but allowing them to access a global shared environment!
Cela permettra aux Paquets de définir des classes, d'exposer des fonctions et de partager des biblioth èques globalement ! Pour que tout le monde puisse l'utiliser sans avoir besoin de mécanismes de contournement pour le faire!
Now, for example you can just load additional scripts together the sandbox
game-mode which loads custom Classes of tools or weapons, and those will appear automatically in the Spawn Menu, no need for manually adding them anymore!
Chaque paquet aura toujours son propre environnement sous-global, donc la définition de variables ou de fonctions globales ne les rendra pas disponibles immédiatement pour les autres paquets.
Call & Export
Package.Call
and Package.Export
are not necessary in the traditional way anymore. As now we can share the global environment, we can define methods and expose them to be called directly, without the need to Package.Call
them.
The Package.Export
will still exist and work similarly. Mais maintenant il sera possible de "exposer" n'importe quelle valeur à la portée mondiale ! Exemple :
local my_table = { 123, 456 }
function DoSomething(var1)
return var1 + 123
end
Package.Export("MyTable", my_table)
Package.Export("DoSomething", DoSomething)
Console.Log(MyTable[1])
-- 123
Console.Log(DoSomething(456))
-- 579
Classes Héritées
Maintenant, toutes les classes héritées seront disponibles pour tous les paquets, car elles seront créées et exposées au périmètre global automatiquement.
Le premier paramètre sera maintenant utilisé comme nom de variable pour définir la classe dans la portée globale. De plus, il vient juste d'avoir un nouveau paramètre optionnel pour définir une table personnalisée contenant des valeurs à définir dans la table de classe avant sa création :
-- Note we are assigning the return of Inherit to a variable called
-- MyPropClassLocal, but also MyPropClass will be defined globally
-- as being our class, both variables points to the same Class table
MyPropClassLocal = Prop.Inherit("MyPropClass", {
"my_custom_value" = 123,
"my_another_value" = "hello"
})
local val = MyPropClass.my_custom_value
-- val == 123
We've also added a new static event for getting when a new Inherited Class is registered: ClassRegister
:
Prop.Subscribe("ClassRegister", function(class)
-- Do something with the new class
end)
Library Package Type
With this new way Package work, library
types are no longer needed. As now we can communicate directly with other packages with exposed global methods, we can just define the methods to be exported with Package.Export
and use them whenever we want.
In this way we will only have two types of "lua script" Packages: game-mode
and script
. All existing library
packages will be automatically converted to script
when loaded.
RequirePackage
Therefore, Package.RequirePackage
will becomes unnecessary as well. As we can now reuse the same script globally, this method will be depreciated in favor of adding your package in the package_dependencies
list of your Package's Package.toml.
Package requiring the default nanos-world-vehicles
or nanos-world-weapons
will load them as a standalone Package, as now they export the NanosWorldWeapons
and NanosWorldVehicles
tables globally.
Paramètres de GameMode
Nous introduisons le concept de paramètres personnalisés pour les modes de jeu! These settings can be defined in Package.toml like that:
# game-mode custom settings configurations
[custom_settings]
my_toggle = { label = "enable PVP", type = "boolean", description = "whether to enable PVP or not", default = true }
my_text_input = { label = "type anything", type = "text", description = "custom text!", default = "hello world!" }
These settings can be configured through server arguments --custom_settings "my_toggle = true, my_text_input = 'awesome text!', ..."
, or through the New Game screen, which parses and displays the configuration dynamically when creating a new game:
The values defined can be accessed through the new method Server.GetCustomSettings()
.
Please refer to the updated Documentation Page for more information.
Configuration Files
Comme annoncé sur les blogs précédents, le format des fichiers de configuration change dans la prochaine mise à jour !
All Package.toml and Assets.toml in the old format will automatically self-convert to the new format as soon as they load for the first time.
Meta Block
Now we have a new common header among all Assets.toml and Package.toml: [meta]
.
Il aura le format suivant, qui sera utilisé pour définir les configurations générales principalement utilisées par le magasin :
loading...
Package
Pour les paquets, nous aurons un nouveau format pour différencier leurs types. Chaque type de paquet aura un bloc de configuration indépendant et différent. Now the Package type will be determined by defining a block [game_mode]
, [script]
or [loading-screen]
.
Voici à quoi ressemblera un Package.toml de gamemode :
loading...
Configuration d'Images
As you may have noticed, there is no more setting image
on Package.toml, the same applies to Assets.toml and for the server image in the Config.toml.
Now, the images should be physically placed next to the .toml file with the name Package.jpg
, Assets.jpg
or Server.jpg
.
Il s'agit d'une standardisation pour résoudre l'incohérence de l'image entre le magasin et le fichier de configuration, ainsi que pour éviter que des liens externes et malveillants soient placés là-bas. Mais cela apporte l'inconvénient que seuls les serveurs dédiés peuvent désormais afficher une image sur la Liste des Serveurs.
Nouvelles classes statiques
Enfin, nous sommes en train de sortir la mise à jour avec toutes les refactorisations de la classe statique ! Cela nous donnera une excellente nouvelle organisation pour trouver des choses dans la documentation, car maintenant des méthodes spécifiques seront regroupées en classes avec des noms qui ont du sens !
Liste de toutes les nouvelles classes statiques:
- 💬 Chat
- 🔤 Console
- 🐛 Debug
- ☎️ Discord
- 🏝️ Level
- 🚢 Navigation
- 🖼️ PostProcess
- 🌅 Sky
- 🎮 Steam
- 🔍 Trace
- 📺 Viewport
Also, 🕹️ Input got a bunch of new methods and events as well from Client.
Many of the methods from ⌨️ Client and the old 🌍 World were migrated to those classes! Consultez leurs pages pour obtenir des informations précises !
Événements renommés
En raison de notre dernier sondage, nous commençons à changer tous les noms d'événements qui avaient des noms erronés. We are standardizing them to the present tense, so events like CharacterEntered
will be renamed to CharacterEnter
for example.
Toutes les modifications maintiendront l'ancien événement fonctionnant comme obsolète. Veuillez faire attention aux nouveaux avertissements pour les mettre à jour vers la nouvelle version !
Assets Plugin Content
Maintenant, il est possible de créer des Asset Packs à partir du Plugin content, ce sera la meilleur façon pour créer des contents à partir de maintenant car il empêche les chemins des assets d'entrer en collision avec les autres.
For that, we added a new setting in Assets.toml to define if the Asset Pack is a plugin content: is_plugin_content
.
Please refer to the updated Documentation Page for more information.
Améliorations du magasin
Le mois dernier, MegaThorx a lancé une mise à jour du magasin, qui améliore considérablement le flux de téléchargement de nouvelles versions. Maintenant nous avons une barre de progression, ainsi que des scripts spéciaux pour vérifier les erreurs de syntaxe et les problèmes potentiels. D'autres fonctionnalités seront également ajoutées dans le futur !
Conclusion
Je n'étais pas très satisfait de la façon dont nanos monde gérait les possibilités de modding et de scripting. Il se sentait très limité et non naturel la façon dont les scripteurs devaient faire pour faire des paquets pour communiquer entre eux. Il ne permettait pas beaucoup de personnalisation ou d'extensibilité.
With the last month's Entity System and now with this change to how Packages work, I feel that a huge door of possibilities has just opened even more, which will give a good breath to new things to be added!
An excellent example of what now is possible to achieve is creating a blank script
package with a custom special inherited Weapon, and just loading the Sandbox game-mode together with your script to make it show up in the Spawn Menu, without needing any special call or workaround! Ceci est énorme et lie tous les nœuds restants! 🥳
Ce changement à une seule VM a été un grand changement, au début, je pensais que cela ne fonctionnait pas. mais après avoir terminé et effectué des tests j'ai été très surpris et heureux des résultats! Maintenant nous devons affiner et l'améliorer encore plus!
Le modding va brrr!! Merci pour le soutien ! See you next month! 💪💪