All Projects → gilzoide → godot-lua-pluginscript

gilzoide / godot-lua-pluginscript

Licence: MIT license
Godot PluginScript for the Lua language, currently based on LuaJIT's FFI

Programming Languages

lua
6591 projects
c
50402 projects - #5 most used programming language
Makefile
30231 projects

Projects that are alternatives of or similar to godot-lua-pluginscript

fmod-gdnative
FMOD Studio integration and bindings for the Godot game engine
Stars: ✭ 102 (-43.96%)
Mutual labels:  godot, godot-engine, gdnative
godot-cpp-cmake
CMake scripts to build cross-platform GDNative C++ bindings
Stars: ✭ 20 (-89.01%)
Mutual labels:  godot, godot-engine, gdnative
Godot-DialogPlugin
🗨️ A Dialog Node for Godot Engine
Stars: ✭ 194 (+6.59%)
Mutual labels:  godot, godot-engine
novemberdev soulslike darksouls godot
Dark Souls clone in 3D with Godot
Stars: ✭ 51 (-71.98%)
Mutual labels:  godot, godot-engine
godot-portal-demo
Experimenting with portals in Godot Engine
Stars: ✭ 66 (-63.74%)
Mutual labels:  godot, godot-engine
nativelib-cli
NativeLib is a plugin management system for Godot engine.
Stars: ✭ 19 (-89.56%)
Mutual labels:  godot, godot-engine
godot-xterm
Terminal emulator for the Godot game engine.
Stars: ✭ 61 (-66.48%)
Mutual labels:  godot, godot-engine
godot-cmvalley
Port of the Sauerbraten clanmap cm|Valley to Godot 4.0
Stars: ✭ 28 (-84.62%)
Mutual labels:  godot, godot-engine
godot-practice-shaders
Some practice shaders in Godot
Stars: ✭ 79 (-56.59%)
Mutual labels:  godot, godot-engine
Godot-Top-down-Shooter-Tutorial
This repository contains the source code for the Godot Top-down Shooter Tutorial series.
Stars: ✭ 41 (-77.47%)
Mutual labels:  godot, godot-engine
Game-Examples
Godot game examples for gotm.io - the Godot Platform!
Stars: ✭ 27 (-85.16%)
Mutual labels:  godot, godot-engine
godot-admob-editor
This repository is for Godot's Addons to integrate natively AdMob to your Game Project without much configurations, with a beautiful UI and directly inside Godot Editor!
Stars: ✭ 43 (-76.37%)
Mutual labels:  godot, godot-engine
godot-rpgdb
An easy to use JSON database-manager for Godot.
Stars: ✭ 25 (-86.26%)
Mutual labels:  godot, godot-engine
PimplePopper
Game to pop pimples using the awesome Godot Engine
Stars: ✭ 23 (-87.36%)
Mutual labels:  godot, godot-engine
GDGotm
Official Godot plugin for gotm.io - the Godot Platform!
Stars: ✭ 43 (-76.37%)
Mutual labels:  godot, godot-engine
godot-gdgifexporter
Gif exporter for Godot made entirely in GDScript
Stars: ✭ 85 (-53.3%)
Mutual labels:  godot, godot-engine
GodotFAN
Facebook Audience Network Ad module for godot
Stars: ✭ 25 (-86.26%)
Mutual labels:  godot, godot-engine
liblast
A libre multiplayer FPS game created in Godot Engine
Stars: ✭ 92 (-49.45%)
Mutual labels:  godot, godot-engine
godot tools
A set of GDScript EditorScript and EditorPlugins tools that automate boring tasks on Godot Engine.
Stars: ✭ 50 (-72.53%)
Mutual labels:  godot, godot-engine
Godot FPC Base
A first person camera base project for Godot 3.x to help anyone get a jumpstart.
Stars: ✭ 39 (-78.57%)
Mutual labels:  godot, godot-engine

Godot Lua PluginScript

Lua PluginScript icon

GDNative + PluginScript library that adds support for Lua as a scripting language in Godot.

Being a GDNative library, recompiling the engine is not required, so anyone with a built release copied to their project can use it. Being a PluginScript language, Lua can seamlessly communicate with scripts written in GDScript / C# / Visual Script and vice-versa. This way, one can use the language that best suits the implementation for each script and all of them can understand each other.

This plugin is available in the Asset Library as Lua PluginScript.

For some usage examples, check out lps_coroutine.lua and plugin/lua_repl.lua.

Currently, only LuaJIT is supported, since the implementation is based on its FFI library.

Installing

Either:

  • In Godot Editor, open the Asset Library tab, search for the Lua PluginScript asset, download and install it.
  • Put a built release of the library into the project folder and restart Godot. Make sure the lua_pluginscript.gdnlib file is located at the res://addons/godot-lua-pluginscript folder.
  • Clone this repository as the project's res://addons/godot-lua-pluginscript folder and build for the desired platforms.

Documentation

