Jump to content

Recommended Posts

Posted

Hello. I've created a sort of slot/lottery machine in which I am working on getting the animations working. However, the only animation that seems to work is the lever. The other ones for the spinners that line up and the button that you push does not seem to do the animation. Any help is appreciated.

 

Tile Entity

Spoiler

package com.championash5357.custom.tileentity;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Nullable;

import com.championash5357.custom.block.BlockLotteryMachine;
import com.championash5357.custom.init.CustomItems;
import com.championash5357.custom.registry.CoinType;

import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class TileEntityLotteryMachine extends TileEntity implements ITickable{
    
    private Map<CoinType, Integer> coins = new HashMap<CoinType, Integer>();
    public float leverAngle = 0F, prevLeverAngle = 0F, buttonOffset = 0F, prevButtonOffset = 0F, spinner1Angle = 0F, spinner2Angle = 0F, spinner3Angle = 0F, prevSpinner1Angle = 0F, prevSpinner2Angle = 0F, prevSpinner3Angle = 0F;
    public boolean leverPulled = false, buttonPushed = false;
    private int timesPushed = 0;
    private boolean[] activeSpinners = new boolean[] {false, false, false};
    
    @Override
    public void update() {
        this.prevLeverAngle = this.leverAngle;
        this.prevButtonOffset = this.buttonOffset;
        this.prevSpinner1Angle = this.spinner1Angle;
        this.prevSpinner2Angle = this.spinner2Angle;
        this.prevSpinner3Angle = this.spinner3Angle;
        
        if(leverPulled) {
            this.leverAngle = Math.min(this.leverAngle + .1F, .7F);
            if(leverAngle == .7F) leverPulled = false;
        } else this.leverAngle = Math.max(this.leverAngle - .02F, 0);
        
        if(buttonPushed) {
            this.buttonOffset = Math.min(this.buttonOffset + .002F, .03F);
            if(buttonOffset == .03F) buttonPushed = false;
        } else this.buttonOffset = Math.max(this.buttonOffset - .001F, 0F);
        
        if(activeSpinners[0]) {
            this.spinner1Angle += 1F;
            if(spinner1Angle >= 4F && prevSpinner1Angle >= 4F) {spinner1Angle -= 4F; prevSpinner1Angle -= 4F;}
        } else spinner1Angle = Math.round(spinner1Angle);
        
        if(activeSpinners[1]) {
            this.spinner2Angle += 1F;
            if(spinner2Angle >= 4F && prevSpinner2Angle >= 4F) {spinner2Angle -= 4F; prevSpinner2Angle -= 4F;}
        } else spinner2Angle = Math.round(spinner2Angle);
        
        if(activeSpinners[2]) {
            this.spinner3Angle += 1F;
            if(spinner3Angle >= 4F && prevSpinner3Angle >= 4F) {spinner3Angle -= 4F; prevSpinner3Angle -= 4F;}
        } else spinner3Angle = Math.round(spinner3Angle);
    }
    
    @Override
    public void readFromNBT(NBTTagCompound compound) {
        super.readFromNBT(compound);
        this.leverAngle = compound.getFloat("LeverAngle");
        this.prevLeverAngle = compound.getFloat("PrevLeverAngle");
        this.leverPulled = compound.getBoolean("LeverPulled");
        this.buttonOffset = compound.getFloat("ButtonOffset");
        this.prevButtonOffset = compound.getFloat("PrevButtonOffset");
        this.buttonPushed = compound.getBoolean("ButtonPushed");
        this.timesPushed = compound.getInteger("TimesPushed");
        this.spinner1Angle = compound.getFloat("Spinner1Angle");
        this.spinner2Angle = compound.getFloat("Spinner2Angle");
        this.spinner3Angle = compound.getFloat("Spinner3Angle");
        this.prevSpinner1Angle = compound.getFloat("PrevSpinner1Angle");
        this.prevSpinner2Angle = compound.getFloat("PrevSpinner2Angle");
        this.prevSpinner3Angle = compound.getFloat("PrevSpinner3Angle");
        this.activeSpinners[0] = compound.getBoolean("ActiveSpinner1");
        this.activeSpinners[1] = compound.getBoolean("ActiveSpinner2");
        this.activeSpinners[2] = compound.getBoolean("ActiveSpinner3");
        NBTTagList list = compound.getTagList("Coins", Constants.NBT.TAG_COMPOUND);
        for(int i = 0; i < list.tagCount(); i++) {
            NBTTagCompound coin = list.getCompoundTagAt(i);
            coins.put(CoinType.getTypeFromName(coin.getString("Type")), coin.getInteger("Amount"));
        }
    }
    
    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
        super.writeToNBT(compound);
        compound.setFloat("LeverAngle", this.leverAngle);
        compound.setFloat("PrevLeverAngle", this.prevLeverAngle);
        compound.setBoolean("LeverPulled", this.leverPulled);
        compound.setFloat("ButtonOffset", this.buttonOffset);
        compound.setFloat("PrevButtonOffset", this.prevButtonOffset);
        compound.setBoolean("ButtonPushed", this.buttonPushed);
        compound.setInteger("TimesPushed", this.timesPushed);
        compound.setFloat("Spinner1Angle", this.spinner1Angle);
        compound.setFloat("Spinner2Angle", this.spinner2Angle);
        compound.setFloat("Spinner3Angle", this.spinner3Angle);
        compound.setFloat("PrevSpinner1Angle", this.prevSpinner1Angle);
        compound.setFloat("PrevSpinner2Angle", this.prevSpinner2Angle);
        compound.setFloat("PrevSpinner3Angle", this.prevSpinner3Angle);
        compound.setBoolean("ActiveSpinner1", this.activeSpinners[0]);
        compound.setBoolean("ActiveSpinner2", this.activeSpinners[1]);
        compound.setBoolean("ActiveSpinner3", this.activeSpinners[2]);
        NBTTagList list = new NBTTagList();
        for(CoinType coin : coins.keySet()) {
            NBTTagCompound tag = new NBTTagCompound();
            tag.setString("Type", coin.getName());
            tag.setInteger("Amount", coins.get(coin));
            list.appendTag(tag);
        }
        compound.setTag("Coins", list);
        return compound;
    }
    
    @Override
    public NBTTagCompound getUpdateTag() {
        return this.writeToNBT(new NBTTagCompound());
    }
    
    @Override
    public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
        this.readFromNBT(pkt.getNbtCompound());
    }
    
    @Override
    public SPacketUpdateTileEntity getUpdatePacket() {
        return new SPacketUpdateTileEntity(this.pos, 0, this.getUpdateTag());
    }
    
    public Map<CoinType, Integer> getCoinList() {
        return coins;
    }
    
    public void insertCoin(CoinType coin) {
        if(coins.containsKey(coin)) coins.put(coin, coins.get(coin) + 1);
        else coins.put(coin, 1);
        markDirty();
    }
    
    public void useCoin() {
        for(CoinType coin : coins.keySet()) {
            coins.put(coin, coins.get(coin) - 1);
            if(coins.get(coin).equals(0)) coins.remove(coin);
            return;
        }
    }
    
    public void pushButton() {
        buttonPushed = true;
        activeSpinners[timesPushed] = false;
        timesPushed += 1;
        markDirty();
    }
    
    public void activateSpinners() {
        activeSpinners[0] = true;
        activeSpinners[1] = true;
        activeSpinners[2] = true;
    }
    
    public void startMachine() {
        this.spinner1Angle = this.spinner2Angle = this.spinner3Angle = 0F;
        this.timesPushed = 0;
        useCoin();
        leverPulled = true;
        activateSpinners();
        markDirty();
    }
    
    public boolean canStart() {
        return leverAngle == 0F;
    }
    
    public boolean isFinished() {
        return activeSpinners[2] == false;
    }
    
    public boolean canPressButton() {
        return buttonOffset == 0F;
    }
    
    public void dropInventory() {
        for(CoinType coin : coins.keySet()) {
            for(int amount = 0; amount < coins.get(coin); ++amount) {
                EntityItem item = new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), CoinType.createCoin(new ItemStack(CustomItems.COIN), coin));
                world.spawnEntity(item);
            }
        }
    }
    
    @SideOnly(Side.CLIENT)
    public boolean isTop() {
        return BlockLotteryMachine.isTop(this.getBlockMetadata());
    }
}

 

