Jump to content

Educationalmoose

Members
  • Posts

    2
  • Joined

  • Last visited

Posts posted by Educationalmoose

  1.  

    Thanks for the link! I do not know if I had the right approach to implementing this idea, but so far I copied the AbstractChestedHorseEntity.java script and started to replace a lot of keywords with their PigEntity equivalent. I also copied a script for the container of the PigEntity and the screen of the PigEntity. Below will be the code:

    public abstract class AbstractChestedPigEntity extends PigEntity {
        private static final DataParameter<Boolean> DATA_ID_CHEST = EntityDataManager.createKey(com.educationalmoose.pighatmod.entity.passive.pig.AbstractChestedPigEntity.class, DataSerializers.BOOLEAN);
    
        protected AbstractChestedPigEntity(EntityType<? extends com.educationalmoose.pighatmod.entity.passive.pig.AbstractChestedPigEntity> type, World worldIn) {
            super(type, worldIn);
        }
    
        protected void registerData() {
            super.registerData();
            this.dataManager.register(DATA_ID_CHEST, false);
        }
    
        public static AttributeModifierMap.MutableAttribute registerAttributes() {
            return registerAttributes().func_233815_a_(Attributes.field_233821_d_, (double)0.175F).func_233815_a_(Attributes.field_233830_m_, 0.5D);
        }
    
        public boolean hasChest() {
            return this.dataManager.get(DATA_ID_CHEST);
        }
    
        public void setChested(boolean chested) {
            this.dataManager.set(DATA_ID_CHEST, chested);
        }
    
    
        /**
         * Returns the Y offset from the entity's position for any entity riding this one.
         */
        public double getMountedYOffset() {
            return super.getMountedYOffset() - 0.25D;
        }
    
        protected void dropInventory() {
            super.dropInventory();
            if (this.hasChest()) {
                if (!this.world.isRemote) {
                    this.entityDropItem(Blocks.CHEST);
                }
    
                this.setChested(false);
            }
    
        }
    
        public void writeAdditional(CompoundNBT compound) {
            super.writeAdditional(compound);
            compound.putBoolean("ChestedPig", this.hasChest());
            if (this.hasChest()) {
                ListNBT listnbt = new ListNBT();
                compound.put("Items", listnbt);
            }
    
        }
    
        /**
         * (abstract) Protected helper method to read subclass entity data from NBT.
         */
        public void readAdditional(CompoundNBT compound) {
            super.readAdditional(compound);
            this.setChested(compound.getBoolean("ChestedPig"));
            if (this.hasChest()) {
                ListNBT listnbt = compound.getList("Items", 10);
            }
        }
    
        public boolean replaceItemInInventory(int inventorySlot, ItemStack itemStackIn) {
            if (inventorySlot == 499) {
                if (this.hasChest() && itemStackIn.isEmpty()) {
                    this.setChested(false);
                    return true;
                }
    
                if (!this.hasChest()) {
                    this.setChested(true);
                    return true;
                }
            }
    
            return super.replaceItemInInventory(inventorySlot, itemStackIn);
        }
    /*
        public ActionResultType getEntityInteractionResult(PlayerEntity player, Hand hand) {
            ItemStack itemstack = player.getHeldItem(hand);
            if (!this.isChild()) {
                if (player.isSecondaryUseActive()) {
                    this.openGUI(player);
                    return ActionResultType.resultSuccessClient(this.world.isRemote);
                }
            }
        } */
    
        public int getInventoryColumns() {
            return 1;
        }
    }

     

    @OnlyIn(Dist.CLIENT)
    public class PigInventoryScreen extends ContainerScreen<PigInventoryContainer> {
        private static final ResourceLocation PIG_GUI_TEXTURES = new ResourceLocation("textures/gui/container/pig.png");
        /** The EntityPig whose inventory is currently being accessed. */
        private final PigEntity pigEntity;
        /** The mouse x-position recorded during the last rendered frame. */
        private float mousePosx;
        /** The mouse y-position recorded during the last renderered frame. */
        private float mousePosY;
    
        public PigInventoryScreen(PigInventoryContainer p_i51084_1_, PlayerInventory p_i51084_2_, PigEntity p_i51084_3_) {
            super(p_i51084_1_, p_i51084_2_, p_i51084_3_.getDisplayName());
            this.pigEntity = p_i51084_3_;
            this.field_230711_n_ = false;
        }
    
        protected void func_230450_a_(MatrixStack p_230450_1_, float p_230450_2_, int p_230450_3_, int p_230450_4_) {
            RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
            this.field_230706_i_.getTextureManager().bindTexture(PIG_GUI_TEXTURES);
            int i = (this.field_230708_k_ - this.xSize) / 2;
            int j = (this.field_230709_l_ - this.ySize) / 2;
            this.func_238474_b_(p_230450_1_, i, j, 0, 0, this.xSize, this.ySize);
    
            InventoryScreen.drawEntityOnScreen(i + 51, j + 60, 17, (float)(i + 51) - this.mousePosx, (float)(j + 75 - 50) - this.mousePosY, this.pigEntity);
        }
    
        public void func_230430_a_(MatrixStack p_230430_1_, int p_230430_2_, int p_230430_3_, float p_230430_4_) {
            this.func_230446_a_(p_230430_1_);
            this.mousePosx = (float)p_230430_2_;
            this.mousePosY = (float)p_230430_3_;
            super.func_230430_a_(p_230430_1_, p_230430_2_, p_230430_3_, p_230430_4_);
            this.func_230459_a_(p_230430_1_, p_230430_2_, p_230430_3_);
        }
    }
    public class PigInventoryContainer extends Container implements IForgeRegistryEntry<PigInventoryContainer> {
        private final IInventory pigInventory;
        private final PigEntity pig;
    
        public PigInventoryContainer(int p_i50077_1_, PlayerInventory playerInventory, IInventory hatPigInventory, final PigEntity hatPig) {
            super((ContainerType<?>)null, p_i50077_1_);
            this.pigInventory = hatPigInventory;
            this.pig = hatPig;
            int i = 3;
            hatPigInventory.openInventory(playerInventory.player);
            int j = -18;
            this.addSlot(new Slot(hatPigInventory, 0, 8, 18) {
                public int getSlotStackLimit() {
                    return 1;
                }
            });
    
            for(int i1 = 0; i1 < 3; ++i1) {
                for(int k1 = 0; k1 < 9; ++k1) {
                    this.addSlot(new Slot(playerInventory, k1 + i1 * 9 + 9, 8 + k1 * 18, 102 + i1 * 18 + -18));
                }
            }
    
            for(int j1 = 0; j1 < 9; ++j1) {
                this.addSlot(new Slot(playerInventory, j1, 8 + j1 * 18, 142));
            }
    
        }
    
        /**
         * Determines whether supplied player can use this container
         */
        public boolean canInteractWith(PlayerEntity playerIn) {
            return this.pigInventory.isUsableByPlayer(playerIn) && this.pig.isAlive() && this.pig.getDistance(playerIn) < 8.0F;
        }
    
        /**
         * Handle when the stack in slot {@code index} is shift-clicked. Normally this moves the stack between the player
         * inventory and the other inventory(s).
         */
        public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) {
            ItemStack itemstack = ItemStack.EMPTY;
            Slot slot = this.inventorySlots.get(index);
            if (slot != null && slot.getHasStack()) {
                ItemStack itemstack1 = slot.getStack();
                itemstack = itemstack1.copy();
                int i = this.pigInventory.getSizeInventory();
                if (index < i) {
                    if (!this.mergeItemStack(itemstack1, i, this.inventorySlots.size(), true)) {
                        return ItemStack.EMPTY;
                    }
                } else if (this.getSlot(1).isItemValid(itemstack1) && !this.getSlot(1).getHasStack()) {
                    if (!this.mergeItemStack(itemstack1, 1, 2, false)) {
                        return ItemStack.EMPTY;
                    }
                } else if (this.getSlot(0).isItemValid(itemstack1)) {
                    if (!this.mergeItemStack(itemstack1, 0, 1, false)) {
                        return ItemStack.EMPTY;
                    }
                } else if (i <= 2 || !this.mergeItemStack(itemstack1, 2, i, false)) {
                    int j = i + 27;
                    int k = j + 9;
                    if (index >= j && index < k) {
                        if (!this.mergeItemStack(itemstack1, i, j, false)) {
                            return ItemStack.EMPTY;
                        }
                    } else if (index >= i && index < j) {
                        if (!this.mergeItemStack(itemstack1, j, k, false)) {
                            return ItemStack.EMPTY;
                        }
                    } else if (!this.mergeItemStack(itemstack1, j, j, false)) {
                        return ItemStack.EMPTY;
                    }
    
                    return ItemStack.EMPTY;
                }
    
                if (itemstack1.isEmpty()) {
                    slot.putStack(ItemStack.EMPTY);
                } else {
                    slot.onSlotChanged();
                }
            }
    
            return itemstack;
        }
    
        /**
         * Called when the container is closed.
         */
        public void onContainerClosed(PlayerEntity playerIn) {
            super.onContainerClosed(playerIn);
            this.pigInventory.closeInventory(playerIn);
        }
    
        @Override
        public PigInventoryContainer setRegistryName(ResourceLocation name) {
            return null;
        }
    
        @Nullable
        @Override
        public ResourceLocation getRegistryName() {
            return null;
        }
    
        @Override
        public Class<PigInventoryContainer> getRegistryType() {
            return null;
        }
    }

     

    Sorry if this was long, I'm also new to the website so if there is a better way to format this that is easier to read just let me know. The main problem I have right now is when I try to register the container, I followed a 1.15 tutorial for registering a container and it does not seem to be compatible with the PigInventoryContainer script because PigEntity cant be accessed 

    ublic class ModContainerTypes {
    
        public static final DeferredRegister<ContainerType<?>> CONTAINER_TYPES = DeferredRegister.create(ForgeRegistries.CONTAINERS, PigHatMod.MOD_ID);
    
        public static final RegistryObject<ContainerType<PigInventoryContainer>> PIG_INVENTORY_CONTAINER = CONTAINER_TYPES.register("pig_inventory_chest", () -> IForgeContainerType.create(PigInventoryContainer::new));
    }
    @Mod.EventBusSubscriber(modid = PigHatMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
    public class ClientEventBusSubscriber extends AnimalEntity {
    
        protected ClientEventBusSubscriber(EntityType<? extends AnimalEntity> type, World worldIn) {
            super(type, worldIn);
        }
    
        @SubscribeEvent
        public static void clientSetup(FMLClientSetupEvent event) {
            ScreenManager.registerFactory(ModContainerTypes.PIG_INVENTORY_CONTAINER.get(), PigInventoryScreen:: new);
        }
    
        @Nullable
        @Override
        public AgeableEntity func_241840_a(ServerWorld p_241840_1_, AgeableEntity p_241840_2_) {
            return null;
        }
    }

     

  2. I just started modding a few weeks ago and I am new to forge but have at least a basic understanding of Java programming. I am self taught but know the basics and am constantly trying to improve. Anyways, I wanted to learn how to use containers, inventories, etc. and I noticed a lack of information newer than 1.14 and was having a lot of difficulty following tutorials online. For this specific mod, I was trying to start off super basic and just make an inventory with 2 slots, but I wanted to put the inventory on an entity that already exists within minecraft, because I thought it would be easier than creating my own entity. I decided to use the pig, and so far I have been basing almost all of my code off of the horse entity. I have come across many problems though and I do not know where to find an answer since there is not much documentation on this. I have been learning a lot about tileEntities and I was going to try making a chest with 2 inventory slots and then just opening that chest whenever I click on a pig, but this seems like an inefficient way to go about doing this. Unfortunately since I am new to modding I do not know all of the different possible ways to accomplish this and I was wondering if someone could help me a little bit so I can get on my way. I will supply people with any code that they might need to see to help me out, and I am using IntelliJ. Thanks!

×
×
  • Create New...

Important Information

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