Zenbot Wiki Difference between revisions of "Plugins"

Difference between revisions of "Plugins"

From Zenbot Wiki
 
(16 intermediate revisions by the same user not shown)
Line 2: Line 2:


==== Content ====
==== Content ====
A plugin is defined as a folder, or (encrypted) archive that contains the following:
A plugin is defined as a folder, or [encrypted] archive that contains the following:


===== info.lua <code>[required]</code> =====
===== header.lua <code>[required]</code> =====
    - id
        the unique identifier for this plugin
     - name
     - name
         this will get displayed in loader/menu
         this will get displayed in menu
    - version [optional]
        for example "0.0.1"
        this will get displayed in loader
    - author [optional]
        this will get displayed in loader/menu
     - description [optional]
     - description [optional]
         this will get displayed in loader/menu
         this will get displayed in menu as tooltip
     - icon [optional]
     - icon [optional]
         this will get displayed in menu
         this will get displayed in menu
Line 19: Line 16:
         - required
         - required
             plugin needs those libraries to work and will not load if one or more is missing/not available
             plugin needs those libraries to work and will not load if one or more is missing/not available
             example: { "Orbwalker", "HealthPrediction" }
             example: { "SomeOrbwalkerLib", "SomeHealthPredictionLib" }
         - optional
         - optional
             plugin integrates those libraries but will load regardless if they are missing/not available
             plugin integrates those libraries but will load regardless if they are missing/not available
             example: { "Evade" }
             example: { "? SomeEvadeLib" }
         - conflicts
         - conflicts
             plugin cannot work if one or more of those is loaded, plugin will not load if they are loaded
             plugin cannot work if one or more of those is loaded, plugin will not load if they are loaded
             example: { "Aatrox" }
             example: { "! SomeAatroxPlugin" }
     - library [optional]
     - library [optional]
         boolean to indicate if submodules should be loadable outside of this plugin
         boolean to indicate if submodules should be loadable outside of this plugin
     - load [optional]
     - load [optional]
         (lambda) function returning a boolean that indicates if the plugin should show up ingame
         (lambda) function returning a boolean that indicates if the plugin should show up ingame
             function() return GameData.champion == "Aatrox" end
             function() return player.charName == "Aatrox" end
             "Game.champion == 'Aatrox'"
             `player.charName == 'Aatrox'`
         only Game data will be available inside the function with the following properties:
    - encrypt [optional]
             - champion  : string
         table containing every single file to be added to the encrypted file
             - map      : number
          encrypt = {    -- main.lua and header.lua can be omitted
             - mode      : string
             "menu",      -- //scripts//yourfolder//menu.lua
            - matchmade : boolean
             "logic",    -- //scripts//yourfolder//logic.lua
             "sprite.png" -- //scripts//yourfolder//sprite.png
          }
    - strip [optional]
        boolean to indicate if debug information should be omitted when encrypting, increases security slightly but removes any error information


===== thumbnail.png <code>[optional]</code> =====
===== thumbnail.png <code>[optional]</code> =====
     - this will get displayed in loader/menu
     - this will get displayed in loader/menu
===== init.lua <code>[optional]</code> =====
    - this will get loaded during loading screen
    - you can pre-create menu here
    - most objects and instances are not available


===== main.lua <code>[required]</code> =====
===== main.lua <code>[required]</code> =====
Line 50: Line 46:


==== Example ====
==== Example ====
info.lua:
header.lua:
<pre>
<pre>
return {
return {
     name = "MyPlugin",
     id = "my_plugin_id",
     version = "0.0.1",
     name = "My Plugin",
    title = "My Awesome Plugin",
     description = "Does plugin things",
     author = "Me",
     icon = "\xef\xa3\xbf", -- font awesome
     description = "Does awesome things",
     dependencies = {
     dependencies = {
         required = { "Orbwalker", "HealthPrediction" },
         "some_ts_lib_id", -- required
         optional = { "SomeLibrary" },
        "? some_pred_lib_id", -- optional
         conflicts = { "Aatrox" }
        "! some_other_plugin" -- conflicts
    },
    load = `()=> player.charName == "Aatrox"`,
    encrypt = {
        "hud/main",
        "hud/overlay",
         "hud.png",
         "font.ttf"
     },
     },
     library = false,
     strip = true
    load = "GameData.champion == 'Aatrox'"
}
}
</pre>
</pre>
Line 70: Line 71:
=== Loading/Importing ===
=== Loading/Importing ===


==== Virtual File System ====
==== Importing Plugins ====
Zenbot uses a virtual file system to load its plugins
Libraries and internals can be loaded by using module api


1. Core files are pre-loaded
local mylib = module.lib("mylib")
  Core virtual folder will contain
     or
     /classes/
local mylib_maybe = module.seek("mylib")
    /common/
     or
    /core/
local orb = module.internal("orb")
    /extension/
    /library/
    /plugin/
     /shader/
    /main.lua


2. Plugins are pre-loaded and dependencies are determined and pre-loaded
Similarly your Lua files can be loaded by using module api
    /plugin/plugin1/
    /plugin/plugin2/
    /plugin/plugin3/
    /library/dependency1/
    /library/dependency2/
    /library/dependency3/


