Page 1 of 1

[0.13] teleport between surfaces and character change ?

Posted: Sat Aug 06, 2016 10:06 am
by binbinhfr
Hi,

I found a weird thing that I can reproduce when teleporting between surfaces and changing character.
It causes problem between my Drones mod and Factorissimo mod.

to reproduce the problem :

Code: Select all

/c surf1 = game.surfaces.nauvis
/c surf2 = game.create_surface("surf2")
/c char1 = game.player.character
/c char2 = surf1.create_entity{name="player",position={2,0},force=game.player.force}
/c game.player.character = char2
/c game.player.teleport({0,0},surf2)
/c game.player.character = nil
/c game.player.teleport({0,0},surf1)
/c game.player.character = char1
/c game.player.print(char2.valid)
last print shows that char2 became invalid...

but if you do

Code: Select all

/c game.player.teleport({-1,0},surf2)
you will see that char2 is graphically still here...

my goal is to change character, and that it works between surfaces too.

Re: [0.13] teleport between surfaces and character change ?

Posted: Sat Aug 06, 2016 11:08 am
by Rseding91
Teleporting a character between surfaces invalidates everything pointing at it which is why char2.valid says false. That's by design.

Re: [0.13] teleport between surfaces and character change ?

Posted: Sat Aug 06, 2016 12:05 pm
by binbinhfr
Rseding91 wrote:Teleporting a character between surfaces invalidates everything pointing at it which is why char2.valid says false. That's by design.
But before the second teleport, char2 was not connected to player (I made a player.character = nil before). So char2 was just an entity on surf2.
And how do you explain that char2 is still visible on the map of surf2 ? Is there a way to retrieve it ?

Then what is the right way to do ? (let say : when in surf1, I'd like player to be in char1, and when in surf2, I'd like player to be in char2)

Because it seems that we cannot teleport entities (ex: unconnected characters) between surfaces.

EDIT : to be clear, the problem that was encountered by the users of Drones and Factorissimo is : player switch to drone, he entered a factorissimo building (other surface), then he wants to switch to another drone or go back in its normal body, and then the drones that is in other surface is invalid/lost... And sometimes main body is lost.

Re: [0.13] teleport between surfaces and character change ?

Posted: Sat Aug 06, 2016 10:01 pm
by Rseding91
char = game.player.character
game.player.teleport({0,0}, surf2)

char is now invalid. The act of the player teleporting invalidates everything that points at the current character attached to the player.

Re: [0.13] teleport between surfaces and character change ?

Posted: Sun Aug 07, 2016 9:32 am
by binbinhfr
OK, I understand. When changing surface you probably duplicate the character entity and destroy the old one, so that we lose the handle.

But at least, could we have an event when player changes surface ? on_player_surface_changed ?
It could be useful for mods that try to keep track of character.

EDIT:
I understand that, when the player teleport, you change/duplicate the current character, but why "old deconnected characters" are changed ? If they remain on the old surface, they should really not be touched, as any entities still belonging to that surface...

remember, I did :

Code: Select all

/c game.player.character = char2
/c game.player.teleport({0,0},surf2)
/c game.player.character = nil
/c game.player.teleport({0,0},surf1)
/c game.player.character = char1
/c game.player.print(char2.valid)
So char2 was deconnected of player when I teleport back...

Re: [0.13] teleport between surfaces and character change ?

Posted: Sun Aug 07, 2016 10:59 am
by Klonan
Hmm,

I think a on_player_teleported event might be useful, as there currently isn't an easy way to know this,

However i think you can just re-check the player if their character is invalidated, and store reference to the player, instead of the character

Re: [0.13] teleport between surfaces and character change ?

Posted: Sun Aug 07, 2016 1:13 pm
by binbinhfr
Klonan wrote:However i think you can just re-check the player if their character is invalidated, and store reference to the player, instead of the character
That's what I do when my mod does the teleport. But if another mod does it (like factorissimo), I cannot be aware about this.

And you understand that with my Drones mod, I manage a list of characters per player (one main body + N drones) and I switch from one to another. No problem on a single surface.

On multi surface, one of my problem is : when I am in a Drone character, I periodically verify that the original body character is still alive (in case it is killed while I am droning). If the drone teleport to another surface (with Factorissimo mod or any other surface mod), I have no way to know it (no teleport event) and the original body character stays on the other surface and but its handle gets invalidated (even if its is deconnected from player), and I have no way to retrieve it... I still find strange that unconnected characters become invalid. I understand this for the current character when it is teleported, but not for unconnected characters that stay on their original surface and are not teleported...

Re: [0.13] teleport between surfaces and character change ?

Posted: Sun Aug 07, 2016 2:33 pm
by Rseding91
I'll add on_player_changed_surface since that seems like a logical event that should exist.

Re: [0.13] teleport between surfaces and character change ?

Posted: Sun Aug 07, 2016 3:00 pm
by binbinhfr
Rseding91 wrote:I'll add on_player_changed_surface since that seems like a logical event that should exist.
Nice ! It will really help with all these interesting mods playing with surfaces.

But there is still no complete solution for mods switching between several characters (like Drones or Avatars) and keeping a list of different character-entities :
characters entities not actually connected to a player should not change (and become invalid) while teleport : they should remain untouched, on their surface.
Only the actual character entity connected with a player (pointed by player.character) should change when teleporting.

Re: [0.13] teleport between surfaces and character change ?

Posted: Wed Aug 17, 2016 3:47 pm
by binbinhfr
Hi there,

I just see that the new on_player_changed_surface event. It's great .
I finally think I will do something out of it for my Drones mod.