I know you are already planning this, but I couldn't find any ticket on it so I opened one.
Nbt variables were an awesome addition. They made almost everything possible.
But entity variables have an issue. If the player dies, they will reset. It would be cool if we had a new kind of variable that worked exactly like entity variables but only are for players and don't reset after death.
(and if we can choose their names while making procedures, like with nbt variables, it would be even better for cross compatibility with mods)
Issue comments
https://mcreator.net/tracker/issue/52449 would make it possible solve this issue by using a local variable and then calling something that resets the nbt data as well as some other stuff also i opened an issue about this earlier as well https://mcreator.net/tracker/issue/52207
Whenever you want to preserve player specific variables on death simply create a GLOBAL_SESSION variable:
On player leaves the world: Set Entity data number NBT tag "varX" to Get Global(session): X.
On player joins the world: Set Global(session): X to Get Entity data number NBT tag "varX".
And that is all there is to it (: This will preserve player specific data on death + on death and leaving the game + on dying and leaving the game directly without respawning and everything.
Every player has their own GLOBAL_SESSION. This is the only one of the 3 that isn't shared between all players.
Dying, clicking title screen and closing minecraft will not clear the variable. Upon joining the world, you'll still be met with the respawn screen and your variable will be stored.
These 3 cases I tested while printing the value in chat succesfully:
This will preserve player specific data on death + on death and leaving the game + on dying and leaving the game directly without respawning and everything.
https://www.youtube.com/watch?v=2eYF4SbHP_c&feature=youtu.be
The result of:
create a GLOBAL_SESSION variable:
On player leaves the world: Set Entity data number NBT tag "varX" to Get Global(session): X.
On player joins the world: Set Global(session): X to Get Entity data number NBT tag "varX".
(Global(session) X is being printed in the chat.)
"and could aren't global session variables shared between all the worlds in a session and reset when it is closed?"
This part is irrelevant as we don't use the GLOBAL_SESSION for storing the variable when the game is closed. All of that is done with the NBT tag. It therefore doesn't matter whether they are shared across all dimensions, all worldsaves, as when the game start, they get their value from a world specific NBT tag anyway (:
Did yo u follow all steps?
create a GLOBAL_SESSION variable:
On player leaves the world: Set Entity data number NBT tag "varX" to Get Global(session): X.
On player joins the world: Set Global(session): X to Get Entity data number NBT tag "varX".
In what scenario does it not work for you?
I followed the steps you said. I didn't create a debug procedure though, but I will today to check what's wrong
Anyway, I am using the entity nbt variables to store which items has the player traded with an NPC and how many times (it is important for the mod progression). The NPC remembers of you, until you die, then he speaks with you as it was the first time... (he's supposed to remember of you)
But I used entity nbt because this way it is compatible with another mod that shares the same nbt variable (once you traded 5 or more items with the NPC, he will turn on an entity variable to make you able to get a treasure hidden in a feature of another mod).
I don't think I can do the same with global variables (maybe I could only keep this variable as nbt - and turn the others into global - and make the player have to speak again with the npc to "remember" where the treasure is)
I think its possible with NBT tags too, but you need to remember:
GLOBAL_SESSION is removed when exiting the game. Entity NBT tags are removed upon dying.
To avoid data loss when exiting the game = NBT tag. (Thus we pass the value to the NBT tag when leaving and getting it when joining)
To avoid data loss when dying = GLOBAL_SESSION. So you can have the player NBT tag get the value from the GLOBAL_SESSION whenever the player respawns.
Because Global_Sessions erase upon exiting the game, we give an NBT_Tag the value of that Global_Session when the player exits the world. The NBT_Tag has the same value as the Global_Session, but is stored even when you close the game:
- This is made by creating a new procedure that is triggered when "Player leaves the world". We need to give the NBT_Tag the value of that Global_Session upon closing the game.
- You also need to create a new procedure that is triggered when "Player joins the world". We need to give the Global_Session the value that the NBT_Tag has stored while the player was out.
To actually change the variable you have to update the Global_Session instead of the NBT_Tag, otherwise it would reset whenever the player dies. In basic terms:
- Global_Session stores the data while playing the game.
- NBT_Tag stores the data while the game is closed.
I hope my explanation has helped you in any way crispy_chips1234. Thank you very much StellaeLux for explaining it, I had been trying to find a way around a problem from my mod and you helped me a lot!
GLOBAL_SESSION is per-player (per Java instance actually) so this supports multiplayer.
But for server-side use, this ticket has to be fixed: https://mcreator.net/tracker/issue/55702
I will consider adding option GLOBAL_PLAYER that will act as a tag for which player NBT variables to be cloned when the player respawns as cloning on death event is the only way to achieve this.