Goals

  • Provide support for Lua as a scripting language in Godot in a way that does not require compiling the engine from scratch
  • Be able to seamlessly communicate with any other language supported by Godot, like GDScript, Visual Script and C#, in an idiomatic way
  • Simple script description interface that doesn't need requireing anything
  • Support for LuaJIT and Lua 5.2+
  • Support paths relative to res://* and exported game/app executable path for requireing Lua modules
  • Have a simple build process, where anyone with the cloned source code and installed build system + toolchain can build the project in a single step

Non-goals

  • Provide calls to all core Godot classes' methods via native method bindings
  • Support multithreading on the Lua side

Articles

  1. Designing Godot Lua PluginScript
  2. Implementing the library's skeleton
  3. Integrating LuaJIT and FFI
  4. Initializing and finalizing scripts (TODO)

Script example

This is an example of how a Lua script looks like.

-- Class definitions are regular Lua tables, to be returned from the script
local MyClass = {}

-- Optional: set class as tool, defaults to false
MyClass.is_tool = true

-- Optional: set base class by name, defaults to 'Reference'
MyClass.extends = 'Node'

-- Optional: give your class a name
MyClass.class_name = 'MyClass'

-- Declare signals
MyClass.something_happened = signal()
MyClass.something_happened_with_args = signal("arg1", "arg2")

-- Values defined in table are registered as properties of the class
-- By default, properties are not exported to the editor
MyClass.some_prop = 42

-- The `property` function adds metadata to defined properties,
-- like setter and getter functions
MyClass.some_prop_with_details = property {
  -- ["default_value"] or ["default"] or [1] = property default value
  5,
  -- ["type"] or [2] = variant type, optional, inferred from default value
  -- All Godot variant type names are defined globally as written in
  -- GDScript, like bool, int, float, String, Array, Vector2, etc...
  -- Notice that Lua <= 5.2 does not differentiate integers from float
  -- numbers, so we should always specify `int` where appropriate
  -- or use `int(5)` in the default value instead
  type = int,
  -- ["get"] or ["getter"] = getter function or method name, optional
  get = function(self)
    return self.some_prop_with_details
  end,
  -- ["set"] or ["setter"] = setter function or method name, optional
  set = 'set_some_prop_with_details',
  -- ["usage"] = property usage, from `enum godot_property_usage_flags`
  -- optional, default to `PropertyUsage.NOEDITOR`
  usage = PropertyUsage.NOEDITOR,
  -- ["hint"] = property hint, from `enum godot_property_hint`
  -- optional, default to `PropertyHint.NONE`
  hint = PropertyHint.RANGE,
  -- ["hint_string"] = property hint text, only required for some hints
  hint_string = '1,10',
  -- ["rset_mode"] = property remote set mode, from `enum godot_method_rpc_mode`
  -- optional, default to `RPCMode.DISABLED`
  rset_mode = RPCMode.MASTER,
}
-- The `export` function is an alias for `property` that always exports
-- properties to the editor
MyClass.exported_prop = export { "This property appears in the editor" }
MyClass.another_exported_prop = export {
  [[This one also appears in the editor,
now with a multiline TextArea for edition]],
  hint = PropertyHint.MULTILINE_TEXT,
}

-- Functions defined in table are public methods
function MyClass:_ready()  -- `function t:f(...)` is an alias for `function t.f(self, ...)`
  -- Singletons are available globally
  local os_name = OS:get_name()
  print("MyClass instance is ready! Running on a " .. os_name .. " system")
end

function MyClass:set_some_prop_with_details(value)
    self.some_prop_with_details = value
    -- Indexing `self` with keys undefined in script will search base
    -- class for methods and properties
    self:emit_signal("something_happened_with_args", "some_prop_with_details", value)
end

function MyClass:get_some_prop_doubled()
  return self.some_prop * 2
end

-- In the end, table with class declaration must be returned from script
return MyClass

Status

  • LuaJIT support
  • Lua 5.2+ support
  • Useful definitions for all GDNative objects, with methods and metamethods
  • A yield function similar to GDScript's, to resume after a signal is emitted (GD.yield)
  • Working PluginScript language definition
  • PluginScript script validation and template source code
  • PluginScript code editor callbacks
  • PluginScript debug callbacks
  • PluginScript profiling callbacks
  • Package searcher for Lua and C modules that work with paths relative to the res:// folder and/or exported games' executable path
  • Lua REPL
  • API documentation
  • Unit tests
  • Example projects
  • Export plugin to minify Lua scripts
  • Drop-in binary release in GitHub
  • Submit to Asset Library

Third-party software

This project uses the following software:

  • godot-headers: headers for GDNative, released under the MIT license
  • LuaJIT: Just-In-Time Compiler (JIT) for the Lua programming language, released under the MIT license
  • High Level GDNative (HGDN): higher level GDNative API header, released to the Public Domain
  • LuaSrcDiet: compresses Lua source code by removing unnecessary characters, released under the MIT license

Other projects for using Lua in Godot

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].