package net.minecraft.server; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; import java.util.Set; import java.util.stream.Stream; public class LootItemFunctionCopyState extends LootItemFunctionConditional { private final Block a; private final Set<IBlockState<?>> c; private LootItemFunctionCopyState(LootItemCondition[] alootitemcondition, Block block, Set<IBlockState<?>> set) { super(alootitemcondition); this.a = block; this.c = set; } @Override public Set<LootContextParameter<?>> a() { return ImmutableSet.of(LootContextParameters.BLOCK_STATE); } @Override protected ItemStack a(ItemStack itemstack, LootTableInfo loottableinfo) { IBlockData iblockdata = (IBlockData) loottableinfo.getContextParameter(LootContextParameters.BLOCK_STATE); if (iblockdata != null) { NBTTagCompound nbttagcompound = itemstack.getOrCreateTag(); NBTTagCompound nbttagcompound1; if (nbttagcompound.hasKeyOfType("BlockStateTag", 10)) { nbttagcompound1 = nbttagcompound.getCompound("BlockStateTag"); } else { nbttagcompound1 = new NBTTagCompound(); nbttagcompound.set("BlockStateTag", nbttagcompound1); } Stream stream = this.c.stream(); iblockdata.getClass(); stream.filter(iblockdata::b).forEach((iblockstate) -> { nbttagcompound1.setString(iblockstate.a(), a(iblockdata, iblockstate)); }); } return itemstack; } public static LootItemFunctionCopyState.a a(Block block) { return new LootItemFunctionCopyState.a(block); } private static <T extends Comparable<T>> String a(IBlockData iblockdata, IBlockState<T> iblockstate) { T t0 = iblockdata.get(iblockstate); return iblockstate.a(t0); } public static class b extends LootItemFunctionConditional.c<LootItemFunctionCopyState> { public b() { super(new MinecraftKey("copy_state"), LootItemFunctionCopyState.class); } public void a(JsonObject jsonobject, LootItemFunctionCopyState lootitemfunctioncopystate, JsonSerializationContext jsonserializationcontext) { super.a(jsonobject, (LootItemFunctionConditional) lootitemfunctioncopystate, jsonserializationcontext); jsonobject.addProperty("block", IRegistry.BLOCK.getKey(lootitemfunctioncopystate.a).toString()); JsonArray jsonarray = new JsonArray(); lootitemfunctioncopystate.c.forEach((iblockstate) -> { jsonarray.add(iblockstate.a()); }); jsonobject.add("properties", jsonarray); } @Override public LootItemFunctionCopyState b(JsonObject jsonobject, JsonDeserializationContext jsondeserializationcontext, LootItemCondition[] alootitemcondition) { MinecraftKey minecraftkey = new MinecraftKey(ChatDeserializer.h(jsonobject, "block")); Block block = (Block) IRegistry.BLOCK.getOptional(minecraftkey).orElseThrow(() -> { return new IllegalArgumentException("Can't find block " + minecraftkey); }); BlockStateList<Block, IBlockData> blockstatelist = block.getStates(); Set<IBlockState<?>> set = Sets.newHashSet(); JsonArray jsonarray = ChatDeserializer.a(jsonobject, "properties", (JsonArray) null); if (jsonarray != null) { jsonarray.forEach((jsonelement) -> { set.add(blockstatelist.a(ChatDeserializer.a(jsonelement, "property"))); }); } return new LootItemFunctionCopyState(alootitemcondition, block, set); } } public static class a extends LootItemFunctionConditional.a<LootItemFunctionCopyState.a> { private final Block a; private final Set<IBlockState<?>> b; private a(Block block) { this.b = Sets.newHashSet(); this.a = block; } public LootItemFunctionCopyState.a a(IBlockState<?> iblockstate) { if (!this.a.getStates().d().contains(iblockstate)) { throw new IllegalStateException("Property " + iblockstate + " is not present on block " + this.a); } else { this.b.add(iblockstate); return this; } } @Override protected LootItemFunctionCopyState.a d() { return this; } @Override public LootItemFunction b() { return new LootItemFunctionCopyState(this.g(), this.a, this.b); } } }