gilzoide / godot-lua-pluginscript

Godot PluginScript for the Lua language, currently based on LuaJIT's FFI
https://gilzoide.github.io/godot-lua-pluginscript/topics/README.md.html
MIT License
308 stars 21 forks source link

get_overlapping_areas() Gets all Areas Regardless of Mask. #8

Closed Jamtoad closed 2 years ago

Jamtoad commented 2 years ago

Hi, me again! I also noticed that the Area2D:get_overlapping_areas() appears to get all overlapping areas regardless of mask.

I have the player on Layer 1, and masked to see layer 6. I also have an object on Layer 7.

It is picking up the object on layer 7, even know I do not have it checked. I have tested the same code in GDScript and it appears to get only the objects on layer 6. Whilst the Lua code gets objects on all layers.

Any ideas?

Thank you and have a good one!

gilzoide commented 2 years ago

Hello again!

Hmm, that's weird... The functionality should be the same regardless of scripting language, so my first guess is that you setup the objects and/or scene differently in your tests.

One test that you could do is write the exact same logic in Lua and GDScript and run each of them in the same object in your problematic scene. I really mean the same object. Try with one script first, see the error, then change the script in the same object to the other implementation and run again. I don't know if that's what you did already, but this is a way to isolate the scripts from other factors that could be causing the problem.

I won't discard that something in the plugin could be wrong, of course. Anything different is a potential cause for different behaviors. Programming, right? =P Without a reproduction project to debug this, it's difficult to think of more possibilities. Do you have/could you make a minimal project with a scene setup with the bug happening, that I could run and reproduce the problem?

Jamtoad commented 2 years ago

I did some more testing. I did realize my error. get_overlapping_areas() gets areas that have the layer as a mask too. So for example.

Object is on Layer 7 but has a mask for Layer 1 Player is on Layer 1 but has a mask for Layer 6

get_overlapping_areas() will return the object on Layer7 because its mask is for Layer 1. This is my issue I believe. Sorry for posting it here haha, the Godot Documentation doesn't really explain this part of it.

gilzoide commented 2 years ago

By the docs physics layers are bit masks. Maybe you changed stuff by code using the number 7, which would be 0b111, which in turn are layers 3, 2 and 1?

Sorry for posting it here

Don't worry ^^