Renderer (The few ones commented out were for testing purposes)

Spoiler

package com.championash5357.custom.render;

import com.championash5357.custom.client.Reference;
import com.championash5357.custom.model.ModelLotteryMachine;
import com.championash5357.custom.tileentity.TileEntityLotteryMachine;

import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.MathHelper;

public class RenderTileEntityLotteryMachine extends TileEntitySpecialRenderer<TileEntityLotteryMachine> {
    
    private static final ResourceLocation TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/models/lottery_machine.png");
    protected static final ResourceLocation[] DESTROY_STAGES = new ResourceLocation[] {new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_0.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_1.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_2.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_3.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_4.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_5.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_6.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_7.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_8.png"), new ResourceLocation(Reference.MOD_ID, "textures/models/destroy_stages/lottery_machine/destroy_stage_9.png")};

    private ModelLotteryMachine machine = new ModelLotteryMachine();
    
    final double spinner_rotation = Math.PI / 2;
    
    @Override
    public void render(TileEntityLotteryMachine te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
        boolean flag = te.getWorld() != null;
        boolean flag1 = flag ? te.isTop() : false;
        int i = flag ? te.getBlockMetadata() & 3 : 0;
        
        if (destroyStage >= 0) {
            this.bindTexture(DESTROY_STAGES[destroyStage]);
            GlStateManager.matrixMode(5890);
            GlStateManager.pushMatrix();
            GlStateManager.matrixMode(5888);
        } else {
            this.bindTexture(TEXTURE);
        }

        if(flag) this.renderPiece(flag1, x, y, z, i, alpha, te, partialTicks);
        else {
            GlStateManager.pushMatrix();
            this.renderPiece(false, x, y, z, i, alpha, te, partialTicks);
            this.renderPiece(true, x, y + 1.0D, z, i, alpha, te, partialTicks);
            GlStateManager.popMatrix();
        }

        if (destroyStage >= 0) {
            GlStateManager.matrixMode(5890);
            GlStateManager.popMatrix();
            GlStateManager.matrixMode(5888);
        }
    }
    
    private void renderPiece(boolean is_top, double x, double y, double z, int meta, float alpha, TileEntityLotteryMachine te, float partialTicks) {
        this.machine.preparePiece(is_top);
        GlStateManager.pushMatrix();
        float f = 0.0F;
        float f1 = is_top ? 0.5F : 1.5F;

        if (meta == EnumFacing.NORTH.getHorizontalIndex())
            f = 0.0F;
        else if (meta == EnumFacing.SOUTH.getHorizontalIndex()) {
            f = 180.0F;
        }
        else if (meta == EnumFacing.WEST.getHorizontalIndex()) {
            f = -90.0F;
        }
        else if (meta == EnumFacing.EAST.getHorizontalIndex()) {
            f = 90.0F;
        }

        GlStateManager.translate((float)x + .5F, (float)y + f1, (float)z + .5F);
        GlStateManager.rotate(180.0F, 1.0F, 0.0F, 0.0F);
        GlStateManager.rotate(f, 0.0F, 1.0F, 0.0F);
        GlStateManager.enableRescaleNormal();
        GlStateManager.pushMatrix();
        renderModel(te, partialTicks);
        GlStateManager.popMatrix();
        GlStateManager.color(1.0F, 1.0F, 1.0F, alpha);
        GlStateManager.popMatrix();
    }
    
    /*Work on animation*/
    private void renderModel(TileEntityLotteryMachine te, float partialTicks) {
        this.machine.Lever.rotateAngleX = te.prevLeverAngle + (te.leverAngle - te.prevLeverAngle) * partialTicks;
        this.machine.Panel_1.offsetY = te.prevButtonOffset + (te.buttonOffset - te.prevButtonOffset) * partialTicks;
        this.machine.Spinner.rotateAngleX = (float) (te.prevSpinner1Angle * spinner_rotation + (te.spinner1Angle * spinner_rotation - te.prevSpinner1Angle * spinner_rotation) * partialTicks);
        //this.machine.Spinner_1.rotateAngleX = (float) (te.spinner2Angle * Math.PI / 2);
        //this.machine.Spinner_2.rotateAngleX = (float) (te.spinner3Angle * Math.PI / 2);
        this.machine.render();
    }
}

 

Model

Spoiler

package com.championash5357.custom.model;

import java.util.Collections;
import java.util.List;

import javax.vecmath.Matrix4f;
import javax.vecmath.Quat4f;
import javax.vecmath.Vector3f;

import org.apache.commons.lang3.tuple.Pair;

import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.EnumFacing;

public class ModelLotteryMachine extends ModelBase {
    
