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;
}
}