Newer
Older
void-pack-super-server / work / decompile-ee3ecae0 / net / minecraft / server / CriterionConditionBlock.java
package net.minecraft.server;

import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import javax.annotation.Nullable;

public class CriterionConditionBlock {

    public static final CriterionConditionBlock a = new CriterionConditionBlock((Tag) null, (Block) null, CriterionTriggerProperties.a, CriterionConditionNBT.a);
    @Nullable
    private final Tag<Block> b;
    @Nullable
    private final Block c;
    private final CriterionTriggerProperties d;
    private final CriterionConditionNBT e;

    public CriterionConditionBlock(@Nullable Tag<Block> tag, @Nullable Block block, CriterionTriggerProperties criteriontriggerproperties, CriterionConditionNBT criterionconditionnbt) {
        this.b = tag;
        this.c = block;
        this.d = criteriontriggerproperties;
        this.e = criterionconditionnbt;
    }

    public boolean a(WorldServer worldserver, BlockPosition blockposition) {
        if (this == CriterionConditionBlock.a) {
            return true;
        } else if (!worldserver.n(blockposition)) {
            return false;
        } else {
            IBlockData iblockdata = worldserver.getType(blockposition);
            Block block = iblockdata.getBlock();

            if (this.b != null && !this.b.isTagged(block)) {
                return false;
            } else if (this.c != null && block != this.c) {
                return false;
            } else if (!this.d.a(iblockdata)) {
                return false;
            } else {
                if (this.e != CriterionConditionNBT.a) {
                    TileEntity tileentity = worldserver.getTileEntity(blockposition);

                    if (tileentity == null || !this.e.a((NBTBase) tileentity.save(new NBTTagCompound()))) {
                        return false;
                    }
                }

                return true;
            }
        }
    }

    public static CriterionConditionBlock a(@Nullable JsonElement jsonelement) {
        if (jsonelement != null && !jsonelement.isJsonNull()) {
            JsonObject jsonobject = ChatDeserializer.m(jsonelement, "block");
            CriterionConditionNBT criterionconditionnbt = CriterionConditionNBT.a(jsonobject.get("nbt"));
            Block block = null;

            if (jsonobject.has("block")) {
                MinecraftKey minecraftkey = new MinecraftKey(ChatDeserializer.h(jsonobject, "block"));

                block = (Block) IRegistry.BLOCK.get(minecraftkey);
            }

            Tag<Block> tag = null;

            if (jsonobject.has("tag")) {
                MinecraftKey minecraftkey1 = new MinecraftKey(ChatDeserializer.h(jsonobject, "tag"));

                tag = TagsBlock.a().a(minecraftkey1);
                if (tag == null) {
                    throw new JsonSyntaxException("Unknown block tag '" + minecraftkey1 + "'");
                }
            }

            CriterionTriggerProperties criteriontriggerproperties = CriterionTriggerProperties.a(jsonobject.get("state"));

            return new CriterionConditionBlock(tag, block, criteriontriggerproperties, criterionconditionnbt);
        } else {
            return CriterionConditionBlock.a;
        }
    }

    public JsonElement a() {
        if (this == CriterionConditionBlock.a) {
            return JsonNull.INSTANCE;
        } else {
            JsonObject jsonobject = new JsonObject();

            if (this.c != null) {
                jsonobject.addProperty("block", IRegistry.BLOCK.getKey(this.c).toString());
            }

            if (this.b != null) {
                jsonobject.addProperty("tag", this.b.c().toString());
            }

            jsonobject.add("nbt", this.e.a());
            jsonobject.add("state", this.d.a());
            return jsonobject;
        }
    }

    public static class a {

        @Nullable
        private Block a;
        @Nullable
        private Tag<Block> b;
        private CriterionTriggerProperties c;
        private CriterionConditionNBT d;

        private a() {
            this.c = CriterionTriggerProperties.a;
            this.d = CriterionConditionNBT.a;
        }

        public static CriterionConditionBlock.a a() {
            return new CriterionConditionBlock.a();
        }

        public CriterionConditionBlock.a a(Tag<Block> tag) {
            this.b = tag;
            return this;
        }

        public CriterionConditionBlock b() {
            return new CriterionConditionBlock(this.b, this.a, this.c, this.d);
        }
    }
}