From ceb17abf2178102c64ba29bd64a8e504be0214cd Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 13 Jul 2023 15:22:56 -0500 Subject: [PATCH 01/26] Draw an outline around where a multiblock will be placed --- .../funnel/TwoByTwoFacingMultiblockBlock.java | 7 +- .../portalcubed/client/PortalCubedClient.java | 66 ++++++++++++++++--- .../ExcursionFunnelEmitterBlockItem.java | 5 +- .../portalcubed/items/MultiblockItem.java | 16 +++++ 4 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/fusionflux/portalcubed/items/MultiblockItem.java diff --git a/src/main/java/com/fusionflux/portalcubed/blocks/funnel/TwoByTwoFacingMultiblockBlock.java b/src/main/java/com/fusionflux/portalcubed/blocks/funnel/TwoByTwoFacingMultiblockBlock.java index 2d1eeab1..f64586e4 100644 --- a/src/main/java/com/fusionflux/portalcubed/blocks/funnel/TwoByTwoFacingMultiblockBlock.java +++ b/src/main/java/com/fusionflux/portalcubed/blocks/funnel/TwoByTwoFacingMultiblockBlock.java @@ -1,10 +1,6 @@ package com.fusionflux.portalcubed.blocks.funnel; -import java.util.HashMap; -import java.util.Map; - import com.fusionflux.portalcubed.util.TwoByTwo; - import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -12,6 +8,9 @@ import net.minecraft.world.level.block.state.properties.DirectionProperty; import net.minecraft.world.level.block.state.properties.IntegerProperty; +import java.util.HashMap; +import java.util.Map; + public interface TwoByTwoFacingMultiblockBlock { IntegerProperty QUADRANT = IntegerProperty.create("quadrant", 1, 4); DirectionProperty FACING = BlockStateProperties.FACING; diff --git a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java index 3ca7c630..d3095db4 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java +++ b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java @@ -17,15 +17,16 @@ import com.fusionflux.portalcubed.client.render.block.EmissiveSpriteRegistry; import com.fusionflux.portalcubed.client.render.block.entity.*; import com.fusionflux.portalcubed.client.render.entity.*; +import com.fusionflux.portalcubed.client.render.entity.animated_textures.AnimatedEntityTextures; import com.fusionflux.portalcubed.client.render.entity.model.*; import com.fusionflux.portalcubed.client.render.portal.PortalRenderPhase; import com.fusionflux.portalcubed.client.render.portal.PortalRendererImpl; import com.fusionflux.portalcubed.client.render.portal.PortalRenderers; -import com.fusionflux.portalcubed.client.render.entity.animated_textures.AnimatedEntityTextures; import com.fusionflux.portalcubed.entity.Portal; import com.fusionflux.portalcubed.entity.PortalCubedEntities; import com.fusionflux.portalcubed.fluids.PortalCubedFluids; import com.fusionflux.portalcubed.fog.FogSettings; +import com.fusionflux.portalcubed.items.MultiblockItem; import com.fusionflux.portalcubed.items.PortalCubedItems; import com.fusionflux.portalcubed.items.PortalGun; import com.fusionflux.portalcubed.mixin.client.AbstractSoundInstanceAccessor; @@ -33,10 +34,7 @@ import com.fusionflux.portalcubed.mixin.client.MusicManagerAccessor; import com.fusionflux.portalcubed.packet.PortalCubedServerPackets; import com.fusionflux.portalcubed.sound.PortalCubedSounds; -import com.fusionflux.portalcubed.util.CameraControl; -import com.fusionflux.portalcubed.util.IPQuaternion; -import com.fusionflux.portalcubed.util.PortalCubedComponents; -import com.fusionflux.portalcubed.util.PortalDirectionUtils; +import com.fusionflux.portalcubed.util.*; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import com.mojang.brigadier.arguments.BoolArgumentType; @@ -50,9 +48,7 @@ import net.minecraft.client.gui.screens.DeathScreen; import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; @@ -68,11 +64,16 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.GsonHelper; import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ClickType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.*; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import org.apache.commons.lang3.mutable.MutableDouble; import org.jetbrains.annotations.NotNull; @@ -478,6 +479,55 @@ Items.LIGHT, new ResourceLocation("level") ); }); + WorldRenderEvents.BLOCK_OUTLINE.register((worldRenderContext, blockOutlineContext) -> { + final Minecraft minecraft = Minecraft.getInstance(); + final HitResult hitResult = minecraft.hitResult; + if (hitResult == null || hitResult.getType() != HitResult.Type.BLOCK) { + return true; + } + final Player player = minecraft.player; + assert player != null; + ItemStack useStack = null; + InteractionHand useHand = null; + MultiblockItem useItem = null; + for (final InteractionHand hand : InteractionHand.values()) { + final ItemStack stack = player.getItemInHand(hand); + if ( + stack.getItem() instanceof MultiblockItem multiblockItem + ) { + useStack = stack; + useHand = hand; + useItem = multiblockItem; + break; + } + } + if (useItem == null) { + return true; + } + final BlockHitResult blockHitResult = (BlockHitResult)hitResult; + final BlockPlaceContext blockPlaceContext = new BlockPlaceContext(player, useHand, useStack, blockHitResult); + final TwoByTwo twoByTwo = useItem.findValidPlacement( + worldRenderContext.world(), + useItem.getBlock().getStateForPlacement(blockPlaceContext), + blockHitResult.getBlockPos().relative(blockHitResult.getDirection()), + blockPlaceContext.getHorizontalDirection() + ); + if (twoByTwo != null) { + //noinspection DataFlowIssue + LevelRenderer.renderLineBox( + worldRenderContext.matrixStack(), + worldRenderContext.consumers().getBuffer(RenderType.lines()), + twoByTwo.toBox(0).expandTowards(1, 1, 1).move( + -blockOutlineContext.cameraX(), + -blockOutlineContext.cameraY(), + -blockOutlineContext.cameraZ() + ), + 0.25f, 0.25f, 1f, 0.6f + ); + } + return true; + }); + try { final CompoundTag compound = NbtIo.readCompressed(GLOBAL_ADVANCEMENTS_FILE); for (final Tag element : compound.getList("Advancements", Tag.TAG_STRING)) { diff --git a/src/main/java/com/fusionflux/portalcubed/items/ExcursionFunnelEmitterBlockItem.java b/src/main/java/com/fusionflux/portalcubed/items/ExcursionFunnelEmitterBlockItem.java index 19dbfd02..d0714fdf 100644 --- a/src/main/java/com/fusionflux/portalcubed/items/ExcursionFunnelEmitterBlockItem.java +++ b/src/main/java/com/fusionflux/portalcubed/items/ExcursionFunnelEmitterBlockItem.java @@ -17,7 +17,7 @@ import java.util.Collection; import java.util.List; -public class ExcursionFunnelEmitterBlockItem extends BlockItem { +public class ExcursionFunnelEmitterBlockItem extends BlockItem implements MultiblockItem { public static final Collection> REQUIRED_PROPERTIES = List.of( ExcursionFunnelEmitterBlock.QUADRANT, BlockStateProperties.FACING ); @@ -50,7 +50,8 @@ protected boolean placeBlock(BlockPlaceContext context, BlockState state) { } @Nullable - protected TwoByTwo findValidPlacement(Level level, BlockState state, BlockPos initial, Direction playerFacing) { + @Override + public TwoByTwo findValidPlacement(Level level, BlockState state, BlockPos initial, Direction playerFacing) { Direction facing = state.getValue(BlockStateProperties.FACING); TwoByTwo bases = findBasePlacements(initial, facing, playerFacing); Direction left = getLeftOf(facing, Direction.SOUTH); diff --git a/src/main/java/com/fusionflux/portalcubed/items/MultiblockItem.java b/src/main/java/com/fusionflux/portalcubed/items/MultiblockItem.java new file mode 100644 index 00000000..a4f31177 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/items/MultiblockItem.java @@ -0,0 +1,16 @@ +package com.fusionflux.portalcubed.items; + +import com.fusionflux.portalcubed.util.TwoByTwo; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +public interface MultiblockItem { + Block getBlock(); + + @Nullable + TwoByTwo findValidPlacement(Level level, BlockState state, BlockPos initial, Direction playerFacing); +} From fa765be457e516d08f071bf184367f83596b3847 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 13 Jul 2023 15:25:42 -0500 Subject: [PATCH 02/26] Handle replaceable blocks correctly --- .../fusionflux/portalcubed/client/PortalCubedClient.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java index d3095db4..f741a5a6 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java +++ b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java @@ -506,10 +506,14 @@ Items.LIGHT, new ResourceLocation("level") } final BlockHitResult blockHitResult = (BlockHitResult)hitResult; final BlockPlaceContext blockPlaceContext = new BlockPlaceContext(player, useHand, useStack, blockHitResult); + BlockPos pos = blockHitResult.getBlockPos(); + if (!worldRenderContext.world().getBlockState(pos).canBeReplaced(blockPlaceContext)) { + pos = pos.relative(blockHitResult.getDirection()); + } final TwoByTwo twoByTwo = useItem.findValidPlacement( worldRenderContext.world(), useItem.getBlock().getStateForPlacement(blockPlaceContext), - blockHitResult.getBlockPos().relative(blockHitResult.getDirection()), + pos, blockPlaceContext.getHorizontalDirection() ); if (twoByTwo != null) { From 0f59da62f7705112b14ac5fa8a25a97a282c6dd6 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 13 Jul 2023 16:29:00 -0500 Subject: [PATCH 03/26] Fix Checkstyle --- .../portalcubed/client/PortalCubedClient.java | 2 +- .../LateRenderedEntitySortingIterator.java | 77 ++- .../entity/ExcursionFunnelRenderer.java | 42 +- .../AnimatedEntityTextures.java | 55 --- .../animated_textures/AnimatedTexture.java | 65 --- .../AnimatedEntityTextures.java | 52 ++ .../animatedtextures/AnimatedTexture.java | 59 +++ .../entity/model/ExcursionFunnelModel.java | 82 ++-- .../portalcubed/data/PortalCubedModels.java | 10 +- .../portalcubed/entity/CorePhysicsEntity.java | 1 - .../PortalCubedTrackedDataHandlers.java | 4 +- .../entity/PortalListeningEntity.java | 30 +- .../entity/beams/EmittedEntity.java | 464 +++++++++--------- .../entity/beams/ExcursionFunnelEntity.java | 310 ++++++------ .../portalcubed/items/PortalGun.java | 1 - .../mixin/EntityPositionSourceAccessor.java | 16 - .../portalcubed/mixin/PlayerMixin.java | 2 - .../mixin/client/SpriteContentsAccessor.java | 10 +- .../mixin/client/TextureAtlasAccessor.java | 15 - .../portalcubed/util/EntityReference.java | 97 ++-- src/main/resources/portalcubed.mixins.json | 2 - 21 files changed, 665 insertions(+), 731 deletions(-) delete mode 100644 src/main/java/com/fusionflux/portalcubed/client/render/entity/animated_textures/AnimatedEntityTextures.java delete mode 100644 src/main/java/com/fusionflux/portalcubed/client/render/entity/animated_textures/AnimatedTexture.java create mode 100644 src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedEntityTextures.java create mode 100644 src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedTexture.java delete mode 100644 src/main/java/com/fusionflux/portalcubed/mixin/EntityPositionSourceAccessor.java delete mode 100644 src/main/java/com/fusionflux/portalcubed/mixin/client/TextureAtlasAccessor.java diff --git a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java index f741a5a6..0173c324 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java +++ b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java @@ -17,7 +17,7 @@ import com.fusionflux.portalcubed.client.render.block.EmissiveSpriteRegistry; import com.fusionflux.portalcubed.client.render.block.entity.*; import com.fusionflux.portalcubed.client.render.entity.*; -import com.fusionflux.portalcubed.client.render.entity.animated_textures.AnimatedEntityTextures; +import com.fusionflux.portalcubed.client.render.entity.animatedtextures.AnimatedEntityTextures; import com.fusionflux.portalcubed.client.render.entity.model.*; import com.fusionflux.portalcubed.client.render.portal.PortalRenderPhase; import com.fusionflux.portalcubed.client.render.portal.PortalRendererImpl; diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/LateRenderedEntitySortingIterator.java b/src/main/java/com/fusionflux/portalcubed/client/render/LateRenderedEntitySortingIterator.java index 35a91e65..5461eec8 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/LateRenderedEntitySortingIterator.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/LateRenderedEntitySortingIterator.java @@ -1,50 +1,49 @@ package com.fusionflux.portalcubed.client.render; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.fusionflux.portalcubed.entity.LateRenderedEntity; import com.google.common.collect.AbstractIterator; - import net.minecraft.world.entity.Entity; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class LateRenderedEntitySortingIterator extends AbstractIterator { - private final Iterator wrapped; - private List lateRendered = null; - private Iterator lateRenderedIterator = null; + private final Iterator wrapped; + private List lateRendered = null; + private Iterator lateRenderedIterator = null; - public LateRenderedEntitySortingIterator(Iterator wrapped) { - this.wrapped = wrapped; - } + public LateRenderedEntitySortingIterator(Iterator wrapped) { + this.wrapped = wrapped; + } - @Override - protected Entity computeNext() { - if (wrapped.hasNext()) { - Entity next = wrapped.next(); - if (next instanceof LateRenderedEntity) { - if (lateRendered == null) // avoid allocating a list when none are present - lateRendered = new ArrayList<>(); - lateRendered.add(next); - return computeNext(); - } else { - return next; - } - } else if (lateRendered != null) { - List late = lateRendered; - // only go down this branch once - lateRendered = null; - if (late.size() == 1) { - return late.get(0); // avoid allocating another iterator when only 1 left - } else { - lateRenderedIterator = late.iterator(); - return computeNext(); - } - } else if (lateRenderedIterator != null && lateRenderedIterator.hasNext()) { - return lateRenderedIterator.next(); - } else { - return endOfData(); - } - } + @Override + protected Entity computeNext() { + if (wrapped.hasNext()) { + Entity next = wrapped.next(); + if (next instanceof LateRenderedEntity) { + if (lateRendered == null) // avoid allocating a list when none are present + lateRendered = new ArrayList<>(); + lateRendered.add(next); + return computeNext(); + } else { + return next; + } + } else if (lateRendered != null) { + List late = lateRendered; + // only go down this branch once + lateRendered = null; + if (late.size() == 1) { + return late.get(0); // avoid allocating another iterator when only 1 left + } else { + lateRenderedIterator = late.iterator(); + return computeNext(); + } + } else if (lateRenderedIterator != null && lateRenderedIterator.hasNext()) { + return lateRenderedIterator.next(); + } else { + return endOfData(); + } + } } diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/entity/ExcursionFunnelRenderer.java b/src/main/java/com/fusionflux/portalcubed/client/render/entity/ExcursionFunnelRenderer.java index e02817b6..2fe68884 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/entity/ExcursionFunnelRenderer.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/entity/ExcursionFunnelRenderer.java @@ -2,39 +2,37 @@ import com.fusionflux.portalcubed.client.render.entity.model.ExcursionFunnelModel; import com.fusionflux.portalcubed.entity.beams.ExcursionFunnelEntity; -import org.jetbrains.annotations.NotNull; - import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider.Context; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; public class ExcursionFunnelRenderer extends EntityRenderer { - public ExcursionFunnelRenderer(Context context) { - super(context); - } + public ExcursionFunnelRenderer(Context context) { + super(context); + } - @Override - public void render(ExcursionFunnelEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight) { - if (entity.model == null) - entity.model = new ExcursionFunnelModel(entity); - ExcursionFunnelModel model = entity.model; - VertexConsumer consumer = buffer.getBuffer(model.renderType(getTextureLocation(entity))); + @Override + public void render(ExcursionFunnelEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight) { + if (entity.model == null) + entity.model = new ExcursionFunnelModel(entity); + ExcursionFunnelModel model = entity.model; + VertexConsumer consumer = buffer.getBuffer(model.renderType(getTextureLocation(entity))); - poseStack.pushPose(); - poseStack.mulPose(entity.getFacing().getRotation()); - model.renderToBuffer(poseStack, consumer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); - poseStack.popPose(); - } + poseStack.pushPose(); + poseStack.mulPose(entity.getFacing().getRotation()); + model.renderToBuffer(poseStack, consumer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); + poseStack.popPose(); + } - @Override - @NotNull - public ResourceLocation getTextureLocation(ExcursionFunnelEntity entity) { - return entity.isReversed() ? ExcursionFunnelModel.REVERSED_TEXTURE : ExcursionFunnelModel.TEXTURE; - } + @Override + @NotNull + public ResourceLocation getTextureLocation(ExcursionFunnelEntity entity) { + return entity.isReversed() ? ExcursionFunnelModel.REVERSED_TEXTURE : ExcursionFunnelModel.TEXTURE; + } } diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/entity/animated_textures/AnimatedEntityTextures.java b/src/main/java/com/fusionflux/portalcubed/client/render/entity/animated_textures/AnimatedEntityTextures.java deleted file mode 100644 index 0b008031..00000000 --- a/src/main/java/com/fusionflux/portalcubed/client/render/entity/animated_textures/AnimatedEntityTextures.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fusionflux.portalcubed.client.render.entity.animated_textures; - -import java.util.Set; - -import com.fusionflux.portalcubed.PortalCubed; -import org.jetbrains.annotations.NotNull; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.DynamicTexture; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.resources.FileToIdConverter; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.PackType; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.server.packs.resources.SimplePreparableReloadListener; -import net.minecraft.util.profiling.ProfilerFiller; - -import org.quiltmc.qsl.resource.loader.api.ResourceLoader; -import org.quiltmc.qsl.resource.loader.api.reloader.IdentifiableResourceReloader; -import org.quiltmc.qsl.resource.loader.api.reloader.ResourceReloaderKeys.Client; - -public class AnimatedEntityTextures { - - public static void init() { - ResourceLoader loader = ResourceLoader.get(PackType.CLIENT_RESOURCES); - loader.registerReloader(Reloader.INSTANCE); - loader.addReloaderOrdering(Client.TEXTURES, Reloader.ID); - } - - private static class Reloader extends SimplePreparableReloadListener> implements IdentifiableResourceReloader { - public static final ResourceLocation ID = PortalCubed.id("animated_entity_textures"); - public static final FileToIdConverter LISTER = new FileToIdConverter("textures/animated_entity", ".png"); - public static final Reloader INSTANCE = new Reloader(); - - @Override - @NotNull - protected Set prepare(ResourceManager manager, ProfilerFiller profiler) { - return LISTER.listMatchingResources(manager).keySet(); - } - - @Override - protected void apply(Set textures, ResourceManager manager, ProfilerFiller profiler) { - TextureManager textureManager = Minecraft.getInstance().getTextureManager(); - for (ResourceLocation texture : textures) { - textureManager.register(texture, new AnimatedTexture(texture)); - } - } - - @Override - @NotNull - public ResourceLocation getQuiltId() { - return ID; - } - } -} diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/entity/animated_textures/AnimatedTexture.java b/src/main/java/com/fusionflux/portalcubed/client/render/entity/animated_textures/AnimatedTexture.java deleted file mode 100644 index 705cc223..00000000 --- a/src/main/java/com/fusionflux/portalcubed/client/render/entity/animated_textures/AnimatedTexture.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.fusionflux.portalcubed.client.render.entity.animated_textures; - -import java.io.IOException; - -import com.fusionflux.portalcubed.mixin.client.SpriteContentsAccessor; - -import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.platform.TextureUtil; -import com.mojang.blaze3d.systems.RenderSystem; - -import net.minecraft.client.renderer.texture.AbstractTexture; -import net.minecraft.client.renderer.texture.SpriteContents; -import net.minecraft.client.renderer.texture.SpriteLoader; -import net.minecraft.client.renderer.texture.SpriteTicker; -import net.minecraft.client.renderer.texture.Tickable; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.Resource; -import net.minecraft.server.packs.resources.ResourceManager; - -public class AnimatedTexture extends AbstractTexture implements Tickable { - public final ResourceLocation texture; - - private SpriteContents contents; - private SpriteTicker ticker; - - public AnimatedTexture(ResourceLocation texture) { - this.texture = texture; - } - - @Override - public void load(ResourceManager manager) throws IOException { - Resource resource = manager.getResourceOrThrow(texture); - this.contents = SpriteLoader.loadSprite(texture, resource); - if (contents instanceof SpriteContentsAccessor access) { // != null - NativeImage image = access.getOriginalImage(); - if (RenderSystem.isOnRenderThreadOrInit()) { - init(image); - } else { - RenderSystem.recordRenderCall(() -> init(image)); - } - this.ticker = contents.createTicker(); - } - } - - private void init(NativeImage image) { - TextureUtil.prepareImage(this.getId(), 0, image.getWidth(), image.getHeight()); - contents.uploadFirstFrame(0, 0); - } - - @Override - public void tick() { - if (ticker != null) { - if (RenderSystem.isOnRenderThread()) { - cycle(); - } else { - RenderSystem.recordRenderCall(this::cycle); - } - } - } - - private void cycle() { - bind(); - ticker.tickAndUpload(0, 0); - } -} diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedEntityTextures.java b/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedEntityTextures.java new file mode 100644 index 00000000..a15dddc2 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedEntityTextures.java @@ -0,0 +1,52 @@ +package com.fusionflux.portalcubed.client.render.entity.animatedtextures; + +import com.fusionflux.portalcubed.PortalCubed; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.resources.FileToIdConverter; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.SimplePreparableReloadListener; +import net.minecraft.util.profiling.ProfilerFiller; +import org.jetbrains.annotations.NotNull; +import org.quiltmc.qsl.resource.loader.api.ResourceLoader; +import org.quiltmc.qsl.resource.loader.api.reloader.IdentifiableResourceReloader; +import org.quiltmc.qsl.resource.loader.api.reloader.ResourceReloaderKeys.Client; + +import java.util.Set; + +public class AnimatedEntityTextures { + + public static void init() { + ResourceLoader loader = ResourceLoader.get(PackType.CLIENT_RESOURCES); + loader.registerReloader(Reloader.INSTANCE); + loader.addReloaderOrdering(Client.TEXTURES, Reloader.ID); + } + + private static class Reloader extends SimplePreparableReloadListener> implements IdentifiableResourceReloader { + public static final ResourceLocation ID = PortalCubed.id("animated_entity_textures"); + public static final FileToIdConverter LISTER = new FileToIdConverter("textures/animated_entity", ".png"); + public static final Reloader INSTANCE = new Reloader(); + + @Override + @NotNull + protected Set prepare(ResourceManager manager, ProfilerFiller profiler) { + return LISTER.listMatchingResources(manager).keySet(); + } + + @Override + protected void apply(Set textures, ResourceManager manager, ProfilerFiller profiler) { + TextureManager textureManager = Minecraft.getInstance().getTextureManager(); + for (ResourceLocation texture : textures) { + textureManager.register(texture, new AnimatedTexture(texture)); + } + } + + @Override + @NotNull + public ResourceLocation getQuiltId() { + return ID; + } + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedTexture.java b/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedTexture.java new file mode 100644 index 00000000..fa60f85b --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedTexture.java @@ -0,0 +1,59 @@ +package com.fusionflux.portalcubed.client.render.entity.animatedtextures; + +import com.fusionflux.portalcubed.mixin.client.SpriteContentsAccessor; +import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.blaze3d.platform.TextureUtil; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.renderer.texture.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; + +import java.io.IOException; + +public class AnimatedTexture extends AbstractTexture implements Tickable { + public final ResourceLocation texture; + + private SpriteContents contents; + private SpriteTicker ticker; + + public AnimatedTexture(ResourceLocation texture) { + this.texture = texture; + } + + @Override + public void load(ResourceManager manager) throws IOException { + Resource resource = manager.getResourceOrThrow(texture); + this.contents = SpriteLoader.loadSprite(texture, resource); + if (contents instanceof SpriteContentsAccessor access) { // != null + NativeImage image = access.getOriginalImage(); + if (RenderSystem.isOnRenderThreadOrInit()) { + init(image); + } else { + RenderSystem.recordRenderCall(() -> init(image)); + } + this.ticker = contents.createTicker(); + } + } + + private void init(NativeImage image) { + TextureUtil.prepareImage(this.getId(), 0, image.getWidth(), image.getHeight()); + contents.uploadFirstFrame(0, 0); + } + + @Override + public void tick() { + if (ticker != null) { + if (RenderSystem.isOnRenderThread()) { + cycle(); + } else { + RenderSystem.recordRenderCall(this::cycle); + } + } + } + + private void cycle() { + bind(); + ticker.tickAndUpload(0, 0); + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/entity/model/ExcursionFunnelModel.java b/src/main/java/com/fusionflux/portalcubed/client/render/entity/model/ExcursionFunnelModel.java index 7e4a41db..87298f97 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/entity/model/ExcursionFunnelModel.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/entity/model/ExcursionFunnelModel.java @@ -1,14 +1,10 @@ package com.fusionflux.portalcubed.client.render.entity.model; -import java.util.Set; - import com.fusionflux.portalcubed.PortalCubed; import com.fusionflux.portalcubed.entity.beams.EmittedEntity; import com.fusionflux.portalcubed.entity.beams.ExcursionFunnelEntity; - import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.Model; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; @@ -20,47 +16,49 @@ import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; +import java.util.Set; + public class ExcursionFunnelModel extends Model { - public static final Set VISIBLE_MIDDLE = Set.of(Direction.DOWN, Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST); - public static final Set VISIBLE_END = Set.of(Direction.values()); - public static final ResourceLocation TEXTURE = PortalCubed.id("textures/animated_entity/excursion_funnel_beam_forward.png"); - public static final ResourceLocation REVERSED_TEXTURE = PortalCubed.id("textures/animated_entity/excursion_funnel_beam_reversed.png"); - private ModelPart part; + public static final Set VISIBLE_MIDDLE = Set.of(Direction.DOWN, Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST); + public static final Set VISIBLE_END = Set.of(Direction.values()); + public static final ResourceLocation TEXTURE = PortalCubed.id("textures/animated_entity/excursion_funnel_beam_forward.png"); + public static final ResourceLocation REVERSED_TEXTURE = PortalCubed.id("textures/animated_entity/excursion_funnel_beam_reversed.png"); + private ModelPart part; - public ExcursionFunnelModel(ExcursionFunnelEntity entity) { - super(RenderType::entityTranslucent); - entity.modelUpdater = this::rebuildGeometry; - this.rebuildGeometry(entity); - } + public ExcursionFunnelModel(ExcursionFunnelEntity entity) { + super(RenderType::entityTranslucent); + entity.modelUpdater = this::rebuildGeometry; + this.rebuildGeometry(entity); + } - public void rebuildGeometry(EmittedEntity entity) { - MeshDefinition mesh = new MeshDefinition(); - PartDefinition root = mesh.getRoot(); - // this hurts my soul, but I don't know if improving it is possible - float length = entity.getLength(); - float tinyOffset = (entity.getId() % 20) / 10_000f; // avoids Z fighting when crossing - for (int block = 0; block < length; block++) { - float sectionLength = Math.min(length - block, 1); - boolean last = block + 1 >= length; - root.addOrReplaceChild( - "cube_" + block, - CubeListBuilder.create() - .texOffs(0, 0) - .addBox( - -15 + tinyOffset, block * 16 + tinyOffset, -15 + tinyOffset, - 30, sectionLength * 16, 30, - last ? VISIBLE_END : VISIBLE_MIDDLE - ), - PartPose.ZERO - ); - } + public void rebuildGeometry(EmittedEntity entity) { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition root = mesh.getRoot(); + // this hurts my soul, but I don't know if improving it is possible + float length = entity.getLength(); + float tinyOffset = (entity.getId() % 20) / 10_000f; // avoids Z fighting when crossing + for (int block = 0; block < length; block++) { + float sectionLength = Math.min(length - block, 1); + boolean last = block + 1 >= length; + root.addOrReplaceChild( + "cube_" + block, + CubeListBuilder.create() + .texOffs(0, 0) + .addBox( + -15 + tinyOffset, block * 16 + tinyOffset, -15 + tinyOffset, + 30, sectionLength * 16, 30, + last ? VISIBLE_END : VISIBLE_MIDDLE + ), + PartPose.ZERO + ); + } - this.part = LayerDefinition.create(mesh,120, 1472).bakeRoot(); - } + this.part = LayerDefinition.create(mesh, 120, 1472).bakeRoot(); + } - @Override - public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, - int packedOverlay, float red, float green, float blue, float alpha) { - this.part.render(poseStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); - } + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, + int packedOverlay, float red, float green, float blue, float alpha) { + this.part.render(poseStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } } diff --git a/src/main/java/com/fusionflux/portalcubed/data/PortalCubedModels.java b/src/main/java/com/fusionflux/portalcubed/data/PortalCubedModels.java index 00c19f0b..fdd7fdfa 100644 --- a/src/main/java/com/fusionflux/portalcubed/data/PortalCubedModels.java +++ b/src/main/java/com/fusionflux/portalcubed/data/PortalCubedModels.java @@ -2,22 +2,16 @@ import com.fusionflux.portalcubed.PortalCubed; import com.fusionflux.portalcubed.blocks.PortalCubedBlocks; -import com.fusionflux.portalcubed.blocks.bridge.HardLightBridgePart; import com.fusionflux.portalcubed.blocks.bridge.HardLightBridgeEmitterBlock; +import com.fusionflux.portalcubed.blocks.bridge.HardLightBridgePart; import com.fusionflux.portalcubed.blocks.funnel.ExcursionFunnelEmitterBlock; import com.fusionflux.portalcubed.blocks.funnel.ExcursionFunnelEmitterBlock.Mode; -import com.fusionflux.portalcubed.blocks.funnel.TwoByTwoFacingMultiblockBlock; import com.google.gson.JsonObject; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider; - import net.minecraft.data.models.BlockModelGenerators; import net.minecraft.data.models.ItemModelGenerators; -import net.minecraft.data.models.blockstates.BlockStateGenerator; -import net.minecraft.data.models.blockstates.MultiVariantGenerator; -import net.minecraft.data.models.blockstates.PropertyDispatch; -import net.minecraft.data.models.blockstates.Variant; -import net.minecraft.data.models.blockstates.VariantProperties; +import net.minecraft.data.models.blockstates.*; import net.minecraft.data.models.model.ModelLocationUtils; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; diff --git a/src/main/java/com/fusionflux/portalcubed/entity/CorePhysicsEntity.java b/src/main/java/com/fusionflux/portalcubed/entity/CorePhysicsEntity.java index 6426830a..62869b8f 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/CorePhysicsEntity.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/CorePhysicsEntity.java @@ -5,7 +5,6 @@ import com.fusionflux.gravity_api.util.RotationUtil; import com.fusionflux.portalcubed.accessor.EntityExt; import com.fusionflux.portalcubed.accessor.LevelExt; -import com.fusionflux.portalcubed.blocks.PortalCubedBlocks; import com.fusionflux.portalcubed.client.packet.PortalCubedClientPackets; import com.fusionflux.portalcubed.compat.rayon.RayonIntegration; import com.fusionflux.portalcubed.items.PortalCubedItems; diff --git a/src/main/java/com/fusionflux/portalcubed/entity/PortalCubedTrackedDataHandlers.java b/src/main/java/com/fusionflux/portalcubed/entity/PortalCubedTrackedDataHandlers.java index 9ff0c538..cbf22d45 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/PortalCubedTrackedDataHandlers.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/PortalCubedTrackedDataHandlers.java @@ -1,12 +1,10 @@ package com.fusionflux.portalcubed.entity; +import com.fusionflux.portalcubed.util.LerpedQuaternion; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; - -import com.fusionflux.portalcubed.util.LerpedQuaternion; import org.joml.Quaternionf; import org.quiltmc.qsl.entity.networking.api.tracked_data.QuiltTrackedDataHandlerRegistry; diff --git a/src/main/java/com/fusionflux/portalcubed/entity/PortalListeningEntity.java b/src/main/java/com/fusionflux/portalcubed/entity/PortalListeningEntity.java index 137a4c9f..e0675d30 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/PortalListeningEntity.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/PortalListeningEntity.java @@ -9,24 +9,24 @@ * An entity that listens for placement and removal of portals near it. */ public abstract class PortalListeningEntity extends Entity { - public static final EntityTypeTest TYPE_TEST = EntityTypeTest.forClass(PortalListeningEntity.class); + public static final EntityTypeTest TYPE_TEST = EntityTypeTest.forClass(PortalListeningEntity.class); - public PortalListeningEntity(EntityType variant, Level world) { - super(variant, world); - } + public PortalListeningEntity(EntityType variant, Level world) { + super(variant, world); + } - /** - * Called when a portal is created anywhere in the world. Add listeners here. - */ - public void onPortalCreate(Portal portal) { - } + /** + * Called when a portal is created anywhere in the world. Add listeners here. + */ + public void onPortalCreate(Portal portal) { + } - // these methods are only fired for listeners registered to the portal. - // don't add listeners to the portal here, that should be queued for later. + // these methods are only fired for listeners registered to the portal. + // don't add listeners to the portal here, that should be queued for later. - public void onPortalRemove(Portal portal) { - } + public void onPortalRemove(Portal portal) { + } - public void onLinkedPortalCreate(Portal portal, Portal linked) { - } + public void onLinkedPortalCreate(Portal portal, Portal linked) { + } } diff --git a/src/main/java/com/fusionflux/portalcubed/entity/beams/EmittedEntity.java b/src/main/java/com/fusionflux/portalcubed/entity/beams/EmittedEntity.java index bf92cbae..49d7f19b 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/beams/EmittedEntity.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/beams/EmittedEntity.java @@ -1,19 +1,9 @@ package com.fusionflux.portalcubed.entity.beams; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.UUID; -import java.util.function.Consumer; - import com.fusionflux.portalcubed.entity.Portal; import com.fusionflux.portalcubed.entity.PortalCubedEntities; import com.fusionflux.portalcubed.entity.PortalListeningEntity; import com.fusionflux.portalcubed.util.NbtHelper; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.joml.Vector2d; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -30,230 +20,238 @@ import net.minecraft.world.level.entity.EntityTypeTest; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; - +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector2d; import org.quiltmc.qsl.entity.networking.api.extended_spawn_data.QuiltExtendedSpawnDataEntity; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.function.Consumer; + public abstract class EmittedEntity extends PortalListeningEntity implements QuiltExtendedSpawnDataEntity { - public static final int MAX_LENGTH = 100; - public static final EntityTypeTest TYPE_TEST = EntityTypeTest.forClass(EmittedEntity.class); - public static final EntityDataAccessor FACING = SynchedEntityData.defineId(EmittedEntity.class, EntityDataSerializers.DIRECTION); - public static final EntityDataAccessor LENGTH = SynchedEntityData.defineId(EmittedEntity.class, EntityDataSerializers.FLOAT); - - private Direction facing = Direction.NORTH; - private float length = 1; - private float targetLength = 1; - private Vec3 center = Vec3.ZERO; - private AABB listeningArea = new AABB(BlockPos.ZERO); - private int reEmitTimer; - - // UUID of next in line. resolving this will always work, since the first entity - // is the only one that can be unloaded (others are chunk loaded by portals) - @Nullable private UUID next; - // portal this is being emitted from - @Nullable private UUID sourcePortal; - - public Consumer modelUpdater = entity -> {}; - - public EmittedEntity(EntityType entityType, Level level) { - super(entityType, level); - setBoundingBox(makeBoundingBox()); - } - - public void setFacing(Direction facing) { - entityData.set(FACING, facing); - } - - public Direction getFacing() { - // null on initial load during super call - return facing == null ? Direction.NORTH : facing; - } - - public void setLength(float length) { - entityData.set(LENGTH, length); - } - - public float getLength() { - return length; - } - - public Vec3 getCenter() { - return center; - } - - public boolean listensTo(BlockPos pos) { - return isAlive() && listeningArea.contains(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5); - } - - protected abstract AABB makeBaseBoundingBox(); - - protected abstract EmittedEntity createNext(); - - @Override - @NotNull - protected AABB makeBoundingBox() { - AABB base = makeBaseBoundingBox(); - Vec3 pos = position(); - Vec3 offset = pos.relative(getFacing(), getLength()).subtract(pos); // relative offset along facing by length - this.center = base.getCenter(); - AABB bounds = base.expandTowards(offset); - Direction facing = getFacing(); - Vec3 facingNormal = Vec3.ZERO.with(facing.getAxis(), facing.getAxisDirection().getStep()); - this.listeningArea = bounds.expandTowards(facingNormal); - return bounds; - } - - public void reEmit() { - reEmit(targetLength); - } - - public void reEmit(float maxLength) { - removeNextEntity(); // remove existing emitted entities - this.targetLength = maxLength; - Level level = level(); - Direction facing = getFacing(); - Axis facingAxis = facing.getAxis(); - AABB bounds = makeBaseBoundingBox(); - // relative offset along facing by maxLength - Vec3 offset = Vec3.ZERO.with(facingAxis, maxLength * facing.getAxisDirection().getStep()); - // how far the hitbox can actually move - Vec3 actualOffset = Entity.collideBoundingBox(null, offset, bounds, level, List.of()); - double size = facingAxis.choose(bounds.getXsize(), bounds.getYsize(), bounds.getZsize()); - float length = (float) (actualOffset.length() + size / 2); - setLength(length); - - if (maxLength - length > 0.1) { // don't bother with going through portals if too short - AABB portalArea = bounds.move(actualOffset).expandTowards(actualOffset.normalize().scale(0.25)); - List portals = level.getEntities(PortalCubedEntities.PORTAL, portalArea, this::isPortalAligned); - if (!portals.isEmpty()) { - if (portals.size() != 1) { // prefer nearest portal when multiple present - portals.sort(Comparator.comparingDouble(this::distanceToSqr)); - } - - Portal portal = portals.get(0); - portal.addListener(this); - - Portal linked = portal.findLinkedPortal(); - if (linked != null) { // if already active, emit through - Vector2d planeCoords = portal.getLocalPlaneCoords(position()); - Vec3 otherSidePos = linked.getPointInPlane(-planeCoords.x, planeCoords.y); // -x: mirror - Direction otherFacing = linked.getFacingDirection(); - - EmittedEntity nextEntity = createNext(); - nextEntity.setPos(otherSidePos); - nextEntity.setFacing(otherFacing); - nextEntity.reEmit(maxLength - length); - nextEntity.sourcePortal = linked.getUUID(); - linked.addListener(nextEntity); - level.addFreshEntity(nextEntity); - - this.next = nextEntity.getUUID(); - } - } - } - } - - @Override - public void tick() { - super.tick(); - reEmitTimer--; - if (reEmitTimer == 0) { - reEmit(); - } - } - - @Override - public void remove(RemovalReason reason) { - super.remove(reason); - if (reason.shouldDestroy()) - removeNextEntity(); - } - - private void removeNextEntity() { - if (next != null && level() instanceof ServerLevel level) { - Entity next = level.getEntity(this.next); - if (next != null) { - next.remove(RemovalReason.DISCARDED); - } - this.next = null; - } - } - - @Override - protected void defineSynchedData() { - entityData.define(FACING, Direction.NORTH); - entityData.define(LENGTH, 1f); - } - - @Override - public void onSyncedDataUpdated(EntityDataAccessor key) { - super.onSyncedDataUpdated(key); - if (FACING.equals(key)) { - this.facing = entityData.get(FACING); - updateBounds(); - } else if (LENGTH.equals(key)) { - this.length = entityData.get(LENGTH); - updateBounds(); - } - } - - @Override - public void writeAdditionalSpawnData(FriendlyByteBuf buf) { - buf.writeEnum(facing); - buf.writeFloat(length); - } - - @Override - public void readAdditionalSpawnData(FriendlyByteBuf buf) { - this.facing = buf.readEnum(Direction.class); - this.length = buf.readFloat(); - } - - @Override - protected void addAdditionalSaveData(CompoundTag tag) { - tag.putString("facing", facing.getSerializedName()); - tag.putFloat("length", length); - tag.putFloat("targetLength", targetLength); - if (sourcePortal != null) - tag.putUUID("sourcePortal", sourcePortal); - } - - @Override - protected void readAdditionalSaveData(CompoundTag tag) { - setFacing(NbtHelper.readEnum(tag, "facing", Direction.NORTH)); - if (tag.contains("length", Tag.TAG_FLOAT)) - setLength(tag.getFloat("length")); - if (tag.contains("targetLength", Tag.TAG_FLOAT)) - this.targetLength = tag.getFloat("targetLength"); - if (tag.contains("sourcePortal", Tag.TAG_INT_ARRAY)) - this.sourcePortal = tag.getUUID("sourcePortal"); - } - - private void updateBounds() { - setBoundingBox(makeBoundingBox()); - modelUpdater.accept(this); - } - - public boolean isPortalAligned(Portal portal) { - return portal.isAlive() && getFacing().getOpposite() == portal.getFacingDirection(); - } - - @Override - public void onPortalCreate(Portal portal) { - if (getFacing().getOpposite() == portal.getFacingDirection()) - reEmitTimer = 3; // direction aligns, try to emit through (next tick, portal not ready) - } - - @Override - public void onPortalRemove(Portal portal) { - if (Objects.equals(sourcePortal, portal.getUUID())) { - discard(); // source removed - } else { - removeNextEntity(); // going into the portal, remove on other side - } - } - - @Override - public void onLinkedPortalCreate(Portal portal, Portal linked) { - reEmitTimer = 3; - } + public static final int MAX_LENGTH = 100; + public static final EntityTypeTest TYPE_TEST = EntityTypeTest.forClass(EmittedEntity.class); + public static final EntityDataAccessor FACING = SynchedEntityData.defineId(EmittedEntity.class, EntityDataSerializers.DIRECTION); + public static final EntityDataAccessor LENGTH = SynchedEntityData.defineId(EmittedEntity.class, EntityDataSerializers.FLOAT); + + private Direction facing = Direction.NORTH; + private float length = 1; + private float targetLength = 1; + private Vec3 center = Vec3.ZERO; + private AABB listeningArea = new AABB(BlockPos.ZERO); + private int reEmitTimer; + + // UUID of next in line. resolving this will always work, since the first entity + // is the only one that can be unloaded (others are chunk loaded by portals) + @Nullable private UUID next; + // portal this is being emitted from + @Nullable private UUID sourcePortal; + + public Consumer modelUpdater = entity -> {}; + + public EmittedEntity(EntityType entityType, Level level) { + super(entityType, level); + setBoundingBox(makeBoundingBox()); + } + + public void setFacing(Direction facing) { + entityData.set(FACING, facing); + } + + public Direction getFacing() { + // null on initial load during super call + return facing == null ? Direction.NORTH : facing; + } + + public void setLength(float length) { + entityData.set(LENGTH, length); + } + + public float getLength() { + return length; + } + + public Vec3 getCenter() { + return center; + } + + public boolean listensTo(BlockPos pos) { + return isAlive() && listeningArea.contains(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5); + } + + protected abstract AABB makeBaseBoundingBox(); + + protected abstract EmittedEntity createNext(); + + @Override + @NotNull + protected AABB makeBoundingBox() { + AABB base = makeBaseBoundingBox(); + Vec3 pos = position(); + Vec3 offset = pos.relative(getFacing(), getLength()).subtract(pos); // relative offset along facing by length + this.center = base.getCenter(); + AABB bounds = base.expandTowards(offset); + Direction facing = getFacing(); + Vec3 facingNormal = Vec3.ZERO.with(facing.getAxis(), facing.getAxisDirection().getStep()); + this.listeningArea = bounds.expandTowards(facingNormal); + return bounds; + } + + public void reEmit() { + reEmit(targetLength); + } + + public void reEmit(float maxLength) { + removeNextEntity(); // remove existing emitted entities + this.targetLength = maxLength; + Level level = level(); + Direction facing = getFacing(); + Axis facingAxis = facing.getAxis(); + AABB bounds = makeBaseBoundingBox(); + // relative offset along facing by maxLength + Vec3 offset = Vec3.ZERO.with(facingAxis, maxLength * facing.getAxisDirection().getStep()); + // how far the hitbox can actually move + Vec3 actualOffset = Entity.collideBoundingBox(null, offset, bounds, level, List.of()); + double size = facingAxis.choose(bounds.getXsize(), bounds.getYsize(), bounds.getZsize()); + float length = (float) (actualOffset.length() + size / 2); + setLength(length); + + if (maxLength - length > 0.1) { // don't bother with going through portals if too short + AABB portalArea = bounds.move(actualOffset).expandTowards(actualOffset.normalize().scale(0.25)); + List portals = level.getEntities(PortalCubedEntities.PORTAL, portalArea, this::isPortalAligned); + if (!portals.isEmpty()) { + if (portals.size() != 1) { // prefer nearest portal when multiple present + portals.sort(Comparator.comparingDouble(this::distanceToSqr)); + } + + Portal portal = portals.get(0); + portal.addListener(this); + + Portal linked = portal.findLinkedPortal(); + if (linked != null) { // if already active, emit through + Vector2d planeCoords = portal.getLocalPlaneCoords(position()); + Vec3 otherSidePos = linked.getPointInPlane(-planeCoords.x, planeCoords.y); // -x: mirror + Direction otherFacing = linked.getFacingDirection(); + + EmittedEntity nextEntity = createNext(); + nextEntity.setPos(otherSidePos); + nextEntity.setFacing(otherFacing); + nextEntity.reEmit(maxLength - length); + nextEntity.sourcePortal = linked.getUUID(); + linked.addListener(nextEntity); + level.addFreshEntity(nextEntity); + + this.next = nextEntity.getUUID(); + } + } + } + } + + @Override + public void tick() { + super.tick(); + reEmitTimer--; + if (reEmitTimer == 0) { + reEmit(); + } + } + + @Override + public void remove(RemovalReason reason) { + super.remove(reason); + if (reason.shouldDestroy()) + removeNextEntity(); + } + + private void removeNextEntity() { + if (next != null && level() instanceof ServerLevel level) { + Entity next = level.getEntity(this.next); + if (next != null) { + next.remove(RemovalReason.DISCARDED); + } + this.next = null; + } + } + + @Override + protected void defineSynchedData() { + entityData.define(FACING, Direction.NORTH); + entityData.define(LENGTH, 1f); + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor key) { + super.onSyncedDataUpdated(key); + if (FACING.equals(key)) { + this.facing = entityData.get(FACING); + updateBounds(); + } else if (LENGTH.equals(key)) { + this.length = entityData.get(LENGTH); + updateBounds(); + } + } + + @Override + public void writeAdditionalSpawnData(FriendlyByteBuf buf) { + buf.writeEnum(facing); + buf.writeFloat(length); + } + + @Override + public void readAdditionalSpawnData(FriendlyByteBuf buf) { + this.facing = buf.readEnum(Direction.class); + this.length = buf.readFloat(); + } + + @Override + protected void addAdditionalSaveData(CompoundTag tag) { + tag.putString("facing", facing.getSerializedName()); + tag.putFloat("length", length); + tag.putFloat("targetLength", targetLength); + if (sourcePortal != null) + tag.putUUID("sourcePortal", sourcePortal); + } + + @Override + protected void readAdditionalSaveData(CompoundTag tag) { + setFacing(NbtHelper.readEnum(tag, "facing", Direction.NORTH)); + if (tag.contains("length", Tag.TAG_FLOAT)) + setLength(tag.getFloat("length")); + if (tag.contains("targetLength", Tag.TAG_FLOAT)) + this.targetLength = tag.getFloat("targetLength"); + if (tag.contains("sourcePortal", Tag.TAG_INT_ARRAY)) + this.sourcePortal = tag.getUUID("sourcePortal"); + } + + private void updateBounds() { + setBoundingBox(makeBoundingBox()); + modelUpdater.accept(this); + } + + public boolean isPortalAligned(Portal portal) { + return portal.isAlive() && getFacing().getOpposite() == portal.getFacingDirection(); + } + + @Override + public void onPortalCreate(Portal portal) { + if (getFacing().getOpposite() == portal.getFacingDirection()) + reEmitTimer = 3; // direction aligns, try to emit through (next tick, portal not ready) + } + + @Override + public void onPortalRemove(Portal portal) { + if (Objects.equals(sourcePortal, portal.getUUID())) { + discard(); // source removed + } else { + removeNextEntity(); // going into the portal, remove on other side + } + } + + @Override + public void onLinkedPortalCreate(Portal portal, Portal linked) { + reEmitTimer = 3; + } } diff --git a/src/main/java/com/fusionflux/portalcubed/entity/beams/ExcursionFunnelEntity.java b/src/main/java/com/fusionflux/portalcubed/entity/beams/ExcursionFunnelEntity.java index 7bc3e813..484e9059 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/beams/ExcursionFunnelEntity.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/beams/ExcursionFunnelEntity.java @@ -1,7 +1,5 @@ package com.fusionflux.portalcubed.entity.beams; -import java.util.List; - import com.fusionflux.portalcubed.accessor.EntityExt; import com.fusionflux.portalcubed.accessor.HasMovementInputAccessor; import com.fusionflux.portalcubed.client.render.entity.model.ExcursionFunnelModel; @@ -9,7 +7,6 @@ import com.fusionflux.portalcubed.entity.LateRenderedEntity; import com.fusionflux.portalcubed.entity.PortalCubedEntities; import com.fusionflux.portalcubed.sound.ExcursionFunnelEnterSoundInstance; - import net.minecraft.client.Minecraft; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -25,160 +22,161 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; - import org.quiltmc.loader.api.minecraft.ClientOnly; +import java.util.List; + public class ExcursionFunnelEntity extends EmittedEntity implements LateRenderedEntity { - public static final EntityDataAccessor REVERSED = SynchedEntityData.defineId(ExcursionFunnelEntity.class, EntityDataSerializers.BOOLEAN); - - public static final float SIZE = (30 / 32f) * 2; - - private boolean reversed; - - @ClientOnly - public ExcursionFunnelModel model; - - public ExcursionFunnelEntity(EntityType entityType, Level level) { - super(entityType, level); - } - - public static ExcursionFunnelEntity spawnAndEmit(Level level, Vec3 pos, Direction facing, boolean reversed, float length) { - ExcursionFunnelEntity entity = new ExcursionFunnelEntity(PortalCubedEntities.EXCURSION_FUNNEL, level); - entity.setPos(pos); - entity.setFacing(facing); - entity.setReversed(reversed); - - entity.reEmit(length); - level.addFreshEntity(entity); - return entity; - } - - @Override - protected EmittedEntity createNext() { - ExcursionFunnelEntity entity = new ExcursionFunnelEntity(PortalCubedEntities.EXCURSION_FUNNEL, level()); - entity.setReversed(isReversed()); - return entity; - } - - public boolean isReversed() { - return reversed; - } - - public void setReversed(boolean reversed) { - entityData.set(REVERSED, reversed); - } - - @Override - protected void defineSynchedData() { - super.defineSynchedData(); - entityData.define(REVERSED, false); - } - - @Override - public void onSyncedDataUpdated(EntityDataAccessor key) { - super.onSyncedDataUpdated(key); - if (key.equals(REVERSED)) { - this.reversed = entityData.get(REVERSED); - } - } - - @Override - public void writeAdditionalSpawnData(FriendlyByteBuf buf) { - super.writeAdditionalSpawnData(buf); - buf.writeBoolean(reversed); - } - - @Override - public void readAdditionalSpawnData(FriendlyByteBuf buf) { - super.readAdditionalSpawnData(buf); - this.reversed = buf.readBoolean(); - } - - @Override - protected void addAdditionalSaveData(CompoundTag tag) { - super.addAdditionalSaveData(tag); - tag.putBoolean("reversed", reversed); - } - - @Override - protected void readAdditionalSaveData(CompoundTag tag) { - super.readAdditionalSaveData(tag); - setReversed(tag.getBoolean("reversed")); - } - - @Override - protected AABB makeBaseBoundingBox() { - Direction facing = this.getFacing(); - Axis axis = facing.getAxis(); - Vec3 pos = position(); - return AABB.ofSize(pos, axis.choose(0, SIZE, SIZE), axis.choose(SIZE, 0, SIZE), axis.choose(SIZE, SIZE, 0)); - } - - @Override - public void tick() { - super.tick(); - Level level = level(); - List colliding = level.getEntitiesOfClass(LivingEntity.class, getBoundingBox(), Entity::isAlive); - if (!colliding.isEmpty()) { - Direction facing = getFacing(); - Direction motion = isReversed() ? facing.getOpposite() : facing; - Vec3 center = getCenter(); - for (LivingEntity entity : colliding) { - applyEffects(entity, center, motion); - } - } - } - - public static void applyEffects(Entity entity, Vec3 tubeCenter, Direction motionDirection) { - if (entity instanceof Player player && player.getAbilities().flying) - return; - Vec3 entityCenter = entity.getBoundingBox().getCenter(); - Vec3 motion = Vec3.atLowerCornerOf(motionDirection.getNormal()).scale(0.125); - - RayonIntegration.INSTANCE.setNoGravity(entity, true); - entity.resetFallDistance(); - - EntityExt entityEx = (EntityExt) entity; - if (!entityEx.isInFunnel()) { - entityEx.setInFunnel(true); - entity.setDeltaMovement(0, 0, 0); - if (entity instanceof Player player && player.isLocalPlayer()) - playEnterSound(); - } - entityEx.setFunnelTimer(2); - - Vec3 velocity = entity.getDeltaMovement(); - // check for inputs - if (entity instanceof HasMovementInputAccessor inputProvider && inputProvider.hasMovementInputPublic()) { - if (motion.x == 0) - motion = motion.add(velocity.x, 0, 0); - if (motion.y == 0) - motion = motion.add(0, velocity.y, 0); - if (motion.z == 0) - motion = motion.add(0, 0, velocity.z); - } - - // move entity towards center - double dx = entityCenter.x - tubeCenter.x + velocity.x; - double dy = entityCenter.y - tubeCenter.y + velocity.y; - double dz = entityCenter.z - tubeCenter.z + velocity.z; - - if (motion.x == 0) - motion = motion.add(-Math.copySign(Math.sqrt(Math.abs(dx)), dx) / 20, 0, 0); - if (motion.y == 0) - motion = motion.add(0, -Math.copySign(Math.sqrt(Math.abs(dy)), dy) / 20, 0); - if (motion.z == 0) - motion = motion.add(0, 0, -Math.copySign(Math.sqrt(Math.abs(dz)), dz) / 20); - - entity.setDeltaMovement(motion); - - if (entity.isShiftKeyDown() && motion.lengthSqr() < 0.15 * 0.15 && !entity.isFree(motion.x, motion.y, motion.z)) { - entityEx.setCFG(); - } - } - - @ClientOnly - private static void playEnterSound() { - Minecraft.getInstance().getSoundManager().play(new ExcursionFunnelEnterSoundInstance()); - } + public static final EntityDataAccessor REVERSED = SynchedEntityData.defineId(ExcursionFunnelEntity.class, EntityDataSerializers.BOOLEAN); + + public static final float SIZE = (30 / 32f) * 2; + + private boolean reversed; + + @ClientOnly + public ExcursionFunnelModel model; + + public ExcursionFunnelEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static ExcursionFunnelEntity spawnAndEmit(Level level, Vec3 pos, Direction facing, boolean reversed, float length) { + ExcursionFunnelEntity entity = new ExcursionFunnelEntity(PortalCubedEntities.EXCURSION_FUNNEL, level); + entity.setPos(pos); + entity.setFacing(facing); + entity.setReversed(reversed); + + entity.reEmit(length); + level.addFreshEntity(entity); + return entity; + } + + @Override + protected EmittedEntity createNext() { + ExcursionFunnelEntity entity = new ExcursionFunnelEntity(PortalCubedEntities.EXCURSION_FUNNEL, level()); + entity.setReversed(isReversed()); + return entity; + } + + public boolean isReversed() { + return reversed; + } + + public void setReversed(boolean reversed) { + entityData.set(REVERSED, reversed); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + entityData.define(REVERSED, false); + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor key) { + super.onSyncedDataUpdated(key); + if (key.equals(REVERSED)) { + this.reversed = entityData.get(REVERSED); + } + } + + @Override + public void writeAdditionalSpawnData(FriendlyByteBuf buf) { + super.writeAdditionalSpawnData(buf); + buf.writeBoolean(reversed); + } + + @Override + public void readAdditionalSpawnData(FriendlyByteBuf buf) { + super.readAdditionalSpawnData(buf); + this.reversed = buf.readBoolean(); + } + + @Override + protected void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putBoolean("reversed", reversed); + } + + @Override + protected void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + setReversed(tag.getBoolean("reversed")); + } + + @Override + protected AABB makeBaseBoundingBox() { + Direction facing = this.getFacing(); + Axis axis = facing.getAxis(); + Vec3 pos = position(); + return AABB.ofSize(pos, axis.choose(0, SIZE, SIZE), axis.choose(SIZE, 0, SIZE), axis.choose(SIZE, SIZE, 0)); + } + + @Override + public void tick() { + super.tick(); + Level level = level(); + List colliding = level.getEntitiesOfClass(LivingEntity.class, getBoundingBox(), Entity::isAlive); + if (!colliding.isEmpty()) { + Direction facing = getFacing(); + Direction motion = isReversed() ? facing.getOpposite() : facing; + Vec3 center = getCenter(); + for (LivingEntity entity : colliding) { + applyEffects(entity, center, motion); + } + } + } + + public static void applyEffects(Entity entity, Vec3 tubeCenter, Direction motionDirection) { + if (entity instanceof Player player && player.getAbilities().flying) + return; + Vec3 entityCenter = entity.getBoundingBox().getCenter(); + Vec3 motion = Vec3.atLowerCornerOf(motionDirection.getNormal()).scale(0.125); + + RayonIntegration.INSTANCE.setNoGravity(entity, true); + entity.resetFallDistance(); + + EntityExt entityEx = (EntityExt) entity; + if (!entityEx.isInFunnel()) { + entityEx.setInFunnel(true); + entity.setDeltaMovement(0, 0, 0); + if (entity instanceof Player player && player.isLocalPlayer()) + playEnterSound(); + } + entityEx.setFunnelTimer(2); + + Vec3 velocity = entity.getDeltaMovement(); + // check for inputs + if (entity instanceof HasMovementInputAccessor inputProvider && inputProvider.hasMovementInputPublic()) { + if (motion.x == 0) + motion = motion.add(velocity.x, 0, 0); + if (motion.y == 0) + motion = motion.add(0, velocity.y, 0); + if (motion.z == 0) + motion = motion.add(0, 0, velocity.z); + } + + // move entity towards center + double dx = entityCenter.x - tubeCenter.x + velocity.x; + double dy = entityCenter.y - tubeCenter.y + velocity.y; + double dz = entityCenter.z - tubeCenter.z + velocity.z; + + if (motion.x == 0) + motion = motion.add(-Math.copySign(Math.sqrt(Math.abs(dx)), dx) / 20, 0, 0); + if (motion.y == 0) + motion = motion.add(0, -Math.copySign(Math.sqrt(Math.abs(dy)), dy) / 20, 0); + if (motion.z == 0) + motion = motion.add(0, 0, -Math.copySign(Math.sqrt(Math.abs(dz)), dz) / 20); + + entity.setDeltaMovement(motion); + + if (entity.isShiftKeyDown() && motion.lengthSqr() < 0.15 * 0.15 && !entity.isFree(motion.x, motion.y, motion.z)) { + entityEx.setCFG(); + } + } + + @ClientOnly + private static void playEnterSound() { + Minecraft.getInstance().getSoundManager().play(new ExcursionFunnelEnterSoundInstance()); + } } diff --git a/src/main/java/com/fusionflux/portalcubed/items/PortalGun.java b/src/main/java/com/fusionflux/portalcubed/items/PortalGun.java index 092045c8..56628385 100644 --- a/src/main/java/com/fusionflux/portalcubed/items/PortalGun.java +++ b/src/main/java/com/fusionflux/portalcubed/items/PortalGun.java @@ -52,7 +52,6 @@ import java.util.*; import java.util.function.BiFunction; -import java.util.function.Predicate; public class PortalGun extends Item implements ClickHandlingItem, DyeableLeatherItem { private static final Map, List>> FAIL_TRIES; diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/EntityPositionSourceAccessor.java b/src/main/java/com/fusionflux/portalcubed/mixin/EntityPositionSourceAccessor.java deleted file mode 100644 index 2665a441..00000000 --- a/src/main/java/com/fusionflux/portalcubed/mixin/EntityPositionSourceAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fusionflux.portalcubed.mixin; - -import java.util.UUID; - -import com.mojang.datafixers.util.Either; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.gameevent.EntityPositionSource; - -@Mixin(EntityPositionSource.class) -public interface EntityPositionSourceAccessor { - @Accessor - Either> getEntityOrUuidOrId(); -} diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/PlayerMixin.java b/src/main/java/com/fusionflux/portalcubed/mixin/PlayerMixin.java index 57999db9..f7239289 100644 --- a/src/main/java/com/fusionflux/portalcubed/mixin/PlayerMixin.java +++ b/src/main/java/com/fusionflux/portalcubed/mixin/PlayerMixin.java @@ -5,7 +5,6 @@ import com.fusionflux.portalcubed.TeleportResult; import com.fusionflux.portalcubed.accessor.CalledValues; import com.fusionflux.portalcubed.accessor.EntityExt; -import com.fusionflux.portalcubed.blocks.PortalCubedBlocks; import com.fusionflux.portalcubed.client.MixinPCClientAccessor; import com.fusionflux.portalcubed.client.PortalCubedClient; import com.fusionflux.portalcubed.entity.Portal; @@ -17,7 +16,6 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import it.unimi.dsi.fastutil.Pair; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/client/SpriteContentsAccessor.java b/src/main/java/com/fusionflux/portalcubed/mixin/client/SpriteContentsAccessor.java index 2ebeb6ba..e5fbb022 100644 --- a/src/main/java/com/fusionflux/portalcubed/mixin/client/SpriteContentsAccessor.java +++ b/src/main/java/com/fusionflux/portalcubed/mixin/client/SpriteContentsAccessor.java @@ -1,14 +1,12 @@ package com.fusionflux.portalcubed.mixin.client; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - import com.mojang.blaze3d.platform.NativeImage; - import net.minecraft.client.renderer.texture.SpriteContents; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(SpriteContents.class) public interface SpriteContentsAccessor { - @Accessor - NativeImage getOriginalImage(); + @Accessor + NativeImage getOriginalImage(); } diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/client/TextureAtlasAccessor.java b/src/main/java/com/fusionflux/portalcubed/mixin/client/TextureAtlasAccessor.java deleted file mode 100644 index d091af10..00000000 --- a/src/main/java/com/fusionflux/portalcubed/mixin/client/TextureAtlasAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fusionflux.portalcubed.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import net.minecraft.client.renderer.texture.TextureAtlas; - -@Mixin(TextureAtlas.class) -public interface TextureAtlasAccessor { - @Invoker - int invokeGetWidth(); - - @Invoker - int invokeGetHeight(); -} diff --git a/src/main/java/com/fusionflux/portalcubed/util/EntityReference.java b/src/main/java/com/fusionflux/portalcubed/util/EntityReference.java index 8c5cbc2e..d93dce0f 100644 --- a/src/main/java/com/fusionflux/portalcubed/util/EntityReference.java +++ b/src/main/java/com/fusionflux/portalcubed/util/EntityReference.java @@ -1,56 +1,55 @@ package com.fusionflux.portalcubed.util; -import java.lang.ref.WeakReference; -import java.util.UUID; - -import org.jetbrains.annotations.Nullable; - import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import org.jetbrains.annotations.Nullable; + +import java.lang.ref.WeakReference; +import java.util.UUID; public class EntityReference { - public final ServerLevel level; - public final UUID uuid; - private final Class entityClass; - - private WeakReference entity; - - public EntityReference(ServerLevel level, T entity) { - this.level = level; - this.uuid = entity.getUUID(); - //noinspection unchecked - this.entityClass = (Class) entity.getClass(); - this.entity = new WeakReference<>(entity); - } - - public EntityReference(ServerLevel level, UUID uuid, Class entityClass) { - this.level = level; - this.uuid = uuid; - this.entityClass = entityClass; - this.entity = new WeakReference<>(null); - } - - @Nullable - public T get() { - tryResolve(); - return entity.get(); - } - - public boolean isLoaded() { - tryResolve(); - return get() != null; - } - - public boolean isUnloaded() { - return !isLoaded(); - } - - private void tryResolve() { - if (entity.get() == null) { - Entity entity = level.getEntity(uuid); - if (entityClass.isInstance(entity)) - //noinspection unchecked - this.entity = new WeakReference<>((T) entity); - } - } + public final ServerLevel level; + public final UUID uuid; + private final Class entityClass; + + private WeakReference entity; + + public EntityReference(ServerLevel level, T entity) { + this.level = level; + this.uuid = entity.getUUID(); + //noinspection unchecked + this.entityClass = (Class) entity.getClass(); + this.entity = new WeakReference<>(entity); + } + + public EntityReference(ServerLevel level, UUID uuid, Class entityClass) { + this.level = level; + this.uuid = uuid; + this.entityClass = entityClass; + this.entity = new WeakReference<>(null); + } + + @Nullable + public T get() { + tryResolve(); + return entity.get(); + } + + public boolean isLoaded() { + tryResolve(); + return get() != null; + } + + public boolean isUnloaded() { + return !isLoaded(); + } + + private void tryResolve() { + if (entity.get() == null) { + Entity entity = level.getEntity(uuid); + if (entityClass.isInstance(entity)) + //noinspection unchecked + this.entity = new WeakReference<>((T) entity); + } + } } diff --git a/src/main/resources/portalcubed.mixins.json b/src/main/resources/portalcubed.mixins.json index 251f1a24..567e060e 100644 --- a/src/main/resources/portalcubed.mixins.json +++ b/src/main/resources/portalcubed.mixins.json @@ -14,7 +14,6 @@ "CreativeModeTabsAccessor", "DispenserBlockAccessor", "EntityMixin", - "EntityPositionSourceAccessor", "InventoryMixin", "ItemMixin", "LevelMixin", @@ -62,7 +61,6 @@ "client.SimpleBakedModelAccessor", "client.SoundEngineMixin", "client.SpriteContentsAccessor", - "client.TextureAtlasAccessor", "client.VertexConsumerMixin" ], "injectors": { From e03b732fc5bcebff701da14f2d778f6ac5fe1cb8 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 13 Jul 2023 17:01:59 -0500 Subject: [PATCH 04/26] Fix crash --- .../fusionflux/portalcubed/client/PortalCubedClient.java | 2 +- .../portalcubed/items/ExcursionFunnelEmitterBlockItem.java | 7 +++++++ .../com/fusionflux/portalcubed/items/MultiblockItem.java | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java index 0173c324..5b50423d 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java +++ b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java @@ -512,7 +512,7 @@ Items.LIGHT, new ResourceLocation("level") } final TwoByTwo twoByTwo = useItem.findValidPlacement( worldRenderContext.world(), - useItem.getBlock().getStateForPlacement(blockPlaceContext), + useItem.getMultiblockBlock().getStateForPlacement(blockPlaceContext), pos, blockPlaceContext.getHorizontalDirection() ); diff --git a/src/main/java/com/fusionflux/portalcubed/items/ExcursionFunnelEmitterBlockItem.java b/src/main/java/com/fusionflux/portalcubed/items/ExcursionFunnelEmitterBlockItem.java index d0714fdf..1be7770a 100644 --- a/src/main/java/com/fusionflux/portalcubed/items/ExcursionFunnelEmitterBlockItem.java +++ b/src/main/java/com/fusionflux/portalcubed/items/ExcursionFunnelEmitterBlockItem.java @@ -1,6 +1,7 @@ package com.fusionflux.portalcubed.items; import com.fusionflux.portalcubed.blocks.funnel.ExcursionFunnelEmitterBlock; +import com.fusionflux.portalcubed.blocks.funnel.TwoByTwoFacingMultiblockBlock; import com.fusionflux.portalcubed.util.TwoByTwo; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -88,4 +89,10 @@ public static Direction getDownOf(Direction facing, Direction perspectiveFacing) return Direction.DOWN; return facing == Direction.DOWN ? perspectiveFacing.getOpposite() : perspectiveFacing; } + + @Override + @SuppressWarnings("unchecked") + public T getMultiblockBlock() { + return (T)getBlock(); + } } diff --git a/src/main/java/com/fusionflux/portalcubed/items/MultiblockItem.java b/src/main/java/com/fusionflux/portalcubed/items/MultiblockItem.java index a4f31177..3cfae02e 100644 --- a/src/main/java/com/fusionflux/portalcubed/items/MultiblockItem.java +++ b/src/main/java/com/fusionflux/portalcubed/items/MultiblockItem.java @@ -1,5 +1,6 @@ package com.fusionflux.portalcubed.items; +import com.fusionflux.portalcubed.blocks.funnel.TwoByTwoFacingMultiblockBlock; import com.fusionflux.portalcubed.util.TwoByTwo; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -9,7 +10,7 @@ import org.jetbrains.annotations.Nullable; public interface MultiblockItem { - Block getBlock(); + T getMultiblockBlock(); @Nullable TwoByTwo findValidPlacement(Level level, BlockState state, BlockPos initial, Direction playerFacing); From d8cf0b7519369acfdff062e71b71890bfa30910b Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 13 Jul 2023 17:27:57 -0500 Subject: [PATCH 05/26] Fix excursion funnel not animating by default with Sodium --- build.gradle | 2 ++ .../animatedtextures/AnimatedTexture.java | 2 ++ .../compat/sodium/SodiumIntegration.java | 18 ++++++++++++++++++ .../sodium/absent/SodiumIntegrationAbsent.java | 12 ++++++++++++ .../present/SodiumIntegrationPresent.java | 14 ++++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 src/main/java/com/fusionflux/portalcubed/compat/sodium/SodiumIntegration.java create mode 100644 src/main/java/com/fusionflux/portalcubed/compat/sodium/absent/SodiumIntegrationAbsent.java create mode 100644 src/main/java/com/fusionflux/portalcubed/compat/sodium/present/SodiumIntegrationPresent.java diff --git a/build.gradle b/build.gradle index e9ef0f63..3e8c2800 100644 --- a/build.gradle +++ b/build.gradle @@ -138,6 +138,8 @@ dependencies { file("runtime-mods").list { _, name -> name.endsWith(".jar") }.each { modLocalRuntime(files("runtime-mods/$it")) } + + modCompileOnly("maven.modrinth:sodium:mc1.20-0.4.10") } loom { diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedTexture.java b/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedTexture.java index fa60f85b..1408ae22 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedTexture.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/entity/animatedtextures/AnimatedTexture.java @@ -1,5 +1,6 @@ package com.fusionflux.portalcubed.client.render.entity.animatedtextures; +import com.fusionflux.portalcubed.compat.sodium.SodiumIntegration; import com.fusionflux.portalcubed.mixin.client.SpriteContentsAccessor; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.TextureUtil; @@ -53,6 +54,7 @@ public void tick() { } private void cycle() { + SodiumIntegration.INSTANCE.markSpriteActive(contents); bind(); ticker.tickAndUpload(0, 0); } diff --git a/src/main/java/com/fusionflux/portalcubed/compat/sodium/SodiumIntegration.java b/src/main/java/com/fusionflux/portalcubed/compat/sodium/SodiumIntegration.java new file mode 100644 index 00000000..395bfd3d --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/compat/sodium/SodiumIntegration.java @@ -0,0 +1,18 @@ +package com.fusionflux.portalcubed.compat.sodium; + +import com.fusionflux.portalcubed.compat.sodium.absent.SodiumIntegrationAbsent; +import com.fusionflux.portalcubed.compat.sodium.present.SodiumIntegrationPresent; +import net.minecraft.client.renderer.texture.SpriteContents; +import org.quiltmc.loader.api.QuiltLoader; + +public interface SodiumIntegration { + SodiumIntegration INSTANCE = QuiltLoader.isModLoaded("sodium") ? SodiumPresentHolder.create() : SodiumIntegrationAbsent.INSTANCE; + + void markSpriteActive(SpriteContents sprite); + + class SodiumPresentHolder { + private static SodiumIntegration create() { + return new SodiumIntegrationPresent(); + } + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/compat/sodium/absent/SodiumIntegrationAbsent.java b/src/main/java/com/fusionflux/portalcubed/compat/sodium/absent/SodiumIntegrationAbsent.java new file mode 100644 index 00000000..049f7e7f --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/compat/sodium/absent/SodiumIntegrationAbsent.java @@ -0,0 +1,12 @@ +package com.fusionflux.portalcubed.compat.sodium.absent; + +import com.fusionflux.portalcubed.compat.sodium.SodiumIntegration; +import net.minecraft.client.renderer.texture.SpriteContents; + +public enum SodiumIntegrationAbsent implements SodiumIntegration { + INSTANCE; + + @Override + public void markSpriteActive(SpriteContents sprite) { + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/compat/sodium/present/SodiumIntegrationPresent.java b/src/main/java/com/fusionflux/portalcubed/compat/sodium/present/SodiumIntegrationPresent.java new file mode 100644 index 00000000..40ecb1ae --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/compat/sodium/present/SodiumIntegrationPresent.java @@ -0,0 +1,14 @@ +package com.fusionflux.portalcubed.compat.sodium.present; + +import com.fusionflux.portalcubed.compat.sodium.SodiumIntegration; +import me.jellysquid.mods.sodium.client.render.texture.SpriteExtended; +import net.minecraft.client.renderer.texture.SpriteContents; + +public class SodiumIntegrationPresent implements SodiumIntegration { + @Override + public void markSpriteActive(SpriteContents sprite) { + if (sprite instanceof SpriteExtended extended) { + extended.setActive(true); + } + } +} From 9e8b69219e40f6183c9f46887741e526c0989d64 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 13 Jul 2023 17:37:23 -0500 Subject: [PATCH 06/26] Make fizzlers replace replaceables --- .../fusionflux/portalcubed/blocks/fizzler/FizzlerEmitter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fusionflux/portalcubed/blocks/fizzler/FizzlerEmitter.java b/src/main/java/com/fusionflux/portalcubed/blocks/fizzler/FizzlerEmitter.java index 19a64c01..1c9333ab 100644 --- a/src/main/java/com/fusionflux/portalcubed/blocks/fizzler/FizzlerEmitter.java +++ b/src/main/java/com/fusionflux/portalcubed/blocks/fizzler/FizzlerEmitter.java @@ -134,7 +134,7 @@ private void updateGrill(Level world, BlockPos pos, BlockState state, boolean pl for (i = 0; i < PortalCubedConfig.maxBridgeLength; i++) { final BlockState checkState = world.getBlockState(searchPos); if (checkState.equals(targetState)) break; - if (placed && !checkState.isAir() && !checkState.is(fizzlerBlock)) return; + if (placed && !checkState.canBeReplaced() && !checkState.is(fizzlerBlock)) return; if (!placed && checkState.is(fizzlerBlock)) { final BlockState newState = checkState.setValue(grillAxis, false); world.setBlockAndUpdate(searchPos, AbstractFizzlerBlock.isEmpty(newState) ? Blocks.AIR.defaultBlockState() : newState); @@ -149,7 +149,7 @@ private void updateGrill(Level world, BlockPos pos, BlockState state, boolean pl for (i = 0; i < PortalCubedConfig.maxBridgeLength; i++) { final BlockState checkState = world.getBlockState(searchPos); if (checkState.equals(targetState)) break; - world.setBlockAndUpdate(searchPos, checkState.is(Blocks.AIR) ? placedState : checkState.setValue(grillAxis, true)); + world.setBlockAndUpdate(searchPos, checkState.canBeReplaced() ? placedState : checkState.setValue(grillAxis, true)); searchPos = searchPos.relative(searchDir); } } From c7f1efd6c5f89d354e3308c9bf8cbddbe802a1b2 Mon Sep 17 00:00:00 2001 From: Carter <69820300+Cart3r1234@users.noreply.github.com> Date: Thu, 13 Jul 2023 23:59:09 -0400 Subject: [PATCH 07/26] lang and funnel stuff - Removed the decal entity translation since it's no longer an entity - Changed the excursion funnel lang entry from a block to an entity - Removed the reversed excursion funnel beam end block texture as it is no longer needed - Fixed a broken frame in the reverse beam's texture --- .../assets/portalcubed/lang/en_us.json | 4 ++-- .../excursion_funnel_beam_reversed.png | Bin 14440 -> 14539 bytes .../reversed_excursion_funnel_beam_end.png | Bin 7277 -> 0 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 src/main/resources/assets/portalcubed/textures/block/reversed_excursion_funnel_beam_end.png diff --git a/src/main/resources/assets/portalcubed/lang/en_us.json b/src/main/resources/assets/portalcubed/lang/en_us.json index 30e19ee3..78df7a37 100644 --- a/src/main/resources/assets/portalcubed/lang/en_us.json +++ b/src/main/resources/assets/portalcubed/lang/en_us.json @@ -341,7 +341,6 @@ "block.portalcubed.neurotoxin_emitter": "Neurotoxin Emitter", "block.portalcubed.excursion_funnel_emitter": "Excursion Funnel Emitter", - "block.portalcubed.excursion_funnel": "Excursion Funnel", "block.portalcubed.portal_1_door": "Portal 1 Door", "block.portalcubed.portal_2_door": "Portal 2 Door", "block.portalcubed.octopus_door": "Octopus Door", @@ -447,13 +446,14 @@ "entity.portalcubed.schrodinger_cube": "Schrödinger Cube", "entity.portalcubed.old_ap_cube": "Old Aperture Weighted Storage Cube", - "entity.portalcubed.decal": "Decal", "entity.portalcubed.energy_pellet": "High Energy Pellet", "entity.portalcubed.rocket": "Rocket", "entity.portalcubed.portal": "Portal", + "entity.portalcubed.excursion_funnel": "Excursion Funnel", + "entity.portalcubed.turret": "Sentry Turret", "item.portalcubed.music_disc_still_alive": "Music Disc", diff --git a/src/main/resources/assets/portalcubed/textures/animated_entity/excursion_funnel_beam_reversed.png b/src/main/resources/assets/portalcubed/textures/animated_entity/excursion_funnel_beam_reversed.png index 617991c70ff03958463dfb812fd500f4e75350e7..6827526d76dba2baad043e6de6d8b93a2a1d884f 100644 GIT binary patch delta 9096 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 diff --git a/src/main/resources/assets/portalcubed/textures/block/reversed_excursion_funnel_beam_end.png b/src/main/resources/assets/portalcubed/textures/block/reversed_excursion_funnel_beam_end.png deleted file mode 100644 index 82542dfb2419fdbbc6bfef1b58976755ff68bca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7277 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 Vz^OUvW^L8{xeL5p3a2eu`9D>Hg;xLo From a25ddb7a3e78a02f1ce59cbae8e98f75e1888232 Mon Sep 17 00:00:00 2001 From: Carter <69820300+Cart3r1234@users.noreply.github.com> Date: Sat, 15 Jul 2023 19:45:49 -0400 Subject: [PATCH 08/26] Asset stuff, mainly optimizations - Set up atlas additions to remove the need for most duplicate entity textures in the item folder - Remade parts of the redirection/schrodinger cube textures - Added a translation and description for the portal validation gamerule - Tweaked a few of the portal gun models - Added the Portal 2005 beta portal gun skin, recreated to the best of my ability due to how few official screenshots there are of it. --- .../assets/minecraft/atlases/blocks.json | 76 +++ .../assets/portalcubed/lang/en_us.json | 2 + .../models/item/adventure_core.json | 4 +- .../portalcubed/models/item/anger_core.json | 17 +- .../assets/portalcubed/models/item/beans.json | 2 +- .../models/item/beta_portal_gun.json | 522 ++++++++++++++++++ .../assets/portalcubed/models/item/chair.json | 2 +- .../models/item/companion_cube.json | 14 +- .../portalcubed/models/item/computer.json | 2 +- .../portalcubed/models/item/core_frame.json | 2 +- .../models/item/curiosity_core.json | 17 +- .../portalcubed/models/item/fact_core.json | 4 +- .../models/item/intelligence_core.json | 17 +- .../assets/portalcubed/models/item/jug.json | 2 +- .../models/item/lil_pineapple.json | 2 +- .../models/item/mel_portal_gun.json | 143 ++--- .../models/item/morality_core.json | 17 +- .../assets/portalcubed/models/item/mug.json | 2 +- .../portalcubed/models/item/old_ap_cube.json | 2 +- .../models/item/portal_1_companion_cube.json | 2 +- .../models/item/portal_1_storage_cube.json | 2 +- .../portalcubed/models/item/portal_gun.json | 3 +- .../models/item/portal_gun_primary.json | 3 +- .../models/item/portal_gun_secondary.json | 3 +- .../models/item/potatos_portal_gun.json | 70 +-- .../assets/portalcubed/models/item/radio.json | 182 +++--- .../models/item/redirection_cube.json | 196 +++---- .../models/item/schrodinger_cube.json | 38 +- .../portalcubed/models/item/space_core.json | 4 +- .../portalcubed/models/item/storage_cube.json | 144 ++--- .../portalcubed/models/item/turret.json | 2 +- .../textures/entity/companion_cube.png | Bin 9306 -> 11437 bytes .../textures/entity/portal_1_cores.png | Bin 7342 -> 8015 bytes .../textures/entity/portal_2_cores.png | Bin 7198 -> 7961 bytes .../textures/entity/redirection_cube.png | Bin 9150 -> 9338 bytes .../textures/entity/redirection_cube_lit.png | Bin 9218 -> 9590 bytes .../entity/redirection_cube_lit_e.png | Bin 1870 -> 6195 bytes .../textures/entity/schrodinger_cube.png | Bin 695 -> 8265 bytes .../textures/entity/schrodinger_cube_lit.png | Bin 755 -> 8326 bytes .../entity/schrodinger_cube_lit_e.png | Bin 156 -> 5971 bytes .../textures/entity/storage_cube.png | Bin 8896 -> 11011 bytes .../portalcubed/textures/item/beans.png | Bin 5254 -> 0 bytes .../textures/item/beta_portal_gun.png | Bin 0 -> 7102 bytes .../portalcubed/textures/item/chair.png | Bin 7195 -> 0 bytes .../textures/item/companion_cube.png | Bin 9612 -> 0 bytes .../portalcubed/textures/item/computer.png | Bin 5588 -> 0 bytes .../portalcubed/textures/item/core_frame.png | Bin 7350 -> 0 bytes .../textures/item/default_turret.png | Bin 1298 -> 0 bytes .../textures/item/lil_pineapple.png | Bin 520 -> 0 bytes .../textures/item/mel_portal_gun.png | Bin 8601 -> 8385 bytes .../portalcubed/textures/item/mug_white.png | Bin 5136 -> 0 bytes .../portalcubed/textures/item/old_ap_cube.png | Bin 9133 -> 0 bytes .../textures/item/portal_1_companion_cube.png | Bin 8360 -> 0 bytes .../textures/item/portal_1_cores.png | Bin 7533 -> 0 bytes .../textures/item/portal_1_storage_cube.png | Bin 8037 -> 0 bytes .../textures/item/portal_2_cores.png | Bin 7839 -> 0 bytes .../textures/item/portal_gun_dyeable.png | Bin 5453 -> 5926 bytes .../portalcubed/textures/item/radio.png | Bin 5773 -> 0 bytes .../textures/item/redirection_cube.png | Bin 9150 -> 0 bytes .../textures/item/schrodinger_cube.png | Bin 695 -> 0 bytes .../textures/item/storage_cube.png | Bin 9304 -> 0 bytes .../portalcubed/textures/item/water_jug.png | Bin 5640 -> 0 bytes 62 files changed, 1026 insertions(+), 472 deletions(-) create mode 100644 src/main/resources/assets/minecraft/atlases/blocks.json create mode 100644 src/main/resources/assets/portalcubed/models/item/beta_portal_gun.json delete mode 100644 src/main/resources/assets/portalcubed/textures/item/beans.png create mode 100644 src/main/resources/assets/portalcubed/textures/item/beta_portal_gun.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/chair.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/companion_cube.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/computer.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/core_frame.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/default_turret.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/lil_pineapple.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/mug_white.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/old_ap_cube.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/portal_1_companion_cube.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/portal_1_cores.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/portal_1_storage_cube.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/portal_2_cores.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/radio.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/redirection_cube.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/schrodinger_cube.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/storage_cube.png delete mode 100644 src/main/resources/assets/portalcubed/textures/item/water_jug.png diff --git a/src/main/resources/assets/minecraft/atlases/blocks.json b/src/main/resources/assets/minecraft/atlases/blocks.json new file mode 100644 index 00000000..cb51eb97 --- /dev/null +++ b/src/main/resources/assets/minecraft/atlases/blocks.json @@ -0,0 +1,76 @@ +{ + "sources": [ + { + "type": "single", + "resource": "portalcubed:entity/beans" + }, + { + "type": "single", + "resource": "portalcubed:entity/chair" + }, + { + "type": "single", + "resource": "portalcubed:entity/computer" + }, + { + "type": "single", + "resource": "portalcubed:entity/core_frame" + }, + { + "type": "single", + "resource": "portalcubed:entity/default_turret" + }, + { + "type": "single", + "resource": "portalcubed:entity/lil_pineapple" + }, + { + "type": "single", + "resource": "portalcubed:entity/old_ap_cube" + }, + { + "type": "single", + "resource": "portalcubed:entity/mug_white" + }, + { + "type": "single", + "resource": "portalcubed:entity/portal_1_companion_cube" + }, + { + "type": "single", + "resource": "portalcubed:entity/portal_1_storage_cube" + }, + { + "type": "single", + "resource": "portalcubed:entity/redirection_cube" + }, + { + "type": "single", + "resource": "portalcubed:entity/schrodinger_cube" + }, + { + "type": "single", + "resource": "portalcubed:entity/water_jug" + }, + { + "type": "single", + "resource": "portalcubed:entity/radio" + }, + { + "type": "single", + "resource": "portalcubed:entity/companion_cube" + }, + { + "type": "single", + "resource": "portalcubed:entity/storage_cube" + }, + { + "type": "single", + "resource": "portalcubed:entity/portal_1_cores" + }, + { + "type": "single", + "resource": "portalcubed:entity/portal_2_cores" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/lang/en_us.json b/src/main/resources/assets/portalcubed/lang/en_us.json index 78df7a37..379b8afa 100644 --- a/src/main/resources/assets/portalcubed/lang/en_us.json +++ b/src/main/resources/assets/portalcubed/lang/en_us.json @@ -478,6 +478,8 @@ "gamerule.category.portalcubed": "Portal Cubed", "gamerule.allowCrouchFlyGlitch": "Allow Crouch Fly Glitch", "gamerule.allowCrouchFlyGlitch.description": "Enables the Excursion Funnel Crouch Fly Glitch from Portal 2.", + "gamerule.disablePortalValidation": "Disable Portal Validation", + "gamerule.disablePortalValidation.description": "Disables placement checks when shooting portals, allowing them to be placed on any surface, including overhangs. May cause unexpected results.", "gamerule.portalAlignment": "Portal Alignment", "gamerule.portalAlignment.description": "Changes portal placement snapping, with the value being fraction of a block snapped to. For example, 16 is every pixel, 1 is full blocks, and 0 is off.", "gamerule.usePortalHud": "Use Portal HUD", diff --git a/src/main/resources/assets/portalcubed/models/item/adventure_core.json b/src/main/resources/assets/portalcubed/models/item/adventure_core.json index 5b37ff2b..5462b149 100644 --- a/src/main/resources/assets/portalcubed/models/item/adventure_core.json +++ b/src/main/resources/assets/portalcubed/models/item/adventure_core.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/portal_2_cores" + "0": "portalcubed:entity/portal_2_cores" }, "elements": [ { @@ -90,7 +90,7 @@ "from": [6.5, 1.5, 5.075], "to": [9.5, 4.5, 6.075], "faces": { - "north": {"uv": [12.5, 2, 14, 3.5], "texture": "#0"} + "north": {"uv": [12.5, 9, 14, 10.5], "texture": "#0"} } } ], diff --git a/src/main/resources/assets/portalcubed/models/item/anger_core.json b/src/main/resources/assets/portalcubed/models/item/anger_core.json index 929cb6ea..6f238c55 100644 --- a/src/main/resources/assets/portalcubed/models/item/anger_core.json +++ b/src/main/resources/assets/portalcubed/models/item/anger_core.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/portal_1_cores" + "0": "portalcubed:entity/portal_1_cores" }, "elements": [ { @@ -34,10 +34,6 @@ "to": [11.45, 5.55, 4.75], "rotation": {"angle": 45, "axis": "x", "origin": [7.95, 5.55, 5.125]}, "faces": { - "north": {"uv": [1.5, 12, 1.5, 15.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [1.5, 10.5, 1.5, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [3, 12, 3, 15.5], "rotation": 270, "texture": "#0"}, - "west": {"uv": [1.5, 12, 1.5, 10.5], "rotation": 270, "texture": "#0"}, "up": {"uv": [0, 12, 1.5, 15.5], "rotation": 270, "texture": "#0"}, "down": {"uv": [1.5, 12, 0, 15.5], "rotation": 270, "texture": "#0"} } @@ -73,10 +69,6 @@ "to": [11.45, 0.55, 4.75], "rotation": {"angle": -45, "axis": "x", "origin": [7.95, 0.5, 5.25]}, "faces": { - "north": {"uv": [1.5, 12, 1.5, 15.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [1.5, 10.5, 1.5, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [3, 12, 3, 15.5], "rotation": 270, "texture": "#0"}, - "west": {"uv": [1.5, 12, 1.5, 10.5], "rotation": 270, "texture": "#0"}, "up": {"uv": [0, 12, 1.5, 15.5], "rotation": 270, "texture": "#0"}, "down": {"uv": [1.5, 12, 0, 15.5], "rotation": 270, "texture": "#0"} } @@ -85,12 +77,7 @@ "from": [6.5, 1.5, 5.075], "to": [9.5, 4.5, 6.075], "faces": { - "north": {"uv": [12.5, 2, 14, 3.5], "texture": "#0"}, - "east": {"uv": [12, 3.5, 12.5, 5], "texture": "#0"}, - "south": {"uv": [14.5, 3.5, 16, 5], "texture": "#0"}, - "west": {"uv": [14, 3.5, 14.5, 5], "texture": "#0"}, - "up": {"uv": [14, 3.5, 12.5, 3], "texture": "#0"}, - "down": {"uv": [15.5, 3, 14, 3.5], "texture": "#0"} + "north": {"uv": [12.5, 9, 14, 10.5], "texture": "#0"} } } ], diff --git a/src/main/resources/assets/portalcubed/models/item/beans.json b/src/main/resources/assets/portalcubed/models/item/beans.json index 5c7a2636..dd485da7 100644 --- a/src/main/resources/assets/portalcubed/models/item/beans.json +++ b/src/main/resources/assets/portalcubed/models/item/beans.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/beans" + "0": "portalcubed:entity/beans" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/beta_portal_gun.json b/src/main/resources/assets/portalcubed/models/item/beta_portal_gun.json new file mode 100644 index 00000000..3bd7f04a --- /dev/null +++ b/src/main/resources/assets/portalcubed/models/item/beta_portal_gun.json @@ -0,0 +1,522 @@ +{ + "credit": "Made by Cart3r using Blockbench.", + "texture_size": [32, 32], + "textures": { + "0": "portalcubed:item/beta_portal_gun", + "1": "portalcubed:item/portal_gun_dyeable", + "particle": "portalcubed:item/beta_portal_gun" + }, + "elements": [ + { + "from": [6.49, 4.99, 14.99], + "to": [9.51, 8.01, 16.01], + "faces": { + "east": {"uv": [0.516, 1.516, 1.984, 1.984], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0.516, 0.016, 1.984, 1.484], "texture": "#0"}, + "west": {"uv": [0.516, 1.516, 1.984, 1.984], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0.516, 1.516, 1.984, 1.984], "texture": "#0"}, + "down": {"uv": [0.516, 1.516, 1.984, 1.984], "texture": "#0"} + } + }, + { + "from": [6.49, 4.99, 2.99], + "to": [9.51, 8.01, 13.01], + "rotation": {"angle": 0, "axis": "z", "origin": [7.94194, 6.47595, 8]}, + "faces": { + "east": {"uv": [0, 10.5, 5, 12], "rotation": 180, "texture": "#0"}, + "west": {"uv": [5, 12, 0, 10.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0, 10.5, 5, 12], "rotation": 90, "texture": "#0"}, + "down": {"uv": [5, 12, 0, 10.5], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [6.49, 4.99, 2.99], + "to": [9.51, 8.01, 13.01], + "rotation": {"angle": 0, "axis": "z", "origin": [7.94194, 6.47595, 8]}, + "faces": { + "east": {"uv": [0, 0, 5, 1.5], "rotation": 180, "texture": "#1", "tintindex": 0}, + "west": {"uv": [5, 1.5, 0, 0], "rotation": 180, "texture": "#1", "tintindex": 0}, + "up": {"uv": [0, 0, 5, 1.5], "rotation": 90, "texture": "#1", "tintindex": 0}, + "down": {"uv": [5, 1.5, 0, 0], "rotation": 90, "texture": "#1", "tintindex": 0} + } + }, + { + "from": [7.5, 3.5, 13], + "to": [8.5, 4.5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0.5, 0]}, + "faces": { + "north": {"uv": [4.5, 2, 5, 2.5], "texture": "#0"}, + "east": {"uv": [5, 2.5, 4.5, 1.5], "rotation": 90, "texture": "#0"}, + "south": {"uv": [4.5, 1.5, 5, 2], "texture": "#0"}, + "west": {"uv": [4.5, 1.5, 5, 2.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [4.5, 1.5, 5, 2.5], "texture": "#0"} + } + }, + { + "from": [7.5, 4.5, 17.5], + "to": [8.5, 8.5, 18.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 6, 18]}, + "faces": { + "north": {"uv": [0.016, 0.016, 0.484, 1.984], "texture": "#0"}, + "east": {"uv": [0.016, 0.016, 0.484, 1.984], "texture": "#0"}, + "south": {"uv": [0.016, 0.016, 0.484, 1.984], "texture": "#0"}, + "west": {"uv": [0.016, 0.016, 0.484, 1.984], "texture": "#0"}, + "up": {"uv": [0.016, 2.016, 0.484, 2.484], "texture": "#0"}, + "down": {"uv": [0.016, 0.516, 0.484, 0.984], "texture": "#0"} + } + }, + { + "from": [-0.35, 2.125, 7.5], + "to": [3.65, 3.125, 8.5], + "rotation": {"angle": 22.5, "axis": "z", "origin": [1.65, 2.375, 8]}, + "faces": { + "north": {"uv": [0.016, 0.016, 0.484, 1.984], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0.016, 0.516, 0.484, 0.984], "texture": "#0"}, + "south": {"uv": [0.016, 0.016, 0.484, 1.984], "rotation": 270, "texture": "#0"}, + "west": {"uv": [0.016, 0.016, 0.484, 0.484], "rotation": 180, "texture": "#0"}, + "up": {"uv": [0.016, 0.016, 0.484, 1.984], "rotation": 270, "texture": "#0"}, + "down": {"uv": [0.016, 0.016, 0.484, 1.984], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3.65, 2.125, 8], + "to": [5.65, 3.125, 8], + "rotation": {"angle": 22.5, "axis": "z", "origin": [1.65, 2.375, 8]}, + "faces": { + "north": {"uv": [4.516, 0.016, 4.984, 0.984], "rotation": 270, "texture": "#0"}, + "south": {"uv": [4.516, 0.016, 4.984, 0.984], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [7.49, 3.49, 14.99], + "to": [8.51, 4.51, 18.01], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0.5, 0]}, + "faces": { + "south": {"uv": [4.516, 0.016, 4.984, 0.484], "texture": "#0"}, + "down": {"uv": [4.516, 0.016, 4.984, 1.484], "texture": "#0"} + } + }, + { + "from": [5.49, 3.99, 11.99], + "to": [10.51, 9.01, 13.01], + "faces": { + "east": {"uv": [4.016, 0.016, 4.484, 2.484], "texture": "#0"}, + "south": {"uv": [10.016, 13.532, 12.484, 16], "texture": "#0"}, + "west": {"uv": [2.016, 0.016, 2.484, 2.484], "texture": "#0"}, + "up": {"uv": [2.016, 0.016, 4.484, 0.484], "texture": "#0"}, + "down": {"uv": [2.016, 0.016, 4.484, 0.484], "texture": "#0"} + } + }, + { + "from": [4.99, 3.49, 0.99], + "to": [11.01, 9.51, 12.01], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, -0.5, -9]}, + "faces": { + "east": {"uv": [10.484, 6.016, 5.016, 8.984], "texture": "#0"}, + "west": {"uv": [5.016, 9.016, 10.484, 11.984], "texture": "#0"}, + "up": {"uv": [5.016, 0.016, 10.484, 2.984], "rotation": 90, "texture": "#0"}, + "down": {"uv": [10.484, 3.016, 5.016, 5.984], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [5.99, 4.49, 12.99], + "to": [10.01, 8.51, 15.01], + "rotation": {"angle": 0, "axis": "y", "origin": [-0.5, 0.5, 1]}, + "faces": { + "east": {"uv": [1.5, 2, 0.5, 4], "texture": "#0"}, + "west": {"uv": [0.5, 2, 1.5, 4], "texture": "#0"}, + "up": {"uv": [0.5, 4, 1.5, 2], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0.5, 2, 1.5, 4], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [5, 6.5, 3], + "to": [11, 6.5, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11.5]}, + "faces": { + "up": {"uv": [0.016, 6.016, 2.984, 10.484], "texture": "#0"}, + "down": {"uv": [0.016, 6.016, 2.984, 10.484], "texture": "#0"} + } + }, + { + "from": [5, 6.5, 3], + "to": [11, 6.5, 12], + "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 6.5, 11.5]}, + "faces": { + "up": {"uv": [0.016, 6.016, 2.984, 10.484], "texture": "#0"}, + "down": {"uv": [0.016, 6.016, 2.984, 10.484], "texture": "#0"} + } + }, + { + "from": [4.875, 6.5, 3], + "to": [11.15, 6.5, 12], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 6.5, 11.5]}, + "faces": { + "up": {"uv": [0.016, 6.016, 2.984, 10.484], "texture": "#0"}, + "down": {"uv": [0.016, 6.016, 2.984, 10.484], "texture": "#0"} + } + }, + { + "from": [8, 3.5, 3], + "to": [8, 9.5, 12], + "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 6.5, 11.5]}, + "faces": { + "east": {"uv": [0.016, 6.016, 2.984, 10.484], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0.016, 6.016, 2.984, 10.484], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [8, 3.5, 3], + "to": [8, 9.5, 12], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 6.5, 11.5]}, + "faces": { + "east": {"uv": [0.016, 6.016, 2.984, 10.484], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0.016, 6.016, 2.984, 10.484], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [8, 3.5, 3], + "to": [8, 9.5, 12], + "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 6.5, 11.5]}, + "faces": { + "east": {"uv": [0.016, 6.016, 2.984, 10.484], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0.016, 6.016, 2.984, 10.484], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [8, 3.35, 3], + "to": [8, 9.65, 12], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 6.5, 11.5]}, + "faces": { + "east": {"uv": [0.016, 6.016, 2.984, 10.484], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0.016, 6.016, 2.984, 10.484], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [5, 6.5, 3], + "to": [11, 6.5, 12], + "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 6.5, 11.5]}, + "faces": { + "up": {"uv": [0.016, 6.016, 2.984, 10.484], "texture": "#0"}, + "down": {"uv": [0.016, 6.016, 2.984, 10.484], "texture": "#0"} + } + }, + { + "from": [4.5, 3, 11.975], + "to": [11.5, 10, 12.025], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.025]}, + "faces": { + "north": {"uv": [1.516, 2.516, 4.984, 5.984], "texture": "#0"}, + "south": {"uv": [1.516, 2.516, 4.984, 5.984], "texture": "#0"} + } + }, + { + "from": [11.425, 9.75, 11.975], + "to": [12.425, 10.75, 12.025], + "rotation": {"angle": 22.5, "axis": "z", "origin": [11.925, 10.25, 12]}, + "faces": { + "north": {"uv": [0.016, 1.016, 0.484, 1.484], "texture": "#0"}, + "south": {"uv": [0.016, 1.016, 0.484, 1.484], "texture": "#0"} + } + }, + { + "from": [4.5, 3, -0.025], + "to": [11.5, 10, 2.975], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -0.025]}, + "faces": { + "north": {"uv": [6.0035, 12.516, 9.484, 15.984], "texture": "#0"}, + "east": {"uv": [4.016, 12.516, 5.484, 15.984], "texture": "#0"}, + "south": {"uv": [0.016, 12.516, 3.484, 15.984], "texture": "#0"}, + "west": {"uv": [5.484, 12.516, 4.016, 15.984], "texture": "#0"}, + "up": {"uv": [5.484, 12.516, 4.016, 15.984], "rotation": 90, "texture": "#0"}, + "down": {"uv": [4.016, 12.516, 5.484, 15.984], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [4.29, 2.79, -0.235], + "to": [11.71, 10.21, 3.185], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -0.025]}, + "faces": { + "east": {"uv": [13.016, 12.516, 14.484, 15.984], "texture": "#0"}, + "west": {"uv": [14.484, 12.516, 13.016, 15.984], "texture": "#0"}, + "up": {"uv": [14.484, 12.516, 13.016, 15.984], "rotation": 90, "texture": "#0"}, + "down": {"uv": [13.016, 12.516, 14.484, 15.984], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [5.5, 4, 15.025], + "to": [10.5, 9, 15.025], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.025]}, + "faces": { + "north": {"uv": [2, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 0, 4.5, 2.5], "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [8.5, 4.5, 18], + "to": [7.5, 3.5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0.5, 0]}, + "faces": { + "north": {"uv": [4.516, 0.016, 4.984, 0.484], "texture": "#0"}, + "up": {"uv": [4.516, 0.016, 4.984, 1.484], "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [11, 9.5, 12], + "to": [5, 3.5, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, -0.5, -9]}, + "faces": { + "east": {"uv": [5, 12, 10.5, 9], "texture": "#0"}, + "west": {"uv": [10.5, 6, 5, 9], "texture": "#0"}, + "up": {"uv": [10.5, 6, 5, 3], "rotation": 90, "texture": "#0"}, + "down": {"uv": [5, 0, 10.5, 3], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [9.5, 8, 16], + "to": [6.5, 5, 15], + "faces": { + "east": {"uv": [1.984, 1.516, 0.516, 1.984], "rotation": 90, "texture": "#0"}, + "west": {"uv": [1.984, 1.516, 0.516, 1.984], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1.984, 1.516, 0.516, 1.984], "texture": "#0"}, + "down": {"uv": [1.984, 1.516, 0.516, 1.984], "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [10, 8.5, 15], + "to": [6, 4.5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [-0.5, 0.5, 1]}, + "faces": { + "east": {"uv": [0.5, 4, 1.5, 2], "texture": "#0"}, + "west": {"uv": [1.5, 4, 0.5, 2], "texture": "#0"}, + "up": {"uv": [0.5, 4, 1.5, 2], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0.5, 2, 1.5, 4], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [10.5, 9, 13], + "to": [5.5, 4, 12], + "faces": { + "north": {"uv": [10.016, 15.984, 12.484, 13.516], "texture": "#0"}, + "east": {"uv": [2.016, 2.484, 2.484, 0.016], "texture": "#0"}, + "west": {"uv": [4.016, 2.484, 4.484, 0.016], "texture": "#0"}, + "up": {"uv": [4.484, 0.016, 2.016, 0.484], "texture": "#0"}, + "down": {"uv": [4.484, 0.016, 2.016, 0.484], "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [9.5, 8, 13], + "to": [6.5, 5, 2.925], + "rotation": {"angle": 0, "axis": "z", "origin": [7.94194, 6.47595, 8]}, + "faces": { + "east": {"uv": [5, 10.5, 0, 12], "rotation": 180, "texture": "#0"}, + "west": {"uv": [0, 12, 5, 10.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [5, 10.5, 0, 12], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 12, 5, 10.5], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [9.5, 8, 13], + "to": [6.5, 5, 2.925], + "rotation": {"angle": 0, "axis": "z", "origin": [7.94194, 6.47595, 8]}, + "faces": { + "east": {"uv": [5, 0, 0, 1.5], "rotation": 180, "texture": "#1", "tintindex": 0}, + "west": {"uv": [0, 1.5, 5, 0], "rotation": 180, "texture": "#1", "tintindex": 0}, + "up": {"uv": [5, 0, 0, 1.5], "rotation": 90, "texture": "#1", "tintindex": 0}, + "down": {"uv": [0, 1.5, 5, 0], "rotation": 90, "texture": "#1", "tintindex": 0} + } + }, + { + "from": [5.475, 3.975, 1], + "to": [10.525, 9.025, -0.025], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 3, 1]}, + "faces": { + "east": {"uv": [4, 0, 4.5, 2.5], "texture": "#0"}, + "west": {"uv": [2, 0, 2.5, 2.5], "texture": "#0"}, + "up": {"uv": [2, 0, 4.5, 0.5], "texture": "#0"}, + "down": {"uv": [2, 2, 4.5, 2.5], "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [11.5, 10, 2.925], + "to": [4.5, 3, 2.925], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -0.075]}, + "faces": { + "north": {"uv": [0, 16, 3.5, 12.5], "texture": "#0"} + } + }, + { + "from": [1.23153, 11.76706, -7.025], + "to": [6.23153, 11.76706, 1.975], + "rotation": {"angle": -45, "axis": "z", "origin": [2.73153, 11.76706, -5.025]}, + "faces": { + "up": {"uv": [15.484, 0.016, 11.016, 2.484], "rotation": 270, "texture": "#0"}, + "down": {"uv": [11.016, 0.016, 15.484, 2.484], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [1.23153, 11.76706, 1.975], + "to": [6.23153, 11.76706, 11.975], + "rotation": {"angle": -45, "axis": "z", "origin": [2.73153, 11.76706, -4.025]}, + "faces": { + "up": {"uv": [11.016, 3.016, 15.984, 5.484], "rotation": 270, "texture": "#0"}, + "down": {"uv": [15.984, 3.016, 11.016, 5.484], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9.76847, 11.76706, 1.975], + "to": [14.76847, 11.76706, 11.975], + "rotation": {"angle": 45, "axis": "z", "origin": [13.26847, 11.76706, -4.025]}, + "faces": { + "up": {"uv": [11.016, 5.484, 15.984, 3.016], "rotation": 270, "texture": "#0"}, + "down": {"uv": [15.984, 5.484, 11.016, 3.016], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9.76847, 1.23294, 1.975], + "to": [14.76847, 1.23294, 11.975], + "rotation": {"angle": -45, "axis": "z", "origin": [13.26847, 1.23294, -4.025]}, + "faces": { + "up": {"uv": [11.016, 5.484, 15.984, 3.016], "rotation": 270, "texture": "#0"}, + "down": {"uv": [15.984, 5.484, 11.016, 3.016], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [1.23153, 1.23294, 1.975], + "to": [6.23153, 1.23294, 11.975], + "rotation": {"angle": 45, "axis": "z", "origin": [2.73153, 1.23294, -4.025]}, + "faces": { + "up": {"uv": [11.016, 3.016, 15.984, 5.484], "rotation": 270, "texture": "#0"}, + "down": {"uv": [15.984, 3.016, 11.016, 5.484], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9.76847, 11.76706, -7.025], + "to": [14.76847, 11.76706, 1.975], + "rotation": {"angle": 45, "axis": "z", "origin": [13.26847, 11.76706, -5.025]}, + "faces": { + "up": {"uv": [15.484, 2.484, 11.016, 0.016], "rotation": 270, "texture": "#0"}, + "down": {"uv": [11.016, 2.484, 15.484, 0.016], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9.76847, 1.23294, -7.025], + "to": [14.76847, 1.23294, 1.975], + "rotation": {"angle": -45, "axis": "z", "origin": [13.26847, 1.23294, -5.025]}, + "faces": { + "up": {"uv": [15.484, 2.484, 11.016, 0.016], "rotation": 270, "texture": "#0"}, + "down": {"uv": [11.016, 2.484, 15.484, 0.016], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [1.23153, 1.23294, -7.025], + "to": [6.23153, 1.23294, 1.975], + "rotation": {"angle": 45, "axis": "z", "origin": [2.73153, 1.23294, -5.025]}, + "faces": { + "up": {"uv": [15.484, 0.016, 11.016, 2.484], "rotation": 270, "texture": "#0"}, + "down": {"uv": [11.016, 0.016, 15.484, 2.484], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube inverted", + "from": [11.7, 10.2, 3.175], + "to": [4.3, 2.8, -0.225], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -0.025]}, + "faces": { + "east": {"uv": [14.484, 15.984, 13.016, 12.516], "texture": "#0"}, + "west": {"uv": [13.016, 15.984, 14.484, 12.516], "texture": "#0"}, + "up": {"uv": [13.016, 15.984, 14.484, 12.516], "rotation": 90, "texture": "#0"}, + "down": {"uv": [14.484, 15.984, 13.016, 12.516], "rotation": 90, "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.26, -7.25], + "scale": [0.85742, 0.85742, 0.85742] + }, + "thirdperson_lefthand": { + "translation": [0, -0.26, -7.25], + "scale": [0.85742, 0.85742, 0.85742] + }, + "firstperson_righthand": { + "rotation": [12.69, -2.61, 3.32], + "translation": [9.5, 0, -23.75], + "scale": [2.03, 2.18945, 1.82984] + }, + "firstperson_lefthand": { + "rotation": [12.69, -2.61, 3.32], + "translation": [9.5, 0, -23.75], + "scale": [2.03, 2.18945, 1.82984] + }, + "ground": { + "rotation": [15, 0, 0], + "translation": [0, 3.25, 0], + "scale": [0.58984, 0.58984, 0.58984] + }, + "gui": { + "rotation": [26.75, -139, 0], + "translation": [-2.25, 2.25, 0], + "scale": [0.70703, 0.70703, 0.70703] + }, + "head": { + "rotation": [12.25, 0.43, -3.04], + "translation": [0.5, 13, 0] + }, + "fixed": { + "rotation": [-90, -90, 0], + "translation": [-1, 0.25, -7.75] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + { + "name": "group", + "origin": [8, 6.5, 11.5], + "color": 0, + "nbt": "{}", + "children": [11, 12, 13, 14, 15, 16, 17, 18] + }, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41 + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/item/chair.json b/src/main/resources/assets/portalcubed/models/item/chair.json index ad8f3e6e..3dfbc81e 100644 --- a/src/main/resources/assets/portalcubed/models/item/chair.json +++ b/src/main/resources/assets/portalcubed/models/item/chair.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [64, 64], "textures": { - "0": "portalcubed:item/chair" + "0": "portalcubed:entity/chair" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/companion_cube.json b/src/main/resources/assets/portalcubed/models/item/companion_cube.json index f33cc84b..4064706d 100644 --- a/src/main/resources/assets/portalcubed/models/item/companion_cube.json +++ b/src/main/resources/assets/portalcubed/models/item/companion_cube.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [64, 64], "textures": { - "2": "portalcubed:item/companion_cube" + "2": "portalcubed:entity/companion_cube" }, "elements": [ { @@ -10,12 +10,12 @@ "to": [13, 10, 13], "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, "faces": { - "north": {"uv": [2.5, 2.5, 5, 5], "texture": "#2"}, - "east": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "south": {"uv": [7.5, 2.5, 10, 5], "texture": "#2"}, - "west": {"uv": [5, 2.5, 7.5, 5], "texture": "#2"}, - "up": {"uv": [5, 2.5, 2.5, 0], "texture": "#2"}, - "down": {"uv": [7.5, 0, 5, 2.5], "texture": "#2"} + "north": {"uv": [2.5, 13.5, 5, 16], "texture": "#2"}, + "east": {"uv": [0, 13.5, 2.5, 16], "texture": "#2"}, + "south": {"uv": [7.5, 13.5, 10, 16], "texture": "#2"}, + "west": {"uv": [5, 13.5, 7.5, 16], "texture": "#2"}, + "up": {"uv": [5, 13.5, 2.5, 11], "texture": "#2"}, + "down": {"uv": [7.5, 11, 5, 13.5], "texture": "#2"} } }, { diff --git a/src/main/resources/assets/portalcubed/models/item/computer.json b/src/main/resources/assets/portalcubed/models/item/computer.json index 34d135e4..fa7ed55b 100644 --- a/src/main/resources/assets/portalcubed/models/item/computer.json +++ b/src/main/resources/assets/portalcubed/models/item/computer.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/computer" + "0": "portalcubed:entity/computer" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/core_frame.json b/src/main/resources/assets/portalcubed/models/item/core_frame.json index 98256fe2..da30da06 100644 --- a/src/main/resources/assets/portalcubed/models/item/core_frame.json +++ b/src/main/resources/assets/portalcubed/models/item/core_frame.json @@ -2,7 +2,7 @@ "credit": "Made by Cart3r using Blockbench.", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/core_frame" + "0": "portalcubed:entity/core_frame" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/curiosity_core.json b/src/main/resources/assets/portalcubed/models/item/curiosity_core.json index baf573f8..e4bff2de 100644 --- a/src/main/resources/assets/portalcubed/models/item/curiosity_core.json +++ b/src/main/resources/assets/portalcubed/models/item/curiosity_core.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/portal_1_cores" + "0": "portalcubed:entity/portal_1_cores" }, "elements": [ { @@ -34,10 +34,6 @@ "to": [11.45, 5.55, 4.75], "rotation": {"angle": 45, "axis": "x", "origin": [7.95, 5.55, 5.125]}, "faces": { - "north": {"uv": [1.5, 12, 1.5, 15.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [1.5, 10.5, 1.5, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [3, 12, 3, 15.5], "rotation": 270, "texture": "#0"}, - "west": {"uv": [1.5, 12, 1.5, 10.5], "rotation": 270, "texture": "#0"}, "up": {"uv": [0, 12, 1.5, 15.5], "rotation": 270, "texture": "#0"}, "down": {"uv": [1.5, 12, 0, 15.5], "rotation": 270, "texture": "#0"} } @@ -73,10 +69,6 @@ "to": [11.45, 0.55, 4.75], "rotation": {"angle": -45, "axis": "x", "origin": [7.95, 0.5, 5.25]}, "faces": { - "north": {"uv": [1.5, 12, 1.5, 15.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [1.5, 10.5, 1.5, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [3, 12, 3, 15.5], "rotation": 270, "texture": "#0"}, - "west": {"uv": [1.5, 12, 1.5, 10.5], "rotation": 270, "texture": "#0"}, "up": {"uv": [0, 12, 1.5, 15.5], "rotation": 270, "texture": "#0"}, "down": {"uv": [1.5, 12, 0, 15.5], "rotation": 270, "texture": "#0"} } @@ -85,12 +77,7 @@ "from": [6.5, 1.5, 5.075], "to": [9.5, 4.5, 6.075], "faces": { - "north": {"uv": [12.5, 0.5, 14, 2], "texture": "#0"}, - "east": {"uv": [12, 0.5, 12.5, 2], "texture": "#0"}, - "south": {"uv": [14.5, 0.5, 16, 2], "texture": "#0"}, - "west": {"uv": [14, 0.5, 14.5, 2], "texture": "#0"}, - "up": {"uv": [14, 0.5, 12.5, 0], "texture": "#0"}, - "down": {"uv": [15.5, 0, 14, 0.5], "texture": "#0"} + "north": {"uv": [12.5, 7.5, 14, 9], "texture": "#0"} } } ], diff --git a/src/main/resources/assets/portalcubed/models/item/fact_core.json b/src/main/resources/assets/portalcubed/models/item/fact_core.json index cfd13a7d..61cd1dee 100644 --- a/src/main/resources/assets/portalcubed/models/item/fact_core.json +++ b/src/main/resources/assets/portalcubed/models/item/fact_core.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/portal_2_cores" + "0": "portalcubed:entity/portal_2_cores" }, "elements": [ { @@ -90,7 +90,7 @@ "from": [6.5, 1.5, 5.075], "to": [9.5, 4.5, 6.075], "faces": { - "north": {"uv": [12.5, 3.5, 14, 5], "texture": "#0"} + "north": {"uv": [12.5, 10.5, 14, 12], "texture": "#0"} } } ], diff --git a/src/main/resources/assets/portalcubed/models/item/intelligence_core.json b/src/main/resources/assets/portalcubed/models/item/intelligence_core.json index 7bfcdcfa..c5c5dbc6 100644 --- a/src/main/resources/assets/portalcubed/models/item/intelligence_core.json +++ b/src/main/resources/assets/portalcubed/models/item/intelligence_core.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/portal_1_cores" + "0": "portalcubed:entity/portal_1_cores" }, "elements": [ { @@ -34,10 +34,6 @@ "to": [11.45, 5.55, 4.75], "rotation": {"angle": 45, "axis": "x", "origin": [7.95, 5.55, 5.125]}, "faces": { - "north": {"uv": [1.5, 12, 1.5, 15.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [1.5, 10.5, 1.5, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [3, 12, 3, 15.5], "rotation": 270, "texture": "#0"}, - "west": {"uv": [1.5, 12, 1.5, 10.5], "rotation": 270, "texture": "#0"}, "up": {"uv": [0, 12, 1.5, 15.5], "rotation": 270, "texture": "#0"}, "down": {"uv": [1.5, 12, 0, 15.5], "rotation": 270, "texture": "#0"} } @@ -73,10 +69,6 @@ "to": [11.45, 0.55, 4.75], "rotation": {"angle": -45, "axis": "x", "origin": [7.95, 0.5, 5.25]}, "faces": { - "north": {"uv": [1.5, 12, 1.5, 15.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [1.5, 10.5, 1.5, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [3, 12, 3, 15.5], "rotation": 270, "texture": "#0"}, - "west": {"uv": [1.5, 12, 1.5, 10.5], "rotation": 270, "texture": "#0"}, "up": {"uv": [0, 12, 1.5, 15.5], "rotation": 270, "texture": "#0"}, "down": {"uv": [1.5, 12, 0, 15.5], "rotation": 270, "texture": "#0"} } @@ -85,12 +77,7 @@ "from": [6.5, 1.5, 5.075], "to": [9.5, 4.5, 6.075], "faces": { - "north": {"uv": [12.5, 5, 14, 6.5], "texture": "#0"}, - "east": {"uv": [12, 5, 12.5, 6.5], "texture": "#0"}, - "south": {"uv": [14.5, 5, 16, 6.5], "texture": "#0"}, - "west": {"uv": [14, 5, 14.5, 6.5], "texture": "#0"}, - "up": {"uv": [14, 5, 12.5, 4.5], "texture": "#0"}, - "down": {"uv": [15.5, 4.5, 14, 5], "texture": "#0"} + "north": {"uv": [12.5, 12, 14, 13.5], "texture": "#0"} } } ], diff --git a/src/main/resources/assets/portalcubed/models/item/jug.json b/src/main/resources/assets/portalcubed/models/item/jug.json index 91241327..efbea93e 100644 --- a/src/main/resources/assets/portalcubed/models/item/jug.json +++ b/src/main/resources/assets/portalcubed/models/item/jug.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/water_jug" + "0": "portalcubed:entity/water_jug" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/lil_pineapple.json b/src/main/resources/assets/portalcubed/models/item/lil_pineapple.json index 046eb8c1..67c05ecb 100644 --- a/src/main/resources/assets/portalcubed/models/item/lil_pineapple.json +++ b/src/main/resources/assets/portalcubed/models/item/lil_pineapple.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [64, 64], "textures": { - "0": "portalcubed:item/lil_pineapple" + "0": "portalcubed:entity/lil_pineapple" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/mel_portal_gun.json b/src/main/resources/assets/portalcubed/models/item/mel_portal_gun.json index 6ff70718..2c87a500 100644 --- a/src/main/resources/assets/portalcubed/models/item/mel_portal_gun.json +++ b/src/main/resources/assets/portalcubed/models/item/mel_portal_gun.json @@ -30,28 +30,6 @@ "down": {"uv": [6.984, 4.016, 4.016, 7.984], "texture": "#0"} } }, - { - "from": [5.5, 0.5, 2], - "to": [10.5, 4.5, 17], - "faces": { - "north": {"uv": [1.016, 11.016, 3.484, 12.984], "texture": "#0"}, - "east": {"uv": [7.484, 9.016, 0.016, 10.984], "texture": "#0"}, - "south": {"uv": [3.016, 13.516, 4.984, 15.984], "rotation": 270, "texture": "#0"}, - "west": {"uv": [0.016, 9.016, 7.484, 10.984], "texture": "#0"}, - "up": {"uv": [0.016, 13.516, 7.484, 15.984], "rotation": 90, "texture": "#0"}, - "down": {"uv": [7.484, 11.016, 0.016, 13.484], "rotation": 90, "texture": "#0"} - } - }, - { - "from": [5.5, 4.5, 8], - "to": [10.5, 6.5, 17], - "faces": { - "north": {"uv": [5.016, 13.516, 5.984, 15.984], "rotation": 270, "texture": "#0"}, - "east": {"uv": [3, 9.016, 7.468, 9.984], "texture": "#0"}, - "south": {"uv": [5.016, 13.516, 5.984, 15.984], "rotation": 270, "texture": "#0"}, - "west": {"uv": [3, 9.016, 7.468, 9.984], "texture": "#0"} - } - }, { "name": "cube inverted", "from": [11, 6, 6], @@ -77,6 +55,28 @@ "down": {"uv": [15.984, 0.016, 13.016, 5.484], "texture": "#0"} } }, + { + "from": [5.5, 0.5, 2], + "to": [10.5, 4.5, 17], + "faces": { + "north": {"uv": [1.016, 11.016, 3.484, 12.984], "texture": "#0"}, + "east": {"uv": [7.484, 9.016, 0.016, 10.984], "texture": "#0"}, + "south": {"uv": [3.016, 13.516, 4.984, 15.984], "rotation": 270, "texture": "#0"}, + "west": {"uv": [0.016, 9.016, 7.484, 10.984], "texture": "#0"}, + "up": {"uv": [0.016, 13.516, 7.484, 15.984], "rotation": 90, "texture": "#0"}, + "down": {"uv": [7.484, 11.016, 0.016, 13.484], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [5.5, 4.5, 8], + "to": [10.5, 6.5, 17], + "faces": { + "north": {"uv": [5.016, 13.516, 5.984, 15.984], "rotation": 270, "texture": "#0"}, + "east": {"uv": [3, 9.016, 7.468, 9.984], "texture": "#0"}, + "south": {"uv": [5.016, 13.516, 5.984, 15.984], "rotation": 270, "texture": "#0"}, + "west": {"uv": [3, 9.016, 7.468, 9.984], "texture": "#0"} + } + }, { "from": [6.45, 4.5, 2], "to": [9.55, 3.5, 8], @@ -89,9 +89,9 @@ } }, { - "from": [7, 3.5, 2.075], - "to": [9, 5.5, 8.075], - "rotation": {"angle": 45, "axis": "z", "origin": [8, 4.5, 2.575]}, + "from": [7, 3.225, 2], + "to": [9, 5.225, 8], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 4.225, 2.575]}, "faces": { "east": {"uv": [4.016, 8.016, 6.984, 8.984], "texture": "#0"}, "west": {"uv": [4.016, 8.016, 6.984, 8.984], "texture": "#0"}, @@ -100,20 +100,20 @@ } }, { - "from": [7.5, 4.5, 3.075], - "to": [8.5, 5.5, 8.075], - "rotation": {"angle": 45, "axis": "z", "origin": [8.5, 4.5, 2.575]}, + "from": [7.75, 4.275, 3.075], + "to": [8.75, 5.275, 8.075], + "rotation": {"angle": 45, "axis": "z", "origin": [8.75, 4.275, 2.575]}, "faces": { "east": {"uv": [14.016, 13.516, 14.484, 15.984], "rotation": 90, "texture": "#1", "tintindex": 0}, - "west": {"uv": [14.016, 13.516, 14.484, 15.984], "texture": "#1", "tintindex": 0}, + "west": {"uv": [14.016, 13.5, 14.484, 15.984], "rotation": 90, "texture": "#1", "tintindex": 0}, "up": {"uv": [14.016, 13.516, 14.484, 15.984], "texture": "#1", "tintindex": 0}, "down": {"uv": [14.016, 13.516, 14.484, 15.984], "texture": "#1", "tintindex": 0} } }, { - "from": [1.25, 1.325, -7.075], - "to": [5.25, 1.325, 2.925], - "rotation": {"angle": 22.5, "axis": "z", "origin": [6.25, 1.325, 2.425]}, + "from": [1.25, 1.325, -7], + "to": [5.25, 1.325, 3], + "rotation": {"angle": 22.5, "axis": "z", "origin": [6.25, 1.325, 2.5]}, "faces": { "up": {"uv": [12.984, 8.016, 8.016, 9.984], "rotation": 90, "texture": "#0"}, "down": {"uv": [8.016, 8.016, 12.984, 9.984], "rotation": 90, "texture": "#0"} @@ -138,57 +138,57 @@ } }, { - "from": [1.75, 0.825, -7.075], - "to": [4.75, 1.825, -7.075], - "rotation": {"angle": 22.5, "axis": "z", "origin": [6.25, 1.325, 2.425]}, + "from": [1.75, 0.825, -7], + "to": [4.75, 1.825, -7], + "rotation": {"angle": 22.5, "axis": "z", "origin": [6.25, 1.325, 2.5]}, "faces": { "north": {"uv": [9.032, 14.016, 10.5, 14.484], "texture": "#0"}, "south": {"uv": [10.5, 14.016, 9.032, 14.484], "texture": "#0"} } }, { - "from": [10.75, 1.325, -7.075], - "to": [14.75, 1.325, 2.925], - "rotation": {"angle": -22.5, "axis": "z", "origin": [9.75, 1.325, 2.425]}, + "from": [10.75, 1.325, -7], + "to": [14.75, 1.325, 3], + "rotation": {"angle": -22.5, "axis": "z", "origin": [9.75, 1.325, 2.5]}, "faces": { "up": {"uv": [12.984, 11.984, 8.016, 10.016], "rotation": 90, "texture": "#0"}, "down": {"uv": [8.016, 11.984, 12.984, 10.016], "rotation": 90, "texture": "#0"} } }, { - "from": [7.999, 6.02125, -6.01], - "to": [7.999, 10.02125, 1.99], - "rotation": {"angle": 0, "axis": "y", "origin": [7.9995, 5.54813, -4.2675]}, + "from": [8, 7, -7], + "to": [8, 11, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [7.9995, 6.54813, -4.1925]}, "faces": { - "east": {"uv": [9.016, 12.016, 12.984, 13.984], "texture": "#0"}, - "west": {"uv": [12.984, 12.016, 9.016, 13.984], "texture": "#0"} + "east": {"uv": [8.516, 12.016, 12.984, 13.984], "texture": "#0"}, + "west": {"uv": [12.984, 12.016, 8.516, 13.984], "texture": "#0"} } }, { - "from": [7.999, 5.69625, 1.99], - "to": [7.999, 9.69625, 9.84], - "rotation": {"angle": 22.5, "axis": "y", "origin": [7.9995, 5.47313, 1.9825]}, + "from": [7.99717, 6, 2.00076], + "to": [7.99717, 10, 9.85076], + "rotation": {"angle": 22.5, "axis": "y", "origin": [7.99767, 5.77688, 1.99326]}, "faces": { "east": {"uv": [9.016, 5.984, 12.984, 4.016], "texture": "#0"}, "west": {"uv": [12.984, 5.984, 9.016, 4.016], "texture": "#0"} } }, { - "from": [11.25, 0.825, -7.075], - "to": [14.25, 1.825, -7.075], - "rotation": {"angle": -22.5, "axis": "z", "origin": [9.75, 1.325, 2.425]}, + "from": [11.25, 0.825, -7], + "to": [14.25, 1.825, -7], + "rotation": {"angle": -22.5, "axis": "z", "origin": [9.75, 1.325, 2.5]}, "faces": { - "north": {"uv": [6.516, 11.484, 6.984, 10.016], "rotation": 90, "texture": "#0"}, - "south": {"uv": [6.516, 11.484, 6.984, 10.016], "rotation": 90, "texture": "#0"} + "north": {"uv": [6.516, 12.484, 6.984, 11.016], "rotation": 270, "texture": "#0"}, + "south": {"uv": [6.516, 12.484, 6.984, 11.016], "rotation": 90, "texture": "#0"} } }, { - "from": [7.5, 6.575, -6.025], - "to": [8.5, 9.575, -6.025], - "rotation": {"angle": 0, "axis": "y", "origin": [7.9995, 5.54813, -4.2675]}, + "from": [7.5, 7.575, -7], + "to": [8.5, 10.575, -7], + "rotation": {"angle": 0, "axis": "y", "origin": [7.9995, 6.54813, -5.1925]}, "faces": { - "north": {"uv": [6.516, 11.484, 6.984, 10.016], "rotation": 180, "texture": "#0"}, - "south": {"uv": [6.516, 11.484, 6.984, 10.016], "texture": "#0"} + "north": {"uv": [6.984, 9.516, 6.516, 10.984], "texture": "#0"}, + "south": {"uv": [6.984, 9.516, 6.516, 10.984], "texture": "#0"} } }, { @@ -200,22 +200,22 @@ } }, { - "from": [6.5, 2.04289, 0.075], - "to": [10.5, 6.04289, 3.075], - "rotation": {"angle": -45, "axis": "z", "origin": [8, 4.54289, 1.075]}, + "from": [6.5, 2.39289, 0], + "to": [10.5, 6.39289, 3], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 4.89289, 1.075]}, "faces": { "north": {"uv": [14.016, 14.016, 15.984, 15.984], "texture": "#0"}, "east": {"uv": [7.484, 15.484, 6.016, 13.516], "texture": "#0"}, - "south": {"uv": [12.016, 14.032, 13.984, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [12.016, 14.032, 13.984, 15.984], "rotation": 90, "texture": "#0"}, "west": {"uv": [6.016, 13.516, 7.484, 15.484], "texture": "#0"}, "up": {"uv": [6.016, 15.484, 7.484, 13.516], "rotation": 90, "texture": "#0"}, "down": {"uv": [7.484, 13.516, 6.016, 15.484], "rotation": 90, "texture": "#0"} } }, { - "from": [6.5, 2.04289, -2.925], - "to": [10.5, 6.04289, -1.925], - "rotation": {"angle": -45, "axis": "z", "origin": [8, 4.54289, -0.925]}, + "from": [6.5, 2.39289, -3], + "to": [10.5, 6.39289, -2], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 4.89289, -0.925]}, "faces": { "north": {"uv": [14.032, 14.032, 16, 16], "rotation": 270, "texture": "#0"}, "east": {"uv": [14.5, 16, 14, 14], "texture": "#0"}, @@ -226,9 +226,9 @@ } }, { - "from": [6.75, 3.04289, -3.925], - "to": [9.75, 6.04289, 0.075], - "rotation": {"angle": -45, "axis": "z", "origin": [7.25, 4.54289, -1.925]}, + "from": [6.75, 3.39289, -4], + "to": [9.75, 6.39289, 0], + "rotation": {"angle": -45, "axis": "z", "origin": [7.25, 4.89289, -1.925]}, "faces": { "north": {"uv": [9.016, 14.516, 10.484, 15.984], "rotation": 90, "texture": "#0"}, "east": {"uv": [11.984, 15.984, 10.516, 14.016], "rotation": 90, "texture": "#0"}, @@ -296,10 +296,13 @@ } }, "groups": [ - 0, - 1, - 2, - 3, + { + "name": "shell", + "origin": [0, 0, 0], + "color": 0, + "nbt": "{}", + "children": [0, 1, 2, 3] + }, 4, 5, 6, diff --git a/src/main/resources/assets/portalcubed/models/item/morality_core.json b/src/main/resources/assets/portalcubed/models/item/morality_core.json index 6cee7516..732dfe7b 100644 --- a/src/main/resources/assets/portalcubed/models/item/morality_core.json +++ b/src/main/resources/assets/portalcubed/models/item/morality_core.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/portal_1_cores" + "0": "portalcubed:entity/portal_1_cores" }, "elements": [ { @@ -34,10 +34,6 @@ "to": [11.45, 5.55, 4.75], "rotation": {"angle": 45, "axis": "x", "origin": [7.95, 5.55, 5.125]}, "faces": { - "north": {"uv": [1.5, 12, 1.5, 15.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [1.5, 10.5, 1.5, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [3, 12, 3, 15.5], "rotation": 270, "texture": "#0"}, - "west": {"uv": [1.5, 12, 1.5, 10.5], "rotation": 270, "texture": "#0"}, "up": {"uv": [0, 12, 1.5, 15.5], "rotation": 270, "texture": "#0"}, "down": {"uv": [1.5, 12, 0, 15.5], "rotation": 270, "texture": "#0"} } @@ -73,10 +69,6 @@ "to": [11.45, 0.55, 4.75], "rotation": {"angle": -45, "axis": "x", "origin": [7.95, 0.5, 5.25]}, "faces": { - "north": {"uv": [1.5, 12, 1.5, 15.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [1.5, 10.5, 1.5, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [3, 12, 3, 15.5], "rotation": 270, "texture": "#0"}, - "west": {"uv": [1.5, 12, 1.5, 10.5], "rotation": 270, "texture": "#0"}, "up": {"uv": [0, 12, 1.5, 15.5], "rotation": 270, "texture": "#0"}, "down": {"uv": [1.5, 12, 0, 15.5], "rotation": 270, "texture": "#0"} } @@ -85,12 +77,7 @@ "from": [6.5, 1.5, 5.075], "to": [9.5, 4.5, 6.075], "faces": { - "north": {"uv": [12.5, 3.5, 14, 5], "texture": "#0"}, - "east": {"uv": [12, 3.5, 12.5, 5], "texture": "#0"}, - "south": {"uv": [14.5, 3.5, 16, 5], "texture": "#0"}, - "west": {"uv": [14, 3.5, 14.5, 5], "texture": "#0"}, - "up": {"uv": [14, 3.5, 12.5, 3], "texture": "#0"}, - "down": {"uv": [15.5, 3, 14, 3.5], "texture": "#0"} + "north": {"uv": [12.5, 10.5, 14, 12], "texture": "#0"} } } ], diff --git a/src/main/resources/assets/portalcubed/models/item/mug.json b/src/main/resources/assets/portalcubed/models/item/mug.json index d4dd47a3..ee163465 100644 --- a/src/main/resources/assets/portalcubed/models/item/mug.json +++ b/src/main/resources/assets/portalcubed/models/item/mug.json @@ -1,7 +1,7 @@ { "credit": "Made with Blockbench by Cart3r. ", "textures": { - "0": "portalcubed:item/mug_white" + "0": "portalcubed:entity/mug_white" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/old_ap_cube.json b/src/main/resources/assets/portalcubed/models/item/old_ap_cube.json index b7a8edd4..d775eb3d 100644 --- a/src/main/resources/assets/portalcubed/models/item/old_ap_cube.json +++ b/src/main/resources/assets/portalcubed/models/item/old_ap_cube.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [64, 64], "textures": { - "1": "portalcubed:item/old_ap_cube" + "1": "portalcubed:entity/old_ap_cube" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/portal_1_companion_cube.json b/src/main/resources/assets/portalcubed/models/item/portal_1_companion_cube.json index 4f81355f..79df26f6 100644 --- a/src/main/resources/assets/portalcubed/models/item/portal_1_companion_cube.json +++ b/src/main/resources/assets/portalcubed/models/item/portal_1_companion_cube.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [64, 64], "textures": { - "1": "portalcubed:item/portal_1_companion_cube" + "1": "portalcubed:entity/portal_1_companion_cube" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/portal_1_storage_cube.json b/src/main/resources/assets/portalcubed/models/item/portal_1_storage_cube.json index a3f56626..7ff13d02 100644 --- a/src/main/resources/assets/portalcubed/models/item/portal_1_storage_cube.json +++ b/src/main/resources/assets/portalcubed/models/item/portal_1_storage_cube.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [64, 64], "textures": { - "1": "portalcubed:item/portal_1_storage_cube" + "1": "portalcubed:entity/portal_1_storage_cube" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/item/portal_gun.json b/src/main/resources/assets/portalcubed/models/item/portal_gun.json index 210fb861..7f152dae 100644 --- a/src/main/resources/assets/portalcubed/models/item/portal_gun.json +++ b/src/main/resources/assets/portalcubed/models/item/portal_gun.json @@ -248,7 +248,8 @@ {"predicate": {"custom_model_data": 103}, "model": "portalcubed:item/legacy_portal_gun_p_body"}, {"predicate": {"custom_model_data": 104}, "model": "portalcubed:item/legacy_portal_gun_reloaded"}, - {"predicate": {"custom_model_data": 201}, "model": "portalcubed:item/mel_portal_gun"} + {"predicate": {"custom_model_data": 201}, "model": "portalcubed:item/mel_portal_gun"}, + {"predicate": {"custom_model_data": 202}, "model": "portalcubed:item/beta_portal_gun"} ], "display": { "thirdperson_righthand": { diff --git a/src/main/resources/assets/portalcubed/models/item/portal_gun_primary.json b/src/main/resources/assets/portalcubed/models/item/portal_gun_primary.json index 210fb861..7f152dae 100644 --- a/src/main/resources/assets/portalcubed/models/item/portal_gun_primary.json +++ b/src/main/resources/assets/portalcubed/models/item/portal_gun_primary.json @@ -248,7 +248,8 @@ {"predicate": {"custom_model_data": 103}, "model": "portalcubed:item/legacy_portal_gun_p_body"}, {"predicate": {"custom_model_data": 104}, "model": "portalcubed:item/legacy_portal_gun_reloaded"}, - {"predicate": {"custom_model_data": 201}, "model": "portalcubed:item/mel_portal_gun"} + {"predicate": {"custom_model_data": 201}, "model": "portalcubed:item/mel_portal_gun"}, + {"predicate": {"custom_model_data": 202}, "model": "portalcubed:item/beta_portal_gun"} ], "display": { "thirdperson_righthand": { diff --git a/src/main/resources/assets/portalcubed/models/item/portal_gun_secondary.json b/src/main/resources/assets/portalcubed/models/item/portal_gun_secondary.json index 210fb861..7f152dae 100644 --- a/src/main/resources/assets/portalcubed/models/item/portal_gun_secondary.json +++ b/src/main/resources/assets/portalcubed/models/item/portal_gun_secondary.json @@ -248,7 +248,8 @@ {"predicate": {"custom_model_data": 103}, "model": "portalcubed:item/legacy_portal_gun_p_body"}, {"predicate": {"custom_model_data": 104}, "model": "portalcubed:item/legacy_portal_gun_reloaded"}, - {"predicate": {"custom_model_data": 201}, "model": "portalcubed:item/mel_portal_gun"} + {"predicate": {"custom_model_data": 201}, "model": "portalcubed:item/mel_portal_gun"}, + {"predicate": {"custom_model_data": 202}, "model": "portalcubed:item/beta_portal_gun"} ], "display": { "thirdperson_righthand": { diff --git a/src/main/resources/assets/portalcubed/models/item/potatos_portal_gun.json b/src/main/resources/assets/portalcubed/models/item/potatos_portal_gun.json index 18e5ca5b..366b0849 100644 --- a/src/main/resources/assets/portalcubed/models/item/potatos_portal_gun.json +++ b/src/main/resources/assets/portalcubed/models/item/potatos_portal_gun.json @@ -6,7 +6,7 @@ "1": "portalcubed:item/portal_gun_dyeable", "2": "portalcubed:item/potatos", "3": "item/potato", - "particle": "portalcubed:item/potatos" + "particle": "portalcubed:item/portal_gun" }, "elements": [ { @@ -240,8 +240,8 @@ }, { "name": "potatos_0", - "from": [3.20625, 4.10625, -2.88156], - "to": [3.69375, 5.56875, -2.39406], + "from": [3.20625, 4.10625, -2.73156], + "to": [3.69375, 5.56875, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [5.016, 1.016, 7.984, 1.984], "rotation": 90, "texture": "#2"}, @@ -254,8 +254,8 @@ }, { "name": "potatos_1", - "from": [3.69375, 5.56875, -2.88156], - "to": [4.18125, 6.05625, -2.39406], + "from": [3.69375, 5.56875, -2.73156], + "to": [4.18125, 6.05625, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [4.016, 2.016, 4.984, 2.984], "rotation": 90, "texture": "#2"}, @@ -268,8 +268,8 @@ }, { "name": "potatos_2", - "from": [3.69375, 3.13125, -2.88156], - "to": [4.18125, 4.10625, -2.39406], + "from": [3.69375, 3.13125, -2.73156], + "to": [4.18125, 4.10625, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [8.016, 2.016, 9.984, 2.984], "rotation": 90, "texture": "#2"}, @@ -282,8 +282,8 @@ }, { "name": "potatos_3", - "from": [4.18125, 6.05625, -2.88156], - "to": [4.66875, 6.54375, -2.39406], + "from": [4.18125, 6.05625, -2.73156], + "to": [4.66875, 6.54375, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [3.016, 3.016, 3.984, 3.984], "rotation": 90, "texture": "#2"}, @@ -296,8 +296,8 @@ }, { "name": "potatos_4", - "from": [4.18125, 2.64375, -2.88156], - "to": [8.56875, 3.13125, -2.39406], + "from": [4.18125, 2.64375, -2.73156], + "to": [8.56875, 3.13125, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [10.016, 3.016, 10.984, 11.984], "rotation": 90, "texture": "#2"}, @@ -310,8 +310,8 @@ }, { "name": "potatos_5", - "from": [4.66875, 6.54375, -2.88156], - "to": [8.56875, 7.03125, -2.39406], + "from": [4.66875, 6.54375, -2.73156], + "to": [8.56875, 7.03125, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [2.016, 4.016, 2.984, 11.984], "rotation": 90, "texture": "#2"}, @@ -324,8 +324,8 @@ }, { "name": "potatos_6", - "from": [4.66875, 3.13125, -2.88156], - "to": [9.05625, 4.10625, -2.39406], + "from": [4.66875, 3.13125, -2.73156], + "to": [9.05625, 4.10625, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [8.016, 4.016, 9.984, 12.984], "rotation": 90, "texture": "#2"}, @@ -338,8 +338,8 @@ }, { "name": "potatos_7", - "from": [4.66875, 2.15625, -2.88156], - "to": [8.56875, 2.64375, -2.39406], + "from": [4.66875, 2.15625, -2.73156], + "to": [8.56875, 2.64375, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [11.016, 4.016, 11.984, 11.984], "rotation": 90, "texture": "#2"}, @@ -351,8 +351,8 @@ }, { "name": "potatos_8", - "from": [5.15625, 4.10625, -2.88156], - "to": [10.03125, 5.56875, -2.39406], + "from": [5.15625, 4.10625, -2.73156], + "to": [10.03125, 5.56875, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [5.016, 5.016, 7.984, 14.984], "rotation": 90, "texture": "#2"}, @@ -365,8 +365,8 @@ }, { "name": "potatos_9", - "from": [5.15625, 1.66875, -2.88156], - "to": [9.05625, 2.15625, -2.39406], + "from": [5.15625, 1.66875, -2.73156], + "to": [9.05625, 2.15625, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [12.016, 5.016, 12.984, 12.984], "rotation": 90, "texture": "#2"}, @@ -379,8 +379,8 @@ }, { "name": "potatos_10", - "from": [5.64375, 7.03125, -2.88156], - "to": [6.13125, 7.51875, -2.39406], + "from": [5.64375, 7.03125, -2.73156], + "to": [6.13125, 7.51875, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [1.016, 6.016, 1.984, 6.984], "rotation": 90, "texture": "#2"}, @@ -392,8 +392,8 @@ }, { "name": "potatos_11", - "from": [5.64375, 5.56875, -2.88156], - "to": [9.54375, 6.05625, -2.39406], + "from": [5.64375, 5.56875, -2.73156], + "to": [9.54375, 6.05625, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [4.016, 6.016, 4.984, 13.984], "rotation": 90, "texture": "#2"}, @@ -405,8 +405,8 @@ }, { "name": "potatos_12", - "from": [5.64375, 1.18125, -2.88156], - "to": [7.59375, 1.66875, -2.39406], + "from": [5.64375, 1.18125, -2.73156], + "to": [7.59375, 1.66875, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [13.016, 6.016, 13.984, 9.984], "rotation": 90, "texture": "#2"}, @@ -418,8 +418,8 @@ }, { "name": "potatos_13", - "from": [6.13125, 6.05625, -2.88156], - "to": [9.05625, 6.54375, -2.39406], + "from": [6.13125, 6.05625, -2.73156], + "to": [9.05625, 6.54375, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [3.016, 7.016, 3.984, 12.984], "rotation": 90, "texture": "#2"}, @@ -431,8 +431,8 @@ }, { "name": "potatos_14", - "from": [9.05625, 2.15625, -2.88156], - "to": [9.54375, 2.64375, -2.39406], + "from": [9.05625, 2.15625, -2.73156], + "to": [9.54375, 2.64375, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [11.016, 13.016, 11.984, 13.984], "rotation": 90, "texture": "#2"}, @@ -445,8 +445,8 @@ }, { "name": "potatos_15", - "from": [9.54375, 2.64375, -2.88156], - "to": [10.03125, 4.10625, -2.39406], + "from": [9.54375, 2.64375, -2.73156], + "to": [10.03125, 4.10625, -2.24406], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [8.016, 14.016, 10.984, 14.984], "rotation": 90, "texture": "#2"}, @@ -457,8 +457,8 @@ } }, { - "from": [2.71875, 0.20625, -2.89375], - "to": [10.51875, 8.00625, -2.89375], + "from": [2.71875, 0.20625, -2.74375], + "to": [10.51875, 8.00625, -2.74375], "rotation": {"angle": -22.5, "axis": "z", "origin": [13.11875, 4.35, 12.83422]}, "faces": { "north": {"uv": [0.016, 0.016, 15.984, 15.984], "rotation": 90, "texture": "#3"} diff --git a/src/main/resources/assets/portalcubed/models/item/radio.json b/src/main/resources/assets/portalcubed/models/item/radio.json index 32e5c872..6c146cea 100644 --- a/src/main/resources/assets/portalcubed/models/item/radio.json +++ b/src/main/resources/assets/portalcubed/models/item/radio.json @@ -1,93 +1,93 @@ { - "credit": "Made with Blockbench by Cart3r. ", - "texture_size": [64, 64], - "textures": { - "0": "portalcubed:item/radio" - }, - "elements": [ - { - "from": [6, 0, 4], - "to": [10, 1, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 8]}, - "faces": { - "north": {"uv": [4, 4, 6, 4.5], "texture": "#0"}, - "east": {"uv": [0, 4, 4, 4.5], "texture": "#0"}, - "south": {"uv": [9.5, 4, 11.5, 4.5], "texture": "#0"}, - "west": {"uv": [6, 4, 10, 4.5], "texture": "#0"}, - "up": {"uv": [6, 4, 2, 2], "rotation": 90, "texture": "#0"}, - "down": {"uv": [10, 4, 6, 2], "rotation": 90, "texture": "#0"} - } - }, - { - "from": [6.5, 1, 4.5], - "to": [9.5, 5, 11.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 1, 8.5]}, - "faces": { - "north": {"uv": [0, 8, 1.5, 10], "texture": "#0"}, - "east": {"uv": [1.5, 8, 5, 10], "texture": "#0"}, - "south": {"uv": [5, 8, 6.5, 10], "texture": "#0"}, - "west": {"uv": [6.5, 8, 10, 10], "texture": "#0"}, - "up": {"uv": [1.5, 8, 5, 6.5], "rotation": 90, "texture": "#0"} - } - }, - { - "from": [7.5, 5, 6.5], - "to": [8.5, 9, 6.5], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 7, 6.5]}, - "faces": { - "north": {"uv": [0, 0, 0.5, 2], "texture": "#0"}, - "south": {"uv": [0, 0, 0.5, 2], "texture": "#0"} - } - }, - { - "from": [7.5, 5, 6.5], - "to": [8.5, 9, 6.5], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 7, 6.5]}, - "faces": { - "north": {"uv": [0, 0, 0.5, 2], "texture": "#0"}, - "south": {"uv": [0, 0, 0.5, 2], "texture": "#0"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 3.75], - "scale": [0.85352, 0.85352, 0.85352] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 3.75], - "scale": [0.85352, 0.85352, 0.85352] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "translation": [0, 6.75, 0], - "scale": [0.85313, 0.85313, 0.85313] - }, - "firstperson_lefthand": { - "rotation": [0, -141, 0], - "translation": [0, 6.75, 0], - "scale": [0.85313, 0.85313, 0.85313] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.54297, 0.54297, 0.54297] - }, - "gui": { - "rotation": [30, 135, 0], - "translation": [0, 5.75, 0], - "scale": [1.41992, 1.41992, 1.41992] - }, - "head": { - "rotation": [180, -82, 180], - "translation": [0, 19.5, 0], - "scale": [1.67188, 1.67188, 1.67188] - }, - "fixed": { - "rotation": [0, -86.25, 0], - "translation": [0, 5, 0], - "scale": [1.30664, 1.30664, 1.30664] - } - } + "credit": "Made with Blockbench by Cart3r. ", + "texture_size": [64, 64], + "textures": { + "0": "portalcubed:entity/radio" + }, + "elements": [ + { + "from": [6, 0, 4], + "to": [10, 1, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 8]}, + "faces": { + "north": {"uv": [4, 4, 6, 4.5], "texture": "#0"}, + "east": {"uv": [0, 4, 4, 4.5], "texture": "#0"}, + "south": {"uv": [9.5, 4, 11.5, 4.5], "texture": "#0"}, + "west": {"uv": [6, 4, 10, 4.5], "texture": "#0"}, + "up": {"uv": [6, 4, 2, 2], "rotation": 90, "texture": "#0"}, + "down": {"uv": [10, 4, 6, 2], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [6.5, 1, 4.5], + "to": [9.5, 5, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 1, 8.5]}, + "faces": { + "north": {"uv": [0.008, 8.008, 1.492, 9.992], "texture": "#0"}, + "east": {"uv": [1.508, 8.008, 4.992, 9.992], "texture": "#0"}, + "south": {"uv": [5.008, 8.008, 6.492, 9.992], "texture": "#0"}, + "west": {"uv": [6.508, 8.008, 9.992, 9.992], "texture": "#0"}, + "up": {"uv": [1.508, 7.992, 4.992, 6.508], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [7.5, 5, 6.5], + "to": [8.5, 9, 6.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 7, 6.5]}, + "faces": { + "north": {"uv": [0, 0, 0.5, 2], "texture": "#0"}, + "south": {"uv": [0, 0, 0.5, 2], "texture": "#0"} + } + }, + { + "from": [7.5, 5, 6.5], + "to": [8.5, 9, 6.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 7, 6.5]}, + "faces": { + "north": {"uv": [0, 0, 0.5, 2], "texture": "#0"}, + "south": {"uv": [0, 0, 0.5, 2], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.75], + "scale": [0.85352, 0.85352, 0.85352] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.75], + "scale": [0.85352, 0.85352, 0.85352] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 6.75, 0], + "scale": [0.85313, 0.85313, 0.85313] + }, + "firstperson_lefthand": { + "rotation": [0, -141, 0], + "translation": [0, 6.75, 0], + "scale": [0.85313, 0.85313, 0.85313] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.54297, 0.54297, 0.54297] + }, + "gui": { + "rotation": [30, 135, 0], + "translation": [0, 5.75, 0], + "scale": [1.41992, 1.41992, 1.41992] + }, + "head": { + "rotation": [180, -82, 180], + "translation": [0, 19.5, 0], + "scale": [1.67188, 1.67188, 1.67188] + }, + "fixed": { + "rotation": [0, -86.25, 0], + "translation": [0, 5, 0], + "scale": [1.30664, 1.30664, 1.30664] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/item/redirection_cube.json b/src/main/resources/assets/portalcubed/models/item/redirection_cube.json index a193916b..f498c0ae 100644 --- a/src/main/resources/assets/portalcubed/models/item/redirection_cube.json +++ b/src/main/resources/assets/portalcubed/models/item/redirection_cube.json @@ -1,100 +1,100 @@ { - "credit": "Made with Blockbench by Cart3r. ", - "texture_size": [64, 64], - "textures": { - "2": "portalcubed:item/redirection_cube" - }, - "elements": [ - { - "from": [2.99, -0.01, 2.99], - "to": [13.01, 10.01, 13.01], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, - "faces": { - "north": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "east": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "south": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "up": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "down": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"} - } - }, - { - "from": [3, 0, 13], - "to": [13, 10, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, -1]}, - "faces": { - "north": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "east": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "south": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "west": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "up": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "down": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"} - } - }, - { - "from": [2.7, -0.3, 2.7], - "to": [13.3, 10.3, 13.3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, - "faces": { - "north": {"uv": [2.5, 7.5, 5, 10], "texture": "#2"}, - "east": {"uv": [0, 7.5, 2.5, 10], "texture": "#2"}, - "south": {"uv": [7.5, 7.5, 10, 10], "texture": "#2"}, - "west": {"uv": [5, 7.5, 7.5, 10], "texture": "#2"}, - "up": {"uv": [5, 7.5, 2.5, 5], "texture": "#2"}, - "down": {"uv": [7.5, 5, 5, 7.5], "texture": "#2"} - } - }, - { - "from": [4.5, 1.5, 4.5], - "to": [11.5, 8.5, 11.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, - "faces": { - "north": {"uv": [1.5, 11.5, 3, 13], "texture": "#2"}, - "east": {"uv": [0, 11.5, 1.5, 13], "texture": "#2"}, - "south": {"uv": [4.5, 11.5, 6, 13], "texture": "#2"}, - "west": {"uv": [3, 11.5, 4.5, 13], "texture": "#2"}, - "up": {"uv": [3, 11.5, 1.5, 10], "texture": "#2"}, - "down": {"uv": [4.5, 10, 3, 11.5], "texture": "#2"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 1.25], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 1.25], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "translation": [0.5, 2.75, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 45, 0], - "translation": [0.5, 2.75, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.48633, 0.48633, 0.48633] - }, - "gui": { - "rotation": [30, 225, 0], - "translation": [0, 1.75, 0], - "scale": [0.73633, 0.73633, 0.73633] - }, - "head": { - "translation": [0, 3.75, 0], - "scale": [1.57617, 1.57617, 1.57617] - }, - "fixed": { - "translation": [0, 2.75, 0], - "scale": [0.94922, 0.94922, 0.94922] - } - } + "credit": "Made with Blockbench by Cart3r. ", + "texture_size": [64, 64], + "textures": { + "2": "portalcubed:entity/redirection_cube" + }, + "elements": [ + { + "from": [2.99, -0.01, 2.99], + "to": [13.01, 10.01, 13.01], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [2.508, 2.508, 4.992, 4.992], "texture": "#2"}, + "east": {"uv": [0.008, 2.508, 2.492, 4.992], "texture": "#2"}, + "south": {"uv": [7.508, 2.508, 9.992, 4.992], "texture": "#2"}, + "west": {"uv": [5.008, 2.508, 7.492, 4.992], "texture": "#2"}, + "up": {"uv": [2.508, 0.008, 4.992, 2.492], "texture": "#2"}, + "down": {"uv": [5.008, 0.008, 7.492, 2.492], "texture": "#2"} + } + }, + { + "from": [3, 0, 13], + "to": [13, 10, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, -1]}, + "faces": { + "north": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "east": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "south": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "west": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "up": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "down": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"} + } + }, + { + "from": [2.7, -0.3, 2.7], + "to": [13.3, 10.3, 13.3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [2.5, 7.5, 5, 10], "texture": "#2"}, + "east": {"uv": [0, 7.5, 2.5, 10], "texture": "#2"}, + "south": {"uv": [7.5, 7.5, 10, 10], "texture": "#2"}, + "west": {"uv": [5, 7.5, 7.5, 10], "texture": "#2"}, + "up": {"uv": [5, 7.5, 2.5, 5], "texture": "#2"}, + "down": {"uv": [7.5, 5, 5, 7.5], "texture": "#2"} + } + }, + { + "from": [4.5, 1.5, 4.5], + "to": [11.5, 8.5, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [1.508, 11.508, 2.992, 12.992], "texture": "#2"}, + "east": {"uv": [0.008, 11.508, 1.492, 12.992], "texture": "#2"}, + "south": {"uv": [4.508, 11.508, 5.992, 12.992], "texture": "#2"}, + "west": {"uv": [3.008, 11.508, 4.492, 12.992], "texture": "#2"}, + "up": {"uv": [2.992, 11.492, 1.508, 10.008], "texture": "#2"}, + "down": {"uv": [4.492, 10.008, 3.008, 11.492], "texture": "#2"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 1.25], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 1.25], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0.5, 2.75, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0.5, 2.75, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.48633, 0.48633, 0.48633] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1.75, 0], + "scale": [0.73633, 0.73633, 0.73633] + }, + "head": { + "translation": [0, 3.75, 0], + "scale": [1.57617, 1.57617, 1.57617] + }, + "fixed": { + "translation": [0, 2.75, 0], + "scale": [0.94922, 0.94922, 0.94922] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/item/schrodinger_cube.json b/src/main/resources/assets/portalcubed/models/item/schrodinger_cube.json index eb36e061..c5ce5538 100644 --- a/src/main/resources/assets/portalcubed/models/item/schrodinger_cube.json +++ b/src/main/resources/assets/portalcubed/models/item/schrodinger_cube.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [64, 64], "textures": { - "2": "portalcubed:item/schrodinger_cube" + "2": "portalcubed:entity/schrodinger_cube" }, "elements": [ { @@ -10,12 +10,12 @@ "to": [13.01, 10.01, 13.01], "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, "faces": { - "north": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "east": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "south": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "up": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "down": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"} + "north": {"uv": [2.508, 2.508, 4.992, 4.992], "texture": "#2"}, + "east": {"uv": [0.008, 2.508, 2.492, 4.992], "texture": "#2"}, + "south": {"uv": [7.508, 2.508, 9.992, 4.992], "texture": "#2"}, + "west": {"uv": [5.008, 2.508, 7.492, 4.992], "texture": "#2"}, + "up": {"uv": [2.508, 0.008, 4.992, 2.492], "texture": "#2"}, + "down": {"uv": [5.008, 0.008, 7.492, 2.492], "texture": "#2"} } }, { @@ -23,12 +23,12 @@ "to": [13, 10, 3], "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, -1]}, "faces": { - "north": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "east": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "south": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "west": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "up": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"}, - "down": {"uv": [5, 0, 2.5, 2.5], "texture": "#2"} + "north": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "east": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "south": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "west": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "up": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"}, + "down": {"uv": [4.992, 0.008, 2.508, 2.492], "texture": "#2"} } }, { @@ -49,12 +49,12 @@ "to": [11.5, 8.5, 11.5], "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, "faces": { - "north": {"uv": [1.5, 11.5, 3, 13], "texture": "#2"}, - "east": {"uv": [0, 11.5, 1.5, 13], "texture": "#2"}, - "south": {"uv": [4.5, 11.5, 6, 13], "texture": "#2"}, - "west": {"uv": [3, 11.5, 4.5, 13], "texture": "#2"}, - "up": {"uv": [3, 11.5, 1.5, 10], "texture": "#2"}, - "down": {"uv": [4.5, 10, 3, 11.5], "texture": "#2"} + "north": {"uv": [1.508, 11.508, 2.992, 12.992], "texture": "#2"}, + "east": {"uv": [0.008, 11.508, 1.492, 12.992], "texture": "#2"}, + "south": {"uv": [4.508, 11.508, 5.992, 12.992], "texture": "#2"}, + "west": {"uv": [3.008, 11.508, 4.492, 12.992], "texture": "#2"}, + "up": {"uv": [2.992, 11.492, 1.508, 10.008], "texture": "#2"}, + "down": {"uv": [4.492, 10.008, 3.008, 11.492], "texture": "#2"} } } ], diff --git a/src/main/resources/assets/portalcubed/models/item/space_core.json b/src/main/resources/assets/portalcubed/models/item/space_core.json index 37e1dad2..79d9f1dd 100644 --- a/src/main/resources/assets/portalcubed/models/item/space_core.json +++ b/src/main/resources/assets/portalcubed/models/item/space_core.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Cart3r. ", "texture_size": [32, 32], "textures": { - "0": "portalcubed:item/portal_2_cores" + "0": "portalcubed:entity/portal_2_cores" }, "elements": [ { @@ -90,7 +90,7 @@ "from": [6.5, 1.5, 5.075], "to": [9.5, 4.5, 6.075], "faces": { - "north": {"uv": [12.5, 5, 14, 6.5], "texture": "#0"} + "north": {"uv": [12.5, 12, 14, 13.5], "texture": "#0"} } } ], diff --git a/src/main/resources/assets/portalcubed/models/item/storage_cube.json b/src/main/resources/assets/portalcubed/models/item/storage_cube.json index 57306b26..c23ca415 100644 --- a/src/main/resources/assets/portalcubed/models/item/storage_cube.json +++ b/src/main/resources/assets/portalcubed/models/item/storage_cube.json @@ -1,74 +1,74 @@ { - "credit": "Made with Blockbench by Cart3r. ", - "texture_size": [64, 64], - "textures": { - "2": "portalcubed:item/storage_cube" - }, - "elements": [ - { - "from": [3, 0, 3], - "to": [13, 10, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, - "faces": { - "north": {"uv": [2.5, 2.5, 5, 5], "texture": "#2"}, - "east": {"uv": [0, 2.5, 2.5, 5], "texture": "#2"}, - "south": {"uv": [7.5, 2.5, 10, 5], "texture": "#2"}, - "west": {"uv": [5, 2.5, 7.5, 5], "texture": "#2"}, - "up": {"uv": [5, 2.5, 2.5, 0], "texture": "#2"}, - "down": {"uv": [7.5, 0, 5, 2.5], "texture": "#2"} - } - }, - { - "from": [2.5, -0.5, 2.5], - "to": [13.5, 10.5, 13.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, - "faces": { - "north": {"uv": [2.5, 7.5, 5, 10], "texture": "#2"}, - "east": {"uv": [0, 7.5, 2.5, 10], "texture": "#2"}, - "south": {"uv": [7.5, 7.5, 10, 10], "texture": "#2"}, - "west": {"uv": [5, 7.5, 7.5, 10], "texture": "#2"}, - "up": {"uv": [5, 7.5, 2.5, 5], "texture": "#2"}, - "down": {"uv": [7.5, 5, 5, 7.5], "texture": "#2"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 1.25], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 1.25], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "translation": [0.5, 2.75, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 45, 0], - "translation": [0.5, 2.75, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.48633, 0.48633, 0.48633] - }, - "gui": { - "rotation": [30, 225, 0], - "translation": [0, 1.75, 0], - "scale": [0.73633, 0.73633, 0.73633] - }, - "head": { - "translation": [0, 3.75, 0], - "scale": [1.57617, 1.57617, 1.57617] - }, - "fixed": { - "translation": [0, 2.75, 0], - "scale": [0.94922, 0.94922, 0.94922] - } - } + "credit": "Made with Blockbench by Cart3r. ", + "texture_size": [64, 64], + "textures": { + "2": "portalcubed:entity/storage_cube" + }, + "elements": [ + { + "from": [3, 0, 3], + "to": [13, 10, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [2.5, 13.5, 5, 16], "texture": "#2"}, + "east": {"uv": [0, 13.5, 2.5, 16], "texture": "#2"}, + "south": {"uv": [7.5, 13.5, 10, 16], "texture": "#2"}, + "west": {"uv": [5, 13.5, 7.5, 16], "texture": "#2"}, + "up": {"uv": [5, 13.5, 2.5, 11], "texture": "#2"}, + "down": {"uv": [7.5, 11, 5, 13.5], "texture": "#2"} + } + }, + { + "from": [2.5, -0.5, 2.5], + "to": [13.5, 10.5, 13.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [2.5, 7.5, 5, 10], "texture": "#2"}, + "east": {"uv": [0, 7.5, 2.5, 10], "texture": "#2"}, + "south": {"uv": [7.5, 7.5, 10, 10], "texture": "#2"}, + "west": {"uv": [5, 7.5, 7.5, 10], "texture": "#2"}, + "up": {"uv": [5, 7.5, 2.5, 5], "texture": "#2"}, + "down": {"uv": [7.5, 5, 5, 7.5], "texture": "#2"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 1.25], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 1.25], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0.5, 2.75, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0.5, 2.75, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.48633, 0.48633, 0.48633] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1.75, 0], + "scale": [0.73633, 0.73633, 0.73633] + }, + "head": { + "translation": [0, 3.75, 0], + "scale": [1.57617, 1.57617, 1.57617] + }, + "fixed": { + "translation": [0, 2.75, 0], + "scale": [0.94922, 0.94922, 0.94922] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/item/turret.json b/src/main/resources/assets/portalcubed/models/item/turret.json index 6d344386..fba6dcaf 100644 --- a/src/main/resources/assets/portalcubed/models/item/turret.json +++ b/src/main/resources/assets/portalcubed/models/item/turret.json @@ -2,7 +2,7 @@ "credit": "Made by Cart3r using Blockbench.", "texture_size": [64, 64], "textures": { - "0": "portalcubed:item/default_turret" + "0": "portalcubed:entity/default_turret" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/textures/entity/companion_cube.png b/src/main/resources/assets/portalcubed/textures/entity/companion_cube.png index 6a275d4c5a1bd4bcb07b508e1a197cc38fe56aa5..d5d6aa603b2f24cce98f3d861ab1f8c3c80ba2ca 100644 GIT binary patch delta 7267 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 delta 5319 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 aMBpDGzI4FJuBb-<0000nj delta 3343 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 Z_zTT*FwWo=zW)FK002ovPDHLkV1goSKUe?& diff --git a/src/main/resources/assets/portalcubed/textures/entity/portal_2_cores.png b/src/main/resources/assets/portalcubed/textures/entity/portal_2_cores.png index cf0fedae10b31dad0287778c008247e43d6483da..a03a58bf61fa00e107a8c96fb9b18bb605c34b16 100644 GIT binary patch delta 3579 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 B(NF*Y delta 2974 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 delta 5770 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 IM6N<$g5@tOGXMYp diff --git a/src/main/resources/assets/portalcubed/textures/entity/redirection_cube_lit.png b/src/main/resources/assets/portalcubed/textures/entity/redirection_cube_lit.png index eef45564c6b85aa18c3f498cdfe2a255b743606f..82a8415f059755ce829cc661a9163bf6ce51301b 100644 GIT binary patch delta 6054 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 delta 5840 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 diff --git a/src/main/resources/assets/portalcubed/textures/entity/redirection_cube_lit_e.png b/src/main/resources/assets/portalcubed/textures/entity/redirection_cube_lit_e.png index db9bd5f4fdf05c02479e5d5273a7051d7eb1e892..582dfb4cfe77fbd57e5277209260d4b7cdf4941b 100644 GIT binary patch literal 6195 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 K+FARcxc>pgWvm4N delta 1137 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 delta 672 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 O0000!%dFhB}PfFNzCf(VF;f`T}7 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 W*KWh*i2+ZzK*FA`elF{r5}E-2fHI^2 diff --git a/src/main/resources/assets/portalcubed/textures/entity/storage_cube.png b/src/main/resources/assets/portalcubed/textures/entity/storage_cube.png index 1f3d9cbce0303d77ce4ae958deefe846144bf5d1..4bff45be37882824e2ba908e520f1d9f77494003 100644 GIT binary patch delta 7300 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 N002ovPDHLkV1i8tPkaCX diff --git a/src/main/resources/assets/portalcubed/textures/item/beans.png b/src/main/resources/assets/portalcubed/textures/item/beans.png deleted file mode 100644 index 5a19c41e804fd5d1e673cee1d46a6b1bb62d8e0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5254 zcmeHKdpwkB8-C@O6zQZ^jESU-Ihb=Z#Ecj<5^_wuGw(aRn1h*d$d{F3BbAlfYzN2a zU{Ms63i+sLleMxPluxRy4P{%cMBh6@t$yGB)9?4~f6eiIpXa)-`@XN|e(sqk-P6N$ zrv4&*003t4+_+xoH%9f=(?LHK2??(OKx=t|kH69jjKj#}QV|jbW0ad^Fb0lCL;w(f zx8E;F{(`PI*0o$TecJTo?~1}YUxa?=sC%b7TPc@rkULt(o;A}mH_`>;{NKO3)EIIu zM=&ekXLp=cZwtjwV&Z?XJT~z7k>QP7@Zh+IS?&yj_0DV~9-$~ikH}l)w z|0<{pIX=={vmpPTT%NgwCCyLJw7NY1SDo;#YQc#TY0a&!&bF%_FWzcPD=)>3Hg24K z$>vmcj$h&2_7dgFZ{JY^=K=-Qq*7mWZnJ;r-w}2pANlj z@qH3xbxG?yYjoY?1$`qY} z<%Tj>n^FEDN+&rxxjj0(Ej{n@En?6ky{iWshAfYhG@Vv{`BqmCGo^i(Q`5v4DLB%6$ zG|f7SgYR*gFK21i_iOKMEbYk{dtSOE(bsSWv2mmCjysQ<8xK_hVyy?1p+RCJ?Qo8E zY_;(V--Xexncg{(i>X=lCC-(;d+FY^iUBwCesQi}b@#d(=kq-ppN`~ucjOayr`!^E zt_Z`H`5SKIw?w)uX2S)x%S8R>{s=Jt`mF42-|W{%UGrH9EbRx=-~E<)+ZYK>DIq;? zKjvA^(L zkh}S1J{uE;SMS=#$dGx1@u zdH%%nJ>F>i`x}eKweMP#-Y%V6I1B(9DF}z-$>VT7bPcpu98Sz)yEU#dZ3^+u@LIkt z)+qX#=Mmeq5W4%kjL?EJ^8#ZC=U>k_NVc@G+p{gQp&_&B%8EFn?rSA41>O+6{CZcRb~wPty29X9Q2phM5?#?Nz}H5st3 zcCoi?xs)+vJE%z7v&l+Is<$?7BX*xkqosvWaYuf4h|bw>nfmA9_#62%j2-2{u_L<` z?O<})H@nwH9y%iD~#BOhk||S(rDiml-n1qlfY#aWk=6@C`_Vl zEs`y{*NzwL(zoRzoo>Xe!m*qkN!MOkU$@FGHCVkz+o!-;{;ntKWo=Luf$^WEse)BK zP1TO8w+;m72h{Wr3hzmBf$^{&_sG%GnW4kkuM>hYOf?ek)i=ciWxv_lx;XSD?|{Me ztas#8XN`ErB58|;X3Z+ukNst5GdpxKoM7BTKzB!dcvfW>`$2cdoqKg*fn#HUNFXmv z`(@U3w7Z)iXczbAuVo6QVmlC$3ShfIE0N8A$Ruy=xok1!!p$bhhp4*INkCQ2ZNl^`Zw93@dOFB8314dbyG zHAET7#`^O;F&wEJ#*ppEb_ASDJQ7R7I_P6qa!ADV;;x>gK=0VtaHUel#N*@Q;_Tw= z?WFQBJdwd*;0Yu=iG)KDIK^g(5{$=56iZYT6C7MvA(SIBB_fqzRGgqd8lz-mvFJSJ zLwsTxpZ}3wqL@?x)dL?7%J4)x0$wb}Pqk1eU1Cv^$$?8V=`djm#X32HRwWoUH7XSqgi_I9h7hC>AsmB7gmGjNorDt*Kn4z? z&_o1?EP`lshMEczGFMCGVh~+UL=1+(c$p+jJ)shu>Ey{{V@Y-sUezO>QJ_+U8lZas zkwDTo#b00_L=1Z?L6x3FDwRs0kf}r}k!DY1OtJTcGPnw+3+Vun9V-tK{)rbf4%O19bZK*X@JoY1f9wb@K6V z?BCZGkwP$Pu5&Xja5FC|(>-0>2M+(V;5Q`C)!mN;)nu-R8i+rze}Rhh;IA@Ag30#L z{!gYa+DA>nU0ZK2s=ym|VUq^$+Gu6Gyc?hcENis}R&8)7Txpp7aP8vkwGBEq&1|nc zJ-O(>mB1j@_|P4nl;I{klu=KUUMZsnSsJHvu~}}G@)eE|4hJkxC9Wi?WahbeaLb)T GxBVBTs{5`0 diff --git a/src/main/resources/assets/portalcubed/textures/item/beta_portal_gun.png b/src/main/resources/assets/portalcubed/textures/item/beta_portal_gun.png new file mode 100644 index 0000000000000000000000000000000000000000..0683b2b71496448885e254e1612300720b617e87 GIT binary patch literal 7102 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/portalcubed/textures/item/chair.png b/src/main/resources/assets/portalcubed/textures/item/chair.png deleted file mode 100644 index e7fba5c687af21fe2d6b3f58f6bfd391e81fbebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7195 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 diff --git a/src/main/resources/assets/portalcubed/textures/item/core_frame.png b/src/main/resources/assets/portalcubed/textures/item/core_frame.png deleted file mode 100644 index 7648f6efa42693b3b0637aab97ea2e1e8a153806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7350 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 Hci;a3QZB*I diff --git a/src/main/resources/assets/portalcubed/textures/item/default_turret.png b/src/main/resources/assets/portalcubed/textures/item/default_turret.png deleted file mode 100644 index c1215dbf5ceed764da8168ee85340ad914538849..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 zcmV+t1?~EYP)ZnxK7S)(IrbtGn1oqJV$^_nR)A*! zfOZ-YHleQpz~#kJh&Kix)*4~&S5{Wyk;UDXK8?zJx-ch0k)s_`aBn2 zDM!G(8)1OXWCYB!#_4q^asqSx`aBmyDqvm)RIdOnC^`*5sg~^X9#pg!nv+5aHwTEOaC<+2{mN=jex*>csn9${ zloy3v^Vilt#Y6bee^sf_RA`bHk>kOcHYXHRGIs@zy;5(q&hg3xMZII&oz675i9yT`i z_x7glm7jxm$YP9g(DDo@*#;^0PrU>5%aFbg zl%GSy0L@8Z$^f43aAkM{qyY?@o8otc@^eTXeApiOhDw0@7n+L17}grA-v9sr07*qo IM6N<$g1rV_;{X5v diff --git a/src/main/resources/assets/portalcubed/textures/item/lil_pineapple.png b/src/main/resources/assets/portalcubed/textures/item/lil_pineapple.png deleted file mode 100644 index a69016c8148d4a51d92880a06ba25513cb8b851b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~e2l#}z0%_+oi5>^el|dqpyJU~#i#%TD9aE!V5-P6l#LvereMH5eQ%<|? z{Ga&s&tfIjfa(t|wb=!v1WSVag8!od2GzAQlYo+(1s;*b3=DjSL74G){)!Z!V;ntQ z977`9-%idgZdMRz;k+Yh>iP8l|6A{5rG2EE=58~7%Px1ntS^=I$OQkL0+U}XnUy4( z^FsLC=anuhuJ#vKgjW3QFqr@R=F}BlhgzEtopx_YjS~wu%Jj1G4Qid<&r$QNCvthm zyoM&;+HVX8_ZZd|i08c6%%1SpH1X?FF0(H;nU&(YW@=BH4^$w>l=Dkz8^6Yl3+gwv zZ8ZG-@8I*rD@29Am~qa~70aEJa>#_WEkGN{{U)Zo^Fy7#Xw~eNq&C6DrPYG+T0r4< ztY01-`MT06f3gwNoj2lIi~9D2y~q_(+Pjg%P|!DH<%2i%tt&oMHgLZV*D7!1+UxtR z_ls|xV#3z;`*J&D)`hU|kvjPHn_DRZ)3xW{pV!w;oSRAxv#=D|K}0~hA@MttDnm{r-UW|b28S* diff --git a/src/main/resources/assets/portalcubed/textures/item/mel_portal_gun.png b/src/main/resources/assets/portalcubed/textures/item/mel_portal_gun.png index d4f9c3787393395725f8ea9e3d0e193dc2af8e6f..73e873265e64f874b5bce2007946240eb70d4313 100644 GIT binary patch delta 4865 zcmV+c6aMU(L%~6iBLWL(ktH90X>u#O4Tb-66R zzQg@l(lh^c-MtOmuf|9|43+WR=-+SD_}DK$3_S}4^+>&#kD>Y)3jW@IaF2m@w`Ef; z`Ev_>-S7F@Nx6SUKSI7+e;N7tJ7%Icg^R)a6pu7-T+Oh)mSCj?4LU zk0%7=w>Z6D6_2*M8h@Si4VCxE{eIp2L@WAdO861v^#1`o{p*BVa)N!AHU6?KCri@f^)XKV})PdYp`)ck<(A6fr#6GPf+Cq`1StzQd|QF zibh#eq!QSEO>}WzN)Qgvfr-NRO&6EvV}KB`wBQUG5FMzwATBwZz0b}O$O1qO*F8DY zLBNUliIYBtkie#RU7AO-J5#-QE*q{RW*{LUk#hxv8eqjJ@F&LthnfV5B9bIakt!{P z6qBTsa#B%jIpk=6vgDL=F1hAbLWxC6D!G(WORK&HL{n<2xt3aMYpmI@+<3Y%p|$RN z=&_6GspnpL?QKAx5r>R4@+hN@HvJ3}{g`RyS!SJWxdoM0T(Z*2tE{@(hH5*Q9k=YX z^DevY_D1c2^)K%~K+Qd<`Gb^B%x~1Vn)AzqQ#ldE48Xj9i4MfGLI9z?VrGkr(JOL_ znXSlQ5Ra3hm`$gMfnZ$D%XTm9jK7E~a{m`@CdY5M`TrF;qtN{!a(~6`H`Jz

Ytq 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 delta 5252 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 KMNUMnLSTX_p%g;^ diff --git a/src/main/resources/assets/portalcubed/textures/item/mug_white.png b/src/main/resources/assets/portalcubed/textures/item/mug_white.png deleted file mode 100644 index 3f540254462ef4a993ac7d621775d388d7ff0857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5136 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 E2R6;frvLx| diff --git a/src/main/resources/assets/portalcubed/textures/item/old_ap_cube.png b/src/main/resources/assets/portalcubed/textures/item/old_ap_cube.png deleted file mode 100644 index 3d1a7c8640ceabb98acecc377560f16f1e58e86d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9133 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 diff --git a/src/main/resources/assets/portalcubed/textures/item/portal_1_companion_cube.png b/src/main/resources/assets/portalcubed/textures/item/portal_1_companion_cube.png deleted file mode 100644 index 422eec35469123219b46a34ead2791f9fd65fc7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8360 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 diff --git a/src/main/resources/assets/portalcubed/textures/item/portal_1_cores.png b/src/main/resources/assets/portalcubed/textures/item/portal_1_cores.png deleted file mode 100644 index 31d330df4d492aca1360f43b2b862bff629e2d44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7533 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 F@gH?U7|Q?v diff --git a/src/main/resources/assets/portalcubed/textures/item/portal_1_storage_cube.png b/src/main/resources/assets/portalcubed/textures/item/portal_1_storage_cube.png deleted file mode 100644 index fae80ff5a9d2d876b2263bd0c168ebad20254e3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8037 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 FV1hYijN1SJ delta 1661 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 E2M@s0z5oCK diff --git a/src/main/resources/assets/portalcubed/textures/item/redirection_cube.png b/src/main/resources/assets/portalcubed/textures/item/redirection_cube.png deleted file mode 100644 index 8eaff28bd3ef208b823cc529aa913856f697c2dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9150 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 diff --git a/src/main/resources/assets/portalcubed/textures/item/schrodinger_cube.png b/src/main/resources/assets/portalcubed/textures/item/schrodinger_cube.png deleted file mode 100644 index 0f4fd15ef01cde261f5884af5a8eacee066ff14c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 695 zcmV;o0!aOdP)qlgVRuXQFGe7v_V7 zH@8$n9$&7Wo-6ruJ?^(U2$nj#fAfZC`QWj9sK;~F$%O~{j@0s%!UNP}y*gGSxEo%d zwV?PHcrvdo$+{rAP9n>A>@c-jqx6Xo?6X;7ai7t_eIF6vvIr)TRzNN0loFCI@KsO z0la^0ECB0_x1Og~5ClOG`~mNABDd^1rp1Q$$&d)kuuQ_tNy66)8 z@#Fbt5lW{(PUq`2M{ZZg0$|*{+!s%QoX*#4j@+&e9pPEe`B~@dHA!w)ucZe;5ClOG d1VIqA#uqq4E3$i*Nnii~002ovPDHLkV1gr{VdDS* diff --git a/src/main/resources/assets/portalcubed/textures/item/storage_cube.png b/src/main/resources/assets/portalcubed/textures/item/storage_cube.png deleted file mode 100644 index b9b48e6ca51757df6a5d7391cc259595f3518259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9304 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 Date: Sun, 16 Jul 2023 21:50:48 -0400 Subject: [PATCH 09/26] More asset/data stuff (shocking, I know) - Changed the rocket turret textures to reduce the brightness of the emissives - Added some detail to the gel block textures - Removed the excursion funnel block references from emissive.json since they're not blocks anymore - Remade the neurotoxin emitter assets. They now actually show their `facing` state rather than having vents on all sides - Added the neurotoxin emitters to pickaxe.json and gave them a loot table - Moved the recipe advancements to the `recipes` subfolder - Tweaked the rocket turret subtitles - Fixed a punctuation mistake in the radio tooltip - Fixed an issue with the portal 2 storage cube recipe --- .../blockstates/neurotoxin_emitter.json | 50 ++++++- .../assets/portalcubed/lang/en_us.json | 8 +- .../models/block/neurotoxin_emitter_off.json | 80 ++++++++++- .../models/block/neurotoxin_emitter_on.json | 126 +++++++++++++++++- .../models/item/neurotoxin_emitter.json | 2 +- .../textures/block/adhesion_gel.png | Bin 4904 -> 5611 bytes .../textures/block/conversion_gel.png | Bin 4899 -> 5505 bytes .../block/neurotoxin_emitter_background.png | Bin 0 -> 5046 bytes .../block/neurotoxin_emitter_front.png | Bin 0 -> 5284 bytes .../textures/block/neurotoxin_emitter_off.png | Bin 265 -> 0 bytes .../textures/block/neurotoxin_emitter_on.png | Bin 280 -> 0 bytes .../block/neurotoxin_emitter_vent.png | Bin 0 -> 5120 bytes .../textures/block/propulsion_gel.png | Bin 4901 -> 5558 bytes .../textures/block/reflection_gel.png | Bin 5117 -> 5516 bytes .../textures/block/repulsion_gel.png | Bin 4900 -> 5571 bytes .../textures/block/rocket_turret_active.png | Bin 1142 -> 10547 bytes .../textures/block/rocket_turret_firing.png | Bin 1144 -> 10548 bytes .../textures/block/rocket_turret_lock_on.png | Bin 1144 -> 10548 bytes .../tags/blocks/mineable/pickaxe.json | 1 + .../aged_padded_gray_panels.json | 0 .../aged_smooth_gray_panels.json | 0 .../{ => recipes}/aged_white_panels.json | 0 .../advancements/{ => recipes}/cores.json | 0 .../{ => recipes}/destroyed_panels.json | 0 .../dirty_portal_1_metal_panels.json | 0 .../dirty_portal_1_white_panels.json | 0 .../{ => recipes}/elevator_walls.json | 0 .../advancements/{ => recipes}/equipment.json | 0 .../advancements/{ => recipes}/gels.json | 0 .../advancements/{ => recipes}/grates.json | 0 .../{ => recipes}/office_concrete.json | 0 .../old_aperture_blue_panels.json | 0 .../old_aperture_green_panels.json | 0 .../old_aperture_white_panels.json | 0 .../{ => recipes}/padded_gray_panels.json | 0 .../{ => recipes}/portal_1_metal_panels.json | 0 .../{ => recipes}/portal_1_white_panels.json | 0 .../advancements/{ => recipes}/props.json | 0 .../{ => recipes}/smooth_gray_panels.json | 0 .../{ => recipes}/test_elements.json | 0 .../{ => recipes}/white_panels.json | 0 .../blocks/neurotoxin_emitter.json | 20 +++ .../recipes/storage_cube_crafting.json | 2 +- src/main/resources/emissives.json | 34 ----- src/main/resources/portal_blocks.json | 2 +- 45 files changed, 272 insertions(+), 53 deletions(-) create mode 100644 src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_background.png create mode 100644 src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_front.png delete mode 100644 src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_off.png delete mode 100644 src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_on.png create mode 100644 src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_vent.png rename src/main/resources/data/portalcubed/advancements/{ => recipes}/aged_padded_gray_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/aged_smooth_gray_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/aged_white_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/cores.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/destroyed_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/dirty_portal_1_metal_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/dirty_portal_1_white_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/elevator_walls.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/equipment.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/gels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/grates.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/office_concrete.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/old_aperture_blue_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/old_aperture_green_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/old_aperture_white_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/padded_gray_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/portal_1_metal_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/portal_1_white_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/props.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/smooth_gray_panels.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/test_elements.json (100%) rename src/main/resources/data/portalcubed/advancements/{ => recipes}/white_panels.json (100%) create mode 100644 src/main/resources/data/portalcubed/loot_tables/blocks/neurotoxin_emitter.json diff --git a/src/main/resources/assets/portalcubed/blockstates/neurotoxin_emitter.json b/src/main/resources/assets/portalcubed/blockstates/neurotoxin_emitter.json index 3e255bf6..754114b8 100644 --- a/src/main/resources/assets/portalcubed/blockstates/neurotoxin_emitter.json +++ b/src/main/resources/assets/portalcubed/blockstates/neurotoxin_emitter.json @@ -1,10 +1,52 @@ { "variants": { - "powered=false": { - "model": "portalcubed:block/neurotoxin_emitter_off" + "facing=east,powered=true": { + "model": "portalcubed:block/neurotoxin_emitter_on", + "y": 270 }, - "powered=true": { - "model": "portalcubed:block/neurotoxin_emitter_on" + "facing=north,powered=true": { + "model": "portalcubed:block/neurotoxin_emitter_on", + "y": 180 + }, + "facing=south,powered=true": { + "model": "portalcubed:block/neurotoxin_emitter_on", + "y": 0 + }, + "facing=west,powered=true": { + "model": "portalcubed:block/neurotoxin_emitter_on", + "y": 90 + }, + "facing=up,powered=true": { + "model": "portalcubed:block/neurotoxin_emitter_on", + "x": 90 + }, + "facing=down,powered=true": { + "model": "portalcubed:block/neurotoxin_emitter_on", + "x": 270 + }, + "facing=east,powered=false": { + "model": "portalcubed:block/neurotoxin_emitter_off", + "y": 270 + }, + "facing=north,powered=false": { + "model": "portalcubed:block/neurotoxin_emitter_off", + "y": 180 + }, + "facing=south,powered=false": { + "model": "portalcubed:block/neurotoxin_emitter_off", + "y": 0 + }, + "facing=west,powered=false": { + "model": "portalcubed:block/neurotoxin_emitter_off", + "y": 90 + }, + "facing=up,powered=false": { + "model": "portalcubed:block/neurotoxin_emitter_off", + "x": 90 + }, + "facing=down,powered=false": { + "model": "portalcubed:block/neurotoxin_emitter_off", + "x": 270 } } } \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/lang/en_us.json b/src/main/resources/assets/portalcubed/lang/en_us.json index 379b8afa..61372e64 100644 --- a/src/main/resources/assets/portalcubed/lang/en_us.json +++ b/src/main/resources/assets/portalcubed/lang/en_us.json @@ -5,6 +5,7 @@ "subtitles.portalcubed.gel_bounce": "Something bounces on propulsion gel", "subtitles.portalcubed.gel_run": "Something slides on propulsion gel", + "subtitles.portalcubed.portal_gun_secondary_fire": "Portal gun secondary fire", "subtitles.portalcubed.portal_gun_primary_fire": "Portal gun primary fire", "subtitles.portalcubed.portal_invalid_surface": "Portal gun failed", @@ -21,15 +22,14 @@ "subtitles.portalcubed.laser.node_deactivate": "Laser node deactivates", "subtitles.portalcubed.laser.node_sing": "Laser node sings", - "subtitles.portalcubed.pedestal_button_press": "Switch activates", "subtitles.portalcubed.pedestal_button_release": "Switch deactivates", "subtitles.portalcubed.floor_button_press": "Button activates", "subtitles.portalcubed.floor_button_release": "Button deactivates", "subtitles.portalcubed.rocket.fire": "Rocket launches", - "subtitles.portalcubed.rocket.locked": "Rocket locked", - "subtitles.portalcubed.rocket.locking": "Rocket locking", + "subtitles.portalcubed.rocket.locked": "Rocket turret fires", + "subtitles.portalcubed.rocket.locking": "Rocket turret locks on", "subtitles.portalcubed.pellet.bounce": "Energy pellet bounces", "subtitles.portalcubed.pellet.explode": "Energy pellet explodes", @@ -54,7 +54,7 @@ "tooltip.portalcubed.schrodinger_cube.2": "Schrodinger Cubes linked by name", "tooltip.portalcubed.schrodinger_cube.3": "ignore other Schrodinger Cubes.", - "tooltip.portalcubed.radio.1": " Changes if the music toggles when picked up.", + "tooltip.portalcubed.radio.1": " Changes if the music toggles when picked up", "tooltip.portalcubed.velocity_helper.1": " Links Velocity Helpers", "tooltip.portalcubed.velocity_helper.2": " Opens Configuration Menu", diff --git a/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_off.json b/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_off.json index 0a7d8705..f8d65f46 100644 --- a/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_off.json +++ b/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_off.json @@ -1,6 +1,78 @@ { - "parent": "block/cube_all", - "textures": { - "all": "portalcubed:block/neurotoxin_emitter_off" - } + "credit": "Made by Cart3r using Blockbench.", + "textures": { + "0": "portalcubed:block/neurotoxin_emitter_vent", + "1": "portalcubed:block/neurotoxin_emitter_front", + "2": "portalcubed:block/dirty_borderless_panel", + "3": "portalcubed:block/neurotoxin_emitter_background", + "particle": "portalcubed:block/neurotoxin_emitter_vent" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "north"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "east"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "south"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "west"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "up"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "down"} + } + }, + { + "from": [1.95, 1.95, 15.85], + "to": [14.05, 14.05, 15.95], + "rotation": {"angle": 0, "axis": "y", "origin": [-2, -2, -0.076]}, + "faces": { + "south": {"uv": [2, 2, 14, 14], "texture": "#0", "cullface": "south"} + } + }, + { + "from": [1, 1, 16], + "to": [15, 15, 15], + "faces": { + "east": {"uv": [14.032, 1.032, 14.968, 14.968], "texture": "#3"}, + "south": {"uv": [1.032, 1.032, 14.968, 14.968], "texture": "#3"}, + "west": {"uv": [1.032, 1.032, 1.968, 14.968], "texture": "#3"}, + "up": {"uv": [1.032, 1.032, 14.968, 1.968], "texture": "#3"}, + "down": {"uv": [1.032, 14.032, 14.968, 14.968], "texture": "#3"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, -120, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, -120, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, -64, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, -64, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "rotation": [0, 180, 0] + }, + "fixed": { + "rotation": [0, 180, 0], + "scale": [0.5, 0.5, 0.5] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_on.json b/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_on.json index 17d8c577..bf3a7f45 100644 --- a/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_on.json +++ b/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_on.json @@ -1,6 +1,124 @@ { - "parent": "block/cube_all", - "textures": { - "all": "portalcubed:block/neurotoxin_emitter_on" - } + "credit": "Made by Cart3r using Blockbench.", + "textures": { + "0": "portalcubed:block/neurotoxin_emitter_vent", + "1": "portalcubed:block/neurotoxin_emitter_front", + "2": "portalcubed:block/dirty_borderless_panel", + "3": "portalcubed:block/neurotoxin_emitter_background", + "particle": "portalcubed:block/neurotoxin_emitter_vent" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "north"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "east"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "south"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "west"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "up"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "down"} + } + }, + { + "from": [1, 1, 16], + "to": [15, 15, 15], + "faces": { + "east": {"uv": [14.032, 1.032, 14.968, 14.968], "texture": "#3"}, + "south": {"uv": [1.032, 1.032, 14.968, 14.968], "texture": "#3"}, + "west": {"uv": [1.032, 1.032, 1.968, 14.968], "texture": "#3"}, + "up": {"uv": [1.032, 1.032, 14.968, 1.968], "texture": "#3"}, + "down": {"uv": [1.032, 14.032, 14.968, 14.968], "texture": "#3"} + } + }, + { + "from": [2, 12, 16], + "to": [14, 14, 16], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 13, 16]}, + "faces": { + "north": {"uv": [2, 2, 14, 4], "texture": "#0"}, + "south": {"uv": [2, 2, 14, 4], "texture": "#0"} + } + }, + { + "from": [2, 10, 16], + "to": [14, 12, 16], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 11, 16]}, + "faces": { + "north": {"uv": [2, 4, 14, 6], "texture": "#0"}, + "south": {"uv": [2, 4, 14, 6], "texture": "#0"} + } + }, + { + "from": [2, 8, 16], + "to": [14, 10, 16], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 9, 16]}, + "faces": { + "north": {"uv": [2, 6, 14, 8], "texture": "#0"}, + "south": {"uv": [2, 6, 14, 8], "texture": "#0"} + } + }, + { + "from": [2, 6, 16], + "to": [14, 8, 16], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 7, 16]}, + "faces": { + "north": {"uv": [2, 8, 14, 10], "texture": "#0"}, + "south": {"uv": [2, 8, 14, 10], "texture": "#0"} + } + }, + { + "from": [2, 4, 16], + "to": [14, 6, 16], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 5, 16]}, + "faces": { + "north": {"uv": [2, 10, 14, 12], "texture": "#0"}, + "south": {"uv": [2, 10, 14, 12], "texture": "#0"} + } + }, + { + "from": [2, 2, 16], + "to": [14, 4, 16], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 3, 16]}, + "faces": { + "north": {"uv": [2, 12, 14, 14], "texture": "#0"}, + "south": {"uv": [2, 12, 14, 14], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, -120, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, -120, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, -64, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, -64, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "rotation": [0, 180, 0] + }, + "fixed": { + "rotation": [0, 180, 0], + "scale": [0.5, 0.5, 0.5] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/item/neurotoxin_emitter.json b/src/main/resources/assets/portalcubed/models/item/neurotoxin_emitter.json index c2b54f4f..ed775b0e 100644 --- a/src/main/resources/assets/portalcubed/models/item/neurotoxin_emitter.json +++ b/src/main/resources/assets/portalcubed/models/item/neurotoxin_emitter.json @@ -1,4 +1,4 @@ { - "parent": "portalcubed:block/neurotoxin_emitter_off" + "parent": "portalcubed:block/neurotoxin_emitter_on" } \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/textures/block/adhesion_gel.png b/src/main/resources/assets/portalcubed/textures/block/adhesion_gel.png index 6d3e533a1a36030cfe7b7b7ca5fcafba359df4d0..4c5cce360f37212fb509efca0557b3887d19a14f 100644 GIT binary patch delta 2067 zcmV+u2<-Q$ChIGZBYy-PdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+ND-mvg;@e z{nsjb2}n$0IT%dU+d(hC4`BOdaO|6Yrfd-*G#w#A>%V^*{ewr03OOG&q!0`qmt2yJ ziJJN3@nz%2cl%-X$rGQB1p&)~+WAw%CcpF9JZa*LnSW5EWq(^(o)?na^y`bF&5-RL z2_|(@lr}|H<^pdD@(jy_r13F?Wu3I{k?4G>f66*^8{VwF{&o@Bs~$`%vRbh5wRUsB z_Scflm_&Tp1_-isn0wF+(Xe@fgq-E+coIBn-Boug^n}VW<8wZ}qUB^0u`fvu2R-Ez z`*T!A>K`mS-G65C%&%^$BJ+~{{^*B-&)FRe)Ru z?9R&J3lFo&6dKkPmMcS47|Ix1z8>`LhSvH~U^aT>3V(iy^kl=0j$Hpj42W>slIll- z_wo94TrCjvJB#QNHJ+jDQDQs z(44V5Lm=lx7Q48`(-M}r=#rLPP(H;KUqXpRODefawH5uNh8nBZRP)L!N@;bgU&9(# zUDKKyO08LHuK5;PY}!)G2WlIvZ{rKpctcGFQh!}A9;ksE=ux5OgbxZ@gniG7;^_{S|H$-4kx|f03gO-IvI{ z<93Ex?blElh|N>jlWHtZ-)dIPqPbOHT3$?_LVm-vJ9F6_se zIVd*M-R_G>A0u-FX>^n+M2=LNNkU09-Yp2O|BbJ;Hr&MXv>QLg_Zs7meX@8$GA-BAqv|(zWmR z<-MDvzbfamo_&8X-#~dv7R_B@s!q7*^H{C8;XihPvjos{2EJ&CFO+W0{jxOZsxvlj zkNjIf-lKhXPM?J7w)NfOH3Oi}DBt(ZM@rw-@lIpIAD~440n-Jr${i83@c;k;g_9}+ z9e<@F6%{*(IAo|!7DTN$N)?M>p|llRbuhW~Luk^Fq_{W=t_24_7OM^}&bm6d3WDGV zh^vc}qKlOHzogJ2#)IR2yu0_fdj|;hGE>ctaX{59BNdN{+1!d4ctrqx=tmS$iJ5vL zy^w+D__~LWuXhoi<$dnY(WB%|2KYqcS%0P*7V$dq^roeA-X{*RlB5uy6OS2mLE=ZQ z%PzlhE;=mm%#e{u%@K!)#bO)FZOlrBN<2jzR#c7hg{;d8=Pk}^xyqXNdG-Nh8Ei_|hI4xmeVl*u{WiU2nIb~&IHa0Yq7YS1a zF*-0ZA}^DX2x22SWiVu9HDxv}W;Hf5Ei`3gGA%haHeoGdH8f;nHf1+BGBT4E2~Y|# zH99aiIx#mQFO!i7VkBc?V>dH7Gc+wVG&VIYG&nY7Ejcw}I4wD3H8f#nV`MQlF=3Mz z2}%t&EipD!F*G_gF*-9gvrP(U2n5s#%zl%(5*>fT000id0mpBsWB>pF2XskIMF-~x z5E3&a@@D+%0002oNklyJWH2nqJW=Z%|_ z*3)NmjdPCS7QuXA3s39GfItB7*_=7X^)Uc60tfcNF0kXlz&>~v*aGt?#vB0n5L)^kx^4{55sb!U7w_q#a>e6pA01h()h+}#$cZE7a~cv?@2qw4Ciu!vG8#<{Z9 xPMurzsN!BWQ8%s5t>1HVE3K-<#maK`1qKtd=HjjW-H!kO002ovPDHLkV1gfxsA~WK delta 1520 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 LNkvXXu0mjf>MwbD delta 1511 zcmVaB^>EX>4U6ba`-PAZ2)IW&i+q+U=K7k{c@w zMgLhvmVhLL#Byk8smTIbA%tbsCW)Z&2z~) z;z}hIuIPBYuDWW9Y1R8fymcPz;r@VO60~xC^t}CVc8U*5RDaRaFGAk-gX8f*Nn78a zg!Vu(BVu&=7Ajjv_+8&;1CEhObl;nJG zU)lrdYbq=CUw=kUzI*&=H@T!je9Hd3$LK!RoH2`c?gUpRh!I|SyM%XN7-Mb)qJQZ3Tp=#znQVkH$;}#WAVOm& zRab&<<@uUi1q5|wd2W${#2%N#q4eh@kOf-csA#V}NY=LiQiP!u!H|Fes9{%7rfAGY zghV<3RfNux_y7S?<&GdZiDa;GoVI0aX2~gQ&e`%j6sw7)U~1XS+=^8fPp+Qb+`V`$Tm*-vmRziODWz77S)p9< zc7;Q&2On~zL&K2|JNzg|ZCE}nHEp?B^Hy5z+@<6E=($_>UV1(0#8Nubsb@az^s}6G zV5toWBMlvS*zi$Cy;Iv*zm+$r(Wb_W)O55vHGf#mZW1()6P?Tej6)(2w}}7?nkTd9 zloC&JlUXb{{&40YNS(|&O=2LJPGTK&V;A@$I?4SnZo$$6H~z2W!bJBbx$oRwQS0+- zs4ZgGE}Th?g55U^!8rc#UG=>Ue|zw5`w{vGeS|(jAEA%XN9f-Xl7Sx&^S{8~`~0XF z!hbzhYXATNglR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsG#EDjnKE#34gL}I3%$}Z&KIlk`UFAw6jh^qA@8!nd5g1JtF!h!`3pluZ8^(zn!`w95hDOOq3BQYZlgUTphg1PJZ|t%hxX zAKP~81n@rtS6auv(FA5bNpEzt*bxxk1}?5Un!E>G?f`>Nx@1U>T2l*I5-4G%Nmru=JD>n?%w`A)9&vFG39cN{QHgL000g5vxEgl z0wiKFFlJ^mI590{V`VZeG-We6EjcwcWGyx_G&y28VmUc5VPcc-2OlIkG-hRDH8D3W zWH~o6Ei^VTVl84}Ibkg^V>K`_H)Sz4I5=aIG6*LmW;tOnF*Y`1EjKbXGA%S>VPh>g zH#IRWVlrkjW-~N7F=RF{lYIzY4K_G6HZeCcF*i0gH#C#z2-PHIHaIyrV`MQcG%#T` zEi^PVHZ5T@VlXW;VK_21Ibu0tWM*ZP;R#a)GCDIkA}^C$31TETGBh$ZV_`BaWH4km zEi`2_V=Xu{Gh{6>H!(ChVKgu^WMnXt;R#O&F*Q0cIXW{kv-S&U2n6@s)r| N002ovPDHLkV1k$+kk9}C diff --git a/src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_background.png b/src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_background.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9bf7f2484c73a3ef448a565eaae836d211f8ff GIT binary patch literal 5046 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_front.png b/src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_front.png new file mode 100644 index 0000000000000000000000000000000000000000..8e79265363180a10202669d031cc76ca2e0cf7ce GIT binary patch literal 5284 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 E3!I$~TL1t6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_off.png b/src/main/resources/assets/portalcubed/textures/block/neurotoxin_emitter_off.png deleted file mode 100644 index 8f9d2d51c540406f582e39cb8c73b527696ef538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/portalcubed/textures/block/propulsion_gel.png b/src/main/resources/assets/portalcubed/textures/block/propulsion_gel.png index 0c262200c4dff7b41a8606538773b3ede7cd9f98..936f589017c5017d62e3c0e2f482fbbfc0682058 100644 GIT binary patch delta 1992 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 U9f>g;0ssI207*qoM6N<$g6}zUfdBvi delta 1607 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 delta 1329 zcmV-11aB^>EX>4U6ba`-PAZ2)IW&i+q+U=K7lG`8* zhTl0wkANhE#Bnf~nckqs?++&FCYzVEPo0Sw1D5eGp%2JzIDh>d;Rh}%?jfmpE;&bB zsieXc9go*lS4}akdOyTl=fNKCFBm34E7zmvJ^p5=_@G1;J%9Zo;Pom5~QM&QIjYJqFxqTmb@cDLSE(ReicMCW~k}qpa&}V9=*1QXIhE(5P3>+zPB&! zf%G+%mHIE9lYj3XKiW+%sSuyCKkqTRk2Pn^qNa>g=RK+0R8|k;4!D@EJwPuy38 zRSJq@RW~e!9$P$68Wm#T8kDG0r9tOv8#RQO_zZ05FgKQEbTKa6Wb#Y1&|s4yT^x|x z!k&chvCwi`VhhWg!*eGLWr7&tlebHF_k%I!Rv?Og&wmx-VxGxH7?a$rF$_d#?4;^S z@U1*wldFK>stq6t$1V9bDf-*&8HX8Nj6g$qqrbq>>load7l4A{36-}y| z)zr0U&3}?p)||8Dc_>yBOTpB#nYk6KE}mRHySaPuTDS-fO)a@t@lr~y@L8c;@pZ+3 zS`R+tNQZ_aA9narj@qz%T58&Iv*xX|+PO=|`O$N??!EMS(ut*Xrc=*++UaLG>%dYQ z5=I(2^048fjC!ZGv3@IWP@_$a7pXbW?$ls4yMIa0JWg~n127JWK-?w*ENGt0qEkvd z$xUXl;P}Ithahz_>okdhU^U7Tlm zpZjwRC`FS2K9P8q>4rtTPCUJ7>74h8qpTt+#OK6g23?T&k?XR{Z=A~x3p_Jw+gyERLb6K+x{0R&!b`(p$M?gFib zZGRuzcIyQ2KLb}<$G_18W|AB1RO@ol)dKh?!NBc{yo#~?*}pEa*h1^jpG0S4fnIO z1&RVBWo9=uVPa%3Ei+*^Wi2#0HZ(0cWHdA_WH~rAGGk>pVPY~klVS*|4K_G6HZU_c zH83(aH8!&t2{!_>E(~A@1YLM1fRmCGF+K(l69*A1C(m#I0013HL_t(I%VSh8`m~>c n0>H#TAs97a)PPX~28#gzi&_F|rWK5K00000NkvXXu0mjf(*0xO diff --git a/src/main/resources/assets/portalcubed/textures/block/rocket_turret_active.png b/src/main/resources/assets/portalcubed/textures/block/rocket_turret_active.png index 087c30336ad219cf604815a173de37eb45d21eaf..25f4a11ae40bcf28bc3565ab2f6feccc4f9571ca 100644 GIT binary patch literal 10547 zcmeHtXH-+$)^Hra7ze}AwzW@L5<>Z0{d;5DJ!AOh~3IM=N7g{;_-jsDe z8@g>zG(fe4mdZ|IwLdPwu}XS%)_h8RYVovjiu-Y%Az=CN^6bd-G9qWTa=|#o%8HNv zfw3;c`+jlixp&Zk`KbB1_7UXl(sNGU9nU5T6MyIqIr`P@bD7opMMh!y?US`8_n0B( z%{v_9>@;&E>N?kUU~@EefiD;~B3pP?-&B;<@^4!+%zT+d@Jw8=+l0CsJN_1I=^t7zPy9wLM;_-2VTz+N2Ki#Cz&P{L+2)Gc}@;-EpQX~wrSU&Cz zZrOTZbu%JR>nv|+@BU@L-0|5Qf9Z+eWyw*|j(-qKj{Xbw>6LluGPXG}-w~70(*E}) z-DdkVU1S1ng=G&Nm#NQ?dK@P+JJyR6G-lS5O#}~$+!b1Fx_MgeA9cG2X-^+__%8nPFgFX5sHoO2(GtFSqw9c&;UA zfh98R$UJC`7#*R6R3){Fd&NKy{mbj7L|GVni(;_jB!~p%oX#K`0Q$xy04O_73))Q$2Y*pbq$OCRl<&AkAh6&?PNEWdjY^%`d0`Zz z)`(w)3)gn{(R)9aJ7Xrb2yPj&f>K~c6ZxOpt2 z9-BIi-YYNpZdE#NWxWZh1r2|!5O=Dp`y~5mBkkR{A929<@xouVxEhTjV`QdRX|}}1 zKGx`^`@ESlx9|iinpsw_IhVP&Eb7Q^Hub02`pulTP8fLeJip(UXmU&T+^KG+JoxN_ zr0jUcSsBt9x>w6o8722}Cp<|nv(2uDlZ}o(13=E|SW|YAj04fkv?bf2_XtO7i?@cU!!4mew3Q*X=)ddh2dxt*2@NK^bWk-k}=tdzxI` zwdT6PDXg0?dTZ|e9nV{-9$po9YT_7W4NvblcFE{7T{Z-GeZ$#LRJX{!}m1XB5@!fT0i>XgB;R)BJusJK}T{=^i>A^zHr={Bby6N<=pu<%T@gx zjr|>eIe|h~jRXY0s+Lju4%nG_n$;6dyvAhkhG`ak@cH`}hmqjZ4QA%TK3qLzW`iO( z!qlmJZUKc%(;TYy1Y)yMB6C%n$lQzC<@*6ivtO1zK3`haZ;hMDOtIMkGt|ak|DG^9 zzT_kx-Jj=4#PR5%32C@UGTC;TA=sBK#Xfu}Ld1d7Tk=IvF-jc0cmhwfzLU6aoD%^s zd|SaN_PwJRFSID@sX>gxO6c{jHa1hP618|+dyE~N64njQ2dl(8bPEkNXV3DDH?O3n z4qL>K_(U)5Xz{jck;M_*rgY(X5eAkp-lvUP_ZC)MxGTR&T%L;qaM6XxS55q2>f)eW zd{-sp-c3tt2xY)8PkqS;RT~wz3QigDAYL}TB~2AiIz1(B2Wu#kPj!QdO=n8z1%qoJ3~9$?zeVrymcf}5zO z54fH+(K?c4wvR^922q7nyH@FO7fu;HP5_7ZW-|gi$XlpfJh6UqXX(}6Hl;===7B7z zB=+nbxLgTki8TFuPw#Qv8UX%0>FX1On-wUuu^`t1N3DA^GHOM)tq1=-{ehjMbf3){ z7fnhY4PZz_Le!g(J%KHELQ04{w2`%Hn)B#Q_zygq64@|fxw+R0v%BI2$B�t&3@k zE1y0Od%_e*Fks}qO7<;FT45xxDeuUF2c?z;WNvyINI%mrV^UAk6c80cM0E2}Tp_Pu z3Z;2!R2%+1ZS^GsNeRMMV&K7dxCMY$BE-ah^&tE7^DJ1Wi{^XWJ5@n$Mm_t{+&fM; z$hg!AXk@uIy50QDi^U-aZj0ZMBSFcONm%p@4G5Ue%!c_Hc4wzh#yDaLr+DYgF2N z0=1lwO8Mx|>m!1w_n^wDSI`<{)rJRO7)mKYxpYSBv)ui6@R(&OTS^RRX_u_+n>0a&mhcG{`a;Q`bJ;nH2GX2^AzQ)P>Uu*0-K1 z^Qx>!&qba`b z9?ki5s*uJQeBcsgYb-uvWk;P>BfwKWwIrE-vNbGihwKN*&A7ydhwnJN8k4z>*;$+( zcoe+t2qXGpLL!xUS`zp9eCTE|)%LAilsZX$O}5;EFQw)!ph4p0lNYh#)rI4Tax3bM z0d1MUf|i!}Wqv%|j#ut1OvD=3BfM98EmW%(jPTogY4V3R2xw);VF`3pgu%Cy;{@6a zg>x!g@zIkXw`}8bNo7If9ZgTNDE3H5fWW*q;F_l2s?B?`=Xe;&dP4rk&ttC9=NRb~ z;h5vaR(&4RTv$ zZmDd2-CA&yxOi^DNoWvuUCS6FPW7fy$XSA^^eb+)(@Y*Df?U5~>i)Ilf>eb?5n>g< zb|?-`9u6rwMSpR5%Ce?nWhx_HU#)#X-b*X@dOCh|(kH+j=Km{m- zWgF-+%`=Q02;j)?A=nvk#Y-0ngew!RMBwYiL6Zv5$Mz6}Hk9EX0lr+ZNJ>0pm( ziJO;Ik0QN8iq`1)Q+N@%-om0(j{z?W)hB^YiZcXp>Dai^D=vwm1{yLF>1XBClRPYh zbccfh1lIRTlnKUuV&;wEV0Hqu3Df;?3m0+0J*z+|eprje$=BmvP))_+@x@f$=*4&^ zKmBK$@ohDpO7NS$8Zq6JsfGwgN5iyKDf%LHjy#)B_N}%kiyhI{Sciu@QQX}#^cx+J zPqL<2L~;B0+w#wr-dTJq4bO$g#I25^Z#;SwO6RHS+!;A<)d&6)G`*qxG`8qiUX@zPH zF@kX6#Ssz86`@rvpGzmDl|+Hstn3KK!aC82d0lH(GbFPpeEl8Y^FdyCVLfwW`CYk(r70cR zp+>0(VRk#Mp6F`6y4josDN?4qru?0#S#RWC`Pfn~N?Xb!DVEo4x#?r>E58jpFW%KU zG~+^vc{NnJ58Bu7Z&>>pp6alM&S#Amt+PiA$ z+DZrL{gO;0_hHN@<&L(&&i1>-qz4oo?jJR$Tay(kK72IHHP4+TzPJ#P{dQcyJ+6vCy zDm=)C6sNyokWU&P8Q4Evc=jMZJ`xkInKvAryR1aM$k93YnLkR@r@YBZXGD_lBV3c( z3{Zl1n_?Q^`en#=bz;6@Zt2eU6gq79~8qCz=I_{u0Tbz@Q%T?A?@r)SgyZ**5GsJJkhcW}>t z9W1yI_0;hE*pT>0XNpi(X*Ylq?!z7ZurQ8&Xn^3WBsGwgD$`%!&c1~%hO*Gj0JJIL zRHnWD)XAr}LcP3Wf7hye5d3<09Dza&%62H=kd7^13$E-TvvQ1GD__ym=ry^yzRk|G zQTOKgDTDDR4ft6CX52NNJ{#%4Pu+&N18Gost0ViGbyk_lps`#R*O%&4lGn52>3nX7 zjGMo8dSdLd!%vrw41E=GAfI|=o|g(bXZM0;*LJpz8!28JsbI$Kl8@lqN}bQfQrNsh zH$`b@V9A$l*0z)R=_L+2pKO|&vN=vsLD$NX3@tg6;@*Vb{;)@58M~6SCzazZm+K<; zvrEbqy34z`CFY%-JmaU3w!Mi_r}(g7=iBr_zM)cLTY3Wc+wa4BDtfy!Zg zd&JKZ{t&2omalrP{V2|XAo8dSFEtL=!{domy0*V@E% z{JuC6Cuts+7I**}oR-YaZJjxQ3^11# zLq-r%J#P+9u;#O`=LQkSi+Nv2)jb<}MapOW)jaD>8j+QeZw)}Fbzs(CDO(0aqJ_s& z27Q`PS5Prf@c!ZGO*VY+sl*deD!<(kf%R_ZronBVP0MNLFLh9w!={sh^lwW>N4v1S zn8=t|i@{fhc`~kdn@jQX5|Nkm)dHIc7OL-M001!3NmbQQTUGV1oj2@$TUJmab{SG) z>AY)F$VrP&5+!9{9A>9%s+Ls{rCwz?O<^pHmjndPiJ%Tb$ioEcb;_A=t&BE_4!(&ue;K8iv_N(&7r`#wA5fWRycNso9 z_48GZv8a(oKjs2biSmC|BBJB0buLKL8htR{uDI}vX6b2f9Z)0AKRHhYeYOz1(`YTG zD6(|}KVRuI+BKLI7;2k)r*3l_F;kfXxNum|xp&epVRw?W?`%TC4xF25?esB8ItuA$ z&Arr4CGAZ-6OXvhhEdFS@56cjR%xYl#u~w1M4^D8$2X_ zatb{CjQ-Nv?iY{UBRz7$?uA&YP8T?JwG?r@|a#?=G6R|){gDPlZehhG129G!iT>C@v@rQO7v>igGFtgXPfnC>dil zjXx={ck-N$-rgQELPCCieu92tg6?PsArWb5X(3@zAyH8X76I|{ck_l}AZ}hzMY?%&{hh)d@h^K1AGFKwbnFpANEf6l z7V3rdD)JAPn%eq?|FXD}z`@DYmRXQ&HPU1?}1>=|Hbh7l%TmCB>i+5ovL_ zgt(|Z5-Rowl|4d6!yWAk!R$ACqr(y~I%2P%ajf8o-qfOo2UF12hLI7V`{%&xv+#hApa`M6={I7cc&#pH? zdj4_u$3x)a^m_^n{@u7TFvK5DykNda``?bRc7IGE9ARz_NbD2-XG{Gx?({#DOALmP zf=eQy5HV?(Ft*}QF$fHb5QPY%M4?D19EOBL#s10e<&N_9gQ1bi4%kew*r)DkdW?!722=pB@4sDh@|L?Xl?zW789pw1>cu z5=e-oh%{1EOd2jJ3YYq4xc`soK}|)ZvAM~Ji2s$IoY2*h^;a?Fg#NE`{{i^h8i$qT zk1_1piCv0?{Gfb4WMr4?I8YyIM!0EcWj(00OwKrW)WO_G(>fPGJKv&CXIT=#7lwRqq*Kd71G@Ti0hYzhoKdwn=5g&)h~5Gv!HQGm!L!q&&b6Ex~P z<60x-p^Vi@oDaS_iJ$5=mOVp{X-%iwZU+8r-VSm{mG}3mDc=iC281+F{@mWrJo+h; zm;CE^;^wdB_%=H`AV6L=fx2@2#mwf5IX7#7hX@lNpen**&Dx>t2SGXu)d4erZDYH; zS$uBHQC!I&FL2{6c_EZ7exl*IVZM;%B}R^|OyFD4e2(lATGVKAa`LAF+JM%e>gOzr zhFTmSygu>e)T`1d!QMEvLd6n!yy2GW$RcUgMl6he2g;R?znf$dvjU-of@ zWEBTzG-rB0DzP=V!JmLO$llK)JUunD1g43tewuAb+GQ%x?;+ zD8+4&z{^oo4A@eOM8#<@53UcH!r z8@r$hnr9>&0U|oCXOcMshJEAp*Pn8MJip=cd5SQVaE=!|yFIoZ`O3OJ0e8Q)*u2cf zi(4gR$Yxd`<79Gfq5{gUZRj?A1zVU63M|8+!On3anW`#o=FnT{oZ9D1d2S zPRNVO)NCLa8%6zo=5_fS8m(AT@n>&R(qqN4!J7DqYw6{hWpxrY*H5h)*vpHbrtaA5a-z!w<#X{&5v8*xybbtBQt}z3C33?L&%Vt!k%cm1(X6ac zZm50i8v>L4XvziES={qgDnw(CRG~xgROVoA$;tqQ!ip3iwXZ=tq{KxpLtx$VaF*qxAVi> zdAA1~$kNScPGmOn;zma@(D+%qXHAP6D4BCol5B;UCtT`|UWvy{raE_#7@wqg$=yd$ zTLP>aGRn8tLW--sq*z{z{QxJUD+gD_C;3l-HipOn7XPgQQsC39m$5y!p)x)<+@P6J zMFqv6;jvFH(3-u{W>aph>CBiq%kvyRzmy?+rrW*U&tUiYsh22wOujjE2Bhr1zjJGs zX!Py+5382>y8$md8LT|X=eZ?XI8xf{&Vi%Hqtfg3CXb~Mou&#O z8*j=b)VpW1m4L<%4! zz>Ss)nJ?3Hn|cnuO#o@t3>315PQ2}YBhBgTG{(}cIR7xe zxu8ZPlRu3(Fx}NBU GVgCmatnml{ delta 1122 zcmV-o1fBb{QuYXtBYy-vNkl+9=1{av3+W%2xR zb+x;^yxeWK+uhkeczl${Q*{v^EY%$p6jV#*b9nABC!SFjb$=2clmS!ux*-56Ep2*VW|N_Ca_#0vip`dgtxsnXMhaQVEr@A2_dxuj(9gN*zFdW z!&*TtAOm#E_)X)Vv$xHindI#GEVBL>1_UVFsXDe9#D8Y9*^N;#=jZ3Q`)_CfrMmxn zYX|o2Wb7y?xWo`2jQ0@7RS=!}N)dam5cT0#ZWjY2Tqei><{=JcK#7bU1qG8bK<`-t zv<+C^0>1Ld>a&T0NycYqwwD3E<=lkQmSo!^D41k?HhDI#7Lili(W(Aet~%zq1qG9g zm*XravVU8p7ST7y7}Sbmx$2nb77QjCUt>TfE(_%wo8?Rl^Hv*>6_$<5Lc+#oITORY z)dr{&mJ_|U01-1AIqP?`SmIOi*_o58v%ENNQ}edTnqB~#dL3YzWg3h)>SAB%4WigmVH z0e`*~7$=ls$KsoT25<}Lj}W#yCj6&){hC}VW4k^0*Oorh0FNt~#Dk7AM{*oTgNt`@ z{!5F;a7Cz$c~=7$UlK=_4#gnzt_Bh%N{}ya#?XK$;}S0&dQRV)+`C@x^^6II2JU&r zsEpc+;FfT~UPeI_K4bvvMULZWaG_!t;D0fz-t$u^%{C2)a{qi%;EC_&f|s-1YN7jG z!dV|soyTU{tpc1~)(03<+9qtX8t|H9eZa3k7wzqM+7FSrPX-h^M7BE_Q0NfZt`^&m zpBLxo0ty`>+tuRhx9^K{bOD79k?m^n^x3P$Il6#Chsbudc>eO;;v9=WL9NJshFkFF z?T2)17jWRM$bN?K=k)_O;OOAMTao=_5ZmG4w*m*=itJ|yu?0eS9EQR8UJy4!7!mL9 oFFy4(g#&Lz_LG5xv%Cg>0l!TEJ~CVw2><{907*qoM6N<$f*jo@>Hq)$ diff --git a/src/main/resources/assets/portalcubed/textures/block/rocket_turret_firing.png b/src/main/resources/assets/portalcubed/textures/block/rocket_turret_firing.png index 70225199e53bddc3bc52cb9873ec9bda1cfe3618..5df1ace78a7b524734aee9762740d5463c92b214 100644 GIT binary patch literal 10548 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 G{{I1$^WNG3 delta 1124 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 delta 1124 zcmV-q1e^P`QuqjvBYy-xNkld2)gmv z0+LN2dtbnl2TwSDsqVhjT{V-Q95{4O)va4~PW??XCpXvETk`7aYDa(9=Tccb zzh7Q%FD@>&o6Tl>@(&&#p)cgb0>9T$GFCsynCwb30vPfZCSorgAn%&lNCs2DllkJp(cZ zD1R6r@qv4D3(R$1?Odckof7E=WDxN(hxue4+f<{40eW}(U}b>HnX3e~<>9HicuuXr z6qXv0;jbU(+kZblKkuHI{#?AiTxHtLf;waQ6f~e1oCd1F>Z$h-|MFMcqjEXrsJGeO%zNrK0C9$4Dc=ICX}`$+ZI8=B;&KmvvIYEoZ5~~^~ZA6G0!b1 zm}I;hXMZ`7-72++zB$IARvgP!$2_-SFv<8D12S=0DBsvDXJVMQ+JLOEY+M!+Ha5$d z80M`uK%KCh=(PoinAsSoo~)k)1(S@|7Len57ya|m8sJxr-bIy(Y~LCg160rQ9enmU zs}vc}n%Gi2+tM`FF`oGs8!!c(pi1H#>TsXfi+=&!7EZ?Z1Seo@a#%NetYZeuc6BD$ zzmJ1uUf0cl*-1Ns!Zk@;6^dc|J6M|m%|XG=l!I%>*a~~L!J%(m{)2?d^pD3mUvb?G)=gna+iK`5r;9C_!gf>8Y-d-1$4K~Cd^1q2 zvwzhJ@U6f&p%gn7-wZT>TR?w=u-zfyKh5jci?ZCgb^qB^DT*)LJbeuVo<2V>x zyo>W+T0Dj;LS@Xm8o2n9II?so2AOv?kSI}te0ej521FT`cVLgOfWQX z&of44)LsO)gbVgE3Zn2K16VI|90!976@SA3k6HDepF(N2X+V_w=c58od_Nbwob6T% z-R~04`he;@Hq&ku;Ow$Kz?jlDVVl)}*Bt8ueg(Q{Z^zSqh|GO7pwJ<*-O+$Thsbud z*qnb_oTCdUbck$Mi!WclEzZ#e6got+tuRvi?@q&ECL0!B3=6# z!s|C5(y?8@fwv<28N%;Z58Qx*g9C3x_LD(uhrQnl9C$0TpCQB+2;p%U2IG4{+zeqv qyuW+@v9Bo{cq_7>3?!W8HTVm4b_JzWnb}VO0000 Date: Tue, 18 Jul 2023 01:21:34 -0400 Subject: [PATCH 10/26] The back of facades now cull when they're placed on opaque blocks --- .../assets/portalcubed/lang/en_us.json | 2 +- .../aged_padded_gray_half_panel_facade.json | 14 ++++++++------ .../block/aged_padded_gray_panel_facade.json | 2 +- .../aged_smooth_gray_half_panel_facade.json | 14 ++++++++------ .../block/aged_smooth_gray_panel_facade.json | 14 ++++++++------ .../block/aged_white_half_panel_facade.json | 14 ++++++++------ .../models/block/aged_white_panel_facade.json | 14 ++++++++------ .../block/dirty_borderless_panel_facade.json | 14 ++++++++------ ...portal_1_smooth_gray_half_panel_facade.json | 14 ++++++++------ ...irty_portal_1_smooth_gray_panel_facade.json | 14 ++++++++------ ...dirty_portal_1_white_half_panel_facade.json | 14 ++++++++------ .../dirty_portal_1_white_panel_facade.json | 14 ++++++++------ .../models/block/exposed_panel_facade.json | 14 ++++++++------ .../models/block/insulation_facade.json | 14 ++++++++------ .../models/block/neurotoxin_emitter_off.json | 2 +- .../models/block/neurotoxin_emitter_on.json | 2 +- .../models/block/old_ap_blue_panel_facade.json | 14 ++++++++------ .../block/old_ap_green_panel_facade.json | 14 ++++++++------ .../old_ap_white_checkered_panel_facade.json | 14 ++++++++------ .../block/old_ap_white_panel_facade.json | 14 ++++++++------ .../block/padded_gray_half_panel_facade.json | 14 ++++++++------ .../models/block/padded_gray_panel_facade.json | 14 ++++++++------ .../block/partially_exposed_panel_facade.json | 14 ++++++++------ .../block/portal_1_rusted_plating_facade.json | 14 ++++++++------ ...tal_1_rusted_tread_plating_side_facade.json | 14 ++++++++------ ...rtal_1_rusted_tread_plating_top_facade.json | 14 ++++++++------ ...portal_1_smooth_gray_half_panel_facade.json | 14 ++++++++------ .../portal_1_smooth_gray_panel_facade.json | 14 ++++++++------ .../block/portal_1_smooth_tile_facade.json | 14 ++++++++------ .../portal_1_white_half_panel_facade.json | 14 ++++++++------ .../block/portal_1_white_panel_facade.json | 14 ++++++++------ .../block/smooth_gray_half_panel_facade.json | 14 ++++++++------ .../models/block/smooth_gray_panel_facade.json | 14 ++++++++------ .../models/block/white_half_panel_facade.json | 14 ++++++++------ .../models/block/white_panel_facade.json | 14 ++++++++------ .../tags/blocks/portal_nonsolid.json | 18 +++++++++--------- 36 files changed, 261 insertions(+), 199 deletions(-) diff --git a/src/main/resources/assets/portalcubed/lang/en_us.json b/src/main/resources/assets/portalcubed/lang/en_us.json index 61372e64..1f93c428 100644 --- a/src/main/resources/assets/portalcubed/lang/en_us.json +++ b/src/main/resources/assets/portalcubed/lang/en_us.json @@ -479,7 +479,7 @@ "gamerule.allowCrouchFlyGlitch": "Allow Crouch Fly Glitch", "gamerule.allowCrouchFlyGlitch.description": "Enables the Excursion Funnel Crouch Fly Glitch from Portal 2.", "gamerule.disablePortalValidation": "Disable Portal Validation", - "gamerule.disablePortalValidation.description": "Disables placement checks when shooting portals, allowing them to be placed on any surface, including overhangs. May cause unexpected results.", + "gamerule.disablePortalValidation.description": "Disables placement checks when shooting portals, allowing them to be placed on any surface, including overhangs. May cause unexpected behavior - Issues caused by invalid portals will not be fixed.", "gamerule.portalAlignment": "Portal Alignment", "gamerule.portalAlignment.description": "Changes portal placement snapping, with the value being fraction of a block snapped to. For example, 16 is every pixel, 1 is full blocks, and 0 is off.", "gamerule.usePortalHud": "Use Portal HUD", diff --git a/src/main/resources/assets/portalcubed/models/block/aged_padded_gray_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/aged_padded_gray_half_panel_facade.json index 7d90864c..118c3fff 100644 --- a/src/main/resources/assets/portalcubed/models/block/aged_padded_gray_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/aged_padded_gray_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/aged_padded_gray_half_panels_1", - "1": "portalcubed:block/aged_padded_gray_half_panels_1" + "1": "portalcubed:block/aged_padded_gray_half_panels_1", + "particle": "portalcubed:block/aged_padded_gray_half_panels_1" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/aged_padded_gray_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/aged_padded_gray_panel_facade.json index e2f0fa5a..c7e4e145 100644 --- a/src/main/resources/assets/portalcubed/models/block/aged_padded_gray_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/aged_padded_gray_panel_facade.json @@ -9,7 +9,7 @@ "from": [0, 0, 0], "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, diff --git a/src/main/resources/assets/portalcubed/models/block/aged_smooth_gray_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/aged_smooth_gray_half_panel_facade.json index 75bca300..d14bf9c3 100644 --- a/src/main/resources/assets/portalcubed/models/block/aged_smooth_gray_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/aged_smooth_gray_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/aged_smooth_gray_half_panels_1", - "1": "portalcubed:block/aged_smooth_gray_half_panels_1" + "1": "portalcubed:block/aged_smooth_gray_half_panels_1", + "particle": "portalcubed:block/aged_smooth_gray_half_panels_1" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/aged_smooth_gray_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/aged_smooth_gray_panel_facade.json index 26bfade7..e60728d5 100644 --- a/src/main/resources/assets/portalcubed/models/block/aged_smooth_gray_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/aged_smooth_gray_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/aged_smooth_gray_panel_1", - "1": "portalcubed:block/aged_smooth_gray_panel_1" + "1": "portalcubed:block/aged_smooth_gray_panel_1", + "particle": "portalcubed:block/aged_smooth_gray_panel_1" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/aged_white_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/aged_white_half_panel_facade.json index 5aae1531..6ef71ab6 100644 --- a/src/main/resources/assets/portalcubed/models/block/aged_white_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/aged_white_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/aged_white_half_panels_1", - "1": "portalcubed:block/aged_white_half_panels_1" + "1": "portalcubed:block/aged_white_half_panels_1", + "particle": "portalcubed:block/aged_white_half_panels_1" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/aged_white_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/aged_white_panel_facade.json index 7b372423..84ec3645 100644 --- a/src/main/resources/assets/portalcubed/models/block/aged_white_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/aged_white_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/aged_white_panel_1", - "1": "portalcubed:block/aged_white_panel_1" + "1": "portalcubed:block/aged_white_panel_1", + "particle": "portalcubed:block/aged_white_panel_1" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/dirty_borderless_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/dirty_borderless_panel_facade.json index 83855182..12b6a01d 100644 --- a/src/main/resources/assets/portalcubed/models/block/dirty_borderless_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/dirty_borderless_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/dirty_borderless_panel", - "1": "portalcubed:block/dirty_borderless_panel" + "1": "portalcubed:block/dirty_borderless_panel", + "particle": "portalcubed:block/dirty_borderless_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_smooth_gray_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_smooth_gray_half_panel_facade.json index 5363a05f..b0d75d60 100644 --- a/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_smooth_gray_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_smooth_gray_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/dirty_portal_1_gray_half_panel", - "1": "portalcubed:block/dirty_portal_1_gray_half_panel" + "1": "portalcubed:block/dirty_portal_1_gray_half_panel", + "particle": "portalcubed:block/dirty_portal_1_gray_half_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_smooth_gray_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_smooth_gray_panel_facade.json index 15907db8..f6f7c41c 100644 --- a/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_smooth_gray_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_smooth_gray_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/dirty_portal_1_gray_panel", - "1": "portalcubed:block/dirty_portal_1_gray_panel" + "1": "portalcubed:block/dirty_portal_1_gray_panel", + "particle": "portalcubed:block/dirty_portal_1_gray_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_white_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_white_half_panel_facade.json index 25f9c0e3..7a10f761 100644 --- a/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_white_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_white_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/dirty_portal_1_white_half_panel", - "1": "portalcubed:block/dirty_portal_1_white_half_panel" + "1": "portalcubed:block/dirty_portal_1_white_half_panel", + "particle": "portalcubed:block/dirty_portal_1_white_half_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_white_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_white_panel_facade.json index 77cd1ad7..da78422b 100644 --- a/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_white_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/dirty_portal_1_white_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/dirty_portal_1_white_panel", - "1": "portalcubed:block/dirty_portal_1_white_panel" + "1": "portalcubed:block/dirty_portal_1_white_panel", + "particle": "portalcubed:block/dirty_portal_1_white_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/exposed_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/exposed_panel_facade.json index cf4f833f..a65a07b3 100644 --- a/src/main/resources/assets/portalcubed/models/block/exposed_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/exposed_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_2_exposed_panel", - "1": "portalcubed:block/portal_2_exposed_panel" + "1": "portalcubed:block/portal_2_exposed_panel", + "particle": "portalcubed:block/portal_2_exposed_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/insulation_facade.json b/src/main/resources/assets/portalcubed/models/block/insulation_facade.json index 1304b5e6..257ba142 100644 --- a/src/main/resources/assets/portalcubed/models/block/insulation_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/insulation_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/insulation", - "1": "portalcubed:block/insulation" + "1": "portalcubed:block/insulation", + "particle": "portalcubed:block/insulation" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_off.json b/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_off.json index f8d65f46..6e7bf3a9 100644 --- a/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_off.json +++ b/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_off.json @@ -5,7 +5,7 @@ "1": "portalcubed:block/neurotoxin_emitter_front", "2": "portalcubed:block/dirty_borderless_panel", "3": "portalcubed:block/neurotoxin_emitter_background", - "particle": "portalcubed:block/neurotoxin_emitter_vent" + "particle": "portalcubed:block/dirty_borderless_panel" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_on.json b/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_on.json index bf3a7f45..45850c25 100644 --- a/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_on.json +++ b/src/main/resources/assets/portalcubed/models/block/neurotoxin_emitter_on.json @@ -5,7 +5,7 @@ "1": "portalcubed:block/neurotoxin_emitter_front", "2": "portalcubed:block/dirty_borderless_panel", "3": "portalcubed:block/neurotoxin_emitter_background", - "particle": "portalcubed:block/neurotoxin_emitter_vent" + "particle": "portalcubed:block/dirty_borderless_panel" }, "elements": [ { diff --git a/src/main/resources/assets/portalcubed/models/block/old_ap_blue_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/old_ap_blue_panel_facade.json index ef08a0f7..27fa8cdb 100644 --- a/src/main/resources/assets/portalcubed/models/block/old_ap_blue_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/old_ap_blue_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/old_ap_blue_panel", - "1": "portalcubed:block/old_ap_blue_panel" + "1": "portalcubed:block/old_ap_blue_panel", + "particle": "portalcubed:block/old_ap_blue_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/old_ap_green_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/old_ap_green_panel_facade.json index 86698f94..168a2030 100644 --- a/src/main/resources/assets/portalcubed/models/block/old_ap_green_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/old_ap_green_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/old_ap_green_panel", - "1": "portalcubed:block/old_ap_green_panel" + "1": "portalcubed:block/old_ap_green_panel", + "particle": "portalcubed:block/old_ap_green_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/old_ap_white_checkered_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/old_ap_white_checkered_panel_facade.json index 3eba2265..213e56c4 100644 --- a/src/main/resources/assets/portalcubed/models/block/old_ap_white_checkered_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/old_ap_white_checkered_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/old_aperture_white_half_panels_1", - "1": "portalcubed:block/old_aperture_white_half_panels_1" + "1": "portalcubed:block/old_aperture_white_half_panels_1", + "particle": "portalcubed:block/old_aperture_white_half_panels_1" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/old_ap_white_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/old_ap_white_panel_facade.json index 64f8c158..adb14164 100644 --- a/src/main/resources/assets/portalcubed/models/block/old_ap_white_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/old_ap_white_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/old_aperture_white_panel_1", - "1": "portalcubed:block/old_aperture_white_panel_1" + "1": "portalcubed:block/old_aperture_white_panel_1", + "particle": "portalcubed:block/old_aperture_white_panel_1" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/padded_gray_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/padded_gray_half_panel_facade.json index b27ede9b..002f72fe 100644 --- a/src/main/resources/assets/portalcubed/models/block/padded_gray_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/padded_gray_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/padded_gray_half_panel", - "1": "portalcubed:block/padded_gray_half_panel" + "1": "portalcubed:block/padded_gray_half_panel", + "particle": "portalcubed:block/padded_gray_half_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/padded_gray_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/padded_gray_panel_facade.json index 8ab37b76..e1db2811 100644 --- a/src/main/resources/assets/portalcubed/models/block/padded_gray_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/padded_gray_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/padded_gray_panel", - "1": "portalcubed:block/padded_gray_panel" + "1": "portalcubed:block/padded_gray_panel", + "particle": "portalcubed:block/padded_gray_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/partially_exposed_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/partially_exposed_panel_facade.json index 8e64aabf..9ebbbf58 100644 --- a/src/main/resources/assets/portalcubed/models/block/partially_exposed_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/partially_exposed_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_2_partially_exposed_panel", - "1": "portalcubed:block/portal_2_partially_exposed_panel" + "1": "portalcubed:block/portal_2_partially_exposed_panel", + "particle": "portalcubed:block/portal_2_partially_exposed_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_plating_facade.json b/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_plating_facade.json index 64706195..d28fc55a 100644 --- a/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_plating_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_plating_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_1_rusted_plating", - "1": "portalcubed:block/portal_1_rusted_plating" + "1": "portalcubed:block/portal_1_rusted_plating", + "particle": "portalcubed:block/portal_1_rusted_plating" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_tread_plating_side_facade.json b/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_tread_plating_side_facade.json index 86183ab1..347451d9 100644 --- a/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_tread_plating_side_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_tread_plating_side_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_1_rusted_tread_plating_side", - "1": "portalcubed:block/portal_1_rusted_tread_plating_side" + "1": "portalcubed:block/portal_1_rusted_tread_plating_side", + "particle": "portalcubed:block/portal_1_rusted_tread_plating_side" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_tread_plating_top_facade.json b/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_tread_plating_top_facade.json index 94a4da2b..e1eeb78e 100644 --- a/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_tread_plating_top_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/portal_1_rusted_tread_plating_top_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_1_rusted_tread_plating", - "1": "portalcubed:block/portal_1_rusted_tread_plating" + "1": "portalcubed:block/portal_1_rusted_tread_plating", + "particle": "portalcubed:block/portal_1_rusted_tread_plating" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_gray_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_gray_half_panel_facade.json index a80d3f57..b4d8d55c 100644 --- a/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_gray_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_gray_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_1_gray_half_panel", - "1": "portalcubed:block/portal_1_gray_half_panel" + "1": "portalcubed:block/portal_1_gray_half_panel", + "particle": "portalcubed:block/portal_1_gray_half_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_gray_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_gray_panel_facade.json index cf51b170..93921b46 100644 --- a/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_gray_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_gray_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_1_gray_panel", - "1": "portalcubed:block/portal_1_gray_panel" + "1": "portalcubed:block/portal_1_gray_panel", + "particle": "portalcubed:block/portal_1_gray_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_tile_facade.json b/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_tile_facade.json index c322f3d5..71522333 100644 --- a/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_tile_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/portal_1_smooth_tile_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_1_smooth_tiles", - "1": "portalcubed:block/portal_1_smooth_tiles" + "1": "portalcubed:block/portal_1_smooth_tiles", + "particle": "portalcubed:block/portal_1_smooth_tiles" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/portal_1_white_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/portal_1_white_half_panel_facade.json index cc6a64c9..956ddb7a 100644 --- a/src/main/resources/assets/portalcubed/models/block/portal_1_white_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/portal_1_white_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_1_white_half_panel", - "1": "portalcubed:block/portal_1_white_half_panel" + "1": "portalcubed:block/portal_1_white_half_panel", + "particle": "portalcubed:block/portal_1_white_half_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/portal_1_white_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/portal_1_white_panel_facade.json index 3edda43a..977bb826 100644 --- a/src/main/resources/assets/portalcubed/models/block/portal_1_white_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/portal_1_white_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/portal_1_white_panel", - "1": "portalcubed:block/portal_1_white_panel" + "1": "portalcubed:block/portal_1_white_panel", + "particle": "portalcubed:block/portal_1_white_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/smooth_gray_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/smooth_gray_half_panel_facade.json index e207d122..dd07cd0a 100644 --- a/src/main/resources/assets/portalcubed/models/block/smooth_gray_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/smooth_gray_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/smooth_gray_half_panel", - "1": "portalcubed:block/smooth_gray_half_panel" + "1": "portalcubed:block/smooth_gray_half_panel", + "particle": "portalcubed:block/smooth_gray_half_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/smooth_gray_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/smooth_gray_panel_facade.json index 94b752ed..ed1543f9 100644 --- a/src/main/resources/assets/portalcubed/models/block/smooth_gray_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/smooth_gray_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/smooth_gray_panel", - "1": "portalcubed:block/smooth_gray_panel" + "1": "portalcubed:block/smooth_gray_panel", + "particle": "portalcubed:block/smooth_gray_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/white_half_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/white_half_panel_facade.json index bcc1c6b2..564943b6 100644 --- a/src/main/resources/assets/portalcubed/models/block/white_half_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/white_half_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/white_half_panel", - "1": "portalcubed:block/white_half_panel" + "1": "portalcubed:block/white_half_panel", + "particle": "portalcubed:block/white_half_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/portalcubed/models/block/white_panel_facade.json b/src/main/resources/assets/portalcubed/models/block/white_panel_facade.json index 2da6d165..f964596b 100644 --- a/src/main/resources/assets/portalcubed/models/block/white_panel_facade.json +++ b/src/main/resources/assets/portalcubed/models/block/white_panel_facade.json @@ -1,13 +1,15 @@ { + "credit": "Made by Cart3r using Blockbench.", "textures": { - "particle": "portalcubed:block/white_panel", - "1": "portalcubed:block/white_panel" + "1": "portalcubed:block/white_panel", + "particle": "portalcubed:block/white_panel" }, "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 0.01 ], + { + "from": [0, 0, 0], + "to": [16, 16, 0.01], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}, "east": {"uv": [15.99, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 0.01, 16], "texture": "#1"}, @@ -16,4 +18,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/data/portalcubed/tags/blocks/portal_nonsolid.json b/src/main/resources/data/portalcubed/tags/blocks/portal_nonsolid.json index 3b952e6d..1dbef22a 100644 --- a/src/main/resources/data/portalcubed/tags/blocks/portal_nonsolid.json +++ b/src/main/resources/data/portalcubed/tags/blocks/portal_nonsolid.json @@ -15,6 +15,14 @@ "portalcubed:2x2_double_crossbar_bottom_left", "portalcubed:2x2_double_crossbar_top_right", "portalcubed:2x2_double_crossbar_bottom_right", + "portalcubed:old_ap_metal_grating_facade", + "portalcubed:portal_1_metal_grating_facade", + "portalcubed:portal_2_metal_grating_facade", + "portalcubed:portal_1_mesh_grating_facade", + "portalcubed:repulsion_gel", + "portalcubed:propulsion_gel", + "portalcubed:reflection_gel", + "portalcubed:adhesion_gel", "minecraft:iron_bars", "minecraft:oak_fence_gate", "minecraft:birch_fence_gate", @@ -30,14 +38,6 @@ "minecraft:end_rod", "#minecraft:candles", "minecraft:chain", - "minecraft:bamboo", - "portalcubed:old_ap_metal_grating_facade", - "portalcubed:portal_1_metal_grating_facade", - "portalcubed:portal_2_metal_grating_facade", - "portalcubed:portal_1_mesh_grating_facade", - "portalcubed:repulsion_gel", - "portalcubed:propulsion_gel", - "portalcubed:reflection_gel", - "portalcubed:adhesion_gel" + "minecraft:bamboo" ] } \ No newline at end of file From 695c11de2203811b9baa8686760ebb0f6af2f89f Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 20 Jul 2023 17:28:03 -0500 Subject: [PATCH 11/26] Add new "portalcubed:funnel" predicate condition This takes two optional parameters: + `in_funnel` is a boolean whose presence checks whether the entity's funnel state matches. + `in_cfg` is a boolean whose presence checks whether the player's crouch fly glitch state matches. Non-player entities are treated as never in CFG. --- .../fusionflux/portalcubed/PortalCubed.java | 4 + .../predicates/InFunnelCondition.java | 74 +++++++++++++++++++ .../predicates/PortalCubedConditions.java | 15 ++++ 3 files changed, 93 insertions(+) create mode 100644 src/main/java/com/fusionflux/portalcubed/predicates/InFunnelCondition.java create mode 100644 src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java diff --git a/src/main/java/com/fusionflux/portalcubed/PortalCubed.java b/src/main/java/com/fusionflux/portalcubed/PortalCubed.java index 6d2df03c..3f61d6ce 100644 --- a/src/main/java/com/fusionflux/portalcubed/PortalCubed.java +++ b/src/main/java/com/fusionflux/portalcubed/PortalCubed.java @@ -25,6 +25,7 @@ import com.fusionflux.portalcubed.items.PortalCubedItems; import com.fusionflux.portalcubed.packet.PortalCubedServerPackets; import com.fusionflux.portalcubed.particle.PortalCubedParticleTypes; +import com.fusionflux.portalcubed.predicates.PortalCubedConditions; import com.fusionflux.portalcubed.sound.PortalCubedSounds; import com.fusionflux.portalcubed.util.IPQuaternion; import com.google.gson.JsonElement; @@ -261,6 +262,7 @@ public void onInitialize(ModContainer mod) { ); MidnightConfig.init("portalcubed", PortalCubedConfig.class); + PortalBlocksLoader.init(mod); PortalCubedFluids.registerFluids(); PortalCubedBlocks.registerBlocks(); @@ -271,6 +273,8 @@ public void onInitialize(ModContainer mod) { PortalCubedSounds.registerSounds(); PortalCubedGameRules.register(); PortalCubedParticleTypes.register(); + PortalCubedConditions.register(); + PortalTabsLoader.load(mod); BlockContentRegistries.FLAMMABLE.put(PortalCubedBlocks.NEUROTOXIN_BLOCK, new FlammableBlockEntry(10000, 10000)); GravityChannel.UPDATE_GRAVITY.getVerifierRegistry().register(AdhesionGravityVerifier.FIELD_GRAVITY_SOURCE, AdhesionGravityVerifier::check); diff --git a/src/main/java/com/fusionflux/portalcubed/predicates/InFunnelCondition.java b/src/main/java/com/fusionflux/portalcubed/predicates/InFunnelCondition.java new file mode 100644 index 00000000..31838057 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/predicates/InFunnelCondition.java @@ -0,0 +1,74 @@ +package com.fusionflux.portalcubed.predicates; + +import com.fusionflux.portalcubed.accessor.EntityExt; +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSyntaxException; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParam; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +public class InFunnelCondition implements LootItemCondition { + private final Boolean inFunnel; + private final Boolean inCfg; + + public InFunnelCondition(Boolean inFunnel, Boolean inCfg) { + this.inFunnel = inFunnel; + this.inCfg = inCfg; + } + + @NotNull + @Override + public LootItemConditionType getType() { + return PortalCubedConditions.FUNNEL; + } + + @NotNull + @Override + public Set> getReferencedContextParams() { + return ImmutableSet.of(LootContextParams.THIS_ENTITY); + } + + @Override + public boolean test(LootContext lootContext) { + if (inFunnel != null && ((EntityExt)lootContext.getParam(LootContextParams.THIS_ENTITY)).isInFunnel() != inFunnel) { + return false; + } + //noinspection RedundantIfStatement + if (inCfg != null && ((EntityExt)lootContext.getParam(LootContextParams.THIS_ENTITY)).cfg() != inCfg) { + return false; + } + return true; + } + + public static class Serializer implements net.minecraft.world.level.storage.loot.Serializer { + @Override + public void serialize(JsonObject json, InFunnelCondition value, JsonSerializationContext serializationContext) { + json.addProperty("in_funnel", value.inFunnel); + } + + @NotNull + @Override + public InFunnelCondition deserialize(JsonObject json, JsonDeserializationContext serializationContext) { + if (!json.has("in_funnel") && !json.has("in_cfg")) { + throw new JsonSyntaxException("portalcubed:funnel condition must have either in_funnel or in_cfg"); + } + return new InFunnelCondition( + getAsOptionalBoolean(json, "in_funnel"), + getAsOptionalBoolean(json, "in_cfg") + ); + } + + private static Boolean getAsOptionalBoolean(JsonObject json, String name) { + return json.has(name) ? GsonHelper.convertToBoolean(json.get(name), name) : null; + } + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java b/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java new file mode 100644 index 00000000..ef33407b --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java @@ -0,0 +1,15 @@ +package com.fusionflux.portalcubed.predicates; + +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; + +import static com.fusionflux.portalcubed.PortalCubed.id; + +public class PortalCubedConditions { + public static final LootItemConditionType FUNNEL = new LootItemConditionType(new InFunnelCondition.Serializer()); + + public static void register() { + Registry.register(BuiltInRegistries.LOOT_CONDITION_TYPE, id("funnel"), FUNNEL); + } +} From 3e1bbf3fc1a3ac4334a1745d2acf32c2500572cb Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 20 Jul 2023 19:00:11 -0500 Subject: [PATCH 12/26] InFunnelCondition -> FunnelCondition because I forgot to rename it earlier --- .../{InFunnelCondition.java => FunnelCondition.java} | 12 ++++++------ .../predicates/PortalCubedConditions.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/com/fusionflux/portalcubed/predicates/{InFunnelCondition.java => FunnelCondition.java} (83%) diff --git a/src/main/java/com/fusionflux/portalcubed/predicates/InFunnelCondition.java b/src/main/java/com/fusionflux/portalcubed/predicates/FunnelCondition.java similarity index 83% rename from src/main/java/com/fusionflux/portalcubed/predicates/InFunnelCondition.java rename to src/main/java/com/fusionflux/portalcubed/predicates/FunnelCondition.java index 31838057..baad30e7 100644 --- a/src/main/java/com/fusionflux/portalcubed/predicates/InFunnelCondition.java +++ b/src/main/java/com/fusionflux/portalcubed/predicates/FunnelCondition.java @@ -16,11 +16,11 @@ import java.util.Set; -public class InFunnelCondition implements LootItemCondition { +public class FunnelCondition implements LootItemCondition { private final Boolean inFunnel; private final Boolean inCfg; - public InFunnelCondition(Boolean inFunnel, Boolean inCfg) { + public FunnelCondition(Boolean inFunnel, Boolean inCfg) { this.inFunnel = inFunnel; this.inCfg = inCfg; } @@ -49,19 +49,19 @@ public boolean test(LootContext lootContext) { return true; } - public static class Serializer implements net.minecraft.world.level.storage.loot.Serializer { + public static class Serializer implements net.minecraft.world.level.storage.loot.Serializer { @Override - public void serialize(JsonObject json, InFunnelCondition value, JsonSerializationContext serializationContext) { + public void serialize(JsonObject json, FunnelCondition value, JsonSerializationContext serializationContext) { json.addProperty("in_funnel", value.inFunnel); } @NotNull @Override - public InFunnelCondition deserialize(JsonObject json, JsonDeserializationContext serializationContext) { + public FunnelCondition deserialize(JsonObject json, JsonDeserializationContext serializationContext) { if (!json.has("in_funnel") && !json.has("in_cfg")) { throw new JsonSyntaxException("portalcubed:funnel condition must have either in_funnel or in_cfg"); } - return new InFunnelCondition( + return new FunnelCondition( getAsOptionalBoolean(json, "in_funnel"), getAsOptionalBoolean(json, "in_cfg") ); diff --git a/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java b/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java index ef33407b..6ae63ea0 100644 --- a/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java +++ b/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java @@ -7,7 +7,7 @@ import static com.fusionflux.portalcubed.PortalCubed.id; public class PortalCubedConditions { - public static final LootItemConditionType FUNNEL = new LootItemConditionType(new InFunnelCondition.Serializer()); + public static final LootItemConditionType FUNNEL = new LootItemConditionType(new FunnelCondition.Serializer()); public static void register() { Registry.register(BuiltInRegistries.LOOT_CONDITION_TYPE, id("funnel"), FUNNEL); From 3833db0848de487127cbf71ac7fbb8ded8b4e228 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 20 Jul 2023 20:26:37 -0500 Subject: [PATCH 13/26] is_cfg works now --- .../portalcubed/client/MixinPCClientAccessor.java | 8 -------- .../fusionflux/portalcubed/mixin/PlayerMixin.java | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/com/fusionflux/portalcubed/client/MixinPCClientAccessor.java diff --git a/src/main/java/com/fusionflux/portalcubed/client/MixinPCClientAccessor.java b/src/main/java/com/fusionflux/portalcubed/client/MixinPCClientAccessor.java deleted file mode 100644 index 3fc1490d..00000000 --- a/src/main/java/com/fusionflux/portalcubed/client/MixinPCClientAccessor.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fusionflux.portalcubed.client; - -// Redirection class for accessing client classes from common mixins -public class MixinPCClientAccessor { - public static boolean allowCfg() { - return PortalCubedClient.allowCfg; - } -} diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/PlayerMixin.java b/src/main/java/com/fusionflux/portalcubed/mixin/PlayerMixin.java index f7239289..d8f07ada 100644 --- a/src/main/java/com/fusionflux/portalcubed/mixin/PlayerMixin.java +++ b/src/main/java/com/fusionflux/portalcubed/mixin/PlayerMixin.java @@ -2,10 +2,10 @@ import com.fusionflux.portalcubed.PortalCubed; import com.fusionflux.portalcubed.PortalCubedConfig; +import com.fusionflux.portalcubed.PortalCubedGameRules; import com.fusionflux.portalcubed.TeleportResult; import com.fusionflux.portalcubed.accessor.CalledValues; import com.fusionflux.portalcubed.accessor.EntityExt; -import com.fusionflux.portalcubed.client.MixinPCClientAccessor; import com.fusionflux.portalcubed.client.PortalCubedClient; import com.fusionflux.portalcubed.entity.Portal; import com.fusionflux.portalcubed.items.PortalCubedItems; @@ -137,11 +137,22 @@ public void tickHead(CallbackInfo ci) { } } - if (!level().isClientSide || !MixinPCClientAccessor.allowCfg() || !isShiftKeyDown()) { + if (!( + level().isClientSide + ? pc$allowCfgClient() + : level().getGameRules().getBoolean(PortalCubedGameRules.ALLOW_CROUCH_FLY_GLITCH) + ) || !isShiftKeyDown() + ) { cfg = false; } } + @Unique + @ClientOnly + private static boolean pc$allowCfgClient() { + return PortalCubedClient.allowCfg; + } + @Inject(method = "tick", at = @At("TAIL")) public void tickTail(CallbackInfo ci) { if (this.level().isClientSide) { From 3babbdfab5adbf283aa9dd906456814826890381 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 20 Jul 2023 22:49:54 -0500 Subject: [PATCH 14/26] More advancement stuff --- .../fusionflux/portalcubed/PortalCubed.java | 4 +- .../advancements/PortalCubedAdvancements.java | 13 ++++ .../conditions}/FunnelCondition.java | 2 +- .../conditions}/PortalCubedConditions.java | 2 +- .../predicates/EnergyPelletPredicate.java | 63 +++++++++++++++++++ .../predicates/PortalCubedPredicates.java | 11 ++++ .../advancements/triggers/BounceTrigger.java | 54 ++++++++++++++++ .../triggers/PortalCubedTriggers.java | 11 ++++ .../portalcubed/blocks/CatapultBlock.java | 4 +- .../render/entity/EnergyPelletRenderer.java | 6 +- ...rgyPelletEntity.java => EnergyPellet.java} | 50 +++++++++++++-- .../entity/PortalCubedEntities.java | 3 +- .../portalcubed/items/EnergyPelletItem.java | 6 +- .../mechanics/PortalCubedDamageSources.java | 15 +++++ .../mixin/EntitySubPredicate_TypesMixin.java | 25 ++++++++ src/main/resources/portalcubed.mixins.json | 1 + 16 files changed, 250 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/fusionflux/portalcubed/advancements/PortalCubedAdvancements.java rename src/main/java/com/fusionflux/portalcubed/{predicates => advancements/conditions}/FunnelCondition.java (97%) rename src/main/java/com/fusionflux/portalcubed/{predicates => advancements/conditions}/PortalCubedConditions.java (89%) create mode 100644 src/main/java/com/fusionflux/portalcubed/advancements/predicates/EnergyPelletPredicate.java create mode 100644 src/main/java/com/fusionflux/portalcubed/advancements/predicates/PortalCubedPredicates.java create mode 100644 src/main/java/com/fusionflux/portalcubed/advancements/triggers/BounceTrigger.java create mode 100644 src/main/java/com/fusionflux/portalcubed/advancements/triggers/PortalCubedTriggers.java rename src/main/java/com/fusionflux/portalcubed/entity/{EnergyPelletEntity.java => EnergyPellet.java} (83%) create mode 100644 src/main/java/com/fusionflux/portalcubed/mixin/EntitySubPredicate_TypesMixin.java diff --git a/src/main/java/com/fusionflux/portalcubed/PortalCubed.java b/src/main/java/com/fusionflux/portalcubed/PortalCubed.java index 3f61d6ce..63b8dfb3 100644 --- a/src/main/java/com/fusionflux/portalcubed/PortalCubed.java +++ b/src/main/java/com/fusionflux/portalcubed/PortalCubed.java @@ -4,6 +4,7 @@ import com.fusionflux.gravity_api.util.GravityChannel; import com.fusionflux.gravity_api.util.RotationUtil; import com.fusionflux.portalcubed.accessor.CalledValues; +import com.fusionflux.portalcubed.advancements.PortalCubedAdvancements; import com.fusionflux.portalcubed.blocks.PortalBlocksLoader; import com.fusionflux.portalcubed.blocks.PortalCubedBlocks; import com.fusionflux.portalcubed.blocks.TallButtonVariant; @@ -25,7 +26,6 @@ import com.fusionflux.portalcubed.items.PortalCubedItems; import com.fusionflux.portalcubed.packet.PortalCubedServerPackets; import com.fusionflux.portalcubed.particle.PortalCubedParticleTypes; -import com.fusionflux.portalcubed.predicates.PortalCubedConditions; import com.fusionflux.portalcubed.sound.PortalCubedSounds; import com.fusionflux.portalcubed.util.IPQuaternion; import com.google.gson.JsonElement; @@ -273,7 +273,7 @@ public void onInitialize(ModContainer mod) { PortalCubedSounds.registerSounds(); PortalCubedGameRules.register(); PortalCubedParticleTypes.register(); - PortalCubedConditions.register(); + PortalCubedAdvancements.register(); PortalTabsLoader.load(mod); BlockContentRegistries.FLAMMABLE.put(PortalCubedBlocks.NEUROTOXIN_BLOCK, new FlammableBlockEntry(10000, 10000)); diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/PortalCubedAdvancements.java b/src/main/java/com/fusionflux/portalcubed/advancements/PortalCubedAdvancements.java new file mode 100644 index 00000000..3b5584b1 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/advancements/PortalCubedAdvancements.java @@ -0,0 +1,13 @@ +package com.fusionflux.portalcubed.advancements; + +import com.fusionflux.portalcubed.advancements.conditions.PortalCubedConditions; +import com.fusionflux.portalcubed.advancements.predicates.PortalCubedPredicates; +import com.fusionflux.portalcubed.advancements.triggers.PortalCubedTriggers; + +public class PortalCubedAdvancements { + public static void register() { + PortalCubedConditions.register(); + PortalCubedPredicates.register(); + PortalCubedTriggers.register(); + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/predicates/FunnelCondition.java b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/FunnelCondition.java similarity index 97% rename from src/main/java/com/fusionflux/portalcubed/predicates/FunnelCondition.java rename to src/main/java/com/fusionflux/portalcubed/advancements/conditions/FunnelCondition.java index baad30e7..4635d780 100644 --- a/src/main/java/com/fusionflux/portalcubed/predicates/FunnelCondition.java +++ b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/FunnelCondition.java @@ -1,4 +1,4 @@ -package com.fusionflux.portalcubed.predicates; +package com.fusionflux.portalcubed.advancements.conditions; import com.fusionflux.portalcubed.accessor.EntityExt; import com.google.common.collect.ImmutableSet; diff --git a/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/PortalCubedConditions.java similarity index 89% rename from src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java rename to src/main/java/com/fusionflux/portalcubed/advancements/conditions/PortalCubedConditions.java index 6ae63ea0..356cb64c 100644 --- a/src/main/java/com/fusionflux/portalcubed/predicates/PortalCubedConditions.java +++ b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/PortalCubedConditions.java @@ -1,4 +1,4 @@ -package com.fusionflux.portalcubed.predicates; +package com.fusionflux.portalcubed.advancements.conditions; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/predicates/EnergyPelletPredicate.java b/src/main/java/com/fusionflux/portalcubed/advancements/predicates/EnergyPelletPredicate.java new file mode 100644 index 00000000..b3a7b962 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/advancements/predicates/EnergyPelletPredicate.java @@ -0,0 +1,63 @@ +package com.fusionflux.portalcubed.advancements.predicates; + +import com.fusionflux.portalcubed.entity.EnergyPellet; +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.EntitySubPredicate; +import net.minecraft.advancements.critereon.MinMaxBounds; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class EnergyPelletPredicate implements EntitySubPredicate { + private final MinMaxBounds.Ints bounces; + private final EntityPredicate thrower; + + public EnergyPelletPredicate(MinMaxBounds.Ints bounces, EntityPredicate thrower) { + this.bounces = bounces; + this.thrower = thrower; + } + + public static EnergyPelletPredicate fromJson(JsonObject json) { + return new EnergyPelletPredicate( + MinMaxBounds.Ints.fromJson(json.get("bounces")), + EntityPredicate.fromJson(json.get("thrower")) + ); + } + + @Override + public boolean matches(Entity entity, ServerLevel level, @Nullable Vec3 pos) { + if (!(entity instanceof EnergyPellet energyPellet)) { + return false; + } + if (!bounces.matches(energyPellet.getBounces())) { + return false; + } + //noinspection RedundantIfStatement + if (!thrower.matches(level, pos, energyPellet.getThrower())) { + return false; + } + return true; + } + + @NotNull + @Override + public JsonObject serializeCustomData() { + final JsonObject result = new JsonObject(); + if (!bounces.isAny()) { + result.add("bounces", bounces.serializeToJson()); + } + if (thrower != EntityPredicate.ANY) { + result.add("thrower", thrower.serializeToJson()); + } + return result; + } + + @NotNull + @Override + public Type type() { + return PortalCubedPredicates.ENERGY_PELLET; + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/predicates/PortalCubedPredicates.java b/src/main/java/com/fusionflux/portalcubed/advancements/predicates/PortalCubedPredicates.java new file mode 100644 index 00000000..5e75a6ff --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/advancements/predicates/PortalCubedPredicates.java @@ -0,0 +1,11 @@ +package com.fusionflux.portalcubed.advancements.predicates; + +import net.minecraft.advancements.critereon.EntitySubPredicate; + +public class PortalCubedPredicates { + public static final EntitySubPredicate.Type ENERGY_PELLET = EnergyPelletPredicate::fromJson; + + public static void register() { + EntitySubPredicate.Types.TYPES.put("portalcubed:energy_pellet", ENERGY_PELLET); + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/triggers/BounceTrigger.java b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/BounceTrigger.java new file mode 100644 index 00000000..cbc3f523 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/BounceTrigger.java @@ -0,0 +1,54 @@ +package com.fusionflux.portalcubed.advancements.triggers; + +import com.fusionflux.portalcubed.entity.EnergyPellet; +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import static com.fusionflux.portalcubed.PortalCubed.id; + +public class BounceTrigger extends SimpleCriterionTrigger { + public static final ResourceLocation ID = id("bounce"); + + @NotNull + @Override + public ResourceLocation getId() { + return ID; + } + + @NotNull + @Override + protected TriggerInstance createInstance(JsonObject json, ContextAwarePredicate predicate, DeserializationContext deserializationContext) { + return new TriggerInstance(predicate, EntityPredicate.fromJson(json.get("pellet"))); + } + + public void trigger(ServerPlayer player, EnergyPellet pellet) { + trigger(player, conditions -> conditions.matches(player.serverLevel(), player.position(), pellet)); + } + + public static class TriggerInstance extends AbstractCriterionTriggerInstance { + private final EntityPredicate pellet; + + public TriggerInstance(ContextAwarePredicate player, EntityPredicate pellet) { + super(ID, player); + this.pellet = pellet; + } + + public boolean matches(ServerLevel level, @Nullable Vec3 position, EnergyPellet pellet) { + return this.pellet.matches(level, position, pellet); + } + + @NotNull + @Override + public JsonObject serializeToJson(SerializationContext context) { + final JsonObject result = super.serializeToJson(context); + result.add("pellet", pellet.serializeToJson()); + return result; + } + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/triggers/PortalCubedTriggers.java b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/PortalCubedTriggers.java new file mode 100644 index 00000000..a48bec17 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/PortalCubedTriggers.java @@ -0,0 +1,11 @@ +package com.fusionflux.portalcubed.advancements.triggers; + +import net.minecraft.advancements.CriteriaTriggers; + +public class PortalCubedTriggers { + public static final BounceTrigger BOUNCE = new BounceTrigger(); + + public static void register() { + CriteriaTriggers.register(BOUNCE); + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/blocks/CatapultBlock.java b/src/main/java/com/fusionflux/portalcubed/blocks/CatapultBlock.java index 65457ae2..a92a59d1 100644 --- a/src/main/java/com/fusionflux/portalcubed/blocks/CatapultBlock.java +++ b/src/main/java/com/fusionflux/portalcubed/blocks/CatapultBlock.java @@ -3,7 +3,7 @@ import com.fusionflux.portalcubed.accessor.BlockCollisionTrigger; import com.fusionflux.portalcubed.accessor.EntityExt; import com.fusionflux.portalcubed.blocks.blockentities.CatapultBlockEntity; -import com.fusionflux.portalcubed.entity.EnergyPelletEntity; +import com.fusionflux.portalcubed.entity.EnergyPellet; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -46,7 +46,7 @@ public VoxelShape getTriggerShape(BlockState state, BlockGetter world, BlockPos @Override public void onEntityEnter(BlockState state, Level world, BlockPos pos, Entity entity) { - if (entity instanceof EntityExt ext && !(entity instanceof EnergyPelletEntity)) { + if (entity instanceof EntityExt ext && !(entity instanceof EnergyPellet)) { world.getBlockEntity(pos, PortalCubedBlocks.CATAPULT_BLOCK_ENTITY).ifPresent(ext::collidedWithCatapult); } } diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/entity/EnergyPelletRenderer.java b/src/main/java/com/fusionflux/portalcubed/client/render/entity/EnergyPelletRenderer.java index 34073b95..9c994cac 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/entity/EnergyPelletRenderer.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/entity/EnergyPelletRenderer.java @@ -1,13 +1,13 @@ package com.fusionflux.portalcubed.client.render.entity; -import com.fusionflux.portalcubed.entity.EnergyPelletEntity; +import com.fusionflux.portalcubed.entity.EnergyPellet; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.ThrownItemRenderer; import net.minecraft.util.Mth; -public class EnergyPelletRenderer extends ThrownItemRenderer { +public class EnergyPelletRenderer extends ThrownItemRenderer { public static Float pelletAlpha = null; public EnergyPelletRenderer(EntityRendererProvider.Context ctx) { @@ -15,7 +15,7 @@ public EnergyPelletRenderer(EntityRendererProvider.Context ctx) { } @Override - public void render(EnergyPelletEntity entity, float yaw, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light) { + public void render(EnergyPellet entity, float yaw, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light) { if (entity.getStartingLife() > 0) { pelletAlpha = Mth.clamp(Mth.lerp((float)entity.getLife() / entity.getStartingLife(), 0.25f, 1f), 0f, 1f); } diff --git a/src/main/java/com/fusionflux/portalcubed/entity/EnergyPelletEntity.java b/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java similarity index 83% rename from src/main/java/com/fusionflux/portalcubed/entity/EnergyPelletEntity.java rename to src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java index ad43ef48..47714565 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/EnergyPelletEntity.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java @@ -2,18 +2,22 @@ import com.fusionflux.portalcubed.PortalCubedConfig; import com.fusionflux.portalcubed.accessor.EntityExt; +import com.fusionflux.portalcubed.accessor.LevelExt; +import com.fusionflux.portalcubed.advancements.triggers.PortalCubedTriggers; import com.fusionflux.portalcubed.blocks.PortalCubedBlocks; import com.fusionflux.portalcubed.items.PortalCubedItems; import com.fusionflux.portalcubed.listeners.WentThroughPortalListener; import com.fusionflux.portalcubed.particle.DecalParticleOption; import com.fusionflux.portalcubed.particle.PortalCubedParticleTypes; import com.fusionflux.portalcubed.sound.PortalCubedSounds; +import net.minecraft.Util; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -32,13 +36,18 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.UUID; + import static com.fusionflux.portalcubed.mechanics.PortalCubedDamageSources.pcSources; -public class EnergyPelletEntity extends Entity implements ItemSupplier, WentThroughPortalListener { - private static final EntityDataAccessor STARTING_LIFE = SynchedEntityData.defineId(EnergyPelletEntity.class, EntityDataSerializers.INT); - private static final EntityDataAccessor LIFE = SynchedEntityData.defineId(EnergyPelletEntity.class, EntityDataSerializers.INT); +public class EnergyPellet extends Entity implements ItemSupplier, WentThroughPortalListener { + private static final EntityDataAccessor STARTING_LIFE = SynchedEntityData.defineId(EnergyPellet.class, EntityDataSerializers.INT); + private static final EntityDataAccessor LIFE = SynchedEntityData.defineId(EnergyPellet.class, EntityDataSerializers.INT); + + private int bounces; + private UUID thrower = Util.NIL_UUID; - public EnergyPelletEntity(EntityType type, Level world) { + public EnergyPellet(EntityType type, Level world) { super(type, world); } @@ -51,11 +60,15 @@ protected void defineSynchedData() { @Override protected void readAdditionalSaveData(CompoundTag nbt) { setLife(nbt.getInt("Life")); + bounces = nbt.getInt("Bounces"); + thrower = nbt.getUUID("Thrower"); } @Override protected void addAdditionalSaveData(CompoundTag nbt) { nbt.putInt("Life", getLife()); + nbt.putInt("Bounces", bounces); + nbt.putUUID("Thrower", thrower); } public int getStartingLife() { @@ -123,7 +136,7 @@ public void tick() { } setDeltaMovement(vel); if (bouncedDir != null) { - level().playSound(null, this, PortalCubedSounds.PELLET_BOUNCE_EVENT, SoundSource.HOSTILE, 0.4f, 1f); + bounced(); if (level() instanceof ServerLevel serverLevel) { final Vec3 spawnPos = serverLevel.clip(new ClipContext( position(), @@ -184,11 +197,23 @@ private void bounceOrKill(LivingEntity entity) { final double mag = vel.length(); setDeltaMovement(Math.cos(newAngle) * mag, vel.y, Math.sin(newAngle) * mag); level().playSound(null, this, PortalCubedSounds.PELLET_BOUNCE_EVENT, SoundSource.HOSTILE, 0.4f, 1f); + bounced(); } else { kill(entity); } } + private void bounced() { + level().playSound(null, this, PortalCubedSounds.PELLET_BOUNCE_EVENT, SoundSource.HOSTILE, 0.4f, 1f); + bounces++; + if (level() instanceof ServerLevel serverLevel && thrower != Util.NIL_UUID) { + final ServerPlayer player = (ServerPlayer)serverLevel.getPlayerByUUID(thrower); + if (player != null) { + PortalCubedTriggers.BOUNCE.trigger(player, this); + } + } + } + private void kill(@Nullable LivingEntity entity) { level().playSound(null, position().x, position().y, position().z, PortalCubedSounds.PELLET_EXPLODE_EVENT, SoundSource.HOSTILE, 0.8f, 1f); if (level() instanceof ServerLevel serverLevel) { @@ -198,7 +223,7 @@ private void kill(@Nullable LivingEntity entity) { ); } if (entity != null) { - entity.hurt(pcSources(level()).vaporization(), PortalCubedConfig.pelletDamage); + entity.hurt(pcSources(level()).vaporization(this, getThrower()), PortalCubedConfig.pelletDamage); } kill(); } @@ -218,4 +243,17 @@ public ItemStack getItem() { public void wentThroughPortal(Portal portal) { setLife(getStartingLife()); } + + public int getBounces() { + return bounces; + } + + public UUID getThrowerUUID() { + return thrower; + } + + @Nullable + public Entity getThrower() { + return ((LevelExt)level()).getEntityByUuid(thrower); + } } diff --git a/src/main/java/com/fusionflux/portalcubed/entity/PortalCubedEntities.java b/src/main/java/com/fusionflux/portalcubed/entity/PortalCubedEntities.java index 5d4919e9..2204b6bc 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/PortalCubedEntities.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/PortalCubedEntities.java @@ -3,7 +3,6 @@ import com.fusionflux.portalcubed.blocks.BaseGel; import com.fusionflux.portalcubed.blocks.PortalCubedBlocks; import com.fusionflux.portalcubed.entity.beams.ExcursionFunnelEntity; - import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -127,7 +126,7 @@ PortalCubedBlocks.REFLECTION_GEL, id("textures/block/reflection_gel.png") .setDimensions(EntityDimensions.scalable(0.1875f, 0.1875f)) .build(); - public static final EntityType ENERGY_PELLET = QuiltEntityTypeBuilder.create(MobCategory.MISC, EnergyPelletEntity::new) + public static final EntityType ENERGY_PELLET = QuiltEntityTypeBuilder.create(MobCategory.MISC, EnergyPellet::new) .setDimensions(EntityDimensions.scalable(0.25f, 0.25f)) .build(); diff --git a/src/main/java/com/fusionflux/portalcubed/items/EnergyPelletItem.java b/src/main/java/com/fusionflux/portalcubed/items/EnergyPelletItem.java index 7fa1b9ba..a0360830 100644 --- a/src/main/java/com/fusionflux/portalcubed/items/EnergyPelletItem.java +++ b/src/main/java/com/fusionflux/portalcubed/items/EnergyPelletItem.java @@ -1,6 +1,6 @@ package com.fusionflux.portalcubed.items; -import com.fusionflux.portalcubed.entity.EnergyPelletEntity; +import com.fusionflux.portalcubed.entity.EnergyPellet; import com.fusionflux.portalcubed.entity.PortalCubedEntities; import net.minecraft.core.BlockSource; import net.minecraft.core.Direction; @@ -33,7 +33,7 @@ public InteractionResultHolder use(Level world, Player user, Interact if (!user.getAbilities().instabuild) { item.shrink(1); } - final EnergyPelletEntity pellet = PortalCubedEntities.ENERGY_PELLET.create(world); + final EnergyPellet pellet = PortalCubedEntities.ENERGY_PELLET.create(world); if (pellet == null) return InteractionResultHolder.pass(item); pellet.setPos(user.getEyePosition(0).add(user.getLookAngle())); Vec3 userVelocity = user.getDeltaMovement(); @@ -53,7 +53,7 @@ public DispenseItemBehavior createDispenserBehavior() { @NotNull @Override protected ItemStack execute(BlockSource pointer, ItemStack stack) { - final EnergyPelletEntity pellet = PortalCubedEntities.ENERGY_PELLET.create(pointer.getLevel()); + final EnergyPellet pellet = PortalCubedEntities.ENERGY_PELLET.create(pointer.getLevel()); if (pellet == null) return stack; final Position pos = DispenserBlock.getDispensePosition(pointer); pellet.setPos(pos.x(), pos.y(), pos.z()); diff --git a/src/main/java/com/fusionflux/portalcubed/mechanics/PortalCubedDamageSources.java b/src/main/java/com/fusionflux/portalcubed/mechanics/PortalCubedDamageSources.java index 59c53b6c..1f850067 100644 --- a/src/main/java/com/fusionflux/portalcubed/mechanics/PortalCubedDamageSources.java +++ b/src/main/java/com/fusionflux/portalcubed/mechanics/PortalCubedDamageSources.java @@ -1,13 +1,16 @@ package com.fusionflux.portalcubed.mechanics; import com.fusionflux.portalcubed.accessor.LevelExt; +import com.fusionflux.portalcubed.entity.EnergyPellet; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; public class PortalCubedDamageSources { @@ -36,6 +39,14 @@ private DamageSource source(ResourceKey key) { return new DamageSource(damageTypes.getHolderOrThrow(key)); } + private DamageSource source(ResourceKey damageTypeKey, @Nullable Entity entity) { + return new DamageSource(this.damageTypes.getHolderOrThrow(damageTypeKey), entity); + } + + private DamageSource source(ResourceKey damageTypeKey, @Nullable Entity causingEntity, @Nullable Entity directEntity) { + return new DamageSource(this.damageTypes.getHolderOrThrow(damageTypeKey), causingEntity, directEntity); + } + public DamageSource acid() { return acid; } @@ -48,6 +59,10 @@ public DamageSource vaporization() { return vaporization; } + public DamageSource vaporization(EnergyPellet pellet, @Nullable Entity thrower) { + return source(PortalCubedDamageTypes.VAPORIZATION, pellet, thrower); + } + public DamageSource laser() { return laser; } diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/EntitySubPredicate_TypesMixin.java b/src/main/java/com/fusionflux/portalcubed/mixin/EntitySubPredicate_TypesMixin.java new file mode 100644 index 00000000..ec47caa0 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/mixin/EntitySubPredicate_TypesMixin.java @@ -0,0 +1,25 @@ +package com.fusionflux.portalcubed.mixin; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import net.minecraft.advancements.critereon.EntitySubPredicate; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(EntitySubPredicate.Types.class) +@SuppressWarnings("checkstyle:TypeName") +public class EntitySubPredicate_TypesMixin { + @Shadow @Final @Mutable + @SuppressWarnings("checkstyle:StaticVariableName") + public static BiMap TYPES; + + @Inject(method = "", at = @At("TAIL")) + private static void makeMapMutable(CallbackInfo ci) { + TYPES = HashBiMap.create(TYPES); + } +} diff --git a/src/main/resources/portalcubed.mixins.json b/src/main/resources/portalcubed.mixins.json index 567e060e..69c07f5e 100644 --- a/src/main/resources/portalcubed.mixins.json +++ b/src/main/resources/portalcubed.mixins.json @@ -14,6 +14,7 @@ "CreativeModeTabsAccessor", "DispenserBlockAccessor", "EntityMixin", + "EntitySubPredicate_TypesMixin", "InventoryMixin", "ItemMixin", "LevelMixin", From 205defd085ee7a46aa53bf1c069dc73c86db47f8 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Thu, 20 Jul 2023 23:07:57 -0500 Subject: [PATCH 15/26] Add starting_life and life int ranges to portalcubed:energy_pellet sub-predicate --- .../predicates/EnergyPelletPredicate.java | 20 ++++++++++++++++++- .../portalcubed/entity/EnergyPellet.java | 2 ++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/predicates/EnergyPelletPredicate.java b/src/main/java/com/fusionflux/portalcubed/advancements/predicates/EnergyPelletPredicate.java index b3a7b962..bcd781de 100644 --- a/src/main/java/com/fusionflux/portalcubed/advancements/predicates/EnergyPelletPredicate.java +++ b/src/main/java/com/fusionflux/portalcubed/advancements/predicates/EnergyPelletPredicate.java @@ -12,16 +12,22 @@ import org.jetbrains.annotations.Nullable; public class EnergyPelletPredicate implements EntitySubPredicate { + private final MinMaxBounds.Ints startingLife; + private final MinMaxBounds.Ints life; private final MinMaxBounds.Ints bounces; private final EntityPredicate thrower; - public EnergyPelletPredicate(MinMaxBounds.Ints bounces, EntityPredicate thrower) { + public EnergyPelletPredicate(MinMaxBounds.Ints startingLife, MinMaxBounds.Ints life, MinMaxBounds.Ints bounces, EntityPredicate thrower) { + this.startingLife = startingLife; + this.life = life; this.bounces = bounces; this.thrower = thrower; } public static EnergyPelletPredicate fromJson(JsonObject json) { return new EnergyPelletPredicate( + MinMaxBounds.Ints.fromJson(json.get("starting_life")), + MinMaxBounds.Ints.fromJson(json.get("life")), MinMaxBounds.Ints.fromJson(json.get("bounces")), EntityPredicate.fromJson(json.get("thrower")) ); @@ -32,6 +38,12 @@ public boolean matches(Entity entity, ServerLevel level, @Nullable Vec3 pos) { if (!(entity instanceof EnergyPellet energyPellet)) { return false; } + if (!startingLife.matches(energyPellet.getStartingLife())) { + return false; + } + if (!life.matches(energyPellet.getLife())) { + return false; + } if (!bounces.matches(energyPellet.getBounces())) { return false; } @@ -46,6 +58,12 @@ public boolean matches(Entity entity, ServerLevel level, @Nullable Vec3 pos) { @Override public JsonObject serializeCustomData() { final JsonObject result = new JsonObject(); + if (!startingLife.isAny()) { + result.add("starting_life", bounces.serializeToJson()); + } + if (!life.isAny()) { + result.add("life", bounces.serializeToJson()); + } if (!bounces.isAny()) { result.add("bounces", bounces.serializeToJson()); } diff --git a/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java b/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java index 47714565..27b5fb2e 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java @@ -59,6 +59,7 @@ protected void defineSynchedData() { @Override protected void readAdditionalSaveData(CompoundTag nbt) { + setStartingLife(nbt.getInt("StartingLife")); setLife(nbt.getInt("Life")); bounces = nbt.getInt("Bounces"); thrower = nbt.getUUID("Thrower"); @@ -66,6 +67,7 @@ protected void readAdditionalSaveData(CompoundTag nbt) { @Override protected void addAdditionalSaveData(CompoundTag nbt) { + nbt.putInt("StartingLife", getStartingLife()); nbt.putInt("Life", getLife()); nbt.putInt("Bounces", bounces); nbt.putUUID("Thrower", thrower); From 11181c786ee877faf9a01da1e171da4a69df86b9 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 00:00:11 -0500 Subject: [PATCH 16/26] Actually set the thrower lol --- .../java/com/fusionflux/portalcubed/entity/EnergyPellet.java | 4 ++++ .../com/fusionflux/portalcubed/items/EnergyPelletItem.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java b/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java index 27b5fb2e..88ce7ff0 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java @@ -258,4 +258,8 @@ public UUID getThrowerUUID() { public Entity getThrower() { return ((LevelExt)level()).getEntityByUuid(thrower); } + + public void setThrower(Entity thrower) { + this.thrower = thrower.getUUID(); + } } diff --git a/src/main/java/com/fusionflux/portalcubed/items/EnergyPelletItem.java b/src/main/java/com/fusionflux/portalcubed/items/EnergyPelletItem.java index a0360830..af2ed5c8 100644 --- a/src/main/java/com/fusionflux/portalcubed/items/EnergyPelletItem.java +++ b/src/main/java/com/fusionflux/portalcubed/items/EnergyPelletItem.java @@ -44,6 +44,7 @@ public InteractionResultHolder use(Level world, Player user, Interact if (isSuper) { pellet.resetLife(-1); } + pellet.setThrower(user); world.addFreshEntity(pellet); return InteractionResultHolder.consume(item); } From 679f4445c2128d24c1151d6c241a52eb5a7765af Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 00:01:06 -0500 Subject: [PATCH 17/26] NIL_UUID check in getThrower --- .../java/com/fusionflux/portalcubed/entity/EnergyPellet.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java b/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java index 88ce7ff0..2123fda0 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/EnergyPellet.java @@ -256,6 +256,9 @@ public UUID getThrowerUUID() { @Nullable public Entity getThrower() { + if (thrower == Util.NIL_UUID) { + return null; + } return ((LevelExt)level()).getEntityByUuid(thrower); } From 0c89d64b52ef014ca9c07cbe4d307258873c8a47 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 07:03:01 -0500 Subject: [PATCH 18/26] Fix being able to place portals outside the world border If you can't place blocks, why should you be able to place portals? --- .../fusionflux/portalcubed/entity/Portal.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/fusionflux/portalcubed/entity/Portal.java b/src/main/java/com/fusionflux/portalcubed/entity/Portal.java index f7326b94..c45f104c 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/Portal.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/Portal.java @@ -26,6 +26,7 @@ import net.minecraft.world.level.block.MultifaceBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.border.WorldBorder; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -40,12 +41,7 @@ import org.joml.Vector2d; import org.joml.Vector3f; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; @@ -334,7 +330,19 @@ public boolean validate() { if (disableValidation) { return true; } - return validateBehind() && validateFront(); + return validateCommon() && validateBehind() && validateFront(); + } + + private boolean validateCommon() { + return insideWorldBorder(getBoundingBox(), level().getWorldBorder()); + } + + private static boolean insideWorldBorder(AABB bb, WorldBorder border) { + return + bb.minX >= Math.floor(border.getMinX()) && + bb.maxX <= Math.ceil(border.getMaxX()) && + bb.minZ >= Math.floor(border.getMinZ()) && + bb.maxZ <= Math.ceil(border.getMaxZ()); } private boolean validateBehind() { From 685caf71ad401976859dcc66fcee41a6ebbbf460 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 07:30:17 -0500 Subject: [PATCH 19/26] Add portalcubed:fling trigger This takes two predicates: + `launcher` is a location predicate with the position of the Faith Plate. + `force` is a distance predicate with the XYZ values specified in the Faith Plate GUI. --- .../advancements/triggers/BounceTrigger.java | 4 +- .../advancements/triggers/FlingTrigger.java | 65 +++++++++++++++++++ .../triggers/PortalCubedTriggers.java | 2 + .../blockentities/FaithPlateBlockEntity.java | 9 ++- 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/fusionflux/portalcubed/advancements/triggers/FlingTrigger.java diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/triggers/BounceTrigger.java b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/BounceTrigger.java index cbc3f523..7b3414c3 100644 --- a/src/main/java/com/fusionflux/portalcubed/advancements/triggers/BounceTrigger.java +++ b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/BounceTrigger.java @@ -47,7 +47,9 @@ public boolean matches(ServerLevel level, @Nullable Vec3 position, EnergyPellet @Override public JsonObject serializeToJson(SerializationContext context) { final JsonObject result = super.serializeToJson(context); - result.add("pellet", pellet.serializeToJson()); + if (pellet != EntityPredicate.ANY) { + result.add("pellet", pellet.serializeToJson()); + } return result; } } diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/triggers/FlingTrigger.java b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/FlingTrigger.java new file mode 100644 index 00000000..3742ba64 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/FlingTrigger.java @@ -0,0 +1,65 @@ +package com.fusionflux.portalcubed.advancements.triggers; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.*; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; + +import static com.fusionflux.portalcubed.PortalCubed.id; + +public class FlingTrigger extends SimpleCriterionTrigger { + public static final ResourceLocation ID = id("fling"); + + @NotNull + @Override + public ResourceLocation getId() { + return ID; + } + + @NotNull + @Override + protected TriggerInstance createInstance(JsonObject json, ContextAwarePredicate predicate, DeserializationContext deserializationContext) { + return new TriggerInstance( + predicate, + LocationPredicate.fromJson(json.get("launcher")), + DistancePredicate.fromJson(json.get("force")) + ); + } + + public void trigger(ServerPlayer player, BlockPos launcherPos, Vec3 launcherForce) { + trigger(player, conditions -> conditions.matches(player.serverLevel(), launcherPos, launcherForce)); + } + + public static class TriggerInstance extends AbstractCriterionTriggerInstance { + private final LocationPredicate launcher; + private final DistancePredicate force; + + public TriggerInstance(ContextAwarePredicate player, LocationPredicate launcher, DistancePredicate force) { + super(ID, player); + this.launcher = launcher; + this.force = force; + } + + public boolean matches(ServerLevel level, BlockPos launcherPos, Vec3 launcherForce) { + return launcher.matches(level, launcherPos.getX() + 0.5, launcherPos.getY() + 0.5, launcherPos.getZ() + 0.5) && + force.matches(0, 0, 0, launcherForce.x, launcherForce.y, launcherForce.z); + } + + @NotNull + @Override + public JsonObject serializeToJson(SerializationContext context) { + final JsonObject result = super.serializeToJson(context); + if (launcher != LocationPredicate.ANY) { + result.add("launcher", launcher.serializeToJson()); + } + if (force != DistancePredicate.ANY) { + result.add("force", force.serializeToJson()); + } + return result; + } + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/triggers/PortalCubedTriggers.java b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/PortalCubedTriggers.java index a48bec17..e9edb798 100644 --- a/src/main/java/com/fusionflux/portalcubed/advancements/triggers/PortalCubedTriggers.java +++ b/src/main/java/com/fusionflux/portalcubed/advancements/triggers/PortalCubedTriggers.java @@ -4,8 +4,10 @@ public class PortalCubedTriggers { public static final BounceTrigger BOUNCE = new BounceTrigger(); + public static final FlingTrigger FLING = new FlingTrigger(); public static void register() { CriteriaTriggers.register(BOUNCE); + CriteriaTriggers.register(FLING); } } diff --git a/src/main/java/com/fusionflux/portalcubed/blocks/blockentities/FaithPlateBlockEntity.java b/src/main/java/com/fusionflux/portalcubed/blocks/blockentities/FaithPlateBlockEntity.java index 0fd6cbe1..6f9932aa 100644 --- a/src/main/java/com/fusionflux/portalcubed/blocks/blockentities/FaithPlateBlockEntity.java +++ b/src/main/java/com/fusionflux/portalcubed/blocks/blockentities/FaithPlateBlockEntity.java @@ -1,5 +1,6 @@ package com.fusionflux.portalcubed.blocks.blockentities; +import com.fusionflux.portalcubed.advancements.triggers.PortalCubedTriggers; import com.fusionflux.portalcubed.blocks.FaithPlateBlock; import com.fusionflux.portalcubed.blocks.PortalCubedBlocks; import com.fusionflux.portalcubed.client.packet.PortalCubedClientPackets; @@ -30,6 +31,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.quiltmc.qsl.networking.api.PacketByteBufs; import org.quiltmc.qsl.networking.api.ServerPlayNetworking; @@ -79,7 +81,11 @@ public void tick(Level world, BlockPos pos, BlockState state) { continue; } if (launch) { - RayonIntegration.INSTANCE.setVelocity(liver, new Vec3(velX, velY, velZ)); + final Vec3 force = new Vec3(velX, velY, velZ); + RayonIntegration.INSTANCE.setVelocity(liver, force); + if (liver instanceof ServerPlayer player) { + PortalCubedTriggers.FLING.trigger(player, worldPosition, force); + } } timer = 5; if (!world.isClientSide) { @@ -173,6 +179,7 @@ public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { buf.writeDouble(velZ); } + @NotNull @Override public Component getDisplayName() { return Component.empty(); From 7091eb8cdd069ae07c05e7d6039d6084cf306d3c Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 13:42:04 -0500 Subject: [PATCH 20/26] Add a portalcubed:launcher loot condition This takes one predicate: + `location` is a location predicate with the position of the Faith Plate that launched the entity. --- .../conditions/FunnelCondition.java | 11 +-- .../conditions/LauncherCondition.java | 72 +++++++++++++++++++ .../conditions/PortalCubedConditions.java | 2 + .../portalcubed/util/EntityComponent.java | 24 +++++++ .../portalcubed/util/NbtHelper.java | 2 +- .../util/PortalCubedComponent.java | 7 ++ .../fusionflux/portalcubed/util/TwoByTwo.java | 8 +-- 7 files changed, 116 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/fusionflux/portalcubed/advancements/conditions/LauncherCondition.java diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/conditions/FunnelCondition.java b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/FunnelCondition.java index 4635d780..fbefd40b 100644 --- a/src/main/java/com/fusionflux/portalcubed/advancements/conditions/FunnelCondition.java +++ b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/FunnelCondition.java @@ -5,7 +5,6 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSyntaxException; import net.minecraft.util.GsonHelper; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParam; @@ -52,15 +51,17 @@ public boolean test(LootContext lootContext) { public static class Serializer implements net.minecraft.world.level.storage.loot.Serializer { @Override public void serialize(JsonObject json, FunnelCondition value, JsonSerializationContext serializationContext) { - json.addProperty("in_funnel", value.inFunnel); + if (value.inFunnel != null) { + json.addProperty("in_funnel", value.inFunnel); + } + if (value.inCfg != null) { + json.addProperty("in_cfg", value.inCfg); + } } @NotNull @Override public FunnelCondition deserialize(JsonObject json, JsonDeserializationContext serializationContext) { - if (!json.has("in_funnel") && !json.has("in_cfg")) { - throw new JsonSyntaxException("portalcubed:funnel condition must have either in_funnel or in_cfg"); - } return new FunnelCondition( getAsOptionalBoolean(json, "in_funnel"), getAsOptionalBoolean(json, "in_cfg") diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/conditions/LauncherCondition.java b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/LauncherCondition.java new file mode 100644 index 00000000..a42508ce --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/LauncherCondition.java @@ -0,0 +1,72 @@ +package com.fusionflux.portalcubed.advancements.conditions; + +import com.fusionflux.portalcubed.util.PortalCubedComponents; +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import net.minecraft.advancements.critereon.LocationPredicate; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParam; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +public class LauncherCondition implements LootItemCondition { + private final LocationPredicate location; + + public LauncherCondition(LocationPredicate location) { + this.location = location; + } + + @NotNull + @Override + public LootItemConditionType getType() { + return PortalCubedConditions.LAUNCHER; + } + + @NotNull + @Override + public Set> getReferencedContextParams() { + return ImmutableSet.of(LootContextParams.THIS_ENTITY); + } + + @Override + public boolean test(LootContext lootContext) { + if (location != LocationPredicate.ANY) { + final Entity thisEntity = lootContext.getParam(LootContextParams.THIS_ENTITY); + final BlockPos launcher = PortalCubedComponents.ENTITY_COMPONENT.get(thisEntity).getLauncher(); + if (launcher == null) { + return false; + } + //noinspection RedundantIfStatement + if (!location.matches((ServerLevel)thisEntity.level(), launcher.getX() + 0.5, launcher.getY() + 0.5, launcher.getZ() + 0.5)) { + return false; + } + } + return true; + } + + public static class Serializer implements net.minecraft.world.level.storage.loot.Serializer { + @Override + public void serialize(JsonObject json, LauncherCondition value, JsonSerializationContext serializationContext) { + if (value.location != LocationPredicate.ANY) { + json.add("location", value.location.serializeToJson()); + } + } + + @NotNull + @Override + public LauncherCondition deserialize(JsonObject json, JsonDeserializationContext serializationContext) { + return new LauncherCondition( + LocationPredicate.fromJson(json.get("location")) + ); + } + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/conditions/PortalCubedConditions.java b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/PortalCubedConditions.java index 356cb64c..9c186d64 100644 --- a/src/main/java/com/fusionflux/portalcubed/advancements/conditions/PortalCubedConditions.java +++ b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/PortalCubedConditions.java @@ -8,8 +8,10 @@ public class PortalCubedConditions { public static final LootItemConditionType FUNNEL = new LootItemConditionType(new FunnelCondition.Serializer()); + public static final LootItemConditionType LAUNCHER = new LootItemConditionType(new LauncherCondition.Serializer()); public static void register() { Registry.register(BuiltInRegistries.LOOT_CONDITION_TYPE, id("funnel"), FUNNEL); + Registry.register(BuiltInRegistries.LOOT_CONDITION_TYPE, id("launcher"), LAUNCHER); } } diff --git a/src/main/java/com/fusionflux/portalcubed/util/EntityComponent.java b/src/main/java/com/fusionflux/portalcubed/util/EntityComponent.java index e350553d..e63f2619 100644 --- a/src/main/java/com/fusionflux/portalcubed/util/EntityComponent.java +++ b/src/main/java/com/fusionflux/portalcubed/util/EntityComponent.java @@ -1,12 +1,15 @@ package com.fusionflux.portalcubed.util; import dev.onyxstudios.cca.api.v3.component.sync.AutoSyncedComponent; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashSet; import java.util.Set; @@ -27,6 +30,9 @@ public class EntityComponent implements PortalCubedComponent, AutoSyncedComponen Vec3 serverVelForGel = Vec3.ZERO; + @Nullable + private BlockPos launcher; + public EntityComponent(Entity entity) { this.entity = entity; } @@ -125,6 +131,18 @@ public void removePortals(UUID portalUUID) { PortalCubedComponents.ENTITY_COMPONENT.sync(entity); } + @Nullable + @Override + public BlockPos getLauncher() { + return launcher; + } + + @Override + public void setLauncher(@Nullable BlockPos launcher) { + this.launcher = launcher; + PortalCubedComponents.ENTITY_COMPONENT.sync(entity); + } + @Override public void readFromNbt(CompoundTag tag) { int size = tag.getInt("size"); @@ -145,6 +163,8 @@ public void readFromNbt(CompoundTag tag) { this.setServerVelForGel(NbtHelper.getVec3d(tag, "gelVelocity")); setCanFireGel(tag.getBoolean("canFireGel")); + + setLauncher(NbtHelper.readNullableBlockPos(tag, "launcher")); } @Override @@ -164,5 +184,9 @@ public void writeToNbt(@NotNull CompoundTag tag) { NbtHelper.putVec3d(tag, "gelVelocity", this.getServerVelForGel()); tag.putBoolean("canFireGel", canFireGel); + + if (launcher != null) { + tag.put("launcher", NbtUtils.writeBlockPos(launcher)); + } } } diff --git a/src/main/java/com/fusionflux/portalcubed/util/NbtHelper.java b/src/main/java/com/fusionflux/portalcubed/util/NbtHelper.java index 8efac765..81d88b30 100644 --- a/src/main/java/com/fusionflux/portalcubed/util/NbtHelper.java +++ b/src/main/java/com/fusionflux/portalcubed/util/NbtHelper.java @@ -49,7 +49,7 @@ public static Quaternionf getQuaternion(CompoundTag compoundTag, String name) { } @Nullable - public static BlockPos readBlockPos(CompoundTag tag, String key) { + public static BlockPos readNullableBlockPos(CompoundTag tag, String key) { if (!tag.contains(key, Tag.TAG_COMPOUND)) return null; CompoundTag pos = tag.getCompound(key); diff --git a/src/main/java/com/fusionflux/portalcubed/util/PortalCubedComponent.java b/src/main/java/com/fusionflux/portalcubed/util/PortalCubedComponent.java index 5d694b9b..7aa976a2 100644 --- a/src/main/java/com/fusionflux/portalcubed/util/PortalCubedComponent.java +++ b/src/main/java/com/fusionflux/portalcubed/util/PortalCubedComponent.java @@ -1,8 +1,10 @@ package com.fusionflux.portalcubed.util; import dev.onyxstudios.cca.api.v3.component.Component; +import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import java.util.Set; import java.util.UUID; @@ -43,4 +45,9 @@ public interface PortalCubedComponent extends Component { void setServerVelForGel(Vec3 velocity); + @Nullable + BlockPos getLauncher(); + + void setLauncher(@Nullable BlockPos launcher); + } diff --git a/src/main/java/com/fusionflux/portalcubed/util/TwoByTwo.java b/src/main/java/com/fusionflux/portalcubed/util/TwoByTwo.java index 21b3db2e..8ac2a164 100644 --- a/src/main/java/com/fusionflux/portalcubed/util/TwoByTwo.java +++ b/src/main/java/com/fusionflux/portalcubed/util/TwoByTwo.java @@ -28,10 +28,10 @@ public static TwoByTwo fromTopLeftCorner(BlockPos topLeft, Direction right, Dire @Nullable public static TwoByTwo fromNbt(CompoundTag tag) { - BlockPos topRight = NbtHelper.readBlockPos(tag, "topRight"); - BlockPos topLeft = NbtHelper.readBlockPos(tag, "topLeft"); - BlockPos bottomLeft = NbtHelper.readBlockPos(tag, "bottomLeft"); - BlockPos bottomRight = NbtHelper.readBlockPos(tag, "bottomRight"); + BlockPos topRight = NbtHelper.readNullableBlockPos(tag, "topRight"); + BlockPos topLeft = NbtHelper.readNullableBlockPos(tag, "topLeft"); + BlockPos bottomLeft = NbtHelper.readNullableBlockPos(tag, "bottomLeft"); + BlockPos bottomRight = NbtHelper.readNullableBlockPos(tag, "bottomRight"); TwoByTwo twoByTwo = new TwoByTwo(topRight, topLeft, bottomLeft, bottomRight); for (BlockPos pos : twoByTwo) { if (pos == null) From 0446159bc30aea7c1ab3db624adcc9cfd7eff378 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 14:52:35 -0500 Subject: [PATCH 21/26] Avoid Shapes.or in calculateCrossPortalCollisionShape --- src/main/java/com/fusionflux/portalcubed/entity/Portal.java | 5 +++-- .../java/com/fusionflux/portalcubed/mixin/EntityMixin.java | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fusionflux/portalcubed/entity/Portal.java b/src/main/java/com/fusionflux/portalcubed/entity/Portal.java index c45f104c..3da51593 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/Portal.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/Portal.java @@ -607,7 +607,7 @@ private VoxelShape calculateCrossPortalCollisionShape(Vec3 normal, Vec3 origin, result.forAllBoxes((x1, y1, z1, x2, y2, z2) -> { final Vec3 minT = transform.rotate(new Vec3(x1, y1, z1), false); final Vec3 maxT = transform.rotate(new Vec3(x2, y2, z2), false); - rotatedShape.setValue(Shapes.or( + rotatedShape.setValue(Shapes.joinUnoptimized( rotatedShape.getValue(), Shapes.box( Math.min(minT.x, maxT.x), @@ -616,7 +616,8 @@ private VoxelShape calculateCrossPortalCollisionShape(Vec3 normal, Vec3 origin, Math.max(minT.x, maxT.x), Math.max(minT.y, maxT.y), Math.max(minT.z, maxT.z) - ) + ), + BooleanOp.OR )); }); result = rotatedShape.getValue(); diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java b/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java index dbf63d11..38a5c784 100644 --- a/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java +++ b/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java @@ -36,6 +36,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; +import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; @@ -161,6 +162,7 @@ public void setMaxFallSpeed(double maxFallSpeed) { @Shadow public abstract Level level(); + @Shadow private Level level; @Unique private final Map collidingBlocks = new HashMap<>(); @Unique @@ -184,6 +186,8 @@ public void setMaxFallSpeed(double maxFallSpeed) { @Inject(method = "tick", at = @At("HEAD")) public void tick(CallbackInfo ci) { + final ProfilerFiller profiler = level.getProfiler(); + profiler.push("portalcubed_entity"); Entity thiz = (Entity) (Object) this; @@ -237,6 +241,8 @@ public void tick(CallbackInfo ci) { } prevGravDirec = GravityChangerAPI.getGravityDirection(((Entity) (Object) this)); + + profiler.pop(); } @Inject(method = "tick", at = @At("TAIL")) From e98e24f182b329c7615f7478a507865866fae23f Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 15:07:29 -0500 Subject: [PATCH 22/26] I missed a Shapes.or --- src/main/java/com/fusionflux/portalcubed/entity/Portal.java | 2 +- .../java/com/fusionflux/portalcubed/mixin/EntityMixin.java | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/fusionflux/portalcubed/entity/Portal.java b/src/main/java/com/fusionflux/portalcubed/entity/Portal.java index 3da51593..3024c93d 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/Portal.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/Portal.java @@ -596,7 +596,7 @@ private VoxelShape calculateCrossPortalCollisionShape(Vec3 normal, Vec3 origin, final VoxelShape clippingShape = Shapes.create(clipping); VoxelShape result = Shapes.empty(); for (final VoxelShape shape : level().getBlockCollisions(context, clipping)) { - result = Shapes.or(result, Shapes.joinUnoptimized(shape, clippingShape, BooleanOp.AND)); + result = Shapes.joinUnoptimized(result, Shapes.joinUnoptimized(shape, clippingShape, BooleanOp.AND), BooleanOp.OR); } if (otherRotation != null && !result.isEmpty() /* Empty shapes don't need to be translated */) { final Vec3 scaledNormalOffset = getNormal().scale(SURFACE_OFFSET); diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java b/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java index 38a5c784..4fc2740e 100644 --- a/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java +++ b/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java @@ -121,9 +121,6 @@ public void setMaxFallSpeed(double maxFallSpeed) { @Shadow public abstract boolean equals(Object o); - @Shadow - public abstract boolean isNoGravity(); - @Shadow public abstract boolean onGround(); From a30855c40b3da7293c893995464bd367ec8e5402 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 16:00:17 -0500 Subject: [PATCH 23/26] Hopefully optimize calculateCrossPortalCollisionShape --- .../fusionflux/portalcubed/entity/Portal.java | 87 +++++++++---------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/fusionflux/portalcubed/entity/Portal.java b/src/main/java/com/fusionflux/portalcubed/entity/Portal.java index 3024c93d..b7c867e7 100644 --- a/src/main/java/com/fusionflux/portalcubed/entity/Portal.java +++ b/src/main/java/com/fusionflux/portalcubed/entity/Portal.java @@ -80,9 +80,6 @@ public class Portal extends Entity { private Optional otherAxisW = Optional.empty(), otherAxisH = Optional.empty(), otherNormal = Optional.empty(); private IPQuaternion transformQuat; - private VoxelShape crossCollisionThis; - private long crossCollisionThisTick = -1; - private final List> listeningEntities = new ArrayList<>(); public Portal(EntityType entityType, Level world) { @@ -576,15 +573,6 @@ public VoxelShape getCrossPortalCollisionShapeOther(Entity context) { : Shapes.empty(); } - public VoxelShape getCrossPortalCollisionShapeThis() { - final long tick = level().getGameTime(); - if (crossCollisionThis == null || crossCollisionThisTick < tick) { - crossCollisionThis = calculateCrossPortalCollisionShape(getNormal(), getOriginPos(), null, this); - crossCollisionThisTick = tick; - } - return crossCollisionThis; - } - private VoxelShape calculateCrossPortalCollisionShape(Vec3 normal, Vec3 origin, Quaternionf otherRotation, Entity context) { origin = origin.subtract(normal.scale(SURFACE_OFFSET)); final Direction facing = Direction.getNearest(normal.x, normal.y, normal.z); @@ -594,47 +582,56 @@ private VoxelShape calculateCrossPortalCollisionShape(Vec3 normal, Vec3 origin, facing, origin ); final VoxelShape clippingShape = Shapes.create(clipping); - VoxelShape result = Shapes.empty(); + final List shapes = new ArrayList<>(); for (final VoxelShape shape : level().getBlockCollisions(context, clipping)) { - result = Shapes.joinUnoptimized(result, Shapes.joinUnoptimized(shape, clippingShape, BooleanOp.AND), BooleanOp.OR); + final VoxelShape clippedShape = + clipping.contains(shape.min(Axis.X), shape.min(Axis.Y), shape.min(Axis.Z)) && + clipping.contains(shape.max(Axis.X), shape.max(Axis.Y), shape.max(Axis.Z)) + ? shape : Shapes.joinUnoptimized(shape, clippingShape, BooleanOp.AND); + shapes.add(clippedShape); } - if (otherRotation != null && !result.isEmpty() /* Empty shapes don't need to be translated */) { + if (!shapes.isEmpty() /* Empty shapes don't need to be translated */) { final Vec3 scaledNormalOffset = getNormal().scale(SURFACE_OFFSET); if (facing != getFacingDirection().getOpposite()) { - result = result.move(-origin.x, -origin.y, -origin.z); final IPQuaternion transform = getTransformQuat().getConjugated(); - final MutableObject rotatedShape = new MutableObject<>(Shapes.empty()); - result.forAllBoxes((x1, y1, z1, x2, y2, z2) -> { - final Vec3 minT = transform.rotate(new Vec3(x1, y1, z1), false); - final Vec3 maxT = transform.rotate(new Vec3(x2, y2, z2), false); - rotatedShape.setValue(Shapes.joinUnoptimized( - rotatedShape.getValue(), - Shapes.box( - Math.min(minT.x, maxT.x), - Math.min(minT.y, maxT.y), - Math.min(minT.z, maxT.z), - Math.max(minT.x, maxT.x), - Math.max(minT.y, maxT.y), - Math.max(minT.z, maxT.z) - ), - BooleanOp.OR - )); - }); - result = rotatedShape.getValue(); - result = result.move( - getX() - scaledNormalOffset.x, - getY() - scaledNormalOffset.y, - getZ() - scaledNormalOffset.z - ); + final MutableObject result = new MutableObject<>(Shapes.empty()); + final double originX = origin.x; + final double originY = origin.y; + final double originZ = origin.z; + final double ox = getX() - scaledNormalOffset.x; + final double oy = getY() - scaledNormalOffset.y; + final double oz = getZ() - scaledNormalOffset.z; + for (VoxelShape shape : shapes) { + shape.forAllBoxes((x1, y1, z1, x2, y2, z2) -> { + final Vec3 minT = transform.rotate(new Vec3(x1 - originX, y1 - originY, z1 - originZ), false); + final Vec3 maxT = transform.rotate(new Vec3(x2 - originX, y2 - originY, z2 - originZ), false); + result.setValue(Shapes.joinUnoptimized( + result.getValue(), + Shapes.box( + Math.min(minT.x, maxT.x) + ox, + Math.min(minT.y, maxT.y) + oy, + Math.min(minT.z, maxT.z) + oz, + Math.max(minT.x, maxT.x) + ox, + Math.max(minT.y, maxT.y) + oy, + Math.max(minT.z, maxT.z) + oz + ), + BooleanOp.OR + )); + }); + } + return result.getValue(); } else { - result = result.move( - getX() - origin.x - scaledNormalOffset.x, - getY() - origin.y - scaledNormalOffset.y, - getZ() - origin.z - scaledNormalOffset.z - ); + VoxelShape result = Shapes.empty(); + final double ox = getX() - origin.x - scaledNormalOffset.x; + final double oy = getY() - origin.y - scaledNormalOffset.y; + final double oz = getZ() - origin.z - scaledNormalOffset.z; + for (VoxelShape shape : shapes) { + result = Shapes.joinUnoptimized(result, shape.move(ox, oy, oz), BooleanOp.OR); + } + return result; } } - return result; + return Shapes.empty(); } public Vec3 getCutoutPointInPlane(double xInPlane, double yInPlane) { From 1ddb7fbdcd6a2ff4406dbc98ced163597658ba2d Mon Sep 17 00:00:00 2001 From: Carter <69820300+Cart3r1234@users.noreply.github.com> Date: Fri, 21 Jul 2023 17:13:21 -0400 Subject: [PATCH 24/26] Achievement Advancements and other minor changes - Added a handful of task and challenge advancements - Added subtitles to more sounds - Some lang/tooltip tweaks - Minor texture and recipe tweaks for a few items --- .../assets/portalcubed/lang/en_us.json | 77 +++++- .../resources/assets/portalcubed/sounds.json | 2 + .../portalcubed/textures/item/auto_portal.png | Bin 5988 -> 6430 bytes .../textures/item/conversion_gel_blob.png | Bin 5690 -> 5937 bytes .../portalcubed/textures/item/hammer.png | Bin 203 -> 5229 bytes .../textures/item/portal_1_fizzler_icon.png | Bin 5353 -> 5732 bytes .../achievements/adhesion_gel.json | 32 +++ .../achievements/auto_portal.json | 32 +++ .../advancements/achievements/boots.json | 45 ++++ .../achievements/conversion_gel.json | 51 ++++ .../advancements/achievements/crouch_fly.json | 35 +++ .../advancements/achievements/cubes.json | 65 +++++ .../achievements/faith_plate.json | 36 +++ .../achievements/falling_with_style.json | 252 ++++++++++++++++++ .../achievements/feather_falling_boots.json | 45 ++++ .../advancements/achievements/funnel.json | 31 +++ .../advancements/achievements/goo.json | 26 ++ .../achievements/hammer_time.json | 41 +++ .../advancements/achievements/hoopy.json | 32 +++ .../advancements/achievements/laser.json | 35 +++ .../achievements/light_bridge.json | 26 ++ .../advancements/achievements/pellet.json | 32 +++ .../achievements/pellet_bounce.json | 37 +++ .../achievements/propulsion_gel.json | 26 ++ .../advancements/achievements/radio.json | 31 +++ .../achievements/rainbow_autoportal.json | 179 +++++++++++++ .../advancements/achievements/rattmann.json | 65 +++++ .../achievements/repulsion_gel.json | 45 ++++ .../advancements/achievements/root.json | 32 +++ .../advancements/achievements/space_core.json | 57 ++++ .../recipes/redirection_cube_crafting.json | 5 +- .../tags/blocks/configurable_elements.json | 15 ++ .../portalcubed/tags/damage_type/laser.json | 5 + src/main/resources/tooltips.json | 8 +- 34 files changed, 1392 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/adhesion_gel.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/auto_portal.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/boots.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/conversion_gel.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/crouch_fly.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/cubes.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/faith_plate.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/falling_with_style.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/feather_falling_boots.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/funnel.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/goo.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/hammer_time.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/hoopy.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/laser.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/light_bridge.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/pellet.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/pellet_bounce.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/propulsion_gel.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/radio.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/rainbow_autoportal.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/rattmann.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/repulsion_gel.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/root.json create mode 100644 src/main/resources/data/portalcubed/advancements/achievements/space_core.json create mode 100644 src/main/resources/data/portalcubed/tags/blocks/configurable_elements.json create mode 100644 src/main/resources/data/portalcubed/tags/damage_type/laser.json diff --git a/src/main/resources/assets/portalcubed/lang/en_us.json b/src/main/resources/assets/portalcubed/lang/en_us.json index 1f93c428..c416ed27 100644 --- a/src/main/resources/assets/portalcubed/lang/en_us.json +++ b/src/main/resources/assets/portalcubed/lang/en_us.json @@ -5,14 +5,17 @@ "subtitles.portalcubed.gel_bounce": "Something bounces on propulsion gel", "subtitles.portalcubed.gel_run": "Something slides on propulsion gel", + "subtitles.portalcubed.gel_blob_splash": "Gel blob splashes", - "subtitles.portalcubed.portal_gun_secondary_fire": "Portal gun secondary fire", - "subtitles.portalcubed.portal_gun_primary_fire": "Portal gun primary fire", - "subtitles.portalcubed.portal_invalid_surface": "Portal gun failed", + "subtitles.portalcubed.portal_gun_secondary_fire": "Portal gun shoots secondary portal", + "subtitles.portalcubed.portal_gun_primary_fire": "Portal gun shoots primary portal", + "subtitles.portalcubed.portal_invalid_surface": "Portal gun shot fails", "subtitles.portalcubed.portal_open": "Portal opens", "subtitles.portalcubed.portal_close": "Portal closes", "subtitles.portalcubed.portal_fizzle": "Portal fizzles", + "subtitles.portalcubed.portal_enter": "Something enters a portal", + "subtitles.portalcubed.portal_exit": "Something exits a portal", "subtitles.portalcubed.material_emancipation": "Something disintegrates", @@ -30,6 +33,7 @@ "subtitles.portalcubed.rocket.fire": "Rocket launches", "subtitles.portalcubed.rocket.locked": "Rocket turret fires", "subtitles.portalcubed.rocket.locking": "Rocket turret locks on", + "subtitles.portalcubed.rocket.explosion": "Rocket explodes", "subtitles.portalcubed.pellet.bounce": "Energy pellet bounces", "subtitles.portalcubed.pellet.explode": "Energy pellet explodes", @@ -40,6 +44,68 @@ "subtitles.portalcubed.faith_plate": "Faith plate activates", + "advancement.portalcubed.root.title": "Portal Cubed", + "advancement.portalcubed.root.description": "Welcome to Aperture Science! You're here because we want the best, and you are it.", + + "advancement.portalcubed.hammer_time.title": "Stop - Hammer Time!", + "advancement.portalcubed.hammer_time.description": "Use a Hammer to configure a test element", + + "advancement.portalcubed.radio.title": "Tunes to Test to", + "advancement.portalcubed.radio.description": "Obtain a Radio", + "advancement.portalcubed.cubes.title": "Cubes to Keep You Company", + "advancement.portalcubed.cubes.description": "Obtain one of every cube variant", + "advancement.portalcubed.hoopy.title": "The Next Big Thing", + "advancement.portalcubed.hoopy.description": "Hold Hoopy the Hoop", + "advancement.portalcubed.rattmann.title": "I am Rattmann", + "advancement.portalcubed.rattmann.description": "Obtain every prop that can be found in a Rattmann den", + + "advancement.portalcubed.boots.title": "Good Work, Boots", + "advancement.portalcubed.boots.description": "Prevent fall damage using the Long Fall Boots", + "advancement.portalcubed.falling_with_style.title": "Falling With Style", + "advancement.portalcubed.falling_with_style.description": "Trim a pair of Long Fall Boots", + "advancement.portalcubed.feather_falling_boots.title": "But Why?!", + "advancement.portalcubed.feather_falling_boots.description": "Enchant a pair of Long Fall Boots with Feather Falling", + + "advancement.portalcubed.autoportal.title": "That Portal Was Framed", + "advancement.portalcubed.autoportal.description": "Place an Autoportal", + "advancement.portalcubed.rainbow_autoportals.title": "Pretty Painted Portal Producers", + "advancement.portalcubed.rainbow_autoportals.description": "Use Red, Orange, Yellow, Green, Blue, and Purple dyes on Autoportals. Any shade of each color works.", + + "advancement.portalcubed.pellet.title": "Handle With Care", + "advancement.portalcubed.pellet.description": "Obtain a High Energy Pellet", + "advancement.portalcubed.pellet_bounce.title": "Volleyball World Champion", + "advancement.portalcubed.pellet_bounce.description": "Bounce a High Energy Pellet 35 times before it explodes", + + "advancement.portalcubed.laser.title": "It Burns, Ah!", + "advancement.portalcubed.laser.description": "Touch a Thermal Discouragement Beam and become thermally discouraged", + + "advancement.portalcubed.goo.title": "The Floor is Failure", + "advancement.portalcubed.goo.description": "Submerse yourself in a pool of Toxic Goo and receive an unsatisfactory mark to your record", + + "advancement.portalcubed.faith_plate.title": "Soaring Through the Air...", + "advancement.portalcubed.faith_plate.description": "Launch yourself from an Aerial Faith Plate", + + "advancement.portalcubed.light_bridge.title": "Walking on Sunshine", + "advancement.portalcubed.light_bridge.description": "Step onto a Hard Light Bridge", + + "advancement.portalcubed.funnel.title": "Look Cave, No Hands!", + "advancement.portalcubed.funnel.description": "Take a ride in an Excursion Funnel", + "advancement.portalcubed.crouch_fly.title": "Sneaky Aviation", + "advancement.portalcubed.crouch_fly.description": "Activate the Crouch Fly Glitch", + + "advancement.portalcubed.space_core.title": "Spaaaaaaaaaaaaaaaace!", + "advancement.portalcubed.space_core.description": "Take Space Core to y:500 or higher", + + "advancement.portalcubed.repulsion_gel.title": "It's a Lively One", + "advancement.portalcubed.repulsion_gel.description": "Bounce off Repulsion Gel for the first time", + "advancement.portalcubed.propulsion_gel.title": "Gotta Go Fast!", + "advancement.portalcubed.propulsion_gel.description": "Slide on Propulsion Gel for the first time", + "advancement.portalcubed.conversion_gel.title": "Portal Here, There, Anywhere!", + "advancement.portalcubed.conversion_gel.description": "Shoot a portal on Conversion Gel for the first time", + "advancement.portalcubed.adhesion_gel.title": "Nice Try, Gravity", + "advancement.portalcubed.adhesion_gel.description": "Stand on the ceiling with Adhesion Gel", + + "tooltip.portalcubed.hammer_interaction": "Interact with Hammer:", "tooltip.portalcubed.dye_interaction": "Interact with Dye:", "tooltip.portalcubed.name_tag_interaction": "Interact with Name Tag:", @@ -47,8 +113,9 @@ "tooltip.portalcubed.empty": "", "tooltip.portalcubed.hammer.1": "Used to configure various Test Elements.", - "tooltip.portalcubed.hammer.2": "Required to turn cubes and other props", - "tooltip.portalcubed.hammer.3": "back into items in Survival Mode.", + "tooltip.portalcubed.hammer.2": "Any item tagged as c:wrenches also works as a hammer.", + "tooltip.portalcubed.hammer.3": "Required to turn cubes and other props", + "tooltip.portalcubed.hammer.4": "back into items in Survival Mode.", "tooltip.portalcubed.schrodinger_cube.1": " Links Two Schrödinger Cubes", "tooltip.portalcubed.schrodinger_cube.2": "Schrodinger Cubes linked by name", diff --git a/src/main/resources/assets/portalcubed/sounds.json b/src/main/resources/assets/portalcubed/sounds.json index e500c327..924a7129 100644 --- a/src/main/resources/assets/portalcubed/sounds.json +++ b/src/main/resources/assets/portalcubed/sounds.json @@ -20,6 +20,7 @@ ] }, "gel_splat": { + "subtitle": "subtitles.portalcubed.gel_blob_splash", "sounds": [ "portalcubed:paint_blob_splat_01", "portalcubed:paint_blob_splat_02", @@ -208,6 +209,7 @@ "subtitle": "subtitles.portalcubed.rocket.locking" }, "rocket/explode": { + "subtitle": "subtitles.portalcubed.rocket.explosion", "sounds": [ "portalcubed:rocket/blast1" ] diff --git a/src/main/resources/assets/portalcubed/textures/item/auto_portal.png b/src/main/resources/assets/portalcubed/textures/item/auto_portal.png index 00a2c2bd28ebe6faa4675071f1b2832a6f092a85..470584b3e557ef88d04614e0cf12dd3fa8a7f797 100644 GIT binary patch delta 2748 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 diff --git a/src/main/resources/assets/portalcubed/textures/item/conversion_gel_blob.png b/src/main/resources/assets/portalcubed/textures/item/conversion_gel_blob.png index ef3b76dec7c25784b0df42dd331a6d64757760e1..90035abd5cbef7242b57d88caf737d7b6e8b3d98 100644 GIT binary patch delta 1988 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 delta 176 zcmV;h08jtzD9ZtmBYyyrNkl*AOiUN`u;~3BN~7-zkd1hKUs#rG~c*!18#_? znJ5^etHl85nvo6BkmDw700_9cy23TXFv;El8FKL8LGld&`4^iZAPf>mSC0Zfnlt?5 zzFOu}1~Y^x%`ltMnIHT zXBD#qOCS)-;d##NV3t1x#&(>fyKnm1iBT}0p-2q6IytJ8s8gF`p#m2jH^Tt}b74Ct)dr4SCU0)s)H&E_E7)XP zChgAh=?hJ>aVut8Q&_HqrA$yp*z)mhKHbp!CiUU_z`%%_$g4Aj>&H{sgDUp(IwE zhzxceHWM@_ z>`qvaQs!*4%VM(6A#08~6{JsbMT#$>Xo)3NuC}6oR9{2Y8f$9QkV?%pX}*P~EwlcE8*ltu=FFh(L*`z2d&gQG z$55G!?NvBH-7KmP@0%vpG!DC$(R}sd)A7#~bwIVmx}_PY_huUSKFHx@zhv=p49&PNG0OWIGGu_;ln?H@zmp!R1luELrpLk2lqYz7| zE^dcc;&%sJC^;;j58ttHiDsE0;&87*CPg+{ii_LS2K?r>UU z837`7-)0^Z3m>9CcDj1RTjBzpFQ-eMV$P*UgqC+gfgTR@sY+Ua+86LH5T!mL0gV1E z4bg0Nz7iuL(AefY{v>o=xosL;jPBPpl6mK_nQogueQ2^vQ#+Uri)r_ejPU?G-G8dr z%&7FkTttg|3^n?dM~|`ILwzW3wDB*w$E11XKKBP>SJ(N0QS$}GuavJm3L$no&A_Xq zY8UVT8>y?Ph`dtb$~PPpD@*F~tDLOl_5h_GtrpEf?1iO&btl#34#Ds_{kY3G|BGsW z(=W}vVSdyvZ==~M3(p`Vd-}gve1ELgbQ~q)aNakVct}0+a~}UpS+iwt0L8SS|C?jx z%0s$(UVj1sF_}Xy`Di`g^`Ngub6BZ^*UVN95UwHQ|5GicXDsa zHNI=gW_0CWoX{`OnJ=*W7&`M7yL(^%rmbI9VIImtKl~eUI|I#MRK=|*%n|ohVLSc| zM)N;BP7VVz+O*u0=mZ>pKpe$iQ>7vm!B!A)$WWauh>8d+H=uz^2CIfsT@hsB~i+G)Q zYSYp=?-PevNm7WM<`C{82!$4pcXw+=```ES{CxHJMxYAnwN*$Q~ zB)!(sB1b^)HgIv>(&Rnhat9cA(j`N3BtK1|PypV~=$mpt=oaW+b$e^>B@>IW{&pEiz+bGGaM4I59IbG?Oa{sSPR24YJ`L;!;T008Sa-Ac`quM;1C2NM&L5O!7)5KT;MurS2Rh6-b1VQ(xfsSJPM2T<|>`~eMy4?r!9g`Lqx z8f*-Ofrex&AV%JjjE%FIT^1T&IeBw(?|m2kISSym(=j{6A^;bcmul08`(Dog1VO-c zy{@tV%P>TLM9^BV{n#2!%v?hFct=FYdL96owB>d%HQm|5xNkQH`>Ihct*FZa5lut@ zsPAp7Byh|3sTF)>cVYlLt_3T(Q7)+@(Atgw%P?ecdQM(@G0AE6zN%*c>^?ojEgbh> zQzbWtW0Tij1U%}$AtHSL*^Vp>Dkl-Zm7EOjvr=VtE+L06&vAfN(48&J&tegSw1cU! z;7EZR;xY^&mqTmKRl#5J?!xR9Y>1gnt!s@Yra2s&b(dN>V{+U}*kI-H4!1io1tOB# xLTjT|@Rd~%>wzmTtu$__QmdQ{Xp@!X&MyY~p1o%Ypick*002ovPDHLkV1l^T`8ogq delta 2007 zcmV;|2PpXDEa@qbB!9blR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}rB_?B>nIHT zXBD#qgb;$|U>;SogIWGG20Mw9oRi#ZSB!#%Xu5?+O#AQOZvMgLC_3XsV@M%bTt4~a zGK^^FmG>uEzdzR(dl(P>=6vDM#b|kcjbZs8{bU~^QHCXVfq!CIFSf@Q$*=hF63ESl z2cluu6)3Gh?B)wv0rFgy4JqpV61FzmdaNYQj~NdiA7MXzSFl$F^RRP`i7lSY3jmJ~ z8_qBSp2R#H(PkFbz2^u9LSFH7UI~c$fa+g5J*aY8^t#_%)$(q+@P*`XwlDh)$>jx~ z^SJw&eO#7%?0;vqIuTviAD`Z9?E9LritGcZ4r@^-Yr}xwhAGC>(EwUN%zzwzhQRH(Mt4R@hL4(xaGR4G%Zwzq`}AbQt~Qy9(_$Td16t4ppxNn$^4>P|UvV=EBZcz<#QT+R)$0b?jPo^XRA)EB9; z6MWp)Yv{^QPzK9mizE=c%@CW=trGAqG{aHQ&OJz4R{&6isRdw&p#W4P77Aq5IVA#- z5dvjEckJB;1xUnIfOMWYK%3~s)EJ_)yE<{`Ht0t&gA#%rr_d&GhFIPU@<)9{4rO8S zA`(O;N`I0ZIQSqT1P!AoW@Yt8MT4qFO`0P|A0>vUF~$^ga*0tiC55CZrj&BVoEecb zMrSzWyt$1xzlqtxrd!<7mJ8CS_#!0~EwQAMtE*g5KWeC2V@)+TYDlH#o3zlh#gJfrQIgz0m1j8vpP+W%uNN6`S zvyr@aL%E@uO(=gX4j^S{R%s{(1$`qYoeu4cn~DzQ{z^Ba{y{hQr^=Zj-IvNe>-I{u zI*y^TD>irGAk{KE8FGr^iCSIX?5zVuS5g#b$eOG=EpmYx{C!TBMdX@L=+`Bg#0T4qoeF;!M5f zZ!L9LQc+^;G2&>=wc}l@w(gcvYCRsY{ULETY4P)bDlIegiJ`^RT{|7td(=;%G~Rx=WAATTvyP^A)Pq|Uz7=8Z_$4>~lK&6<$?uP}sPw9nD+L^X zP!xqvQ?(*h2Rn#3WT;LSM5Q=N6^me@v=v%)FnQ@8G-*guTpR`0f`dPcRRozmhk98Q>F%=a_C-#2duXO-tvzPaI+;Ng+Nbo-pWw z#E)E;U4G+SbXee-AtRHTCk_#d#SWG`n3W8bc!oHvs2b%9S(g>gTb$KOjkWH{Ul`15 zD`~FN8busSNFWIjGHNKJ0t*q^HBwBZ=sf1(A94Iia>?W>gOOtaRj800KlmSi{GP2@ zn4WTzf-#``#kN1jfWR)$tlReYv28a`0RJ;^rM3Ol1~B_cdcCcMkAT5#;NrTi$$P-% z4lw+rONQh~ep*7I0KA{kH|2n#TcB^vom=Z1rw>4eX0?0+92^4UMao|Hcz18--2Uxp z&F=@;v~tk25P`S=01X&vR9JMg#0G`}Br#<%I5uK5VJ$FWW??NfFl0C_IXE~tEi_{` zF*0OiWHDuCHj{1%sSP$aFgG|eF)%SXI59S}Bnnsovs(;c2o{*AlkWfk00v@9M??Vs z0RI60puMM)lhG6(e+CW#ISVkJJq!Q<0QyNpK~y-)tx_uv!axvx+mt4ls!9+9i2=nS z2#4rBklbU_12h!`RRb7O1qK`riK;+sn=EQzcG(34BWK^dyw3vvm`qAt}v5OzAoGEHJ(6VhHOe+7OM66iFZ8YIihRRh3c z*b|(PaQ$8RB50ciqhn_>002ovPDHLkV1mKww!8oU diff --git a/src/main/resources/data/portalcubed/advancements/achievements/adhesion_gel.json b/src/main/resources/data/portalcubed/advancements/achievements/adhesion_gel.json new file mode 100644 index 00000000..08c2b6ed --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/adhesion_gel.json @@ -0,0 +1,32 @@ +{ + "display": { + "icon": { + "item": "portalcubed:adhesion_gel" + }, + "title": { + "translate": "advancement.portalcubed.adhesion_gel.title" + }, + "description": { + "translate": "advancement.portalcubed.adhesion_gel.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "portalcubed:achievements/conversion_gel", + "criteria": { + "run": { + "trigger": "minecraft:enter_block", + "conditions": { + "block": "portalcubed:adhesion_gel", + "state": { + "up": "true" + } + } + } + }, + "rewards": { + "experience": 50 + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/auto_portal.json b/src/main/resources/data/portalcubed/advancements/achievements/auto_portal.json new file mode 100644 index 00000000..a3e9e866 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/auto_portal.json @@ -0,0 +1,32 @@ +{ + "display": { + "icon": { + "item": "portalcubed:auto_portal" + }, + "title": { + "translate": "advancement.portalcubed.autoportal.title" + }, + "description": { + "translate": "advancement.portalcubed.autoportal.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/root", + "criteria": { + "auto_portal": { + "trigger": "minecraft:placed_block", + "conditions": { + "location": [ + { + "condition": "minecraft:block_state_property", + "block": "portalcubed:auto_portal", + "properties": {} + } + ] + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/boots.json b/src/main/resources/data/portalcubed/advancements/achievements/boots.json new file mode 100644 index 00000000..2d2d6d91 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/boots.json @@ -0,0 +1,45 @@ +{ + "display": { + "icon": { + "item": "portalcubed:long_fall_boots" + }, + "title": { + "translate": "advancement.portalcubed.boots.title" + }, + "description": { + "translate": "advancement.portalcubed.boots.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/root", + "criteria": { + "boots": { + "trigger": "minecraft:fall_from_height", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "equipment": { + "feet": { + "items": [ + "portalcubed:long_fall_boots" + ] + } + } + } + } + ], + "distance": { + "y": { + "min": 4 + } + } + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/conversion_gel.json b/src/main/resources/data/portalcubed/advancements/achievements/conversion_gel.json new file mode 100644 index 00000000..15f98dd7 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/conversion_gel.json @@ -0,0 +1,51 @@ +{ + "display": { + "icon": { + "item": "portalcubed:conversion_gel" + }, + "title": { + "translate": "advancement.portalcubed.conversion_gel.title" + }, + "description": { + "translate": "advancement.portalcubed.conversion_gel.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/propulsion_gel", + "criteria": { + "conversion_gel": { + "trigger": "minecraft:tick", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "minecraft:player", + "type_specific": { + "type": "player", + "looking_at": { + "type": "portalcubed:portal", + "location": { + "block": { + "blocks": [ + "portalcubed:conversion_gel" + ] + } + } + } + }, + "nbt": "{SelectedItem:{id: \"portalcubed:portal_gun\"}}", + "equipment": { + "mainhand": {} + } + } + } + ] + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/crouch_fly.json b/src/main/resources/data/portalcubed/advancements/achievements/crouch_fly.json new file mode 100644 index 00000000..1fd38305 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/crouch_fly.json @@ -0,0 +1,35 @@ +{ + "display": { + "icon": { + "item": "portalcubed:excursion_funnel_emitter" + }, + "title": { + "translate": "advancement.portalcubed.crouch_fly.title" + }, + "description": { + "translate": "advancement.portalcubed.crouch_fly.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "portalcubed:achievements/funnel", + "criteria": { + "funnel": { + "trigger": "minecraft:tick", + "conditions": { + "player": [ + { + "condition": "portalcubed:funnel", + "in_funnel": false, + "in_cfg": true + } + ] + } + } + }, + "rewards": { + "experience": 50 + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/cubes.json b/src/main/resources/data/portalcubed/advancements/achievements/cubes.json new file mode 100644 index 00000000..98d259ff --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/cubes.json @@ -0,0 +1,65 @@ +{ + "display": { + "icon": { + "item": "portalcubed:companion_cube" + }, + "title": { + "translate": "advancement.portalcubed.cubes.title" + }, + "description": { + "translate": "advancement.portalcubed.cubes.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "parent": "portalcubed:achievements/radio", + "criteria": { + "cubes": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "portalcubed:portal_1_storage_cube" + ] + }, + { + "items": [ + "portalcubed:portal_1_companion_cube" + ] + }, + { + "items": [ + "portalcubed:storage_cube" + ] + }, + { + "items": [ + "portalcubed:companion_cube" + ] + }, + { + "items": [ + "portalcubed:redirection_cube" + ] + }, + { + "items": [ + "portalcubed:schrodinger_cube" + ] + }, + { + "items": [ + "portalcubed:old_ap_cube" + ] + } + ] + } + } + }, + "rewards": { + "experience": 25 + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/faith_plate.json b/src/main/resources/data/portalcubed/advancements/achievements/faith_plate.json new file mode 100644 index 00000000..3d7e803d --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/faith_plate.json @@ -0,0 +1,36 @@ +{ + "display": { + "icon": { + "item": "portalcubed:faith_plate" + }, + "title": { + "translate": "advancement.portalcubed.faith_plate.title" + }, + "description": { + "translate": "advancement.portalcubed.faith_plate.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/laser", + "criteria": { + "launch": { + "trigger": "portalcubed:fling", + "conditions": { + "force": { + "x": { + "min": 0 + }, + "y": { + "min": 0 + }, + "z": { + "min": 0 + } + } + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/falling_with_style.json b/src/main/resources/data/portalcubed/advancements/achievements/falling_with_style.json new file mode 100644 index 00000000..6edf0fad --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/falling_with_style.json @@ -0,0 +1,252 @@ +{ + "display": { + "icon": { + "item": "portalcubed:long_fall_boots", + "nbt": "{Trim:{pattern:tide,material:lapis}}" + }, + "title": { + "translate": "advancement.portalcubed.falling_with_style.title" + }, + "description": { + "translate": "advancement.portalcubed.falling_with_style.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "portalcubed:achievements/boots", + "criteria": { + "armor_trimmed_minecraft:coast_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:coast_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:dune_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:dune_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:eye_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:eye_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:host_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:host_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:raiser_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:raiser_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:rib_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:rib_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:sentry_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:sentry_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:shaper_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:shaper_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:silence_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:silence_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:snout_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:snout_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:spire_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:spire_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:tide_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:tide_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:vex_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:vex_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:ward_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:ward_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:wayfinder_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:wayfinder_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + }, + "armor_trimmed_minecraft:wild_armor_trim_smithing_template_smithing_trim": { + "trigger": "minecraft:recipe_crafted", + "conditions": { + "recipe_id": "minecraft:wild_armor_trim_smithing_template_smithing_trim", + "ingredients": [ + { + "items": [ + "portalcubed:long_fall_boots" + ] + } + ] + } + } + }, + "requirements": [ + [ + "armor_trimmed_minecraft:snout_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:raiser_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:dune_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:tide_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:silence_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:eye_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:spire_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:vex_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:shaper_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:wayfinder_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:coast_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:rib_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:host_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:ward_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:sentry_armor_trim_smithing_template_smithing_trim", + "armor_trimmed_minecraft:wild_armor_trim_smithing_template_smithing_trim" + ] + ], + "rewards": { + "experience": 100 + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/feather_falling_boots.json b/src/main/resources/data/portalcubed/advancements/achievements/feather_falling_boots.json new file mode 100644 index 00000000..26b99a2f --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/feather_falling_boots.json @@ -0,0 +1,45 @@ +{ + "display": { + "icon": { + "item": "portalcubed:long_fall_boots", + "nbt": "{Enchantments:[{id:feather_falling,lvl:4}]}" + }, + "title": { + "translate": "advancement.portalcubed.feather_falling_boots.title" + }, + "description": { + "translate": "advancement.portalcubed.feather_falling_boots.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "portalcubed:achievements/boots", + "criteria": { + "feather_falling": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "portalcubed:long_fall_boots" + ], + "enchantments": [ + { + "enchantment": "minecraft:feather_falling", + "levels": { + "min": 1, + "max": 4 + } + } + ] + } + ] + } + } + }, + "rewards": { + "experience": 25 + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/funnel.json b/src/main/resources/data/portalcubed/advancements/achievements/funnel.json new file mode 100644 index 00000000..91def56f --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/funnel.json @@ -0,0 +1,31 @@ +{ + "display": { + "icon": { + "item": "portalcubed:excursion_funnel_emitter" + }, + "title": { + "translate": "advancement.portalcubed.funnel.title" + }, + "description": { + "translate": "advancement.portalcubed.funnel.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/light_bridge", + "criteria": { + "funnel": { + "trigger": "minecraft:tick", + "conditions": { + "player": [ + { + "condition": "portalcubed:funnel", + "in_funnel": true + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/portalcubed/advancements/achievements/goo.json b/src/main/resources/data/portalcubed/advancements/achievements/goo.json new file mode 100644 index 00000000..3935403e --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/goo.json @@ -0,0 +1,26 @@ +{ + "display": { + "icon": { + "item": "portalcubed:toxic_goo_bucket" + }, + "title": { + "translate": "advancement.portalcubed.goo.title" + }, + "description": { + "translate": "advancement.portalcubed.goo.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "parent": "portalcubed:achievements/laser", + "criteria": { + "goo": { + "trigger": "minecraft:enter_block", + "conditions": { + "block": "portalcubed:toxic_goo" + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/hammer_time.json b/src/main/resources/data/portalcubed/advancements/achievements/hammer_time.json new file mode 100644 index 00000000..3cc8d1f3 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/hammer_time.json @@ -0,0 +1,41 @@ +{ + "display": { + "icon": { + "item": "portalcubed:hammer" + }, + "title": { + "translate": "advancement.portalcubed.hammer_time.title" + }, + "description": { + "translate": "advancement.portalcubed.hammer_time.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "parent": "portalcubed:achievements/root", + "criteria": { + "charge_respawn_anchor": { + "trigger": "minecraft:item_used_on_block", + "conditions": { + "location": [ + { + "condition": "minecraft:location_check", + "predicate": { + "block": { + "tag": "portalcubed:configurable_elements" + } + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "c:wrenches" + } + } + ] + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/hoopy.json b/src/main/resources/data/portalcubed/advancements/achievements/hoopy.json new file mode 100644 index 00000000..7464edd3 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/hoopy.json @@ -0,0 +1,32 @@ +{ + "display": { + "icon": { + "item": "portalcubed:hoopy" + }, + "title": { + "translate": "advancement.portalcubed.hoopy.title" + }, + "description": { + "translate": "advancement.portalcubed.hoopy.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/radio", + "criteria": { + "crafting_table": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "portalcubed:hoopy" + ] + } + ] + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/laser.json b/src/main/resources/data/portalcubed/advancements/achievements/laser.json new file mode 100644 index 00000000..a067cf68 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/laser.json @@ -0,0 +1,35 @@ +{ + "display": { + "icon": { + "item": "portalcubed:laser_emitter" + }, + "title": { + "translate": "advancement.portalcubed.laser.title" + }, + "description": { + "translate": "advancement.portalcubed.laser.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/pellet", + "criteria": { + "laser_damage": { + "trigger": "minecraft:entity_hurt_player", + "conditions": { + "damage": { + "type": { + "tags": [ + { + "id": "portalcubed:laser", + "expected": true + } + ] + } + } + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/light_bridge.json b/src/main/resources/data/portalcubed/advancements/achievements/light_bridge.json new file mode 100644 index 00000000..c7d56982 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/light_bridge.json @@ -0,0 +1,26 @@ +{ + "display": { + "icon": { + "item": "portalcubed:light_bridge_emitter" + }, + "title": { + "translate": "advancement.portalcubed.light_bridge.title" + }, + "description": { + "translate": "advancement.portalcubed.light_bridge.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/faith_plate", + "criteria": { + "light_bridge": { + "trigger": "minecraft:enter_block", + "conditions": { + "block": "portalcubed:light_bridge" + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/pellet.json b/src/main/resources/data/portalcubed/advancements/achievements/pellet.json new file mode 100644 index 00000000..6b4145a7 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/pellet.json @@ -0,0 +1,32 @@ +{ + "display": { + "icon": { + "item": "portalcubed:energy_pellet" + }, + "title": { + "translate": "advancement.portalcubed.pellet.title" + }, + "description": { + "translate": "advancement.portalcubed.pellet.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/auto_portal", + "criteria": { + "pellet": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "portalcubed:energy_pellet" + ] + } + ] + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/pellet_bounce.json b/src/main/resources/data/portalcubed/advancements/achievements/pellet_bounce.json new file mode 100644 index 00000000..f5d8b41d --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/pellet_bounce.json @@ -0,0 +1,37 @@ +{ + "display": { + "icon": { + "item": "portalcubed:super_pellet" + }, + "title": { + "translate": "advancement.portalcubed.pellet_bounce.title" + }, + "description": { + "translate": "advancement.portalcubed.pellet_bounce.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "portalcubed:achievements/pellet", + "criteria": { + "requirement": { + "trigger": "portalcubed:bounce", + "conditions": { + "pellet": { + "type_specific": { + "type": "portalcubed:energy_pellet", + "bounces": 35, + "starting_life": { + "min": 0 + } + } + } + } + } + }, + "rewards": { + "experience": 100 + } +} \ No newline at end of file diff --git a/src/main/resources/data/portalcubed/advancements/achievements/propulsion_gel.json b/src/main/resources/data/portalcubed/advancements/achievements/propulsion_gel.json new file mode 100644 index 00000000..29dc1323 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/propulsion_gel.json @@ -0,0 +1,26 @@ +{ + "display": { + "icon": { + "item": "portalcubed:propulsion_gel" + }, + "title": { + "translate": "advancement.portalcubed.propulsion_gel.title" + }, + "description": { + "translate": "advancement.portalcubed.propulsion_gel.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/repulsion_gel", + "criteria": { + "run": { + "trigger": "minecraft:enter_block", + "conditions": { + "block": "portalcubed:propulsion_gel" + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/radio.json b/src/main/resources/data/portalcubed/advancements/achievements/radio.json new file mode 100644 index 00000000..e8bb9eb4 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/radio.json @@ -0,0 +1,31 @@ +{ + "display": { + "icon": { + "item": "portalcubed:radio" + }, + "title": { + "translate": "advancement.portalcubed.radio.title" + }, + "description": { + "translate": "advancement.portalcubed.radio.description" + }, + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/root", + "criteria": { + "requirement": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "portalcubed:radio" + ] + } + ] + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/rainbow_autoportal.json b/src/main/resources/data/portalcubed/advancements/achievements/rainbow_autoportal.json new file mode 100644 index 00000000..c466abeb --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/rainbow_autoportal.json @@ -0,0 +1,179 @@ +{ + "display": { + "icon": { + "item": "portalcubed:auto_portal", + "nbt": "{Enchantments:[{id:infinity,lvl:1}]}" + }, + "title": { + "translate": "advancement.portalcubed.rainbow_autoportals.title" + }, + "description": { + "translate": "advancement.portalcubed.rainbow_autoportals.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "portalcubed:achievements/auto_portal", + "criteria": { + "red_autoportal": { + "trigger": "minecraft:item_used_on_block", + "conditions": { + "location": [ + { + "condition": "minecraft:location_check", + "predicate": { + "block": { + "blocks": [ + "portalcubed:auto_portal" + ] + } + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:red_dye", + "minecraft:pink_dye" + ] + } + } + ] + } + }, + "orange_autoportal": { + "trigger": "minecraft:item_used_on_block", + "conditions": { + "location": [ + { + "condition": "minecraft:location_check", + "predicate": { + "block": { + "blocks": [ + "portalcubed:auto_portal" + ] + } + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:orange_dye" + ] + } + } + ] + } + }, + "yellow_autoportal": { + "trigger": "minecraft:item_used_on_block", + "conditions": { + "location": [ + { + "condition": "minecraft:location_check", + "predicate": { + "block": { + "blocks": [ + "portalcubed:auto_portal" + ] + } + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:yellow_dye" + ] + } + } + ] + } + }, + "green_autoportal": { + "trigger": "minecraft:item_used_on_block", + "conditions": { + "location": [ + { + "condition": "minecraft:location_check", + "predicate": { + "block": { + "blocks": [ + "portalcubed:auto_portal" + ] + } + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:lime_dye", + "minecraft:green_dye" + ] + } + } + ] + } + }, + "blue_autoportal": { + "trigger": "minecraft:item_used_on_block", + "conditions": { + "location": [ + { + "condition": "minecraft:location_check", + "predicate": { + "block": { + "blocks": [ + "portalcubed:auto_portal" + ] + } + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:blue_dye", + "minecraft:cyan_dye", + "minecraft:light_blue_dye" + ] + } + } + ] + } + }, + "purple_autoportal": { + "trigger": "minecraft:item_used_on_block", + "conditions": { + "location": [ + { + "condition": "minecraft:location_check", + "predicate": { + "block": { + "blocks": [ + "portalcubed:auto_portal" + ] + } + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:purple_dye", + "minecraft:magenta_dye" + ] + } + } + ] + } + } + }, + "rewards": { + "experience": 100 + } +} \ No newline at end of file diff --git a/src/main/resources/data/portalcubed/advancements/achievements/rattmann.json b/src/main/resources/data/portalcubed/advancements/achievements/rattmann.json new file mode 100644 index 00000000..83576127 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/rattmann.json @@ -0,0 +1,65 @@ +{ + "display": { + "icon": { + "item": "portalcubed:beans" + }, + "title": { + "translate": "advancement.portalcubed.rattmann.title" + }, + "description": { + "translate": "advancement.portalcubed.rattmann.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "portalcubed:achievements/hoopy", + "criteria": { + "rattmann": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "portalcubed:beans" + ] + }, + { + "items": [ + "portalcubed:chair" + ] + }, + { + "items": [ + "portalcubed:computer" + ] + }, + { + "items": [ + "portalcubed:mug" + ] + }, + { + "items": [ + "portalcubed:jug" + ] + }, + { + "items": [ + "portalcubed:radio" + ] + }, + { + "items": [ + "portalcubed:hoopy" + ] + } + ] + } + } + }, + "rewards": { + "experience": 50 + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/repulsion_gel.json b/src/main/resources/data/portalcubed/advancements/achievements/repulsion_gel.json new file mode 100644 index 00000000..5de9a5ba --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/repulsion_gel.json @@ -0,0 +1,45 @@ +{ + "display": { + "icon": { + "item": "portalcubed:repulsion_gel" + }, + "title": { + "translate": "advancement.portalcubed.repulsion_gel.title" + }, + "description": { + "translate": "advancement.portalcubed.repulsion_gel.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "parent": "portalcubed:achievements/root", + "criteria": { + "gel": { + "trigger": "minecraft:fall_from_height", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "location": { + "block": { + "blocks": [ + "portalcubed:repulsion_gel" + ] + } + } + } + } + ], + "distance": { + "y": { + "min": 1 + } + } + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/root.json b/src/main/resources/data/portalcubed/advancements/achievements/root.json new file mode 100644 index 00000000..071d2f40 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/root.json @@ -0,0 +1,32 @@ +{ + "display": { + "icon": { + "item": "portalcubed:portal_gun" + }, + "title": { + "translate": "advancement.portalcubed.root.title" + }, + "description": { + "translate": "advancement.portalcubed.root.description" + }, + "background": "portalcubed:textures/block/white_half_panel.png", + "frame": "task", + "show_toast": true, + "announce_to_chat": false, + "hidden": false + }, + "criteria": { + "portal_gun": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "portalcubed:portal_gun" + ] + } + ] + } + } + } +} diff --git a/src/main/resources/data/portalcubed/advancements/achievements/space_core.json b/src/main/resources/data/portalcubed/advancements/achievements/space_core.json new file mode 100644 index 00000000..41ea4d65 --- /dev/null +++ b/src/main/resources/data/portalcubed/advancements/achievements/space_core.json @@ -0,0 +1,57 @@ +{ + "display": { + "icon": { + "item": "portalcubed:space_core" + }, + "title": { + "translate": "advancement.portalcubed.space_core.title" + }, + "description": { + "translate": "advancement.portalcubed.space_core.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "portalcubed:achievements/hoopy", + "criteria": { + "requirement": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "minecraft:player", + "type_specific": { + "type": "player", + "looking_at": { + "type": "portalcubed:space_core", + "location": { + "position": { + "y": { + "min": 500 + } + } + } + } + }, + "location": { + "position": { + "y": { + "min": 500 + } + } + } + } + } + ] + } + } + }, + "rewards": { + "experience": 100 + } +} diff --git a/src/main/resources/data/portalcubed/recipes/redirection_cube_crafting.json b/src/main/resources/data/portalcubed/recipes/redirection_cube_crafting.json index deb83f75..0585edee 100644 --- a/src/main/resources/data/portalcubed/recipes/redirection_cube_crafting.json +++ b/src/main/resources/data/portalcubed/recipes/redirection_cube_crafting.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "pattern": [ "YXY", - "XXX", + "ZXX", "YXY" ], "key": { @@ -11,6 +11,9 @@ }, "X": { "tag": "c:glass_blocks" + }, + "Z": { + "tag": "c:glass_panes" } }, "result": { diff --git a/src/main/resources/data/portalcubed/tags/blocks/configurable_elements.json b/src/main/resources/data/portalcubed/tags/blocks/configurable_elements.json new file mode 100644 index 00000000..609e7131 --- /dev/null +++ b/src/main/resources/data/portalcubed/tags/blocks/configurable_elements.json @@ -0,0 +1,15 @@ +{ + "replace": false, + "values" : [ + "portalcubed:excursion_funnel_emitter", + "portalcubed:faith_plate", + "portalcubed:beta_faith_plate", + "portalcubed:light_bridge_emitter", + "portalcubed:laser_emitter", + "portalcubed:laser_catcher", + "portalcubed:laser_relay", + "portalcubed:pedestal_button", + "portalcubed:old_ap_pedestal_button", + "portalcubed:auto_portal" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/portalcubed/tags/damage_type/laser.json b/src/main/resources/data/portalcubed/tags/damage_type/laser.json new file mode 100644 index 00000000..54f120c3 --- /dev/null +++ b/src/main/resources/data/portalcubed/tags/damage_type/laser.json @@ -0,0 +1,5 @@ +{ + "values": [ + "portalcubed:laser" + ] +} \ No newline at end of file diff --git a/src/main/resources/tooltips.json b/src/main/resources/tooltips.json index d59829d9..68487379 100644 --- a/src/main/resources/tooltips.json +++ b/src/main/resources/tooltips.json @@ -27,16 +27,20 @@ "color": "gray" }, { - "translate": "tooltip.portalcubed.empty", + "translate": "tooltip.portalcubed.hammer.2", "color": "gray" }, { - "translate": "tooltip.portalcubed.hammer.2", + "translate": "tooltip.portalcubed.empty", "color": "gray" }, { "translate": "tooltip.portalcubed.hammer.3", "color": "gray" + }, + { + "translate": "tooltip.portalcubed.hammer.4", + "color": "gray" } ], "schrodinger_cube": [ From 25d5582ed58dba38059bf6adf4546d46bacc16d1 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 19:05:15 -0500 Subject: [PATCH 25/26] Actually reset launcher --- .../java/com/fusionflux/portalcubed/mixin/EntityMixin.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java b/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java index 4fc2740e..a698ba05 100644 --- a/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java +++ b/src/main/java/com/fusionflux/portalcubed/mixin/EntityMixin.java @@ -21,6 +21,7 @@ import com.fusionflux.portalcubed.listeners.WentThroughPortalListener; import com.fusionflux.portalcubed.mechanics.CrossPortalInteraction; import com.fusionflux.portalcubed.util.GeneralUtil; +import com.fusionflux.portalcubed.util.PortalCubedComponents; import com.fusionflux.portalcubed.util.PortalDirectionUtils; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; @@ -681,4 +682,9 @@ private void tickVelocityHelper(CallbackInfo ci) { Mth.lerp(useProgress, velocityHelper.getBlockPos().getZ() + 0.5, velocityHelper.getDestination().getZ() + 0.5) ).subtract(position()).subtract(velocityHelperOffset)); } + + @Inject(method = "resetFallDistance", at = @At("HEAD")) + private void resetLauncher(CallbackInfo ci) { + PortalCubedComponents.ENTITY_COMPONENT.get(this).setLauncher(null); + } } From fe3c68eb02f16940c1039c3116668e0711895339 Mon Sep 17 00:00:00 2001 From: "Josiah (Gaming32) Glosson" Date: Fri, 21 Jul 2023 19:13:44 -0500 Subject: [PATCH 26/26] Add `distance` to LauncherCondition --- .../conditions/LauncherCondition.java | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/fusionflux/portalcubed/advancements/conditions/LauncherCondition.java b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/LauncherCondition.java index a42508ce..96a2846c 100644 --- a/src/main/java/com/fusionflux/portalcubed/advancements/conditions/LauncherCondition.java +++ b/src/main/java/com/fusionflux/portalcubed/advancements/conditions/LauncherCondition.java @@ -5,6 +5,7 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; +import net.minecraft.advancements.critereon.DistancePredicate; import net.minecraft.advancements.critereon.LocationPredicate; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -20,9 +21,11 @@ public class LauncherCondition implements LootItemCondition { private final LocationPredicate location; + private final DistancePredicate distance; - public LauncherCondition(LocationPredicate location) { + public LauncherCondition(LocationPredicate location, DistancePredicate distance) { this.location = location; + this.distance = distance; } @NotNull @@ -39,16 +42,20 @@ public Set> getReferencedContextParams() { @Override public boolean test(LootContext lootContext) { - if (location != LocationPredicate.ANY) { - final Entity thisEntity = lootContext.getParam(LootContextParams.THIS_ENTITY); - final BlockPos launcher = PortalCubedComponents.ENTITY_COMPONENT.get(thisEntity).getLauncher(); - if (launcher == null) { - return false; - } - //noinspection RedundantIfStatement - if (!location.matches((ServerLevel)thisEntity.level(), launcher.getX() + 0.5, launcher.getY() + 0.5, launcher.getZ() + 0.5)) { - return false; - } + final Entity thisEntity = lootContext.getParam(LootContextParams.THIS_ENTITY); + final BlockPos launcher = PortalCubedComponents.ENTITY_COMPONENT.get(thisEntity).getLauncher(); + if (launcher == null) { + return false; + } + if (!location.matches((ServerLevel)thisEntity.level(), launcher.getX() + 0.5, launcher.getY() + 0.5, launcher.getZ() + 0.5)) { + return false; + } + //noinspection RedundantIfStatement + if (!distance.matches( + thisEntity.getX(), thisEntity.getY(), thisEntity.getZ(), + launcher.getX() + 0.5, launcher.getY() + 0.5, launcher.getZ() + 0.5 + )) { + return false; } return true; } @@ -59,13 +66,17 @@ public void serialize(JsonObject json, LauncherCondition value, JsonSerializatio if (value.location != LocationPredicate.ANY) { json.add("location", value.location.serializeToJson()); } + if (value.distance != DistancePredicate.ANY) { + json.add("distance", value.distance.serializeToJson()); + } } @NotNull @Override public LauncherCondition deserialize(JsonObject json, JsonDeserializationContext serializationContext) { return new LauncherCondition( - LocationPredicate.fromJson(json.get("location")) + LocationPredicate.fromJson(json.get("location")), + DistancePredicate.fromJson(json.get("distance")) ); } }