Merge pull request 'Add InventoryLib' (#191) from inventory_api into master
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful

Reviewed-on: #191
Reviewed-by: YoyoNow <jwsteam@nidido.de>
Dieser Commit ist enthalten in:
YoyoNow 2023-07-24 17:14:35 +02:00
Commit 1e2522af12
3 geänderte Dateien mit 181 neuen und 16 gelöschten Zeilen

Datei anzeigen

@ -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 <https://www.gnu.org/licenses/>.
*/
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<String> 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;
}
}

Datei anzeigen

@ -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;
}

Datei anzeigen

@ -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)
<!-- TOC -->
@ -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\<String>) | 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<String>, Function\<String>) | Füge eine Lore an das Item hinzu |
| -"- | setItem(Number, String, String, List<String>, Boolean, Function\<String>) | Gebe an, ob das Item enchanted sein soll |
| -"- | setItem(Number, String, String, List<String>, Boolean, Number, Function\<String>) | Gebe die Anzahl der Items an |
| `setCloseHandler` | setCloseHandler(Function\<Void>) | 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()
```