3. Core entry point is executed, successfully loaded plugins are added to menu
local mymenu = module.load(header.id, "menu")
    /main.lua


4. Plugin entry points are executed, if activated in menu
==== Example ====
    /plugin/plugin1/main.lua
rectangle.lua
    /plugin/plugin2/main.lua
local rectangle = class()
    /plugin/plugin3/main.lua
 
function rectangle:__init(x, y, w, h)
==== Importing Plugins ====
    self.x = x
Libraries and internals can be loaded by using module api or import keyword
    self.y = y
 
    self.w = w
  local Player = module.load"Player"
    self.h = h
    or
end
  import "Player"
function rectangle:__tostring()
    return string.format("rectangle(%d, %d, %d, %d)", self.x, self.y, self.w, self.h)
end
function rectangle:__eq(other)
    return self.x == other.x and self.y == other.y and self.w == other.w and self.h == other.h
end
function rectangle:contains(x, y)
    return x >= self.x and x <= self.x + self.w and y >= self.y and y <= self.y + self.h
end
function rectangle:draw(color, var)
    graphics.draw_rect(vec2(self.x, self.y), vec2(self.w, self.h), color, true)
end
return rectangle


  local Orbwalker = module.load"Orbwalker"
main.lua
    or
local rectangle = module.load(header.id, "rectangle")
  import "Orbwalker"
local rect1 = rectangle(100, 100, 400, 200)
===== Lookup Priority =====
The priority order for lookups is:
cb.add(cb.draw, function()
# Current plugin folder
    rect1:draw(0xff7f7f7f, rect1:contains(cursorPos.x, cursorPos.y) or 4)
# All library folders
end)
# Core folders
# Instances[name]
# Enums[name]

Latest revision as of 16:12, 1 April 2023

Definition

Content

A plugin is defined as a folder, or [encrypted] archive that contains the following:

header.lua [required]
   - id
       the unique identifier for this plugin
   - name
       this will get displayed in menu
   - description [optional]
       this will get displayed in menu as tooltip
   - icon [optional]
       this will get displayed in menu
   - dependencies [optional]
       - required
           plugin needs those libraries to work and will not load if one or more is missing/not available
           example: { "SomeOrbwalkerLib", "SomeHealthPredictionLib" }
       - optional
           plugin integrates those libraries but will load regardless if they are missing/not available
           example: { "? SomeEvadeLib" }
       - conflicts
           plugin cannot work if one or more of those is loaded, plugin will not load if they are loaded
           example: { "! SomeAatroxPlugin" }
   - library [optional]
       boolean to indicate if submodules should be loadable outside of this plugin
   - load [optional]
       (lambda) function returning a boolean that indicates if the plugin should show up ingame
           function() return player.charName == "Aatrox" end
           `player.charName == 'Aatrox'`
   - encrypt [optional]
       table containing every single file to be added to the encrypted file
         encrypt = {    -- main.lua and header.lua can be omitted
           "menu",      -- //scripts//yourfolder//menu.lua
           "logic",     -- //scripts//yourfolder//logic.lua
           "sprite.png" -- //scripts//yourfolder//sprite.png
         }
   - strip [optional]
       boolean to indicate if debug information should be omitted when encrypting, increases security slightly but removes any error information
thumbnail.png [optional]
   - this will get displayed in loader/menu
main.lua [required]
   - this is the entry to your plugin

Example

header.lua:

return {
    id = "my_plugin_id",
    name = "My Plugin",
    description = "Does plugin things",
    icon = "\xef\xa3\xbf", -- font awesome
    dependencies = {
        "some_ts_lib_id", -- required
        "? some_pred_lib_id", -- optional
        "! some_other_plugin" -- conflicts 
    },
    load = `()=> player.charName == "Aatrox"`,
    encrypt = {
        "hud/main",
        "hud/overlay",
        "hud.png",
        "font.ttf"
    },
    strip = true
}

Loading/Importing

Importing Plugins

Libraries and internals can be loaded by using module api

local mylib = module.lib("mylib")
   or
local mylib_maybe = module.seek("mylib")
   or
local orb = module.internal("orb")

Similarly your Lua files can be loaded by using module api

local mymenu = module.load(header.id, "menu")

Example

rectangle.lua

local rectangle = class()

function rectangle:__init(x, y, w, h)
    self.x = x
    self.y = y
    self.w = w
    self.h = h
end

function rectangle:__tostring()
    return string.format("rectangle(%d, %d, %d, %d)", self.x, self.y, self.w, self.h)
end

function rectangle:__eq(other)
    return self.x == other.x and self.y == other.y and self.w == other.w and self.h == other.h
end

function rectangle:contains(x, y)
    return x >= self.x and x <= self.x + self.w and y >= self.y and y <= self.y + self.h
end

function rectangle:draw(color, var)
    graphics.draw_rect(vec2(self.x, self.y), vec2(self.w, self.h), color, true)
end

return rectangle

main.lua

local rectangle = module.load(header.id, "rectangle")
local rect1 = rectangle(100, 100, 400, 200)

cb.add(cb.draw, function()
    rect1:draw(0xff7f7f7f, rect1:contains(cursorPos.x, cursorPos.y) or 4)
end)