/* * Decompiled with CFR 0.152. * * Could not load the following classes: * com.mojang.brigadier.CommandDispatcher * com.mojang.brigadier.StringReader * com.mojang.brigadier.exceptions.CommandSyntaxException * it.unimi.dsi.fastutil.ints.IntList * it.unimi.dsi.fastutil.ints.IntLists * it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap * org.jspecify.annotations.Nullable */ package net.minecraft.commands.functions; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntLists; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import java.lang.runtime.SwitchBootstraps; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; import net.minecraft.commands.ExecutionCommandSource; import net.minecraft.commands.FunctionInstantiationException; import net.minecraft.commands.execution.UnboundEntryAction; import net.minecraft.commands.functions.CommandFunction; import net.minecraft.commands.functions.InstantiatedFunction; import net.minecraft.commands.functions.PlainTextFunction; import net.minecraft.commands.functions.StringTemplate; import net.minecraft.nbt.ByteTag; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.DoubleTag; import net.minecraft.nbt.FloatTag; import net.minecraft.nbt.LongTag; import net.minecraft.nbt.ShortTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; import net.minecraft.util.Util; import org.jspecify.annotations.Nullable; public class MacroFunction> implements CommandFunction { private static final DecimalFormat DECIMAL_FORMAT = Util.make(new DecimalFormat("#", DecimalFormatSymbols.getInstance(Locale.ROOT)), format -> format.setMaximumFractionDigits(15)); private static final int MAX_CACHE_ENTRIES = 8; private final List parameters; private final Object2ObjectLinkedOpenHashMap, InstantiatedFunction> cache = new Object2ObjectLinkedOpenHashMap(8, 0.25f); private final Identifier id; private final List> entries; public MacroFunction(Identifier id, List> entries, List parameters) { this.id = id; this.entries = entries; this.parameters = parameters; } @Override public Identifier id() { return this.id; } @Override public InstantiatedFunction instantiate(@Nullable CompoundTag arguments, CommandDispatcher dispatcher) throws FunctionInstantiationException { if (arguments == null) { throw new FunctionInstantiationException(Component.translatable("commands.function.error.missing_arguments", Component.translationArg(this.id()))); } ArrayList parameterValues = new ArrayList(this.parameters.size()); for (String argument : this.parameters) { Tag argumentValue = arguments.get(argument); if (argumentValue == null) { throw new FunctionInstantiationException(Component.translatable("commands.function.error.missing_argument", Component.translationArg(this.id()), argument)); } parameterValues.add(MacroFunction.stringify(argumentValue)); } InstantiatedFunction cachedFunction = (InstantiatedFunction)this.cache.getAndMoveToLast(parameterValues); if (cachedFunction != null) { return cachedFunction; } if (this.cache.size() >= 8) { this.cache.removeFirst(); } InstantiatedFunction function = this.substituteAndParse(this.parameters, parameterValues, dispatcher); this.cache.put(parameterValues, function); return function; } /* * WARNING - Removed back jump from a try to a catch block - possible behaviour change. * Enabled aggressive block sorting * Enabled unnecessary exception pruning * Enabled aggressive exception aggregation */ private static String stringify(Tag tag) { String string; Tag tag2 = tag; Objects.requireNonNull(tag2); Tag tag3 = tag2; int n = 0; switch (SwitchBootstraps.typeSwitch("typeSwitch", new Object[]{FloatTag.class, DoubleTag.class, ByteTag.class, ShortTag.class, LongTag.class, StringTag.class}, (Object)tag3, n)) { case 0: { float value; FloatTag floatTag = (FloatTag)tag3; try { float f; value = f = floatTag.value(); } catch (Throwable throwable) { throw new MatchException(throwable.toString(), throwable); } string = DECIMAL_FORMAT.format(value); return string; } case 1: { double value; DoubleTag doubleTag = (DoubleTag)tag3; { double d; value = d = doubleTag.value(); } string = DECIMAL_FORMAT.format(value); return string; } case 2: { byte value; ByteTag byteTag = (ByteTag)tag3; { byte by; value = by = byteTag.value(); } string = String.valueOf(value); return string; } case 3: { short value; ShortTag shortTag = (ShortTag)tag3; { short s; value = s = shortTag.value(); } string = String.valueOf(value); return string; } case 4: { long value; LongTag longTag = (LongTag)tag3; { long l; value = l = longTag.value(); } string = String.valueOf(value); return string; } case 5: { StringTag stringTag = (StringTag)tag3; { String string2; String value; string = value = (string2 = stringTag.value()); return string; } } } string = tag.toString(); return string; } private static void lookupValues(List values, IntList indicesToSelect, List selectedValuesOutput) { selectedValuesOutput.clear(); indicesToSelect.forEach(index -> selectedValuesOutput.add((String)values.get(index))); } private InstantiatedFunction substituteAndParse(List keys, List values, CommandDispatcher dispatcher) throws FunctionInstantiationException { ArrayList newEntries = new ArrayList(this.entries.size()); ArrayList entryArguments = new ArrayList(values.size()); for (Entry entry : this.entries) { MacroFunction.lookupValues(values, entry.parameters(), entryArguments); newEntries.add(entry.instantiate(entryArguments, dispatcher, this.id)); } return new PlainTextFunction(this.id().withPath(id -> id + "/" + keys.hashCode()), newEntries); } static interface Entry { public IntList parameters(); public UnboundEntryAction instantiate(List var1, CommandDispatcher var2, Identifier var3) throws FunctionInstantiationException; } static class MacroEntry> implements Entry { private final StringTemplate template; private final IntList parameters; private final T compilationContext; public MacroEntry(StringTemplate template, IntList parameters, T compilationContext) { this.template = template; this.parameters = parameters; this.compilationContext = compilationContext; } @Override public IntList parameters() { return this.parameters; } @Override public UnboundEntryAction instantiate(List substitutions, CommandDispatcher dispatcher, Identifier functionId) throws FunctionInstantiationException { String command = this.template.substitute(substitutions); try { return CommandFunction.parseCommand(dispatcher, this.compilationContext, new StringReader(command)); } catch (CommandSyntaxException e) { throw new FunctionInstantiationException(Component.translatable("commands.function.error.parse", Component.translationArg(functionId), command, e.getMessage())); } } } static class PlainTextEntry implements Entry { private final UnboundEntryAction compiledAction; public PlainTextEntry(UnboundEntryAction compiledAction) { this.compiledAction = compiledAction; } @Override public IntList parameters() { return IntLists.emptyList(); } @Override public UnboundEntryAction instantiate(List substitutions, CommandDispatcher dispatcher, Identifier functionId) { return this.compiledAction; } } }