Add InventoryLib #191
@ -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.bukkit.entity.Player;
|
||||||
import org.luaj.vm2.LuaTable;
|
import org.luaj.vm2.LuaTable;
|
||||||
import org.luaj.vm2.LuaValue;
|
import org.luaj.vm2.LuaValue;
|
||||||
import org.luaj.vm2.Print;
|
|
||||||
import org.luaj.vm2.Varargs;
|
import org.luaj.vm2.Varargs;
|
||||||
import org.luaj.vm2.lib.VarArgFunction;
|
import org.luaj.vm2.lib.VarArgFunction;
|
||||||
|
import org.luaj.vm2.lib.ZeroArgFunction;
|
||||||
|
|
||||||
@Linked
|
@Linked
|
||||||
public class PlayerLib implements LuaLib {
|
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("slot", getterAndSetter("slot", () -> player.getInventory().getHeldItemSlot(), player.getInventory()::setHeldItemSlot));
|
||||||
table.set("item", getter(() -> player.getInventory().getItemInMainHand().getType().name()));
|
table.set("item", getter(() -> player.getInventory().getItemInMainHand().getType().name()));
|
||||||
table.set("offHandItem", getter(() -> player.getInventory().getItemInOffHand().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;
|
return table;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
44
SCRIPT.md
44
SCRIPT.md
@ -14,6 +14,7 @@
|
|||||||
* [server](#server)
|
* [server](#server)
|
||||||
* [tps](#tps)
|
* [tps](#tps)
|
||||||
* [storage](#storage)
|
* [storage](#storage)
|
||||||
|
* [inventory](#inventory)
|
||||||
* [SteamWar.de-Global-Api](#steamwarde-global-api)
|
* [SteamWar.de-Global-Api](#steamwarde-global-api)
|
||||||
* [Commands](#commands)
|
* [Commands](#commands)
|
||||||
* [Hotkeys](#hotkeys)
|
* [Hotkeys](#hotkeys)
|
||||||
@ -33,6 +34,8 @@
|
|||||||
* [Code](#code-2)
|
* [Code](#code-2)
|
||||||
* [Paste Hotkey](#paste-hotkey)
|
* [Paste Hotkey](#paste-hotkey)
|
||||||
* [Code](#code-3)
|
* [Code](#code-3)
|
||||||
|
* [Inventory](#inventory-1)
|
||||||
|
* [Code](#code-4)
|
||||||
<!-- TOC -->
|
<!-- TOC -->
|
||||||
|
|
||||||
|
|
||||||
@ -58,6 +61,7 @@ In den Scripten gibt es dazu noch folgende globale Variablen:
|
|||||||
- [`region`](#region)
|
- [`region`](#region)
|
||||||
- [`server`](#server)
|
- [`server`](#server)
|
||||||
- [`storage`](#storage)
|
- [`storage`](#storage)
|
||||||
|
- [`inventory`](#inventory)
|
||||||
- `_worldedit`
|
- `_worldedit`
|
||||||
|
|
||||||
Ohne eine Kategorie sind folgende Funktionen verfügbar, die nicht allgemein sind:
|
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:
|
Es gibt folgende Funktionen:
|
||||||
|
|
||||||
| Name | Signature | Beschreibung |
|
| Name | Signature | Beschreibung |
|
||||||
|---------------|--------------------------------|---------------------------------------------------------------------------------------------------------------------------|
|
|------------------|--------------------------------|---------------------------------------------------------------------------------------------------------------------------|
|
||||||
| `name` | name(): String | Gibt den `displayName` des Spielers zurück |
|
| `name` | name(): String | Gibt den `displayName` des Spielers zurück |
|
||||||
| `chat` | chat(String...) | Sendet den Text in den Chat des Spielers |
|
| `chat` | chat(String...) | Sendet den Text in den Chat des Spielers |
|
||||||
| `actionbar` | actionbar(String...) | Sendet den Text in die ActionBar 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) |
|
| `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 |
|
| `item` | item(): String | Gibt den Itemtyp der Main-Hand zurück |
|
||||||
| `offHandItem` | offHandItem(): String | Gibt den Itemtyp der Off-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
|
### random
|
||||||
Das `random`-Modul stellt Funktionen zur Verfügung, die Zufallszahlen betreffen.
|
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 |
|
| `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 |
|
| `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 |
|
||||||
YoyoNow
hat
s.o. s.o.
|
|||||||
|
| | setItem(Number, String, String, List<String>, Boolean, Number, Function\<String>) | Gebe die Anzahl der Items an |
|
||||||
YoyoNow
hat
s.o. s.o.
|
|||||||
|
| `setCloseHandler` | setCloseHandler(Function\<Void>) | 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
|
# SteamWar.de-Global-Api
|
||||||
Mit `/script` kann man Script-Bücher global abspeichern. Diese haben dann zugrif auf die `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.
|
Die `global`-Api stellt Funktionen zur Verfügung um auf Events, Commands und Hotkeys mit einem Script zu reagieren.
|
||||||
@ -349,3 +381,13 @@ end
|
|||||||
|
|
||||||
hotkey("ctrl+v", handler)
|
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
Ich würde in die erste Zeile, wioe ich das schon bei Random gemacht habe
-"-
schreiben wenn es der gleiche Name ist.