aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/anthonyhilyard/iceberg/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/anthonyhilyard/iceberg/util')
-rw-r--r--src/main/java/com/anthonyhilyard/iceberg/util/EntityCollector.java94
-rw-r--r--src/main/java/com/anthonyhilyard/iceberg/util/GuiHelper.java4
-rw-r--r--src/main/java/com/anthonyhilyard/iceberg/util/Tooltips.java14
3 files changed, 89 insertions, 23 deletions
diff --git a/src/main/java/com/anthonyhilyard/iceberg/util/EntityCollector.java b/src/main/java/com/anthonyhilyard/iceberg/util/EntityCollector.java
index 1524a88..6e3b079 100644
--- a/src/main/java/com/anthonyhilyard/iceberg/util/EntityCollector.java
+++ b/src/main/java/com/anthonyhilyard/iceberg/util/EntityCollector.java
@@ -2,6 +2,7 @@ package com.anthonyhilyard.iceberg.util;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.UUID;
import java.util.function.Consumer;
@@ -18,16 +19,22 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.AbortableIterationConsumer;
+import net.minecraft.world.Difficulty;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.decoration.Painting;
+import net.minecraft.world.entity.decoration.PaintingVariant;
import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.flag.FeatureFlagSet;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SpawnEggItem;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.item.crafting.RecipeManager;
+import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.Level;
+import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
@@ -39,6 +46,7 @@ import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.gameevent.GameEvent.Context;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
+import net.minecraft.world.level.storage.WritableLevelData;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
@@ -54,11 +62,29 @@ public class EntityCollector extends Level
private static final Map<Level, EntityCollector> wrappedLevelsMap = Maps.newHashMap();
private static final Map<ItemClassPair, Boolean> itemCreatesEntityResultCache = Maps.newHashMap();
- private record ItemClassPair(Item item, Class<?> targetClass) {}
+ private record ItemClassPair(Item item, CompoundTag tag, Class<?> targetClass) {}
protected EntityCollector(Level wrapped)
{
- super(null, null, wrapped.dimensionTypeRegistration(), wrapped.getProfilerSupplier(), false, wrapped.isDebug(), 0, 0);
+ super(new WritableLevelData() {
+ @Override public int getXSpawn() { return 0; }
+ @Override public int getYSpawn() { return 0; }
+ @Override public int getZSpawn() { return 0; }
+ @Override public float getSpawnAngle() { return 0.0f; }
+ @Override public long getGameTime() { return 0; }
+ @Override public long getDayTime() { return 0; }
+ @Override public boolean isThundering() { return false; }
+ @Override public boolean isRaining() { return false; }
+ @Override public void setRaining(boolean isRaining) {}
+ @Override public boolean isHardcore() { return false; }
+ @Override public GameRules getGameRules() { return new GameRules(); }
+ @Override public Difficulty getDifficulty() { return Difficulty.EASY; }
+ @Override public boolean isDifficultyLocked() { return false; }
+ @Override public void setXSpawn(int x) {}
+ @Override public void setYSpawn(int p_78652_) {}
+ @Override public void setZSpawn(int p_78653_) {}
+ @Override public void setSpawnAngle(float p_78648_) {}
+ }, null, wrapped.registryAccess(), wrapped.dimensionTypeRegistration(), wrapped.getProfilerSupplier(), false, wrapped.isDebug(), 0, 0);
wrappedLevel = wrapped;
}
@@ -72,10 +98,13 @@ public class EntityCollector extends Level
return wrappedLevelsMap.get(wrappedLevel);
}
- public static List<Entity> collectEntitiesFromItem(Item item)
+ public static List<Entity> collectEntitiesFromItem(ItemStack itemStack)
{
Minecraft minecraft = Minecraft.getInstance();
List<Entity> entities = Lists.newArrayList();
+ Item item = itemStack.getItem();
+ ItemStack dummyStack = new ItemStack(item, itemStack.getCount());
+ dummyStack.setTag(itemStack.getTag());
try
{
@@ -84,7 +113,7 @@ public class EntityCollector extends Level
@Override public boolean isCreative() { return false; }
};
- dummyPlayer.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(item));
+ dummyPlayer.setItemInHand(InteractionHand.MAIN_HAND, dummyStack);
EntityCollector levelWrapper = EntityCollector.of(dummyPlayer.level);
@@ -94,7 +123,7 @@ public class EntityCollector extends Level
}
else
{
- item.use(levelWrapper, dummyPlayer, InteractionHand.MAIN_HAND);
+ dummyStack.use(levelWrapper, dummyPlayer, InteractionHand.MAIN_HAND);
}
entities.addAll(levelWrapper.getCollectedEntities());
@@ -103,11 +132,51 @@ public class EntityCollector extends Level
if (entities.isEmpty())
{
levelWrapper.setBlockState(Blocks.RAIL.defaultBlockState());
- item.useOn(new UseOnContext(levelWrapper, dummyPlayer, InteractionHand.MAIN_HAND, dummyPlayer.getItemInHand(InteractionHand.MAIN_HAND), new BlockHitResult(Vec3.ZERO, Direction.DOWN, BlockPos.ZERO, false)));
+ dummyStack.useOn(new UseOnContext(levelWrapper, dummyPlayer, InteractionHand.MAIN_HAND, dummyPlayer.getItemInHand(InteractionHand.MAIN_HAND), new BlockHitResult(Vec3.ZERO, Direction.DOWN, BlockPos.ZERO, false)));
levelWrapper.setBlockState(Blocks.AIR.defaultBlockState());
entities.addAll(levelWrapper.getCollectedEntities());
}
+
+ // If we still didn't spawn any entities, try again but this time simulate placing on a solid wall for painting-like items.
+ if (entities.isEmpty())
+ {
+ levelWrapper.setBlockState(Blocks.STONE.defaultBlockState());
+ dummyStack.useOn(new UseOnContext(levelWrapper, dummyPlayer, InteractionHand.MAIN_HAND, dummyPlayer.getItemInHand(InteractionHand.MAIN_HAND), new BlockHitResult(Vec3.ZERO, Direction.NORTH, BlockPos.ZERO, false)));
+ levelWrapper.setBlockState(Blocks.AIR.defaultBlockState());
+
+ entities.addAll(levelWrapper.getCollectedEntities());
+
+ CompoundTag itemTag = dummyStack.getTag();
+ if (itemTag != null && itemTag.contains("EntityTag", 10))
+ {
+ CompoundTag entityTag = itemTag.getCompound("EntityTag");
+
+ Optional<Holder<PaintingVariant>> loadedVariant = Painting.loadVariant(entityTag);
+ if (loadedVariant.isPresent())
+ {
+ // Entities collected here should be updated in case the item used a specific variant.
+ for (Entity entity : entities)
+ {
+ if (entity instanceof Painting paintingEntity)
+ {
+ paintingEntity.setVariant(loadedVariant.get());
+ }
+ }
+ }
+ else
+ {
+ entities.clear();
+ }
+ }
+ else
+ {
+ entities.clear();
+ }
+ }
+
+ // Now iterate through all the collected entities and remove any projectiles to prevent some crashes with modded bobbers, etc.
+ entities.removeIf(entity -> entity instanceof Projectile);
}
catch (Exception e)
{
@@ -117,14 +186,14 @@ public class EntityCollector extends Level
return entities;
}
- public static <T extends Entity> boolean itemCreatesEntity(Item item, Class<T> targetClass)
+ public static <T extends Entity> boolean itemCreatesEntity(ItemStack itemStack, Class<T> targetClass)
{
- ItemClassPair key = new ItemClassPair(item, targetClass);
+ ItemClassPair key = new ItemClassPair(itemStack.getItem(), itemStack.getTag(), targetClass);
boolean result = false;
if (!itemCreatesEntityResultCache.containsKey(key))
{
// Return true if any collected entities from this item are a subclass of the given type.
- for (Entity entity : collectEntitiesFromItem(item))
+ for (Entity entity : collectEntitiesFromItem(itemStack))
{
if (targetClass.isInstance(entity))
{
@@ -160,6 +229,12 @@ public class EntityCollector extends Level
}
@Override
+ public int getBrightness(LightLayer lightLayer, BlockPos blockPos)
+ {
+ return 15;
+ }
+
+ @Override
public boolean noCollision(Entity entity, AABB boundingBox)
{
return true;
@@ -168,6 +243,7 @@ public class EntityCollector extends Level
@Override
public boolean addFreshEntity(Entity entity)
{
+ entity.setYRot(180.0f);
collectedEntities.add(entity);
return false;
}
diff --git a/src/main/java/com/anthonyhilyard/iceberg/util/GuiHelper.java b/src/main/java/com/anthonyhilyard/iceberg/util/GuiHelper.java
index 54cf422..eb91073 100644
--- a/src/main/java/com/anthonyhilyard/iceberg/util/GuiHelper.java
+++ b/src/main/java/com/anthonyhilyard/iceberg/util/GuiHelper.java
@@ -17,7 +17,6 @@ public class GuiHelper
public static void drawGradientRect(Matrix4f mat, int zLevel, int left, int top, int right, int bottom, int startColor, int endColor)
{
RenderSystem.enableDepthTest();
- RenderSystem.disableTexture();
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.setShader(GameRenderer::getPositionColorShader);
@@ -29,7 +28,6 @@ public class GuiHelper
BufferUploader.drawWithShader(bufferBuilder.end());
RenderSystem.disableBlend();
- RenderSystem.enableTexture();
}
public static void drawGradientRect(Matrix4f mat, BufferBuilder bufferBuilder, int left, int top, int right, int bottom, int zLevel, int startColor, int endColor)
@@ -61,7 +59,6 @@ public class GuiHelper
float endBlue = (float)(endColor & 255) / 255.0F;
RenderSystem.enableDepthTest();
- RenderSystem.disableTexture();
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.setShader(GameRenderer::getPositionColorShader);
@@ -76,6 +73,5 @@ public class GuiHelper
tessellator.end();
RenderSystem.disableBlend();
- RenderSystem.enableTexture();
}
}
diff --git a/src/main/java/com/anthonyhilyard/iceberg/util/Tooltips.java b/src/main/java/com/anthonyhilyard/iceberg/util/Tooltips.java
index 48184b9..29cc39b 100644
--- a/src/main/java/com/anthonyhilyard/iceberg/util/Tooltips.java
+++ b/src/main/java/com/anthonyhilyard/iceberg/util/Tooltips.java
@@ -222,8 +222,6 @@ public class Tooltips
poseStack.pushPose();
final int zLevel = 400;
- float f = itemRenderer.blitOffset;
- itemRenderer.blitOffset = zLevel;
Tesselator tesselator = Tesselator.getInstance();
BufferBuilder bufferbuilder = tesselator.getBuilder();
@@ -245,12 +243,9 @@ public class Tooltips
}, matrix4f, bufferbuilder, rectX, rectY, rect.getWidth(), rect.getHeight(), zLevel);
RenderSystem.enableDepthTest();
- RenderSystem.disableTexture();
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
BufferUploader.drawWithShader(bufferbuilder.end());
- RenderSystem.disableBlend();
- RenderSystem.enableTexture();
BufferSource bufferSource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder());
poseStack.translate(0.0f, 0.0f, zLevel);
@@ -273,17 +268,16 @@ public class Tooltips
}
bufferSource.endBatch();
- poseStack.popPose();
tooltipTop = rectY;
for (int componentNumber = 0; componentNumber < info.getComponents().size(); ++componentNumber)
{
ClientTooltipComponent imageComponent = (ClientTooltipComponent)info.getComponents().get(componentNumber);
- imageComponent.renderImage(info.getFont(), rectX, tooltipTop, poseStack, itemRenderer, zLevel);
+ imageComponent.renderImage(info.getFont(), rectX, tooltipTop, poseStack, itemRenderer);
tooltipTop += imageComponent.getHeight() + (componentNumber == 0 ? 2 : 0);
}
- itemRenderer.blitOffset = f;
+ poseStack.popPose();
RenderTooltipEvents.POSTEXT.invoker().onPost(stack, info.getComponents(), poseStack, rectX, rectY, info.getFont(), rect.getWidth(), rect.getHeight(), comparison, index);
}
@@ -489,9 +483,9 @@ public class Tooltips
// Find the title component, which is the first text component.
int titleIndex = 0;
- for (ClientTooltipComponent clienttooltipcomponent : components)
+ for (ClientTooltipComponent clientTooltipComponent : components)
{
- if (clienttooltipcomponent instanceof ClientTextTooltip)
+ if (clientTooltipComponent instanceof ClientTextTooltip)
{
break;
}