diff --git a/src/main/java/nl/requios/effortlessbuilding/create/events/CommonEvents.java b/src/main/java/nl/requios/effortlessbuilding/create/events/CommonEvents.java deleted file mode 100644 index 5e83123..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/events/CommonEvents.java +++ /dev/null @@ -1,39 +0,0 @@ -package nl.requios.effortlessbuilding.create.events; - -import net.minecraft.world.level.LevelAccessor; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import nl.requios.effortlessbuilding.create.foundation.utility.WorldAttached; - -@EventBusSubscriber -public class CommonEvents { - - @SubscribeEvent - public static void onUnloadWorld(LevelEvent.Unload event) { - LevelAccessor world = event.getLevel(); - WorldAttached.invalidateWorld(world); - } - - - @EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) - public static class ModBusEvents { - -// @SubscribeEvent -// public static void addPackFinders(AddPackFindersEvent event) { -// if (event.getPackType() == PackType.CLIENT_RESOURCES) { -// IModFileInfo modFileInfo = ModList.get().getModFileById(Create.ID); -// if (modFileInfo == null) { -// Create.LOGGER.error("Could not find Create mod file info; built-in resource packs will be missing!"); -// return; -// } -// IModFile modFile = modFileInfo.getFile(); -// event.addRepositorySource((consumer, constructor) -> { -// consumer.accept(Pack.create(Create.asResource("legacy_copper").toString(), false, () -> new ModFilePackResources("Create Legacy Copper", modFile, "resourcepacks/legacy_copper"), constructor, Pack.Position.TOP, PackSource.DEFAULT)); -// }); -// } -// } - - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/events/ClientEvents.java similarity index 75% rename from src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java rename to src/main/java/nl/requios/effortlessbuilding/create/foundation/events/ClientEvents.java index 4121558..05cd85d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/events/ClientEvents.java @@ -1,9 +1,10 @@ -package nl.requios.effortlessbuilding.create.events; +package nl.requios.effortlessbuilding.create.foundation.events; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; @@ -12,11 +13,13 @@ import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.CreateClient; +import nl.requios.effortlessbuilding.create.foundation.item.TooltipModifier; import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; import nl.requios.effortlessbuilding.create.foundation.utility.AnimationTickHolder; import nl.requios.effortlessbuilding.create.foundation.utility.CameraAngleAnimationService; @@ -59,21 +62,21 @@ public class ClientEvents { @SubscribeEvent public static void onRenderWorld(RenderLevelStageEvent event) { - Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera() - .getPosition(); - float pt = AnimationTickHolder.getPartialTicks(); + if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) + return; PoseStack ms = event.getPoseStack(); ms.pushPose(); - ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); + float partialTicks = AnimationTickHolder.getPartialTicks(); + Vec3 camera = Minecraft.getInstance().gameRenderer.getMainCamera() + .getPosition(); - CreateClient.GHOST_BLOCKS.renderAll(ms, buffer); + CreateClient.GHOST_BLOCKS.renderAll(ms, buffer, camera); + CreateClient.OUTLINER.renderOutlines(ms, buffer, camera, partialTicks); - CreateClient.OUTLINER.renderOutlines(ms, buffer, pt); buffer.draw(); RenderSystem.enableCull(); - ms.popPose(); } @@ -88,6 +91,20 @@ public class ClientEvents { event.setPitch(CameraAngleAnimationService.getPitch(partialTicks)); } + @SubscribeEvent + public static void addToItemTooltip(ItemTooltipEvent event) { +// if (!AllConfigs.client().tooltips.get()) +// return; + if (event.getEntity() == null) + return; + + Item item = event.getItemStack().getItem(); + TooltipModifier modifier = TooltipModifier.REGISTRY.get(item); + if (modifier != null && modifier != TooltipModifier.EMPTY) { + modifier.modify(event); + } + } + public static boolean isGameActive() { return !(Minecraft.getInstance().level == null || Minecraft.getInstance().player == null); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/events/CommonEvents.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/events/CommonEvents.java new file mode 100644 index 0000000..ad482ab --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/events/CommonEvents.java @@ -0,0 +1,18 @@ +package nl.requios.effortlessbuilding.create.foundation.events; + +import net.minecraft.world.level.LevelAccessor; +import net.minecraftforge.event.level.LevelEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import nl.requios.effortlessbuilding.create.foundation.utility.WorldAttached; + +@EventBusSubscriber +public class CommonEvents { + + @SubscribeEvent + public static void onUnloadWorld(LevelEvent.Unload event) { + LevelAccessor world = event.getLevel(); + WorldAttached.invalidateWorld(world); + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockHelper.java index 745856d..23e25b5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockHelper.java @@ -1,10 +1,19 @@ package nl.requios.effortlessbuilding.create.foundation.utility; +import java.util.function.Consumer; + +import javax.annotation.Nullable; + +//import nl.requios.effortlessbuilding.create.AllBlocks; +//import nl.requios.effortlessbuilding.create.AllTags.AllBlockTags; +//import nl.requios.effortlessbuilding.create.content.kinetics.base.KineticBlockEntity; +//import nl.requios.effortlessbuilding.create.foundation.blockEntity.IMergeableBE; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; @@ -20,7 +29,12 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.BaseRailBlock; +import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.IceBlock; +import net.minecraft.world.level.block.SlimeBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -29,15 +43,10 @@ import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Material; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.BlockSnapshot; import net.minecraftforge.event.level.BlockEvent; -import javax.annotation.Nullable; -import java.util.function.Consumer; - public class BlockHelper { public static BlockState setZeroAge(BlockState blockState) { @@ -149,11 +158,11 @@ public class BlockHelper { float effectChance, Consumer droppedItemCallback) { FluidState fluidState = world.getFluidState(pos); BlockState state = world.getBlockState(pos); - + if (world.random.nextFloat() < effectChance) world.levelEvent(2001, pos, Block.getId(state)); - BlockEntity tileentity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null; - + BlockEntity blockEntity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null; + if (player != null) { BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, state, player); MinecraftForge.EVENT_BUS.post(event); @@ -171,7 +180,7 @@ public class BlockHelper { if (world instanceof ServerLevel && world.getGameRules() .getBoolean(GameRules.RULE_DOBLOCKDROPS) && !world.restoringBlockSnapshots && (player == null || !player.isCreative())) { - for (ItemStack itemStack : Block.getDrops(state, (ServerLevel) world, pos, tileentity, player, usedTool)) + for (ItemStack itemStack : Block.getDrops(state, (ServerLevel) world, pos, blockEntity, player, usedTool)) droppedItemCallback.accept(itemStack); // Simulating IceBlock#playerDestroy. Not calling method directly as it would drop item @@ -181,15 +190,15 @@ public class BlockHelper { .ultraWarm()) return false; - var blockStateBelow = world.getBlockState(pos.below()); - if (blockStateBelow.blocksMotion() || blockStateBelow.liquid()) + BlockState blockstate = world.getBlockState(pos.below()); + if (blockstate.blocksMotion() || blockstate.liquid()) world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); return true; } state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true); } - + world.setBlockAndUpdate(pos, fluidState.createLegacyBlock()); return true; } @@ -210,8 +219,8 @@ public class BlockHelper { int idx = chunk.getSectionIndex(target.getY()); LevelChunkSection chunksection = chunk.getSection(idx); if (chunksection == null) { - chunksection = new LevelChunkSection(chunk.getSectionYFromSectionIndex(idx), world.registryAccess() - .registryOrThrow(Registry.BIOME_REGISTRY)); + chunksection = new LevelChunkSection(world.registryAccess() + .registryOrThrow(Registries.BIOME)); chunk.getSections()[idx] = chunksection; } BlockState old = chunksection.setBlockState(SectionPos.sectionRelative(target.getX()), @@ -224,9 +233,24 @@ public class BlockHelper { .getBlock(), target.below()); } - public static boolean placeSchematicBlock(Level world, Player player, BlockState state, BlockPos target, ItemStack stack, + public static CompoundTag prepareBlockEntityData(BlockState blockState, BlockEntity blockEntity) { + CompoundTag data = null; + if (blockEntity == null) + return data; + /*if (AllBlockTags.SAFE_NBT.matches(blockState)) { + data = blockEntity.saveWithFullMetadata(); + data = NBTProcessors.process(blockEntity, data, true); + } else */if (blockEntity instanceof IPartialSafeNBT) { + data = new CompoundTag(); + ((IPartialSafeNBT) blockEntity).writeSafe(data); + data = NBTProcessors.process(blockEntity, data, true); + } + return data; + } + + public static void placeSchematicBlock(Level world, BlockState state, BlockPos target, ItemStack stack, @Nullable CompoundTag data) { - BlockEntity existingTile = world.getBlockEntity(target); + BlockEntity existingBlockEntity = world.getBlockEntity(target); // Piston if (state.hasProperty(BlockStateProperties.EXTENDED)) @@ -254,40 +278,42 @@ public class BlockHelper { 0.0D, 0.0D, 0.0D); } Block.dropResources(state, world, target); - return true; + return; } if (state.getBlock() instanceof BaseRailBlock) { placeRailWithoutUpdate(world, state, target); - } else { - world.setBlock(target, state, 2); //Changed flag from 18 to 3 + } /*else if (AllBlocks.BELT.has(state)) { + world.setBlock(target, state, 2); + } */else { + world.setBlock(target, state, 2); //Changed flag from 18 to 2 } if (data != null) { -// if (existingTile instanceof IMergeableTE mergeable) { +// if (existingBlockEntity instanceof IMergeableBE mergeable) { // BlockEntity loaded = BlockEntity.loadStatic(target, state, data); -// if (existingTile.getType() +// if (existingBlockEntity.getType() // .equals(loaded.getType())) { // mergeable.accept(loaded); // return; // } // } - BlockEntity tile = world.getBlockEntity(target); - if (tile != null) { + BlockEntity blockEntity = world.getBlockEntity(target); + if (blockEntity != null) { data.putInt("x", target.getX()); data.putInt("y", target.getY()); data.putInt("z", target.getZ()); -// if (tile instanceof KineticTileEntity) -// ((KineticTileEntity) tile).warnOfMovement(); - tile.load(data); +// if (blockEntity instanceof KineticBlockEntity) +// ((KineticBlockEntity) blockEntity).warnOfMovement(); + blockEntity.load(data); } } try { - state.getBlock().setPlacedBy(world, target, state, null, stack); - } catch (Exception ignored) { + state.getBlock() + .setPlacedBy(world, target, state, null, stack); + } catch (Exception e) { } - return true; } public static double getBounceMultiplier(Block block) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockRenderer.java index fb29bc1..4e9e712 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockRenderer.java @@ -1,9 +1,15 @@ package nl.requios.effortlessbuilding.create.foundation.utility.ghost; +import java.util.List; + +import javax.annotation.Nullable; + import com.jozufozu.flywheel.core.model.ModelUtil; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +//import nl.requios.effortlessbuilding.create.foundation.placement.PlacementHelpers; import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; @@ -18,12 +24,10 @@ import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.model.data.ModelData; import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import javax.annotation.Nullable; -import java.util.List; - public abstract class GhostBlockRenderer { private static final GhostBlockRenderer STANDARD = new DefaultGhostBlockRenderer(); @@ -38,12 +42,13 @@ public abstract class GhostBlockRenderer { return TRANSPARENT; } - public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params); + public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, GhostBlockParams params); private static class DefaultGhostBlockRenderer extends GhostBlockRenderer { @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, GhostBlockParams params) { + ms.pushPose(); BlockRenderDispatcher dispatcher = Minecraft.getInstance() .getBlockRenderer(); ModelBlockRenderer renderer = dispatcher.getModelRenderer(); @@ -54,7 +59,7 @@ public abstract class GhostBlockRenderer { BakedModel model = dispatcher.getBlockModel(state); ms.pushPose(); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); + ms.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); for (RenderType layer : model.getRenderTypes(state, RandomSource.create(42L), ModelUtil.VIRTUAL_DATA)) { VertexConsumer vb = buffer.getEarlyBuffer(layer); @@ -70,13 +75,15 @@ public abstract class GhostBlockRenderer { private static class TransparentGhostBlockRenderer extends GhostBlockRenderer { @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, GhostBlockParams params) { + ms.pushPose(); + Minecraft mc = Minecraft.getInstance(); BlockRenderDispatcher dispatcher = mc.getBlockRenderer(); BlockState state = params.state; BlockPos pos = params.pos; - float alpha = params.alphaSupplier.get()/* * .75f* PlacementHelpers.getCurrentAlpha()*/; + float alpha = params.alphaSupplier.get()/* * .75f * PlacementHelpers.getCurrentAlpha()*/; float scale = params.scaleSupplier.get(); Color color = params.rgbSupplier.get(); @@ -84,9 +91,7 @@ public abstract class GhostBlockRenderer { RenderType layer = RenderType.translucent(); VertexConsumer vb = buffer.getEarlyBuffer(layer); - ms.pushPose(); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); - + ms.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); ms.translate(.5, .5, .5); ms.scale(scale, scale, scale); ms.translate(-.5, -.5, -.5); @@ -107,12 +112,12 @@ public abstract class GhostBlockRenderer { for (Direction direction : Direction.values()) { random.setSeed(42L); renderQuadList(pose, consumer, red, green, blue, alpha, - model.getQuads(state, direction, random, modelData, renderType), packedLight, packedOverlay); + model.getQuads(state, direction, random, modelData, null), packedLight, packedOverlay); } random.setSeed(42L); renderQuadList(pose, consumer, red, green, blue, alpha, - model.getQuads(state, null, random, modelData, renderType), packedLight, packedOverlay); + model.getQuads(state, null, random, modelData, null), packedLight, packedOverlay); } // ModelBlockRenderer diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlocks.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlocks.java index 6334c95..74b23c0 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlocks.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlocks.java @@ -1,14 +1,15 @@ package nl.requios.effortlessbuilding.create.foundation.utility.ghost; -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; -import net.minecraft.util.Mth; -import net.minecraft.world.level.block.state.BlockState; - import java.util.HashMap; import java.util.Map; +import com.mojang.blaze3d.vertex.PoseStack; +import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; + +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + public class GhostBlocks { public static double getBreathingAlpha() { @@ -61,10 +62,10 @@ public class GhostBlocks { ghosts.entrySet().removeIf(e -> !e.getValue().isAlive()); } - public void renderAll(PoseStack ms, SuperRenderTypeBuffer buffer) { + public void renderAll(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) { ghosts.forEach((slot, entry) -> { GhostBlockRenderer ghost = entry.ghost; - ghost.render(ms, buffer, entry.params); + ghost.render(ms, buffer, camera, entry.params); }); }