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..3b24b460 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,37 @@ 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 |
+
+Siehe auch: [Inventory Beispiel](#inventory-1)
+
+Siehe auch: [Liste an Materials](https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html)
+
+```
+⚠️⚠️⚠️
+
+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 +384,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