A general-purpose, extensible and customizable C++ extension for Godot Engine.

Goost Logo

If something should be in Godot, let it be in Godot.

Goost: Godot Engine Extension

🐧 Linux 🍎 macOS 🎨 Windows 🤖 Android 🍏 iOS 🌐 JavaScript

Goost is a Godot Engine extension implemented as a C++ module. The extension consists of functional components and other modules, most of which should be optional to build.

See Goost official documentation for detailed instructions on how to use the extension and the list of currently implemented components. For a complete list of currently implemented classes, refer to Goost API.

Note that Goost is not an engine fork, please have a look at our development philosophy.

🔽 Binary downloads

Official binaries for the Godot + Goost editor and the export templates can be found on the Download page.


Goals 🎯

  • Complement the engine by implementing missing or not-yet-implemented functionality as seen useful by the Godot community, helping to prevent further engine bloat to a reasonable extent;
  • Provide additional core data structures, classes and methods to optimize performance-critical tasks in a general-purpose way for when GDScript or other languages are too slow, or when better integration is desired with existing libraries;
  • Expose, reuse, and build upon the engine's hidden built-in functionality typically unavailable to scripting;
  • Overcome engine limitations which may be difficult to do via script, especially when those limitations can be mitigated on the module level without having to maintain a custom version of the engine.

Non-goals 🌒

  • Solving project-specific problems. Consider alternative projects such as Godot Node Extensions instead.
  • Collecting arbitrary community C++ modules for the sake of it. Goost provides a separate project for this purpose in the goostengine/godot-modules repository, which also includes this extension as a git submodule.

Community channels 🎭

Join #goost Discord channel at the GEL Discord server for discussion and development updates.


Building 🏗

For testing and debugging purposes, build artifacts are uploaded for Linux, macOS, and Windows builds which can be downloaded manually for each recently built commit:

If the links provided by nightly.link above don't work, proceed to GitHub Actions tab (have to be logged in).

Compiling

git clone https://github.com/goostengine/goost --recurse-submodules
cd goost
python goost.py config # Optional, pick components to build.
scons

This will clone the Godot Engine repository and compile the engine with Goost. You'll find the resulting binaries at godot/bin directory relative to the Goost repository.

For more advanced compilation options, refer to Goost Installation documentation pages.

Development 🧱

See Contributing if you are interested in development and to find out what kind of features are accepted.

Writing and running tests

While not mandatory, developers are encouraged to write unit tests (or any tests for that matter) for any existing or new features. See tests for details.

After build, run tests with the following command:

python run.py tests

Writing and generating documentation

The documentation can be generated for new classes, and updated for existing ones. See the following official documentation pages for further instructions:

To easily generate new or update existing documentation, run:

python run.py doc

The editor command is also useful for manually checking and proof-reading the built-in documentation from within the editor, especially when you want to make sure that all references work as expected:

python run.py editor

Versioning and compatibility

There are separate branches which are targeted for specific Godot Engine's major version.

Regarding latest extension development version, switch to

  • gd3 branch for Godot 3.x
  • gd4 branch for Godot 4.x (does not exist yet).

Similarly, you may use any of the stable branches with a similar branch encoding, such as 1.0-gd3 or 1.0-gd4, if available.

Any new features are encouraged to be developed against the latest Godot Engine's stable version, which may be optionally ported to the latest engine's development version (independently or in sync, depending on priorities).

License 📝

Unless otherwise specified, the extension is released under the MIT license.

See the full list of third-party libraries with their licenses used by this extension at thirdparty/README.md.

