Script System Lua #178
21
BauSystem_Linkage/src/de/steamwar/linkage/types/LuaLib_GENERIC.java
Normale Datei
@ -0,0 +1,21 @@
|
|||||||
|
package de.steamwar.linkage.types;
|
||||||
|
|
||||||
|
import de.steamwar.linkage.LinkageType;
|
||||||
|
import de.steamwar.linkage.plan.BuildPlan;
|
||||||
|
import de.steamwar.linkage.plan.MethodBuilder;
|
||||||
|
|
||||||
|
import javax.lang.model.element.TypeElement;
|
||||||
|
|
||||||
|
public class LuaLib_GENERIC implements LinkageType {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String method() {
|
||||||
|
return "link";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generateCode(BuildPlan buildPlan, MethodBuilder methodBuilder, String s, TypeElement typeElement) {
|
||||||
|
buildPlan.addImport("de.steamwar.bausystem.features.script.lua.SteamWarLuaPlugin");
|
||||||
|
methodBuilder.addLine("SteamWarLuaPlugin.add(" + s + ");");
|
||||||
|
}
|
||||||
|
}
|
@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.linkage.types;
|
|
||||||
|
|
||||||
import de.steamwar.linkage.LinkageType;
|
|
||||||
import de.steamwar.linkage.plan.BuildPlan;
|
|
||||||
import de.steamwar.linkage.plan.MethodBuilder;
|
|
||||||
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
|
|
||||||
public class Operator_GENERIC implements LinkageType {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String method() {
|
|
||||||
return "linkScriptCommands";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void generateCode(BuildPlan buildPlan, MethodBuilder methodBuilder, String s, TypeElement typeElement) {
|
|
||||||
buildPlan.addImport("de.steamwar.bausystem.features.script.expression.Expression");
|
|
||||||
methodBuilder.addLine("Expression.registerOperator(" + s + ");");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.linkage.types;
|
|
||||||
|
|
||||||
import de.steamwar.linkage.LinkageType;
|
|
||||||
import de.steamwar.linkage.plan.BuildPlan;
|
|
||||||
import de.steamwar.linkage.plan.MethodBuilder;
|
|
||||||
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
|
|
||||||
public class SpecialCommand_GENERIC implements LinkageType {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String method() {
|
|
||||||
return "linkScriptCommands";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void generateCode(BuildPlan buildPlan, MethodBuilder methodBuilder, String s, TypeElement typeElement) {
|
|
||||||
buildPlan.addImport("de.steamwar.bausystem.features.script.ScriptExecutor");
|
|
||||||
methodBuilder.addLine("ScriptExecutor.SPECIAL_COMMANDS.add(" + s + ");");
|
|
||||||
}
|
|
||||||
}
|
|
@ -64,4 +64,6 @@ dependencies {
|
|||||||
annotationProcessor swdep('SpigotCore')
|
annotationProcessor swdep('SpigotCore')
|
||||||
|
|
||||||
compileOnly swdep('FastAsyncWorldEdit-1.18')
|
compileOnly swdep('FastAsyncWorldEdit-1.18')
|
||||||
|
|
||||||
|
implementation 'org.luaj:luaj-jse:3.0.1'
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
|
|||||||
}
|
}
|
@ -20,8 +20,6 @@
|
|||||||
package de.steamwar.bausystem.features.region;
|
package de.steamwar.bausystem.features.region;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.features.script.CustomScriptManager;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.event.EventType;
|
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.region.RegionUtils;
|
import de.steamwar.bausystem.region.RegionUtils;
|
||||||
import de.steamwar.bausystem.region.flags.Flag;
|
import de.steamwar.bausystem.region.flags.Flag;
|
||||||
@ -48,10 +46,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
@Linked
|
@Linked
|
||||||
public class TNTListener implements Listener, ScoreboardElement {
|
public class TNTListener implements Listener, ScoreboardElement {
|
||||||
|
|
||||||
@LinkedInstance
|
private void explode(List<Block> blockList) {
|
||||||
public CustomScriptManager customScriptManager;
|
|
||||||
|
|
||||||
private void explode(List<Block> blockList, Location location, EventType eventType, Event event) {
|
|
||||||
AtomicBoolean inBuild = new AtomicBoolean();
|
AtomicBoolean inBuild = new AtomicBoolean();
|
||||||
blockList.removeIf(block -> {
|
blockList.removeIf(block -> {
|
||||||
Region region = Region.getRegion(block.getLocation());
|
Region region = Region.getRegion(block.getLocation());
|
||||||
@ -71,24 +66,16 @@ public class TNTListener implements Listener, ScoreboardElement {
|
|||||||
}
|
}
|
||||||
return value == TNTMode.DENY;
|
return value == TNTMode.DENY;
|
||||||
});
|
});
|
||||||
if (inBuild.get()) {
|
|
||||||
Region region = Region.getRegion(location);
|
|
||||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
|
||||||
if (region.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) {
|
|
||||||
customScriptManager.callEvent(eventType, player, event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockExplode(BlockExplodeEvent event) {
|
public void onBlockExplode(BlockExplodeEvent event) {
|
||||||
explode(event.blockList(), event.getBlock().getLocation(), null, null);
|
explode(event.blockList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||||
public void onExplode(EntityExplodeEvent event) {
|
public void onExplode(EntityExplodeEvent event) {
|
||||||
explode(event.blockList(), event.getLocation(), EventType.TNTExplodeInBuild, event);
|
explode(event.blockList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,342 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.SWUtils;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.MenuScript;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.Script;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.command.CustomCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.command.InventoryCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.command.MenuCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.event.CustomEvent;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.event.EventType;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.event.InventoryEvent;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.event.MenuEvent;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.hotkey.Hotkey;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.hotkey.Hotkeys;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.hotkey.InventoryHotkey;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.hotkey.MenuHotkey;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import de.steamwar.inventory.SWListInv;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import de.steamwar.sql.UserConfig;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.Cancellable;
|
|
||||||
import org.bukkit.event.Event;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
import yapion.hierarchy.output.LengthOutput;
|
|
||||||
import yapion.hierarchy.output.StringOutput;
|
|
||||||
import yapion.hierarchy.types.YAPIONArray;
|
|
||||||
import yapion.hierarchy.types.YAPIONMap;
|
|
||||||
import yapion.hierarchy.types.YAPIONObject;
|
|
||||||
import yapion.hierarchy.types.YAPIONValue;
|
|
||||||
import yapion.parser.YAPIONParser;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class CustomScriptManager implements Listener {
|
|
||||||
|
|
||||||
public final Map<Player, List<Script>> playerMap = Collections.synchronizedMap(new HashMap<>()); // new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
private void updateInventory(Player p) {
|
|
||||||
playerMap.computeIfPresent(p, (player, customCommands) -> {
|
|
||||||
customCommands.removeIf(script -> !(script instanceof MenuScript));
|
|
||||||
return customCommands;
|
|
||||||
});
|
|
||||||
for (ItemStack item : p.getInventory().getContents()) {
|
|
||||||
if (item == null || FlatteningWrapper.impl.isNoBook(item) || item.getItemMeta() == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
BookMeta bookMeta = ((BookMeta) item.getItemMeta());
|
|
||||||
if (bookMeta.getPageCount() == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (bookMeta.getPage(1).isEmpty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String s = bookMeta.getPage(1).split("\n")[0];
|
|
||||||
if (s.startsWith("#!CMD /")) {
|
|
||||||
playerMap.computeIfAbsent(p, player -> new ArrayList<>()).add(new InventoryCommand(bookMeta, s.substring(6).split(" ")));
|
|
||||||
} else if (s.startsWith("#!EVENT ")) {
|
|
||||||
playerMap.computeIfAbsent(p, player -> new ArrayList<>()).add(new InventoryEvent(bookMeta, s.substring(8).split(" ")));
|
|
||||||
} else if (s.startsWith("#!HOTKEY ")) {
|
|
||||||
playerMap.computeIfAbsent(p, player -> new ArrayList<>()).add(new InventoryHotkey(bookMeta, s.substring(9).split(" ")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerJoin(PlayerJoinEvent e) {
|
|
||||||
load(e.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void load(Player p) {
|
|
||||||
updateInventory(p);
|
|
||||||
|
|
||||||
String s = UserConfig.getConfig(p.getUniqueId(), "bausystem-scripts");
|
|
||||||
if (s == null) {
|
|
||||||
s = UserConfig.getConfig(p.getUniqueId(), "bausystem-commands");
|
|
||||||
UserConfig.removePlayerConfig(p.getUniqueId(), "bausystem-commands");
|
|
||||||
}
|
|
||||||
YAPIONObject yapionObject;
|
|
||||||
if (s == null) {
|
|
||||||
yapionObject = new YAPIONObject();
|
|
||||||
yapionObject.getYAPIONMapOrSetDefault("events", new YAPIONMap()).add("FF", new YAPIONArray().add("#!EVENT FF /gui Script\ngui"));
|
|
||||||
} else {
|
|
||||||
yapionObject = YAPIONParser.parse(s);
|
|
||||||
if (yapionObject.containsKey("")) {
|
|
||||||
yapionObject.add("commands", yapionObject.getMap(""));
|
|
||||||
yapionObject.remove("");
|
|
||||||
yapionObject.getYAPIONMapOrSetDefault("events", new YAPIONMap()).add("FF", new YAPIONArray().add("#!EVENT FF /gui Script\ngui"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
yapionObject.getYAPIONMapOrSetDefault("commands", new YAPIONMap()).forEach((key, value) -> {
|
|
||||||
String[] command = ((YAPIONValue<String>) key).get().split(" ");
|
|
||||||
List<String> pages = ((YAPIONArray) value).stream().map(YAPIONValue.class::cast).map(YAPIONValue::get).map(String.class::cast).collect(Collectors.toList());
|
|
||||||
playerMap.computeIfAbsent(p, player -> new ArrayList<>()).add(new MenuCommand(pages, command));
|
|
||||||
});
|
|
||||||
|
|
||||||
yapionObject.getYAPIONMapOrSetDefault("events", new YAPIONMap()).forEach((key, value) -> {
|
|
||||||
String[] event = ((YAPIONValue<String>) key).get().split(" ");
|
|
||||||
List<String> pages = ((YAPIONArray) value).stream().map(YAPIONValue.class::cast).map(YAPIONValue::get).map(String.class::cast).collect(Collectors.toList());
|
|
||||||
playerMap.computeIfAbsent(p, player -> new ArrayList<>()).add(new MenuEvent(pages, event));
|
|
||||||
});
|
|
||||||
|
|
||||||
yapionObject.getYAPIONMapOrSetDefault("hotkeys", new YAPIONMap()).forEach((key, value) -> {
|
|
||||||
String[] hotkey = ((YAPIONValue<String>) key).get().split(" ");
|
|
||||||
List<String> pages = ((YAPIONArray) value).stream().map(YAPIONValue.class::cast).map(YAPIONValue::get).map(String.class::cast).collect(Collectors.toList());
|
|
||||||
playerMap.computeIfAbsent(p, player -> new ArrayList<>()).add(new MenuHotkey(pages, hotkey));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerQuit(PlayerQuitEvent e) {
|
|
||||||
save(e.getPlayer());
|
|
||||||
playerMap.remove(e.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
private YAPIONObject output(Player p) {
|
|
||||||
if (!playerMap.containsKey(p)) return new YAPIONObject();
|
|
||||||
YAPIONObject yapionObject = new YAPIONObject();
|
|
||||||
|
|
||||||
YAPIONMap commandsMap = new YAPIONMap();
|
|
||||||
yapionObject.add("commands", commandsMap);
|
|
||||||
playerMap.get(p).stream().filter(MenuCommand.class::isInstance).map(MenuCommand.class::cast).forEach(menuCommand -> {
|
|
||||||
menuCommand.save(commandsMap);
|
|
||||||
});
|
|
||||||
|
|
||||||
YAPIONMap eventsMap = new YAPIONMap();
|
|
||||||
yapionObject.add("events", eventsMap);
|
|
||||||
playerMap.get(p).stream().filter(MenuEvent.class::isInstance).map(MenuEvent.class::cast).forEach(menuCommand -> {
|
|
||||||
menuCommand.save(eventsMap);
|
|
||||||
});
|
|
||||||
|
|
||||||
YAPIONMap hotkeysMap = new YAPIONMap();
|
|
||||||
yapionObject.add("hotkeys", hotkeysMap);
|
|
||||||
playerMap.get(p).stream().filter(MenuHotkey.class::isInstance).map(MenuHotkey.class::cast).forEach(menuCommand -> {
|
|
||||||
menuCommand.save(hotkeysMap);
|
|
||||||
});
|
|
||||||
return yapionObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean save(Player p) {
|
|
||||||
if (!playerMap.containsKey(p)) {
|
|
||||||
UserConfig.removePlayerConfig(p.getUniqueId(), "bausystem-scripts");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
YAPIONObject yapionObject = output(p);
|
|
||||||
if (yapionObject.toYAPION(new LengthOutput()).getLength() > 64 * 1024) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
UserConfig.updatePlayerConfig(p.getUniqueId(), "bausystem-scripts", yapionObject.toYAPION(new StringOutput()).getResult());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onInventoryClose(InventoryCloseEvent e) {
|
|
||||||
if (e.getPlayer() instanceof Player) {
|
|
||||||
updateInventory((Player) e.getPlayer());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void openCommandsMenu(Player p) {
|
|
||||||
List<SWListInv.SWListEntry<MenuScript>> menuCommands = new ArrayList<>();
|
|
||||||
playerMap.getOrDefault(p, new ArrayList<>()).stream().filter(MenuScript.class::isInstance).map(MenuScript.class::cast).forEach(menuItem -> {
|
|
||||||
SWItem swItem = menuItem.toItem(p);
|
|
||||||
ItemStack itemStack = swItem.getItemStack();
|
|
||||||
if (menuItem instanceof MenuHotkey) {
|
|
||||||
itemStack.setType(Material.CHAIN_COMMAND_BLOCK);
|
|
||||||
} else if (menuItem instanceof MenuEvent) {
|
|
||||||
itemStack.setType(Material.REPEATING_COMMAND_BLOCK);
|
|
||||||
} else {
|
|
||||||
itemStack.setType(Material.COMMAND_BLOCK);
|
|
||||||
}
|
|
||||||
swItem.setItemStack(itemStack);
|
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("SCRIPT_MENU_GUI_ITEM_LORE_1", p), BauSystem.MESSAGE.parse("SCRIPT_MENU_GUI_ITEM_LORE_2", p)));
|
|
||||||
|
|
||||||
menuCommands.add(new SWListInv.SWListEntry<>(swItem, menuItem));
|
|
||||||
});
|
|
||||||
|
|
||||||
int length = (int) output(p).toYAPION(new LengthOutput()).getLength();
|
|
||||||
double percentage = ((int) ((length / 655336.0) * 1000)) / 10.0;
|
|
||||||
String menuName = BauSystem.MESSAGE.parse("SCRIPT_MENU_GUI_NAME", p, percentage > 99 ? "§c" : (percentage >= 75 ? "§6" : "§a"), percentage);
|
|
||||||
|
|
||||||
SWListInv<MenuScript> menuCommandSWListInv = new SWListInv<>(p, menuName, false, menuCommands, (clickType, menuCommand) -> {
|
|
||||||
if (!clickType.isShiftClick()) {
|
|
||||||
playerMap.get(p).removeIf(customCommand -> customCommand == menuCommand);
|
|
||||||
}
|
|
||||||
SWUtils.giveItemToPlayer(p, menuCommand.toItem(p).getItemStack());
|
|
||||||
p.closeInventory();
|
|
||||||
save(p);
|
|
||||||
});
|
|
||||||
menuCommandSWListInv.setItem(49, new SWItem(Material.HOPPER, BauSystem.MESSAGE.parse("SCRIPT_MENU_GUI_ITEM_ADD_NAME", p), Arrays.asList(BauSystem.MESSAGE.parse("SCRIPT_MENU_GUI_ITEM_ADD_LORE", p)), false, clickType -> {
|
|
||||||
ItemStack item = p.getItemOnCursor();
|
|
||||||
if (item.getType().isAir()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (FlatteningWrapper.impl.isNoBook(item) || item.getItemMeta() == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
BookMeta bookMeta = ((BookMeta) item.getItemMeta());
|
|
||||||
if (bookMeta.getPageCount() == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (bookMeta.getPage(1).isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String s = bookMeta.getPage(1).split("\n")[0];
|
|
||||||
if (s.startsWith("#!CMD /")) {
|
|
||||||
MenuCommand menuCommand = new MenuCommand(bookMeta.getPages(), s.substring(6).split(" "));
|
|
||||||
for (Script script : playerMap.computeIfAbsent(p, player -> new ArrayList<>())) {
|
|
||||||
if (!(script instanceof MenuCommand)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (((MenuCommand) script).equals(menuCommand)) {
|
|
||||||
BauSystem.MESSAGE.sendPrefixless("SCRIPT_MENU_GUI_DUPLICATE_COMMAND", p, String.join(" ", menuCommand.command()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scriptBookLimit(p, menuCommand);
|
|
||||||
} else if (s.startsWith("#!EVENT ")) {
|
|
||||||
MenuEvent menuEvent = new MenuEvent(bookMeta.getPages(), s.substring(8).split(" "));
|
|
||||||
try {
|
|
||||||
EventType.valueOf(menuEvent.eventName());
|
|
||||||
} catch (Exception e) {
|
|
||||||
BauSystem.MESSAGE.sendPrefixless("SCRIPT_MENU_GUI_UNKNOWN_EVENT", p, menuEvent.eventName());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scriptBookLimit(p, menuEvent);
|
|
||||||
} else if (s.startsWith("#!HOTKEY ")) {
|
|
||||||
scriptBookLimit(p, new MenuHotkey(bookMeta.getPages(), s.substring(9).split(" ")));
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
menuCommandSWListInv.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void scriptBookLimit(Player p, Script menuScript) {
|
|
||||||
playerMap.computeIfAbsent(p, player -> new ArrayList<>()).add(menuScript);
|
|
||||||
if (!save(p)) {
|
|
||||||
playerMap.get(p).removeIf(script -> script == menuScript);
|
|
||||||
p.closeInventory();
|
|
||||||
SWUtils.giveItemToPlayer(p, p.getItemOnCursor());
|
|
||||||
save(p);
|
|
||||||
BauSystem.MESSAGE.sendPrefixless("SCRIPT_MENU_GUI_LIMIT", p);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
p.setItemOnCursor(null);
|
|
||||||
openCommandsMenu(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean callCommand(Player p, PlayerCommandPreprocessEvent e, String message) {
|
|
||||||
List<CustomCommand> customCommands = playerMap.getOrDefault(p, new ArrayList<>()).stream().filter(CustomCommand.class::isInstance).map(CustomCommand.class::cast).collect(Collectors.toList());
|
|
||||||
String[] command = message.split(" ");
|
|
||||||
for (CustomCommand customCommand : customCommands) {
|
|
||||||
if (customCommand.execute(command, e)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean callScoreboard(Player p, Map<String, String> variables, Consumer<String> echoConsumer) {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
for (Map.Entry<String, String> entry : variables.entrySet()) {
|
|
||||||
valueMap.put(entry.getKey(), new Value.StringValue(entry.getValue()));
|
|
||||||
}
|
|
||||||
List<CustomEvent> customEvents = playerMap.getOrDefault(p, new ArrayList<>()).stream().filter(CustomEvent.class::isInstance).map(CustomEvent.class::cast).collect(Collectors.toList());
|
|
||||||
boolean hasScript = false;
|
|
||||||
for (CustomEvent customEvent : customEvents) {
|
|
||||||
if (customEvent.eventName().equals(EventType.Scoreboard.name())) {
|
|
||||||
customEvent.execute(p, valueMap, echoConsumer);
|
|
||||||
hasScript = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hasScript;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void callEvent(EventType eventType, Player p, Event e) {
|
|
||||||
if (eventType == null) return;
|
|
||||||
if (!eventType.getEventType().equals(e.getClass())) return;
|
|
||||||
|
|
||||||
List<CustomEvent> customEvents = playerMap.getOrDefault(p, new ArrayList<>()).stream().filter(CustomEvent.class::isInstance).map(CustomEvent.class::cast).collect(Collectors.toList());
|
|
||||||
for (CustomEvent customEvent : customEvents) {
|
|
||||||
if (customEvent.eventName().equals(eventType.name())) {
|
|
||||||
Map<String, Value> variables = eventType.getEventValues().apply(e);
|
|
||||||
if (variables == null) {
|
|
||||||
variables = new HashMap<>();
|
|
||||||
}
|
|
||||||
if (e instanceof Cancellable) {
|
|
||||||
variables.put("cancel", new Value.BooleanValue(((Cancellable) e).isCancelled()));
|
|
||||||
}
|
|
||||||
customEvent.execute(p, variables, null);
|
|
||||||
if (variables.containsKey("cancel")) {
|
|
||||||
Value value = variables.get("cancel");
|
|
||||||
((Cancellable) e).setCancelled(value.asBoolean());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void callHotkey(int modifiers, char pressedHotkey, Player p, boolean pressed) {
|
|
||||||
List<Hotkey> hotkeys = playerMap.getOrDefault(p, new ArrayList<>()).stream().filter(Hotkey.class::isInstance).map(Hotkey.class::cast).collect(Collectors.toList());
|
|
||||||
for (Hotkey hotkey : hotkeys) {
|
|
||||||
if (Hotkeys.isSame(modifiers, pressedHotkey, hotkey.hotkey())) {
|
|
||||||
hotkey.execute(p, pressed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,163 +1,10 @@
|
|||||||
package de.steamwar.bausystem.features.script;
|
package de.steamwar.bausystem.features.script;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import de.steamwar.inventory.SWListInv;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import de.steamwar.linkage.LinkedInstance;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static de.steamwar.bausystem.features.script.ScriptExecutor.SPECIAL_COMMANDS;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class ScriptCommand extends SWCommand {
|
public class ScriptCommand extends SWCommand {
|
||||||
|
|
||||||
public ScriptCommand() {
|
public ScriptCommand() {
|
||||||
super("script");
|
super("script");
|
||||||
}
|
}
|
||||||
|
|
||||||
@LinkedInstance
|
|
||||||
public CustomScriptManager customScriptManager = null;
|
|
||||||
|
|
||||||
private List<String> loreBuilder(Player p, String... strings) {
|
|
||||||
List<String> result = new ArrayList<>();
|
|
||||||
for (String s : strings) {
|
|
||||||
result.addAll(split(BauSystem.MESSAGE.parse(s, p)));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(description = "SCRIPT_COMMAND_HELP")
|
|
||||||
public void menuCommand(Player p) {
|
|
||||||
List<SWListInv.SWListEntry<SpecialCommand>> swItems = new ArrayList<>();
|
|
||||||
addEmptyItems(swItems, 2);
|
|
||||||
swItems.add(new SWListInv.SWListEntry<>(createItem(p, Material.BOOK, "SCRIPT_GUI_CUSTOM_HOTKEYS", loreBuilder(p, "SCRIPT_GUI_CUSTOM_HOTKEYS_COMMANDS_LORE_1", "SCRIPT_GUI_CUSTOM_HOTKEYS_COMMANDS_LORE_2", "SCRIPT_GUI_CUSTOM_HOTKEYS_COMMANDS_LORE_3", "SCRIPT_GUI_CUSTOM_HOTKEYS_COMMANDS_LORE_4", "SCRIPT_GUI_CUSTOM_HOTKEYS_COMMANDS_LORE_5")), null));
|
|
||||||
swItems.add(new SWListInv.SWListEntry<>(createItem(p, Material.BOOK, "SCRIPT_GUI_CUSTOM_COMMANDS", loreBuilder(p, "SCRIPT_GUI_CUSTOM_COMMANDS_LORE_1", "SCRIPT_GUI_CUSTOM_COMMANDS_LORE_2")), null));
|
|
||||||
swItems.add(new SWListInv.SWListEntry<>(createItem(p, Material.BOOK, "SCRIPT_GUI_CUSTOM_EVENTS", loreBuilder(p, "SCRIPT_GUI_CUSTOM_EVENTS_LORE_1", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_2", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_3", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_4", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_5", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_6", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_7", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_8", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_9", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_10", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_11", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_12", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_13", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_14", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_15", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_16", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_17", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_18", "SCRIPT_GUI_CUSTOM_EVENTS_LORE_STAR_1")), null));
|
|
||||||
addEmptyItems(swItems, 1);
|
|
||||||
swItems.add(new SWListInv.SWListEntry<>(createItem(p, Material.BOOK, "SCRIPT_GUI_OTHER", loreBuilder(p, "SCRIPT_GUI_OTHER_LORE_1", "SCRIPT_GUI_OTHER_LORE_2", "SCRIPT_GUI_OTHER_LORE_3", "SCRIPT_GUI_OTHER_LORE_4", "SCRIPT_GUI_OTHER_LORE_5", "SCRIPT_GUI_OTHER_LORE_6", "SCRIPT_GUI_OTHER_LORE_7", "SCRIPT_GUI_OTHER_LORE_8", "SCRIPT_GUI_OTHER_LORE_9", "SCRIPT_GUI_OTHER_LORE_10", "SCRIPT_GUI_OTHER_LORE_11", "SCRIPT_GUI_OTHER_LORE_12", "SCRIPT_GUI_OTHER_LORE_13", "SCRIPT_GUI_OTHER_LORE_14", "SCRIPT_GUI_OTHER_LORE_15", "SCRIPT_GUI_OTHER_LORE_16", "SCRIPT_GUI_OTHER_LORE_17", "SCRIPT_GUI_OTHER_LORE_18")), null));
|
|
||||||
addEmptyItems(swItems, 2);
|
|
||||||
addCustomScriptsItems(swItems, p);
|
|
||||||
addEmptyItems(swItems, 45 - swItems.size() % 45);
|
|
||||||
addEmptyItems(swItems, 4);
|
|
||||||
swItems.add(new SWListInv.SWListEntry<>(createItem(p, Material.BOOK, "SCRIPT_GUI_CUSTOM_VARIABLES", new ArrayList<>()), null));
|
|
||||||
addEmptyItems(swItems, 4);
|
|
||||||
addConstantItem(swItems, p, Material.CLOCK, "SCRIPT_GUI_CONSTANT_TIME_NAME", "SCRIPT_GUI_CONSTANT_TIME_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.CLOCK, "SCRIPT_GUI_CONSTANT_TICKS_NAME", "SCRIPT_GUI_CONSTANT_TICKS_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.TNT_MINECART, "SCRIPT_GUI_CONSTANT_TRACE_NAME", "SCRIPT_GUI_CONSTANT_TRACE_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.TNT_MINECART, "SCRIPT_GUI_CONSTANT_AUTO_TRACE_NAME", "SCRIPT_GUI_CONSTANT_AUTO_TRACE_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.TNT_MINECART, "SCRIPT_GUI_CONSTANT_TRACE_STATUS_NAME", "SCRIPT_GUI_CONSTANT_TRACE_STATUS_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.TNT_MINECART, "SCRIPT_GUI_CONSTANT_TRACE_TIME_NAME", "SCRIPT_GUI_CONSTANT_TRACE_TIME_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.HOPPER, "SCRIPT_GUI_CONSTANT_LOADER_STATUS_NAME", "SCRIPT_GUI_CONSTANT_LOADER_STATUS_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.TNT, "SCRIPT_GUI_CONSTANT_TNT_NAME", "SCRIPT_GUI_CONSTANT_TNT_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.TNT, "SCRIPT_GUI_CONSTANT_ONLY_TB_NAME", "SCRIPT_GUI_CONSTANT_ONLY_TB_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.GUNPOWDER, "SCRIPT_GUI_CONSTANT_FREEZE_NAME", "SCRIPT_GUI_CONSTANT_FREEZE_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.FIRE_CHARGE, "SCRIPT_GUI_CONSTANT_FIRE_NAME", "SCRIPT_GUI_CONSTANT_FIRE_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.OBSIDIAN, "SCRIPT_GUI_CONSTANT_PROTECT_NAME", "SCRIPT_GUI_CONSTANT_PROTECT_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.PLAYER_HEAD, "SCRIPT_GUI_CONSTANT_X_NAME", "SCRIPT_GUI_CONSTANT_X_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.PLAYER_HEAD, "SCRIPT_GUI_CONSTANT_Y_NAME", "SCRIPT_GUI_CONSTANT_Y_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.PLAYER_HEAD, "SCRIPT_GUI_CONSTANT_Z_NAME", "SCRIPT_GUI_CONSTANT_Z_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.NAME_TAG, "SCRIPT_GUI_CONSTANT_NAME_NAME", "SCRIPT_GUI_CONSTANT_NAME_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.IRON_BOOTS, "SCRIPT_GUI_CONSTANT_SNEAK_NAME", "SCRIPT_GUI_CONSTANT_SNEAK_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.DIAMOND_BOOTS, "SCRIPT_GUI_CONSTANT_SPRINTING_NAME", "SCRIPT_GUI_CONSTANT_SPRINTING_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.ARROW, "SCRIPT_GUI_CONSTANT_SLOT_NAME", "SCRIPT_GUI_CONSTANT_SLOT_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.GRASS_BLOCK, "SCRIPT_GUI_CONSTANT_SLOT_MATERIAL_NAME", "SCRIPT_GUI_CONSTANT_SLOT_MATERIAL_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.IRON_BLOCK, "SCRIPT_GUI_CONSTANT_OFF_HAND_MATERIAL_NAME", "SCRIPT_GUI_CONSTANT_OFF_HAND_MATERIAL_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.BIRCH_SIGN, "SCRIPT_GUI_CONSTANT_SLOT_MATERIAL_DISPLAY_NAME", "SCRIPT_GUI_CONSTANT_SLOT_MATERIAL_DISPLAY_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.ACACIA_SIGN, "SCRIPT_GUI_CONSTANT_OFF_HAND_MATERIAL_DISPLAY_NAME", "SCRIPT_GUI_CONSTANT_OFF_HAND_MATERIAL_DISPLAY_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.MAP, "SCRIPT_GUI_CONSTANT_REGION_TYPE_NAME", "SCRIPT_GUI_CONSTANT_REGION_TYPE_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.MAP, "SCRIPT_GUI_CONSTANT_REGION_NAME_NAME", "SCRIPT_GUI_CONSTANT_REGION_NAME_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.COMPASS, "SCRIPT_GUI_CONSTANT_TPS_NAME", "SCRIPT_GUI_CONSTANT_TPS_LORE");
|
|
||||||
addConstantItem(swItems, p, Material.COMPASS, "SCRIPT_GUI_CONSTANT_TPS_LIMIT_NAME", "SCRIPT_GUI_CONSTANT_TPS_LIMIT_LORE");
|
|
||||||
addEmptyItems(swItems, 45 - swItems.size() % 45);
|
|
||||||
|
|
||||||
SWListInv<SpecialCommand> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("SCRIPT_GUI_NAME", p), swItems, (clickType, o) -> {
|
|
||||||
if (o != null) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_GUI_COMMAND_CHAT", p, o.command());
|
|
||||||
for (String s : o.description()) {
|
|
||||||
if (s.isEmpty()) {
|
|
||||||
BauSystem.MESSAGE.sendPrefixless("PREFIX", p);
|
|
||||||
} else {
|
|
||||||
BauSystem.MESSAGE.send(s, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.closeInventory();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
swListInv.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addEmptyItems(List<SWListInv.SWListEntry<SpecialCommand>> swItems, int count) {
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
swItems.add(new SWListInv.SWListEntry<>(new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7", new ArrayList<>(), false, clickType -> {
|
|
||||||
}), null));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem createItem(Player p, Material material, String name, List<String> lore) {
|
|
||||||
return new SWItem(material, BauSystem.MESSAGE.parse(name, p), lore, false, clickType -> {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addConstantItem(List<SWListInv.SWListEntry<SpecialCommand>> swItems, Player p, Material material, String name, String lore) {
|
|
||||||
List<String> itemLore = new ArrayList<>();
|
|
||||||
itemLore.add(BauSystem.MESSAGE.parse(lore, p));
|
|
||||||
swItems.add(new SWListInv.SWListEntry<>(createItem(p, material, name, itemLore), null));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addCustomScriptsItems(List<SWListInv.SWListEntry<SpecialCommand>> swItems, Player p) {
|
|
||||||
List<SpecialCommand> specialCommands = new ArrayList<>(SPECIAL_COMMANDS);
|
|
||||||
specialCommands.sort(Comparator.comparing(specialCommand -> specialCommand.getClass().getTypeName()));
|
|
||||||
specialCommands.forEach(specialCommand -> {
|
|
||||||
List<String> strings = new ArrayList<>();
|
|
||||||
boolean b = false;
|
|
||||||
for (String s : specialCommand.description()) {
|
|
||||||
if (s.isEmpty()) {
|
|
||||||
b = true;
|
|
||||||
strings.add("");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
s = BauSystem.MESSAGE.parse(s, p);
|
|
||||||
if (b) {
|
|
||||||
strings.addAll(split(s));
|
|
||||||
} else {
|
|
||||||
strings.add(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SWItem swItem = new SWItem(specialCommand.material(), BauSystem.MESSAGE.parse("SCRIPT_GUI_COMMAND_NAME", p, specialCommand.command()), strings, false, clickType -> {
|
|
||||||
});
|
|
||||||
swItems.add(new SWListInv.SWListEntry<>(swItem, specialCommand));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> split(String s) {
|
|
||||||
List<String> strings = new ArrayList<>();
|
|
||||||
while (s.length() > 60) {
|
|
||||||
int index = s.indexOf(' ', 60);
|
|
||||||
if (index == -1) {
|
|
||||||
strings.add("§7" + s);
|
|
||||||
s = null;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
strings.add("§7" + s.substring(0, index));
|
|
||||||
s = s.substring(index + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (s != null) {
|
|
||||||
strings.add("§7" + s);
|
|
||||||
}
|
|
||||||
return strings;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "menu", description = "SCRIPT_COMMAND_HELP_MENU")
|
|
||||||
public void menuGUICommand(Player p) {
|
|
||||||
customScriptManager.openCommandsMenu(p);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,304 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script;
|
|
||||||
|
|
||||||
import com.sk89q.worldedit.EditSession;
|
|
||||||
import com.sk89q.worldedit.WorldEdit;
|
|
||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
|
||||||
import com.sk89q.worldedit.event.platform.CommandEvent;
|
|
||||||
import com.sk89q.worldedit.extension.platform.Actor;
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Expression;
|
|
||||||
import de.steamwar.bausystem.features.script.expression.UnknownOperatorException;
|
|
||||||
import de.steamwar.bausystem.features.script.expression.VarNotFoundException;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Constants;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Context;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.bausystem.features.world.WorldEditListener;
|
|
||||||
import de.steamwar.bausystem.linkage.LinkageUtils;
|
|
||||||
import de.steamwar.bausystem.utils.WorldEditUtils;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import net.md_5.bungee.api.ChatColor;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
public final class ScriptExecutor {
|
|
||||||
|
|
||||||
public static final Set<SpecialCommand> SPECIAL_COMMANDS = new HashSet<>();
|
|
||||||
|
|
||||||
static {
|
|
||||||
LinkageUtils.linkScriptCommands();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final boolean hasFAWE = Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null;
|
|
||||||
|
|
||||||
private String specialCommand = null;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Player player;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Context localVariables = new Context();
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Context globalVariables;
|
|
||||||
|
|
||||||
private final List<String> commands = new ArrayList<>();
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
public final Map<String, Integer> jumpPoints = new HashMap<>();
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final LinkedList<Integer> returnStack = new LinkedList<>();
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private int index = 0;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Consumer<String> echoConsumer;
|
|
||||||
|
|
||||||
public ScriptExecutor(BookMeta bookMeta, Player player, Consumer<String> echoConsumer) {
|
|
||||||
this(bookMeta, player, new HashMap<>(), echoConsumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ScriptExecutor(List<String> pages, Player player, Consumer<String> echoConsumer) {
|
|
||||||
this(pages, player, new HashMap<>(), echoConsumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ScriptExecutor(BookMeta bookMeta, Player player, Map<String, Value> localVariables, Consumer<String> echoConsumer) {
|
|
||||||
this.player = player;
|
|
||||||
globalVariables = ScriptListener.getGlobalContext(player);
|
|
||||||
|
|
||||||
parseMeta(bookMeta);
|
|
||||||
this.echoConsumer = echoConsumer != null ? echoConsumer : s -> {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_IO_ECHO_MESSAGE", player, s);
|
|
||||||
};
|
|
||||||
if (commands.isEmpty()) return;
|
|
||||||
localVariables.forEach(this.localVariables::putValue);
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ScriptExecutor(List<String> pages, Player player, Map<String, Value> localVariables, Consumer<String> echoConsumer) {
|
|
||||||
this.player = player;
|
|
||||||
globalVariables = ScriptListener.getGlobalContext(player);
|
|
||||||
|
|
||||||
parseList(pages);
|
|
||||||
this.echoConsumer = echoConsumer != null ? echoConsumer : s -> {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_IO_ECHO_MESSAGE", player, s);
|
|
||||||
};
|
|
||||||
if (commands.isEmpty()) return;
|
|
||||||
localVariables.forEach(this.localVariables::putValue);
|
|
||||||
resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void parseMeta(BookMeta bookMeta) {
|
|
||||||
boolean initial = true;
|
|
||||||
for (String page : bookMeta.getPages()) {
|
|
||||||
initial = parsePage(page, initial);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void parseList(List<String> pages) {
|
|
||||||
boolean initial = true;
|
|
||||||
for (String page : pages) {
|
|
||||||
initial = parsePage(page, initial);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean parsePage(String page, boolean initial) {
|
|
||||||
for (String command : page.split("\n")) {
|
|
||||||
command = command.replaceAll(" +", " ");
|
|
||||||
if (command.startsWith("#") || command.trim().isEmpty()) {
|
|
||||||
if (initial && command.startsWith("#!CMD /")) {
|
|
||||||
specialCommand = command.substring(7).split(" ")[0];
|
|
||||||
}
|
|
||||||
initial = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
initial = false;
|
|
||||||
if (command.startsWith(".")) {
|
|
||||||
jumpPoints.put(command.substring(1), commands.size());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
commands.add(command);
|
|
||||||
}
|
|
||||||
return initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void resume() {
|
|
||||||
if (!player.isOnline()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int executionPoints = 0;
|
|
||||||
|
|
||||||
while (index < commands.size()) {
|
|
||||||
String command = commands.get(index).trim();
|
|
||||||
index++;
|
|
||||||
if (executionPoints++ > 200) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_SLEEP_ERROR", player);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String[] strings = replaceExpressions(command);
|
|
||||||
if (strings.length == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
boolean found = false;
|
|
||||||
for (SpecialCommand specialCommand : SPECIAL_COMMANDS) {
|
|
||||||
if (specialCommand.command().equalsIgnoreCase(strings[0])) {
|
|
||||||
found = true;
|
|
||||||
if (!specialCommand.execute(strings, this)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (found) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strings[0].contains(":")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Variable Replaces in commands.
|
|
||||||
command = String.join(" ", strings);
|
|
||||||
|
|
||||||
PlayerCommandPreprocessEvent preprocessEvent = new PlayerCommandPreprocessEvent(player, "/" + (specialCommand != null && command.startsWith(specialCommand) ? "script:" : "") + command);
|
|
||||||
Bukkit.getServer().getPluginManager().callEvent(preprocessEvent);
|
|
||||||
if (preprocessEvent.isCancelled()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Bukkit.getLogger().log(Level.INFO, player.getName() + " dispatched command: " + command);
|
|
||||||
if (!strings[0].equals("select") && hasFAWE && WorldEditListener.isWorldEditCommand("/" + strings[0])) {
|
|
||||||
EditSession editSession = WorldEditUtils.getEditSession(player);
|
|
||||||
Actor actor = BukkitAdapter.adapt(player);
|
|
||||||
WorldEdit.getInstance().getPlatformManager().getPlatformCommandManager().handleCommandOnCurrentThread(new CommandEvent(actor, command, editSession));
|
|
||||||
editSession.flushSession();
|
|
||||||
WorldEditUtils.addToPlayer(player, editSession);
|
|
||||||
} else {
|
|
||||||
Bukkit.getServer().dispatchCommand(player, command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String[] replaceExpressions(String s) {
|
|
||||||
s = s.replaceAll(" +", " ");
|
|
||||||
StringBuilder result = new StringBuilder();
|
|
||||||
int depth = 0;
|
|
||||||
StringBuilder st = new StringBuilder();
|
|
||||||
for (int i = 0; i < s.length(); i++) {
|
|
||||||
char c = s.charAt(i);
|
|
||||||
if (c == '{') {
|
|
||||||
st.append(c);
|
|
||||||
depth++;
|
|
||||||
} else if (c == '}') {
|
|
||||||
st.append(c);
|
|
||||||
depth--;
|
|
||||||
if (depth == 0) {
|
|
||||||
try {
|
|
||||||
Expression expression = new Expression(player, st.toString(), this);
|
|
||||||
result.append(expression.eval().asString());
|
|
||||||
st = new StringBuilder();
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
BauSystem.MESSAGE.send(e.getMessage(), player);
|
|
||||||
return new String[0];
|
|
||||||
} catch (VarNotFoundException e) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_UNKNOWN_VAR", player, e.getMessage());
|
|
||||||
return new String[0];
|
|
||||||
} catch (IndexOutOfBoundsException e) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_EXPRESSION", player, st.toString());
|
|
||||||
return new String[0];
|
|
||||||
} catch (UnknownOperatorException e) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_UNKNOWN_OPERATION", player, e.getMessage());
|
|
||||||
return new String[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (st.length() > 0) {
|
|
||||||
st.append(c);
|
|
||||||
} else {
|
|
||||||
result.append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString().split(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
public Value getOrItselfValue(String variable) {
|
|
||||||
if (!isVariable(variable)) {
|
|
||||||
return Value.parse(variable);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (localVariables.hasValue(variable)) {
|
|
||||||
return localVariables.getValue(variable);
|
|
||||||
}
|
|
||||||
if (globalVariables.hasValue(variable)) {
|
|
||||||
return globalVariables.getValue(variable);
|
|
||||||
}
|
|
||||||
return Constants.getConstant(variable, player);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Value getValueOrNull(String variable) {
|
|
||||||
if (localVariables.hasValue(variable)) {
|
|
||||||
return localVariables.getValue(variable);
|
|
||||||
}
|
|
||||||
if (globalVariables.hasValue(variable)) {
|
|
||||||
return globalVariables.getValue(variable);
|
|
||||||
}
|
|
||||||
if (Constants.isConstant(variable)) {
|
|
||||||
return Constants.getConstant(variable, player);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOrItself(String variable) {
|
|
||||||
if (isVariable(variable)) {
|
|
||||||
return getValue(variable);
|
|
||||||
}
|
|
||||||
return variable;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isVariable(String variable) {
|
|
||||||
return Constants.isConstant(variable) || globalVariables.hasValue(variable) || localVariables.hasValue(variable);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getValue(String variable) {
|
|
||||||
if (localVariables.hasValue(variable)) {
|
|
||||||
return localVariables.getValue(variable).asString();
|
|
||||||
}
|
|
||||||
if (globalVariables.hasValue(variable)) {
|
|
||||||
return globalVariables.getValue(variable).asString();
|
|
||||||
}
|
|
||||||
if (Constants.isConstant(variable)) {
|
|
||||||
return Constants.getConstant(variable, player).asString();
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getConstant(String variable) {
|
|
||||||
if (Constants.isConstant(variable)) {
|
|
||||||
return Constants.getConstant(variable, player).asString();
|
|
||||||
}
|
|
||||||
return "0";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGlobal(String variable) {
|
|
||||||
if (globalVariables.hasValue(variable)) {
|
|
||||||
return globalVariables.getValue(variable).asString();
|
|
||||||
}
|
|
||||||
return "0";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLocal(String variable) {
|
|
||||||
if (localVariables.hasValue(variable)) {
|
|
||||||
return localVariables.getValue(variable).asString();
|
|
||||||
}
|
|
||||||
return "0";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,5 @@
|
|||||||
package de.steamwar.bausystem.features.script;
|
package de.steamwar.bausystem.features.script;
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Context;
|
|
||||||
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -9,22 +8,19 @@ import org.bukkit.event.EventPriority;
|
|||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.event.player.PlayerSwapHandItemsEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@Linked
|
@Linked
|
||||||
public class ScriptListener implements Listener {
|
public class ScriptListener implements Listener {
|
||||||
|
|
||||||
private static final Map<Player, Context> GLOBAL_CONTEXT = new HashMap<>();
|
private final Set<Player> playerSet = new HashSet<>();
|
||||||
|
|
||||||
private Set<Player> playerSet = new HashSet<>();
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
public void onLeftClick(PlayerInteractEvent event) {
|
public void onLeftClick(PlayerInteractEvent event) {
|
||||||
@ -44,20 +40,22 @@ public class ScriptListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
new ScriptExecutor((BookMeta) item.getItemMeta(), event.getPlayer(), null);
|
ScriptRunner.runScript(((BookMeta) item.getItemMeta()).getPages().stream().reduce((s, s2) -> s + "\n" + s2).orElse(null), event.getPlayer());
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
|
||||||
GLOBAL_CONTEXT.put(event.getPlayer(), new Context());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
GLOBAL_CONTEXT.remove(event.getPlayer());
|
ScriptRunner.remove(event.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Context getGlobalContext(Player player) {
|
@EventHandler
|
||||||
return GLOBAL_CONTEXT.computeIfAbsent(player, ignore -> new Context());
|
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
||||||
|
ItemStack item = event.getOffHandItem();
|
||||||
|
if (item == null || FlatteningWrapper.impl.isNoBook(item) || item.getItemMeta() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
ScriptRunner.createGlobalScript(Collections.singletonList(((BookMeta) item.getItemMeta()).getPages().stream().reduce((s, s2) -> s + "\n" + s2).orElse(null)), event.getPlayer());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,75 @@
|
|||||||
|
package de.steamwar.bausystem.features.script;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.script.lua.CommandRegister;
|
||||||
|
import de.steamwar.bausystem.features.script.lua.SteamWarGlobalLuaPlugin;
|
||||||
|
import de.steamwar.bausystem.features.script.lua.SteamWarPlatform;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.luaj.vm2.Globals;
|
||||||
|
import org.luaj.vm2.LuaFunction;
|
||||||
|
import org.luaj.vm2.LuaValue;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ScriptRunner {
|
||||||
|
|
||||||
|
// Script Table
|
||||||
|
// User
|
||||||
|
// Key -> bau-script-<BUCH NAME>
|
||||||
|
// Value -> <LUA Script>
|
||||||
|
|
||||||
|
private static final Map<Player, Map<SteamWarGlobalLuaPlugin.EventType, List<LuaFunction>>> EVENT_MAP = new HashMap<>();
|
||||||
|
private static final Map<Player, Map<String, CommandRegister>> COMMAND_MAP = new HashMap<>();
|
||||||
|
|
||||||
|
public static void runScript(String script, Player player) {
|
||||||
|
Globals globals = SteamWarPlatform.createClickGlobals(player);
|
||||||
|
|
||||||
|
try {
|
||||||
|
globals.load(script).call();
|
||||||
|
} catch (Exception e) {
|
||||||
|
player.sendMessage("§cFehler beim Ausführen des Scripts: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createGlobalScript(List<String> scripts, Player player) {
|
||||||
|
EVENT_MAP.remove(player);
|
||||||
|
Globals globals = SteamWarPlatform.createGlobalGlobals(player,
|
||||||
|
(s, luaFunction) -> EVENT_MAP.computeIfAbsent(player, player1 -> new HashMap<>()).computeIfAbsent(s, s1 -> new ArrayList<>()).add(luaFunction),
|
||||||
|
commandRegister -> COMMAND_MAP.computeIfAbsent(player, player1 -> new HashMap<>()).put(commandRegister.getName(), commandRegister));
|
||||||
|
|
||||||
|
for (String script : scripts) {
|
||||||
|
globals.load(script).call();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void remove(Player player) {
|
||||||
|
EVENT_MAP.remove(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void callEvent(Player player, SteamWarGlobalLuaPlugin.EventType event, LuaValue eventValue) {
|
||||||
|
Map<SteamWarGlobalLuaPlugin.EventType, List<LuaFunction>> stringListMap = EVENT_MAP.get(player);
|
||||||
|
if (stringListMap == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<LuaFunction> luaFunctions = stringListMap.get(event);
|
||||||
|
if (luaFunctions == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (LuaFunction luaFunction : luaFunctions) {
|
||||||
|
luaFunction.call(eventValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void callCommand(Player player, String command, LuaValue args) {
|
||||||
|
CommandRegister commandRegister = COMMAND_MAP.get(player).get(command.toLowerCase());
|
||||||
|
if (commandRegister == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
commandRegister.getFunction().call(args);
|
||||||
|
}
|
||||||
|
}
|
@ -1,105 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.event.EventType;
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Expression;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import lombok.SneakyThrows;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
|
||||||
import yapion.hierarchy.output.StringOutput;
|
|
||||||
import yapion.hierarchy.types.YAPIONArray;
|
|
||||||
import yapion.hierarchy.types.YAPIONObject;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class ScriptSyntaxSender implements Listener {
|
|
||||||
|
|
||||||
private byte[] syntax;
|
|
||||||
|
|
||||||
{
|
|
||||||
Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(BauSystem.getInstance(), "sw:script_syntax");
|
|
||||||
|
|
||||||
// Whole Syntax object
|
|
||||||
YAPIONObject yapionObject = new YAPIONObject();
|
|
||||||
|
|
||||||
ScriptExecutor.SPECIAL_COMMANDS.toString();
|
|
||||||
|
|
||||||
// Operators
|
|
||||||
YAPIONArray operators = new YAPIONArray();
|
|
||||||
yapionObject.add("@operators", operators);
|
|
||||||
Expression.OPERATORS.forEach((s, operator) -> {
|
|
||||||
operators.add(s);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Headers
|
|
||||||
YAPIONArray headers = new YAPIONArray();
|
|
||||||
yapionObject.add("@headers", headers);
|
|
||||||
headers.add("CMD /.*");
|
|
||||||
headers.add("EVENT " + Arrays.stream(EventType.values()).map(Enum::name).reduce((s, s2) -> s + "|" + s2).map(s -> "(" + s + ")").orElse("") + "( .+)?");
|
|
||||||
headers.add("HOTKEY .+");
|
|
||||||
|
|
||||||
// Variable prefixes
|
|
||||||
YAPIONArray prefixes = new YAPIONArray();
|
|
||||||
yapionObject.add("@prefixes", prefixes);
|
|
||||||
prefixes.add("global");
|
|
||||||
prefixes.add("const");
|
|
||||||
prefixes.add("local");
|
|
||||||
|
|
||||||
// Variable suffixes
|
|
||||||
YAPIONArray suffixes = new YAPIONArray();
|
|
||||||
yapionObject.add("@suffixes", suffixes);
|
|
||||||
suffixes.add("isset");
|
|
||||||
suffixes.add("type");
|
|
||||||
suffixes.add("length");
|
|
||||||
|
|
||||||
// Commands
|
|
||||||
ScriptExecutor.SPECIAL_COMMANDS.forEach(specialCommand -> {
|
|
||||||
YAPIONArray yapionArray = new YAPIONArray();
|
|
||||||
yapionObject.add(specialCommand.command(), yapionArray);
|
|
||||||
if (specialCommand.repeating()) {
|
|
||||||
yapionArray.add(true);
|
|
||||||
} else {
|
|
||||||
yapionArray.add(false);
|
|
||||||
}
|
|
||||||
for (SpecialCommand.TokenType[] types : specialCommand.getSyntax()) {
|
|
||||||
YAPIONArray syntax = new YAPIONArray();
|
|
||||||
yapionArray.add(syntax);
|
|
||||||
for (SpecialCommand.TokenType type : types) {
|
|
||||||
syntax.add(type.ordinal());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
syntax = yapionObject.toJSONLossy(new StringOutput()).getResult().getBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
@SneakyThrows
|
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
|
||||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
|
||||||
event.getPlayer().sendPluginMessage(BauSystem.getInstance(), "sw:script_syntax", syntax);
|
|
||||||
}, 5);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
public interface SpecialCommand {
|
|
||||||
|
|
||||||
default String[] description() {
|
|
||||||
return new String[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
default Material material() {
|
|
||||||
return Material.PAPER;
|
|
||||||
}
|
|
||||||
|
|
||||||
String command();
|
|
||||||
|
|
||||||
boolean execute(String[] command, ScriptExecutor scriptExecutor);
|
|
||||||
|
|
||||||
default boolean repeating() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
TokenType[][] getSyntax();
|
|
||||||
|
|
||||||
default long asLong(String value) {
|
|
||||||
try {
|
|
||||||
return Long.parseLong(value);
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
default boolean asBoolean(String value) {
|
|
||||||
return value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes");
|
|
||||||
}
|
|
||||||
|
|
||||||
default String asString(String value) {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
default void jumpToIndex(ScriptExecutor scriptExecutor, String jumpPoint) {
|
|
||||||
scriptExecutor.jumpPoints.computeIfPresent(jumpPoint, (s, integer) -> {
|
|
||||||
scriptExecutor.setIndex(integer);
|
|
||||||
return integer;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
default void jumpToIndexWithMessage(ScriptExecutor scriptExecutor, String jumpPoint, String message) {
|
|
||||||
Integer jp = scriptExecutor.jumpPoints.getOrDefault(jumpPoint, null);
|
|
||||||
if (jp == null) {
|
|
||||||
scriptExecutor.getPlayer().sendMessage(message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scriptExecutor.setIndex(jp);
|
|
||||||
}
|
|
||||||
|
|
||||||
default void jumpToIndexWithMessageAndReturnStack(ScriptExecutor scriptExecutor, String jumpPoint, String message) {
|
|
||||||
Integer jp = scriptExecutor.jumpPoints.getOrDefault(jumpPoint, null);
|
|
||||||
if (jp == null) {
|
|
||||||
scriptExecutor.getPlayer().sendMessage(message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scriptExecutor.getReturnStack().add(scriptExecutor.getIndex());
|
|
||||||
scriptExecutor.setIndex(jp);
|
|
||||||
}
|
|
||||||
|
|
||||||
default void returnFromStackWithMessage(ScriptExecutor scriptExecutor, String message) {
|
|
||||||
if (scriptExecutor.getReturnStack().isEmpty()) {
|
|
||||||
scriptExecutor.getPlayer().sendMessage(message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scriptExecutor.setIndex(scriptExecutor.getReturnStack().pop());
|
|
||||||
}
|
|
||||||
|
|
||||||
enum TokenType {
|
|
||||||
any, // This does not include jump_point and variable
|
|
||||||
expression,
|
|
||||||
jump_point,
|
|
||||||
variable,
|
|
||||||
|
|
||||||
text_type,
|
|
||||||
number_type,
|
|
||||||
floating_number_type,
|
|
||||||
boolean_type,
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Call implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_CALL_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_CALL_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.LEATHER_BOOTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "call";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOJUMPPOINT", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
jumpToIndexWithMessageAndReturnStack(scriptExecutor, command[1], BauSystem.MESSAGE.parse("SCRIPT_COMMAND_CALL_ERROR", scriptExecutor.getPlayer(), command[1]));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.jump_point },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Exit implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_EXIT_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_EXIT_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.BARRIER;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "exit";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,68 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class If implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_IF_HELP_1",
|
|
||||||
"SCRIPT_COMMAND_IF_HELP_2",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_IF_HELP_3"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.OBSERVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "if";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length < 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR_OR_VALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length < 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOJUMPPOINT", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Value v = scriptExecutor.getOrItselfValue(command[1]);
|
|
||||||
if (!(v instanceof Value.BooleanValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_NO_BOOLEAN", scriptExecutor.getPlayer());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (v.asBoolean() && command.length > 2) {
|
|
||||||
jumpToIndex(scriptExecutor, command[2]);
|
|
||||||
} else if (command.length > 3) {
|
|
||||||
jumpToIndex(scriptExecutor, command[3]);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.boolean_type, TokenType.jump_point },
|
|
||||||
{ TokenType.boolean_type, TokenType.jump_point, TokenType.jump_point },
|
|
||||||
{ TokenType.expression, TokenType.jump_point },
|
|
||||||
{ TokenType.expression, TokenType.jump_point, TokenType.jump_point }
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Jump implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_JUMP_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_JUMP_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.LEATHER_BOOTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "jump";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOJUMPPOINT", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
jumpToIndexWithMessage(scriptExecutor, command[1], BauSystem.MESSAGE.parse("SCRIPT_COMMAND_JUMP_ERROR", scriptExecutor.getPlayer(), command[1]));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.jump_point }
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Return implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_RETURN_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_RETURN_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.DIAMOND_BOOTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "return";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
returnFromStackWithMessage(scriptExecutor, BauSystem.MESSAGE.parse("SCRIPT_COMMAND_RETURN_ERROR", scriptExecutor.getPlayer()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Sleep implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_SLEEP_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_SLEEP_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.CLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "sleep";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NONUMER", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
long sleepTime = asLong(command[1]);
|
|
||||||
if (sleepTime < 0) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_SLEEP_ERROR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (sleepTime == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), scriptExecutor::resume, sleepTime);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.number_type }
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.command.arithmetic.other;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Ceil implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_CEIL_HELP_1",
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_CEIL_HELP_2",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_CEIL_HELP_3"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.REDSTONE_TORCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "ceil";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Value v1;
|
|
||||||
Value v2;
|
|
||||||
if (command.length == 3) {
|
|
||||||
v1 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
v2 = new Value.LongValue(0);
|
|
||||||
} else {
|
|
||||||
v1 = scriptExecutor.getOrItselfValue(command[command.length - 2]);
|
|
||||||
v2 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
}
|
|
||||||
if (!(v1 instanceof Value.DoubleValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_CEIL_ERROR_1", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v2 instanceof Value.LongValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_CEIL_ERROR_2", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (v2.asLong() < 0) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_CEIL_ERROR_2", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (v2.asLong() == 0) {
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.LongValue((long) Math.ceil(v1.asDouble())));
|
|
||||||
} else {
|
|
||||||
double pow = Math.pow(10, v2.asLong());
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.DoubleValue(Math.ceil(v1.asDouble() * pow) / pow));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.variable },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.number_type },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type, TokenType.number_type },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.variable },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type, TokenType.variable },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.command.arithmetic.other;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Floor implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_FLOOR_HELP_1",
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_FLOOR_HELP_2",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_FLOOR_HELP_3"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.REDSTONE_TORCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "floor";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Value v1;
|
|
||||||
Value v2;
|
|
||||||
if (command.length == 3) {
|
|
||||||
v1 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
v2 = new Value.LongValue(0);
|
|
||||||
} else {
|
|
||||||
v1 = scriptExecutor.getOrItselfValue(command[command.length - 2]);
|
|
||||||
v2 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
}
|
|
||||||
if (!(v1 instanceof Value.DoubleValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_FLOOR_ERROR_1", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v2 instanceof Value.LongValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_FLOOR_ERROR_2", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (v2.asLong() < 0) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_FLOOR_ERROR_2", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (v2.asLong() == 0) {
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.LongValue((long) Math.floor(v1.asDouble())));
|
|
||||||
} else {
|
|
||||||
double pow = Math.pow(10, v2.asLong());
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.DoubleValue(Math.floor(v1.asDouble() * pow) / pow));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.variable },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.number_type },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type, TokenType.number_type },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.variable },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type, TokenType.variable },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.command.arithmetic.other;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Round implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_ROUND_HELP_1",
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_ROUND_HELP_2",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_ARITHMETIC_OTHER_ROUND_HELP_3"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.REDSTONE_TORCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "round";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Value v1;
|
|
||||||
Value v2;
|
|
||||||
if (command.length == 3) {
|
|
||||||
v1 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
v2 = new Value.LongValue(0);
|
|
||||||
} else {
|
|
||||||
v1 = scriptExecutor.getOrItselfValue(command[command.length - 2]);
|
|
||||||
v2 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
}
|
|
||||||
if (!(v1 instanceof Value.DoubleValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_ROUND_ERROR_1", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v2 instanceof Value.LongValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_ROUND_ERROR_2", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (v2.asLong() < 0) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ARITHMETIC_OTHER_ROUND_ERROR_2", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (v2.asLong() == 0) {
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.LongValue(Math.round(v1.asDouble())));
|
|
||||||
} else {
|
|
||||||
double pow = Math.pow(10, v2.asLong());
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.DoubleValue(Math.round(v1.asDouble() * pow) / pow));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.variable },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.number_type },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type, TokenType.number_type },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.variable },
|
|
||||||
{ TokenType.variable, TokenType.floating_number_type, TokenType.variable },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command.io;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import net.md_5.bungee.api.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Echo implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_IO_ECHO_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_IO_ECHO_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.OAK_SIGN;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "echo";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
scriptExecutor.getEchoConsumer().accept("");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
StringBuilder st = new StringBuilder();
|
|
||||||
for (int i = 1; i < command.length; i++) {
|
|
||||||
if (i != 1) {
|
|
||||||
st.append(" ");
|
|
||||||
}
|
|
||||||
st.append(command[i]);
|
|
||||||
}
|
|
||||||
scriptExecutor.getEchoConsumer().accept(ChatColor.translateAlternateColorCodes('&', st.toString()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean repeating() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.any },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command.io;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.SWUtils;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import net.md_5.bungee.api.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Echoactionbar implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_IO_ECHOACTIONBAR_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_IO_ECHOACTIONBAR_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.BIRCH_SIGN;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "echoactionbar";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
SWUtils.sendToActionbar(scriptExecutor.getPlayer(), "");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
StringBuilder st = new StringBuilder();
|
|
||||||
for (int i = 1; i < command.length; i++) {
|
|
||||||
if (i != 1) {
|
|
||||||
st.append(" ");
|
|
||||||
}
|
|
||||||
st.append(command[i]);
|
|
||||||
}
|
|
||||||
SWUtils.sendToActionbar(scriptExecutor.getPlayer(), ChatColor.translateAlternateColorCodes('&', st.toString()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean repeating() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.any },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command.io;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.inventory.SWAnvilInv;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Input implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_IO_INPUT_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_IO_INPUT_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.ANVIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "input";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
StringBuilder st = new StringBuilder();
|
|
||||||
for (int i = 2; i < command.length; i++) {
|
|
||||||
if (i != 2) {
|
|
||||||
st.append(" ");
|
|
||||||
}
|
|
||||||
st.append(command[i]);
|
|
||||||
}
|
|
||||||
SWAnvilInv swAnvilInv = new SWAnvilInv(scriptExecutor.getPlayer(), ChatColor.translateAlternateColorCodes('&', st.toString()));
|
|
||||||
swAnvilInv.setCallback(s -> {
|
|
||||||
try {
|
|
||||||
long value = Long.parseLong(s);
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.LongValue(value));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
if (s.equalsIgnoreCase("true") || s.equalsIgnoreCase("false")) {
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.BooleanValue(s.equalsIgnoreCase("true")));
|
|
||||||
} else {
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.StringValue(s));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scriptExecutor.resume();
|
|
||||||
});
|
|
||||||
swAnvilInv.addCloseCallback(scriptExecutor::resume);
|
|
||||||
swAnvilInv.open();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean repeating() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.any },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.command.string;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Insert implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_STRING_INSERT_HELP_1",
|
|
||||||
"SCRIPT_COMMAND_STRING_INSERT_HELP_2",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_STRING_INSERT_HELP_3"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.HOPPER;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "insert";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 3) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_THIRD_ARG_NOVAR_OR_NUMBER", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
String resultName = command[1];
|
|
||||||
Value v1 = scriptExecutor.getOrItselfValue(command[command.length - 3]);
|
|
||||||
Value v2 = scriptExecutor.getOrItselfValue(command[command.length - 2]);
|
|
||||||
Value v3 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
|
|
||||||
if (!(v1 instanceof Value.StringValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v2 instanceof Value.StringValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v3 instanceof Value.LongValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_NUMBERS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
scriptExecutor.getLocalVariables().putValue(resultName, new Value.StringValue(new StringBuilder(v1.asString()).insert((int) v3.asLong(), v2.asString()).toString()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.number_type },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.variable, TokenType.number_type },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.command.string;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Remove implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_STRING_REMOVE_HELP_1",
|
|
||||||
"SCRIPT_COMMAND_STRING_REMOVE_HELP_2",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_STRING_REMOVE_HELP_3"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.SHEARS;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "remove";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
String resultName = command[1];
|
|
||||||
Value v1 = scriptExecutor.getOrItselfValue(command[command.length - 2]);
|
|
||||||
Value v2 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
|
|
||||||
if (!(v1 instanceof Value.StringValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v2 instanceof Value.StringValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
scriptExecutor.getLocalVariables().putValue(resultName, new Value.StringValue(v1.asString().replace(v2.asString(), "")));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.variable },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.variable },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.command.string;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Replace implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_STRING_REPLACE_HELP_1",
|
|
||||||
"SCRIPT_COMMAND_STRING_REPLACE_HELP_2",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_STRING_REPLACE_HELP_3"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.WOODEN_AXE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "replace";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 3) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_THIRD_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
String resultName = command[1];
|
|
||||||
Value v1 = scriptExecutor.getOrItselfValue(command[command.length - 3]);
|
|
||||||
Value v2 = scriptExecutor.getOrItselfValue(command[command.length - 2]);
|
|
||||||
Value v3 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
|
|
||||||
if (!(v1 instanceof Value.StringValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v2 instanceof Value.StringValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v3 instanceof Value.StringValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
scriptExecutor.getLocalVariables().putValue(resultName, new Value.StringValue(v1.asString().replace(v2.asString(), v3.asString())));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.variable },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.variable, TokenType.variable },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.command.string;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Substring implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_STRING_SUBSTRING_HELP_1",
|
|
||||||
"SCRIPT_COMMAND_STRING_SUBSTRING_HELP_2",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_STRING_SUBSTRING_HELP_3"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.STICKY_PISTON;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "substring";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
String resultName = command[1];
|
|
||||||
Value v1 = scriptExecutor.getOrItselfValue(command[command.length - 2]);
|
|
||||||
Value v2 = scriptExecutor.getOrItselfValue(command[command.length - 1]);
|
|
||||||
|
|
||||||
if (!(v1 instanceof Value.StringValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(v2 instanceof Value.LongValue)) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_NUMBERS_ALLOWED", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Value result;
|
|
||||||
try {
|
|
||||||
if (v2.asLong() < 0) {
|
|
||||||
result = new Value.StringValue(v1.asString().substring(v1.asString().length() - 1 - (int) v2.asLong()));
|
|
||||||
} else {
|
|
||||||
result = new Value.StringValue(v1.asString().substring((int) v2.asLong()));
|
|
||||||
}
|
|
||||||
} catch (ArrayIndexOutOfBoundsException | StringIndexOutOfBoundsException e) {
|
|
||||||
result = new Value.StringValue("");
|
|
||||||
}
|
|
||||||
scriptExecutor.getLocalVariables().putValue(resultName, result);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.number_type },
|
|
||||||
{ TokenType.variable, TokenType.variable, TokenType.number_type },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.command.variable;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Constants;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Const implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_CONST_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_CONST_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.STRUCTURE_BLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "const";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
String varName = command[1];
|
|
||||||
StringBuilder varValue = new StringBuilder();
|
|
||||||
for (int i = 2; i < command.length; i++) {
|
|
||||||
if (varValue.length() != 0) {
|
|
||||||
varValue.append(" ");
|
|
||||||
}
|
|
||||||
varValue.append(command[i]);
|
|
||||||
}
|
|
||||||
Constants.getConstant(varName, scriptExecutor.getPlayer()).fromValue(Value.parse(varValue.toString()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean repeating() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.any },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.command.variable;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Convert implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_CONVERT_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_CONVERT_HELP_2",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.ENDER_CHEST;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "convert";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], Value.parse(command[2]));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.any },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command.variable;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Global implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_GLOBAL_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_GLOBAL_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.MAP;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "global";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
String varName = command[1];
|
|
||||||
StringBuilder varValue = new StringBuilder();
|
|
||||||
for (int i = 2; i < command.length; i++) {
|
|
||||||
if (varValue.length() != 0) {
|
|
||||||
varValue.append(" ");
|
|
||||||
}
|
|
||||||
varValue.append(command[i]);
|
|
||||||
}
|
|
||||||
scriptExecutor.getGlobalVariables().putValue(varName, Value.parse(varValue.toString()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean repeating() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.any },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command.variable;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Unglobal implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_UNGLOBAL_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_UNGLOBAL_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.BEACON;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "unglobal";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
scriptExecutor.getGlobalVariables().removeValue(command[1]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command.variable;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Unvar implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_UNVAR_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_UNVAR_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.STRUCTURE_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "unvar";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
scriptExecutor.getLocalVariables().removeValue(command[1]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.any },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.command.variable;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class Var implements SpecialCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_VAR_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_VARIABLE_VAR_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.STRUCTURE_BLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "var";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
String varName = command[1];
|
|
||||||
StringBuilder varValue = new StringBuilder();
|
|
||||||
for (int i = 2; i < command.length; i++) {
|
|
||||||
if (varValue.length() != 0) {
|
|
||||||
varValue.append(" ");
|
|
||||||
}
|
|
||||||
varValue.append(command[i]);
|
|
||||||
}
|
|
||||||
scriptExecutor.getLocalVariables().putValue(varName, Value.parse(varValue.toString()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean repeating() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.any },
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.command.world;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.World;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class GetMaterial implements SpecialCommand {
|
|
||||||
|
|
||||||
private final World world = Bukkit.getWorlds().get(0);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_WORLD_GETMATERIAL_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_WORLD_GETMATERIAL_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.STICKY_PISTON;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "getmaterial";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 3) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_THIRD_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 4) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FOURTH_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int x = (int) scriptExecutor.getOrItselfValue(command[2]).asLong();
|
|
||||||
int y = (int) scriptExecutor.getOrItselfValue(command[3]).asLong();
|
|
||||||
int z = (int) scriptExecutor.getOrItselfValue(command[4]).asLong();
|
|
||||||
scriptExecutor.getLocalVariables().putValue(command[1], new Value.StringValue(world.getBlockAt(x, y, z).getType().name()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.number_type, TokenType.number_type, TokenType.number_type }
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,92 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.command.world;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.SpecialCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.World;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class SetMaterial implements SpecialCommand {
|
|
||||||
|
|
||||||
private final World world = Bukkit.getWorlds().get(0);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] description() {
|
|
||||||
return new String[]{
|
|
||||||
"SCRIPT_COMMAND_WORLD_SETMATERIAL_HELP_1",
|
|
||||||
"",
|
|
||||||
"SCRIPT_COMMAND_WORLD_SETMATERIAL_HELP_2"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material material() {
|
|
||||||
return Material.PISTON;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String command() {
|
|
||||||
return "setmaterial";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
|
|
||||||
if (command.length <= 1) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FIRST_ARG_NOVAR", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 2) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_SECOND_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 3) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_THIRD_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.length <= 4) {
|
|
||||||
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_FOURTH_ARG_NOVALUE", scriptExecutor.getPlayer());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int x = (int) scriptExecutor.getOrItselfValue(command[2]).asLong();
|
|
||||||
int y = (int) scriptExecutor.getOrItselfValue(command[3]).asLong();
|
|
||||||
int z = (int) scriptExecutor.getOrItselfValue(command[4]).asLong();
|
|
||||||
try {
|
|
||||||
world.getBlockAt(x, y, z).setType(Material.valueOf(scriptExecutor.getOrItself(command[1])));
|
|
||||||
} catch (Exception e) {
|
|
||||||
// Ignored
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TokenType[][] syntax = {
|
|
||||||
{ TokenType.variable, TokenType.number_type, TokenType.number_type, TokenType.number_type }
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TokenType[][] getSyntax() {
|
|
||||||
return syntax;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom;
|
|
||||||
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import yapion.hierarchy.types.YAPIONMap;
|
|
||||||
|
|
||||||
public interface MenuScript {
|
|
||||||
void save(YAPIONMap yapionMap);
|
|
||||||
SWItem toItem(Player p);
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom;
|
|
||||||
|
|
||||||
public interface Script {
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.CustomScriptManager;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import de.steamwar.linkage.LinkedInstance;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
||||||
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class CommandListener implements Listener {
|
|
||||||
|
|
||||||
@LinkedInstance
|
|
||||||
public CustomScriptManager manager;
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent e) {
|
|
||||||
if (e.getMessage().startsWith("/script:")) {
|
|
||||||
e.setMessage("/" + e.getMessage().substring(8));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
manager.callCommand(e.getPlayer(), e, e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.custom.Script;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public interface CustomCommand extends Script {
|
|
||||||
String[] command();
|
|
||||||
|
|
||||||
default Map<String, Value> check(String[] args, String[] command) {
|
|
||||||
if (args.length < command.length) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!args[0].equals(command[0])) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, Value> arguments = new HashMap<>();
|
|
||||||
if (!check(arguments, args, command, 0, 0)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return arguments;
|
|
||||||
}
|
|
||||||
|
|
||||||
default boolean check(Map<String, Value> arguments, String[] args, String[] command, int argsIndex, int commandIndex) {
|
|
||||||
if (command.length <= commandIndex) {
|
|
||||||
for (int i = argsIndex; i < args.length; i++) {
|
|
||||||
if (!(args[i].startsWith("(") && args[i].endsWith(")"))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (args.length <= argsIndex) return true;
|
|
||||||
|
|
||||||
String currentArg = args[argsIndex];
|
|
||||||
String currentCommand = command[commandIndex];
|
|
||||||
|
|
||||||
if (currentArg.startsWith("<") && currentArg.endsWith(">")) {
|
|
||||||
arguments.put(trim(currentArg, 1), new Value.StringValue(currentCommand));
|
|
||||||
return check(arguments, args, command, argsIndex + 1, commandIndex + 1);
|
|
||||||
} else if (currentArg.startsWith("(<") && currentArg.endsWith(">)")) {
|
|
||||||
arguments.put(trim(currentArg, 2), new Value.StringValue(currentCommand));
|
|
||||||
return check(arguments, args, command, argsIndex + 1, commandIndex + 1);
|
|
||||||
} else if (currentArg.startsWith("(") && currentArg.endsWith(")")) {
|
|
||||||
if (!trim(currentArg, 1).equals(currentCommand)) {
|
|
||||||
arguments.put(trim(currentArg, 1), new Value.BooleanValue(false));
|
|
||||||
return check(arguments, args, command, argsIndex + 1, commandIndex);
|
|
||||||
} else {
|
|
||||||
arguments.put(trim(currentArg, 1), new Value.BooleanValue(true));
|
|
||||||
return check(arguments, args, command, argsIndex + 1, commandIndex + 1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!currentArg.equals(currentCommand)) return false;
|
|
||||||
return check(arguments, args, command, argsIndex + 1, commandIndex + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
default String trim(String s, int count) {
|
|
||||||
return s.substring(count, s.length() - count);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean execute(String[] command, PlayerCommandPreprocessEvent e);
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public
|
|
||||||
class InventoryCommand implements CustomCommand {
|
|
||||||
public final BookMeta bookMeta;
|
|
||||||
public final String[] args;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] command() {
|
|
||||||
return args;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean execute(String[] command, PlayerCommandPreprocessEvent e) {
|
|
||||||
Map<String, Value> arguments = check(args, command);
|
|
||||||
if (arguments == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
e.setCancelled(true);
|
|
||||||
new ScriptExecutor(bookMeta, e.getPlayer(), arguments, null);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.command;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.MenuScript;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
import yapion.hierarchy.types.YAPIONArray;
|
|
||||||
import yapion.hierarchy.types.YAPIONMap;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public
|
|
||||||
class MenuCommand implements CustomCommand, MenuScript {
|
|
||||||
public final List<String> pages;
|
|
||||||
public final String[] args;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] command() {
|
|
||||||
return args;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean execute(String[] command, PlayerCommandPreprocessEvent e) {
|
|
||||||
Map<String, Value> arguments = check(args, command);
|
|
||||||
if (arguments == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
e.setCancelled(true);
|
|
||||||
new ScriptExecutor(pages, e.getPlayer(), arguments, null);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean equals(MenuCommand menuCommand) {
|
|
||||||
if (menuCommand.args.length != args.length) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!args[0].equals(menuCommand.args[0])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < args.length; i++) {
|
|
||||||
if (i == 0) continue;
|
|
||||||
String s1 = args[i];
|
|
||||||
String s2 = menuCommand.args[i];
|
|
||||||
if (!s1.equals(s2)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!(s1.startsWith("<") && s1.endsWith(">") && s2.startsWith("<") && s2.endsWith(">"))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!(s1.startsWith("(<") && s1.endsWith(">)") && s2.startsWith("(<") && s2.endsWith(">)"))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void save(YAPIONMap yapionMap) {
|
|
||||||
YAPIONArray yapionArray = new YAPIONArray();
|
|
||||||
pages.forEach(yapionArray::add);
|
|
||||||
yapionMap.put(String.join(" ", args), yapionArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SWItem toItem(Player p) {
|
|
||||||
SWItem swItem = new SWItem(Material.WRITABLE_BOOK, BauSystem.MESSAGE.parse("SCRIPT_COMMAND_ITEM_NAME", p, String.join(" ", args)));
|
|
||||||
BookMeta bookMeta = (BookMeta) swItem.getItemMeta();
|
|
||||||
bookMeta.setPages(pages.toArray(new String[0]));
|
|
||||||
swItem.setItemMeta(bookMeta);
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.event;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.custom.Script;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
public interface CustomEvent extends Script {
|
|
||||||
|
|
||||||
String eventName();
|
|
||||||
boolean execute(Player p, Map<String, Value> variables, Consumer<String> echoConsumer);
|
|
||||||
|
|
||||||
}
|
|
@ -1,133 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.event;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import lombok.Getter;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.event.Event;
|
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
|
||||||
import org.bukkit.event.entity.EntityDeathEvent;
|
|
||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
|
||||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
|
||||||
import org.bukkit.event.player.*;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
public enum EventType {
|
|
||||||
FF(PlayerSwapHandItemsEvent.class, event -> null),
|
|
||||||
PlaceBlock(BlockPlaceEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
addBlockXYZ(valueMap, event.getBlockPlaced().getLocation());
|
|
||||||
valueMap.put("blockType", new Value.StringValue(event.getBlockPlaced().getType().name()));
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
BreakBlock(BlockBreakEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
addBlockXYZ(valueMap, event.getBlock().getLocation());
|
|
||||||
valueMap.put("blockType", new Value.StringValue(event.getBlock().getType().name()));
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
RightClick(PlayerInteractEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
valueMap.put("blockInHand", new Value.BooleanValue(event.isBlockInHand()));
|
|
||||||
valueMap.put("action", new Value.StringValue(event.getAction().name()));
|
|
||||||
valueMap.put("handType", new Value.StringValue(event.getMaterial().name()));
|
|
||||||
valueMap.put("hasBlock", new Value.BooleanValue(event.hasBlock()));
|
|
||||||
if (event.hasBlock()) {
|
|
||||||
addBlockXYZ(valueMap, event.getClickedBlock().getLocation());
|
|
||||||
valueMap.put("blockFace", new Value.StringValue(event.getBlockFace().name()));
|
|
||||||
}
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
LeftClick(PlayerInteractEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
valueMap.put("blockInHand", new Value.BooleanValue(event.isBlockInHand()));
|
|
||||||
valueMap.put("action", new Value.StringValue(event.getAction().name()));
|
|
||||||
valueMap.put("handType", new Value.StringValue(event.getMaterial().name()));
|
|
||||||
valueMap.put("hasBlock", new Value.BooleanValue(event.hasBlock()));
|
|
||||||
if (event.hasBlock()) {
|
|
||||||
addBlockXYZ(valueMap, event.getClickedBlock().getLocation());
|
|
||||||
valueMap.put("blockFace", new Value.StringValue(event.getBlockFace().name()));
|
|
||||||
}
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
TNTSpawn(EntitySpawnEvent.class, event -> null),
|
|
||||||
TNTExplode(EntityExplodeEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
addXYZ(valueMap, event.getLocation());
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
TNTExplodeInBuild(EntityExplodeEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
addXYZ(valueMap, event.getLocation());
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
SelfJoin(PlayerJoinEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
addXYZ(valueMap, event.getPlayer().getLocation());
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
SelfLeave(PlayerQuitEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
addXYZ(valueMap, event.getPlayer().getLocation());
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
DropItem(PlayerDropItemEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
valueMap.put("material", new Value.StringValue(event.getItemDrop().getItemStack().getType().name()));
|
|
||||||
addXYZ(valueMap, event.getItemDrop().getLocation());
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
EntityDeath(EntityDeathEvent.class, event -> {
|
|
||||||
Map<String, Value> valueMap = new HashMap<>();
|
|
||||||
valueMap.put("entityType", new Value.StringValue(event.getEntityType().name()));
|
|
||||||
addXYZ(valueMap, event.getEntity().getLocation());
|
|
||||||
return valueMap;
|
|
||||||
}),
|
|
||||||
Scoreboard(Event.class, event -> {
|
|
||||||
return new HashMap<>();
|
|
||||||
}),
|
|
||||||
;
|
|
||||||
|
|
||||||
private static void addXYZ(Map<String, Value> valueMap, Location location) {
|
|
||||||
valueMap.put("x", new Value.DoubleValue(location.getX()));
|
|
||||||
valueMap.put("y", new Value.DoubleValue(location.getY()));
|
|
||||||
valueMap.put("z", new Value.DoubleValue(location.getZ()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void addBlockXYZ(Map<String, Value> valueMap, Location location) {
|
|
||||||
valueMap.put("blockX", new Value.LongValue(location.getBlockX()));
|
|
||||||
valueMap.put("blockY", new Value.LongValue(location.getBlockY()));
|
|
||||||
valueMap.put("blockZ", new Value.LongValue(location.getBlockZ()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private Class<? extends Event> eventType;
|
|
||||||
private Function<Event, Map<String, Value>> eventValues;
|
|
||||||
|
|
||||||
<T extends Event> EventType(Class<T> eventType, Function<T, Map<String, Value>> eventValues) {
|
|
||||||
this.eventType = eventType;
|
|
||||||
this.eventValues = event -> eventValues.apply((T) event);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.event;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public
|
|
||||||
class InventoryEvent implements CustomEvent {
|
|
||||||
public final BookMeta bookMeta;
|
|
||||||
public final String[] args;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String eventName() {
|
|
||||||
return args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(Player p, Map<String, Value> variables, Consumer<String> echoConsumer) {
|
|
||||||
new ScriptExecutor(bookMeta, p, variables, echoConsumer);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.event;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.MenuScript;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
import yapion.hierarchy.types.YAPIONArray;
|
|
||||||
import yapion.hierarchy.types.YAPIONMap;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public
|
|
||||||
class MenuEvent implements CustomEvent, MenuScript {
|
|
||||||
public final List<String> pages;
|
|
||||||
public final String[] args;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String eventName() {
|
|
||||||
return args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(Player p, Map<String, Value> variables, Consumer<String> echoConsumer) {
|
|
||||||
new ScriptExecutor(pages, p, variables, echoConsumer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void save(YAPIONMap yapionMap) {
|
|
||||||
YAPIONArray yapionArray = new YAPIONArray();
|
|
||||||
pages.forEach(yapionArray::add);
|
|
||||||
yapionMap.put(String.join(" ", args), yapionArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SWItem toItem(Player p) {
|
|
||||||
StringBuilder st = new StringBuilder();
|
|
||||||
for (int i = 1; i < args.length; i++) {
|
|
||||||
if (i != 1) st.append(" ");
|
|
||||||
st.append(args[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
SWItem swItem = new SWItem(Material.WRITABLE_BOOK, BauSystem.MESSAGE.parse("SCRIPT_EVENT_ITEM_NAME", p, args[0], st.toString()));
|
|
||||||
BookMeta bookMeta = (BookMeta) swItem.getItemMeta();
|
|
||||||
bookMeta.setPages(pages.toArray(new String[0]));
|
|
||||||
swItem.setItemMeta(bookMeta);
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.hotkey;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.custom.Script;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
public interface Hotkey extends Script {
|
|
||||||
|
|
||||||
String hotkey();
|
|
||||||
boolean execute(Player p, boolean pressed);
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.hotkey;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.CustomScriptManager;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import de.steamwar.linkage.LinkedInstance;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.plugin.messaging.PluginMessageListener;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class HotkeyListener implements PluginMessageListener {
|
|
||||||
|
|
||||||
{
|
|
||||||
Bukkit.getServer().getMessenger().registerIncomingPluginChannel(BauSystem.getInstance(), "sw:hotkeys", this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@LinkedInstance
|
|
||||||
public CustomScriptManager manager;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
|
|
||||||
if (!channel.equals("sw:hotkeys")) return;
|
|
||||||
if (message.length < 5) return;
|
|
||||||
int action = message[4] & 0xFF;
|
|
||||||
if (action == 2) return;
|
|
||||||
int key = (message[0] & 0xFF) << 24 | (message[1] & 0xFF) << 16 | (message[2] & 0xFF) << 8 | (message[3] & 0xFF);
|
|
||||||
if (!(key >= 'A' && key <= 'Z' || key >= '0' && key <= '9')) return;
|
|
||||||
if (message.length >= 9) {
|
|
||||||
int mods = (message[5] & 0xFF) << 24 | (message[6] & 0xFF) << 16 | (message[7] & 0xFF) << 8 | (message[8] & 0xFF);
|
|
||||||
// player.sendMessage("Hotkey: " + (char) key + " " + action + " " + Long.toBinaryString(mods));
|
|
||||||
manager.callHotkey(mods, ((char) key), player, action == 1);
|
|
||||||
} else {
|
|
||||||
// player.sendMessage("Hotkey: " + (char) key + " " + action);
|
|
||||||
manager.callHotkey(0, ((char) key), player, action == 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,135 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.hotkey;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public interface Hotkeys {
|
|
||||||
|
|
||||||
public static boolean isSame(int mods, char key, String checkAgainst) {
|
|
||||||
Set<Modifier> modifiers = Modifier.get(mods);
|
|
||||||
Key k = Key.fromString(key + "");
|
|
||||||
if (k == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
String[] split = checkAgainst.split("\\+");
|
|
||||||
Set<Modifier> checkModifiers = new HashSet<>();
|
|
||||||
Key checkKey = null;
|
|
||||||
for (String s : split) {
|
|
||||||
Modifier m = Modifier.fromString(s);
|
|
||||||
if (m != null) {
|
|
||||||
checkModifiers.add(m);
|
|
||||||
} else {
|
|
||||||
checkKey = Key.fromString(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return checkKey == k && checkModifiers.equals(modifiers);
|
|
||||||
} catch (Exception e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Modifier {
|
|
||||||
SHIFT,
|
|
||||||
CTRL,
|
|
||||||
ALT,
|
|
||||||
META,
|
|
||||||
;
|
|
||||||
|
|
||||||
public static Set<Modifier> get(int mods) {
|
|
||||||
Set<Modifier> modifiers = new HashSet<>();
|
|
||||||
for (Modifier modifier : values()) {
|
|
||||||
if ((mods & (1 << modifier.ordinal())) != 0) {
|
|
||||||
modifiers.add(modifier);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return modifiers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Modifier fromString(String string) {
|
|
||||||
try {
|
|
||||||
return valueOf(string.toUpperCase());
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Key {
|
|
||||||
// A-Z
|
|
||||||
A,
|
|
||||||
B,
|
|
||||||
C,
|
|
||||||
D,
|
|
||||||
E,
|
|
||||||
F,
|
|
||||||
G,
|
|
||||||
H,
|
|
||||||
I,
|
|
||||||
J,
|
|
||||||
K,
|
|
||||||
L,
|
|
||||||
M,
|
|
||||||
N,
|
|
||||||
O,
|
|
||||||
P,
|
|
||||||
Q,
|
|
||||||
R,
|
|
||||||
S,
|
|
||||||
T,
|
|
||||||
U,
|
|
||||||
V,
|
|
||||||
W,
|
|
||||||
X,
|
|
||||||
Y,
|
|
||||||
Z,
|
|
||||||
|
|
||||||
// 0-9
|
|
||||||
NUM_0,
|
|
||||||
NUM_1,
|
|
||||||
NUM_2,
|
|
||||||
NUM_3,
|
|
||||||
NUM_4,
|
|
||||||
NUM_5,
|
|
||||||
NUM_6,
|
|
||||||
NUM_7,
|
|
||||||
NUM_8,
|
|
||||||
NUM_9,
|
|
||||||
;
|
|
||||||
|
|
||||||
public static Key fromString(String key) {
|
|
||||||
key = key.toUpperCase();
|
|
||||||
try {
|
|
||||||
return Key.valueOf(key);
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return Key.valueOf("NUM_" + key);
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.hotkey;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public
|
|
||||||
class InventoryHotkey implements Hotkey {
|
|
||||||
|
|
||||||
public final BookMeta bookMeta;
|
|
||||||
public final String[] args;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String hotkey() {
|
|
||||||
return args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(Player p, boolean pressed) {
|
|
||||||
Map<String, Value> variables = new HashMap<>();
|
|
||||||
variables.put("pressed", new Value.BooleanValue(pressed));
|
|
||||||
variables.put("released", new Value.BooleanValue(!pressed));
|
|
||||||
new ScriptExecutor(bookMeta, p, variables, null);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,80 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.hotkey;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.custom.MenuScript;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
import yapion.hierarchy.types.YAPIONArray;
|
|
||||||
import yapion.hierarchy.types.YAPIONMap;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public
|
|
||||||
class MenuHotkey implements Hotkey, MenuScript {
|
|
||||||
|
|
||||||
public final List<String> pages;
|
|
||||||
public final String[] args;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String hotkey() {
|
|
||||||
return args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(Player p, boolean pressed) {
|
|
||||||
Map<String, Value> variables = new HashMap<>();
|
|
||||||
variables.put("pressed", new Value.BooleanValue(pressed));
|
|
||||||
variables.put("released", new Value.BooleanValue(!pressed));
|
|
||||||
new ScriptExecutor(pages, p, variables, null);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void save(YAPIONMap yapionMap) {
|
|
||||||
YAPIONArray yapionArray = new YAPIONArray();
|
|
||||||
pages.forEach(yapionArray::add);
|
|
||||||
yapionMap.put(String.join(" ", args), yapionArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SWItem toItem(Player p) {
|
|
||||||
StringBuilder st = new StringBuilder();
|
|
||||||
for (int i = 1; i < args.length; i++) {
|
|
||||||
if (i != 1) st.append(" ");
|
|
||||||
st.append(args[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
SWItem swItem = new SWItem(Material.WRITABLE_BOOK, BauSystem.MESSAGE.parse("SCRIPT_HOTKEY_ITEM_NAME", p, args[0], st.toString()));
|
|
||||||
BookMeta bookMeta = (BookMeta) swItem.getItemMeta();
|
|
||||||
bookMeta.setPages(pages.toArray(new String[0]));
|
|
||||||
swItem.setItemMeta(bookMeta);
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,22 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.event;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.script.ScriptRunner;
|
||||||
|
import de.steamwar.linkage.Linked;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
import org.luaj.vm2.LuaValue;
|
||||||
|
|
||||||
|
@Linked
|
||||||
|
public class CommandListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
|
||||||
|
String[] split = event.getMessage().split(" ");
|
||||||
|
LuaValue[] values = new LuaValue[split.length - 1];
|
||||||
|
for (int i = 1; i < split.length; i++) {
|
||||||
|
values[i - 1] = LuaValue.valueOf(split[i]);
|
||||||
|
}
|
||||||
|
ScriptRunner.callCommand(event.getPlayer(), split[0].substring(1), LuaValue.listOf(values));
|
||||||
|
}
|
||||||
|
}
|
@ -1,31 +1,12 @@
|
|||||||
/*
|
package de.steamwar.bausystem.features.script.event;
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.custom.event;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.features.script.CustomScriptManager;
|
import de.steamwar.bausystem.features.script.ScriptRunner;
|
||||||
|
import de.steamwar.bausystem.features.script.lua.SteamWarGlobalLuaPlugin;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
||||||
import de.steamwar.bausystem.region.utils.RegionType;
|
import de.steamwar.bausystem.region.utils.RegionType;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import de.steamwar.linkage.LinkedInstance;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -39,6 +20,8 @@ import org.bukkit.event.entity.EntityDeathEvent;
|
|||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||||
import org.bukkit.event.player.*;
|
import org.bukkit.event.player.*;
|
||||||
|
import org.luaj.vm2.LuaTable;
|
||||||
|
import org.luaj.vm2.LuaValue;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -48,9 +31,6 @@ import java.util.Set;
|
|||||||
@Linked
|
@Linked
|
||||||
public class EventListener implements Listener {
|
public class EventListener implements Listener {
|
||||||
|
|
||||||
@LinkedInstance
|
|
||||||
public CustomScriptManager manager;
|
|
||||||
|
|
||||||
private static final Map<Player, Long> LAST_FS = new HashMap<>();
|
private static final Map<Player, Long> LAST_FS = new HashMap<>();
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -61,18 +41,18 @@ public class EventListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
manager.callEvent(EventType.SelfJoin, event.getPlayer(), event);
|
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.SelfJoin, LuaValue.NIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
manager.callEvent(EventType.SelfLeave, event.getPlayer(), event);
|
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.SelfLeave, LuaValue.NIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
||||||
if (LAST_FS.containsKey(event.getPlayer())) {
|
if (LAST_FS.containsKey(event.getPlayer())) {
|
||||||
manager.callEvent(EventType.FF, event.getPlayer(), event);
|
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.FF, LuaValue.NIL);
|
||||||
} else {
|
} else {
|
||||||
LAST_FS.put(event.getPlayer(), System.currentTimeMillis());
|
LAST_FS.put(event.getPlayer(), System.currentTimeMillis());
|
||||||
}
|
}
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Nur ein Aufruf von System.currentTimeMillis() pro Tick. Zeit abzufragen kann (relativ) teuer sein. Nur ein Aufruf von System.currentTimeMillis() pro Tick. Zeit abzufragen kann (relativ) teuer sein.
Chaoscaot
hat
FunFact: Das hab ich aus dem Live-Code kopiert kann man aber noch fixen FunFact: Das hab ich aus dem Live-Code kopiert
kann man aber noch fixen
|
|||||||
@ -80,12 +60,22 @@ public class EventListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockPlace(BlockPlaceEvent event) {
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
manager.callEvent(EventType.PlaceBlock, event.getPlayer(), event);
|
LuaTable table = new LuaTable();
|
||||||
|
table.set("x", event.getBlock().getX());
|
||||||
|
table.set("y", event.getBlock().getY());
|
||||||
|
table.set("z", event.getBlock().getZ());
|
||||||
|
table.set("type", event.getBlock().getType().name());
|
||||||
|
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.PlaceBlock, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockBreak(BlockBreakEvent event) {
|
public void onBlockBreak(BlockBreakEvent event) {
|
||||||
manager.callEvent(EventType.BreakBlock, event.getPlayer(), event);
|
LuaTable table = new LuaTable();
|
||||||
|
table.set("x", event.getBlock().getX());
|
||||||
|
table.set("y", event.getBlock().getY());
|
||||||
|
table.set("z", event.getBlock().getZ());
|
||||||
|
table.set("type", event.getBlock().getType().name());
|
||||||
|
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.BreakBlock, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Player> ignore = new HashSet<>();
|
private Set<Player> ignore = new HashSet<>();
|
||||||
@ -95,11 +85,25 @@ public class EventListener implements Listener {
|
|||||||
if (ignore.remove(event.getPlayer())) {
|
if (ignore.remove(event.getPlayer())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
LuaTable table = new LuaTable();
|
||||||
|
table.set("action", event.getAction().name());
|
||||||
|
table.set("hand", event.getHand().name());
|
||||||
|
table.set("block", event.getItem().getType().name());
|
||||||
|
if(event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||||
|
table.set("hasBlock", LuaValue.valueOf(true));
|
||||||
|
table.set("blockX", event.getClickedBlock().getX());
|
||||||
|
table.set("blockY", event.getClickedBlock().getY());
|
||||||
|
table.set("blockZ", event.getClickedBlock().getZ());
|
||||||
|
table.set("blockFace", event.getBlockFace().name());
|
||||||
|
} else {
|
||||||
|
table.set("hasBlock", LuaValue.valueOf(false));
|
||||||
|
}
|
||||||
|
|
||||||
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||||
manager.callEvent(EventType.RightClick, event.getPlayer(), event);
|
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.RightClick, table);
|
||||||
}
|
}
|
||||||
if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||||
manager.callEvent(EventType.LeftClick, event.getPlayer(), event);
|
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.LeftClick, table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,7 +116,7 @@ public class EventListener implements Listener {
|
|||||||
|
|
||||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
if (tntRegion.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) {
|
if (tntRegion.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) {
|
||||||
manager.callEvent(EventType.TNTSpawn, player, event);
|
ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.TNTSpawn, LuaValue.NIL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -124,9 +128,14 @@ public class EventListener implements Listener {
|
|||||||
}
|
}
|
||||||
Region tntRegion = Region.getRegion(event.getLocation());
|
Region tntRegion = Region.getRegion(event.getLocation());
|
||||||
|
|
||||||
|
LuaTable table = new LuaTable();
|
||||||
|
table.set("x", event.getLocation().getX());
|
||||||
|
table.set("y", event.getLocation().getY());
|
||||||
|
table.set("z", event.getLocation().getZ());
|
||||||
|
|
||||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
if (tntRegion.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) {
|
if (tntRegion.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) {
|
||||||
manager.callEvent(EventType.TNTExplode, player, event);
|
ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.TNTExplode, table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -134,13 +143,17 @@ public class EventListener implements Listener {
|
|||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||||
ignore.add(event.getPlayer());
|
ignore.add(event.getPlayer());
|
||||||
manager.callEvent(EventType.DropItem, event.getPlayer(), event);
|
LuaTable table = new LuaTable();
|
||||||
|
table.set("type", event.getItemDrop().getItemStack().getType().name());
|
||||||
|
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.DropItem, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onEntityDeath(EntityDeathEvent event) {
|
public void onEntityDeath(EntityDeathEvent event) {
|
||||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
manager.callEvent(EventType.EntityDeath, player, event);
|
LuaTable table = new LuaTable();
|
||||||
|
table.set("type", event.getEntityType().name());
|
||||||
|
ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.EntityDeath, table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,242 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.ScriptExecutor;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Constants;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
public class Expression {
|
|
||||||
|
|
||||||
private static int highestPrecedence = 1;
|
|
||||||
|
|
||||||
public static final Map<String, Operator> OPERATORS = new HashMap<>();
|
|
||||||
|
|
||||||
public static void registerOperator(Operator operator) {
|
|
||||||
highestPrecedence = Math.max(highestPrecedence, operator.getPriority()) + 1;
|
|
||||||
OPERATORS.put(operator.getOperator(), operator);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Player p;
|
|
||||||
private ScriptExecutor scriptExecutor;
|
|
||||||
|
|
||||||
private String s;
|
|
||||||
|
|
||||||
public Expression(Player p, String s, ScriptExecutor scriptExecutor) {
|
|
||||||
s = s.substring(1, s.length() - 1);
|
|
||||||
this.p = p;
|
|
||||||
this.s = s;
|
|
||||||
this.scriptExecutor = scriptExecutor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Value eval() {
|
|
||||||
List<Object> tokens = new ArrayList<>(tokenize(s));
|
|
||||||
List<Integer> priorities = priorities(tokens);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
int toCalc = getToCalc(priorities);
|
|
||||||
if (priorities.get(toCalc) == 0) break;
|
|
||||||
if (priorities.get(toCalc) == highestPrecedence) {
|
|
||||||
String s = (String) tokens.get(toCalc);
|
|
||||||
if (s.equalsIgnoreCase("true") || s.equalsIgnoreCase("false")) {
|
|
||||||
tokens.set(toCalc, new Value.BooleanValue(Boolean.parseBoolean(s)));
|
|
||||||
priorities.set(toCalc, 0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String[] strings = s.split("\\.");
|
|
||||||
if (strings.length == 1) {
|
|
||||||
Value value = scriptExecutor.getValueOrNull(strings[0]);
|
|
||||||
if (value == null) {
|
|
||||||
throw new VarNotFoundException(strings[0]);
|
|
||||||
}
|
|
||||||
tokens.set(toCalc, value);
|
|
||||||
priorities.set(toCalc, 0);
|
|
||||||
} else {
|
|
||||||
boolean searchGlobal = false;
|
|
||||||
boolean searchConst = false;
|
|
||||||
boolean searchLocal = false;
|
|
||||||
if (strings[0].equals("global")) {
|
|
||||||
searchGlobal = true;
|
|
||||||
strings = Arrays.copyOfRange(strings, 1, strings.length);
|
|
||||||
} else if (strings[0].equals("const")) {
|
|
||||||
searchConst = true;
|
|
||||||
strings = Arrays.copyOfRange(strings, 1, strings.length);
|
|
||||||
} else if (strings[0].equals("local")) {
|
|
||||||
searchLocal = true;
|
|
||||||
strings = Arrays.copyOfRange(strings, 1, strings.length);
|
|
||||||
}
|
|
||||||
String varName = strings[0];
|
|
||||||
Value value;
|
|
||||||
if (searchGlobal) {
|
|
||||||
value = scriptExecutor.getGlobalVariables().getValue(varName);
|
|
||||||
} else if (searchConst) {
|
|
||||||
value = Constants.getConstant(varName, p);
|
|
||||||
} else if (searchLocal) {
|
|
||||||
value = scriptExecutor.getLocalVariables().getValue(varName);
|
|
||||||
} else {
|
|
||||||
value = scriptExecutor.getValueOrNull(varName);
|
|
||||||
}
|
|
||||||
for (int i = 1; i < strings.length; i++) {
|
|
||||||
switch (strings[i]) {
|
|
||||||
case "isset":
|
|
||||||
value = new Value.BooleanValue(value != null);
|
|
||||||
break;
|
|
||||||
case "type":
|
|
||||||
value = new Value.StringValue(value == null ? "" : value.type());
|
|
||||||
break;
|
|
||||||
case "length":
|
|
||||||
value = new Value.LongValue(value == null ? 0 : value.asString().length());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (value == null) {
|
|
||||||
throw new VarNotFoundException(strings[0]);
|
|
||||||
}
|
|
||||||
tokens.set(toCalc, value);
|
|
||||||
priorities.set(toCalc, 0);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Value first = parse(tokens.get(toCalc - 1));
|
|
||||||
Value second = parse(tokens.get(toCalc + 1));
|
|
||||||
String op = (String) tokens.get(toCalc);
|
|
||||||
Operator operation = OPERATORS.get(op);
|
|
||||||
if (operation == null) {
|
|
||||||
throw new UnknownOperatorException(op);
|
|
||||||
}
|
|
||||||
Value result = operation.operate(first, second);
|
|
||||||
tokens.set(toCalc - 1, result);
|
|
||||||
tokens.remove(toCalc);
|
|
||||||
tokens.remove(toCalc);
|
|
||||||
priorities.remove(toCalc);
|
|
||||||
priorities.remove(toCalc);
|
|
||||||
priorities.set(toCalc - 1, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return parse(tokens.get(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
private Value parse(Object token) {
|
|
||||||
if (token instanceof Value) {
|
|
||||||
return (Value) token;
|
|
||||||
} else if (token instanceof String) {
|
|
||||||
String s = (String) token;
|
|
||||||
if (s.startsWith("{") && s.endsWith("}")) {
|
|
||||||
return new Expression(p, s, scriptExecutor).eval();
|
|
||||||
} else {
|
|
||||||
return Value.parse(s);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("Unknown token: " + token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getExpressionString(String s, int index) {
|
|
||||||
StringBuilder result = new StringBuilder();
|
|
||||||
int depth = 0;
|
|
||||||
for (int i = index; i < s.length(); i++) {
|
|
||||||
char c = s.charAt(i);
|
|
||||||
if (c == '{') {
|
|
||||||
depth++;
|
|
||||||
} else if (c == '}') {
|
|
||||||
result.append(c);
|
|
||||||
depth--;
|
|
||||||
if (depth == 0) {
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (depth > 0) {
|
|
||||||
result.append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> tokenize(String s) {
|
|
||||||
List<String> tokens = new ArrayList<>();
|
|
||||||
StringBuilder token = new StringBuilder();
|
|
||||||
for (int i = 0; i < s.length(); i++) {
|
|
||||||
char c = s.charAt(i);
|
|
||||||
if (c == ' ') continue;
|
|
||||||
if (c == '{') {
|
|
||||||
String subExpression = getExpressionString(s, i);
|
|
||||||
tokens.add(subExpression);
|
|
||||||
i += subExpression.length() - 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
StringBuilder op = new StringBuilder();
|
|
||||||
for (int j = i; j < s.length(); j++) {
|
|
||||||
char k = s.charAt(j);
|
|
||||||
if (k == '+' || k == '-' || k == '*' || k == '/' || k == '%' || k == '^' || k == '&' || k == '|' || k == '>' || k == '<' || k == '=' || k == '!') {
|
|
||||||
op.append(k);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (op.length() > 0) {
|
|
||||||
if (token.length() > 0) {
|
|
||||||
tokens.add(token.toString());
|
|
||||||
token = new StringBuilder();
|
|
||||||
}
|
|
||||||
tokens.add(op.toString());
|
|
||||||
i += op.length() - 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
token.append(c);
|
|
||||||
}
|
|
||||||
if (token.length() > 0) {
|
|
||||||
tokens.add(token.toString());
|
|
||||||
}
|
|
||||||
return tokens;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Integer> priorities(List<Object> tokens) {
|
|
||||||
List<Integer> priorities = new ArrayList<>();
|
|
||||||
for (Object obj : tokens) {
|
|
||||||
String token = (String) obj;
|
|
||||||
Operator operator = OPERATORS.get(token);
|
|
||||||
if (token.startsWith("{") && token.endsWith("}")) {
|
|
||||||
priorities.add(0);
|
|
||||||
} else if (!token.matches("[0-9]+([.,][0-9]+)?") && operator == null) {
|
|
||||||
priorities.add(highestPrecedence);
|
|
||||||
} else if (operator != null) {
|
|
||||||
priorities.add(operator.getPriority());
|
|
||||||
} else {
|
|
||||||
priorities.add(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return priorities;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getToCalc(List<Integer> priorities) {
|
|
||||||
int max = 0;
|
|
||||||
int index = 0;
|
|
||||||
for (int i = 0; i < priorities.size(); i++) {
|
|
||||||
if (priorities.get(i) > max) {
|
|
||||||
max = priorities.get(i);
|
|
||||||
index = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
|
|
||||||
public interface Operator {
|
|
||||||
String getOperator();
|
|
||||||
int getPriority();
|
|
||||||
Value operate(Value value, Value value2);
|
|
||||||
|
|
||||||
default boolean is(Value value, Class<?>... classes) {
|
|
||||||
for (Class<?> clazz : classes) {
|
|
||||||
if (clazz.isInstance(value)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression;
|
|
||||||
|
|
||||||
public class UnknownOperatorException extends RuntimeException{
|
|
||||||
|
|
||||||
public UnknownOperatorException(String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression;
|
|
||||||
|
|
||||||
public class VarNotFoundException extends RuntimeException{
|
|
||||||
|
|
||||||
public VarNotFoundException(String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.comparison;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class EqualOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "==";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (value instanceof Value.DoubleValue && value2 instanceof Value.LongValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() == value2.asDouble());
|
|
||||||
}
|
|
||||||
if (value instanceof Value.LongValue && value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() == value2.asDouble());
|
|
||||||
}
|
|
||||||
if (!value.type().equals(value2.type())) {
|
|
||||||
return new Value.BooleanValue(false);
|
|
||||||
}
|
|
||||||
if (value instanceof Value.StringValue) {
|
|
||||||
return new Value.BooleanValue(value.asString().equals(value2.asString()));
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() == value2.asDouble());
|
|
||||||
}
|
|
||||||
if (value instanceof Value.LongValue) {
|
|
||||||
return new Value.BooleanValue(value.asLong() == value2.asLong());
|
|
||||||
}
|
|
||||||
return new Value.BooleanValue(value.asBoolean() == value2.asBoolean());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.comparison;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class GreaterOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return ">";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ERROR_NUMBER_COMPARE");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() > value2.asDouble());
|
|
||||||
} else {
|
|
||||||
return new Value.BooleanValue(value.asLong() > value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.comparison;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class GreaterOrEqualOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return ">=";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ERROR_NUMBER_COMPARE");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() >= value2.asDouble());
|
|
||||||
} else {
|
|
||||||
return new Value.BooleanValue(value.asLong() >= value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.comparison;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class LessOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "<";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ERROR_NUMBER_COMPARE");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() < value2.asDouble());
|
|
||||||
} else {
|
|
||||||
return new Value.BooleanValue(value.asLong() < value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.comparison;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class LessOrEqualOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "<=";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ERROR_NUMBER_COMPARE");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() <= value2.asDouble());
|
|
||||||
} else {
|
|
||||||
return new Value.BooleanValue(value.asLong() <= value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.comparison;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class NotEqualOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "!=";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (value instanceof Value.DoubleValue && value2 instanceof Value.LongValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() != value2.asDouble());
|
|
||||||
}
|
|
||||||
if (value instanceof Value.LongValue && value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() != value2.asDouble());
|
|
||||||
}
|
|
||||||
if (!value.type().equals(value2.type())) {
|
|
||||||
return new Value.BooleanValue(false);
|
|
||||||
}
|
|
||||||
if (value instanceof Value.StringValue) {
|
|
||||||
return new Value.BooleanValue(!value.asString().equals(value2.asString()));
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue) {
|
|
||||||
return new Value.BooleanValue(value.asDouble() != value2.asDouble());
|
|
||||||
}
|
|
||||||
if (value instanceof Value.LongValue) {
|
|
||||||
return new Value.BooleanValue(value.asLong() != value2.asLong());
|
|
||||||
}
|
|
||||||
return new Value.BooleanValue(value.asBoolean() != value2.asBoolean());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.logic;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class AndOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "&&";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.DoubleValue.class, Value.LongValue.class) || is(value2, Value.StringValue.class, Value.DoubleValue.class, Value.LongValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ERROR_BOOLEAN_COMPARE");
|
|
||||||
}
|
|
||||||
return new Value.BooleanValue(value.asBoolean() && value2.asBoolean());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.logic;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class BitwiseAndOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "&";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (value instanceof Value.StringValue || value2 instanceof Value.StringValue) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_AND_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_AND_ERROR");
|
|
||||||
}
|
|
||||||
if (value.getClass() != value2.getClass()) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_AND_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.BooleanValue && value2 instanceof Value.BooleanValue) {
|
|
||||||
return new Value.BooleanValue(value.asBoolean() && value2.asBoolean());
|
|
||||||
}
|
|
||||||
return new Value.LongValue(value.asLong() & value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.logic;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class BitwiseOrOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "|";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (value instanceof Value.StringValue || value2 instanceof Value.StringValue) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_OR_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_OR_ERROR");
|
|
||||||
}
|
|
||||||
if (value.getClass() != value2.getClass()) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_OR_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.BooleanValue && value2 instanceof Value.BooleanValue) {
|
|
||||||
return new Value.BooleanValue(value.asBoolean() || value2.asBoolean());
|
|
||||||
}
|
|
||||||
return new Value.LongValue(value.asLong() | value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.logic;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class BitwiseXorOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "^";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (value instanceof Value.StringValue || value2 instanceof Value.StringValue) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_XOR_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_XOR_ERROR");
|
|
||||||
}
|
|
||||||
if (value.getClass() != value2.getClass()) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_XOR_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.BooleanValue && value2 instanceof Value.BooleanValue) {
|
|
||||||
return new Value.BooleanValue(value.asBoolean() ^ value2.asBoolean());
|
|
||||||
}
|
|
||||||
return new Value.LongValue(value.asLong() ^ value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.logic;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class OrOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "||";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.DoubleValue.class, Value.LongValue.class) || is(value2, Value.StringValue.class, Value.DoubleValue.class, Value.LongValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ERROR_BOOLEAN_COMPARE");
|
|
||||||
}
|
|
||||||
return new Value.BooleanValue(value.asBoolean() || value2.asBoolean());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class BitwiseLeftOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "<<";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class, Value.DoubleValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class, Value.DoubleValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_LEFT_ERROR");
|
|
||||||
}
|
|
||||||
return new Value.LongValue(value.asLong() << value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class BitwiseLogicRightOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return ">>>";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class, Value.DoubleValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class, Value.DoubleValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_RIGHT_LOGIC_ERROR");
|
|
||||||
}
|
|
||||||
return new Value.LongValue(value.asLong() >>> value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class BitwiseRightOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return ">>";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class, Value.DoubleValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class, Value.DoubleValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_BIT_RIGHT_ERROR");
|
|
||||||
}
|
|
||||||
return new Value.LongValue(value.asLong() >> value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class DivideOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_DIV_ERROR");
|
|
||||||
}
|
|
||||||
if (value2.asDouble() == 0) {
|
|
||||||
return new Value.DoubleValue(Double.NaN);
|
|
||||||
}
|
|
||||||
return new Value.DoubleValue(value.asDouble() / value2.asDouble());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class MinusOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "-";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_SUB_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.DoubleValue(value.asDouble() - value2.asDouble());
|
|
||||||
} else {
|
|
||||||
return new Value.LongValue(value.asLong() - value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class ModuloOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "%";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (value instanceof Value.LongValue && value2 instanceof Value.LongValue) {
|
|
||||||
return new Value.LongValue(value.asLong() % value2.asLong());
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_MOD_ERROR");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class MultiplyOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "*";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.BooleanValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_MUL_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.StringValue) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (int i = 0; i < value2.asLong(); i++) {
|
|
||||||
sb.append(value.asString());
|
|
||||||
}
|
|
||||||
return new Value.StringValue(sb.toString());
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.DoubleValue(value.asDouble() * value2.asDouble());
|
|
||||||
} else {
|
|
||||||
return new Value.LongValue(value.asLong() * value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class PlusOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "+";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (value instanceof Value.BooleanValue || value2 instanceof Value.BooleanValue) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_ADD_ERROR");
|
|
||||||
}
|
|
||||||
if (value instanceof Value.StringValue || value2 instanceof Value.StringValue) {
|
|
||||||
return new Value.StringValue(value.asString() + value2.asString());
|
|
||||||
}
|
|
||||||
if (value instanceof Value.DoubleValue || value2 instanceof Value.DoubleValue) {
|
|
||||||
return new Value.DoubleValue(value.asDouble() + value2.asDouble());
|
|
||||||
} else {
|
|
||||||
return new Value.LongValue(value.asLong() + value2.asLong());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 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.expression.operator.math;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.script.expression.Operator;
|
|
||||||
import de.steamwar.bausystem.features.script.variables.Value;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class PowerOperator implements Operator {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getOperator() {
|
|
||||||
return "**";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority() {
|
|
||||||
return 11;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Value operate(Value value, Value value2) {
|
|
||||||
if (is(value, Value.StringValue.class, Value.BooleanValue.class) || is(value2, Value.StringValue.class, Value.BooleanValue.class)) {
|
|
||||||
throw new IllegalArgumentException("SCRIPT_COMMAND_ARITHMETIC_POW_ERROR");
|
|
||||||
}
|
|
||||||
return new Value.DoubleValue(Math.pow(value.asDouble(), value2.asDouble()));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 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.items;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.Permission;
|
|
||||||
import de.steamwar.bausystem.linkage.specific.BauGuiItem;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.inventory.ClickType;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class ScriptMenuBauGuiItem extends BauGuiItem {
|
|
||||||
|
|
||||||
public ScriptMenuBauGuiItem() {
|
|
||||||
super(15);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack getItem(Player player) {
|
|
||||||
return new SWItem(Material.WRITTEN_BOOK, BauSystem.MESSAGE.parse("SCRIPT_GUI_ITEM_NAME", player)).getItemStack();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean click(ClickType click, Player p) {
|
|
||||||
p.closeInventory();
|
|
||||||
p.performCommand("script");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Permission permission() {
|
|
||||||
return Permission.MEMBER;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,15 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.lua;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.luaj.vm2.LuaFunction;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public class CommandRegister {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final LuaFunction function;
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.lua;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.luaj.vm2.LuaFunction;
|
||||||
|
import org.luaj.vm2.LuaString;
|
||||||
|
import org.luaj.vm2.LuaValue;
|
||||||
|
import org.luaj.vm2.Varargs;
|
||||||
|
import org.luaj.vm2.lib.TwoArgFunction;
|
||||||
|
import org.luaj.vm2.lib.VarArgFunction;
|
||||||
|
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class SteamWarGlobalLuaPlugin extends TwoArgFunction {
|
||||||
|
private final BiConsumer<EventType, LuaFunction> eventConsumer;
|
||||||
|
private final Consumer<CommandRegister> commandRegisterConsumer;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue modname, LuaValue env) {
|
||||||
|
LuaValue types = tableOf();
|
||||||
|
for (EventType value : EventType.values()) {
|
||||||
|
types.set(value.name(), value.ordinal());
|
||||||
|
}
|
||||||
|
env.set("type", types);
|
||||||
|
|
||||||
|
|
||||||
|
env.set("event", new On());
|
||||||
|
env.set("command", new TwoArgFunction() {
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue arg1, LuaValue arg2) {
|
||||||
|
LuaString command = arg1.checkstring();
|
||||||
|
LuaFunction function = arg2.checkfunction();
|
||||||
|
|
||||||
|
commandRegisterConsumer.accept(new CommandRegister(command.tojstring().toLowerCase(), function));
|
||||||
|
|
||||||
|
return NIL;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return NIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
class On extends TwoArgFunction {
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue eventName, LuaValue function) {
|
||||||
|
int ord = eventName.checkint();
|
||||||
|
LuaFunction luaFunction = function.checkfunction();
|
||||||
|
|
||||||
|
int nArgs = luaFunction.narg();
|
||||||
|
if (nArgs != 1) {
|
||||||
|
return LuaValue.valueOf("Expected 1 argument, got " + nArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
eventConsumer.accept(EventType.values()[ord], luaFunction);
|
||||||
|
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum EventType {
|
||||||
|
FF,
|
||||||
|
PlaceBlock,
|
||||||
|
BreakBlock,
|
||||||
|
RightClick,
|
||||||
|
LeftClick,
|
||||||
|
TNTSpawn,
|
||||||
|
TNTExplode,
|
||||||
|
TNTExplodeInBuild,
|
||||||
|
SelfJoin,
|
||||||
|
SelfLeave,
|
||||||
|
DropItem,
|
||||||
|
EntityDeath;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,144 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.lua;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.features.loader.Loader;
|
||||||
|
import de.steamwar.bausystem.features.script.lua.libs.LuaLib;
|
||||||
|
import de.steamwar.bausystem.features.tpslimit.TPSLimitUtils;
|
||||||
|
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||||
|
import de.steamwar.bausystem.features.tracer.record.ActiveTracer;
|
||||||
|
import de.steamwar.bausystem.features.tracer.record.AutoTraceRecorder;
|
||||||
|
import de.steamwar.bausystem.features.tracer.record.Recorder;
|
||||||
|
import de.steamwar.bausystem.features.tracer.record.TraceRecorder;
|
||||||
|
import de.steamwar.bausystem.region.flags.Flag;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.FireMode;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.TNTMode;
|
||||||
|
import de.steamwar.core.TPSWatcher;
|
||||||
|
import de.steamwar.inventory.SWAnvilInv;
|
||||||
|
import de.steamwar.inventory.SWItem;
|
||||||
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.luaj.vm2.*;
|
||||||
|
import org.luaj.vm2.lib.*;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class SteamWarLuaPlugin extends TwoArgFunction {
|
||||||
|
|
||||||
|
public static final Map<Class<?>, List<LuaLib>> LUA_LIBS = new HashMap<>();
|
||||||
|
|
||||||
|
public static void add(LuaLib luaLib) {
|
||||||
|
LUA_LIBS.computeIfAbsent(luaLib.parent(), l -> new ArrayList<>()).add(luaLib);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Player player;
|
||||||
|
|
||||||
|
public SteamWarLuaPlugin(Player player) {
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue modname, LuaValue env) {
|
||||||
|
LuaValue materialLib = tableOf();
|
||||||
|
for (Material mat : Material.values()) {
|
||||||
|
materialLib.set(mat.name().toLowerCase(), valueOf(mat.name()));
|
||||||
|
}
|
||||||
|
|
||||||
|
initialize(env, null);
|
||||||
|
|
||||||
|
env.set("print", new Print());
|
||||||
|
env.set("input", new TwoArgFunction() {
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue arg1, LuaValue arg2) {
|
||||||
|
String message = arg1.tojstring();
|
||||||
|
LuaFunction callback = arg2.checkfunction();
|
||||||
|
|
||||||
|
SWAnvilInv inv = new SWAnvilInv(player, message);
|
||||||
|
inv.setCallback(s -> callback.call(valueOf(s)));
|
||||||
|
inv.open();
|
||||||
|
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
env.set("timeout", new TwoArgFunction() {
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue arg1, LuaValue arg2) {
|
||||||
|
long time = arg1.checklong();
|
||||||
|
LuaFunction callback = arg2.checkfunction();
|
||||||
|
|
||||||
|
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> callback.call(), time);
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
env.set("pos", new ThreeArgFunction() {
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) {
|
||||||
|
double x = arg1.checkdouble();
|
||||||
|
double y = arg2.checkdouble();
|
||||||
|
double z = arg3.checkdouble();
|
||||||
|
|
||||||
|
Location loc = new Location(player.getWorld(), x, y, z);
|
||||||
|
|
||||||
|
return tableOf(new LuaValue[] {
|
||||||
|
valueOf("x"), valueOf(loc.getBlockX()),
|
||||||
|
valueOf("y"), valueOf(loc.getBlockY()),
|
||||||
|
valueOf("z"), valueOf(loc.getBlockZ())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
env.set("exec", new VarArgFunction() {
|
||||||
|
@Override
|
||||||
|
public Varargs invoke(Varargs args) {
|
||||||
|
player.performCommand(varArgsToString(args));
|
||||||
|
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
env.set("collectgarbage", NIL);
|
||||||
|
env.set("dofile", NIL);
|
||||||
|
env.set("load", NIL);
|
||||||
|
env.set("loadfile", NIL);
|
||||||
|
env.set("pcall", NIL);
|
||||||
|
env.set("rawequal", NIL);
|
||||||
|
env.set("rawget", NIL);
|
||||||
|
env.set("rawlen", NIL);
|
||||||
|
env.set("rawset", NIL);
|
||||||
|
env.set("setmetatable", NIL);
|
||||||
|
env.set("xpcall", NIL);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String varArgsToString(Varargs args) {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for (int i = 1; i <= args.narg(); i++) {
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Das hier so zu entfernen scheint mir etwas unsicher. Wäre es nicht möglich, das Environment andersherum aufzubauen, d.h. komplett leer anzufangen und dann das nötige/sichere hinzuzufügen? Das hier so zu entfernen scheint mir etwas unsicher. Wäre es nicht möglich, das Environment andersherum aufzubauen, d.h. komplett leer anzufangen und dann das nötige/sichere hinzuzufügen?
Chaoscaot
hat
Habe die Packages schon selectiv hinzugefügt, das sind nur ein Paar Überbleibsel aus dem BasePackage. Habe die Packages schon selectiv hinzugefügt, das sind nur ein Paar Überbleibsel aus dem BasePackage.
|
|||||||
|
LuaValue arg = args.arg(i);
|
||||||
|
builder.append(arg.tojstring());
|
||||||
|
builder.append(" ");
|
||||||
|
}
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initialize(LuaValue parent, Class<? extends LuaLib> clazz) {
|
||||||
|
LUA_LIBS.get(clazz).forEach(luaLib -> {
|
||||||
|
LuaTable luaTable = luaLib.get(player);
|
||||||
|
parent.set(luaLib.name(), luaTable);
|
||||||
|
initialize(luaTable, luaLib.getClass());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
class Print extends VarArgFunction {
|
||||||
|
@Override
|
||||||
|
public Varargs invoke(Varargs args) {
|
||||||
|
player.sendMessage(varArgsToString(args));
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.lua;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.luaj.vm2.Globals;
|
||||||
|
import org.luaj.vm2.LoadState;
|
||||||
|
import org.luaj.vm2.LuaFunction;
|
||||||
|
import org.luaj.vm2.compiler.LuaC;
|
||||||
|
import org.luaj.vm2.lib.Bit32Lib;
|
||||||
|
import org.luaj.vm2.lib.PackageLib;
|
||||||
|
import org.luaj.vm2.lib.StringLib;
|
||||||
|
import org.luaj.vm2.lib.TableLib;
|
||||||
|
import org.luaj.vm2.lib.jse.JseBaseLib;
|
||||||
|
import org.luaj.vm2.lib.jse.JseMathLib;
|
||||||
|
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class SteamWarPlatform {
|
||||||
|
|
||||||
|
public static Globals createClickGlobals(Player player) {
|
||||||
|
Globals globals = new Globals();
|
||||||
|
globals.load(new JseBaseLib());
|
||||||
|
globals.load(new PackageLib());
|
||||||
|
globals.load(new JseMathLib());
|
||||||
|
globals.load(new TableLib());
|
||||||
|
globals.load(new Bit32Lib());
|
||||||
|
globals.load(new StringLib());
|
||||||
|
globals.load(new SteamWarLuaPlugin(player));
|
||||||
|
|
||||||
|
LoadState.install(globals);
|
||||||
|
LuaC.install(globals);
|
||||||
|
return globals;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Globals createGlobalGlobals(Player player, BiConsumer<SteamWarGlobalLuaPlugin.EventType, LuaFunction> eventConsumer, Consumer<CommandRegister> commandConsumer) {
|
||||||
|
Globals globals = createClickGlobals(player);
|
||||||
|
globals.load(new SteamWarGlobalLuaPlugin(eventConsumer, commandConsumer));
|
||||||
|
return globals;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.lua.libs;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.luaj.vm2.*;
|
||||||
|
import org.luaj.vm2.lib.VarArgFunction;
|
||||||
|
import org.luaj.vm2.lib.ZeroArgFunction;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public interface LuaLib {
|
||||||
|
|
||||||
|
static <T> LuaValue runGetter(Supplier<T> supplier) {
|
||||||
|
T value = supplier.get();
|
||||||
|
if (value == null) {
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
Class<?> clazz = value.getClass();
|
||||||
|
if (clazz == Integer.class || clazz == Long.class) {
|
||||||
|
return LuaValue.valueOf((int) value);
|
||||||
|
} else if (clazz == Double.class || clazz == Float.class) {
|
||||||
|
return LuaValue.valueOf((double) value);
|
||||||
|
} else if (clazz == String.class) {
|
||||||
|
return LuaValue.valueOf((String) value);
|
||||||
|
} else if (clazz == Boolean.class) {
|
||||||
|
return LuaValue.valueOf((boolean) value);
|
||||||
|
}
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
default <T> LuaFunction getter(Supplier<T> supplier) {
|
||||||
|
return new ZeroArgFunction() {
|
||||||
|
@Override
|
||||||
|
public LuaValue call() {
|
||||||
|
return runGetter(supplier);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
default <T> LuaFunction getterAndSetter(Supplier<T> supplier, Consumer<T> consumer) {
|
||||||
|
return new GetterAndSetter<>(supplier, consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
default String varArgsToString(Varargs varargs) {
|
||||||
|
return de.steamwar.bausystem.features.script.lua.SteamWarLuaPlugin.varArgsToString(varargs);
|
||||||
|
}
|
||||||
|
|
||||||
|
default Class<? extends LuaLib> parent() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String name();
|
||||||
|
LuaTable get(Player player);
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
class GetterAndSetter<T> extends VarArgFunction {
|
||||||
|
|
||||||
|
private Supplier<T> supplier;
|
||||||
|
private Consumer consumer;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Varargs invoke(Varargs args) {
|
||||||
|
if (args.narg() == 0) {
|
||||||
|
return runGetter(supplier);
|
||||||
|
} else {
|
||||||
|
if (args.narg() == 1) {
|
||||||
|
LuaValue luaValue = args.arg(0);
|
||||||
|
try {
|
||||||
|
if (luaValue instanceof LuaBoolean) {
|
||||||
|
consumer.accept(luaValue.toboolean());
|
||||||
|
} else if (luaValue instanceof LuaInteger) {
|
||||||
|
consumer.accept(luaValue.toint());
|
||||||
|
} else if (luaValue instanceof LuaDouble) {
|
||||||
|
consumer.accept(luaValue.todouble());
|
||||||
|
} else if (luaValue instanceof LuaString) {
|
||||||
|
consumer.accept(luaValue.toString());
|
||||||
|
} else {
|
||||||
|
throw new LuaError("Invalid lua type: " + luaValue.typename());
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throw new LuaError("Error in '" + checkfunction().name() + "' " + throwable.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.lua.libs;
|
||||||
|
|
||||||
|
import de.steamwar.linkage.Linked;
|
||||||
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.luaj.vm2.LuaTable;
|
||||||
|
import org.luaj.vm2.LuaValue;
|
||||||
|
import org.luaj.vm2.Varargs;
|
||||||
|
import org.luaj.vm2.lib.VarArgFunction;
|
||||||
|
|
||||||
|
@Linked
|
||||||
|
public class PlayerLib implements LuaLib {
|
||||||
|
|
||||||
|
public String name() {
|
||||||
|
return "player";
|
||||||
|
}
|
||||||
|
|
||||||
|
public LuaTable get(Player player) {
|
||||||
|
LuaTable table = new LuaTable();
|
||||||
|
table.set("name", getter(player::getName));
|
||||||
|
table.set("message", new Print(player));
|
||||||
|
table.set("actionbar", new SendActionbar(player));
|
||||||
|
|
||||||
|
table.set("x", getterAndSetter(player.getLocation()::getX, player.getLocation()::setX));
|
||||||
|
table.set("y", getterAndSetter(player.getLocation()::getY, player.getLocation()::setY));
|
||||||
|
table.set("z", getterAndSetter(player.getLocation()::getZ, player.getLocation()::setZ));
|
||||||
|
table.set("yaw", getterAndSetter(player.getLocation()::getYaw, player.getLocation()::setYaw));
|
||||||
|
table.set("pitch", getterAndSetter(player.getLocation()::getPitch, player.getLocation()::setPitch));
|
||||||
|
|
||||||
|
table.set("sneaking", getter(player::isSneaking));
|
||||||
|
table.set("sprinting", getter(player::isSprinting));
|
||||||
|
table.set("slot", getterAndSetter(player.getInventory()::getHeldItemSlot, player.getInventory()::setHeldItemSlot));
|
||||||
|
table.set("item", getter(player.getInventory().getItemInMainHand().getType()::name));
|
||||||
|
table.set("offHandItem", getter(player.getInventory().getItemInOffHand().getType()::name));
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Print extends VarArgFunction {
|
||||||
|
private final Player player;
|
||||||
|
|
||||||
|
public Print(Player player) {
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Varargs invoke(Varargs args) {
|
||||||
|
player.sendMessage(varArgsToString(args));
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SendActionbar extends VarArgFunction {
|
||||||
|
private final Player player;
|
||||||
|
|
||||||
|
public SendActionbar(Player player) {
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Varargs invoke(Varargs args) {
|
||||||
|
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(varArgsToString(args)));
|
||||||
|
return LuaValue.NIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.lua.libs;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.loader.Loader;
|
||||||
|
import de.steamwar.bausystem.features.tracer.record.ActiveTracer;
|
||||||
|
import de.steamwar.bausystem.features.tracer.record.AutoTraceRecorder;
|
||||||
|
import de.steamwar.bausystem.features.tracer.record.Recorder;
|
||||||
|
import de.steamwar.bausystem.region.Region;
|
||||||
|
import de.steamwar.bausystem.region.flags.Flag;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.FireMode;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.TNTMode;
|
||||||
|
import de.steamwar.linkage.Linked;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.luaj.vm2.LuaTable;
|
||||||
|
import org.luaj.vm2.LuaValue;
|
||||||
|
|
||||||
|
@Linked
|
||||||
|
public class RegionLib implements LuaLib {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String name() {
|
||||||
|
return "region";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LuaTable get(Player player) {
|
||||||
|
LuaTable table = LuaValue.tableOf();
|
||||||
|
|
||||||
|
table.set("name", getter(() -> Region.getRegion(player.getLocation()).getName()));
|
||||||
|
table.set("type", getter(() -> Region.getRegion(player.getLocation()).getPrototype().getName()));
|
||||||
|
|
||||||
|
LuaValue tntLib = LuaValue.tableOf();
|
||||||
|
tntLib.set("mode", getter(() -> Region.getRegion(player.getLocation()).getPlain(Flag.TNT, TNTMode.class).name()));
|
||||||
|
tntLib.set("enabled", getter(() -> Region.getRegion(player.getLocation()).getPlain(Flag.TNT, TNTMode.class) != TNTMode.DENY));
|
||||||
|
tntLib.set("onlyTb", getter(() -> Region.getRegion(player.getLocation()).getPlain(Flag.TNT, TNTMode.class) == TNTMode.ONLY_TB));
|
||||||
|
|
||||||
|
table.set("tnt", tntLib);
|
||||||
|
|
||||||
|
table.set("fire", getter(() -> Region.getRegion(player.getLocation()).getPlain(Flag.FIRE, FireMode.class) == FireMode.ALLOW));
|
||||||
|
table.set("freeze", getter(() -> Region.getRegion(player.getLocation()).getPlain(Flag.FREEZE, FreezeMode.class) == FreezeMode.ACTIVE));
|
||||||
|
table.set("protect", getter(() -> Region.getRegion(player.getLocation()).getPlain(Flag.PROTECT, ProtectMode.class) == ProtectMode.ACTIVE));
|
||||||
|
|
||||||
|
LuaValue traceLib = LuaValue.tableOf();
|
||||||
|
traceLib.set("active", getter(() -> !Region.getRegion(player.getLocation()).isGlobal() && Recorder.INSTANCE.get(Region.getRegion(player.getLocation())) instanceof ActiveTracer));
|
||||||
|
traceLib.set("auto", getter(() -> !Region.getRegion(player.getLocation()).isGlobal() && Recorder.INSTANCE.get(Region.getRegion(player.getLocation())) instanceof AutoTraceRecorder));
|
||||||
|
traceLib.set("status", getter(() -> Recorder.INSTANCE.get(Region.getRegion(player.getLocation())).scriptState()));
|
||||||
|
traceLib.set("time", getter(() -> Recorder.INSTANCE.get(Region.getRegion(player.getLocation())).scriptTime()));
|
||||||
|
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Hier ist es dagegen anders gemacht (als in der PlayerLib). Am besten auf eine (korrekte) Variante entscheiden. Hier ist es dagegen anders gemacht (als in der PlayerLib). Am besten auf eine (korrekte) Variante entscheiden.
|
|||||||
|
table.set("trace", traceLib);
|
||||||
|
|
||||||
|
Loader loader = Loader.getLoader(player);
|
||||||
|
table.set("loader", getter(() -> loader == null ? "OFF" : loader.getStage().name()));
|
||||||
|
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
package de.steamwar.bausystem.features.script.lua.libs;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.features.tpslimit.TPSLimitUtils;
|
||||||
|
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||||
|
import de.steamwar.core.TPSWatcher;
|
||||||
|
import de.steamwar.inventory.SWItem;
|
||||||
|
import de.steamwar.linkage.Linked;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.luaj.vm2.LuaString;
|
||||||
|
import org.luaj.vm2.LuaTable;
|
||||||
|
import org.luaj.vm2.LuaValue;
|
||||||
|
import org.luaj.vm2.lib.OneArgFunction;
|
||||||
|
import org.luaj.vm2.lib.TwoArgFunction;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
|
||||||
|
@Linked
|
||||||
|
public class ServerLib implements LuaLib {
|
||||||
|
@Override
|
||||||
|
public String name() {
|
||||||
|
return "server";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LuaTable get(Player player) {
|
||||||
|
LuaTable serverLib = LuaValue.tableOf();
|
||||||
|
serverLib.set("time", getter(() -> new SimpleDateFormat(BauSystem.MESSAGE.parse("TIME", player)).format(Calendar.getInstance().getTime())));
|
||||||
|
serverLib.set("ticks", getter(TPSUtils.currentTick));
|
||||||
|
serverLib.set("getBlockAt", new OneArgFunction() {
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue arg1) {
|
||||||
|
LuaTable pos = arg1.checktable();
|
||||||
|
return valueOf(player.getWorld().getBlockAt(pos.get("x").checkint(), pos.get("y").checkint(), pos.get("z").checkint()).getType().name());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
serverLib.set("setBlockAt", new TwoArgFunction() {
|
||||||
|
@Override
|
||||||
|
public LuaValue call(LuaValue arg1, LuaValue arg2) {
|
||||||
|
LuaTable pos = arg1.checktable();
|
||||||
|
LuaString material = arg2.checkstring();
|
||||||
|
Material mat = SWItem.getMaterial(material.tojstring());
|
||||||
|
if (mat == null) {
|
||||||
|
return NIL;
|
||||||
|
}
|
||||||
|
player.getWorld().getBlockAt(pos.get("x").checkint(), pos.get("y").checkint(), pos.get("z").checkint()).setType(mat);
|
||||||
|
return NIL;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
LuaValue tpsLib = LuaValue.tableOf();
|
||||||
|
tpsLib.set("oneSecond", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_SECOND)));
|
||||||
|
tpsLib.set("tenSecond", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_SECONDS)));
|
||||||
|
tpsLib.set("oneMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_MINUTE)));
|
||||||
|
tpsLib.set("fiveMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES)));
|
||||||
|
tpsLib.set("tenMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES)));
|
||||||
|
tpsLib.set("current", getter(TPSWatcher::getTPS));
|
||||||
|
tpsLib.set("limit", getter(TPSLimitUtils::getCurrentTPSLimit));
|
||||||
|
|
||||||
|
serverLib.set("tps", tpsLib);
|
||||||
|
return serverLib;
|
||||||
|
}
|
||||||
|
}
|
@ -1,315 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.variables;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.loader.Loader;
|
|
||||||
import de.steamwar.bausystem.features.tpslimit.FreezeUtils;
|
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSLimitUtils;
|
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
|
||||||
import de.steamwar.bausystem.features.tracer.record.ActiveTracer;
|
|
||||||
import de.steamwar.bausystem.features.tracer.record.AutoTraceRecorder;
|
|
||||||
import de.steamwar.bausystem.features.tracer.record.Recorder;
|
|
||||||
import de.steamwar.bausystem.features.tracer.record.TraceRecorder;
|
|
||||||
import de.steamwar.bausystem.region.Region;
|
|
||||||
import de.steamwar.bausystem.region.flags.Flag;
|
|
||||||
import de.steamwar.bausystem.region.flags.flagvalues.FireMode;
|
|
||||||
import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode;
|
|
||||||
import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode;
|
|
||||||
import de.steamwar.bausystem.region.flags.flagvalues.TNTMode;
|
|
||||||
import de.steamwar.core.TPSWatcher;
|
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import lombok.experimental.UtilityClass;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
@UtilityClass
|
|
||||||
public class Constants {
|
|
||||||
|
|
||||||
private final Map<String, Function<Player, Value>> CONSTANTS = new HashMap<>();
|
|
||||||
|
|
||||||
private static class ConstantDoubleValue extends Value.DoubleValue {
|
|
||||||
|
|
||||||
private Supplier<Double> doubleSupplier;
|
|
||||||
|
|
||||||
public ConstantDoubleValue(Supplier<Double> doubleSupplier) {
|
|
||||||
super(doubleSupplier.get());
|
|
||||||
this.doubleSupplier = doubleSupplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long asLong() {
|
|
||||||
value = doubleSupplier.get();
|
|
||||||
return super.asLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double asDouble() {
|
|
||||||
value = doubleSupplier.get();
|
|
||||||
return super.asDouble();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean asBoolean() {
|
|
||||||
value = doubleSupplier.get();
|
|
||||||
return super.asBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String asString() {
|
|
||||||
value = doubleSupplier.get();
|
|
||||||
return super.asString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ConstantLongValue extends Value.LongValue {
|
|
||||||
|
|
||||||
private Supplier<Long> longSupplier;
|
|
||||||
|
|
||||||
public ConstantLongValue(Supplier<Long> longSupplier) {
|
|
||||||
super(longSupplier.get());
|
|
||||||
this.longSupplier = longSupplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long asLong() {
|
|
||||||
value = longSupplier.get();
|
|
||||||
return super.asLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double asDouble() {
|
|
||||||
value = longSupplier.get();
|
|
||||||
return super.asDouble();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean asBoolean() {
|
|
||||||
value = longSupplier.get();
|
|
||||||
return super.asBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String asString() {
|
|
||||||
value = longSupplier.get();
|
|
||||||
return super.asString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ConstantBooleanValue extends Value.BooleanValue {
|
|
||||||
|
|
||||||
private Supplier<Boolean> booleanSupplier;
|
|
||||||
|
|
||||||
public ConstantBooleanValue(Supplier<Boolean> booleanSupplier) {
|
|
||||||
super(booleanSupplier.get());
|
|
||||||
this.booleanSupplier = booleanSupplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long asLong() {
|
|
||||||
value = booleanSupplier.get();
|
|
||||||
return super.asLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double asDouble() {
|
|
||||||
value = booleanSupplier.get();
|
|
||||||
return super.asDouble();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean asBoolean() {
|
|
||||||
value = booleanSupplier.get();
|
|
||||||
return super.asBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String asString() {
|
|
||||||
value = booleanSupplier.get();
|
|
||||||
return super.asString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ConstantStringValue extends Value.StringValue {
|
|
||||||
|
|
||||||
private Supplier<String> stringSupplier;
|
|
||||||
|
|
||||||
public ConstantStringValue(Supplier<String> stringSupplier) {
|
|
||||||
super(stringSupplier.get());
|
|
||||||
this.stringSupplier = stringSupplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long asLong() {
|
|
||||||
value = stringSupplier.get();
|
|
||||||
return super.asLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double asDouble() {
|
|
||||||
value = stringSupplier.get();
|
|
||||||
return super.asDouble();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean asBoolean() {
|
|
||||||
value = stringSupplier.get();
|
|
||||||
return super.asBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String asString() {
|
|
||||||
value = stringSupplier.get();
|
|
||||||
return super.asString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
|
||||||
CONSTANTS.put("trace", player -> {
|
|
||||||
Region region = Region.getRegion(player.getLocation());
|
|
||||||
if (region.isGlobal()) {
|
|
||||||
return new ConstantBooleanValue(() -> false);
|
|
||||||
}
|
|
||||||
return new ConstantBooleanValue(() -> Recorder.INSTANCE.get(region) instanceof ActiveTracer);
|
|
||||||
});
|
|
||||||
CONSTANTS.put("autotrace", player -> {
|
|
||||||
Region region = Region.getRegion(player.getLocation());
|
|
||||||
if (region.isGlobal()) {
|
|
||||||
return new ConstantBooleanValue(() -> false);
|
|
||||||
}
|
|
||||||
return new ConstantBooleanValue(() -> Recorder.INSTANCE.get(region) instanceof AutoTraceRecorder);
|
|
||||||
});
|
|
||||||
CONSTANTS.put("trace_status", player -> {
|
|
||||||
TraceRecorder recorder = Recorder.INSTANCE.get(Region.getRegion(player.getLocation()));
|
|
||||||
return new ConstantStringValue(recorder::scriptState);
|
|
||||||
});
|
|
||||||
CONSTANTS.put("trace_time", player -> {
|
|
||||||
TraceRecorder recorder = Recorder.INSTANCE.get(Region.getRegion(player.getLocation()));
|
|
||||||
return new ConstantLongValue(recorder::scriptTime);
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("tnt", player -> {
|
|
||||||
return new ConstantBooleanValue(() -> Region.getRegion(player.getLocation()).getPlain(Flag.TNT, TNTMode.class) != TNTMode.DENY);
|
|
||||||
});
|
|
||||||
CONSTANTS.put("tnt_onlytb", player -> {
|
|
||||||
return new ConstantBooleanValue(() -> Region.getRegion(player.getLocation()).getPlain(Flag.TNT, TNTMode.class) == TNTMode.ONLY_TB);
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("fire", player -> {
|
|
||||||
return new ConstantBooleanValue(() -> Region.getRegion(player.getLocation()).getPlain(Flag.FIRE, FireMode.class) == FireMode.ALLOW);
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("freeze", player -> {
|
|
||||||
return new ConstantBooleanValue(() -> Region.getRegion(player.getLocation()).getPlain(Flag.FREEZE, FreezeMode.class) == FreezeMode.ACTIVE);
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("protect", player -> {
|
|
||||||
return new ConstantBooleanValue(() -> Region.getRegion(player.getLocation()).getPlain(Flag.PROTECT, ProtectMode.class) == ProtectMode.ACTIVE);
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("x", player -> {
|
|
||||||
return new ConstantDoubleValue(() -> player.getLocation().getX());
|
|
||||||
});
|
|
||||||
CONSTANTS.put("y", player -> {
|
|
||||||
return new ConstantDoubleValue(() -> player.getLocation().getY());
|
|
||||||
});
|
|
||||||
CONSTANTS.put("z", player -> {
|
|
||||||
return new ConstantDoubleValue(() -> player.getLocation().getZ());
|
|
||||||
});
|
|
||||||
CONSTANTS.put("name", player -> {
|
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
|
||||||
return new ConstantStringValue(user::getUserName);
|
|
||||||
});
|
|
||||||
CONSTANTS.put("sneaking", player -> {
|
|
||||||
return new ConstantBooleanValue(player::isSneaking);
|
|
||||||
});
|
|
||||||
CONSTANTS.put("sprinting", player -> {
|
|
||||||
return new ConstantBooleanValue(player::isSprinting);
|
|
||||||
});
|
|
||||||
CONSTANTS.put("slot", player -> {
|
|
||||||
return new ConstantLongValue(() -> (long) player.getInventory().getHeldItemSlot());
|
|
||||||
});
|
|
||||||
CONSTANTS.put("slotmaterial", player -> {
|
|
||||||
return new ConstantStringValue(() -> player.getInventory().getItemInMainHand().getType().name());
|
|
||||||
});
|
|
||||||
CONSTANTS.put("offhandmaterial", player -> {
|
|
||||||
return new ConstantStringValue(() -> player.getInventory().getItemInOffHand().getType().name());
|
|
||||||
});
|
|
||||||
CONSTANTS.put("materialname", player -> {
|
|
||||||
return new ConstantStringValue(() -> {
|
|
||||||
ItemMeta itemMeta = player.getInventory().getItemInMainHand().getItemMeta();
|
|
||||||
if (itemMeta == null) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return itemMeta.getDisplayName();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
CONSTANTS.put("offmaterialname", player -> {
|
|
||||||
return new ConstantStringValue(() -> {
|
|
||||||
ItemMeta itemMeta = player.getInventory().getItemInOffHand().getItemMeta();
|
|
||||||
if (itemMeta == null) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return itemMeta.getDisplayName();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("region_type", player -> {
|
|
||||||
Region region = Region.getRegion(player.getLocation());
|
|
||||||
if (region.isGlobal()) {
|
|
||||||
return new ConstantStringValue(() -> "global");
|
|
||||||
}
|
|
||||||
return new ConstantStringValue(() -> region.getPrototype().getDisplayName().replace(' ', '_').toLowerCase());
|
|
||||||
});
|
|
||||||
CONSTANTS.put("region_name", player -> {
|
|
||||||
Region region = Region.getRegion(player.getLocation());
|
|
||||||
if (region.isGlobal()) {
|
|
||||||
return new ConstantStringValue(() -> "Global");
|
|
||||||
}
|
|
||||||
return new ConstantStringValue(() -> region.getPrototype().getDisplayName());
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("tps", player -> {
|
|
||||||
return new ConstantDoubleValue(() -> {
|
|
||||||
if (FreezeUtils.isFrozen()) return 0.0;
|
|
||||||
return TPSWatcher.getTPS();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
CONSTANTS.put("tps_limit", player -> {
|
|
||||||
return new ConstantDoubleValue(TPSLimitUtils::getCurrentTPSLimit);
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("ticks", player -> {
|
|
||||||
return new ConstantLongValue(TPSUtils.currentTick);
|
|
||||||
});
|
|
||||||
CONSTANTS.put("time", player -> {
|
|
||||||
return new ConstantStringValue(() -> new SimpleDateFormat(BauSystem.MESSAGE.parse("TIME", player)).format(Calendar.getInstance().getTime()));
|
|
||||||
});
|
|
||||||
|
|
||||||
CONSTANTS.put("loader_status", player -> {
|
|
||||||
Loader loader = Loader.getLoader(player);
|
|
||||||
if (loader == null) {
|
|
||||||
return new ConstantStringValue(() -> "OFF");
|
|
||||||
}
|
|
||||||
return new ConstantStringValue(() -> loader.getStage().name());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> allVariables() {
|
|
||||||
return CONSTANTS.keySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isConstant(String variableName) {
|
|
||||||
return CONSTANTS.containsKey(variableName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Value getConstant(String variableName, Player player) {
|
|
||||||
return CONSTANTS.get(variableName).apply(player);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.variables;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class Context {
|
|
||||||
|
|
||||||
private Map<String, Value> variables = new HashMap<>();
|
|
||||||
|
|
||||||
public void putValue(String variableName, Value value) {
|
|
||||||
if (variables.containsKey(variableName)) {
|
|
||||||
if (variables.get(variableName).type().equals(value.type())) {
|
|
||||||
variables.get(variableName).fromValue(value);
|
|
||||||
} else {
|
|
||||||
variables.put(variableName, value);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
variables.put(variableName, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeValue(String variableName) {
|
|
||||||
variables.remove(variableName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasValue(String variableName) {
|
|
||||||
return variables.containsKey(variableName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Value getValue(String variableName) {
|
|
||||||
return variables.get(variableName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> allVariables() {
|
|
||||||
return variables.keySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<Map.Entry<String, Value>> entrySet() {
|
|
||||||
return variables.entrySet();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,188 +0,0 @@
|
|||||||
package de.steamwar.bausystem.features.script.variables;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.ToString;
|
|
||||||
|
|
||||||
public interface Value {
|
|
||||||
|
|
||||||
static Value parse(String varValue) {
|
|
||||||
try {
|
|
||||||
return new Value.LongValue(Long.parseLong(varValue));
|
|
||||||
} catch (NumberFormatException ne) {
|
|
||||||
try {
|
|
||||||
return new Value.DoubleValue(Double.parseDouble(varValue));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
if (varValue.equalsIgnoreCase("true") || varValue.equalsIgnoreCase("false")) {
|
|
||||||
return new Value.BooleanValue(varValue.equalsIgnoreCase("true"));
|
|
||||||
} else {
|
|
||||||
return new Value.StringValue(varValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String type();
|
|
||||||
long asLong();
|
|
||||||
double asDouble();
|
|
||||||
boolean asBoolean();
|
|
||||||
String asString();
|
|
||||||
|
|
||||||
void fromValue(Value value);
|
|
||||||
|
|
||||||
@AllArgsConstructor
|
|
||||||
@ToString
|
|
||||||
class DoubleValue implements Value {
|
|
||||||
|
|
||||||
protected double value;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String type() {
|
|
||||||
return "floating_number";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long asLong() {
|
|
||||||
return Math.round(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double asDouble() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean asBoolean() {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String asString() {
|
|
||||||
return value + "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fromValue(Value value) {
|
|
||||||
this.value = value.asDouble();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@AllArgsConstructor
|
|
||||||
@ToString
|
|
||||||
class LongValue implements Value {
|
|
||||||
|
|
||||||
protected long value;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String type() {
|
|
||||||
return "number";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long asLong() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double asDouble() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean asBoolean() {
|
|
||||||
return value != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String asString() {
|
|
||||||
return value + "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fromValue(Value value) {
|
|
||||||
this.value = value.asLong();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@AllArgsConstructor
|
|
||||||
@ToString
|
|
||||||
class BooleanValue implements Value {
|
|
||||||
|
|
||||||
protected boolean value;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String type() {
|
|
||||||
return "boolean";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long asLong() {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double asDouble() {
|
|
||||||
return value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean asBoolean() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String asString() {
|
|
||||||
return value + "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fromValue(Value value) {
|
|
||||||
this.value = value.asBoolean();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@AllArgsConstructor
|
|
||||||
@ToString
|
|
||||||
class StringValue implements Value {
|
|
||||||
|
|
||||||
protected String value;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String type() {
|
|
||||||
return "text";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long asLong() {
|
|
||||||
try {
|
|
||||||
return Long.parseLong(value);
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double asDouble() {
|
|
||||||
try {
|
|
||||||
return Double.parseDouble(value);
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean asBoolean() {
|
|
||||||
return value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String asString() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fromValue(Value value) {
|
|
||||||
this.value = value.asString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
183
SCRIPT.md
Normale Datei
@ -0,0 +1,183 @@
|
|||||||
|
# SteamWar.de - Script System
|
||||||
|
|
||||||
|
---
|
||||||
|
<!-- TOC -->
|
||||||
|
* [SteamWar.de - Script System](#steamwarde---script-system)
|
||||||
|
* [Einleitung](#einleitung)
|
||||||
|
* [Basis-Apis](#basis-apis)
|
||||||
|
* [SteamWar.de-Api](#steamwarde-api)
|
||||||
|
* [global](#global)
|
||||||
|
* [player](#player)
|
||||||
|
* [region](#region)
|
||||||
|
* [tnt](#tnt)
|
||||||
|
* [server](#server)
|
||||||
|
* [SteamWar.de-Global-Api](#steamwarde-global-api)
|
||||||
|
* [Event Type](#event-type)
|
||||||
|
* [BlockEvent](#blockevent)
|
||||||
|
* [InteractEvent](#interactevent)
|
||||||
|
* [Position](#position)
|
||||||
|
* [Beispiele](#beispiele)
|
||||||
|
* [Hello, World!](#hello-world)
|
||||||
|
* [Code](#code)
|
||||||
|
* [Ausgabe](#ausgabe)
|
||||||
|
<!-- TOC -->
|
||||||
|
|
||||||
|
|
||||||
|
## Einleitung
|
||||||
|
Das Script System auf SteamWar.de basiert auf [Lua](https://www.lua.org/docs.html). Der Code wird einfach in ein Minecraft Buch geschrieben und kann mit einem Links-Klick ausgeführt werden.
|
||||||
|
|
||||||
|
# Basis-Apis
|
||||||
|
Es werden folgende Standard-Apis zur Verfügung gestellt:
|
||||||
|
- [`math`](https://www.lua.org/manual/5.4/manual.html#6.7)
|
||||||
|
- [`string`](https://www.lua.org/manual/5.4/manual.html#6.4)
|
||||||
|
- [`table`](https://www.lua.org/manual/5.4/manual.html#6.6)
|
||||||
|
- `bit32`
|
||||||
|
|
||||||
|
# SteamWar.de-Api
|
||||||
|
In den Scripten gibt es dazu noch folgende globale Variablen:
|
||||||
|
- [`player`](#player)
|
||||||
|
- [`region`](#region)
|
||||||
|
- [`server`](#server)
|
||||||
|
|
||||||
|
### global
|
||||||
|
Die `global`-Api stellt Funktionen zur Verfügung, QOL sind.
|
||||||
|
Es gibt folgende Funktionen:
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Warum hier kein Link? Warum hier kein Link?
|
|||||||
|
|
||||||
|
| Name | Signature | Beschreibung |
|
||||||
|
|-----------|----------------------------------|----------------------------------------------------------------------------------------------------|
|
||||||
|
| `print` | print(String...) | @see message(String...) |
|
||||||
|
| `input` | input(String, Function\<String>) | Fragt den User nach einer Eingabe mit der Nachricht und called die zugehörige Funktion nach dieser |
|
||||||
|
| `timeout` | timeout(Number, Function\<Void>) | Wartet die angegebene Anzahl an Ticks und führt danach die zugehörige Funktion aus |
|
||||||
|
| `pos` | pos(Number, Number, Number) | Erstellt aus drei Zahlen eine Position-Table |
|
||||||
|
| `exec` | exec(String...) | Führt den angegebenen Befehl als Spieler aus |
|
||||||
|
|
||||||
|
### player
|
||||||
|
Die `player`-Api 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 |
|
||||||
|
| `message` | message(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 den Yaw des Spielers |
|
||||||
|
| `pitch` | pitch(Number), pitch(): Number | Setzt oder gibt den Pitch 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 |
|
||||||
|
| `item` | item(): String | Gibt den Item Type der Main-Hand zurück |
|
||||||
|
| `offHandItem` | offHandItem(): String | Gibt den Item Type der Off-Hand zurück |
|
||||||
|
|
||||||
|
|
||||||
|
### region
|
||||||
|
Die `region`-Api stellt Funktion zur Verfügung, die die Region des Spielers betreffen.
|
||||||
|
Es gibt folgende Funktionen:
|
||||||
|
|
||||||
|
| Name | Signature | Beschreibung |
|
||||||
|
|--------|----------------|--------------------------------------------|
|
||||||
|
| `name` | name(): String | Gibt den Namen der Region zurück |
|
||||||
|
| `type` | type(): String | Gibt den Namen des Typen der Region zurück |
|
||||||
|
|
||||||
|
Es gibt folgende Variablen:
|
||||||
|
|
||||||
|
| Name | Beschreibung |
|
||||||
|
|--------|--------------|
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Itemtyp Itemtyp
|
|||||||
|
| `tnt` | [tnt](#tnt) |
|
||||||
|
|
||||||
|
#### tnt
|
||||||
|
|
||||||
|
|
||||||
|
## server
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
Es gibt folgende Funktionen:
|
||||||
|
|
||||||
|
| Name | Signature | Beschreibung |
|
||||||
|
|-----------|---------------------------------|---------------------------------|
|
||||||
|
| `event` | event(EventType, Function(Any)) | Registriere einen Event Handler |
|
||||||
|
| `command` | cmd(String, Function(Any)) | Registriere einen Command |
|
||||||
|
|
||||||
|
Es gibt folgende Variablen:
|
||||||
|
|
||||||
|
| Name | Beschreibung |
|
||||||
|
|--------|----------------------------------|
|
||||||
|
| `type` | Siehe: [Event Type](#event-type) |
|
||||||
|
|
||||||
|
## Event Type
|
||||||
|
Es gibt folgende Event-Typen:
|
||||||
|
|
||||||
|
| Name | Wenn | Parameter |
|
||||||
|
|---------------------|-----------------------------------------------------|---------------------------------|
|
||||||
|
| `FF` | Beim Doppelten Drücken der Swap-Hands taste | NIL |
|
||||||
|
| `PlaceBlock` | Beim Platzieren von Blöcken | [BlockEvent](#blockevent) |
|
||||||
|
| `BreakBlock` | Beim Zerstören von Blöcken | [BlockEvent](#blockevent) |
|
||||||
|
| `RightClick` | Beim Rechts klicken | [InteractEvent](#interactevent) |
|
||||||
|
| `LeftClick` | Beim Links Klicken | [InteractEvent](#interactevent) |
|
||||||
|
| `TNTSpawn` | Wenn ein TNT in der aktuellen Region spawnt | NIL |
|
||||||
|
| `TNTExplode` | Wenn ein TNT in der aktuellen Region explodiert | [Position](#position) |
|
||||||
|
| `TNTExplodeInBuild` | Wenn ein TNT in der aktuellen Bau Region explodiert | [Position](#position) |
|
||||||
|
| `SelfJoin` | Wenn man selbst den Server betritt | NIL |
|
||||||
|
| `SelfLeave` | Wenn man den Server verlässt | NIL |
|
||||||
|
| `DropItem` | Wenn man ein item Droppt | (type: Material) |
|
||||||
|
| `EntityDeath` | Wenn ein Entity Stirbt | (type: Entity Type) |
|
||||||
|
|
||||||
|
### BlockEvent
|
||||||
|
Das übergebene Objekt an den Handler hat folgende Variablen:
|
||||||
|
|
||||||
|
| Name | Beschreibung |
|
||||||
|
|--------|-----------------------------|
|
||||||
|
| `x` | Die X-Koordinate des Blocks |
|
||||||
|
| `y` | Die Y-Koordinate des Blocks |
|
||||||
|
| `z` | Die Z-Koordinate des Blocks |
|
||||||
|
| `type` | Das Material des Blocks |
|
||||||
|
|
||||||
|
### InteractEvent
|
||||||
|
Das übergebene Objekt an den Handler hat folgende Variablen:
|
||||||
|
|
||||||
|
| Name | Beschreibung |
|
||||||
|
|------------|-------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `action` | Die Action die ausgeführt wurde, Mögliche Werte: `RIGHT_CLICK_BLOCK`, `RIGHT_CLICK_AIR`, `LEFT_CLICK_BLOCK`, `LEFT_CLICK_AIR` |
|
||||||
|
| `hand` | Die Hand die zum ausführen genutzt wird, Mögliche Werte: `HAND`, `OFF_HAND` |
|
||||||
|
| `block` | Der Typ des Items mit dem geklickt wurde |
|
||||||
|
| `hasBlock` | Wahr, wenn auf einen Block geklickt wurde |
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Warum hier wieder Variablen? Und warum gibt es diese API im Server, wo es noch die TPS-Api gibt? Warum hier wieder Variablen? Und warum gibt es diese API im Server, wo es noch die TPS-Api gibt?
|
|||||||
|
|
||||||
|
Wenn `hasBlock` wahr ist, gibt es folgende Variablen:
|
||||||
|
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Betrifft auch vorige und spätere Vorkommnisse: Nicht Api, sondern API. Und wäre es in dem Kontext nicht eigentlich eher ein "Modul" oder "Package"? (K.a. was der typische Begriff im Lua-Umfeld dafür ist, aber ich bezweifle, dass dieser Api lautet). Betrifft auch vorige und spätere Vorkommnisse: Nicht Api, sondern API. Und wäre es in dem Kontext nicht eigentlich eher ein "Modul" oder "Package"? (K.a. was der typische Begriff im Lua-Umfeld dafür ist, aber ich bezweifle, dass dieser Api lautet).
|
|||||||
|
| Name | Beschreibung |
|
||||||
|
|-------------|-----------------------------------------|
|
||||||
|
| `blockX` | Die X-Koordinate des Blocks |
|
||||||
|
| `blockY` | Die Y-Koordinate des Blocks |
|
||||||
|
| `blockZ` | Die Z-Koordinate des Blocks |
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Es gibt kein "aktuell". Welchem Wert entsprechen diese TPS? Es gibt kein "aktuell". Welchem Wert entsprechen diese TPS?
|
|||||||
|
| `blockFace` | Die Seite des Blocks die geklickt wurde |
|
||||||
|
|
||||||
|
|
||||||
|
### Position
|
||||||
|
Die Position ist ein Objekt mit folgenden Variablen:
|
||||||
|
|
||||||
|
| Name | Beschreibung |
|
||||||
|
|------|------------------|
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Was unterscheidet diese Global-API von der obengenannten global-API? Absolut verwirrend, muss mindestens unbenannt werden. Was unterscheidet diese Global-API von der obengenannten global-API? Absolut verwirrend, muss mindestens unbenannt werden.
|
|||||||
|
| `x` | Die X-Koordinate |
|
||||||
|
| `y` | Die Y-Koordinate |
|
||||||
|
| `z` | Die Z-Koordinate |
|
||||||
|
|
||||||
|
|
||||||
|
# Beispiele
|
||||||
|
|
||||||
|
## Hello, World!
|
||||||
|
Ein einfaches Hello, World!-Script.
|
||||||
|
|
||||||
|
#### Code
|
||||||
|
```lua
|
||||||
|
print("Hello, World!")
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Ausgabe
|
||||||
|
```
|
||||||
|
Hello, World!
|
||||||
|
```
|
Aktuelle Fassung von LuaJ scheint 3.0.2 zu sein. Warum 3.0.1?