diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/InventoryLib.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/InventoryLib.java new file mode 100644 index 00000000..3bc90ac2 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/InventoryLib.java @@ -0,0 +1,112 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.script.lua.libs; + +import de.steamwar.inventory.SWInventory; +import de.steamwar.inventory.SWItem; +import de.steamwar.linkage.Linked; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.luaj.vm2.LuaFunction; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; +import org.luaj.vm2.lib.OneArgFunction; +import org.luaj.vm2.lib.TwoArgFunction; +import org.luaj.vm2.lib.VarArgFunction; +import org.luaj.vm2.lib.ZeroArgFunction; + +import java.util.ArrayList; +import java.util.List; + +@Linked +public class InventoryLib implements LuaLib { + @Override + public String name() { + return "inventory"; + } + + @Override + public LuaTable get(Player player) { + LuaTable inventoryLib = new LuaTable(); + inventoryLib.set("create", new TwoArgFunction() { + @Override + public LuaValue call(LuaValue arg1, LuaValue arg2) { + String title = arg1.checkjstring(); + int size = arg2.checkint(); + SWInventory inventory = new SWInventory(player, size * 9, ChatColor.translateAlternateColorCodes('&', title)); + LuaTable table = new LuaTable(); + table.set("setItem", new VarArgFunction() { + @Override + public Varargs invoke(Varargs args) { + int slot = args.checkint(1); + Material material = SWItem.getMaterial(args.checkjstring(2)); + String name = ChatColor.translateAlternateColorCodes('&', args.checkjstring(3)); + SWItem item = new SWItem(material, name); + + if (args.narg() >= 5) { + LuaTable lore = args.checktable(4); + List loreList = new ArrayList<>(lore.length()); + for (int i = 1; i <= lore.length(); i++) { + loreList.add(ChatColor.translateAlternateColorCodes('&', lore.get(i).checkjstring())); + } + item.setLore(loreList); + } + + if (args.narg() >= 6) { + item.setEnchanted(args.checkboolean(5)); + } + + if (args.narg() >= 7) { + item.getItemStack().setAmount(args.checkint(6)); + } + + LuaFunction handler = args.checkfunction(args.narg()); + item.setCallback(clickType -> handler.call(LuaValue.valueOf(clickType.name()))); + + inventory.setItem(slot, item); + return LuaValue.NIL; + } + }); + + table.set("setCloseHandler", new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + LuaFunction function = arg.checkfunction(); + inventory.addCloseRunnable(function::call); + return LuaValue.NIL; + } + }); + + table.set("open", new ZeroArgFunction() { + @Override + public LuaValue call() { + inventory.open(); + return LuaValue.NIL; + } + }); + + return table; + } + }); + return inventoryLib; + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/PlayerLib.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/PlayerLib.java index 49ad977a..6ce317b3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/PlayerLib.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/PlayerLib.java @@ -26,9 +26,9 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; -import org.luaj.vm2.Print; import org.luaj.vm2.Varargs; import org.luaj.vm2.lib.VarArgFunction; +import org.luaj.vm2.lib.ZeroArgFunction; @Linked public class PlayerLib implements LuaLib { @@ -74,6 +74,13 @@ public class PlayerLib implements LuaLib { table.set("slot", getterAndSetter("slot", () -> player.getInventory().getHeldItemSlot(), player.getInventory()::setHeldItemSlot)); table.set("item", getter(() -> player.getInventory().getItemInMainHand().getType().name())); table.set("offHandItem", getter(() -> player.getInventory().getItemInOffHand().getType().name())); + table.set("closeInventory", new ZeroArgFunction() { + @Override + public LuaValue call() { + player.closeInventory(); + return LuaValue.NIL; + } + }); return table; } diff --git a/SCRIPT.md b/SCRIPT.md index 03c7cba2..b1b73e35 100644 --- a/SCRIPT.md +++ b/SCRIPT.md @@ -14,6 +14,7 @@ * [server](#server) * [tps](#tps) * [storage](#storage) + * [inventory](#inventory) * [SteamWar.de-Global-Api](#steamwarde-global-api) * [Commands](#commands) * [Hotkeys](#hotkeys) @@ -33,6 +34,8 @@ * [Code](#code-2) * [Paste Hotkey](#paste-hotkey) * [Code](#code-3) + * [Inventory](#inventory-1) + * [Code](#code-4) @@ -58,6 +61,7 @@ In den Scripten gibt es dazu noch folgende globale Variablen: - [`region`](#region) - [`server`](#server) - [`storage`](#storage) +- [`inventory`](#inventory) - `_worldedit` Ohne eine Kategorie sind folgende Funktionen verfügbar, die nicht allgemein sind: @@ -76,21 +80,22 @@ Ohne eine Kategorie sind folgende Funktionen verfügbar, die nicht allgemein sin Das `player`-Modul stellt Funktionen zur Verfügung, die den Spieler betreffen. Es gibt folgende Funktionen: -| Name | Signature | Beschreibung | -|---------------|--------------------------------|---------------------------------------------------------------------------------------------------------------------------| -| `name` | name(): String | Gibt den `displayName` des Spielers zurück | -| `chat` | chat(String...) | Sendet den Text in den Chat des Spielers | -| `actionbar` | actionbar(String...) | Sendet den Text in die ActionBar des Spielers | -| `x` | x(Number), x(): Number | Setzt oder gibt die X-Koordinate des Spielers | -| `y` | y(Number), y(): Number | Setzt oder gibt die Y-Koordinate des Spielers | -| `z` | z(Number), z(): Number | Setzt oder gibt die Z-Koordinate des Spielers | -| `yaw` | yaw(Number), yaw(): Number | Setzt oder gibt die Gierung des Spielers | -| `pitch` | pitch(Number), pitch(): Number | Setzt oder gibt die Steigung des Spielers | -| `sneaking` | sneaking(): Boolean | Wahr, wenn der Spieler am Sneaken ist | -| `sprinting` | sprinting(): Boolean | Wahr, wenn der Spieler am Sprinten ist | -| `slot` | slot(Number), slot(): Number | Setzt oder gibt den Slot des gehaltenden Items des Spielers [(Wiki)](https://minecraft.fandom.com/wiki/Slot#Java_Edition) | -| `item` | item(): String | Gibt den Itemtyp der Main-Hand zurück | -| `offHandItem` | offHandItem(): String | Gibt den Itemtyp der Off-Hand zurück | +| Name | Signature | Beschreibung | +|------------------|--------------------------------|---------------------------------------------------------------------------------------------------------------------------| +| `name` | name(): String | Gibt den `displayName` des Spielers zurück | +| `chat` | chat(String...) | Sendet den Text in den Chat des Spielers | +| `actionbar` | actionbar(String...) | Sendet den Text in die ActionBar des Spielers | +| `x` | x(Number), x(): Number | Setzt oder gibt die X-Koordinate des Spielers | +| `y` | y(Number), y(): Number | Setzt oder gibt die Y-Koordinate des Spielers | +| `z` | z(Number), z(): Number | Setzt oder gibt die Z-Koordinate des Spielers | +| `yaw` | yaw(Number), yaw(): Number | Setzt oder gibt die Gierung des Spielers | +| `pitch` | pitch(Number), pitch(): Number | Setzt oder gibt die Steigung des Spielers | +| `sneaking` | sneaking(): Boolean | Wahr, wenn der Spieler am Sneaken ist | +| `sprinting` | sprinting(): Boolean | Wahr, wenn der Spieler am Sprinten ist | +| `slot` | slot(Number), slot(): Number | Setzt oder gibt den Slot des gehaltenden Items des Spielers [(Wiki)](https://minecraft.fandom.com/wiki/Slot#Java_Edition) | +| `item` | item(): String | Gibt den Itemtyp der Main-Hand zurück | +| `offHandItem` | offHandItem(): String | Gibt den Itemtyp der Off-Hand zurück | +| `closeInventory` | closeInventory() | Schließe das aktuell geöffnete Inventar des Spielers | ### random Das `random`-Modul stellt Funktionen zur Verfügung, die Zufallszahlen betreffen. @@ -197,6 +202,33 @@ Alle Module haben folgende Funktionen: | `get` | get(String): Any | Gibt den Wert des Schlüssels zurück | | `set` | set(String, Any) | Setzt den Wert des Schlüssels auf den angegebenen Wert | +## inventory +Das `inventory`-Modul stellt Funktionen zur Verfügung, um ein Inventar zu öffnen. +Es gibt folgende Funktionen: + +| Name | Signature | Beschreibung | +|----------|-----------------------------------|-------------------------------------------------------------------| +| `create` | create(String, Number): Inventory | Erstellt ein Inventar mit dem Title und der Anzahl an Zeilen | + +Das `Inventory`-Objekt hat folgende Funktionen: + +| Name | Signature | Beschreibung | +|-------------------|-----------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `setItem` | setItem(Number, String, String, Function\) | Setze ein Item mit dem Typen des ersten Strings an den Slot (Startet bei 0) mit dem Namen des zweiten Strings mit einem Klick-Handler der den Klick-Typen rein gibt (z.B. `LEFT`, `SHIFT_LEFT`, `RIGHT`, `SHIFT_RIGHT`) | +| | setItem(Number, String, String, List, Function\) | Füge eine Lore an das Item hinzu | +| | setItem(Number, String, String, List, Boolean, Function\) | Gebe an, ob das Item enchanted sein soll | +| | setItem(Number, String, String, List, Boolean, Number, Function\) | Gebe die Anzahl der Items an | +| `setCloseHandler` | setCloseHandler(Function\) | Gebe einen Handler an, der beim schließen des Inventares ausgeführt wird | +| `open` | open() | Öffne das Inventar | + +``` +⚠️⚠️⚠️ + +Wenn eine Barrier statt des richtigen Items angezeigt wird, dann ist das angegebene Material nicht gültig. + +⚠️⚠️⚠️ +``` + # SteamWar.de-Global-Api Mit `/script` kann man Script-Bücher global abspeichern. Diese haben dann zugrif auf die `global`-Api. Die `global`-Api stellt Funktionen zur Verfügung um auf Events, Commands und Hotkeys mit einem Script zu reagieren. @@ -348,4 +380,14 @@ function handler(pressed) end hotkey("ctrl+v", handler) +``` + +## Inventory +Ein Beispiel für ein Inventar. + +#### Code +```lua +inv = inventory.create("Test Inv", 3) +inv.setItem(13, "STONE", "Ich bin ein Stein", {"Die Lore", "Die Zweite Zeile"}, true, function(e) player.chat(e) end) +inv.open() ``` \ No newline at end of file