Comments
  • Add `Graph` class

    Add `Graph` class

    Closes godotengine/godot-proposals#3848.

    Intended to implement a mixed graph data structure. Allows to add both associative (undirected) and directed edges, with multiple edges between a pair of vertices, and self-loops.

    func _ready():
    	var graph = Graph.new()
    
        var a: GraphVertex = graph.add_vertex("a")
        var b: GraphVertex = graph.add_vertex("b")
        var c: GraphVertex = graph.add_vertex("c")
    
        var ab: GraphEdge = graph.add_edge(a, b)
        var ac: GraphEdge = graph.add_edge(a, c)
        var bc: GraphEdge = graph.add_edge(b, c)
    
        print(graph.has_edge(a, b)) # Prints True
        print(graph.has_edge(b, a)) # Prints True
    

    (annotations are optional)

    To-do

    • [x] Handle self-loops (may be already working correctly).
    • [x] Provide essential algorithms for graph traversal.
      • [x] Fix DFS
        • https://www.banterly.net/2020/02/09/why-what-you-have-been-thaught-about-dfs-is-wrong-at-least-partially
        • https://11011110.github.io/blog/2013/12/17/stack-based-graph-traversal.html
        • https://gist.github.com/deyindra/165fa58efbf0a3a9d943
    • [x] Serialization
    • [ ] ... a whole lot of more stuff
  • Unable to compile with Mono on custom build

    Unable to compile with Mono on custom build

    Goost and Godot version: latest gd3 commit, and custom Godot build based on latest 3.x commit

    OS/platform/device including version:

    Arch Linux

    dotnet --list-sdks
    5.0.403 [/usr/share/dotnet/sdk]
    6.0.102 [/usr/share/dotnet/sdk]
    

    Issue description: I want to build Goost against my custom Godot build with Mono support. Compiling with mono glue enabled fails with the following errors:

    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshLibrary.cs(71,25): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_2_647' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshLibrary.cs(95,25): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_2_647' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshLibrary.cs(108,25): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_2_648' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshInstance.cs(158,32): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_0_476' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshLibrary.cs(144,86): error CS1503: Argomento 3: non è possibile convertire da 'int' a 'System.IntPtr' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshLibrary.cs(156,25): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_1_650' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshInstance.cs(194,32): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_1_634' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshInstance.cs(206,32): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_1_634' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshDataTool.cs(67,39): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_2_638' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    /home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/Generated/GodotObjects/MeshDataTool.cs(79,39): error CS0117: 'NativeCalls' non contiene una definizione per 'godot_icall_1_639' [/home/glitchedcode/repos/godot/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj]
    
    ... # and a  lot more of the same kind
    

    Steps to reproduce: Clone Goost and symlink custom godot source tree inside Goost local repository. Use scons as described in the Goost and Godot documentation for building from source: i compile with mono enabled and no glue, then i generate the glue, and then i recompile with glue.

    scons p=x11 target=release_debug tools=yes bits=64 module_mono_enabled=yes mono_glue=no -j8
    godot/bin/godot.x11.opt.tools.64.goost.mono --generate-mono-glue godot/modules/mono/glue
    scons p=x11 target=release_debug tools=yes bits=64 module_mono_enabled=yes mono_glue=yes-j8
    

    Is this issue reproducible in official Godot builds? No.

    Minimal reproduction project: N/A

  • Multiple crashes when using invalid code

    Multiple crashes when using invalid code

    Goost and Godot version: Version from actions 3.4.beta.custom_build. 71e30e303

    For now I can't find more(this isn't minimal code, but still should be helpful):

    	var temp_variable = ImageFrames.new()
    	temp_variable.get_frame_image(-20)
    	temp_variable.load(".", 4)
    	temp_variable.load_gif_from_buffer(PoolByteArray([]), -31)
    
    
    	var temp_variable = LinkedList.new()
    	temp_variable.swap(ClassDB.instance("ListNode"), null)
    	temp_variable.insert_after(null, Array([]))
    	temp_variable.erase(Array([]))
    	temp_variable.pop_front()
    	temp_variable.get_back()
    	temp_variable.insert_before(null, Array([]))
    	temp_variable.move_to_front(ClassDB.instance("ListNode"))
    	temp_variable.invert()
    	temp_variable.move_before(null, null)
    
    
    	var temp_variable = LinkedList.new()
    	temp_variable.pop_front()
    	temp_variable.invert()
    	temp_variable.find(Array([]))
    	temp_variable.push_front(Array([]))
    	temp_variable.pop_back()
    	temp_variable.remove(null)
    	temp_variable.clear()
    	temp_variable.size()
    	temp_variable.erase({"roman" : 22, 22 : 25, BoxShape.new() : BoxShape.new()})
    	temp_variable.move_to_front(ClassDB.instance("ListNode"))
    	temp_variable.get_front()
    	temp_variable.swap(ClassDB.instance("ListNode"), ClassDB.instance("ListNode"))
    
    	var temp_variable = LinkedList.new()
    	temp_variable.insert_before(null, Array([]))
    	temp_variable.sort()
    	temp_variable.insert_after(ClassDB.instance("ListNode"), Array([]))
    
    	var temp_variable = LinkedList.new()
    	temp_variable.get_elements()
    	temp_variable.empty()
    	temp_variable.remove(ClassDB.instance("ListNode"))
    	temp_variable.move_to_front(ClassDB.instance("ListNode"))
    	temp_variable.size()
    	temp_variable.erase(RigidBody.new())
    	temp_variable.move_to_back(null)
    
    
    var temp_variable = ClassDB.instance("Mixin")
    temp_variable.free() # cause GDScript bug
    
    	var temp_variable = LinkedList.new()
    	temp_variable.sort()
    	temp_variable.clear()
    	temp_variable.pop_front()
    	temp_variable.create_from(Camera.new())
    	temp_variable.size()
    	temp_variable.empty()
    	temp_variable.insert_before(ClassDB.instance("ListNode"), Array([]))
    
    
    	var temp_variable = LinkedList.new()
    	temp_variable.remove(ClassDB.instance("ListNode"))
    	temp_variable._iter_init(Array([]))
    	temp_variable._iter_next(Array([]))
    	temp_variable.erase(GradientTexture2D.new())
    	temp_variable.get_nodes()
    	temp_variable.move_to_front(null)
    
    
    	var temp_variable = ClassDB.instance("ListNode")
    	temp_variable.get_next()
    	temp_variable.erase() # This is probably cause of error from belov
    	temp_variable.set_value("1769126663") # GDScript error Attempted to run on null instance
    
    	var temp_variable = ClassDB.instance("_GodotSharp")
    	temp_variable.is_runtime_shutting_down()
    	temp_variable.detach_thread()
    	temp_variable.is_scripts_domain_loaded()
    	temp_variable.get_domain_id()
    
    

    Out of memory(not sure about it)

    	var temp_variable = ClassDB.instance("_GoostGeometry2D")
    	temp_variable.polygon_to_pixels(PoolVector2Array([Vector2(-0.143121, -4.830118), Vector2(-0.340626, 0.940199), Vector2(-0.657458, -0.753491), Vector2(-0.534295, -0.845298), Vector2(-0.661573, -4.117198), Vector2(-1.052691, 0.895295), Vector2(-1.672537, 1.051412), Vector2(-0.948645, -0.316341), Vector2(-0.757789, -0.392265), Vector2(1.104076, 2.547603)]))
    	temp_variable.polyline_to_pixels(PoolVector2Array([Vector2(-0.487021, 0.87339), Vector2(0.888258, 0.459344), Vector2(2.262319, -0.774596), Vector2(-0.463077, 0.886318), Vector2(2.589881, -0.21457), Vector2(-2.274473, -3.251533), Vector2(-0.262697, -0.964878), Vector2(-3.214366, -4.200902), Vector2(-0.603559, -0.797319), Vector2(-0.741167, 0.671321)]))
    	temp_variable.smooth_polyline_approx(PoolVector2Array([]), -4, -2.36875)
    	temp_variable.smooth_polyline(PoolVector2Array([Vector2(0.937638, 0.347613), Vector2(-0.696513, -0.717544), Vector2(0.86947, 2.836716), Vector2(-0.979038, 0.203677), Vector2(-4.794624, 0.407636), Vector2(-0.822897, 0.56819), Vector2(-4.252971, 0.873511), Vector2(-0.989352, 0.145541), Vector2(-0.664498, 3.515671), Vector2(-0.814789, 0.579758)]), -2.878688, -4.491194)
    	temp_variable.merge_polygons(PoolVector2Array([Vector2(-4.208767, -2.832814), Vector2(-0.052412, -0.998626), Vector2(4.181714, -0.992297), Vector2(-4.254827, 2.184231), Vector2(-0.866002, -0.500041), Vector2(-0.685228, -0.728328), Vector2(0.511056, -0.859547), Vector2(-1.929567, -1.889083), Vector2(0.657092, 0.75381), Vector2(-0.519035, 0.854753)]), PoolVector2Array([]))
    	temp_variable.deflate_polygon(PoolVector2Array([]), -4.064364)
    	temp_variable.regular_polygon(-1, -3.519635)
    	temp_variable.polyline_length(PoolVector2Array([Vector2(0.821733, 0.569872), Vector2(-0.922829, 0.38521), Vector2(0.567209, 0.823574), Vector2(1.489863, -2.884174), Vector2(0.794735, 0.606957), Vector2(-0.642562, -0.766234), Vector2(1.394489, -4.493158), Vector2(-0.990832, 0.135099), Vector2(1.389816, -3.419199), Vector2(-0.880176, 0.474648)]))
    	temp_variable.circle(0.999348, -4.449945)
    	temp_variable.polygon_area(PoolVector2Array([]))
    	temp_variable.simplify_polyline(PoolVector2Array([Vector2(-2.182464, -3.504493), Vector2(-2.662979, -1.333622), Vector2(2.71501, 1.567903), Vector2(-0.114241, 0.993453), Vector2(-2.696927, 0.361799), Vector2(0.022928, -4.308574), Vector2(-0.626539, -0.77939), Vector2(1.906821, 2.482972), Vector2(-0.593834, -0.804588), Vector2(3.386199, -3.342588)]), -2.473549)
    
    
    	var temp_variable = PolyDecomp2D.new()
    	temp_variable.new_instance()
    	temp_variable.triangulate_polygons(Array([]))
    	temp_variable.decompose_polygons(Array([]), 4)
    
    	var temp_variable = ClassDB.instance("_GodotSharp")
    	temp_variable._reload_assemblies(false)
    	temp_variable.is_domain_finalizing_for_unload(-1)
    
    
    	var temp_variable = ClassDB.instance("_GodotSharp")
    	temp_variable._reload_assemblies(false)
    	temp_variable.is_domain_finalizing_for_unload(1)
    	temp_variable.detach_thread()
    	temp_variable.attach_thread()
    
    
    	var temp_variable = ClassDB.instance("_GodotSharp")
    	temp_variable.is_runtime_initialized()
    	temp_variable.get_scripts_domain_id()
    	temp_variable._reload_assemblies(false)
    	temp_variable.get_scripts_domain_id()
    	temp_variable._reload_assemblies(false)
    	temp_variable.detach_thread()
    	temp_variable.is_scripts_domain_loaded()
    	temp_variable.detach_thread()
    
    

    Tracker

    • [x] #108
    • [x] #106
    • [x] Mixin: https://github.com/goostengine/goost/issues/105#issuecomment-893671364
    • [x] #107
    • [ ] GodotSharp (C#), likely Godot's issue: https://github.com/goostengine/goost/issues/105#issuecomment-883579126.
    • [x] https://github.com/godotengine/godot/pull/50640
  • Add Git version control editor plugin

    Add Git version control editor plugin

    image

    This integrates Git as a version control backend directly using C++ modules rather than GDNative. Initial implementation based on https://github.com/godotengine/godot-git-plugin, and adds https://github.com/libgit2/libgit2 as a submodule to Goost repository.

    Unfortunately, it's not possible to select the Git addon via editor interface manually, because the interface was implemented to work with scripts that implement VCS addons. Therefore, unlike GDNative version, the Git addon is initialized automatically here at runtime, without needing to manually to create and assign GDNative-like scripts, which is a nice byproduct.

    Additionally, it's not currently possible to use this plugin without patching the engine source. If you'd like to test this PR, you'll need to compile Goost with scons use_godot_patches=yes, this will apply misc/patches/editor_vcs_interface_virtual.patch, but should be possible once godotengine/godot#50219 is backported to 3.x.

    Some features are not currently available, like networking (some dependencies have to be satisfied for that), which would be needed for future push/pull functionalities, see godotengine/godot#39255.

    Currently tested on Windows (MSVC, MinGW) and Linux.

    Co-authored-by: @ChronicallySerious

    Why?

    The main purpose of having this implemented as a built-in module rather than GDNative plugin is that we'd like to have out-of-the-box experience using VCS. Currently, it takes a lot of steps to start using GDNative-based plugin (downloading the library, copying GDNative scripts). Moreover, if you use Godot as a prototyping tool a lot, you may certainly benefit from having VCS throughout any project.

    All you'll have to do is to download the editor and simply start using Git without having to setup GDNative-specific scripts, and it will work for all projects. Speaking of myself, I'd mainly find this kind of functionality useful for prototyping purposes, which allows me to keep the development history (oftentimes important at early development stages, in my experience, because I tend to trash code I think I won't need, but eventually some parts are still useful). Having to setup GDNative scripts for each new project goes against the idea of quick prototyping, for instance see my other repository https://github.com/godot-extended-libraries/godot-main.

    Because Godot is highly picky about what kind of third-party software it uses license-wise and size-wise, it cannot allow to integrate https://github.com/libgit2/libgit2 because it's licensed under GPLv2 license. Fortunately for Goost, it's should be still safe to use for editor builds because it's released with linking exception in the license (even Microsoft uses libgit2 for its Git extensions for Visual Studio). This is also the reason why https://github.com/godotengine/godot-git-plugin still integrates libgit2, but there are other reasons why it got implemented as a plugin, of course.

    To-do (the v1.0 version)

    • [x] Port godot-git plugin v1.x to C++ modules.
    • [x] Add a button to initialize git repository manually at Version Control menu option.
    • [x] Automatically enable git plugin for the project if git repository is already initialized at startup: godotengine/godot-git-plugin#40
    • [x] Do not create initial commit: godotengine/godot-git-plugin#23.
    • [x] Implement proper staging mechanism: godotengine/godot-git-plugin#54.

    May be fixable:

    • [ ] godotengine/godot#50427.
  • Multiple crashes when using invalid data

    Multiple crashes when using invalid data

    • [x] -
    ImageBlender.new().stamp_rect(Image.new(), Rect2(Vector2(-10.089389, 3.712648), Vector2(0.970958, -0.239249)), null, Vector2(0.627138, 0.778908), Vector2(-31.293953, 20.851303), -0.209764)
    
    core/image.cpp:1738:9: runtime error: member access within null pointer of type 'const struct Image'
    core/image.cpp:1738:9: runtime error: member access within null pointer of type 'const struct Image'
    handle_crash: Program crashed with signal 11
    Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
    [1] ./godot_server.x11.tools.64.goosts(+0x1bbd5e0e) [0x55c6f8603e0e] (??:0)
    [2] /lib/x86_64-linux-gnu/libc.so.6(+0x41040) [0x7fe611c31040] (??:0)
    [3] PoolVector<unsigned char>::_reference(PoolVector<unsigned char> const&) (??:0)
    [4] PoolVector<unsigned char>::PoolVector(PoolVector<unsigned char> const&) (??:0)
    [5] Image::get_data() const (??:0)
    [6] ImageBlender::blend_rect(Ref<Image>, Rect2 const&, Ref<Image>, Vector2 const&) const (??:0)
    [7] ImageBlender::stamp_rect(Ref<Image>, Rect2 const&, Ref<Image>, Vector2 const&, Vector2 const&, float) const (??:0)
    [8] MethodBind6C<Ref<Image>, Rect2 const&, Ref<Image>, Vector2 const&, Vector2 const&, float>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [9] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [10] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [11] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [12] GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) (??:0)
    [13] Node::_notification(int) (??:0)
    [14] Node::_notificationv(int, bool) (??:0)
    [15] CanvasItem::_notificationv(int, bool) (??:0)
    [16] Node2D::_notificationv(int, bool) (??:0)
    [17] Object::notification(int, bool) (??:0)
    [18] SceneTree::_notify_group_pause(StringName const&, int) (??:0)
    [19] SceneTree::idle(float) (??:0)
    [20] Main::iteration() (??:0)
    [21] OS_Server::run() (??:0)
    [22] ./godot_server.x11.tools.64.goosts(main+0x276) [0x55c6f85c396f] (??:0)
    [23] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xd5) [0x7fe611c18565] (??:0)
    [24] ./godot_server.x11.tools.64.goosts(_start+0x2e) [0x55c6f85c363e] (??:0)
    
    • [x] -
    ImageBlender.new().stamp_rect(ClassDB.instance("VisualShaderNodeVectorOp"), Rect2(Vector2(-10.089389, 3.712648), Vector2(0.970958, -0.239249)), null, Vector2(0.627138, 0.778908), Vector2(-31.293953, 20.851303), -0.209764)
    

    shows infinite spam of

    ERROR: It's not a reference to a valid Image object.
       at: blend_rect (/home/runner/work/goost/goost/core/image/image_blender.cpp:89)
    ERROR: It's not a reference to a valid Image object.
       at: blend_rect (/home/runner/work/goost/goost/core/image/image_blender.cpp:89)
    ERROR: It's not a reference to a valid Image object.
       at: blend_rect (/home/runner/work/goost/goost/core/image/image_blender.cpp:89)
    ERROR: It's not a reference to a valid Image object.
       at: blend_rect (/home/runner/work/goost/goost/core/image/image_blender.cpp:89)
    ERROR: It's not a reference to a valid Image object.
       at: blend_rect (/home/runner/work/goost/goost/core/image/image_blender.cpp:89)
    
    • [x] -
    ClassDB.instance("_GoostImage").get_centroid(null)
    
    
    /home/runner/work/goost/goost/core/image/goost_image.cpp:523:25: runtime error: member call on null pointer of type 'struct Image'
    /home/runner/work/goost/goost/core/image/goost_image.cpp:523:25: runtime error: member access within null pointer of type 'struct Image'
    handle_crash: Program crashed with signal 11
    Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
    [1] ./godot_server.x11.tools.64.goosts(+0x1bbd5e0e) [0x564e186f5e0e] (??:0)
    [2] /lib/x86_64-linux-gnu/libc.so.6(+0x41040) [0x7f726a47c040] (??:0)
    [3] pix_create_from_image(Ref<Image>) (??:0)
    [4] GoostImage::get_centroid(Ref<Image> const&) (??:0)
    [5] _GoostImage::get_centroid(Ref<Image> const&) (??:0)
    [6] MethodBind1R<Vector2, Ref<Image> const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [7] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [8] Object::callv(StringName const&, Array const&) (??:0)
    [9] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [10] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [11] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [12] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [13] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [14] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [15] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [16] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [17] GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) (??:0)
    [18] Node::_notification(int) (??:0)
    [19] Node::_notificationv(int, bool) (??:0)
    [20] Object::notification(int, bool) (??:0)
    [21] SceneTree::_notify_group_pause(StringName const&, int) (??:0)
    [22] SceneTree::idle(float) (??:0)
    [23] Main::iteration() (??:0)
    [24] OS_Server::run() (??:0)
    [25] ./godot_server.x11.tools.64.goosts(main+0x276) [0x564e186b596f] (??:0)
    [26] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xd5) [0x7f726a463565] (??:0)
    [27] ./godot_server.x11.tools.64.goosts(_start+0x2e) [0x564e186b563e] (??:0)
    
    • [x] -
    ClassDB.instance("_GoostImage").get_pixelv_or_null(BoneAttachment.new(), Vector2(23.417997, -25.748629))
    
    /home/runner/work/goost/goost/core/image/goost_image.cpp:507:38: runtime error: member call on null pointer of type 'struct Image'
    /home/runner/work/goost/goost/core/image/goost_image.cpp:507:38: runtime error: member access within null pointer of type 'struct Image'
    handle_crash: Program crashed with signal 11
    Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
    [1] ./godot_server.x11.tools.64.goosts(+0x1bbd5e0e) [0x563dce51ee0e] (??:0)
    [2] /lib/x86_64-linux-gnu/libc.so.6(+0x41040) [0x7f20640f9040] (??:0)
    [3] GoostImage::get_pixel_or_null(Ref<Image>, int, int, Color*) (??:0)
    [4] _GoostImage::get_pixel_or_null(Ref<Image>, int, int) (??:0)
    [5] _GoostImage::get_pixelv_or_null(Ref<Image>, Vector2 const&) (??:0)
    [6] MethodBind2R<Variant, Ref<Image>, Vector2 const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [7] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [8] Object::callv(StringName const&, Array const&) (??:0)
    [9] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [10] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [11] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [12] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [13] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [14] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [15] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [16] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [17] GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) (??:0)
    [18] Node::_notification(int) (??:0)
    [19] Node::_notificationv(int, bool) (??:0)
    [20] Object::notification(int, bool) (??:0)
    [21] SceneTree::_notify_group_pause(StringName const&, int) (??:0)
    [22] SceneTree::idle(float) (??:0)
    [23] Main::iteration() (??:0)
    [24] OS_Server::run() (??:0)
    [25] ./godot_server.x11.tools.64.goosts(main+0x276) [0x563dce4de96f] (??:0)
    [26] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xd5) [0x7f20640e0565] (??:0)
    [27] ./godot_server.x11.tools.64.goosts(_start+0x2e) [0x563dce4de63e] (??:0)
    
    • [x] -
    ClassDB.instance("_GoostImage").replace_color(null, Color(17.652136, -8.616531, 45.57032, 1), Color(-0.469005, -9.382105, 26.429802, 1))
    
    
    /home/runner/work/goost/goost/core/image/goost_image.cpp:19:15: runtime error: member call on null pointer of type 'struct Image'
    /home/runner/work/goost/goost/core/image/goost_image.cpp:19:15: runtime error: member access within null pointer of type 'struct Image'
    handle_crash: Program crashed with signal 11
    Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
    [1] ./godot_server.x11.tools.64.goosts(+0x1bbd5e0e) [0x55a3adc26e0e] (??:0)
    [2] /lib/x86_64-linux-gnu/libc.so.6(+0x41040) [0x7fafc6b09040] (??:0)
    [3] GoostImage::replace_color(Ref<Image>, Color const&, Color const&) (??:0)
    [4] _GoostImage::replace_color(Ref<Image>, Color const&, Color const&) (??:0)
    [5] MethodBind3<Ref<Image>, Color const&, Color const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [6] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [7] Object::callv(StringName const&, Array const&) (??:0)
    [8] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [9] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [10] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [11] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [12] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [13] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [14] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [15] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [16] GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) (??:0)
    [17] Node::_notification(int) (??:0)
    [18] Node::_notificationv(int, bool) (??:0)
    [19] Object::notification(int, bool) (??:0)
    [20] SceneTree::_notify_group_pause(StringName const&, int) (??:0)
    [21] SceneTree::idle(float) (??:0)
    [22] Main::iteration() (??:0)
    [23] OS_Server::run() (??:0)
    [24] ./godot_server.x11.tools.64.goosts(main+0x276) [0x55a3adbe696f] (??:0)
    [25] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xd5) [0x7fafc6af0565] (??:0)
    [26] ./godot_server.x11.tools.64.goosts(_start+0x2e) [0x55a3adbe663e] (??:0)
    
    
    • [x] -
    ClassDB.instance("_GoostImage").rotate_180(null)
    
    /home/runner/work/goost/goost/core/image/goost_image.cpp:523:25: runtime error: member call on null pointer of type 'struct Image'
    /home/runner/work/goost/goost/core/image/goost_image.cpp:523:25: runtime error: member access within null pointer of type 'struct Image'
    handle_crash: Program crashed with signal 11
    Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
    [1] ./godot_server.x11.tools.64.goosts(+0x1bbd5e0e) [0x55d5a107de0e] (??:0)
    [2] /lib/x86_64-linux-gnu/libc.so.6(+0x41040) [0x7f437d958040] (??:0)
    [3] pix_create_from_image(Ref<Image>) (??:0)
    [4] GoostImage::rotate_180(Ref<Image>) (??:0)
    [5] _GoostImage::rotate_180(Ref<Image>) (??:0)
    [6] MethodBind1<Ref<Image> >::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [7] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [8] Object::callv(StringName const&, Array const&) (??:0)
    [9] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [10] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [11] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [12] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [13] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [14] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [15] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [16] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [17] GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) (??:0)
    [18] Node::_notification(int) (??:0)
    [19] Node::_notificationv(int, bool) (??:0)
    [20] Object::notification(int, bool) (??:0)
    [21] SceneTree::_notify_group_pause(StringName const&, int) (??:0)
    [22] SceneTree::idle(float) (??:0)
    [23] Main::iteration() (??:0)
    [24] OS_Server::run() (??:0)
    [25] ./godot_server.x11.tools.64.goosts(main+0x276) [0x55d5a103d96f] (??:0)
    [26] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xd5) [0x7f437d93f565] (??:0)
    [27] ./godot_server.x11.tools.64.goosts(_start+0x2e) [0x55d5a103d63e] (??:0)
    
    
    • [x] -
    ClassDB.instance("_GoostImage").rotate_90(null, 31)
    
    /home/runner/work/goost/goost/core/image/goost_image.cpp:523:25: runtime error: member call on null pointer of type 'struct Image'
    /home/runner/work/goost/goost/core/image/goost_image.cpp:523:25: runtime error: member access within null pointer of type 'struct Image'
    handle_crash: Program crashed with signal 11
    Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
    [1] ./godot_server.x11.tools.64.goosts(+0x1bbd5e0e) [0x558918782e0e] (??:0)
    [2] /lib/x86_64-linux-gnu/libc.so.6(+0x41040) [0x7f1e4d719040] (??:0)
    [3] pix_create_from_image(Ref<Image>) (??:0)
    [4] GoostImage::rotate_90(Ref<Image>, GoostImage::Direction) (??:0)
    [5] _GoostImage::rotate_90(Ref<Image>, _GoostImage::Direction) (??:0)
    [6] MethodBind2<Ref<Image>, _GoostImage::Direction>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [7] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [8] Object::callv(StringName const&, Array const&) (??:0)
    [9] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [10] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [11] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [12] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [13] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [14] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [15] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [16] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [17] GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) (??:0)
    [18] Node::_notification(int) (??:0)
    [19] Node::_notificationv(int, bool) (??:0)
    [20] Object::notification(int, bool) (??:0)
    [21] SceneTree::_notify_group_pause(StringName const&, int) (??:0)
    [22] SceneTree::idle(float) (??:0)
    [23] Main::iteration() (??:0)
    [24] OS_Server::run() (??:0)
    [25] ./godot_server.x11.tools.64.goosts(main+0x276) [0x55891874296f] (??:0)
    [26] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xd5) [0x7f1e4d700565] (??:0)
    [27] ./godot_server.x11.tools.64.goosts(_start+0x2e) [0x55891874263e] (??:0)
    
    
    • [x] -
    A lot of Different GoostImage functions in which I provided null instead Ref<Image>
    
    • [x] -
    ImageBlender.new().blend_rect(ImageIndexed.new(), Rect2(Vector2(-0.985461, -0.169902), Vector2(19.584143, -35.30558)), null, Vector2(-47.611492, 8.21293))
    
    [1] ./godot_server.x11.tools.64.goosts(+0x1bbd5e0e) [0x564230917e0e] (??:0)
    [2] /lib/x86_64-linux-gnu/libc.so.6(+0x41040) [0x7f246cbf5040] (??:0)
    [3] PoolVector<unsigned char>::_reference(PoolVector<unsigned char> const&) (??:0)
    [4] PoolVector<unsigned char>::PoolVector(PoolVector<unsigned char> const&) (??:0)
    [5] Image::get_data() const (??:0)
    [6] ImageBlender::blend_rect(Ref<Image>, Rect2 const&, Ref<Image>, Vector2 const&) const (??:0)
    [7] MethodBind4C<Ref<Image>, Rect2 const&, Ref<Image>, Vector2 const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [8] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [9] Object::callv(StringName const&, Array const&) (??:0)
    [10] MethodBind2R<Variant, StringName const&, Array const&>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [11] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [12] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [13] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [14] GDScriptInstance::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [15] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [16] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [17] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [18] GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) (??:0)
    [19] Node::_notification(int) (??:0)
    [20] Node::_notificationv(int, bool) (??:0)
    [21] Object::notification(int, bool) (??:0)
    [22] SceneTree::_notify_group_pause(StringName const&, int) (??:0)
    [23] SceneTree::idle(float) (??:0)
    [24] Main::iteration() (??:0)
    [25] OS_Server::run() (??:0)
    [26] ./godot_server.x11.tools.64.goosts(main+0x276) [0x5642308d796f] (??:0)
    [27] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xd5) [0x7f246cbdc565] (??:0)
    [28] ./godot_server.x11.tools.64.goosts(_start+0x2e) [0x5642308d763e] (??:0)
    
    
    • [x] -
    
    	var temp_variable = LinkedList.new()
    	temp_variable.push_front(Array([]))
    	temp_variable._iter_init(Array([]))
    	temp_variable.create_from(Array([]))
    	temp_variable._iter_get(Array([]))
    
    ==28513==ERROR: AddressSanitizer: heap-use-after-free on address 0x612000130f48 at pc 0x561dcfb6a676 bp 0x7fff72db2700 sp 0x7fff72db26f0
    READ of size 4 at 0x612000130f48 thread T0
        #0 0x561dcfb6a675 in Variant::reference(Variant const&) core/variant.cpp:817
        #1 0x561dcfb8ff56 in Variant::Variant(Variant const&) core/variant.cpp:2532
        #2 0x561dc556d053 in ListNode::get_value() /home/runner/work/goost/goost/core/types/linked_list.h:39
        #3 0x561dc5569123 in LinkedList::_iter_get(Variant const&) /home/runner/work/goost/goost/core/types/linked_list.cpp:382
        #4 0x561dc4ab731e in MethodBind1R<Variant, Variant const&>::call(Object*, Variant const**, int, Variant::CallError&) core/method_bind.gen.inc:961
        #5 0x561dcf94e760 in Object::call(StringName const&, Variant const**, int, Variant::CallError&) core/object.cpp:918
        #6 0x561dcfbdb5db in Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) core/variant_call.cpp:1173
        #7 0x561dc4a6d8f1 in GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) modules/gdscript/gdscript_function.cpp:1034
        #8 0x561dc4898341 in GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) modules/gdscript/gdscript.cpp:1166
        #9 0x561dca4021a1 in Node::_notification(int) scene/main/node.cpp:56
        #10 0x561dc4782ff1 in Node::_notificationv(int, bool) scene/main/node.h:45
        #11 0x561dc47854a5 in CanvasItem::_notificationv(int, bool) scene/2d/canvas_item.h:162
        #12 0x561dc5918c1f in Node2D::_notificationv(int, bool) scene/2d/node_2d.h:37
        #13 0x561dcf94ebfc in Object::notification(int, bool) core/object.cpp:927
        #14 0x561dca544483 in SceneTree::_notify_group_pause(StringName const&, int) scene/main/scene_tree.cpp:973
        #15 0x561dca5347f2 in SceneTree::idle(float) scene/main/scene_tree.cpp:528
        #16 0x561dc45ce5e1 in Main::iteration() main/main.cpp:2143
        #17 0x561dc44c26d2 in OS_Server::run() platform/server/os_server.cpp:202
        #18 0x561dc44bb96e in main platform/server/godot_server.cpp:42
        #19 0x7fc640e42564 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x28564)
        #20 0x561dc44bb63d in _start (/home/rafal/Downloads/godot_server.x11.tools.64.goosts+0x1bb9563d)
    
    0x612000130f48 is located 264 bytes inside of 312-byte region [0x612000130e40,0x612000130f78)
    freed by thread T0 here:
        #0 0x7fc641bfc7df in __interceptor_free ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:122
        #1 0x561dcfeae7ee in Memory::free_static(void*, bool) core/os/memory.cpp:168
        #2 0x561dc5572498 in void memdelete<ListNode>(ListNode*) core/os/memory.h:118
        #3 0x561dc556937b in LinkedList::clear() /home/runner/work/goost/goost/core/types/linked_list.cpp:387
        #4 0x561dc5556daf in LinkedList::create_from(Variant const&) /home/runner/work/goost/goost/core/types/linked_list.cpp:31
        #5 0x561dc5592c19 in MethodBind1<Variant const&>::call(Object*, Variant const**, int, Variant::CallError&) core/method_bind.gen.inc:775
        #6 0x561dcf94e760 in Object::call(StringName const&, Variant const**, int, Variant::CallError&) core/object.cpp:918
        #7 0x561dcfbdb5db in Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) core/variant_call.cpp:1173
        #8 0x561dc4a6d8f1 in GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) modules/gdscript/gdscript_function.cpp:1034
        #9 0x561dc4898341 in GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) modules/gdscript/gdscript.cpp:1166
        #10 0x561dca4021a1 in Node::_notification(int) scene/main/node.cpp:56
        #11 0x561dc4782ff1 in Node::_notificationv(int, bool) scene/main/node.h:45
        #12 0x561dc47854a5 in CanvasItem::_notificationv(int, bool) scene/2d/canvas_item.h:162
        #13 0x561dc5918c1f in Node2D::_notificationv(int, bool) scene/2d/node_2d.h:37
        #14 0x561dcf94ebfc in Object::notification(int, bool) core/object.cpp:927
        #15 0x561dca544483 in SceneTree::_notify_group_pause(StringName const&, int) scene/main/scene_tree.cpp:973
        #16 0x561dca5347f2 in SceneTree::idle(float) scene/main/scene_tree.cpp:528
        #17 0x561dc45ce5e1 in Main::iteration() main/main.cpp:2143
        #18 0x561dc44c26d2 in OS_Server::run() platform/server/os_server.cpp:202
        #19 0x561dc44bb96e in main platform/server/godot_server.cpp:42
        #20 0x7fc640e42564 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x28564)
    
    previously allocated by thread T0 here:
        #0 0x7fc641bfcbd8 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144
        #1 0x561dcfead7ab in Memory::alloc_static(unsigned long, bool) core/os/memory.cpp:75
        #2 0x561dcfead6bc in operator new(unsigned long, char const*) core/os/memory.cpp:40
        #3 0x561dc5558ccb in LinkedList::push_front(Variant const&) /home/runner/work/goost/goost/core/types/linked_list.cpp:92
        #4 0x561dc558e42b in MethodBind1R<ListNode*, Variant const&>::call(Object*, Variant const**, int, Variant::CallError&) core/method_bind.gen.inc:961
        #5 0x561dcf94e760 in Object::call(StringName const&, Variant const**, int, Variant::CallError&) core/object.cpp:918
        #6 0x561dcfbdb5db in Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) core/variant_call.cpp:1173
        #7 0x561dc4a6d8f1 in GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) modules/gdscript/gdscript_function.cpp:1034
        #8 0x561dc4898341 in GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) modules/gdscript/gdscript.cpp:1166
        #9 0x561dca4021a1 in Node::_notification(int) scene/main/node.cpp:56
        #10 0x561dc4782ff1 in Node::_notificationv(int, bool) scene/main/node.h:45
        #11 0x561dc47854a5 in CanvasItem::_notificationv(int, bool) scene/2d/canvas_item.h:162
        #12 0x561dc5918c1f in Node2D::_notificationv(int, bool) scene/2d/node_2d.h:37
        #13 0x561dcf94ebfc in Object::notification(int, bool) core/object.cpp:927
        #14 0x561dca544483 in SceneTree::_notify_group_pause(StringName const&, int) scene/main/scene_tree.cpp:973
        #15 0x561dca5347f2 in SceneTree::idle(float) scene/main/scene_tree.cpp:528
        #16 0x561dc45ce5e1 in Main::iteration() main/main.cpp:2143
        #17 0x561dc44c26d2 in OS_Server::run() platform/server/os_server.cpp:202
        #18 0x561dc44bb96e in main platform/server/godot_server.cpp:42
        #19 0x7fc640e42564 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x28564)
    
    
    • [x] -
    	var temp_variable = ImageFrames.new()
    	temp_variable.add_frame(null, -46.891228, -16)
    	temp_variable.save_gif("3857695334", -28)
    
    
    /home/runner/work/goost/goost/modules/gif/image_frames.cpp:67:32: runtime error: member call on null pointer of type 'const struct Image'
    /home/runner/work/goost/goost/modules/gif/image_frames.cpp:67:32: runtime error: member access within null pointer of type 'const struct Image'
    handle_crash: Program crashed with signal 11
    Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
    [1] ./godot_server.x11.tools.64.goosts(+0x1bbd5e0e) [0x564827199e0e] (??:0)
    [2] /lib/x86_64-linux-gnu/libc.so.6(+0x41040) [0x7ff79295b040] (??:0)
    [3] ImageFrames::save_gif(String const&, int) (??:0)
    [4] MethodBind2R<Error, String const&, int>::call(Object*, Variant const**, int, Variant::CallError&) (??:0)
    [5] Object::call(StringName const&, Variant const**, int, Variant::CallError&) (??:0)
    [6] Variant::call_ptr(StringName const&, Variant const**, int, Variant*, Variant::CallError&) (??:0)
    [7] GDScriptFunction::call(GDScriptInstance*, Variant const**, int, Variant::CallError&, GDScriptFunction::CallState*) (??:0)
    [8] GDScriptInstance::call_multilevel(StringName const&, Variant const**, int) (??:0)
    [9] Node::_notification(int) (??:0)
    [10] Node::_notificationv(int, bool) (??:0)
    [11] CanvasItem::_notificationv(int, bool) (??:0)
    [12] Node2D::_notificationv(int, bool) (??:0)
    [13] Object::notification(int, bool) (??:0)
    [14] SceneTree::_notify_group_pause(StringName const&, int) (??:0)
    [15] SceneTree::idle(float) (??:0)
    [16] Main::iteration() (??:0)
    [17] OS_Server::run() (??:0)
    [18] ./godot_server.x11.tools.64.goosts(main+0x276) [0x56482715996f] (??:0)
    [19] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xd5) [0x7ff792942565] (??:0)
    [20] ./godot_server.x11.tools.64.goosts(_start+0x2e) [0x56482715963e] (??:0)
    
  • Files that incorrectly have the .jpg/jpeg extension cause editor/instance to crash (on 64bit?)

    Files that incorrectly have the .jpg/jpeg extension cause editor/instance to crash (on 64bit?)

    Goost and Godot version: Goost windows v1.0 stable

    OS/device including version: Windows 10 Version 1909

    Issue description: Attempting to import (through editor or code) a non-jpeg file that has the .jpg/jpeg extension will cause the editor/running instance to crash.

    This happens on these versions: Godot_v3.3.2-stable.goost_v1.0-stable_mono_win64.zip Godot_v3.3.2-stable.goost_v1.0-stable_win64.exe.zip

    Whereas on these versions it will correctly display a red X for the icon / fail with an error: Godot_v3.3.2-stable.goost_v1.0-stable_win32.exe.zip Godot_v3.3.2-stable.goost_v1.0-stable_mono_win32.zip

    Note that I tested the other supported formats and it seems only the .jpeg/jpg extension causes this to happen.

    Steps to reproduce: Change the extension of a file that is not a jpeg to .jpg/.jpeg Try to import it in the editor. Or try to load it in a script with Image.load()

    Minimal reproduction project: If the import attempt was done in the editor instead of code, then the project will fail to start until the offending file(s) are removed from its directory. Here is a (not) jpg for testing (a text file that says TEST) : ttt

    jpeg-crash.zip

  • Added `Random::decision()` which returns a bool based on a given probability

    Added `Random::decision()` which returns a bool based on a given probability

    I often use something like randf() < 0.33 to do something based on a given probability. This PR adds this functionality to Random. Not sure about the function name. It makes sense to me, but if you have a different suggestion i can change it of course.

  • Compilation failed if the Godot repo already exists in the same folder as Goost

    Compilation failed if the Godot repo already exists in the same folder as Goost

    Goost and Godot version: gd3 f2ed253ddd12328ad93d14a99531442c099315fa

    OS/device including version: Manjaro Linux and Windows

    Issue description: I can't compile Goost. This is a Linux example but it looks similar on Windows. I'm using Python 3.9.1 and Scons 4.1.0:

    scons: Reading SConscript files ...
    Configuring Goost module ...
    Building Godot with Goost ...
    scons: Reading SConscript files ...
    Automatically detected platform: linuxbsd
    Build option 'custom_modules' must point to a directory with modules, not a single module.
    CalledProcessError: Command '['scons', 'profile=/home/mbr/Projects/goost/modules/modules_config_gen.py', 'custom_modules=/home/mbr/Projects/goost', 'extra_suffix=goost']' returned non-zero exit status 255.:
      File "/home/mbr/Projects/goost/SConstruct", line 220:
        run(env.build_args, godot_dir.abspath)
      File "/home/mbr/Projects/goost/SConstruct", line 92:
        return subprocess.run(args, check=True, cwd=dir).returncode
      File "/usr/lib/python3.9/subprocess.py", line 524:
        raise CalledProcessError(retcode, process.args,
    

    Here i'm in /home/mbr/Projects/goost. If i clone the project directly into my home directory it builds without problems.

    Steps to reproduce: Just follow the compile instructions in the Readme while beeing in a subdirectory of the home dir:

    git clone https://github.com/goostengine/goost
    cd goost
    scons
    
  • Goost not building from source with default installation instructions on Linux Ubuntu

    Goost not building from source with default installation instructions on Linux Ubuntu

    Goost and Godot version:

    Default version from following installation instructions: git clone https://github.com/goostengine/goost --recurse-submodules

    OS/platform/device including version:

    Linux quasar 5.4.0-122-generic #138-Ubuntu SMP Wed Jun 22 15:00:31 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

    Linux Mint Cinnamon on HP Spectre

    Issue description:

    $ scons
    ...
    /home/hanumanji/Documents/goost/core/types/graph.cpp:578:27:   required from here
    /home/hanumanji/Documents/goost/core/types/templates/priority_queue.h:62:10: error: ambiguous overload for 'operator=' (operand types are 'LocalVector<GraphVertex*, int, false>' and 'const LocalVector<GraphVertex*, unsigned int, false>')
       62 |   vector = p_elements;
          |   ~~~~~~~^~~~~~~~~~~~
    In file included from ./core/pooled_list.h:55,
                     from ./core/rid_handle.h:36,
                     from ./core/rid.h:36,
                     from ./core/ref_ptr.h:40,
                     from ./core/variant.h:49,
                     from ./core/method_ptrcall.h:36,
                     from ./core/method_bind.h:35,
                     from ./core/class_db.h:34,
                     from ./core/resource.h:34,
                     from /home/hanumanji/Documents/goost/core/types/graph.h:3,
                     from /home/hanumanji/Documents/goost/core/types/graph.cpp:1:
    ./core/local_vector.h:290:22: note: candidate: 'LocalVector<T, U, force_trivial>& LocalVector<T, U, force_trivial>::operator=(const Vector<T>&) [with T = GraphVertex*; U = int; bool force_trivial = false]'
      290 |  inline LocalVector &operator=(const Vector<T> &p_from) {
          |                      ^~~~~~~~
    ./core/local_vector.h:297:22: note: candidate: 'LocalVector<T, U, force_trivial>& LocalVector<T, U, force_trivial>::operator=(const PoolVector<T>&) [with T = GraphVertex*; U = int; bool force_trivial = false]'
      297 |  inline LocalVector &operator=(const PoolVector<T> &p_from) {
          |                      ^~~~~~~~
    [Initial build] Compiling ==> /home/hanumanji/Documents/goost/scene/audio/register_audio_types.cpp
    scons: *** [/home/hanumanji/Documents/goost/core/types/graph.x11.tools.64.goost.o] Error 1
    scons: building terminated because of errors.
    [Time elapsed: 00:00:10.652]
    

    Steps to reproduce:

    Follow default compile from source instructions:

     2109  git clone https://github.com/goostengine/goost --recurse-submodules
     2110  cd goost/
     2111  python goost.py config
     2112  scons
    

    Is this issue reproducible in official Godot builds?

    I can build from godot on master branch without problems, so it's not obviously my toolchain causing issues (I think?).

    Minimal reproduction project:

    Again, just the default instructions are failing me in my environment.

  • Initial work for updated Git plugin API

    Initial work for updated Git plugin API

    Just restoring current functionality. Push/pull may be implemented later.

    image

    Code updates adapted from godotengine/godot-git-plugin#84. Thanks @ChronicallySerious for ensuring that the API is possible to use via C++ modules (needed for Goost).

  • Add doubly `LinkedList` implementation to expose to scripting

    Add doubly `LinkedList` implementation to expose to scripting

    Closes godotengine/godot#7194. Helps godot-extended-libraries/godot-ideas#11.

    Introduces LinkedList and ListNode classes, which are mostly an instantiation of built-in List<Variant> template/datatype.

    To-do

    • [x] Port all existing List builtin methods.
    • [x] Make ListNode compatible with Variant, done locally but submitted godotengine/godot#42060 as well.
    • [x] Override _init()? Not sure if possible to do via C++ modules, not documented. Done by implementing create_from method instead, which seems to be an existing naming convention used by other methods in Godot.
    • [x] Override to_string() for print(list), should be possible with godotengine/godot#42093.
    • [x] Custom iterators, done but with performance issues: godotengine/godot#42053.
    • [x] Rename LinkedList to List, likely not possible as it conflicts with the built-in List<T> and there's no way of resolving that using namespaces either because those Godot macros assume they don't exist in C++, namely GDCLASS doesn't get expanded inside namespaces.
    • [x] Write documentation.
    • [x] Create editor icons.

    Godot proposal: godotengine/godot-proposals#1522.

  • Implement APNG support in Goost.

    Implement APNG support in Goost.

    Describe the problem you are having in your project Summary:

    • GIF is old and I'm trying to load a APNG, but Godot as well as Goost doesn't seem to support APNG.

    Detail:

    • Hi. I'm looking for a way to import APNG instead of GIF, due the format being old and doesn't support the colors I'm using and just doesn't seem to work.
    • I feel like this is an XY problem, so here's the X problem, due to lower processing capacity of mobiles I am unable to play ogv files in Mobile, due to this reason, I was looking for alternatives and found GIF, which after trying to get it to work, wasn't a good alternative for OGV for mobiles. The GIF was also slow and laggy when run from the debug build.

    Describe the feature and how it helps to overcome the problem As I said earlier, this is a XY problem, so there are two choices.

    1. Improve the OGV file rendering on mobiles.
    2. Add APNG Support (I'm going for this one.)

    Adding APNG support is best solution to this problem, but you could choose 1 and improve the OGV support for mobiles.

    Describe how your proposal will work, with code, pseudo-code, mockups, and/or diagrams I am yet to think about it, but it will work the same way as GIF but a little better.

    Is the feature helps to resolve performance-critical tasks? No.

    Is the feature exposes existing functionality in Godot? No.

    What alternatives have you considered before? Using GIF, but since it's old and doesn't support transparency and other things that I need. I'm looking for APNG as an alternative.

    Is there a reason why this should be in Goost and not in Godot? Links to some Godot Proposals: godotengine/godot-proposals#475 godotengine/godot-proposals#3083

  • Goost 1.1 codesigning crash on Mac (arm64)

    Goost 1.1 codesigning crash on Mac (arm64)

    Goost and Godot version: Godot 3.4 stable + Goost 1.1

    OS/platform/device including version: macOS Big Sur 2020 Mac Mini M1

    Issue description: I've been using Goost 1.0 with Godot 3.3.2 successfully, now trying to update to Godot 3.4 with Goost 1.1. Upon first trying to open the app, as expected I got the error "Godot is damaged and can't be opened" (#94).

    But after running the necessary command to get around that, opening Godot Goost results in an immediate crash:

    Screen Shot 2021-11-08 at 9 54 22 AM

    Steps to reproduce: open Godot 3.4 with Goost 1.1 on Mac (I guess)

    Is this issue reproducible in official Godot builds? no

    Minimal reproduction project: N/A

  • `Internal Script Error! - opcode #13 (report please).` when specifying variable type

    `Internal Script Error! - opcode #13 (report please).` when specifying variable type

    Goost and Godot version:

    Godot_v3.3.2-stable.goost_v1.0-stable_osx.universal

    Issue description:

    I'm typing var pb below with PolyBoolean2D, which causes an error. If I remove the type, all is fine. Am I doing something wrongly?

    extends Node2D
    
    # this works
    var pb
    
    # this causes the error
    # var pb: PolyBoolean2D
    
    # Godot built-in types work:
    var t: Tween
    
    func _ready():
    	pb = PolyBoolean2D.new_instance()
    	pb.parameters.strictly_simple = true
    	t = Tween.new()
    

    Running this with the offending line uncommented triggers the debugger on line 1.

    Further output:

    Screenshot 2021-09-20 at 21 04 37

    Further errors:

    Screenshot 2021-09-20 at 21 05 24

    Steps to reproduce:

    On Mac, have a simple node, with the above content in a script, then run.

    Is this issue reproducible in official Godot builds?

    No, as it uses the Goost API, and won't be available.

    Minimal reproduction project:

    godot-goost-bugreport.zip

  • A list of experimental, deprecated and removed features in Goost

    A list of experimental, deprecated and removed features in Goost

    This is a list of features that are implemented in Goost as experimental (to gather user feedback), deprecated, obsolete, and removed features. See Feature removal policy documentation for more explanations.

    If you're looking for implementing new features, refer to #7.

    Experimental or work-in-progress features

    Features listed here require testing and user feedback. If a feature is not really useful and proves to be difficult to maintain, it may be eventually removed. Such features are also immune to compatibility breakage policies.

    • MixinScript: see #92. The feature was previously removed in previous Godot versions two times, yet Goost builds upon the removed implementation by providing editor tools for those kind of scripts. Depending on the user support and interested contributors, it may be further maintained or eventually removed.
    • MidiPlayer, see #157. It's not yet clear whether current API and implementation is sound (no pun intended!)

    Deprecated features

    Features listed here will be soon removed in future versions of Goost. Depending on the feedback and maintenance effort, deprecated features may have a chance to be still present in future versions of Goost.

    None yet!

    Removed features

    Features listed here are no longer present in Goost. If a feature was removed simply because of huge maintenance cost and not because it's no longer useful or obsolete, feel free to make a pull request to resurrect such a feature. Features may also be removed if they end up being ported to Godot, which is Goost's main intention.

    • GradientTexture2D #170
      • Merged in Godot: godotengine/godot#54824.
  • "Godot" is damaged and can't be opened

    Goost and Godot version: Godot 3.3.2-stable + Goost 1.0-stable

    OS/platform/device including version: 2020 Mac Mini (M1) macOS Big Sur

    Issue description: Downloaded Godot + Goost (macOS standard 64-bit) for the first time, but when I unzip and try to open it, I get this:

    Screen Shot 2021-06-26 at 2 19 21 PM

    No idea what would cause this... I am running the official 3.3.2 stable just fine. I tried redownloading it and also restarting to no avail. Anyone else encountered this?

    Steps to reproduce: dunno... try to open Godot + Goost on M1 Mac?

    Is this issue reproducible in official Godot builds? no

    Minimal reproduction project: N/A

  • Exposing `EditorSpinSlider` as `SpinSlider`

    Exposing `EditorSpinSlider` as `SpinSlider`

    Describe the limitation you are having in your project I'm currently writing a custom property editor in GDScript, I don't have access to EditorSpinSlider

    Describe the enhancement and how it helps to overcome the limitation Exposing SpinSlider, this is one way, I think it is easy to expose SpinSlider

    How difficult it is to workaround the limitation? Write your own SpinSlider (difficult) in GDScript ;)

Protoc-gen-apidocs: A simple and customizable protoc generator that translates

protoc-gen-apidocs protoc-gen-apidocs is a very simple and customizable protoc g

Sep 12, 2022
纯Go编写的IM,完全自定义协议的高性能即时通讯服务(High-performance instant messaging service with fully customizable protocol)
纯Go编写的IM,完全自定义协议的高性能即时通讯服务(High-performance instant messaging service with fully customizable protocol)

LiMaoIM (Everything so easy) This project is a simple and easy to use, powerful performance, simple design concept instant messaging service, fully cu

Dec 5, 2022
🌍 Package tcplisten provides a customizable TCP net.Listener with various performance-related options

Package tcplisten provides customizable TCP net.Listener with various performance-related options: SO_REUSEPORT. This option allows linear scaling ser

Nov 14, 2022
Package proxychannel is a customizable HTTP proxy framework in Golang.
Package proxychannel is a customizable HTTP proxy framework in Golang.

proxychannel Package proxychannel is a customizable HTTP proxy framework in Golang. It accepts regular HTTP and CONNECT(for HTTPS) requests, and hijac

Aug 6, 2022
Fast, multithreaded, modular and extensible DHCP server written in Go

coredhcp Fast, multithreaded, modular and extensible DHCP server written in Go This is still a work-in-progress Example configuration In CoreDHCP almo

Jan 9, 2023
CoreRAD is an extensible and observable IPv6 Neighbor Discovery Protocol router advertisement daemon. Apache 2.0 Licensed.
CoreRAD is an extensible and observable IPv6 Neighbor Discovery Protocol router advertisement daemon. Apache 2.0 Licensed.

CoreRAD CoreRAD is an extensible and observable IPv6 Neighbor Discovery Protocol router advertisement daemon. Apache 2.0 Licensed. To get started with

Nov 14, 2022
httpx is a fast and multi-purpose HTTP toolkit allows to run multiple probers using retryablehttp library, it is designed to maintain the result reliability with increased threads.
httpx is a fast and multi-purpose HTTP toolkit allows to run multiple probers using retryablehttp library, it is designed to maintain the result reliability with increased threads.

Features • Installation • Usage • Running httpx • Notes • Join Discord httpx is a fast and multi-purpose HTTP toolkit allow to run multiple probers us

Jan 8, 2023
GoScan is a port-scanner made entirely in Go-lang. The purpose of the tool is to be fast, dynamic and simple so that a professional in the CyberSecurity area can make an optimized list of ports
GoScan is a port-scanner made entirely in Go-lang. The purpose of the tool is to be fast, dynamic and simple so that a professional in the CyberSecurity area can make an optimized list of ports

?? GoScan GoScan is a port-scanner made entirely in Go-lang. The purpose of the tool is to be fast, dynamic and simple so that a professional in the C

Jul 19, 2022
Extensible network application framework inspired by netty

GO-NETTY 中文介绍 Introduction go-netty is heavily inspired by netty Feature Extensible transport support, default support TCP, UDP, QUIC, KCP, Websocket

Dec 28, 2022
gRPC dummy service for testing purpose.

gRPC example Pre-requisite Protocol buffer installation $: brew install protobuf $: protoc --version # Ensure compiler version is 3+ Server go Gener

Mar 3, 2022
Standalone client for proxies of Windscribe browser extension

windscribe-proxy Standalone Windscribe proxy client. Younger brother of opera-proxy. Just run it and it'll start a plain HTTP proxy server forwarding

Dec 29, 2022
A Caddy v2 extension to apply rate-limiting for HTTP requests

ratelimit A Caddy v2 extension to apply rate-limiting for HTTP requests. Installation $ xcaddy build --with github.com/owlwang/caddy-ratelimit Caddyfi

Jan 28, 2022
Implementing SPEEDEX price computation engine in Golang as a standalone binary that exchanges can call

speedex-standalone Implementing SPEEDEX price computation engine in Golang as a standalone binary that exchanges can call. Notes from Geoff About Tato

Dec 1, 2021
Simple Nginx Load Balancing Use Docker Engine
Simple Nginx Load Balancing Use Docker Engine

Load Balancing Menggunakan Nginx Load Balancing adalah sebuah mekanisme untuk membagi atau mendistribusikan trafik ke beberapa server. Nginx selain be

Dec 14, 2021
Core is the next-generation digital data engine.
Core is the next-generation digital data engine.

tKeel-Core The digital engine of world ?? Core is the data centre of the tKeel IoT Open Platform, a high-performance, scalable and lightweight next-ge

Mar 28, 2022
An implementation of the Information Concealment Engine cipher in Go
An implementation of the Information Concealment Engine cipher in Go

An implementation of the Information Concealment Engine cipher in Go

Jan 26, 2022
Grcon - Lib for Source Engine's RCON protocol in Go

grcon A basic Golang library for the RCON Protocol. Features Max control over th

Mar 5, 2022
A golang library about socks5, supports all socks5 commands. That Provides server and client and easy to use. Compatible with socks4 and socks4a.

socks5 This is a Golang implementation of the Socks5 protocol library. To see in this SOCKS Protocol Version 5. This library is also compatible with S

Nov 22, 2022
Transparent TLS and HTTP proxy serve and operate on all 65535 ports, with domain regex whitelist and rest api control

goshkan Transparent TLS and HTTP proxy serve & operating on all 65535 ports, with domain regex whitelist and rest api control tls and http on same por

Nov 5, 2022