    public ModelRenderer Base;
    public ModelRenderer Base_1;
    public ModelRenderer Base_2;
    public ModelRenderer Base_3;
    public ModelRenderer Base_4;
    public ModelRenderer Lever;
    public ModelRenderer Lever_1;
    public ModelRenderer Lever_2;
    public ModelRenderer Top;
    public ModelRenderer Panel;
    public ModelRenderer Spinner;
    public ModelRenderer Spinner_1;
    public ModelRenderer Spinner_2;
    public ModelRenderer Panel_1;

    public ModelLotteryMachine() {
        this.textureWidth = 128;
        this.textureHeight = 128;
        this.Lever_2 = new ModelRenderer(this, 0, 38);
        this.Lever_2.setRotationPoint(7.0F, 20.25F, 0.0F);
        this.Lever_2.addBox(-1.0F, -12.0F, -1.0F, 2, 2, 2, -0.25F);
        this.Panel_1 = new ModelRenderer(this, 0, 84);
        this.Panel_1.setRotationPoint(-4.0F, 7.0F, -5.0F);
        this.Panel_1.addBox(0.0F, 0.0F, 0.0F, 4, 1, 4, 0.0F);
        this.setRotateAngle(Panel_1, 0.3141592653589793F, 0.0F, 0.0F);
        this.Panel = new ModelRenderer(this, 0, 68);
        this.Panel.setRotationPoint(-6.0F, 8.0F, -6.0F);
        this.Panel.addBox(0.0F, 0.0F, 0.0F, 12, 3, 7, 0.0F);
        this.setRotateAngle(Panel, 0.3141592653589793F, 0.0F, 0.0F);
        this.Base_1 = new ModelRenderer(this, 0, 0);
        this.Base_1.setRotationPoint(-6.0F, 18.0F, -6.0F);
        this.Base_1.addBox(0.0F, 0.0F, 0.0F, 12, 6, 12, 0.0F);
        this.Base_2 = new ModelRenderer(this, 0, 38);
        this.Base_2.setRotationPoint(-6.0F, 16.0F, -4.0F);
        this.Base_2.addBox(0.0F, 0.0F, 0.0F, 12, 2, 10, 0.0F);
        this.Spinner_2 = new ModelRenderer(this, 0, 78);
        this.Spinner_2.setRotationPoint(3.5F, 0.5F, 0.5F);
        this.Spinner_2.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3, 0.0F);
        this.Base_4 = new ModelRenderer(this, 0, 4);
        this.Base_4.setRotationPoint(2.0F, 16.0F, -6.0F);
        this.Base_4.addBox(0.0F, 0.0F, 0.0F, 4, 2, 2, 0.0F);
        this.Lever_1 = new ModelRenderer(this, 0, 18);
        this.Lever_1.setRotationPoint(7.0F, 20.0F, 0.0F);
        this.Lever_1.addBox(-0.5F, -10.0F, -0.5F, 1, 9, 1, 0.0F);
        this.Spinner_1 = new ModelRenderer(this, 0, 78);
        this.Spinner_1.setRotationPoint(0.0F, 0.5F, 0.5F);
        this.Spinner_1.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3, 0.0F);
        this.Lever = new ModelRenderer(this, 0, 8);
        this.Lever.setRotationPoint(7.0F, 20.0F, 0.0F);
        this.Lever.addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, 0.0F);
        this.Top = new ModelRenderer(this, 0, 50);
        this.Top.setRotationPoint(-6.0F, -4.0F, 0.0F);
        this.Top.addBox(0.0F, 0.0F, 0.0F, 12, 12, 6, 0.0F);
        this.Spinner = new ModelRenderer(this, 0, 78);
        this.Spinner.setRotationPoint(-3.5F, 0.5F, 0.5F);
        this.Spinner.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3, 0.0F);
        this.Base = new ModelRenderer(this, 0, 18);
        this.Base.setRotationPoint(-6.0F, 8.0F, -6.0F);
        this.Base.addBox(0.0F, 0.0F, 0.0F, 12, 8, 12, 0.0F);
        this.Base_3 = new ModelRenderer(this, 0, 0);
        this.Base_3.setRotationPoint(-6.0F, 16.0F, -6.0F);
        this.Base_3.addBox(0.0F, 0.0F, 0.0F, 4, 2, 2, 0.0F);
    }

    public void render() { 
        this.Lever_1.rotateAngleX = this.Lever.rotateAngleX;
        this.Lever_2.rotateAngleX = this.Lever.rotateAngleX;
        
        this.Base.render(0.0625F);
        this.Base_1.render(0.0625F);
        this.Base_2.render(0.0625F);
        this.Base_3.render(0.0625F);
        this.Base_4.render(0.0625F);
        this.Panel.render(0.0625F);
        this.Top.render(0.0625F);
        
        this.Lever.render(0.0625F);
        this.Lever_1.render(0.0625F);
        this.Lever_2.render(0.0625F);
        
        this.Spinner.render(0.0625F);
        this.Spinner_1.render(0.0625F);
        this.Spinner_2.render(0.0625F);
        
        this.Panel_1.render(0.0625F);
    }

    public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;
    }
    
    public void preparePiece(boolean is_top) {
        this.Base.showModel = !is_top;
        this.Base_1.showModel = !is_top;
        this.Base_2.showModel = !is_top;
        this.Base_3.showModel = !is_top;
        this.Base_4.showModel = !is_top;
        this.Lever.showModel = !is_top;
        this.Lever_1.showModel = !is_top;
        this.Lever_2.showModel = !is_top;
        this.Panel.showModel = is_top;
        this.Panel_1.showModel = is_top;
        this.Top.showModel = is_top;
        this.Spinner.showModel = is_top;
        this.Spinner_1.showModel = is_top;
        this.Spinner_2.showModel = is_top;
    }
    
    public static class ModelItemLotteryMachine implements IBakedModel {

        @Override
        public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) {
            return Collections.EMPTY_LIST;
        }

        @Override
        public boolean isAmbientOcclusion() {
            return false;
        }

        @Override
        public boolean isGui3d() {
            return false;
        }

        @Override
        public boolean isBuiltInRenderer() {
            return true;
        }

        @Override
        public TextureAtlasSprite getParticleTexture() {
            return Minecraft.getMinecraft().getTextureMapBlocks().getMissingSprite();
        }

        @Override
        public ItemOverrideList getOverrides() {
            return ItemOverrideList.NONE;
        }
        
        @Override
        public Pair<? extends IBakedModel, Matrix4f> handlePerspective(TransformType cameraTransformType) {
            switch(cameraTransformType) {
            case FIRST_PERSON_RIGHT_HAND:
            case FIRST_PERSON_LEFT_HAND:
            case THIRD_PERSON_RIGHT_HAND:
            case THIRD_PERSON_LEFT_HAND:
                return Pair.of(this, new Matrix4f(new Quat4f(0, 1, 0, 0), new Vector3f(0, 0, 0), 0.5F));
            case FIXED:
                return Pair.of(this, new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(0, -.2F, 0), 0.5F));
            case GROUND:
            case GUI:
                return Pair.of(this, new Matrix4f(new Quat4f(0, 3, 0, 1), new Vector3f(0, -.2F, 0), 0.5F));
            default:
                return IBakedModel.super.handlePerspective(cameraTransformType);
            }
        }
    }
}

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • You are using Create 6 - some addons are not compatible with it Remove all addons and add these one by one littlecontraptions is mentioned - keep this one removed
    • Different problem now. https://paste.ee/p/iDo8lS35
    • I would like to have a BoP sapling drop from my block if it is also installed. I think I have done everything and I cannot pinpoint the problem, which is the error in the logs that appears when joining a world:   [Worker-Main-11/ERROR] [ne.mi.co.ForgeHooks/]: Couldn't parse element loot_tables:grasses:blocks/leaves_block com.google.gson.JsonSyntaxException: Expected name to be an item, was unknown string 'biomesoplenty:magic_sapling' My code:   LootItemConditions.CONDITIONS.register(modEventBus); public class LootItemConditions { public static final DeferredRegister<LootItemConditionType> CONDITIONS = DeferredRegister.create(Registries.LOOT_CONDITION_TYPE, Grasses.MOD_ID); public static final RegistryObject<LootItemConditionType> IS_MOD_LOADED = CONDITIONS.register("is_mod_loaded", () -> new LootItemConditionType(new IsModLoaded.ConditionSerializer())); } public class IsModLoaded implements LootItemCondition { private final boolean exists; private final String modID; public IsModLoaded(String modID) { this.exists = ModList.get().isLoaded(modID); this.modID = modID; } @Override public LootItemConditionType getType() { return LootItemConditions.IS_MOD_LOADED.get(); } @Override public boolean test(LootContext context) { return this.exists; } public static LootItemCondition.Builder builder(String modid) { return () -> new IsModLoaded(modid); } public static class ConditionSerializer implements Serializer<IsModLoaded> { @Override public void serialize(JsonObject json, IsModLoaded instance, JsonSerializationContext ctx) { json.addProperty("modid", instance.modID); } @Override public IsModLoaded deserialize(JsonObject json, JsonDeserializationContext ctx) { return new IsModLoaded(GsonHelper.getAsString(json, "modid")); } } } protected LootTable.Builder createLeavesDropsWithModIDCheck(Block selfBlock, Item sapling, Property<?>[] properties, String modIDToCheck, float... chances) { CopyBlockState.Builder blockStateCopyBuilder = CopyBlockState.copyState(selfBlock); for(Property<?> property : properties) { blockStateCopyBuilder.copy(property); } return LootTable.lootTable() .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(selfBlock) .when(HAS_SHEARS_OR_SILK_TOUCH) .apply(blockStateCopyBuilder))) .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) .add(this.applyExplosionCondition(selfBlock, LootItem.lootTableItem(sapling)) .when(IsModLoaded.builder(modIDToCheck))) .when(BonusLevelTableCondition.bonusLevelFlatChance(Enchantments.BLOCK_FORTUNE, chances)) .when(HAS_NO_SHEARS_OR_SILK_TOUCH)) .withPool(LootPool.lootPool().name("sticks").setRolls(ConstantValue.exactly(1.0F)) .add(this.applyExplosionDecay(selfBlock, LootItem.lootTableItem(Items.STICK). apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 2.0F)))) .when(BonusLevelTableCondition.bonusLevelFlatChance(Enchantments.BLOCK_FORTUNE, NORMAL_LEAVES_STICK_CHANCES)) .when(HAS_NO_SHEARS_OR_SILK_TOUCH))); } I don't know. Am I making a mistake somewhere? Am I forgetting something? Should there be something else?
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.