package net.minecraft.server;
import com.google.common.collect.Lists;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
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.Iterator;
import java.util.List;
import java.util.Objects;
public class CommandLoot {
public static final SuggestionProvider<CommandListenerWrapper> a = (commandcontext, suggestionsbuilder) -> {
LootTableRegistry loottableregistry = ((CommandListenerWrapper) commandcontext.getSource()).getServer().getLootTableRegistry();
return ICompletionProvider.a((Iterable) loottableregistry.a(), suggestionsbuilder);
};
private static final DynamicCommandExceptionType b = new DynamicCommandExceptionType((object) -> {
return new ChatMessage("commands.drop.no_held_items", new Object[]{object});
});
private static final DynamicCommandExceptionType c = new DynamicCommandExceptionType((object) -> {
return new ChatMessage("commands.drop.no_loot_table", new Object[]{object});
});
public static void a(com.mojang.brigadier.CommandDispatcher<CommandListenerWrapper> com_mojang_brigadier_commanddispatcher) {
com_mojang_brigadier_commanddispatcher.register((LiteralArgumentBuilder) a(CommandDispatcher.a("loot").requires((commandlistenerwrapper) -> {
return commandlistenerwrapper.hasPermission(2);
}), (argumentbuilder, commandloot_b) -> {
return argumentbuilder.then(CommandDispatcher.a("fish").then(CommandDispatcher.a("loot_table", (ArgumentType) ArgumentMinecraftKeyRegistered.a()).suggests(CommandLoot.a).then(((RequiredArgumentBuilder) ((RequiredArgumentBuilder) ((RequiredArgumentBuilder) CommandDispatcher.a("pos", (ArgumentType) ArgumentPosition.a()).executes((commandcontext) -> {
return a(commandcontext, ArgumentMinecraftKeyRegistered.d(commandcontext, "loot_table"), ArgumentPosition.a(commandcontext, "pos"), ItemStack.a, commandloot_b);
})).then(CommandDispatcher.a("tool", (ArgumentType) ArgumentItemStack.a()).executes((commandcontext) -> {
return a(commandcontext, ArgumentMinecraftKeyRegistered.d(commandcontext, "loot_table"), ArgumentPosition.a(commandcontext, "pos"), ArgumentItemStack.a(commandcontext, "tool").a(1, false), commandloot_b);
}))).then(CommandDispatcher.a("mainhand").executes((commandcontext) -> {
return a(commandcontext, ArgumentMinecraftKeyRegistered.d(commandcontext, "loot_table"), ArgumentPosition.a(commandcontext, "pos"), a((CommandListenerWrapper) commandcontext.getSource(), EnumItemSlot.MAINHAND), commandloot_b);
}))).then(CommandDispatcher.a("offhand").executes((commandcontext) -> {
return a(commandcontext, ArgumentMinecraftKeyRegistered.d(commandcontext, "loot_table"), ArgumentPosition.a(commandcontext, "pos"), a((CommandListenerWrapper) commandcontext.getSource(), EnumItemSlot.OFFHAND), commandloot_b);
}))))).then(CommandDispatcher.a("loot").then(CommandDispatcher.a("loot_table", (ArgumentType) ArgumentMinecraftKeyRegistered.a()).suggests(CommandLoot.a).executes((commandcontext) -> {
return a(commandcontext, ArgumentMinecraftKeyRegistered.d(commandcontext, "loot_table"), commandloot_b);
}))).then(CommandDispatcher.a("kill").then(CommandDispatcher.a("target", (ArgumentType) ArgumentEntity.a()).executes((commandcontext) -> {
return a(commandcontext, ArgumentEntity.a(commandcontext, "target"), commandloot_b);
}))).then(CommandDispatcher.a("mine").then(((RequiredArgumentBuilder) ((RequiredArgumentBuilder) ((RequiredArgumentBuilder) CommandDispatcher.a("pos", (ArgumentType) ArgumentPosition.a()).executes((commandcontext) -> {
return a(commandcontext, ArgumentPosition.a(commandcontext, "pos"), ItemStack.a, commandloot_b);
})).then(CommandDispatcher.a("tool", (ArgumentType) ArgumentItemStack.a()).executes((commandcontext) -> {
return a(commandcontext, ArgumentPosition.a(commandcontext, "pos"), ArgumentItemStack.a(commandcontext, "tool").a(1, false), commandloot_b);
}))).then(CommandDispatcher.a("mainhand").executes((commandcontext) -> {
return a(commandcontext, ArgumentPosition.a(commandcontext, "pos"), a((CommandListenerWrapper) commandcontext.getSource(), EnumItemSlot.MAINHAND), commandloot_b);
}))).then(CommandDispatcher.a("offhand").executes((commandcontext) -> {
return a(commandcontext, ArgumentPosition.a(commandcontext, "pos"), a((CommandListenerWrapper) commandcontext.getSource(), EnumItemSlot.OFFHAND), commandloot_b);
}))));
}));
}
private static <T extends ArgumentBuilder<CommandListenerWrapper, T>> T a(T t0, CommandLoot.c commandloot_c) {
return t0.then(((LiteralArgumentBuilder) CommandDispatcher.a("replace").then(CommandDispatcher.a("entity").then(CommandDispatcher.a("entities", (ArgumentType) ArgumentEntity.multipleEntities()).then(commandloot_c.construct(CommandDispatcher.a("slot", (ArgumentType) ArgumentInventorySlot.a()), (commandcontext, list, commandloot_a) -> {
return a(ArgumentEntity.b(commandcontext, "entities"), ArgumentInventorySlot.a(commandcontext, "slot"), list.size(), list, commandloot_a);
}).then(commandloot_c.construct(CommandDispatcher.a("count", (ArgumentType) IntegerArgumentType.integer(0)), (commandcontext, list, commandloot_a) -> {
return a(ArgumentEntity.b(commandcontext, "entities"), ArgumentInventorySlot.a(commandcontext, "slot"), IntegerArgumentType.getInteger(commandcontext, "count"), list, commandloot_a);
})))))).then(CommandDispatcher.a("block").then(CommandDispatcher.a("targetPos", (ArgumentType) ArgumentPosition.a()).then(commandloot_c.construct(CommandDispatcher.a("slot", (ArgumentType) ArgumentInventorySlot.a()), (commandcontext, list, commandloot_a) -> {
return a((CommandListenerWrapper) commandcontext.getSource(), ArgumentPosition.a(commandcontext, "targetPos"), ArgumentInventorySlot.a(commandcontext, "slot"), list.size(), list, commandloot_a);
}).then(commandloot_c.construct(CommandDispatcher.a("count", (ArgumentType) IntegerArgumentType.integer(0)), (commandcontext, list, commandloot_a) -> {
return a((CommandListenerWrapper) commandcontext.getSource(), ArgumentPosition.a(commandcontext, "targetPos"), IntegerArgumentType.getInteger(commandcontext, "slot"), IntegerArgumentType.getInteger(commandcontext, "count"), list, commandloot_a);
})))))).then(CommandDispatcher.a("insert").then(commandloot_c.construct(CommandDispatcher.a("targetPos", (ArgumentType) ArgumentPosition.a()), (commandcontext, list, commandloot_a) -> {
return a((CommandListenerWrapper) commandcontext.getSource(), ArgumentPosition.a(commandcontext, "targetPos"), list, commandloot_a);
}))).then(CommandDispatcher.a("give").then(commandloot_c.construct(CommandDispatcher.a("players", (ArgumentType) ArgumentEntity.d()), (commandcontext, list, commandloot_a) -> {
return a(ArgumentEntity.f(commandcontext, "players"), list, commandloot_a);
}))).then(CommandDispatcher.a("spawn").then(commandloot_c.construct(CommandDispatcher.a("targetPos", (ArgumentType) ArgumentVec3.a()), (commandcontext, list, commandloot_a) -> {
return a((CommandListenerWrapper) commandcontext.getSource(), ArgumentVec3.a(commandcontext, "targetPos"), list, commandloot_a);
})));
}
private static IInventory a(CommandListenerWrapper commandlistenerwrapper, BlockPosition blockposition) throws CommandSyntaxException {
TileEntity tileentity = commandlistenerwrapper.getWorld().getTileEntity(blockposition);
if (!(tileentity instanceof IInventory)) {
throw CommandReplaceItem.a.create();
} else {
return (IInventory) tileentity;
}
}
private static int a(CommandListenerWrapper commandlistenerwrapper, BlockPosition blockposition, List<ItemStack> list, CommandLoot.a commandloot_a) throws CommandSyntaxException {
IInventory iinventory = a(commandlistenerwrapper, blockposition);
List<ItemStack> list1 = Lists.newArrayListWithCapacity(list.size());
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
ItemStack itemstack = (ItemStack) iterator.next();
if (a(iinventory, itemstack.cloneItemStack())) {
iinventory.update();
list1.add(itemstack);
}
}
commandloot_a.accept(list1);
return list1.size();
}
private static boolean a(IInventory iinventory, ItemStack itemstack) {
boolean flag = false;
for (int i = 0; i < iinventory.getSize() && !itemstack.isEmpty(); ++i) {
ItemStack itemstack1 = iinventory.getItem(i);
if (iinventory.b(i, itemstack)) {
if (itemstack1.isEmpty()) {
iinventory.setItem(i, itemstack);
flag = true;
break;
}
if (a(itemstack1, itemstack)) {
int j = itemstack.getMaxStackSize() - itemstack1.getCount();
int k = Math.min(itemstack.getCount(), j);
itemstack.subtract(k);
itemstack1.add(k);
flag = true;
}
}
}
return flag;
}
private static int a(CommandListenerWrapper commandlistenerwrapper, BlockPosition blockposition, int i, int j, List<ItemStack> list, CommandLoot.a commandloot_a) throws CommandSyntaxException {
IInventory iinventory = a(commandlistenerwrapper, blockposition);
int k = iinventory.getSize();
if (i >= 0 && i < k) {
List<ItemStack> list1 = Lists.newArrayListWithCapacity(list.size());
for (int l = 0; l < j; ++l) {
int i1 = i + l;
ItemStack itemstack = l < list.size() ? (ItemStack) list.get(l) : ItemStack.a;
if (iinventory.b(i1, itemstack)) {
iinventory.setItem(i1, itemstack);
list1.add(itemstack);
}
}
commandloot_a.accept(list1);
return list1.size();
} else {
throw CommandReplaceItem.b.create(i);
}
}
private static boolean a(ItemStack itemstack, ItemStack itemstack1) {
return itemstack.getItem() == itemstack1.getItem() && itemstack.getDamage() == itemstack1.getDamage() && itemstack.getCount() <= itemstack.getMaxStackSize() && Objects.equals(itemstack.getTag(), itemstack1.getTag());
}
private static int a(Collection<EntityPlayer> collection, List<ItemStack> list, CommandLoot.a commandloot_a) throws CommandSyntaxException {
List<ItemStack> list1 = Lists.newArrayListWithCapacity(list.size());
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
ItemStack itemstack = (ItemStack) iterator.next();
Iterator iterator1 = collection.iterator();
while (iterator1.hasNext()) {
EntityPlayer entityplayer = (EntityPlayer) iterator1.next();
if (entityplayer.inventory.pickup(itemstack.cloneItemStack())) {
list1.add(itemstack);
}
}
}
commandloot_a.accept(list1);
return list1.size();
}
private static void a(Entity entity, List<ItemStack> list, int i, int j, List<ItemStack> list1) {
for (int k = 0; k < j; ++k) {
ItemStack itemstack = k < list.size() ? (ItemStack) list.get(k) : ItemStack.a;
if (entity.a_(i + k, itemstack.cloneItemStack())) {
list1.add(itemstack);
}
}
}
private static int a(Collection<? extends Entity> collection, int i, int j, List<ItemStack> list, CommandLoot.a commandloot_a) throws CommandSyntaxException {
List<ItemStack> list1 = Lists.newArrayListWithCapacity(list.size());
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
if (entity instanceof EntityPlayer) {
EntityPlayer entityplayer = (EntityPlayer) entity;
entityplayer.defaultContainer.c();
a(entity, list, i, j, list1);
entityplayer.defaultContainer.c();
} else {
a(entity, list, i, j, list1);
}
}
commandloot_a.accept(list1);
return list1.size();
}
private static int a(CommandListenerWrapper commandlistenerwrapper, Vec3D vec3d, List<ItemStack> list, CommandLoot.a commandloot_a) throws CommandSyntaxException {
WorldServer worldserver = commandlistenerwrapper.getWorld();
list.forEach((itemstack) -> {
EntityItem entityitem = new EntityItem(worldserver, vec3d.x, vec3d.y, vec3d.z, itemstack.cloneItemStack());
entityitem.defaultPickupDelay();
worldserver.addEntity(entityitem);
});
commandloot_a.accept(list);
return list.size();
}
private static void a(CommandListenerWrapper commandlistenerwrapper, List<ItemStack> list) {
if (list.size() == 1) {
ItemStack itemstack = (ItemStack) list.get(0);
commandlistenerwrapper.sendMessage(new ChatMessage("commands.drop.success.single", new Object[]{itemstack.getCount(), itemstack.B()}), false);
} else {
commandlistenerwrapper.sendMessage(new ChatMessage("commands.drop.success.multiple", new Object[]{list.size()}), false);
}
}
private static void a(CommandListenerWrapper commandlistenerwrapper, List<ItemStack> list, MinecraftKey minecraftkey) {
if (list.size() == 1) {
ItemStack itemstack = (ItemStack) list.get(0);
commandlistenerwrapper.sendMessage(new ChatMessage("commands.drop.success.single_with_table", new Object[]{itemstack.getCount(), itemstack.B(), minecraftkey}), false);
} else {
commandlistenerwrapper.sendMessage(new ChatMessage("commands.drop.success.multiple_with_table", new Object[]{list.size(), minecraftkey}), false);
}
}
private static ItemStack a(CommandListenerWrapper commandlistenerwrapper, EnumItemSlot enumitemslot) throws CommandSyntaxException {
Entity entity = commandlistenerwrapper.g();
if (entity instanceof EntityLiving) {
return ((EntityLiving) entity).getEquipment(enumitemslot);
} else {
throw CommandLoot.b.create(entity.getScoreboardDisplayName());
}
}
private static int a(CommandContext<CommandListenerWrapper> commandcontext, BlockPosition blockposition, ItemStack itemstack, CommandLoot.b commandloot_b) throws CommandSyntaxException {
CommandListenerWrapper commandlistenerwrapper = (CommandListenerWrapper) commandcontext.getSource();
WorldServer worldserver = commandlistenerwrapper.getWorld();
IBlockData iblockdata = worldserver.getType(blockposition);
TileEntity tileentity = worldserver.getTileEntity(blockposition);
LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder(worldserver)).set(LootContextParameters.POSITION, blockposition).set(LootContextParameters.BLOCK_STATE, iblockdata).setOptional(LootContextParameters.BLOCK_ENTITY, tileentity).setOptional(LootContextParameters.THIS_ENTITY, commandlistenerwrapper.getEntity()).set(LootContextParameters.TOOL, itemstack);
List<ItemStack> list = iblockdata.a(loottableinfo_builder);
return commandloot_b.accept(commandcontext, list, (list1) -> {
a(commandlistenerwrapper, list1, iblockdata.getBlock().g());
});
}
private static int a(CommandContext<CommandListenerWrapper> commandcontext, Entity entity, CommandLoot.b commandloot_b) throws CommandSyntaxException {
if (!(entity instanceof EntityLiving)) {
throw CommandLoot.c.create(entity.getScoreboardDisplayName());
} else {
MinecraftKey minecraftkey = ((EntityLiving) entity).cW();
CommandListenerWrapper commandlistenerwrapper = (CommandListenerWrapper) commandcontext.getSource();
LootTableInfo.Builder loottableinfo_builder = new LootTableInfo.Builder(commandlistenerwrapper.getWorld());
Entity entity1 = commandlistenerwrapper.getEntity();
if (entity1 instanceof EntityHuman) {
loottableinfo_builder.set(LootContextParameters.LAST_DAMAGE_PLAYER, (EntityHuman) entity1);
}
loottableinfo_builder.set(LootContextParameters.DAMAGE_SOURCE, DamageSource.MAGIC);
loottableinfo_builder.setOptional(LootContextParameters.DIRECT_KILLER_ENTITY, entity1);
loottableinfo_builder.setOptional(LootContextParameters.KILLER_ENTITY, entity1);
loottableinfo_builder.set(LootContextParameters.THIS_ENTITY, entity);
loottableinfo_builder.set(LootContextParameters.POSITION, new BlockPosition(commandlistenerwrapper.getPosition()));
LootTable loottable = commandlistenerwrapper.getServer().getLootTableRegistry().getLootTable(minecraftkey);
List<ItemStack> list = loottable.populateLoot(loottableinfo_builder.build(LootContextParameterSets.ENTITY));
return commandloot_b.accept(commandcontext, list, (list1) -> {
a(commandlistenerwrapper, list1, minecraftkey);
});
}
}
private static int a(CommandContext<CommandListenerWrapper> commandcontext, MinecraftKey minecraftkey, CommandLoot.b commandloot_b) throws CommandSyntaxException {
CommandListenerWrapper commandlistenerwrapper = (CommandListenerWrapper) commandcontext.getSource();
LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder(commandlistenerwrapper.getWorld())).setOptional(LootContextParameters.THIS_ENTITY, commandlistenerwrapper.getEntity()).set(LootContextParameters.POSITION, new BlockPosition(commandlistenerwrapper.getPosition()));
return a(commandcontext, minecraftkey, loottableinfo_builder.build(LootContextParameterSets.CHEST), commandloot_b);
}
private static int a(CommandContext<CommandListenerWrapper> commandcontext, MinecraftKey minecraftkey, BlockPosition blockposition, ItemStack itemstack, CommandLoot.b commandloot_b) throws CommandSyntaxException {
CommandListenerWrapper commandlistenerwrapper = (CommandListenerWrapper) commandcontext.getSource();
LootTableInfo loottableinfo = (new LootTableInfo.Builder(commandlistenerwrapper.getWorld())).set(LootContextParameters.POSITION, blockposition).set(LootContextParameters.TOOL, itemstack).build(LootContextParameterSets.FISHING);
return a(commandcontext, minecraftkey, loottableinfo, commandloot_b);
}
private static int a(CommandContext<CommandListenerWrapper> commandcontext, MinecraftKey minecraftkey, LootTableInfo loottableinfo, CommandLoot.b commandloot_b) throws CommandSyntaxException {
CommandListenerWrapper commandlistenerwrapper = (CommandListenerWrapper) commandcontext.getSource();
LootTable loottable = commandlistenerwrapper.getServer().getLootTableRegistry().getLootTable(minecraftkey);
List<ItemStack> list = loottable.populateLoot(loottableinfo);
return commandloot_b.accept(commandcontext, list, (list1) -> {
a(commandlistenerwrapper, list1);
});
}
@FunctionalInterface
interface c {
ArgumentBuilder<CommandListenerWrapper, ?> construct(ArgumentBuilder<CommandListenerWrapper, ?> argumentbuilder, CommandLoot.b commandloot_b);
}
@FunctionalInterface
interface b {
int accept(CommandContext<CommandListenerWrapper> commandcontext, List<ItemStack> list, CommandLoot.a commandloot_a) throws CommandSyntaxException;
}
@FunctionalInterface
interface a {
void accept(List<ItemStack> list) throws CommandSyntaxException;
}
}