Todo: * /script and global script storage * Code Cleanup
Dieser Commit ist enthalten in:
Ursprung
072833f503
Commit
16a6d10472
21
BauSystem_Linkage/src/de/steamwar/linkage/types/LuaLib_GENERIC.java
Normale Datei
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')
|
||||
|
||||
compileOnly swdep('FastAsyncWorldEdit-1.18')
|
||||
|
||||
implementation 'org.luaj:luaj-jse:3.0.1'
|
||||
}
|
@ -20,8 +20,6 @@
|
||||
package de.steamwar.bausystem.features.region;
|
||||
|
||||
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.RegionUtils;
|
||||
import de.steamwar.bausystem.region.flags.Flag;
|
||||
@ -48,10 +46,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
@Linked
|
||||
public class TNTListener implements Listener, ScoreboardElement {
|
||||
|
||||
@LinkedInstance
|
||||
public CustomScriptManager customScriptManager;
|
||||
|
||||
private void explode(List<Block> blockList, Location location, EventType eventType, Event event) {
|
||||
private void explode(List<Block> blockList) {
|
||||
AtomicBoolean inBuild = new AtomicBoolean();
|
||||
blockList.removeIf(block -> {
|
||||
Region region = Region.getRegion(block.getLocation());
|
||||
@ -71,24 +66,16 @@ public class TNTListener implements Listener, ScoreboardElement {
|
||||
}
|
||||
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
|
||||
public void onBlockExplode(BlockExplodeEvent event) {
|
||||
explode(event.blockList(), event.getBlock().getLocation(), null, null);
|
||||
explode(event.blockList());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onExplode(EntityExplodeEvent event) {
|
||||
explode(event.blockList(), event.getLocation(), EventType.TNTExplodeInBuild, event);
|
||||
explode(event.blockList());
|
||||
}
|
||||
|
||||
@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;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
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 ScriptCommand() {
|
||||
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;
|
||||
|
||||
import de.steamwar.bausystem.features.script.variables.Context;
|
||||
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -9,22 +8,19 @@ import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.player.PlayerSwapHandItemsEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.BookMeta;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
@Linked
|
||||
public class ScriptListener implements Listener {
|
||||
|
||||
private static final Map<Player, Context> GLOBAL_CONTEXT = new HashMap<>();
|
||||
|
||||
private Set<Player> playerSet = new HashSet<>();
|
||||
private final Set<Player> playerSet = new HashSet<>();
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onLeftClick(PlayerInteractEvent event) {
|
||||
@ -44,20 +40,22 @@ public class ScriptListener implements Listener {
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
new ScriptExecutor((BookMeta) item.getItemMeta(), event.getPlayer(), null);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
GLOBAL_CONTEXT.put(event.getPlayer(), new Context());
|
||||
ScriptRunner.runScript(((BookMeta) item.getItemMeta()).getPages().stream().reduce((s, s2) -> s + "\n" + s2).orElse(null), event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
GLOBAL_CONTEXT.remove(event.getPlayer());
|
||||
ScriptRunner.remove(event.getPlayer());
|
||||
}
|
||||
|
||||
public static Context getGlobalContext(Player player) {
|
||||
return GLOBAL_CONTEXT.computeIfAbsent(player, ignore -> new Context());
|
||||
@EventHandler
|
||||
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 @@
|
||||
/*
|
||||
* 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;
|
||||
package de.steamwar.bausystem.features.script.event;
|
||||
|
||||
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.utils.RegionExtensionType;
|
||||
import de.steamwar.bausystem.region.utils.RegionType;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.LinkedInstance;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.EntityType;
|
||||
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.EntitySpawnEvent;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
@ -48,9 +31,6 @@ import java.util.Set;
|
||||
@Linked
|
||||
public class EventListener implements Listener {
|
||||
|
||||
@LinkedInstance
|
||||
public CustomScriptManager manager;
|
||||
|
||||
private static final Map<Player, Long> LAST_FS = new HashMap<>();
|
||||
|
||||
{
|
||||
@ -61,18 +41,18 @@ public class EventListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
manager.callEvent(EventType.SelfJoin, event.getPlayer(), event);
|
||||
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.SelfJoin, LuaValue.NIL);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
manager.callEvent(EventType.SelfLeave, event.getPlayer(), event);
|
||||
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.SelfLeave, LuaValue.NIL);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
||||
if (LAST_FS.containsKey(event.getPlayer())) {
|
||||
manager.callEvent(EventType.FF, event.getPlayer(), event);
|
||||
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.FF, LuaValue.NIL);
|
||||
} else {
|
||||
LAST_FS.put(event.getPlayer(), System.currentTimeMillis());
|
||||
}
|
||||
@ -80,12 +60,22 @@ public class EventListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
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
|
||||
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<>();
|
||||
@ -95,11 +85,25 @@ public class EventListener implements Listener {
|
||||
if (ignore.remove(event.getPlayer())) {
|
||||
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) {
|
||||
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) {
|
||||
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()) {
|
||||
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());
|
||||
|
||||
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()) {
|
||||
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
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||
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
|
||||
public void onEntityDeath(EntityDeathEvent event) {
|
||||
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++) {
|
||||
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()));
|
||||
|
||||
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
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:
|
||||
|
||||
| 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 |
|
||||
|--------|--------------|
|
||||
| `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 |
|
||||
|
||||
Wenn `hasBlock` wahr ist, gibt es folgende Variablen:
|
||||
|
||||
| Name | Beschreibung |
|
||||
|-------------|-----------------------------------------|
|
||||
| `blockX` | Die X-Koordinate des Blocks |
|
||||
| `blockY` | Die Y-Koordinate des Blocks |
|
||||
| `blockZ` | Die Z-Koordinate des Blocks |
|
||||
| `blockFace` | Die Seite des Blocks die geklickt wurde |
|
||||
|
||||
|
||||
### Position
|
||||
Die Position ist ein Objekt mit folgenden Variablen:
|
||||
|
||||
| Name | Beschreibung |
|
||||
|------|------------------|
|
||||
| `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!
|
||||
```
|
In neuem Issue referenzieren
Einen Benutzer sperren