Merge pull request 'Add InventoryLib' (#191) from inventory_api into master
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Reviewed-on: #191 Reviewed-by: YoyoNow <jwsteam@nidido.de>
Dieser Commit ist enthalten in:
Commit
1e2522af12
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
48
SCRIPT.md
48
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)
|
||||
<!-- 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:
|
||||
@ -77,7 +81,7 @@ 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 |
|
||||
@ -91,6 +95,7 @@ Es gibt folgende Funktionen:
|
||||
| `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.
|
||||
@ -349,3 +385,13 @@ 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()
|
||||
```
|
In neuem Issue referenzieren
Einen Benutzer sperren