diff --git a/src/main/java/com/cleanroommc/modularui/factory/EntityGuiData.java b/src/main/java/com/cleanroommc/modularui/factory/EntityGuiData.java new file mode 100644 index 000000000..8e64ff623 --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/factory/EntityGuiData.java @@ -0,0 +1,18 @@ +package com.cleanroommc.modularui.factory; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; + +public class EntityGuiData extends GuiData { + + private final Entity guiHolder; + + public EntityGuiData(EntityPlayer player, Entity guiHolder) { + super(player); + this.guiHolder = guiHolder; + } + + public Entity getGuiHolder() { + return guiHolder; + } +} diff --git a/src/main/java/com/cleanroommc/modularui/factory/EntityGuiFactory.java b/src/main/java/com/cleanroommc/modularui/factory/EntityGuiFactory.java new file mode 100644 index 000000000..f27e2e927 --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/factory/EntityGuiFactory.java @@ -0,0 +1,61 @@ +package com.cleanroommc.modularui.factory; + +import com.cleanroommc.modularui.api.IGuiHolder; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.PacketBuffer; + +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class EntityGuiFactory extends AbstractUIFactory { + + public static EntityGuiFactory INSTANCE = new EntityGuiFactory(); + + protected EntityGuiFactory() { + super("mui:entity"); + } + + public > void open(EntityPlayer player, E entity) { + Objects.requireNonNull(player); + verifyEntity(player, entity); + GuiManager.open(this, new EntityGuiData(player, entity), (EntityPlayerMP) player); + } + + private static > void verifyEntity(EntityPlayer player, E entity) { + Objects.requireNonNull(entity); + if (!entity.isEntityAlive()) { + throw new IllegalArgumentException("Can't open dead Entity GUI!"); + } else if (player.world != entity.world) { + throw new IllegalArgumentException("Entity must be in same dimension as the player!"); + } + } + + @Override + public @NotNull IGuiHolder getGuiHolder(EntityGuiData guiData) { + return Objects.requireNonNull(castGuiHolder(guiData.getGuiHolder()), "Found Entity is not a gui holder!"); + } + + @Override + public void writeGuiData(EntityGuiData guiData, PacketBuffer packetBuffer) { + packetBuffer.writeInt(guiData.getGuiHolder().getEntityId()); + } + + @Override + public @NotNull EntityGuiData readGuiData(EntityPlayer entityPlayer, PacketBuffer packetBuffer) { + return new EntityGuiData(entityPlayer, entityPlayer.world.getEntityByID(packetBuffer.readInt())); + } + + @Override + public boolean canInteractWith(EntityPlayer player, EntityGuiData guiData) { + Entity guiHolder = guiData.getGuiHolder(); + return super.canInteractWith(player, guiData) && + guiHolder != null && + player.getDistanceSq(guiHolder.posX, guiHolder.posY, guiHolder.posZ) <= 64 && + player.world == guiHolder.world && + guiHolder.isEntityAlive(); + } +} diff --git a/src/main/java/com/cleanroommc/modularui/factory/GuiFactories.java b/src/main/java/com/cleanroommc/modularui/factory/GuiFactories.java index 7fff02757..c92a2d431 100644 --- a/src/main/java/com/cleanroommc/modularui/factory/GuiFactories.java +++ b/src/main/java/com/cleanroommc/modularui/factory/GuiFactories.java @@ -16,6 +16,10 @@ public static SidedTileEntityGuiFactory sidedTileEntity() { return SidedTileEntityGuiFactory.INSTANCE; } + public static EntityGuiFactory entity() { + return EntityGuiFactory.INSTANCE; + } + @Deprecated public static ItemGuiFactory item() { return ItemGuiFactory.INSTANCE; @@ -37,6 +41,7 @@ public static SimpleGuiFactory createSimple(String name, Supplier