diff options
Diffstat (limited to 'src/main/java/com/anthonyhilyard/iceberg/util')
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; } |