ephread / inkgd

Implementation of inkle's Ink in pure GDScript for Godot, with editor support.
MIT License
305 stars 33 forks source link

Cannot change scene with InkPlayer instantiated #83

Open MonkaKokosowa opened 5 months ago

MonkaKokosowa commented 5 months ago

Describe the bug

It's not possible to change a scene via get_tree().change_scene_to_file() with InkPlayer instance in the active scene. To Reproduce

  1. Run a scene with instantiated and loaded InkPlayer
  2. Change it to another one (it doesn't work with and without the inkplayer in the new scene).
  3. Crash

Expected behavior

Normal scene change, just like with any scene that doesn't have InkPlayer

Ink files

It happens with any .json ink file

Environment:

Additional context

The exact issue is caused by line 838 in ink_player.gd with error Invalid get index 'root' (on base: 'null instance').

Also, I noticed that if I just comment that line out, there's no errors and the scene changes, though I don't know exactly if something else breaks in the back that I don't know about.

lilrooness commented 3 months ago

Adding details to this

_remove_runtime calls get_tree().root which should be while the InkPlayer node is in the tree.

It looks like what is happening is that _remove_runtime is getting called from the _exit_tree function, which should be fine, except that the call to _remove_runtime is deferred, meaning it happens after the node has been removed, I'm not sure what the intent of deferring is, but I'll experiment with removing it. Currently using this plugin for game, so I have an interest in fixing this.

See here: get_tree returns null when it's called on a node that isn't inside the tree.

https://github.com/ephread/inkgd/blob/fea9098ee18d6cdbe9a5e25f8f0296bcdf0fd96a/addons/inkgd/ink_player.gd#L307-L308