Spaces:
Build error
Build error
File size: 7,849 Bytes
d46f4a3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
package net.minecraft.commands.arguments;
import com.google.gson.JsonObject;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.Dynamic2CommandExceptionType;
import com.mojang.brigadier.exceptions.Dynamic3CommandExceptionType;
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import java.util.Arrays;
import java.util.Collection;
import java.util.concurrent.CompletableFuture;
import net.minecraft.commands.CommandBuildContext;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.commands.synchronization.ArgumentTypeInfo;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.structure.Structure;
public class ResourceArgument<T> implements ArgumentType<Holder.Reference<T>> {
private static final Collection<String> EXAMPLES = Arrays.asList("foo", "foo:bar", "012");
private static final DynamicCommandExceptionType ERROR_NOT_SUMMONABLE_ENTITY = new DynamicCommandExceptionType(
p_308361_ -> Component.translatableEscape("entity.not_summonable", p_308361_)
);
public static final Dynamic2CommandExceptionType ERROR_UNKNOWN_RESOURCE = new Dynamic2CommandExceptionType(
(p_308359_, p_308360_) -> Component.translatableEscape("argument.resource.not_found", p_308359_, p_308360_)
);
public static final Dynamic3CommandExceptionType ERROR_INVALID_RESOURCE_TYPE = new Dynamic3CommandExceptionType(
(p_308362_, p_308363_, p_308364_) -> Component.translatableEscape("argument.resource.invalid_type", p_308362_, p_308363_, p_308364_)
);
final ResourceKey<? extends Registry<T>> registryKey;
private final HolderLookup<T> registryLookup;
public ResourceArgument(CommandBuildContext p_248597_, ResourceKey<? extends Registry<T>> p_251778_) {
this.registryKey = p_251778_;
this.registryLookup = p_248597_.lookupOrThrow(p_251778_);
}
public static <T> ResourceArgument<T> resource(CommandBuildContext p_249973_, ResourceKey<? extends Registry<T>> p_251405_) {
return new ResourceArgument<>(p_249973_, p_251405_);
}
public static <T> Holder.Reference<T> getResource(CommandContext<CommandSourceStack> p_251788_, String p_251996_, ResourceKey<Registry<T>> p_250077_) throws CommandSyntaxException {
Holder.Reference<T> reference = p_251788_.getArgument(p_251996_, Holder.Reference.class);
ResourceKey<?> resourcekey = reference.key();
if (resourcekey.isFor(p_250077_)) {
return reference;
} else {
throw ERROR_INVALID_RESOURCE_TYPE.create(resourcekey.location(), resourcekey.registry(), p_250077_.location());
}
}
public static Holder.Reference<Attribute> getAttribute(CommandContext<CommandSourceStack> p_248753_, String p_251157_) throws CommandSyntaxException {
return getResource(p_248753_, p_251157_, Registries.ATTRIBUTE);
}
public static Holder.Reference<ConfiguredFeature<?, ?>> getConfiguredFeature(CommandContext<CommandSourceStack> p_250819_, String p_252256_) throws CommandSyntaxException {
return getResource(p_250819_, p_252256_, Registries.CONFIGURED_FEATURE);
}
public static Holder.Reference<Structure> getStructure(CommandContext<CommandSourceStack> p_250288_, String p_250856_) throws CommandSyntaxException {
return getResource(p_250288_, p_250856_, Registries.STRUCTURE);
}
public static Holder.Reference<EntityType<?>> getEntityType(CommandContext<CommandSourceStack> p_251258_, String p_252322_) throws CommandSyntaxException {
return getResource(p_251258_, p_252322_, Registries.ENTITY_TYPE);
}
public static Holder.Reference<EntityType<?>> getSummonableEntityType(CommandContext<CommandSourceStack> p_251880_, String p_250243_) throws CommandSyntaxException {
Holder.Reference<EntityType<?>> reference = getResource(p_251880_, p_250243_, Registries.ENTITY_TYPE);
if (!reference.value().canSummon()) {
throw ERROR_NOT_SUMMONABLE_ENTITY.create(reference.key().location().toString());
} else {
return reference;
}
}
public static Holder.Reference<MobEffect> getMobEffect(CommandContext<CommandSourceStack> p_250521_, String p_249927_) throws CommandSyntaxException {
return getResource(p_250521_, p_249927_, Registries.MOB_EFFECT);
}
public static Holder.Reference<Enchantment> getEnchantment(CommandContext<CommandSourceStack> p_248656_, String p_248713_) throws CommandSyntaxException {
return getResource(p_248656_, p_248713_, Registries.ENCHANTMENT);
}
public Holder.Reference<T> parse(StringReader p_250909_) throws CommandSyntaxException {
ResourceLocation resourcelocation = ResourceLocation.read(p_250909_);
ResourceKey<T> resourcekey = ResourceKey.create(this.registryKey, resourcelocation);
return this.registryLookup.get(resourcekey).orElseThrow(() -> ERROR_UNKNOWN_RESOURCE.createWithContext(p_250909_, resourcelocation, this.registryKey.location()));
}
@Override
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> p_249391_, SuggestionsBuilder p_251197_) {
return SharedSuggestionProvider.suggestResource(this.registryLookup.listElementIds().map(ResourceKey::location), p_251197_);
}
@Override
public Collection<String> getExamples() {
return EXAMPLES;
}
public static class Info<T> implements ArgumentTypeInfo<ResourceArgument<T>, ResourceArgument.Info<T>.Template> {
public void serializeToNetwork(ResourceArgument.Info<T>.Template p_250470_, FriendlyByteBuf p_248658_) {
p_248658_.writeResourceKey(p_250470_.registryKey);
}
public ResourceArgument.Info<T>.Template deserializeFromNetwork(FriendlyByteBuf p_248958_) {
return new ResourceArgument.Info.Template(p_248958_.readRegistryKey());
}
public void serializeToJson(ResourceArgument.Info<T>.Template p_251267_, JsonObject p_250142_) {
p_250142_.addProperty("registry", p_251267_.registryKey.location().toString());
}
public ResourceArgument.Info<T>.Template unpack(ResourceArgument<T> p_250667_) {
return new ResourceArgument.Info.Template(p_250667_.registryKey);
}
public final class Template implements ArgumentTypeInfo.Template<ResourceArgument<T>> {
final ResourceKey<? extends Registry<T>> registryKey;
Template(final ResourceKey<? extends Registry<T>> p_250598_) {
this.registryKey = p_250598_;
}
public ResourceArgument<T> instantiate(CommandBuildContext p_251900_) {
return new ResourceArgument<>(p_251900_, this.registryKey);
}
@Override
public ArgumentTypeInfo<ResourceArgument<T>, ?> type() {
return Info.this;
}
}
}
} |