Spaces:
Build error
Build error
package net.minecraft.server.commands; | |
import com.google.common.collect.Lists; | |
import com.mojang.brigadier.CommandDispatcher; | |
import com.mojang.brigadier.arguments.IntegerArgumentType; | |
import com.mojang.brigadier.builder.ArgumentBuilder; | |
import com.mojang.brigadier.context.CommandContext; | |
import com.mojang.brigadier.exceptions.CommandSyntaxException; | |
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; | |
import com.mojang.brigadier.suggestion.SuggestionProvider; | |
import com.mojang.brigadier.suggestion.SuggestionsBuilder; | |
import java.util.Collection; | |
import java.util.List; | |
import java.util.Optional; | |
import net.minecraft.commands.CommandBuildContext; | |
import net.minecraft.commands.CommandSourceStack; | |
import net.minecraft.commands.Commands; | |
import net.minecraft.commands.SharedSuggestionProvider; | |
import net.minecraft.commands.arguments.EntityArgument; | |
import net.minecraft.commands.arguments.ResourceOrIdArgument; | |
import net.minecraft.commands.arguments.SlotArgument; | |
import net.minecraft.commands.arguments.coordinates.BlockPosArgument; | |
import net.minecraft.commands.arguments.coordinates.Vec3Argument; | |
import net.minecraft.commands.arguments.item.ItemArgument; | |
import net.minecraft.core.BlockPos; | |
import net.minecraft.core.Holder; | |
import net.minecraft.core.registries.Registries; | |
import net.minecraft.network.chat.Component; | |
import net.minecraft.resources.ResourceKey; | |
import net.minecraft.server.ReloadableServerRegistries; | |
import net.minecraft.server.level.ServerLevel; | |
import net.minecraft.server.level.ServerPlayer; | |
import net.minecraft.world.Container; | |
import net.minecraft.world.entity.Entity; | |
import net.minecraft.world.entity.EquipmentSlot; | |
import net.minecraft.world.entity.LivingEntity; | |
import net.minecraft.world.entity.SlotAccess; | |
import net.minecraft.world.entity.item.ItemEntity; | |
import net.minecraft.world.entity.player.Player; | |
import net.minecraft.world.item.ItemStack; | |
import net.minecraft.world.level.block.entity.BlockEntity; | |
import net.minecraft.world.level.block.state.BlockState; | |
import net.minecraft.world.level.storage.loot.LootParams; | |
import net.minecraft.world.level.storage.loot.LootTable; | |
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; | |
import net.minecraft.world.level.storage.loot.parameters.LootContextParams; | |
import net.minecraft.world.phys.Vec3; | |
public class LootCommand { | |
public static final SuggestionProvider<CommandSourceStack> SUGGEST_LOOT_TABLE = (p_326304_, p_326305_) -> { | |
ReloadableServerRegistries.Holder reloadableserverregistries$holder = p_326304_.getSource().getServer().reloadableRegistries(); | |
return SharedSuggestionProvider.suggestResource(reloadableserverregistries$holder.getKeys(Registries.LOOT_TABLE), p_326305_); | |
}; | |
private static final DynamicCommandExceptionType ERROR_NO_HELD_ITEMS = new DynamicCommandExceptionType( | |
p_308774_ -> Component.translatableEscape("commands.drop.no_held_items", p_308774_) | |
); | |
private static final DynamicCommandExceptionType ERROR_NO_ENTITY_LOOT_TABLE = new DynamicCommandExceptionType( | |
p_308775_ -> Component.translatableEscape("commands.drop.no_loot_table.entity", p_308775_) | |
); | |
private static final DynamicCommandExceptionType ERROR_NO_BLOCK_LOOT_TABLE = new DynamicCommandExceptionType( | |
p_358608_ -> Component.translatableEscape("commands.drop.no_loot_table.block", p_358608_) | |
); | |
public static void register(CommandDispatcher<CommandSourceStack> p_214516_, CommandBuildContext p_214517_) { | |
p_214516_.register( | |
addTargets( | |
Commands.literal("loot").requires(p_137937_ -> p_137937_.hasPermission(2)), | |
(p_214520_, p_214521_) -> p_214520_.then( | |
Commands.literal("fish") | |
.then( | |
Commands.argument("loot_table", ResourceOrIdArgument.lootTable(p_214517_)) | |
.suggests(SUGGEST_LOOT_TABLE) | |
.then( | |
Commands.argument("pos", BlockPosArgument.blockPos()) | |
.executes( | |
p_326309_ -> dropFishingLoot( | |
p_326309_, | |
ResourceOrIdArgument.getLootTable(p_326309_, "loot_table"), | |
BlockPosArgument.getLoadedBlockPos(p_326309_, "pos"), | |
ItemStack.EMPTY, | |
p_214521_ | |
) | |
) | |
.then( | |
Commands.argument("tool", ItemArgument.item(p_214517_)) | |
.executes( | |
p_326303_ -> dropFishingLoot( | |
p_326303_, | |
ResourceOrIdArgument.getLootTable(p_326303_, "loot_table"), | |
BlockPosArgument.getLoadedBlockPos(p_326303_, "pos"), | |
ItemArgument.getItem(p_326303_, "tool").createItemStack(1, false), | |
p_214521_ | |
) | |
) | |
) | |
.then( | |
Commands.literal("mainhand") | |
.executes( | |
p_326295_ -> dropFishingLoot( | |
p_326295_, | |
ResourceOrIdArgument.getLootTable(p_326295_, "loot_table"), | |
BlockPosArgument.getLoadedBlockPos(p_326295_, "pos"), | |
getSourceHandItem(p_326295_.getSource(), EquipmentSlot.MAINHAND), | |
p_214521_ | |
) | |
) | |
) | |
.then( | |
Commands.literal("offhand") | |
.executes( | |
p_326299_ -> dropFishingLoot( | |
p_326299_, | |
ResourceOrIdArgument.getLootTable(p_326299_, "loot_table"), | |
BlockPosArgument.getLoadedBlockPos(p_326299_, "pos"), | |
getSourceHandItem(p_326299_.getSource(), EquipmentSlot.OFFHAND), | |
p_214521_ | |
) | |
) | |
) | |
) | |
) | |
) | |
.then( | |
Commands.literal("loot") | |
.then( | |
Commands.argument("loot_table", ResourceOrIdArgument.lootTable(p_214517_)) | |
.suggests(SUGGEST_LOOT_TABLE) | |
.executes(p_326301_ -> dropChestLoot(p_326301_, ResourceOrIdArgument.getLootTable(p_326301_, "loot_table"), p_214521_)) | |
) | |
) | |
.then( | |
Commands.literal("kill") | |
.then( | |
Commands.argument("target", EntityArgument.entity()) | |
.executes(p_180406_ -> dropKillLoot(p_180406_, EntityArgument.getEntity(p_180406_, "target"), p_214521_)) | |
) | |
) | |
.then( | |
Commands.literal("mine") | |
.then( | |
Commands.argument("pos", BlockPosArgument.blockPos()) | |
.executes( | |
p_180403_ -> dropBlockLoot(p_180403_, BlockPosArgument.getLoadedBlockPos(p_180403_, "pos"), ItemStack.EMPTY, p_214521_) | |
) | |
.then( | |
Commands.argument("tool", ItemArgument.item(p_214517_)) | |
.executes( | |
p_180400_ -> dropBlockLoot( | |
p_180400_, | |
BlockPosArgument.getLoadedBlockPos(p_180400_, "pos"), | |
ItemArgument.getItem(p_180400_, "tool").createItemStack(1, false), | |
p_214521_ | |
) | |
) | |
) | |
.then( | |
Commands.literal("mainhand") | |
.executes( | |
p_180397_ -> dropBlockLoot( | |
p_180397_, | |
BlockPosArgument.getLoadedBlockPos(p_180397_, "pos"), | |
getSourceHandItem(p_180397_.getSource(), EquipmentSlot.MAINHAND), | |
p_214521_ | |
) | |
) | |
) | |
.then( | |
Commands.literal("offhand") | |
.executes( | |
p_180394_ -> dropBlockLoot( | |
p_180394_, | |
BlockPosArgument.getLoadedBlockPos(p_180394_, "pos"), | |
getSourceHandItem(p_180394_.getSource(), EquipmentSlot.OFFHAND), | |
p_214521_ | |
) | |
) | |
) | |
) | |
) | |
) | |
); | |
} | |
private static <T extends ArgumentBuilder<CommandSourceStack, T>> T addTargets(T p_137903_, LootCommand.TailProvider p_137904_) { | |
return p_137903_.then( | |
Commands.literal("replace") | |
.then( | |
Commands.literal("entity") | |
.then( | |
Commands.argument("entities", EntityArgument.entities()) | |
.then( | |
p_137904_.construct( | |
Commands.argument("slot", SlotArgument.slot()), | |
(p_138032_, p_138033_, p_138034_) -> entityReplace( | |
EntityArgument.getEntities(p_138032_, "entities"), | |
SlotArgument.getSlot(p_138032_, "slot"), | |
p_138033_.size(), | |
p_138033_, | |
p_138034_ | |
) | |
) | |
.then( | |
p_137904_.construct( | |
Commands.argument("count", IntegerArgumentType.integer(0)), | |
(p_138025_, p_138026_, p_138027_) -> entityReplace( | |
EntityArgument.getEntities(p_138025_, "entities"), | |
SlotArgument.getSlot(p_138025_, "slot"), | |
IntegerArgumentType.getInteger(p_138025_, "count"), | |
p_138026_, | |
p_138027_ | |
) | |
) | |
) | |
) | |
) | |
) | |
.then( | |
Commands.literal("block") | |
.then( | |
Commands.argument("targetPos", BlockPosArgument.blockPos()) | |
.then( | |
p_137904_.construct( | |
Commands.argument("slot", SlotArgument.slot()), | |
(p_138018_, p_138019_, p_138020_) -> blockReplace( | |
p_138018_.getSource(), | |
BlockPosArgument.getLoadedBlockPos(p_138018_, "targetPos"), | |
SlotArgument.getSlot(p_138018_, "slot"), | |
p_138019_.size(), | |
p_138019_, | |
p_138020_ | |
) | |
) | |
.then( | |
p_137904_.construct( | |
Commands.argument("count", IntegerArgumentType.integer(0)), | |
(p_138011_, p_138012_, p_138013_) -> blockReplace( | |
p_138011_.getSource(), | |
BlockPosArgument.getLoadedBlockPos(p_138011_, "targetPos"), | |
IntegerArgumentType.getInteger(p_138011_, "slot"), | |
IntegerArgumentType.getInteger(p_138011_, "count"), | |
p_138012_, | |
p_138013_ | |
) | |
) | |
) | |
) | |
) | |
) | |
) | |
.then( | |
Commands.literal("insert") | |
.then( | |
p_137904_.construct( | |
Commands.argument("targetPos", BlockPosArgument.blockPos()), | |
(p_138004_, p_138005_, p_138006_) -> blockDistribute( | |
p_138004_.getSource(), BlockPosArgument.getLoadedBlockPos(p_138004_, "targetPos"), p_138005_, p_138006_ | |
) | |
) | |
) | |
) | |
.then( | |
Commands.literal("give") | |
.then( | |
p_137904_.construct( | |
Commands.argument("players", EntityArgument.players()), | |
(p_137992_, p_137993_, p_137994_) -> playerGive(EntityArgument.getPlayers(p_137992_, "players"), p_137993_, p_137994_) | |
) | |
) | |
) | |
.then( | |
Commands.literal("spawn") | |
.then( | |
p_137904_.construct( | |
Commands.argument("targetPos", Vec3Argument.vec3()), | |
(p_137918_, p_137919_, p_137920_) -> dropInWorld( | |
p_137918_.getSource(), Vec3Argument.getVec3(p_137918_, "targetPos"), p_137919_, p_137920_ | |
) | |
) | |
) | |
); | |
} | |
private static Container getContainer(CommandSourceStack p_137951_, BlockPos p_137952_) throws CommandSyntaxException { | |
BlockEntity blockentity = p_137951_.getLevel().getBlockEntity(p_137952_); | |
if (!(blockentity instanceof Container)) { | |
throw ItemCommands.ERROR_TARGET_NOT_A_CONTAINER.create(p_137952_.getX(), p_137952_.getY(), p_137952_.getZ()); | |
} else { | |
return (Container)blockentity; | |
} | |
} | |
private static int blockDistribute(CommandSourceStack p_137961_, BlockPos p_137962_, List<ItemStack> p_137963_, LootCommand.Callback p_137964_) throws CommandSyntaxException { | |
Container container = getContainer(p_137961_, p_137962_); | |
List<ItemStack> list = Lists.newArrayListWithCapacity(p_137963_.size()); | |
for (ItemStack itemstack : p_137963_) { | |
if (distributeToContainer(container, itemstack.copy())) { | |
container.setChanged(); | |
list.add(itemstack); | |
} | |
} | |
p_137964_.accept(list); | |
return list.size(); | |
} | |
private static boolean distributeToContainer(Container p_137886_, ItemStack p_137887_) { | |
boolean flag = false; | |
for (int i = 0; i < p_137886_.getContainerSize() && !p_137887_.isEmpty(); i++) { | |
ItemStack itemstack = p_137886_.getItem(i); | |
if (p_137886_.canPlaceItem(i, p_137887_)) { | |
if (itemstack.isEmpty()) { | |
p_137886_.setItem(i, p_137887_); | |
flag = true; | |
break; | |
} | |
if (canMergeItems(itemstack, p_137887_)) { | |
int j = p_137887_.getMaxStackSize() - itemstack.getCount(); | |
int k = Math.min(p_137887_.getCount(), j); | |
p_137887_.shrink(k); | |
itemstack.grow(k); | |
flag = true; | |
} | |
} | |
} | |
return flag; | |
} | |
private static int blockReplace( | |
CommandSourceStack p_137954_, BlockPos p_137955_, int p_137956_, int p_137957_, List<ItemStack> p_137958_, LootCommand.Callback p_137959_ | |
) throws CommandSyntaxException { | |
Container container = getContainer(p_137954_, p_137955_); | |
int i = container.getContainerSize(); | |
if (p_137956_ >= 0 && p_137956_ < i) { | |
List<ItemStack> list = Lists.newArrayListWithCapacity(p_137958_.size()); | |
for (int j = 0; j < p_137957_; j++) { | |
int k = p_137956_ + j; | |
ItemStack itemstack = j < p_137958_.size() ? p_137958_.get(j) : ItemStack.EMPTY; | |
if (container.canPlaceItem(k, itemstack)) { | |
container.setItem(k, itemstack); | |
list.add(itemstack); | |
} | |
} | |
p_137959_.accept(list); | |
return list.size(); | |
} else { | |
throw ItemCommands.ERROR_TARGET_INAPPLICABLE_SLOT.create(p_137956_); | |
} | |
} | |
private static boolean canMergeItems(ItemStack p_137895_, ItemStack p_137896_) { | |
return p_137895_.getCount() <= p_137895_.getMaxStackSize() && ItemStack.isSameItemSameComponents(p_137895_, p_137896_); | |
} | |
private static int playerGive(Collection<ServerPlayer> p_137985_, List<ItemStack> p_137986_, LootCommand.Callback p_137987_) throws CommandSyntaxException { | |
List<ItemStack> list = Lists.newArrayListWithCapacity(p_137986_.size()); | |
for (ItemStack itemstack : p_137986_) { | |
for (ServerPlayer serverplayer : p_137985_) { | |
if (serverplayer.getInventory().add(itemstack.copy())) { | |
list.add(itemstack); | |
} | |
} | |
} | |
p_137987_.accept(list); | |
return list.size(); | |
} | |
private static void setSlots(Entity p_137889_, List<ItemStack> p_137890_, int p_137891_, int p_137892_, List<ItemStack> p_137893_) { | |
for (int i = 0; i < p_137892_; i++) { | |
ItemStack itemstack = i < p_137890_.size() ? p_137890_.get(i) : ItemStack.EMPTY; | |
SlotAccess slotaccess = p_137889_.getSlot(p_137891_ + i); | |
if (slotaccess != SlotAccess.NULL && slotaccess.set(itemstack.copy())) { | |
p_137893_.add(itemstack); | |
} | |
} | |
} | |
private static int entityReplace( | |
Collection<? extends Entity> p_137979_, int p_137980_, int p_137981_, List<ItemStack> p_137982_, LootCommand.Callback p_137983_ | |
) throws CommandSyntaxException { | |
List<ItemStack> list = Lists.newArrayListWithCapacity(p_137982_.size()); | |
for (Entity entity : p_137979_) { | |
if (entity instanceof ServerPlayer serverplayer) { | |
setSlots(entity, p_137982_, p_137980_, p_137981_, list); | |
serverplayer.containerMenu.broadcastChanges(); | |
} else { | |
setSlots(entity, p_137982_, p_137980_, p_137981_, list); | |
} | |
} | |
p_137983_.accept(list); | |
return list.size(); | |
} | |
private static int dropInWorld(CommandSourceStack p_137946_, Vec3 p_137947_, List<ItemStack> p_137948_, LootCommand.Callback p_137949_) throws CommandSyntaxException { | |
ServerLevel serverlevel = p_137946_.getLevel(); | |
p_137948_.forEach(p_137884_ -> { | |
ItemEntity itementity = new ItemEntity(serverlevel, p_137947_.x, p_137947_.y, p_137947_.z, p_137884_.copy()); | |
itementity.setDefaultPickUpDelay(); | |
serverlevel.addFreshEntity(itementity); | |
}); | |
p_137949_.accept(p_137948_); | |
return p_137948_.size(); | |
} | |
private static void callback(CommandSourceStack p_137966_, List<ItemStack> p_137967_) { | |
if (p_137967_.size() == 1) { | |
ItemStack itemstack = p_137967_.get(0); | |
p_137966_.sendSuccess(() -> Component.translatable("commands.drop.success.single", itemstack.getCount(), itemstack.getDisplayName()), false); | |
} else { | |
p_137966_.sendSuccess(() -> Component.translatable("commands.drop.success.multiple", p_137967_.size()), false); | |
} | |
} | |
private static void callback(CommandSourceStack p_137969_, List<ItemStack> p_137970_, ResourceKey<LootTable> p_327853_) { | |
if (p_137970_.size() == 1) { | |
ItemStack itemstack = p_137970_.get(0); | |
p_137969_.sendSuccess( | |
() -> Component.translatable( | |
"commands.drop.success.single_with_table", itemstack.getCount(), itemstack.getDisplayName(), Component.translationArg(p_327853_.location()) | |
), | |
false | |
); | |
} else { | |
p_137969_.sendSuccess( | |
() -> Component.translatable("commands.drop.success.multiple_with_table", p_137970_.size(), Component.translationArg(p_327853_.location())), false | |
); | |
} | |
} | |
private static ItemStack getSourceHandItem(CommandSourceStack p_137939_, EquipmentSlot p_137940_) throws CommandSyntaxException { | |
Entity entity = p_137939_.getEntityOrException(); | |
if (entity instanceof LivingEntity) { | |
return ((LivingEntity)entity).getItemBySlot(p_137940_); | |
} else { | |
throw ERROR_NO_HELD_ITEMS.create(entity.getDisplayName()); | |
} | |
} | |
private static int dropBlockLoot(CommandContext<CommandSourceStack> p_137913_, BlockPos p_137914_, ItemStack p_137915_, LootCommand.DropConsumer p_137916_) throws CommandSyntaxException { | |
CommandSourceStack commandsourcestack = p_137913_.getSource(); | |
ServerLevel serverlevel = commandsourcestack.getLevel(); | |
BlockState blockstate = serverlevel.getBlockState(p_137914_); | |
BlockEntity blockentity = serverlevel.getBlockEntity(p_137914_); | |
Optional<ResourceKey<LootTable>> optional = blockstate.getBlock().getLootTable(); | |
if (optional.isEmpty()) { | |
throw ERROR_NO_BLOCK_LOOT_TABLE.create(blockstate.getBlock().getName()); | |
} else { | |
LootParams.Builder lootparams$builder = new LootParams.Builder(serverlevel) | |
.withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(p_137914_)) | |
.withParameter(LootContextParams.BLOCK_STATE, blockstate) | |
.withOptionalParameter(LootContextParams.BLOCK_ENTITY, blockentity) | |
.withOptionalParameter(LootContextParams.THIS_ENTITY, commandsourcestack.getEntity()) | |
.withParameter(LootContextParams.TOOL, p_137915_); | |
List<ItemStack> list = blockstate.getDrops(lootparams$builder); | |
return p_137916_.accept(p_137913_, list, p_358604_ -> callback(commandsourcestack, p_358604_, optional.get())); | |
} | |
} | |
private static int dropKillLoot(CommandContext<CommandSourceStack> p_137906_, Entity p_137907_, LootCommand.DropConsumer p_137908_) throws CommandSyntaxException { | |
Optional<ResourceKey<LootTable>> optional = p_137907_.getLootTable(); | |
if (optional.isEmpty()) { | |
throw ERROR_NO_ENTITY_LOOT_TABLE.create(p_137907_.getDisplayName()); | |
} else { | |
CommandSourceStack commandsourcestack = p_137906_.getSource(); | |
LootParams.Builder lootparams$builder = new LootParams.Builder(commandsourcestack.getLevel()); | |
Entity entity = commandsourcestack.getEntity(); | |
if (entity instanceof Player player) { | |
lootparams$builder.withParameter(LootContextParams.LAST_DAMAGE_PLAYER, player); | |
} | |
lootparams$builder.withParameter(LootContextParams.DAMAGE_SOURCE, p_137907_.damageSources().magic()); | |
lootparams$builder.withOptionalParameter(LootContextParams.DIRECT_ATTACKING_ENTITY, entity); | |
lootparams$builder.withOptionalParameter(LootContextParams.ATTACKING_ENTITY, entity); | |
lootparams$builder.withParameter(LootContextParams.THIS_ENTITY, p_137907_); | |
lootparams$builder.withParameter(LootContextParams.ORIGIN, commandsourcestack.getPosition()); | |
LootParams lootparams = lootparams$builder.create(LootContextParamSets.ENTITY); | |
LootTable loottable = commandsourcestack.getServer().reloadableRegistries().getLootTable(optional.get()); | |
List<ItemStack> list = loottable.getRandomItems(lootparams); | |
return p_137908_.accept(p_137906_, list, p_358607_ -> callback(commandsourcestack, p_358607_, optional.get())); | |
} | |
} | |
private static int dropChestLoot(CommandContext<CommandSourceStack> p_137933_, Holder<LootTable> p_333711_, LootCommand.DropConsumer p_137935_) throws CommandSyntaxException { | |
CommandSourceStack commandsourcestack = p_137933_.getSource(); | |
LootParams lootparams = new LootParams.Builder(commandsourcestack.getLevel()) | |
.withOptionalParameter(LootContextParams.THIS_ENTITY, commandsourcestack.getEntity()) | |
.withParameter(LootContextParams.ORIGIN, commandsourcestack.getPosition()) | |
.create(LootContextParamSets.CHEST); | |
return drop(p_137933_, p_333711_, lootparams, p_137935_); | |
} | |
private static int dropFishingLoot( | |
CommandContext<CommandSourceStack> p_137927_, Holder<LootTable> p_334748_, BlockPos p_137929_, ItemStack p_137930_, LootCommand.DropConsumer p_137931_ | |
) throws CommandSyntaxException { | |
CommandSourceStack commandsourcestack = p_137927_.getSource(); | |
LootParams lootparams = new LootParams.Builder(commandsourcestack.getLevel()) | |
.withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(p_137929_)) | |
.withParameter(LootContextParams.TOOL, p_137930_) | |
.withOptionalParameter(LootContextParams.THIS_ENTITY, commandsourcestack.getEntity()) | |
.create(LootContextParamSets.FISHING); | |
return drop(p_137927_, p_334748_, lootparams, p_137931_); | |
} | |
private static int drop( | |
CommandContext<CommandSourceStack> p_287721_, Holder<LootTable> p_330660_, LootParams p_287728_, LootCommand.DropConsumer p_287770_ | |
) throws CommandSyntaxException { | |
CommandSourceStack commandsourcestack = p_287721_.getSource(); | |
List<ItemStack> list = p_330660_.value().getRandomItems(p_287728_); | |
return p_287770_.accept(p_287721_, list, p_137997_ -> callback(commandsourcestack, p_137997_)); | |
} | |
interface Callback { | |
void accept(List<ItemStack> p_138048_) throws CommandSyntaxException; | |
} | |
interface DropConsumer { | |
int accept(CommandContext<CommandSourceStack> p_138050_, List<ItemStack> p_138051_, LootCommand.Callback p_138052_) throws CommandSyntaxException; | |
} | |
interface TailProvider { | |
ArgumentBuilder<CommandSourceStack, ?> construct(ArgumentBuilder<CommandSourceStack, ?> p_138054_, LootCommand.DropConsumer p_138055_); | |
} | |
} |