SteamWar/BauSystem2.0
Archiviert
12
0

Initial draft ScriptEditor
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful

Dieser Commit ist enthalten in:
yoyosource 2022-12-25 00:24:43 +01:00
Ursprung 675d0d616e
Commit e9c7d6cf07
27 geänderte Dateien mit 388 neuen und 2 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,104 @@
/*
* 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.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);
}
}

Datei anzeigen

@ -16,6 +16,12 @@ public interface SpecialCommand {
boolean execute(String[] command, ScriptExecutor scriptExecutor);
default boolean repeating() {
return false;
}
TokenType[][] getSyntax();
default long asLong(String value) {
try {
return Long.parseLong(value);
@ -65,4 +71,16 @@ public interface SpecialCommand {
}
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,
}
}

Datei anzeigen

@ -37,4 +37,13 @@ public class Call implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -31,4 +31,11 @@ public class Exit implements SpecialCommand {
public boolean execute(String[] command, ScriptExecutor scriptExecutor) {
return false;
}
private TokenType[][] syntax = {};
@Override
public TokenType[][] getSyntax() {
return syntax;
}
}

Datei anzeigen

@ -53,4 +53,16 @@ public class If implements SpecialCommand {
}
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;
}
}

Datei anzeigen

@ -37,4 +37,13 @@ public class Jump implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -33,4 +33,11 @@ public class Return implements SpecialCommand {
returnFromStackWithMessage(scriptExecutor, BauSystem.MESSAGE.parse("SCRIPT_COMMAND_RETURN_ERROR", scriptExecutor.getPlayer()));
return true;
}
private TokenType[][] syntax = {};
@Override
public TokenType[][] getSyntax() {
return syntax;
}
}

Datei anzeigen

@ -46,4 +46,13 @@ public class Sleep implements SpecialCommand {
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), scriptExecutor::resume, sleepTime);
return false;
}
private TokenType[][] syntax = {
{ TokenType.number_type }
};
@Override
public TokenType[][] getSyntax() {
return syntax;
}
}

Datei anzeigen

@ -90,4 +90,18 @@ public class Ceil implements SpecialCommand {
}
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;
}
}

Datei anzeigen

@ -90,4 +90,18 @@ public class Floor implements SpecialCommand {
}
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;
}
}

Datei anzeigen

@ -90,4 +90,18 @@ public class Round implements SpecialCommand {
}
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;
}
}

Datei anzeigen

@ -45,4 +45,18 @@ public class Echo implements SpecialCommand {
BauSystem.MESSAGE.send("SCRIPT_COMMAND_IO_ECHO_MESSAGE", 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;
}
}

Datei anzeigen

@ -45,4 +45,18 @@ public class Echoactionbar implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -62,4 +62,18 @@ public class Input implements SpecialCommand {
swAnvilInv.open();
return false;
}
@Override
public boolean repeating() {
return true;
}
private TokenType[][] syntax = {
{ TokenType.variable, TokenType.any },
};
@Override
public TokenType[][] getSyntax() {
return syntax;
}
}

Datei anzeigen

@ -77,7 +77,7 @@ public class Insert implements SpecialCommand {
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_STRINGS_ALLOWED", scriptExecutor.getPlayer());
return true;
}
if (!(v3 instanceof Value.StringValue)) {
if (!(v3 instanceof Value.LongValue)) {
BauSystem.MESSAGE.send("SCRIPT_COMMAND_ERROR_ONLY_NUMBERS_ALLOWED", scriptExecutor.getPlayer());
return true;
}
@ -85,4 +85,14 @@ public class Insert implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -76,4 +76,14 @@ public class Remove implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -85,4 +85,14 @@ public class Replace implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -82,4 +82,14 @@ public class Substring implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -70,4 +70,18 @@ public class Const implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -62,4 +62,13 @@ public class Convert implements SpecialCommand {
scriptExecutor.getLocalVariables().putValue(command[1], Value.parse(command[2]));
return true;
}
private TokenType[][] syntax = {
{ TokenType.variable, TokenType.any },
};
@Override
public TokenType[][] getSyntax() {
return syntax;
}
}

Datei anzeigen

@ -50,4 +50,18 @@ public class Global implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -37,4 +37,13 @@ public class Unglobal implements SpecialCommand {
scriptExecutor.getGlobalVariables().removeValue(command[1]);
return true;
}
private TokenType[][] syntax = {
{ TokenType.variable },
};
@Override
public TokenType[][] getSyntax() {
return syntax;
}
}

Datei anzeigen

@ -37,4 +37,13 @@ public class Unvar implements SpecialCommand {
scriptExecutor.getLocalVariables().removeValue(command[1]);
return true;
}
private TokenType[][] syntax = {
{ TokenType.variable, TokenType.any },
};
@Override
public TokenType[][] getSyntax() {
return syntax;
}
}

Datei anzeigen

@ -50,4 +50,18 @@ public class Var implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -77,4 +77,13 @@ public class GetMaterial implements SpecialCommand {
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;
}
}

Datei anzeigen

@ -80,4 +80,13 @@ public class SetMaterial implements SpecialCommand {
}
return true;
}
private TokenType[][] syntax = {
{ TokenType.variable, TokenType.number_type, TokenType.number_type, TokenType.number_type }
};
@Override
public TokenType[][] getSyntax() {
return syntax;
}
}

Datei anzeigen

@ -30,7 +30,7 @@ public class Expression {
private static int highestPrecedence = 1;
private static final Map<String, Operator> OPERATORS = new HashMap<>();
public static final Map<String, Operator> OPERATORS = new HashMap<>();
public static void registerOperator(Operator operator) {
highestPrecedence = Math.max(highestPrecedence, operator.getPriority()) + 1;