hytale-server/com/hypixel/hytale/builtin/buildertools/scriptedbrushes/operations/sequential/RunCommandOperation.java

69 lines
3.4 KiB
Java

package com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.BrushConfig;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.BrushConfigCommandExecutor;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.system.SequenceBrushOperation;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.math.vector.Vector3i;
import com.hypixel.hytale.server.core.command.system.CommandManager;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;
public class RunCommandOperation extends SequenceBrushOperation {
public static final BuilderCodec<RunCommandOperation> CODEC = BuilderCodec.builder(RunCommandOperation.class, RunCommandOperation::new)
.append(new KeyedCodec<>("CommandToRun", Codec.STRING), (op, val) -> op.commandArg = val, op -> op.commandArg)
.documentation(
"Runs a command, substituting the strings... \n'{x}', '{y}', and '{z}' for the origin coordinates\n'{radius}' with width/2, '{width}' with width, and '{height}' with height\n'{var:<persistent variable name>} with the value of the persistent variable'"
)
.add()
.documentation("Runs a command, see help for argument replacements")
.build();
private String commandArg = "";
private static final Pattern regexBracketPattern = Pattern.compile("\\{var:(\\w*)}");
public RunCommandOperation() {
super("runCommand", "Runs a command, see help for argument replacements", false);
}
@Override
public void modifyBrushConfig(
@Nonnull Ref<EntityStore> ref,
@Nonnull BrushConfig brushConfig,
@Nonnull BrushConfigCommandExecutor brushConfigCommandExecutor,
@Nonnull ComponentAccessor<EntityStore> componentAccessor
) {
String commandString = this.commandArg;
if (commandString.startsWith("/")) {
commandString = commandString.substring(1);
}
Vector3i origin = brushConfig.getOrigin();
commandString = commandString.replace("{x}", String.valueOf(origin.x))
.replace("{y}", String.valueOf(origin.y))
.replace("{z}", String.valueOf(origin.z))
.replace("{width}", String.valueOf(brushConfig.getShapeWidth()))
.replace("{height}", String.valueOf(brushConfig.getShapeHeight()))
.replace("{radius}", String.valueOf(brushConfig.getShapeWidth() / 2.0));
Matcher matcher = regexBracketPattern.matcher(commandString);
while (matcher.find()) {
String variableName = commandString.substring(matcher.start(1), matcher.end(1));
String replacementValue = String.valueOf(brushConfigCommandExecutor.getPersistentVariableOrDefault(variableName, Integer.MIN_VALUE));
commandString = commandString.replaceFirst(regexBracketPattern.pattern(), replacementValue);
}
Player playerComponent = componentAccessor.getComponent(ref, Player.getComponentType());
assert playerComponent != null;
CommandManager.get().handleCommand(playerComponent, commandString);
}
}