From c619be807d64b839decbedcbbfbd74ead2896bfd Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 28 Oct 2023 22:04:50 +0100 Subject: [PATCH 01/90] Fix error ticking sprout blocks --- .../minelittlepony/unicopia/block/SproutBlock.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/block/SproutBlock.java b/src/main/java/com/minelittlepony/unicopia/block/SproutBlock.java index ab2eebcf..a6c44d36 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/SproutBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/SproutBlock.java @@ -54,13 +54,19 @@ public class SproutBlock extends CropBlock implements TintedBlock { @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { super.randomTick(state, world, pos, random); - onGrow(world, world.getBlockState(pos), pos); + state = world.getBlockState(pos); + if (state.isOf(this)) { + onGrow(world, state, pos); + } } @Override public void applyGrowth(World world, BlockPos pos, BlockState state) { super.applyGrowth(world, pos, state); - onGrow(world, world.getBlockState(pos), pos); + state = world.getBlockState(pos); + if (state.isOf(this)) { + onGrow(world, world.getBlockState(pos), pos); + } } @Override @@ -81,7 +87,7 @@ public class SproutBlock extends CropBlock implements TintedBlock { protected void mature(World world, BlockState state, BlockPos pos) { state = matureState.get(); - world.setBlockState(pos, matureState.get()); + world.setBlockState(pos, state); BlockSoundGroup group = state.getSoundGroup(); world.playSound(null, pos, group.getPlaceSound(), SoundCategory.BLOCKS, group.getVolume(), group.getPitch()); } From c0a88dacd2e4e9b8bbbc476e28335eceda4c4445 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 28 Oct 2023 23:18:32 +0100 Subject: [PATCH 02/90] Fixed the recipe for the inferno spell --- src/main/resources/data/unicopia/recipes/spells/infernal.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/data/unicopia/recipes/spells/infernal.json b/src/main/resources/data/unicopia/recipes/spells/infernal.json index 6fd8f130..9f2c8995 100644 --- a/src/main/resources/data/unicopia/recipes/spells/infernal.json +++ b/src/main/resources/data/unicopia/recipes/spells/infernal.json @@ -2,7 +2,7 @@ "type": "unicopia:spellbook/crafting", "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { - "fire": 50, "dark": 10 + "fire": 50, "darkness": 10 }, "ingredients": [ { "item": "unicopia:gemstone", "spell": "unicopia:flame" } From 61c8ae8927c307b30711c44b21dbc45a10f5d02e Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 30 Oct 2023 22:00:19 +0000 Subject: [PATCH 03/90] Catch exceptions when tearing down block entities --- .../unicopia/entity/behaviour/EntityAppearance.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java index 50085cf0..edad3ecb 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java @@ -127,7 +127,9 @@ public class EntityAppearance implements NbtSerialisable, PlayerDimensions.Provi entity = null; } if (blockEntity != null) { - blockEntity.markRemoved(); + try { + blockEntity.markRemoved(); + } catch (Throwable ignored) {} blockEntity = null; } } From ff6d24e25f4dc0e8d5a08f65a2c00bd8983e0d1a Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 31 Oct 2023 16:45:41 +0000 Subject: [PATCH 04/90] Added cloud bricks, carved cloud, and orange cloud bed --- .../unicopia/block/UBlockEntities.java | 2 +- .../unicopia/block/UBlocks.java | 31 +- .../unicopia/block/cloud/CloudBedBlock.java | 4 +- .../block/cloud/OrientedCloudBlock.java | 42 +++ .../unicopia/client/URenderers.java | 185 ++++++------ .../render/AccessoryFeatureRenderer.java | 6 +- .../client/render/PolearmRenderer.java | 22 +- .../entity/CloudBedBlockEntityRenderer.java | 9 +- .../minelittlepony/unicopia/item/UItems.java | 3 +- .../unicopia/blockstates/carved_cloud.json | 10 + .../unicopia/blockstates/cloud_bed.json | 5 - .../blockstates/cloud_brick_slab.json | 7 + ...ks_stairs.json => cloud_brick_stairs.json} | 80 +++--- .../unicopia/blockstates/cloud_bricks.json | 5 + .../blockstates/cloud_plank_slab.json | 7 + .../blockstates/cloud_plank_stairs.json | 209 ++++++++++++++ .../blockstates/cloud_planks_slab.json | 7 - .../blockstates/compacted_cloud_bricks.json | 268 ++++++++++++++++++ .../blockstates/orange_cloud_bed.json | 5 + .../unicopia/blockstates/white_cloud_bed.json | 5 + .../resources/assets/unicopia/lang/en_us.json | 9 +- .../unicopia/models/block/carved_cloud.json | 8 + .../models/block/cloud_brick_slab.json | 8 + .../models/block/cloud_brick_slab_top.json | 8 + .../models/block/cloud_brick_stairs.json | 8 + .../block/cloud_brick_stairs_inner.json | 8 + .../block/cloud_brick_stairs_outer.json | 8 + .../unicopia/models/block/cloud_bricks.json | 6 + ...planks_slab.json => cloud_plank_slab.json} | 0 ...lab_top.json => cloud_plank_slab_top.json} | 0 ...ks_stairs.json => cloud_plank_stairs.json} | 0 ...ner.json => cloud_plank_stairs_inner.json} | 0 ...ter.json => cloud_plank_stairs_outer.json} | 0 .../flattened_cloud_bricks_corner_full.json | 6 + .../flattened_cloud_bricks_corner_x.json | 6 + .../flattened_cloud_bricks_corner_xy.json | 6 + .../flattened_cloud_bricks_corner_xyz.json | 6 + .../flattened_cloud_bricks_corner_xz.json | 6 + .../flattened_cloud_bricks_corner_y.json | 6 + .../flattened_cloud_bricks_corner_yz.json | 6 + .../flattened_cloud_bricks_corner_z.json | 6 + .../{cloud_bed.json => orange_cloud_bed.json} | 0 .../models/block/white_cloud_bed.json | 5 + .../unicopia/models/item/carved_cloud.json | 3 + .../models/item/cloud_brick_slab.json | 3 + .../models/item/cloud_brick_stairs.json | 3 + .../unicopia/models/item/cloud_bricks.json | 3 + .../models/item/cloud_plank_slab.json | 3 + .../models/item/cloud_plank_stairs.json | 3 + .../models/item/cloud_planks_slab.json | 3 - .../models/item/cloud_planks_stairs.json | 3 - .../models/item/orange_cloud_bed.json | 6 + .../{cloud_bed.json => white_cloud_bed.json} | 0 .../unicopia/textures/block/carved_cloud.png | Bin 0 -> 5784 bytes .../textures/block/carved_cloud_bottom.png | Bin 0 -> 5629 bytes .../textures/block/carved_cloud_top.png | Bin 0 -> 7618 bytes .../unicopia/textures/block/cloud_bricks.png | Bin 0 -> 5839 bytes .../textures/block/cloud_pillar_side.png | Bin 7633 -> 7822 bytes .../textures/block/cloud_pillar_top.png | Bin 7090 -> 7298 bytes .../unicopia/textures/block/cloud_planks.png | Bin 5178 -> 5548 bytes .../recipes/blocks/cloud_brick_slab.json | 30 ++ .../recipes/blocks/cloud_brick_stairs.json | 30 ++ ...planks_slab.json => cloud_brick_slab.json} | 4 +- ...ks_stairs.json => cloud_brick_stairs.json} | 2 +- .../loot_tables/blocks/cloud_bricks.json | 20 ++ .../loot_tables/blocks/cloud_plank_slab.json | 36 +++ .../blocks/cloud_plank_stairs.json | 20 ++ .../loot_tables/blocks/orange_cloud_bed.json | 29 ++ .../{cloud_bed.json => white_cloud_bed.json} | 4 +- .../recipes/blocks/cloud_brick_slab.json | 12 + .../recipes/blocks/cloud_brick_stairs.json | 14 + .../recipes/blocks/cloud_plank_slab.json | 2 +- .../recipes/blocks/cloud_plank_stairs.json | 2 +- 73 files changed, 1075 insertions(+), 188 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/block/cloud/OrientedCloudBlock.java create mode 100644 src/main/resources/assets/unicopia/blockstates/carved_cloud.json delete mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_bed.json create mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_brick_slab.json rename src/main/resources/assets/unicopia/blockstates/{cloud_planks_stairs.json => cloud_brick_stairs.json} (62%) create mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_bricks.json create mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_plank_slab.json create mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_plank_stairs.json delete mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_planks_slab.json create mode 100644 src/main/resources/assets/unicopia/blockstates/compacted_cloud_bricks.json create mode 100644 src/main/resources/assets/unicopia/blockstates/orange_cloud_bed.json create mode 100644 src/main/resources/assets/unicopia/blockstates/white_cloud_bed.json create mode 100644 src/main/resources/assets/unicopia/models/block/carved_cloud.json create mode 100644 src/main/resources/assets/unicopia/models/block/cloud_brick_slab.json create mode 100644 src/main/resources/assets/unicopia/models/block/cloud_brick_slab_top.json create mode 100644 src/main/resources/assets/unicopia/models/block/cloud_brick_stairs.json create mode 100644 src/main/resources/assets/unicopia/models/block/cloud_brick_stairs_inner.json create mode 100644 src/main/resources/assets/unicopia/models/block/cloud_brick_stairs_outer.json create mode 100644 src/main/resources/assets/unicopia/models/block/cloud_bricks.json rename src/main/resources/assets/unicopia/models/block/{cloud_planks_slab.json => cloud_plank_slab.json} (100%) rename src/main/resources/assets/unicopia/models/block/{cloud_planks_slab_top.json => cloud_plank_slab_top.json} (100%) rename src/main/resources/assets/unicopia/models/block/{cloud_planks_stairs.json => cloud_plank_stairs.json} (100%) rename src/main/resources/assets/unicopia/models/block/{cloud_planks_stairs_inner.json => cloud_plank_stairs_inner.json} (100%) rename src/main/resources/assets/unicopia/models/block/{cloud_planks_stairs_outer.json => cloud_plank_stairs_outer.json} (100%) create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_cloud_bricks_corner_full.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_cloud_bricks_corner_x.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_cloud_bricks_corner_xy.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_cloud_bricks_corner_xyz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_cloud_bricks_corner_xz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_cloud_bricks_corner_y.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_cloud_bricks_corner_yz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_cloud_bricks_corner_z.json rename src/main/resources/assets/unicopia/models/block/{cloud_bed.json => orange_cloud_bed.json} (100%) create mode 100644 src/main/resources/assets/unicopia/models/block/white_cloud_bed.json create mode 100644 src/main/resources/assets/unicopia/models/item/carved_cloud.json create mode 100644 src/main/resources/assets/unicopia/models/item/cloud_brick_slab.json create mode 100644 src/main/resources/assets/unicopia/models/item/cloud_brick_stairs.json create mode 100644 src/main/resources/assets/unicopia/models/item/cloud_bricks.json create mode 100644 src/main/resources/assets/unicopia/models/item/cloud_plank_slab.json create mode 100644 src/main/resources/assets/unicopia/models/item/cloud_plank_stairs.json delete mode 100644 src/main/resources/assets/unicopia/models/item/cloud_planks_slab.json delete mode 100644 src/main/resources/assets/unicopia/models/item/cloud_planks_stairs.json create mode 100644 src/main/resources/assets/unicopia/models/item/orange_cloud_bed.json rename src/main/resources/assets/unicopia/models/item/{cloud_bed.json => white_cloud_bed.json} (100%) create mode 100644 src/main/resources/assets/unicopia/textures/block/carved_cloud.png create mode 100644 src/main/resources/assets/unicopia/textures/block/carved_cloud_bottom.png create mode 100644 src/main/resources/assets/unicopia/textures/block/carved_cloud_top.png create mode 100644 src/main/resources/assets/unicopia/textures/block/cloud_bricks.png create mode 100644 src/main/resources/data/unicopia/advancements/recipes/blocks/cloud_brick_slab.json create mode 100644 src/main/resources/data/unicopia/advancements/recipes/blocks/cloud_brick_stairs.json rename src/main/resources/data/unicopia/loot_tables/blocks/{cloud_planks_slab.json => cloud_brick_slab.json} (86%) rename src/main/resources/data/unicopia/loot_tables/blocks/{cloud_planks_stairs.json => cloud_brick_stairs.json} (85%) create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/cloud_bricks.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/cloud_plank_slab.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/cloud_plank_stairs.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/orange_cloud_bed.json rename src/main/resources/data/unicopia/loot_tables/blocks/{cloud_bed.json => white_cloud_bed.json} (83%) create mode 100644 src/main/resources/data/unicopia/recipes/blocks/cloud_brick_slab.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/cloud_brick_stairs.json diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java b/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java index d525d275..0cee11db 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java @@ -10,7 +10,7 @@ import net.minecraft.registry.Registries; public interface UBlockEntities { BlockEntityType WEATHER_VANE = create("weather_vane", BlockEntityType.Builder.create(WeatherVaneBlock.WeatherVane::new, UBlocks.WEATHER_VANE)); - BlockEntityType CLOUD_BED = create("cloud_bed", BlockEntityType.Builder.create(CloudBedBlock.Tile::new, UBlocks.CLOUD_BED)); + BlockEntityType CLOUD_BED = create("cloud_bed", BlockEntityType.Builder.create(CloudBedBlock.Tile::new, UBlocks.WHITE_CLOUD_BED, UBlocks.ORANGE_CLOUD_BED)); static BlockEntityType create(String id, Builder builder) { return Registry.register(Registries.BLOCK_ENTITY_TYPE, id, builder.build(null)); diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 453889d2..11a76134 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.block.cloud.CloudSlabBlock; import com.minelittlepony.unicopia.block.cloud.CloudStairsBlock; import com.minelittlepony.unicopia.block.cloud.CompactedCloudBlock; import com.minelittlepony.unicopia.block.cloud.NaturalCloudBlock; +import com.minelittlepony.unicopia.block.cloud.OrientedCloudBlock; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; import com.minelittlepony.unicopia.block.cloud.CloudBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudBlock; @@ -29,6 +30,7 @@ import net.minecraft.block.enums.Instrument; import net.minecraft.block.piston.PistonBehavior; import net.minecraft.item.*; import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; import net.minecraft.util.math.Direction; import net.minecraft.util.shape.VoxelShapes; @@ -144,24 +146,37 @@ public interface UBlocks { Block CLOUD = register("cloud", new NaturalCloudBlock(Settings.create().mapColor(MapColor.OFF_WHITE).hardness(0.3F).resistance(0).sounds(BlockSoundGroup.WOOL), true, () -> UBlocks.SOGGY_CLOUD, () -> UBlocks.COMPACTED_CLOUD), ItemGroups.NATURAL); + Block COMPACTED_CLOUD = register("compacted_cloud", new CompactedCloudBlock(Settings.copy(CLOUD))); Block CLOUD_SLAB = register("cloud_slab", new CloudSlabBlock(Settings.copy(CLOUD), true, () -> UBlocks.SOGGY_CLOUD_SLAB), ItemGroups.NATURAL); Block CLOUD_STAIRS = register("cloud_stairs", new CloudStairsBlock(CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.SOGGY_CLOUD_STAIRS), ItemGroups.NATURAL); - Block COMPACTED_CLOUD = register("compacted_cloud", new CompactedCloudBlock(Settings.copy(CLOUD))); - Block CLOUD_PLANKS = register("cloud_planks", new NaturalCloudBlock(Settings.copy(CLOUD).requiresTool(), false, + + Block CLOUD_PLANKS = register("cloud_planks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool(), false, null, () -> UBlocks.COMPACTED_CLOUD_PLANKS), ItemGroups.BUILDING_BLOCKS); - Block CLOUD_PLANKS_SLAB = register("cloud_planks_slab", new CloudSlabBlock(Settings.copy(CLOUD_PLANKS), false, null), ItemGroups.BUILDING_BLOCKS); - Block CLOUD_PLANKS_STAIRS = register("cloud_planks_stairs", new CloudStairsBlock(CLOUD_PLANKS.getDefaultState(), Settings.copy(CLOUD_PLANKS), null), ItemGroups.BUILDING_BLOCKS); Block COMPACTED_CLOUD_PLANKS = register("compacted_cloud_planks", new CompactedCloudBlock(Settings.copy(CLOUD_PLANKS))); - Block UNSTABLE_CLOUD = register("unstable_cloud", new UnstableCloudBlock(Settings.copy(CLOUD)), ItemGroups.NATURAL); - SoggyCloudBlock SOGGY_CLOUD = register("soggy_cloud", new SoggyCloudBlock(Settings.copy(CLOUD), () -> UBlocks.CLOUD)); - SoggyCloudSlabBlock SOGGY_CLOUD_SLAB = register("soggy_cloud_slab", new SoggyCloudSlabBlock(Settings.copy(CLOUD), () -> UBlocks.CLOUD_SLAB)); + Block CLOUD_PLANK_SLAB = register("cloud_plank_slab", new CloudSlabBlock(Settings.copy(CLOUD_PLANKS), false, null), ItemGroups.BUILDING_BLOCKS); + Block CLOUD_PLANK_STAIRS = register("cloud_plank_stairs", new CloudStairsBlock(CLOUD_PLANKS.getDefaultState(), Settings.copy(CLOUD_PLANKS), null), ItemGroups.BUILDING_BLOCKS); + + Block CLOUD_BRICKS = register("cloud_bricks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.6F).requiresTool(), false, + null, + () -> UBlocks.COMPACTED_CLOUD_BRICKS), ItemGroups.BUILDING_BLOCKS); + Block COMPACTED_CLOUD_BRICKS = register("compacted_cloud_bricks", new CompactedCloudBlock(Settings.copy(CLOUD_BRICKS))); + Block CLOUD_BRICK_SLAB = register("cloud_brick_slab", new CloudSlabBlock(Settings.copy(CLOUD_BRICKS), false, null), ItemGroups.BUILDING_BLOCKS); + Block CLOUD_BRICK_STAIRS = register("cloud_brick_stairs", new CloudStairsBlock(CLOUD_BRICKS.getDefaultState(), Settings.copy(CLOUD_PLANKS), null), ItemGroups.BUILDING_BLOCKS); + + SoggyCloudBlock SOGGY_CLOUD = register("soggy_cloud", new SoggyCloudBlock(Settings.copy(CLOUD).hardness(0.7F), () -> UBlocks.CLOUD)); + SoggyCloudSlabBlock SOGGY_CLOUD_SLAB = register("soggy_cloud_slab", new SoggyCloudSlabBlock(Settings.copy(SOGGY_CLOUD), () -> UBlocks.CLOUD_SLAB)); CloudStairsBlock SOGGY_CLOUD_STAIRS = register("soggy_cloud_stairs", new CloudStairsBlock(SOGGY_CLOUD.getDefaultState(), Settings.copy(CLOUD), null)); + Block DENSE_CLOUD = register("dense_cloud", new CloudBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL), false), ItemGroups.NATURAL); Block DENSE_CLOUD_SLAB = register("dense_cloud_slab", new CloudSlabBlock(Settings.copy(DENSE_CLOUD), false, null), ItemGroups.NATURAL); Block DENSE_CLOUD_STAIRS = register("dense_cloud_stairs", new CloudStairsBlock(DENSE_CLOUD.getDefaultState(), Settings.copy(DENSE_CLOUD), null), ItemGroups.NATURAL); + + Block CARVED_CLOUD = register("carved_cloud", new OrientedCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool(), false), ItemGroups.BUILDING_BLOCKS); + Block UNSTABLE_CLOUD = register("unstable_cloud", new UnstableCloudBlock(Settings.copy(CLOUD)), ItemGroups.NATURAL); Block CLOUD_PILLAR = register("cloud_pillar", new CloudPillarBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL)), ItemGroups.NATURAL); - Block CLOUD_BED = register("cloud_bed", new CloudBedBlock(CLOUD.getDefaultState(), Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); + Block WHITE_CLOUD_BED = register("white_cloud_bed", new CloudBedBlock(DyeColor.WHITE, CLOUD.getDefaultState(), Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); + Block ORANGE_CLOUD_BED = register("orange_cloud_bed", new CloudBedBlock(DyeColor.ORANGE, CLOUD.getDefaultState(), Settings.copy(Blocks.ORANGE_BED).sounds(BlockSoundGroup.WOOL))); private static T register(String name, T item) { return register(Unicopia.id(name), item); diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java index 33794c02..4745e66b 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java @@ -29,8 +29,8 @@ public class CloudBedBlock extends BedBlock { private final BlockState baseState; private final CloudBlock baseBlock; - public CloudBedBlock(BlockState baseState, Settings settings) { - super(DyeColor.WHITE, settings); + public CloudBedBlock(DyeColor color, BlockState baseState, Settings settings) { + super(color, settings); this.baseState = baseState; this.baseBlock = (CloudBlock)baseState.getBlock(); } diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/OrientedCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/OrientedCloudBlock.java new file mode 100644 index 00000000..2d3886db --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/OrientedCloudBlock.java @@ -0,0 +1,42 @@ +package com.minelittlepony.unicopia.block.cloud; + +import com.minelittlepony.unicopia.EquineContext; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; +import net.minecraft.util.math.Direction; + +public class OrientedCloudBlock extends CloudBlock { + public static final DirectionProperty FACING = Properties.FACING; + + public OrientedCloudBlock(Settings settings, boolean meltable) { + super(settings, meltable); + this.setDefaultState(getDefaultState().with(FACING, Direction.UP)); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState rotate(BlockState state, BlockRotation rotation) { + return state.with(FACING, rotation.rotate(state.get(FACING))); + } + + @Override + public BlockState mirror(BlockState state, BlockMirror mirror) { + return state.rotate(mirror.getRotation(state.get(FACING))); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx, EquineContext equineContext) { + return getDefaultState().with(FACING, ctx.getSide().getOpposite()); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index 4e3cd4f1..4bf43bca 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia.client; +import org.jetbrains.annotations.Nullable; + import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.block.*; import com.minelittlepony.unicopia.client.particle.ChangelingMagicParticle; @@ -30,9 +32,10 @@ import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry.PendingParticleFactory; import net.fabricmc.fabric.api.client.rendering.v1.*; +import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry.DynamicItemRenderer; import net.minecraft.block.Block; +import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.world.BiomeColors; import net.minecraft.client.color.world.FoliageColors; import net.minecraft.client.item.ModelPredicateProviderRegistry; @@ -43,11 +46,14 @@ import net.minecraft.client.render.block.entity.BlockEntityRendererFactories; import net.minecraft.client.render.entity.FlyingItemEntityRenderer; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.json.ModelTransformationMode; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.world.ClientWorld; import net.minecraft.fluid.Fluids; import net.minecraft.item.*; import net.minecraft.particle.ParticleEffect; import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockRenderView; public interface URenderers { static void bootstrap() { @@ -65,14 +71,11 @@ public interface URenderers { ParticleFactoryRegistry.getInstance().register(UParticles.CLOUDS_ESCAPING, CloudsEscapingParticle::new); ParticleFactoryRegistry.getInstance().register(UParticles.LIGHTNING_BOLT, LightningBoltParticle::new); - AccessoryFeatureRenderer.register(BraceletFeatureRenderer::new); - AccessoryFeatureRenderer.register(AmuletFeatureRenderer::new); - AccessoryFeatureRenderer.register(WingsFeatureRenderer::new); - AccessoryFeatureRenderer.register(HornFeatureRenderer::new); - AccessoryFeatureRenderer.register(IcarusWingsFeatureRenderer::new); - AccessoryFeatureRenderer.register(BatWingsFeatureRenderer::new); - AccessoryFeatureRenderer.register(GlassesFeatureRenderer::new); - AccessoryFeatureRenderer.register(HeldEntityFeatureRenderer::new); + AccessoryFeatureRenderer.register( + BraceletFeatureRenderer::new, AmuletFeatureRenderer::new, GlassesFeatureRenderer::new, + WingsFeatureRenderer::new, HornFeatureRenderer::new, IcarusWingsFeatureRenderer::new, BatWingsFeatureRenderer::new, + HeldEntityFeatureRenderer::new + ); EntityRendererRegistry.register(UEntities.THROWN_ITEM, FlyingItemEntityRenderer::new); EntityRendererRegistry.register(UEntities.MUFFIN, FlyingItemEntityRenderer::new); @@ -91,94 +94,17 @@ public interface URenderers { BlockEntityRendererFactories.register(UBlockEntities.WEATHER_VANE, WeatherVaneBlockEntityRenderer::new); BlockEntityRendererFactories.register(UBlockEntities.CLOUD_BED, CloudBedBlockEntityRenderer::new); + register(URenderers::renderJarItem, UItems.FILLED_JAR); + register(URenderers::renderBedItem, UItems.WHITE_CLOUD_BED, UItems.ORANGE_CLOUD_BED); + PolearmRenderer.register(UItems.WOODEN_POLEARM, UItems.STONE_POLEARM, UItems.IRON_POLEARM, UItems.GOLDEN_POLEARM, UItems.DIAMOND_POLEARM, UItems.NETHERITE_POLEARM); + ModelPredicateProviderRegistry.register(UItems.GEMSTONE, new Identifier("affinity"), (stack, world, entity, seed) -> EnchantableItem.isEnchanted(stack) ? EnchantableItem.getSpellKey(stack).getAffinity().getAlignment() : 0); + ModelPredicateProviderRegistry.register(UItems.ROCK_CANDY, new Identifier("count"), (stack, world, entity, seed) -> stack.getCount() / (float)stack.getMaxCount()); + + ColorProviderRegistry.BLOCK.register(URenderers::getTintedBlockColor, TintedBlock.REGISTRY.stream().toArray(Block[]::new)); + ColorProviderRegistry.ITEM.register((stack, i) -> getTintedBlockColor(Block.getBlockFromItem(stack.getItem()).getDefaultState(), null, null, i), TintedBlock.REGISTRY.stream().map(Block::asItem).filter(i -> i != Items.AIR).toArray(Item[]::new)); ColorProviderRegistry.ITEM.register((stack, i) -> i > 0 ? -1 : ((DyeableItem)stack.getItem()).getColor(stack), UItems.FRIENDSHIP_BRACELET); - BuiltinItemRendererRegistry.INSTANCE.register(UItems.FILLED_JAR, (stack, mode, matrices, vertices, light, overlay) -> { - - ItemRenderer renderer = MinecraftClient.getInstance().getItemRenderer(); - - ChameleonItem item = (ChameleonItem)stack.getItem(); - - // Reset stuff done in the beforelands - matrices.pop(); - - if (mode == ModelTransformationMode.GUI) { - DiffuseLighting.disableGuiDepthLighting(); - } - - VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); - ClientWorld world = MinecraftClient.getInstance().world; - - if (item.hasAppearance(stack)) { - matrices.push(); - if (mode.isFirstPerson()) { - matrices.translate(0.05, 0.06, 0.06); - } else if (mode == ModelTransformationMode.HEAD) { - matrices.translate(0, 0.4, 0); - } else if (mode == ModelTransformationMode.GROUND - || mode == ModelTransformationMode.THIRD_PERSON_LEFT_HAND || mode == ModelTransformationMode.THIRD_PERSON_RIGHT_HAND) { - matrices.translate(0, 0.06, 0); - } - // GUI, FIXED, NONE - translate(0, 0, 0) - //matrices.scale(0.5F, 0.5F, 0.5F); - - float scale = 0.5F; - matrices.scale(scale, scale, scale); - - ItemStack appearance = item.getAppearanceStack(stack); - renderer.renderItem(appearance, mode, light, overlay, matrices, immediate, world, 0); - matrices.pop(); - } - renderer.renderItem(item.createAppearanceStack(stack, UItems.EMPTY_JAR), mode, light, OverlayTexture.DEFAULT_UV, matrices, vertices, world, 0); - - if (mode == ModelTransformationMode.GUI) { - DiffuseLighting.enableGuiDepthLighting(); - } - matrices.push(); - - }); - BuiltinItemRendererRegistry.INSTANCE.register(UItems.CLOUD_BED, (stack, mode, matrices, vertices, light, overlay) -> { - MinecraftClient.getInstance().getBlockEntityRenderDispatcher().renderEntity(((CloudBedItem)stack.getItem()).getRenderEntity(), matrices, vertices, light, overlay); - }); - PolearmRenderer.register(UItems.WOODEN_POLEARM); - PolearmRenderer.register(UItems.STONE_POLEARM); - PolearmRenderer.register(UItems.IRON_POLEARM); - PolearmRenderer.register(UItems.GOLDEN_POLEARM); - PolearmRenderer.register(UItems.DIAMOND_POLEARM); - PolearmRenderer.register(UItems.NETHERITE_POLEARM); - ModelPredicateProviderRegistry.register(UItems.GEMSTONE, new Identifier("affinity"), (stack, world, entity, seed) -> { - return EnchantableItem.isEnchanted(stack) ? EnchantableItem.getSpellKey(stack).getAffinity().getAlignment() : 0; - }); - ModelPredicateProviderRegistry.register(UItems.ROCK_CANDY, new Identifier("count"), (stack, world, entity, seed) -> { - return stack.getCount() / (float)stack.getMaxCount(); - }); - ColorProviderRegistry.ITEM.register((stack, i) -> { - return i > 0 || !EnchantableItem.isEnchanted(stack) ? -1 : EnchantableItem.getSpellKey(stack).getColor(); - }, UItems.GEMSTONE); - ColorProviderRegistry.ITEM.register((stack, i) -> { - if (i == 1 && EnchantableItem.isEnchanted(stack)) { - return EnchantableItem.getSpellKey(stack).getColor(); - } - return -1; - }, UItems.MAGIC_STAFF); - - BlockColorProvider tintedProvider = (state, view, pos, color) -> { - if (view == null || pos == null) { - color = FoliageColors.getDefaultColor(); - } else { - color = BiomeColors.getFoliageColor(view, pos); - } - - if (state.getBlock() instanceof TintedBlock block) { - return block.getTint(state, view, pos, color); - } - - return color; - }; - - ColorProviderRegistry.BLOCK.register(tintedProvider, TintedBlock.REGISTRY.stream().toArray(Block[]::new)); - ColorProviderRegistry.ITEM.register((stack, i) -> { - return tintedProvider.getColor(Block.getBlockFromItem(stack.getItem()).getDefaultState(), null, null, i); - }, TintedBlock.REGISTRY.stream().map(Block::asItem).filter(i -> i != Items.AIR).toArray(Item[]::new)); + ColorProviderRegistry.ITEM.register((stack, i) -> i > 0 || !EnchantableItem.isEnchanted(stack) ? -1 : EnchantableItem.getSpellKey(stack).getColor(), UItems.GEMSTONE); + ColorProviderRegistry.ITEM.register((stack, i) -> i == 1 && EnchantableItem.isEnchanted(stack) ? EnchantableItem.getSpellKey(stack).getColor() : -1, UItems.MAGIC_STAFF); BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), UBlocks.TRANSLUCENT_BLOCKS.stream().toArray(Block[]::new)); BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getTranslucent(), UBlocks.SEMI_TRANSPARENT_BLOCKS.stream().toArray(Block[]::new)); @@ -190,6 +116,73 @@ public interface URenderers { SpellRendererFactory.bootstrap(); } + private static void register(DynamicItemRenderer renderer, ItemConvertible...items) { + for (ItemConvertible item : items) { + BuiltinItemRendererRegistry.INSTANCE.register(item, renderer); + } + } + + private static void renderBedItem(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { + MinecraftClient.getInstance().getBlockEntityRenderDispatcher().renderEntity(((CloudBedItem)stack.getItem()).getRenderEntity(), matrices, vertices, light, overlay); + } + + private static void renderJarItem(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { + ItemRenderer renderer = MinecraftClient.getInstance().getItemRenderer(); + + ChameleonItem item = (ChameleonItem)stack.getItem(); + + // Reset stuff done in the beforelands + matrices.pop(); + + if (mode == ModelTransformationMode.GUI) { + DiffuseLighting.disableGuiDepthLighting(); + } + + VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); + ClientWorld world = MinecraftClient.getInstance().world; + + if (item.hasAppearance(stack)) { + matrices.push(); + if (mode.isFirstPerson()) { + matrices.translate(0.05, 0.06, 0.06); + } else if (mode == ModelTransformationMode.HEAD) { + matrices.translate(0, 0.4, 0); + } else if (mode == ModelTransformationMode.GROUND + || mode == ModelTransformationMode.THIRD_PERSON_LEFT_HAND || mode == ModelTransformationMode.THIRD_PERSON_RIGHT_HAND) { + matrices.translate(0, 0.06, 0); + } + // GUI, FIXED, NONE - translate(0, 0, 0) + //matrices.scale(0.5F, 0.5F, 0.5F); + + float scale = 0.5F; + matrices.scale(scale, scale, scale); + + ItemStack appearance = item.getAppearanceStack(stack); + renderer.renderItem(appearance, mode, light, overlay, matrices, immediate, world, 0); + matrices.pop(); + } + renderer.renderItem(item.createAppearanceStack(stack, UItems.EMPTY_JAR), mode, light, OverlayTexture.DEFAULT_UV, matrices, vertices, world, 0); + + if (mode == ModelTransformationMode.GUI) { + DiffuseLighting.enableGuiDepthLighting(); + } + matrices.push(); + } + + private static int getTintedBlockColor(BlockState state, @Nullable BlockRenderView view, @Nullable BlockPos pos, int color) { + if (view == null || pos == null) { + color = FoliageColors.getDefaultColor(); + } else { + color = BiomeColors.getFoliageColor(view, pos); + } + + if (state.getBlock() instanceof TintedBlock block) { + return block.getTint(state, view, pos, color); + } + + return color; + } + static PendingParticleFactory createFactory(ParticleSupplier supplier) { return provider -> (effect, world, x, y, z, dx, dy, dz) -> supplier.get(effect, provider, world, x, y, z, dx, dy, dz); } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java index 94a0a77e..5ef86cf0 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java @@ -24,8 +24,10 @@ public class AccessoryFeatureRenderer< private static final List> REGISTRY = new ArrayList<>(); - public static void register(FeatureFactory factory) { - REGISTRY.add(factory); + public static void register(FeatureFactory...factories) { + for (var factory : factories) { + REGISTRY.add(factory); + } } private final Iterable> features; diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/PolearmRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/PolearmRenderer.java index 6d94f06b..36993336 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/PolearmRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/PolearmRenderer.java @@ -4,6 +4,7 @@ import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry; import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry; import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry.DynamicItemRenderer; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.item.ClampedModelPredicateProvider; import net.minecraft.client.item.ModelPredicateProviderRegistry; import net.minecraft.client.model.*; import net.minecraft.client.render.VertexConsumerProvider; @@ -20,19 +21,23 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.RotationAxis; import net.minecraft.registry.Registries; -public class PolearmRenderer implements DynamicItemRenderer { +public class PolearmRenderer implements DynamicItemRenderer, ClampedModelPredicateProvider { private static final PolearmRenderer INSTANCE = new PolearmRenderer(); private static final Identifier THROWING = new Identifier("throwing"); private final TridentEntityModel model = new TridentEntityModel(getTexturedModelData().createModel()); - public static void register(Item item) { - BuiltinItemRendererRegistry.INSTANCE.register(item, INSTANCE); - ModelPredicateProviderRegistry.register(item, THROWING, (ItemStack stack, ClientWorld world, LivingEntity entity, int seed) -> { - return entity != null && entity.isUsingItem() && entity.getActiveItem() == stack ? 1 : 0; + public static void register(Item...items) { + for (Item item : items) { + BuiltinItemRendererRegistry.INSTANCE.register(item, INSTANCE); + ModelPredicateProviderRegistry.register(item, THROWING, INSTANCE); + } + ModelLoadingRegistry.INSTANCE.registerModelProvider((renderer, out) -> { + for (Item item : items) { + out.accept(getModelId(item)); + } }); - ModelLoadingRegistry.INSTANCE.registerModelProvider((renderer, out) -> out.accept(getModelId(item))); } static ModelIdentifier getModelId(ItemConvertible item) { @@ -52,6 +57,11 @@ public class PolearmRenderer implements DynamicItemRenderer { return TexturedModelData.of(data, 32, 32); } + @Override + public float unclampedCall(ItemStack stack, ClientWorld world, LivingEntity entity, int seed) { + return entity != null && entity.isUsingItem() && entity.getActiveItem() == stack ? 1 : 0; + } + @Override public void render(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java index 1db8e63d..8a7e5ad8 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java @@ -30,8 +30,6 @@ import net.minecraft.util.math.RotationAxis; import net.minecraft.world.World; public class CloudBedBlockEntityRenderer implements BlockEntityRenderer { - private static final Identifier TEXTURE = Unicopia.id("textures/entity/cloud_bed/white.png"); - private final ModelPart bedHead; private final ModelPart bedFoot; @@ -66,9 +64,10 @@ public class CloudBedBlockEntityRenderer implements BlockEntityRendererI4cdWN%-sx52PzZmMxd;Q+` ze((E!-!YF~Y)wsWAJHQML6G+56jK`PJ1VVR8~EMlr&=C%r$M^eZZ;1_+QA1XsR~C_ ziVSS3CgU(wE2I^i`wMKH;8>ASS`St0V80ZOd)AFVhU3^e8D$Ty3Pak%z8E$Fj-z3} z1vdGE&{^ehtbE!9|L8CzC{f=hn=Mu~p~W$+o`m}`LeJqCr^nT}fx`(7!{Pa=4UHNp zNZLcU{t5MaUrtQ4niCV%ZjZ|@X8{BW6wg_1OgTKf*U>4HK1&PWI{y9U!V%hv!QoS)4#jFxrlt#@4}Eiq94IKA^~*0ayVYd; zQ1iUkvr(1O{ITlw-~b=x>NwUlk*k?=EjDg+!~^!h`w89p&%JTr&W}B73J=d+-<{gI zCihzG4(lype}2YA>*CHw@T98P%b$8Pu6}(qqog|H$@-^@t}fWK^F;RAekpv^=#G7d zkL=yW#`jJAa^#Z5k$2xTK20o`(tq`sZ4ohSSL?!vzdu-5TY2Ak^4hu0>!MS`4(j$i z!`p=W^WHhUr(&6-EITZGeO_G2^-?Nt&DgU&d!sqwragK2w+jZ|SFL{Qn=31{-3$A* zp7uCD>B_UE<%8acycD*P+PnAB(9}Njhh(oTS9R!+_n;Ffo%MBDY1!U+|M=?36V;uA zp7U!W2ZbX@RE=y)_oZ9LaH7khAl&hPhY{d%p- zlc~d5mepZ|jv!DdfqHYDK0bgtz5Nu35QYhOMUU+E$u6f_!Q=&3w$G^1z;$)Keh#s13~H(`rRE~Tdo`E(ty{M?GZsz4siPVHHDDG zhW+krPgc+zNz{QX;DDlDcq-oPNG0PMb|@5N$_{sM7bLrxq))atlGRK%WhH1%Q$^tR z2Ha-S^|l9vp_IkKnOtJFqMq4g)F|h3l1r2&E;uA9+|E!qjbb!Tp(HS1sDR;mlmS2w z1i=pUB;N$e?DYD0rw9}%2(FbO4o^v#Xplq{X9NNz2||zZ6cAAcV+Df*NFb1G6Ns@M z8Ac_a)l@45N`g>?ff5-5OQN*MKy65tKv~AXpcn-x2CyVel0*O|0S&?k2)U8Lzkz>UU+_Pa4M8h%mlD{)P-yPy!<<%pciO8PqTKE(Cc9+&~|_d z1{OmpfYW-05Jez}&C$IsyU)*iKtd+u5po5?Gx!Uojtx3$P;+VjG@y6^5{BX!N?3<71a+a;ntVHya02_~`}X?T4m z8U(u@kUWh_EUVN6fkhdZ!>EMg7{vmCXUUiBMV8YO9FD&}6IlaE6C}+jMT$mA-cF)| zou*J+qC`6>>3Ix<3e8LLq8_*5B!@vSvUQpL8UocW;()draFifmJtr9gLs?#gStIg1 z#fUgg(V@!z5>3Qej-X$kiL@lrxB>n?2s}o@K!qX8NQ{W;S&=3%14&>wXkI}6pIlVD zSa(luZeqMnxuVn;*m&J&l0vj#|RJ(89(tdYoc9$;m*U~pOZN2v&dgGjl z=a7jm+$)T)8c@0E*p{2cu><;64M{f;q5o5*Zm~kKKq`Eo>Y6TRn@jW z7m|0<-CA#*d@-tM5^{oN@9axz*WYozx|Tk(o!*~1>Rq?tqwx_79wOH~&ES!!Mku9^W<2 zRD3dW<%zO+txwr=Dt;Z1`TV_u%hweBOFosm{Ki^u^$+WwyiwGB{LxHl;Jws)vyTkm biRZ|}k1ZR%+@XF9os5{1Qcc@NOkMC_^kJcP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/carved_cloud_bottom.png b/src/main/resources/assets/unicopia/textures/block/carved_cloud_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..9f731f01ee8bf60e7d305bb9ba767b077c36b554 GIT binary patch literal 5629 zcmeHLe^3)w9$x|iq9WoCdaY<0nNzEq>~40G-94gsBuEsHA_BIa*WJxqTqQq90tqMz zwdbL7DvCG7qUTv>tfDfGKj?{I)pKn9)zdmy^`z)o9e-8P)~cs)Zxen_J9FcV`WMN( zytnUtzn|~#?{0Q!YRcpRVQ+>Z2r|H&XiS51ggion;qSoM&#G7lc0KnB3M3JwCU zhroFo9MYftvKru8{)GCzdIjR6=$I#)lT($18pqUH67pk&mc=nviz{)GB?uP7p!|T1 zT^h+q!7bXeP`{6)`1n+Fe7w@(w2M*>KoDAam2Axb@e`k|w z#ojQ}XAyJ%lo6eze*WQa2bh;F|Fro%$9-Yft>&xSs~1-*Ll+i*zMmeuKXGZ>)G(Ac z&_5ijo4>NoQ=F>Np1QRxV4dxgt;Sg=Ety9*WCmf&76uKfs01g?X_3*#&Knjis9*kI z`{^64!;9vg=8LDrtiX@#S*kD1)>#)noRItRP_XuKmG|)GevuQMe`tC97uO+BlD*`V zd+r80Y5cH@S(1=JQdgy`rQ2>+Xe_ZAj6JvU_>9H_qZe^ww$zMwt-l@`nf1@en9|f# zQ(y3H>Dg^-__s~}Z3%DX&TGo2zMa{(YWL*9CHRnn$OglRdMV&$Ya{{BzqsbQn)t=(NkB--Y%m?2L zc~H>&ysTktzy3{%5~`;5`h=8`#bn;v0|DXTB`pe2ECjFuH>dPkb8IfwYf$-cS-6(BH7cc##68cT z%7S?mZ+8MEsV3DJYVu0?gla;VGS+Dk*)(H9I|RHksOGrc4pyV_csy#4R&94?YjB2P zG#H^F2ozGFt^%8z^P)D_C>g?!VFWJ0DLLGd-KLZ=Io_V)#2lU&hA0!mc%Y+_0UZ|@tMcXL4S*K#ya==; z*A2>SbGbR20Awf#u9hH<9^f>|U^EJWc$8#F3(D*DG|G!Qj2A?a(o&Xg5YwCz%t|h& zyH+xk1ws)zN}zQNiRuL!YC|#v%FsF*#VA10fFboHN%){F0-IoWS~(a_$;xE|jl-7h zJCGgDPD(W!RD>Gq+DXmf+#+N!sFEaGp112DU9y7dZcg?lu48Duj=%{F`U0o@f_!)x z!0CdSC}aA1r;l9@3k!{bj^*S$g#f;NXbT(f1f1LMOt;%}464qq+j*P}%gMsIIV0x= z5VW%or+4(>aTo@>aTmSaB8dh6k6JDsWvoBsiINM-FYs;oD{4B(^nR!~bUdXKMGMhUFfY?Yh9z~c&qN(BY5~dV zQ47P!J%MLXnkO05g5wy)0G?yWmmEcg)e50yMD{c>RwLiPJGxJ-<`@0RPtfg#4{O-J2OlKhbBU(&!KA&op}w#3)7}?fr3j_6 zSI7(bx7S_0?s_2)yby73cJ;dJg*@;=#J$<|(%co+^=bpy;6D-%d~x9=zRZ$eQ}I(L z87_w$&f(Ahp;b!Bc zbovBXbJ=z&v46tAugdStHeNU$u)nCyQ(eM3SK(*(lJQQ>o$;&hP>USi`|ma`YWyx^ z`zIF;T^@IMdV*qA%&`0)-Mh|+LwAg5-KyTPcg@!1rUm7yO>+hfE*`6`E+tnp1`V%J z#07?1tusCivCi9j=Xg%mvMGTh5{KEFLgVNy*U#1KoA+V6#ir1vg19g0Mw&j#9e$&> zw)Ww|gKd@neh=As{`Rhlv`2N%N2RQ7dTQ6sH)dVD7>qvsv7szzTz-()tY~gMI;pUA zO60qhyW2cBD#~j@RVpNWLCCG>YbDnX*lusEWJ-@G-Kbjk59?d>4C4sb)KH}1KjZIZ z?`c$r?k?T4GCXn;@qq4sgsb0~S9|Hom1!fRE7DS8R>tJret(Mb*?wU}ag?X6a`TGeat$%$icU>FDas{Ikc`zPLOssPwBC)rlf+u=-43?oDEf;^97PRL~OcrQ0`sJ?5LI**kPu tE6Wa!QfNoTetYlH*JBxzk-}U1oH7-MZ~SiY9GEPK*_2}3`TGw({2x_3ewP3M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/carved_cloud_top.png b/src/main/resources/assets/unicopia/textures/block/carved_cloud_top.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2240e9442cba44edab9e8dc4d3fa767cc53484 GIT binary patch literal 7618 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 YWZmNHZ6}h-fdR_k>FVdQ&MBb@06VhYHvj+t delta 528 zcmeCPy=Xn*ynvylf}xp}p@Efw3ByI1HBuYzdvYoAb|N*}O$0fkUkBz*#;91_rhyZ+91l{~)+v@AAo$wPY3Qh55NyEW^2; zFfcHBdAc};Se!1Me7dOFfXB5zXL^g8!OJE8|5x5snQ6ArMlIn=Yh^{uqO((3gu*Ym zN?l!_{q(1fPBaJ0|A&^-r``VY=97fQRKCO9vuEq5UC0#aGSHY&#uDn<7@YW0{Yqe_ zXh&BO=Z#lVv-fh|W%;qv=KCq-hI$E3)=%?e<({5-b3T^ez1z2FZQGw|GZ_P9r?1<& zK}Y}G)%|svtJo^O`R@|!VRg9{d(0>8^MT`AE*!o%$x`CiyuuzgkLTSpBOX+LdL4g0 zuWEZ{wa@C?>2p3mKUB1m?Odzt@*OkvrtdWOshTy#bGbr`_Fb*>UkwvfW6oKHDL&nF zHb>=bH^)qeX>SeMN?Sy>=Y*v#e=x^6QC9J&ZszsmfM;<``=SdR*E*i+$}{Tx-|3wB z(IGhePHt!Cbd?i_67*kBPtP%Z5PUFIGB5p_V9@I?U!95>-`i^ZVf<3QYTaSMB1>Sf OGkCiCxvX{snr5bJY-Vbjlw_8YmTYJ~`8w}%UJG+`15-mILqh{oQ=`e zwG9j=bMh;o32ip#zrr+GLoim!+$7o1(!fC1%)r!G*TldqQ8zKsGD$Zj#SCaqnwhzA z;^c??-e}r431xGLmDz|WFfcH%C3(BMFnnfs$ndc9*U#?BjZzBr@&cMBf4ar)0HyDF zx;TbdoL(Ayny*?cFKY&5x3;tEK)M-J(t>;TAn^*Ld?4F zVW-%RS&3Bc>S8b}cHugiTe01Rt6Cwo`Ao!f^I`$bDWy*%TNHu}t|@AN64^VCkMTi` z)NI4EH&V`3v-NCRr?Aht-ZK1}D8mC&n~xi=-8a4F*dkJW_vgwv(vfBRW=OA>Xvs5( z%bTKl>Ey(?{@0K7TKJ8x9~bHfxuVK2nI&1a>Mra1jX7srYqo8en7k%|+jXAP8Oee> yT0JLY3^`K&Bz@lA`|ycn^JBA3uGRZLvvch@&%NrJ)ODa&89ZJ6T-G@yGywp5p|ZvR delta 441 zcmZp&++;rCynvyZf{~$>p{bRzF~b+{Q|~t3_uyjUx7)1A-NmGmW|3%QnrM)!YnW_c zp=)Afk*aH%Xl$u#VPcw`W@Mgbo}8LE`8w}%UUL%*b7Ny;b2BqjW6R0idbMh;o32ip#zrwWnolpXY*p}pO9tH*mwj^(N7l!{JxM1({$&*v073u{<_!W5{ zotz1j{^;rA7-DgH?qqMjBL)I4@@o49XP*1(e}M5up~5$_1wRhEthx2rVk6tdNmnOX zZ;KDr^k1L$ z*mtSdzAE0mJ#$5^;K|p4y?+}tIk(JDy+5f^VMXecA778w_ia>tp4hXrP?z7T_r?DG bpY`>GFTY5gToM-w^ge^9tDnm{r-UW|pO3ZS diff --git a/src/main/resources/assets/unicopia/textures/block/cloud_planks.png b/src/main/resources/assets/unicopia/textures/block/cloud_planks.png index b984504f5981d2e0e11591f7eb1829cf4e18a3be..ea02f32c85de92d138c835cf35d33f6231a700d7 100644 GIT binary patch delta 1169 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 B5)S|X diff --git a/src/main/resources/data/unicopia/advancements/recipes/blocks/cloud_brick_slab.json b/src/main/resources/data/unicopia/advancements/recipes/blocks/cloud_brick_slab.json new file mode 100644 index 00000000..88c40580 --- /dev/null +++ b/src/main/resources/data/unicopia/advancements/recipes/blocks/cloud_brick_slab.json @@ -0,0 +1,30 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "unicopia:blocks/cloud_brick_slab" + ] + }, + "criteria": { + "has_ingredients": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { "item": "unicopia:cloud_bricks" } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "unicopia:blocks/cloud_brick_slab" + } + } + }, + "requirements": [ + [ + "has_ingredients", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/advancements/recipes/blocks/cloud_brick_stairs.json b/src/main/resources/data/unicopia/advancements/recipes/blocks/cloud_brick_stairs.json new file mode 100644 index 00000000..25aed1f6 --- /dev/null +++ b/src/main/resources/data/unicopia/advancements/recipes/blocks/cloud_brick_stairs.json @@ -0,0 +1,30 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "unicopia:blocks/cloud_brick_stairs" + ] + }, + "criteria": { + "has_ingredients": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { "item": "unicopia:cloud_bricks" } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "unicopia:blocks/cloud_brick_stairs" + } + } + }, + "requirements": [ + [ + "has_ingredients", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_planks_slab.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_brick_slab.json similarity index 86% rename from src/main/resources/data/unicopia/loot_tables/blocks/cloud_planks_slab.json rename to src/main/resources/data/unicopia/loot_tables/blocks/cloud_brick_slab.json index ae08d3ec..84bc3447 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_planks_slab.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_brick_slab.json @@ -7,7 +7,7 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:cloud_planks_slab", + "name": "unicopia:cloud_brick_slab", "functions": [ { "add": false, @@ -15,7 +15,7 @@ "function": "minecraft:set_count", "conditions": [ { - "block": "unicopia:cloud_planks_slab", + "block": "unicopia:cloud_brick_slab", "condition": "minecraft:block_state_property", "properties": { "type": "double" diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_planks_stairs.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_brick_stairs.json similarity index 85% rename from src/main/resources/data/unicopia/loot_tables/blocks/cloud_planks_stairs.json rename to src/main/resources/data/unicopia/loot_tables/blocks/cloud_brick_stairs.json index 29999dd7..cd3e6120 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_planks_stairs.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_brick_stairs.json @@ -7,7 +7,7 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:cloud_planks_stairs" + "name": "unicopia:cloud_brick_stairs" } ], "conditions": [ diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_bricks.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_bricks.json new file mode 100644 index 00000000..bd4602d9 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_bricks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:cloud_bricks" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_plank_slab.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_plank_slab.json new file mode 100644 index 00000000..64b9de8c --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_plank_slab.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:cloud_plank_slab", + "functions": [ + { + "add": false, + "count": 2, + "function": "minecraft:set_count", + "conditions": [ + { + "block": "unicopia:cloud_plank_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ] + } + ] + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_plank_stairs.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_plank_stairs.json new file mode 100644 index 00000000..3fa584df --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_plank_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:cloud_plank_stairs" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/orange_cloud_bed.json b/src/main/resources/data/unicopia/loot_tables/blocks/orange_cloud_bed.json new file mode 100644 index 00000000..b2b54b29 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/orange_cloud_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "functions": [ + { + "function": "minecraft:explosion_decay" + } + ], + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "unicopia:orange_cloud_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "unicopia:orange_cloud_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_bed.json b/src/main/resources/data/unicopia/loot_tables/blocks/white_cloud_bed.json similarity index 83% rename from src/main/resources/data/unicopia/loot_tables/blocks/cloud_bed.json rename to src/main/resources/data/unicopia/loot_tables/blocks/white_cloud_bed.json index 29561aae..4076dcad 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_bed.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/white_cloud_bed.json @@ -13,14 +13,14 @@ "type": "minecraft:item", "conditions": [ { - "block": "unicopia:cloud_bed", + "block": "unicopia:white_cloud_bed", "condition": "minecraft:block_state_property", "properties": { "part": "head" } } ], - "name": "unicopia:cloud_bed" + "name": "unicopia:white_cloud_bed" } ], "rolls": 1.0 diff --git a/src/main/resources/data/unicopia/recipes/blocks/cloud_brick_slab.json b/src/main/resources/data/unicopia/recipes/blocks/cloud_brick_slab.json new file mode 100644 index 00000000..9b4480e8 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/blocks/cloud_brick_slab.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": [ + { "item": "unicopia:cloud_bricks" } + ] + }, + "result": { "item": "unicopia:cloud_brick_slab", "count": 6 } +} diff --git a/src/main/resources/data/unicopia/recipes/blocks/cloud_brick_stairs.json b/src/main/resources/data/unicopia/recipes/blocks/cloud_brick_stairs.json new file mode 100644 index 00000000..01d2cea2 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/blocks/cloud_brick_stairs.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + { "item": "unicopia:cloud_bricks" } + ] + }, + "result": { "item": "unicopia:cloud_brick_stairs", "count": 4 } +} diff --git a/src/main/resources/data/unicopia/recipes/blocks/cloud_plank_slab.json b/src/main/resources/data/unicopia/recipes/blocks/cloud_plank_slab.json index f6f99b84..4eca09e0 100644 --- a/src/main/resources/data/unicopia/recipes/blocks/cloud_plank_slab.json +++ b/src/main/resources/data/unicopia/recipes/blocks/cloud_plank_slab.json @@ -8,5 +8,5 @@ { "item": "unicopia:cloud_planks" } ] }, - "result": { "item": "unicopia:cloud_planks_slab", "count": 6 } + "result": { "item": "unicopia:cloud_plank_slab", "count": 6 } } diff --git a/src/main/resources/data/unicopia/recipes/blocks/cloud_plank_stairs.json b/src/main/resources/data/unicopia/recipes/blocks/cloud_plank_stairs.json index 0ff48eb1..82295d31 100644 --- a/src/main/resources/data/unicopia/recipes/blocks/cloud_plank_stairs.json +++ b/src/main/resources/data/unicopia/recipes/blocks/cloud_plank_stairs.json @@ -10,5 +10,5 @@ { "item": "unicopia:cloud_planks" } ] }, - "result": { "item": "unicopia:cloud_planks_stairs", "count": 4 } + "result": { "item": "unicopia:cloud_plank_stairs", "count": 4 } } From 05a5960380df46e2b5fef10758ac3afb7bcedea9 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 31 Oct 2023 20:38:28 +0000 Subject: [PATCH 05/90] Added fancy beds and bedsheets --- .../unicopia/block/FancyBedBlock.java | 121 ++++++++++++++++++ .../unicopia/block/UBlockEntities.java | 2 +- .../unicopia/block/UBlocks.java | 5 +- .../unicopia/block/cloud/CloudBedBlock.java | 30 +---- .../unicopia/client/URenderers.java | 11 +- .../entity/CloudBedBlockEntityRenderer.java | 29 ++++- .../unicopia/item/BedsheetsItem.java | 52 ++++++++ .../unicopia/item/FancyBedItem.java | 26 ++++ .../minelittlepony/unicopia/item/UItems.java | 14 +- .../unicopia/item/cloud/CloudBedItem.java | 5 +- .../unicopia/blockstates/cloth_bed.json | 5 + .../unicopia/blockstates/cloud_bed.json | 5 + .../blockstates/orange_cloud_bed.json | 5 - .../unicopia/blockstates/white_cloud_bed.json | 5 - .../resources/assets/unicopia/lang/en_us.json | 9 ++ .../unicopia/models/block/cloth_bed.json | 5 + .../{orange_cloud_bed.json => cloud_bed.json} | 0 .../models/block/white_cloud_bed.json | 5 - .../models/item/apple_bed_sheets.json | 6 + .../models/item/barred_bed_sheets.json | 6 + .../unicopia/models/item/blue_bed_sheets.json | 6 + .../models/item/checkered_bed_sheets.json | 6 + .../{white_cloud_bed.json => cloth_bed.json} | 0 .../{orange_cloud_bed.json => cloud_bed.json} | 2 +- .../models/item/orange_bed_sheets.json | 6 + .../unicopia/models/item/pink_bed_sheets.json | 6 + .../models/item/rainbow_bed_sheets.json | 6 + .../unicopia/models/item/red_bed_sheets.json | 6 + .../unicopia/textures/entity/bed/cloth.png | Bin 0 -> 6585 bytes .../{cloud_bed/white.png => bed/cloud.png} | Bin .../textures/entity/bed/sheets/apple.png | Bin 0 -> 5986 bytes .../textures/entity/bed/sheets/bars.png | Bin 0 -> 5892 bytes .../textures/entity/bed/sheets/blue.png | Bin 0 -> 5671 bytes .../textures/entity/bed/sheets/checker.png | Bin 0 -> 6123 bytes .../textures/entity/bed/sheets/orange.png | Bin 0 -> 5620 bytes .../textures/entity/bed/sheets/pink.png | Bin 0 -> 5723 bytes .../textures/entity/bed/sheets/rainbow.png | Bin 0 -> 5790 bytes .../textures/item/apple_bed_sheets.png | Bin 0 -> 7018 bytes .../textures/item/barred_bed_sheets.png | Bin 0 -> 7006 bytes .../textures/item/blue_bed_sheets.png | Bin 0 -> 7034 bytes .../textures/item/checkered_bed_sheets.png | Bin 0 -> 6927 bytes .../textures/item/orange_bed_sheets.png | Bin 0 -> 6885 bytes .../textures/item/pink_bed_sheets.png | Bin 0 -> 6892 bytes .../textures/item/rainbow_bed_sheets.png | Bin 0 -> 7039 bytes .../unicopia/textures/item/red_bed_sheets.png | Bin 0 -> 6879 bytes 45 files changed, 327 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/BedsheetsItem.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/FancyBedItem.java create mode 100644 src/main/resources/assets/unicopia/blockstates/cloth_bed.json create mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_bed.json delete mode 100644 src/main/resources/assets/unicopia/blockstates/orange_cloud_bed.json delete mode 100644 src/main/resources/assets/unicopia/blockstates/white_cloud_bed.json create mode 100644 src/main/resources/assets/unicopia/models/block/cloth_bed.json rename src/main/resources/assets/unicopia/models/block/{orange_cloud_bed.json => cloud_bed.json} (100%) delete mode 100644 src/main/resources/assets/unicopia/models/block/white_cloud_bed.json create mode 100644 src/main/resources/assets/unicopia/models/item/apple_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/barred_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/blue_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/checkered_bed_sheets.json rename src/main/resources/assets/unicopia/models/item/{white_cloud_bed.json => cloth_bed.json} (100%) rename src/main/resources/assets/unicopia/models/item/{orange_cloud_bed.json => cloud_bed.json} (59%) create mode 100644 src/main/resources/assets/unicopia/models/item/orange_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/pink_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/rainbow_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/red_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/cloth.png rename src/main/resources/assets/unicopia/textures/entity/{cloud_bed/white.png => bed/cloud.png} (100%) create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/apple.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/bars.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/blue.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/checker.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/orange.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/pink.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow.png create mode 100644 src/main/resources/assets/unicopia/textures/item/apple_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/barred_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/blue_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/checkered_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/orange_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/pink_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/rainbow_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/red_bed_sheets.png diff --git a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java new file mode 100644 index 00000000..1ff86b42 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java @@ -0,0 +1,121 @@ +package com.minelittlepony.unicopia.block; + +import java.util.Locale; + +import com.minelittlepony.unicopia.item.BedsheetsItem; + +import net.minecraft.block.BedBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BedBlockEntity; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.enums.BedPart; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.DyeColor; +import net.minecraft.util.StringIdentifiable; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class FancyBedBlock extends BedBlock { + + private final String base; + + public FancyBedBlock(String base, Settings settings) { + super(DyeColor.WHITE, settings); + this.base = base; + } + + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new Tile(pos, state); + } + + public static void setBedPattern(World world, BlockPos pos, SheetPattern pattern) { + world.getBlockEntity(pos, UBlockEntities.FANCY_BED).ifPresent(tile -> { + ItemStack stack = BedsheetsItem.forPattern(tile.getPattern()).getDefaultStack(); + if (!stack.isEmpty()) { + Block.dropStack(world, pos, stack); + } + tile.setPattern(pattern); + BlockState state = tile.getCachedState(); + BlockPos other = pos.offset(getDirectionTowardsOtherPart(state.get(PART), state.get(FACING))); + world.getBlockEntity(other, UBlockEntities.FANCY_BED).ifPresent(tile2 -> { + tile2.setPattern(pattern); + }); + }); + } + + private static Direction getDirectionTowardsOtherPart(BedPart part, Direction direction) { + return part == BedPart.FOOT ? direction : direction.getOpposite(); + } + + public static class Tile extends BedBlockEntity { + private SheetPattern pattern = SheetPattern.NONE; + + public Tile(BlockPos pos, BlockState state) { + super(pos, state); + } + + @Override + public BlockEntityType getType() { + return UBlockEntities.FANCY_BED; + } + + @Override + public void readNbt(NbtCompound nbt) { + pattern = SheetPattern.byId(nbt.getString("pattern")); + } + + @Override + protected void writeNbt(NbtCompound nbt) { + nbt.putString("pattern", pattern.asString()); + } + + @Override + public NbtCompound toInitialChunkDataNbt() { + return createNbt(); + } + + public String getBase() { + return ((FancyBedBlock)getCachedState().getBlock()).base; + } + + public void setPattern(SheetPattern pattern) { + this.pattern = pattern; + markDirty(); + } + + public SheetPattern getPattern() { + return pattern; + } + } + + public enum SheetPattern implements StringIdentifiable { + NONE, + APPLE, + BARS, + BLUE, + CHECKER, + ORANGE, + PINK, + RAINBOW; + + @SuppressWarnings("deprecation") + public static final Codec CODEC = StringIdentifiable.createCodec(SheetPattern::values); + + private final String name = name().toLowerCase(Locale.ROOT); + + @Override + public String asString() { + return name; + } + + @SuppressWarnings("deprecation") + public static SheetPattern byId(String id) { + return CODEC.byId(id, NONE); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java b/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java index 0cee11db..cd929491 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java @@ -10,7 +10,7 @@ import net.minecraft.registry.Registries; public interface UBlockEntities { BlockEntityType WEATHER_VANE = create("weather_vane", BlockEntityType.Builder.create(WeatherVaneBlock.WeatherVane::new, UBlocks.WEATHER_VANE)); - BlockEntityType CLOUD_BED = create("cloud_bed", BlockEntityType.Builder.create(CloudBedBlock.Tile::new, UBlocks.WHITE_CLOUD_BED, UBlocks.ORANGE_CLOUD_BED)); + BlockEntityType FANCY_BED = create("fancy_bed", BlockEntityType.Builder.create(CloudBedBlock.Tile::new, UBlocks.CLOTH_BED, UBlocks.CLOUD_BED)); static BlockEntityType create(String id, Builder builder) { return Registry.register(Registries.BLOCK_ENTITY_TYPE, id, builder.build(null)); diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 11a76134..7034bfe6 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -30,7 +30,6 @@ import net.minecraft.block.enums.Instrument; import net.minecraft.block.piston.PistonBehavior; import net.minecraft.item.*; import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; import net.minecraft.util.math.Direction; import net.minecraft.util.shape.VoxelShapes; @@ -175,8 +174,8 @@ public interface UBlocks { Block CARVED_CLOUD = register("carved_cloud", new OrientedCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool(), false), ItemGroups.BUILDING_BLOCKS); Block UNSTABLE_CLOUD = register("unstable_cloud", new UnstableCloudBlock(Settings.copy(CLOUD)), ItemGroups.NATURAL); Block CLOUD_PILLAR = register("cloud_pillar", new CloudPillarBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL)), ItemGroups.NATURAL); - Block WHITE_CLOUD_BED = register("white_cloud_bed", new CloudBedBlock(DyeColor.WHITE, CLOUD.getDefaultState(), Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); - Block ORANGE_CLOUD_BED = register("orange_cloud_bed", new CloudBedBlock(DyeColor.ORANGE, CLOUD.getDefaultState(), Settings.copy(Blocks.ORANGE_BED).sounds(BlockSoundGroup.WOOL))); + Block CLOTH_BED = register("cloth_bed", new FancyBedBlock("cloth", Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); + Block CLOUD_BED = register("cloud_bed", new CloudBedBlock("cloud", CLOUD.getDefaultState(), Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); private static T register(String name, T item) { return register(Unicopia.id(name), item); diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java index 4745e66b..401e0e46 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java @@ -3,20 +3,14 @@ package com.minelittlepony.unicopia.block.cloud; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.EquineContext; -import com.minelittlepony.unicopia.block.UBlockEntities; - -import net.minecraft.block.BedBlock; +import com.minelittlepony.unicopia.block.FancyBedBlock; import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BedBlockEntity; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; import net.minecraft.entity.Entity; import net.minecraft.entity.ai.pathing.NavigationType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.util.ActionResult; -import net.minecraft.util.DyeColor; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; @@ -25,12 +19,12 @@ import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; -public class CloudBedBlock extends BedBlock { +public class CloudBedBlock extends FancyBedBlock { private final BlockState baseState; private final CloudBlock baseBlock; - public CloudBedBlock(DyeColor color, BlockState baseState, Settings settings) { - super(color, settings); + public CloudBedBlock(String base, BlockState baseState, Settings settings) { + super(base, settings); this.baseState = baseState; this.baseBlock = (CloudBlock)baseState.getBlock(); } @@ -83,20 +77,4 @@ public class CloudBedBlock extends BedBlock { public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { return true; } - - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return new Tile(pos, state); - } - - public static class Tile extends BedBlockEntity { - public Tile(BlockPos pos, BlockState state) { - super(pos, state); - } - - @Override - public BlockEntityType getType() { - return UBlockEntities.CLOUD_BED; - } - } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index 4bf43bca..f0c03424 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia.client; +import java.util.function.Supplier; + import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.Unicopia; @@ -24,7 +26,6 @@ import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.EnchantableItem; import com.minelittlepony.unicopia.item.UItems; -import com.minelittlepony.unicopia.item.cloud.CloudBedItem; import com.minelittlepony.unicopia.particle.UParticles; import com.terraformersmc.terraform.boat.api.client.TerraformBoatClientHelper; @@ -35,6 +36,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.*; import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry.DynamicItemRenderer; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.color.world.BiomeColors; import net.minecraft.client.color.world.FoliageColors; @@ -92,10 +94,10 @@ public interface URenderers { EntityRendererRegistry.register(UEntities.FRIENDLY_CREEPER, FriendlyCreeperEntityRenderer::new); BlockEntityRendererFactories.register(UBlockEntities.WEATHER_VANE, WeatherVaneBlockEntityRenderer::new); - BlockEntityRendererFactories.register(UBlockEntities.CLOUD_BED, CloudBedBlockEntityRenderer::new); + BlockEntityRendererFactories.register(UBlockEntities.FANCY_BED, CloudBedBlockEntityRenderer::new); register(URenderers::renderJarItem, UItems.FILLED_JAR); - register(URenderers::renderBedItem, UItems.WHITE_CLOUD_BED, UItems.ORANGE_CLOUD_BED); + register(URenderers::renderBedItem, UItems.CLOTH_BED, UItems.CLOUD_BED); PolearmRenderer.register(UItems.WOODEN_POLEARM, UItems.STONE_POLEARM, UItems.IRON_POLEARM, UItems.GOLDEN_POLEARM, UItems.DIAMOND_POLEARM, UItems.NETHERITE_POLEARM); ModelPredicateProviderRegistry.register(UItems.GEMSTONE, new Identifier("affinity"), (stack, world, entity, seed) -> EnchantableItem.isEnchanted(stack) ? EnchantableItem.getSpellKey(stack).getAffinity().getAlignment() : 0); ModelPredicateProviderRegistry.register(UItems.ROCK_CANDY, new Identifier("count"), (stack, world, entity, seed) -> stack.getCount() / (float)stack.getMaxCount()); @@ -122,8 +124,9 @@ public interface URenderers { } } + @SuppressWarnings("unchecked") private static void renderBedItem(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { - MinecraftClient.getInstance().getBlockEntityRenderDispatcher().renderEntity(((CloudBedItem)stack.getItem()).getRenderEntity(), matrices, vertices, light, overlay); + MinecraftClient.getInstance().getBlockEntityRenderDispatcher().renderEntity(((Supplier)stack.getItem()).get(), matrices, vertices, light, overlay); } private static void renderJarItem(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java index 8a7e5ad8..6fdcae7a 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java @@ -18,6 +18,7 @@ import net.minecraft.client.model.ModelPartBuilder; import net.minecraft.client.model.ModelPartData; import net.minecraft.client.model.ModelTransform; import net.minecraft.client.model.TexturedModelData; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; @@ -64,10 +65,18 @@ public class CloudBedBlockEntityRenderer implements BlockEntityRenderer ITEMS = new HashMap<>(); + + private final CloudBedBlock.SheetPattern pattern; + + public static Item forPattern(CloudBedBlock.SheetPattern pattern) { + return ITEMS.getOrDefault(pattern, Items.AIR); + } + + public BedsheetsItem(CloudBedBlock.SheetPattern pattern, Settings settings) { + super(settings); + this.pattern = pattern; + ITEMS.put(pattern, this); + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + World world = context.getWorld(); + BlockPos pos = context.getBlockPos(); + BlockState state = world.getBlockState(pos); + + if (state.getBlock() instanceof FancyBedBlock) { + FancyBedBlock.setBedPattern(world, context.getBlockPos(), pattern); + context.getStack().decrement(1); + PlayerEntity player = context.getPlayer(); + world.playSound(player, pos, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.BLOCKS, 1, 1); + + return ActionResult.success(world.isClient); + } + + return ActionResult.PASS; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/FancyBedItem.java b/src/main/java/com/minelittlepony/unicopia/item/FancyBedItem.java new file mode 100644 index 00000000..4dd2b6a8 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/FancyBedItem.java @@ -0,0 +1,26 @@ +package com.minelittlepony.unicopia.item; + +import java.util.function.Supplier; + +import com.google.common.base.Suppliers; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockEntityProvider; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.BedItem; +import net.minecraft.util.math.BlockPos; + +public class FancyBedItem extends BedItem implements Supplier { + + private final Supplier renderEntity; + + public FancyBedItem(Block block, Settings settings) { + super(block, settings); + this.renderEntity = Suppliers.memoize(() -> ((BlockEntityProvider)block).createBlockEntity(BlockPos.ORIGIN, block.getDefaultState())); + } + + @Override + public BlockEntity get() { + return renderEntity.get(); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 43d54c1d..35caa19d 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableMultimap; import com.minelittlepony.unicopia.*; import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.block.UWoodTypes; +import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; import com.minelittlepony.unicopia.entity.mob.AirBalloonEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.item.cloud.CloudBedItem; @@ -160,6 +161,14 @@ public interface UItems { Item GIANT_BALLOON = register("giant_balloon", new HotAirBalloonItem(new Item.Settings().maxCount(1)), ItemGroups.TOOLS); + Item APPLE_BED_SHEETS = register("apple_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.APPLE, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item BARRED_BED_SHEETS = register("barred_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.BARS, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item BLUE_BED_SHEETS = register("blue_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.BLUE, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item CHECKERED_BED_SHEETS = register("checkered_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.CHECKER, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item ORANGE_BED_SHEETS = register("orange_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.ORANGE, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item PINK_BED_SHEETS = register("pink_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.PINK, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item RAINBOW_BED_SHEETS = register("rainbow_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.RAINBOW, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + AmuletItem PEGASUS_AMULET = register("pegasus_amulet", new PegasusAmuletItem(new FabricItemSettings() .maxCount(1) .maxDamage(890) @@ -177,10 +186,9 @@ public interface UItems { GlassesItem SUNGLASSES = register("sunglasses", new GlassesItem(new FabricItemSettings().maxCount(1)), ItemGroups.COMBAT); GlassesItem BROKEN_SUNGLASSES = register("broken_sunglasses", new GlassesItem(new FabricItemSettings().maxCount(1)), ItemGroups.COMBAT); - Item CARAPACE = register("carapace", new Item(new Item.Settings()), ItemGroups.INGREDIENTS); - Item WHITE_CLOUD_BED = register("white_cloud_bed", new CloudBedItem(UBlocks.WHITE_CLOUD_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); - Item ORANGE_CLOUD_BED = register("orange_cloud_bed", new CloudBedItem(UBlocks.ORANGE_CLOUD_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item CLOTH_BED = register("cloth_bed", new FancyBedItem(UBlocks.CLOTH_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item CLOUD_BED = register("cloud_bed", new CloudBedItem(UBlocks.CLOUD_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); Item ALICORN_BADGE = register(Race.ALICORN); Item PEGASUS_BADGE = register(Race.PEGASUS); diff --git a/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudBedItem.java b/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudBedItem.java index 70ddf324..50602d41 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudBedItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudBedItem.java @@ -11,7 +11,7 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.util.math.BlockPos; -public class CloudBedItem extends CloudBlockItem { +public class CloudBedItem extends CloudBlockItem implements Supplier { private final Supplier renderEntity; @@ -25,7 +25,8 @@ public class CloudBedItem extends CloudBlockItem { return context.getWorld().setBlockState(context.getBlockPos(), state, Block.NOTIFY_LISTENERS | Block.REDRAW_ON_MAIN_THREAD | Block.FORCE_STATE); } - public BlockEntity getRenderEntity() { + @Override + public BlockEntity get() { return renderEntity.get(); } } diff --git a/src/main/resources/assets/unicopia/blockstates/cloth_bed.json b/src/main/resources/assets/unicopia/blockstates/cloth_bed.json new file mode 100644 index 00000000..a86c636b --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/cloth_bed.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "unicopia:block/cloth_bed" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/cloud_bed.json b/src/main/resources/assets/unicopia/blockstates/cloud_bed.json new file mode 100644 index 00000000..691e8653 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/cloud_bed.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "unicopia:block/cloud_bed" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/orange_cloud_bed.json b/src/main/resources/assets/unicopia/blockstates/orange_cloud_bed.json deleted file mode 100644 index b4fd7a67..00000000 --- a/src/main/resources/assets/unicopia/blockstates/orange_cloud_bed.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "unicopia:block/orange_cloud_bed" } - } -} diff --git a/src/main/resources/assets/unicopia/blockstates/white_cloud_bed.json b/src/main/resources/assets/unicopia/blockstates/white_cloud_bed.json deleted file mode 100644 index 8f42f596..00000000 --- a/src/main/resources/assets/unicopia/blockstates/white_cloud_bed.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "unicopia:block/white_cloud_bed" } - } -} diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 412ec9dd..3ad438b6 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -175,6 +175,14 @@ "item.unicopia.music_disc_crusade.desc": "Danial Ingram - crusade", "item.unicopia.music_disc_funk": "Music Disc", "item.unicopia.music_disc_funk.desc": "funk, just funk", + + "item.unicopia.apple_bed_sheets": "Apple Patterned Bed Sheets", + "item.unicopia.barred_bed_sheets": "Bar Patterned Bed Sheets", + "item.unicopia.blue_bed_sheets": "Blue Bed Sheets", + "item.unicopia.checkered_bed_sheets": "Checker Patterned Bed Sheets", + "item.unicopia.orange_bed_sheets": "Orange Bed Sheets", + "item.unicopia.pink_bed_sheets": "Pink Bed Sheets", + "item.unicopia.rainbow_bed_sheets": "Rainbow Patterned Bed Sheets", "block.unicopia.rocks": "Rocks", "block.unicopia.bananas": "Bananas", @@ -253,6 +261,7 @@ "block.unicopia.dense_cloud_slab": "Dense Cloud Slab", "block.unicopia.dense_cloud_stairs": "Dense Cloud Stairs", "block.unicopia.cloud_pillar": "Cloud Pillar", + "block.unicopia.cloth_bed": "Fancy Cloth Bed", "block.unicopia.cloud_bed": "Cloud Bed", "block.unicopia.oats": "Oats", diff --git a/src/main/resources/assets/unicopia/models/block/cloth_bed.json b/src/main/resources/assets/unicopia/models/block/cloth_bed.json new file mode 100644 index 00000000..d389fff5 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/cloth_bed.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/white_wool" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/orange_cloud_bed.json b/src/main/resources/assets/unicopia/models/block/cloud_bed.json similarity index 100% rename from src/main/resources/assets/unicopia/models/block/orange_cloud_bed.json rename to src/main/resources/assets/unicopia/models/block/cloud_bed.json diff --git a/src/main/resources/assets/unicopia/models/block/white_cloud_bed.json b/src/main/resources/assets/unicopia/models/block/white_cloud_bed.json deleted file mode 100644 index e30e3f72..00000000 --- a/src/main/resources/assets/unicopia/models/block/white_cloud_bed.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "textures": { - "particle": "unicopia:block/cloud" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/apple_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/apple_bed_sheets.json new file mode 100644 index 00000000..bc1ac46a --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/apple_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/apple_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/barred_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/barred_bed_sheets.json new file mode 100644 index 00000000..259f1242 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/barred_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/barred_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/blue_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/blue_bed_sheets.json new file mode 100644 index 00000000..bebc30f4 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/blue_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/blue_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/checkered_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/checkered_bed_sheets.json new file mode 100644 index 00000000..caa3851c --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/checkered_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/checkered_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/white_cloud_bed.json b/src/main/resources/assets/unicopia/models/item/cloth_bed.json similarity index 100% rename from src/main/resources/assets/unicopia/models/item/white_cloud_bed.json rename to src/main/resources/assets/unicopia/models/item/cloth_bed.json diff --git a/src/main/resources/assets/unicopia/models/item/orange_cloud_bed.json b/src/main/resources/assets/unicopia/models/item/cloud_bed.json similarity index 59% rename from src/main/resources/assets/unicopia/models/item/orange_cloud_bed.json rename to src/main/resources/assets/unicopia/models/item/cloud_bed.json index 45ffff33..5d06b91c 100644 --- a/src/main/resources/assets/unicopia/models/item/orange_cloud_bed.json +++ b/src/main/resources/assets/unicopia/models/item/cloud_bed.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/template_bed", "textures": { - "particle": "minecraft:item/orange_wool" + "particle": "minecraft:item/white_wool" } } diff --git a/src/main/resources/assets/unicopia/models/item/orange_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/orange_bed_sheets.json new file mode 100644 index 00000000..3744c6d5 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/orange_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/orange_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/pink_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/pink_bed_sheets.json new file mode 100644 index 00000000..e5a20bc3 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/pink_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/pink_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/rainbow_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/rainbow_bed_sheets.json new file mode 100644 index 00000000..2cea2b40 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/rainbow_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/rainbow_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/red_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/red_bed_sheets.json new file mode 100644 index 00000000..bc1ac46a --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/red_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/apple_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/cloth.png b/src/main/resources/assets/unicopia/textures/entity/bed/cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..7f562d9e235299833f7ebf703f339a366940df2c GIT binary patch literal 6585 zcmeHLcT`hZx4#K3fC?fEihv;&Kn>}n2+~WyU?>XMAPF}RAcZ6}M=&UYpcD}-G(iOs z8xGA52+F7+7O)_K6%etE!XRbj-NgRhx7J&(_050Ytdn!@IeY*1-oLZY&b>)tdbmv0 zFwg)1U@G0!(F^Kr3;t4bymPWuKaa0-sPs5QQ`>>*K9?6jiTlEh?{w4Ap z9GG+m2c$?WPL^7*&Pj+{C(AY?X)L=h{y;p=?a7*xf{eawt>a>0btr{o{yi@kFku#5%Miq zK|(fY5yKbBHw>_{i4n0lVW1Sr27`G5Yt);wbtoh+$QtEKVqh5}2QY-^x?T)=ulMlb ztPkT*gHSe0HLPN25C9*PvXC+SaDjvtV~tYa(x943 z(2`hzlof*(Nao5RK4Cb55{{TBlJbNCq#TpQ7Dh^~Q7C8~`NcoJh{5;@FOYm@0pbG_ z!xCX|7FZ0QkNI9hB6W&_Kt4P4A2lRCu_6%T1xkdGVh-pO1q!5dzlR9oeAO34io+G* z1aUB6ILL=YC6HCz4<_X&?yH8Jf?ytBq|k!M{y|d8<9;LS2jAo?ig3Pn1XBNs`-AkC z*cHN%6oWx?6mlZv?$I5sQF8mVAR&hrL{kijBpjDQ!jaKfGLD2Mf|gh`8;c{LDIiDy z*=#OIAhN!Lq6;KamVg7wp&)Pz9)!cjvq3VELPmpFHW^Lia>-~m1tg<6BnpRQNg`3W zT*`M4%f&n>D_P;+dnJbof}rr0Bo4)rN<@=66v!JQ6_2J;EGcL#2_#WKDv?Yi;uTOq z9GbIG%x6K{$>XzvL5xTctXPl}PP1dutxj zihYE_aBI}ps{3`B0Uf6xmXzhll7bNE*E;O;r4BE`Vricpki#*AK|F5k|0gX!JV+}@ z9@=tOo&>TVtC;$9qP)R~Pj{bg!+DCMghVP11&zh|6oP~m1qLbngs?s>aY9&vU=XSv zpVRfrJnuiG0)b5?u*g&{8c!hL(L^#AM6)faSTqU5kqHz$hXb-XKcY*7Txm2*4B7=l zJVIPS>8bdILYgTy%KS&^=nzo83lL#w92Sko`rs%u5}rmREyCjDgkk>u5G}bBBA$(9 zqX{@Jl%iN76e0_cMRTzPE<1?LVsQxn#SjU&|D6+`L$t!k%i@s*Ix}%*>Oy{dy>+soE^qMD^5UxG9F!!WgNwv{! zl(G6{i@KD3*XT8+?Rc$ilzGryR>kw0i6~NzhD|&5BzI8`YHcpXLth!8d@v%lz949g zaw9g-Z`X3u)cv~x#&HDmvRT(HcDH-AFI1zSKqb$)Hqv{3^4!R3xNj7=yYuL_Cx4E0 zmJd0k9}r~vO%5HY%NX9VHXE4e8x1ogE&*gCp~gUe-)(uUUxdoB+SE=HJ)Roi@gJp+)< z5w~QUl^-`8+i)Z-ZOz6}?wo*$7XiVmY8+-E!O17j#iKp}r_P<*4k@O`wJl4zs70O7 zzV{%k$m%KUP9)ZQf2Y6Av$69)#qB|8svx!(8);IYb4Lm*%*%5)zpiaVtJIB}R1#~H zS>V%p{Y?7xU8_l2n4ZCXalqey8#uuBSR%Ncd8NmPhff~RY-SHfR_-(peA98RX^i4I z{_bY;J7@lfGd7d20-E>1qj&2k!)?vCXv6Ka>m%}0^4~~lG+B9m_TjLHb*A3z>P+)M zuDM~P(uNNSWUqFvo9@}xXE@4B+Mz`WUWb(*)Oen_8}YukH3fbngorF@X*t+XJ!XC^ z{_WA1kIH5j^+i|kCq$J#TsPxebsbgZi##LM1?^os>~m+y;+s%F&AO^r4NrYftb5U% zi0qYl?(Om)l6-BpX6ru>bj?XQa^Ql?fQ7N+R$!h{jFBUu7d1=xk?qI6QoUC zBahhWBGu%J)nRwFoo?Px>+S24#GRbw=xDTcZhC9qiQ%mB;VrqzXNqB%b#F}9wXJX4 zoBF6Rqub@|Ls-UzgvR5h>keiw@JPCy!kLlWV~7kiF^(U);Ne?&dH1f~9rFXPEDfB# zr1g4ATI=C4+2yki6?mt#UC4%ds#=L|wwJcOErM>P3YaJ(OtkIi4Xi~JZ@zTE!oDtL z2YZp_rP7Y zMc5fOi`MFAdqKfp-V<+~&MA1!nt8E?kCu74HCfMT6^_)axM(LPVQ=mj<}a*$F>x$6 zxd4|wXz5g%S-1z5L9Y3$V*tesTam4QK`oDVW`1dQXz~-v9haap5<`E3r4IMutI~{* zme(Je{Xl&xGtTzRg^sY{r`4OeYI)TBD>}DkC{>IFsyO2`C?K@&cKVTr zEA5yGGwf}h4Z9vA^->;Tn+7)P#dY_T$0q%@cp&QTvYuDb#w(ATW>k9`yv@UWjAA*D zFFK2|KUC2(Io6DKcU`_PO;gD+s(Ub4<3)*y{hWBw5^q-wLw$Q_ddrM?N6gv!RN&Zg z5^-ffIWYKaW}(Fzb*r&UTA;NWYyBT5K^U+)V0Dg`&8X7CYnHvDsdu`Tu`5gxZQaz( zON)a ziRLh;6p?nKiIsoCTCtAg!s+qQW@=vrfA#WB3pKN!rWygZTEDqEHvE3c-V=0pe}5X` z4NuK7aB1(Y$iS3F`FGTG`jdKdONt8*%{gLAZHGk~RlSNTX0|syjaA>7wBO4$CI^pD z_0-%1Bx*xhW{-flLo6$pvHIZbyfCJHE)^e zK3FRDpq6YZhG#9+P&0)AsCuP%3uaYcw0L@HkZC_Wy-yZnDH^Ogea-EkoO*LduDDSO zAWSwdaqmi~@-)*WjmxYO=_9ZezWWDr>>2>KNY%1V-_YZZ76>@@vd*-;vc*#zvfWDJ z|5*}eSM3LQ_HMEFtklBRxjZIU?<&;1_cV=f^}o?qeqv*< zIV&{~Mc~f7S34y`Gim=q=D-QOb=`rCb=6Vrt+M@D^izduJo;P8omoX!k*WI=cb3;M zyuxd)4*2=>=c{Y3DPo$H56+qVC`6rts_07~nB*N^Ypy*u{meO~T1%~M%(Wvgmex
    -PS^Q_qDxKW?BYSgWZa=r74H|V_L%{b0&UzOvAw!gq}fht%{x8*kK zcDnO2yV-g3G48xtoOfO=_Bk%IwXuDV4cLb$u&_gn!=nEdC}>+e0$^tQMf(AaGTdaS z;iRi=sK;i6qzoX^=$U6f2?gg)+Y$Lm*g}o!+QLpR!u!~yHIAd0H#)kX`&G%UO!IK` z!ZTSCL}RTLgSGsRUH)7DL&89wph*(*yAu~H@8t|Lu{W=?j_=;dYO*7Ie*c|j3XMY9 zORqe(Dh-ITRS$rz&k8f*G$Nc>S306eCV1+CEf`0)R$w?U;(D{8wYhXfT48w5RsFzg zCf9jfhg_z?7ahdKU+(_SNeehfD<6LUq zvX2t^FflJ0N63XFYchQsEUG#&KSF%eB#J-D4N^td@^>`kR>aMi-^r4xw`H$GDK=?Y ze1_wU7;&5tvlOjR*kndpByzAELw?9<=NEM+?l4TQ^_1ge>Th;jUKbsgrgXQ~AK7dD z79Mw8>5e(>?Ft-^2ctV2SBZ0ulPT!WZ7Ffah!h`^5t7nzikx@Ye&nQ2I{)6X3VB>B?D&S ztIf6=5#R9r;Q~AcMzrB>nm2`^!4IaJ^pY{$jSnvULW{me!nryoo%^%kj|0b3JbgN# z$lIy&$2f~~+o*0M``mOP_ajr}#)H6aZ{e)V)zhX1F54(RoO>|H+Yui~xWG*0+#82? z6RA%X?t1kx0_s6I$WUvzPt<(({L5HWUkxT*E-1*|3#6Wa%1Vtn`cQ&5`a+L zA&tcXfCNy6_|`dXX%UR44PCk8yo2$IZu8$H_D{=s4`F zbzGWOIQd=q9atjW)yVU9w8JU^Tz3@6##M;chrirV9mGmZycYqINeI z9?#k_x~FLtC6E=AP>Z{xdmKPJ4&ohLw;$x<20N8d6CsM0g@ z-=M=0uQ{fO!T_N@E- zTaxlpD2ONI>BI}#+7ov#A?sN7gZ+iOhFwJ$@P;(hp$5NeSGtpeYQq0SqC7z;BSr1x zly$j7EN%n;xrvnk)FVu0_HN&It&E|8nc#A}@?8Rod?8GwN?%25WZpo|$dv%x9i`xM z8ewrSLQ`utgo{=?9%MNmi#i|1jk4^bzTwa?l+6flfhmtmh%MELF@NL+OlXD$Euf@h zDr`;d(bnqQXg`^z+5+Bd897yt#RKQ4^Dx$dvK(^BSXzdwcLD+i&ZV@^%MCk?NjWB_ zpkmgn*7@WS@3>YJJFgYaqs;kpd}<~|<;@zviFZaDhO)xFS2L!w8ira#|I2%CcwVS+ zb1w}*XvJMh;Q`?sG}Y@=`u2{>Tidx$>bkF(>IhQB6TF220lXSX-N{_15C%gPVk;gN z3U)qfxzVX*V<3BX)9DoGrCOVb$F@B~A=q++jQ~mraTc+TA zV+RL_MU832r{#E}*ZExT%W8(G9E@V6XK67!b-|I-hY3CEAT8t3Psd-6>{ULDxiiL( zK=JA^!tZGwgr2xb3g2nL1qlj}TCDt5J9TxDwQGolxHQ@$-*}sU0d<@MWu` zA4&-b0lt|HhOKU+LJQ(^lxze~g*U&a~&xUyP@#Rx|S>)H;_%fKwJjXqhR5`_Jw`bx3vUVLjgx+IFP|Yi6v0{wGbISb$;T(-w4bfOH8B~!k|e5 zA*AUosJ_SikEn}UqGCKhzE3>eD-3U z-xMN!Ed3s#l|lc}(63~eD+>dW(j0pCw-dQap7HymgBwn0X9O|$-K>Zu2_u&Kug?JR~&qa6y;Eo=NK-P%e1P}FvwzWK?_ ztEOx`zzJ2m;DkEl7AAyDVBe>d3X95I}ML{|u#*qtHeal~q^b0P6sRH7vhgI!~ zkke9xv6%@#tG?-~mJ`oX94@0Nvl@ivX1YZ!VkKNhM@~q}X$|E}>^?-w!wCYDBKHYT zfZs&_fEQJ$)o{elRy9DlRIhfL$rA%kgY-}-sNK^yZLM!cjQv9;0|G_f{Vh%rwrJQ{ z){!APY?Xu9bV@Ew+u5=PxlCeZk^HGtD8W4KvKR13CIBDn_pGv`R9Xm4a<)TJNCg+L z!V}pTkPboLsz>&d;kD2~v9Mkpo#32e%e(Bp)xj@HNI|zUfN1#Nu8ZFi{vLMRsn^<_ z8<)3xC}}4CCHo*QqKpdei2PW3DQ7^>^hK^bl-jcAXA$rBQd__)who9|E4RZ;MSg}{ zrHFcjN8klPv0bFfLmNAqgc;C7NEw(TeP2wq^T!;Qfc$2wX|uu5>db~2RTB!$U`c9V zabJ#=xFK#@xDS&mBbgbI!HMy-u_s!fJ0_|`8U)*=@WbFoltV+&X{nmup_?CEs(sgZ zs}1Ru^teImUn4AZLRL~5QEVStM`nAEe!Aa|QwxysoT!O!weK0~wKta%w;tYW_xEp+ zn@f}HUXzHT=Nq;qvE6dG{TuChIdlYpmvAVpYh>a>(p2+Ogg*&~HhdgX0noc-LkH9E zVWgS)$$9L*XbPj{#>KAEE~xD&mLDM*so0|an!I&vo>Dh*wTsC#1l4-!UJ(@l`!)v9 zKU3L9%`g|QjcF)eY>xB8$ME&Z=ubar5hu56xWaT0-}xPi9Lc?mIamL(UHyczr;Uwx zV&^ZnO#Sog+yCRA=e3R>h&-I})X2Tq*yX=HvDowE{eSCvE%3p~6HVp+Ok=i=O?m|9 zANTpEv&s&~j?xMAqW6R9Nvg-ts=lPR`zgrr>yI#49t3 zRGZ{_caGR)G2t^sgJ`MsAtH~*1@8m)BI5Io1ZDsXXYH4bsaeNTc2v+YH7yxbpYU;G zS7@i%=m=1po`L3NN|>svP~HOT%TSviVNfP(JbZnEt1w4agkt!YtTUWt<{FpN(wJP( z&P4?L%ek9pa?_jMSk~^EN^KF#6#NVJt%9yt9B)Cz8DfcXAF@zT`U8iofFsm?5Pi%h znS!CFRGVw#qxUb(t=EA?w;+GjI@2%;*{nT>8g8u~npgt+Gx6JrpZ*m6BYs3AJo*Xs zO`zw(A*K|MyT(GJs+N6|dW;cF-#Ys?TBqCAHP}H@ERmLlfgjP~{|VgrkUAjK%!K9k z*=13fbmIqfR$&iQ8auT|uK9BAM^TgxEjnd+x<=J()VWzb3U}k|^mE2~r!PkF2zFZR z|60hkE>uj)YgRpR^+VA29faND2F^}@-=;+f@`gMzKj{$9k^YPHfG&!C-Ok*g1FQ5&p;2(w;QY5-}> zkqB zNfA|MC?c&CeSi-qWfmp88G$w!>9Z;qUpBT-PO7`=L1qIo6j4o!V2nwvi_pETO36m5 z-Q4vvTi05Nd_V_A>B^3=PPHG2C$W`2Uye8#;H98ZWo4mKCQe*JruffdCMpzzq{BOj5vQW!XnMhTM%Y6`nCG_znO~@al{YY6URL zv|IXLxnTk3%{oq~0v*^H=}+i50V(>CNS02CN~4vxd9>L9K%p!^D$jsPHJfL$H1ikK zo+`TUHdc_p1kf~x)v{1)I(E=ndU>LZXsJT$J#-%(LWpOT|J)1$uJkE1j}9EtK)y94i%A~>6e@7 zWnt_|u=aztez~_L;5&@en;>e%vs-P@56CL&naFJkgrn+JXv0QA8yPqUqK{$7VL{I- zGv-iRR+(|c47!%XAt@Dx)=EM;cYjzxOb?SN>@Xh+&GvuKZ$d}JNKGo^P+gL^yN(`8 z@yu|6WuvG===^A0&XFMo#|6fg1IVEeLtiHuAg8M$eilqTNkr!-EEIHgV!zR$|7?)c zvf-nNcf^hl(h0sHR#gJc2mP0(4&XL};csjBbJh_8_r;m5>1tTWMp7}eQe`|}e&6$i zn4t0lgy8=l;hZYiBpGkN6BQ3&br~|JxGX^OLcN(wIx(!+1hM1{761(p-KpkM06T(4 zfWe^)24PS>4#i@{bqond??c`NQbj@mRyI)+|A^9NP+P^ggn$l+aX&SABYeMQL$xcZ z2t`NHC2!16B@mxbTk2I*QY@#BS%y|;O)%=v4Io1i-TiH5Gja^Z85*%@i8^dBdT(SZX|!tRs~Cjmj?%EF&dKxhSuQQ|zh+;W#F zragbn!v-mCWKv#*m~~X=Xn~M_#nOL{TVev_5WOkLfIt*PpPi(=EPcT3l^nuse_=JV!{s92@Js=A)xUzA!Snh z&g8A`U3TFBagVRo83HoN_wl&g5pweODsj?Zw5Sk~KswawP4YVyU zXe*{R5Gf31F1WyKu7Qko2x&F&`lB}B+9QGP0{qY;ay<(PG_eqhu27Ri5VB?EYjuQ* zu!1@rEyQyK1<^QEfP+CN$l~KAyjmP{MDnImM<7OBvnFtQnXYt4*VPU&ia9mVje83A zs;l;|18r6<=e|0#bxqTx{g>XE&UN@SSku88C zaBEP)W2FKFVNk=VxWrrRUlRvCxne0hj&+E`anS88+H8T4i7MCf;L9-q^pObuEYaGXVDH4{Zoh2O+aZvyoj~ps;%;ra!gcv zl*(_*-(iOmQMp;wTXlP^9c_X?p4EP;S~ekK3P598)oLI=Pk)l9b*y3mZDf|cKPg_a zF&HUNQ2_W4~f6U9r^HnZ3c&mbG6n_SR^FN&%Y zkcZASmRPdIDURpkN@(1}2E}gkJfJ%aaO`CIuzwRX4Z|f&lcGr%HnZs2q4Btgm(5LcB+ClMlxiULFd}tHOw9> z)7DJW-q8bZD8!D}EGuP8ldrEx!x&L^wL+pl^>#*})4+vF(=S+#H)c z_#lu(c-qw_n?quaEUl6wR~+r2WfDL{C1iM(*ObU0m;+0K!62m)Z;cSrMA9PF(=%*c zqc^=0!YKn3y{N&rcyI3F5sl^`V*ptdn5q(0=v#FFs0x)r7tY42T33e7ABa5LCv05R zfjG)*iCRUO(^1CGMctrEew*n%aqjdp12}8nAYX!80n&Z$Xyw#$8;HD&Y&6Bb9@E&vyUgWQ)pp> z;}B}raR{Z{i~e+Zt-br32TB{fxaSkVmj?&t>PNTgnl{J?S#K z*LhgL@ZhqUw9Z^rc*?br@F~e^BUQMVSy1zKBf9_g>@ylMQdZATJFa;1B%!pP$DEqs6c4s?AQ}<60V<(aH5Z!w}H``+n)Z%<j3EHlQVybO$XR;4FkDW?CA=J|<8fm9ZLsK2)YiJawqIm+n* zaEb_JKbTtV1+cKr2BW*y{qaCUb<@);U0;+G=7rv_PraAXF8+8QHs$=_Kgs`zKQlGG zo%tI6obdAcIx&Ri_uZ~q8av?4$p|m!K0huU2=3QWEX5uajZFyf0EYhJx6SQ?almKRR{aJv;Vqc!qM`R4A5c+d1mP?f|;unj~((zUR~I*_$IcJvf(A?|+1 zTSz+?QiJrg)Drb@Txf!l1&tfmxAR0_mRgg|Q8Dq3HAa{&Oart~k;4wAfA4OuW{%D|6C{je&FHX7yR2t7D3Kvlx$FFF=8)&gN)4hQOL26@06NE-rMU zPI7b$is7`_Sj-@JAbmMEejvJ+9UAC@_JurCal`r{vc_&@VajG4y&|bOzB0z;Up67L z$!U16<{$_?`D4seSMj`ttbqIlLkdieXI!_@vqVO&>h8OL4@dhkvoFc%g1ADEL%0we zN14=vB4~C^R}Iu&Wf~tMG126v&yIQZ)*K{ldG!MKT|+1n zIeT2l0;dlK>jhQH)x<`ee?{#y`kT*E8%f~M!Gf>HDGz5R_`_2Nq8`jX!dUZyuk)4< zTcTEo^rDGk4dZdHQteUTxTW+}|5A0$vL~pX+9)tYMIG2#xH-4o^LME=Hx5UxoM+%C z078IkSm;UvlhlB!6w2F?ats5yW zR4!L;%WLPq5ZSnG#nN-~Z1_c1M#h&d>y)0^)7TPe7*S&kgh~J`?co+p4xYHvto#+Y#OXzecP7Pd>`jNNcG6-+aXQkU@HIUsc*rU>W!hadxMyL^W z3c3!IrfCcVFK@UEllFY#8uKhFH8)jb2gcLT_4Vkg$DuC<;ew{nXAdZZZ!>oeJ=+%N zUb)@*fAm>athpgFhXq7ujoq$#=~riS zFF(H)3u|Zt$bnFFr`1?tM2XkfM8s9a;+R|TdNb!FnZ3t^!C%TT<{;+zmzWWjy~=a$9+}DpmiN5?!) zu@4#%EX#VU(}EMW%;Nu?cqr&l0Tq^H=3ZuJxaeaN4)?o zSClx!U=aS6Im>9EY1*l~6{+)9hzxhYT1g6J0`Sl-+p$JC1@H(#x4uwW`*Z-^q=#fb zpS;-EG#}#%Kvhxr$cilA%1@-DMY#dl^d_1~0#vE7TZ^P!Opkjj3*wF=0x7xx!5dsX zRK~qn2wHSReQvEg9}gekDnd)Dq5T|f2JU>*S_n}M!FPu5lcW|gO}f&HaTA`_!XeoM zdkAxnY;6yneV`rOtk!B`-W$)ksK5{7Df8dMo{Yp#Zc_mtxb7Z%NX?$Rx()}QIq?yz zz^B%vCyPcSVAn4Z@*vwQv>lu&W3ThA3)pfIIXmEwX+m_Y2uN;_D&g&%mjw zqmlSp;i|XzyhfXgal2(&ef1~dKD&d68FyHUvs9vKYKg~9BxEI>(poaLF`zxUtyzSJ z<4+1`79#K|d^Z*)?x1~zw91;5+K71=GKwbU{juZxXo7 z<&{cd6K8$=GRx)6Lzi3s%K% z!&NTDRaNO`4Vl6!1jO|+@XfTPel6`h@10d!0>&S^8V zvRp|tt|Ak(%J8JJ$BjJ?XH>v}M++eo3TeK@HkhL=PUM|H{$Vz8E$Gb>v-0lBBs+3( zr3??c>M5UxwZlGADd8V}N-Q^3)iwsinsJWN$V` zU!8%A%Hb%Jn(w7f(NEY`sy&gT*6N+qNmH3afF70wQ}JWE8C0OeKa%jM;Jd4y836YCM$P%wVs(>L3E5AZC%&ovAILcaS}TRO<<*TpRg4 zF29ZOl_1@!c%plw6G0Xsxy?*USy4BIy;?tiYf!8nTH~PhJJg6o_))j8V^8wmSj1X7>XR&QPPrnFd32Dm;WXKOVK zmJAX~`HQlT6?ZH*F_;armOH0^$OjIgn0loNU_0?3{RAvM9$?KVLfb9^woYxIH6#5Lx2f_Z{wy~+0u!W9n zRZk_L9} zI+n?AqWjXsA&#nM=_$or6+XHpmD45Zh@++v@xH>5L?6Cw%BZAcA}Ti`=(E-=BQ827 z#rszH)ZoJ0t|2`nM>tNSDO1NaRmhPXo2;DcK*OsEEfGl4$NA1%>hpaJcc4;_{!#zvx(p`=xxc@1?@Fa{O#)Z; ziPzBFhZFC#K|KAuzLDZ1^tv?5c~f);>sym}OnE9{*%Er;HaVx^6LAEtRBy`GP+OxD zUV%&%-(y%bU8LSVj0|DuM2g#wZKRZ>k!mieKdQk^eo^6gJKXZPxv+H6wtSpfaC2=` z*=lcze7^iiorAWLRm3a5dt&5?ezPr|2>{I#;#PEO;f5V4bf04HEtX{nH)a=)Tf{b1 zST_e7SCX89qQ@m`+LuVRjsb3pHoXSBXVfI?OQhFmsXLH0{!x9~P!%_v9)2?aXn5#Y z=YnmpASl;}72m7oWWT z<%JLL)UWHPd3mO!e06$FzJLDwxuE~6tSz5zj`4Sb{LPJR;o9t2g@5VwEAx%*eEV3s Zf6jO3Z#rWI{Hm9J{_PEC9(wSP{vWw`1N;C0 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/cloud_islands/continent/c.nbt b/src/main/resources/data/unicopia/structures/cloud_islands/continent/c.nbt new file mode 100644 index 0000000000000000000000000000000000000000..08a639d61fad95398f06830c8776bcd92a17153a GIT binary patch literal 25649 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 dcSpAPdi literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/cloud_islands/continent/d.nbt b/src/main/resources/data/unicopia/structures/cloud_islands/continent/d.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7962a5d7365d41f4bedf48cc1a6cd5ca0907c7e3 GIT binary patch literal 9078 zcmeHMZA@F|6>ha3TeOu-VpZCufgjtHO_A&&)Az6F7Eu)a&Ymx zT^CMjt1N%X{pQyjzVV&;DWH%5kjR3U?H&bFIWqg)eCOY{N$M3fXpZ?W$>iRSTqQRHhWq}2FFG7V66%XbEnBx839`QS#R}LRq`f4p~SM?@ZGszn^ig%Xo zlHuzW#DZeFmwa2;FQfA>BQg|r2+Egkz(Zz$qgpx$x=wzIY2s&K1+orYP;5B7h|7q7>OuH0A{ zWiZYBWHRy;xL@35`23KH1uWVC?*LD_8QgEJu?1v_Bnl)H@3kVI&T?-h21JJ0 zWVZjn*Yzx~ca0rd>SFLF&uerRNU*~{MVPNay*Y@N81%Y5{OM+mL?i|Jd%|d8b(@B0 z8iz=oF0!a_p1=}Bqxov^UH~!WaaZOoA7s~lls50JIFS0dnm5P{fz6Wr##hh_=$W#iI zoEVj!iUZcN`h>43k0o_pi+=V*4jzZ_iHxnpyW_>m+Z7Yvx^eaRFC^CD$?qo^`u(zZ z(9;5V3V5b7>QI$<2l~&QUC@7Sg#m(1!d4twAm)#5dEgMh#b7|`Ht%cZJZkDiJYKBd zUw!+;s|1`gaNhq>Q*YyGqjl&`X{Fx@XRAA4Ev{etaz|&mQ^x0x8{#8S@t+0=_ZLBr zx*-E~mV(zQZ-2n55%Cq1j0Ha{WpGZ)xdmo8BZnltm~d4w*-9Ymas-ueubR(g6BV)> zx*y(NtD@1Q>YDe~X=BL~;RR5su2}pv-E`hw;6m6^3f}wEz^h{!h z(c|t_#U0fH%2VZ5XSxo*=D>BgxT;Bt@Kr$PreHfaCgA%4d*;LX1WD}G0sMG>{^(JS zVe1kn9ePQ2{c>FM{BQI%1(d)!Ngd$oFEgXHM>L$D3f6|9=)_{40YFZKFCm~~LELt( z6$E1FWo-93KP3RtNYFBH@9P-Qbz(M#1k(R$T$KfP;S+h`SDBN8`fGZq8tMW1RVuK} z?+PY-m=v)l)+R3Wbm#5S+S1mx`-}S~8cSj!N(Ll0-OQI!O?|L)jMW}dq*B1ZZ1#=m zPnuN-CGDsx1&pd*N$CA!o*}GXa!ZCZKqOEL#~VqtYgjrAtl_A(mpRxPp8#h__%M9H zY4$Ur#sAeYkjN{4$I&qn{Jg>q!_lbuTKJILE;4z!$X1P7Vy0Q*LuPdlZ@0EN7fa)0 zAn0>?b)x^I1jVg z>A;!ja>%SFX!U?mJxKe^EuFZkk{~O{K%2f$)Jojn;TY9ei2OXQHZOQ~pBT59FstJ? z27I`WG>cDS#@Rnr)A`+W_+F=FyIh->Kde^nk*XRmg+lJWe3@!iBvVIx%X%3d_Frp_ kY7WfJlnjK;WG9I=hJ1C{+inluM?d>L$Hl!3#Iw)*3pthmasU7T literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/cloud_islands/continent/e.nbt b/src/main/resources/data/unicopia/structures/cloud_islands/continent/e.nbt new file mode 100644 index 0000000000000000000000000000000000000000..2a395b973ef13be0eac18fc00b366906eeaaeb56 GIT binary patch literal 24230 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/cloud_islands/continent/f.nbt b/src/main/resources/data/unicopia/structures/cloud_islands/continent/f.nbt new file mode 100644 index 0000000000000000000000000000000000000000..4756ff6d7498d0a6d31828906693b9b8aa4170d8 GIT binary patch literal 16045 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/cloud_islands/surfaces/surface_1.nbt b/src/main/resources/data/unicopia/structures/cloud_islands/surfaces/surface_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..0bec5ff5923523066090acfe1104c3ae36eeea12 GIT binary patch literal 827 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 Ur#)Y;%D?n~f6@5$P7MYI0PSQXqyPW_ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/worldgen/structure/cloud_continent.json b/src/main/resources/data/unicopia/worldgen/structure/cloud_continent.json new file mode 100644 index 00000000..4f127ea1 --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/structure/cloud_continent.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:jigsaw", + "biomes": "#minecraft:is_overworld", + "max_distance_from_center": 80, + "project_start_to_heightmap": "WORLD_SURFACE_WG", + "size": 6, + "spawn_overrides": {}, + "start_height": { + "absolute": 180 + }, + "start_pool": "unicopia:cloud_island/large/b", + "step": "surface_structures", + "terrain_adaptation": "none", + "use_expansion_hack": true +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/structure_set/clouds.json b/src/main/resources/data/unicopia/worldgen/structure_set/clouds.json index a610968c..e0ec0876 100644 --- a/src/main/resources/data/unicopia/worldgen/structure_set/clouds.json +++ b/src/main/resources/data/unicopia/worldgen/structure_set/clouds.json @@ -13,6 +13,10 @@ { "structure": "unicopia:floating_island", "weight": 1 + }, + { + "structure": "unicopia:cloud_continent", + "weight": 5 } ] } \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/a.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/a.json new file mode 100644 index 00000000..79e09506 --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/a.json @@ -0,0 +1,14 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/continent/a", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/b.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/b.json new file mode 100644 index 00000000..cddbf2ff --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/b.json @@ -0,0 +1,14 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/continent/b", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/c.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/c.json new file mode 100644 index 00000000..aeb20c28 --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/c.json @@ -0,0 +1,14 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/continent/c", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/d.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/d.json new file mode 100644 index 00000000..c4871c78 --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/d.json @@ -0,0 +1,14 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/continent/d", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/e.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/e.json new file mode 100644 index 00000000..e1126c4b --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/e.json @@ -0,0 +1,14 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/continent/e", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/f.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/f.json new file mode 100644 index 00000000..a59eb06e --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/f.json @@ -0,0 +1,14 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/continent/f", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/g.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/g.json new file mode 100644 index 00000000..e389a898 --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/g.json @@ -0,0 +1,14 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/continent/g", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_islands/blobs.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_islands/blobs.json new file mode 100644 index 00000000..36e4ec55 --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_islands/blobs.json @@ -0,0 +1,14 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/blobs/blob_1", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/cloud_islands/surfaces.json b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_islands/surfaces.json new file mode 100644 index 00000000..07eeb051 --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/template_pool/cloud_islands/surfaces.json @@ -0,0 +1,32 @@ +{ + "elements": [ + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/surfaces/surface_1", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/surfaces/surface_2", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:cloud_islands/surfaces/surface_3", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json b/src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json index 9dbe3814..5aa3ca94 100644 --- a/src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json +++ b/src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json @@ -32,50 +32,6 @@ "projection": "rigid" }, "weight": 1 - }, - { - "element": { - "element_type": "minecraft:single_pool_element", - "location": "unicopia:clouds/pillars/pillar_1", - "processors": { - "processors": [] - }, - "projection": "rigid" - }, - "weight": 1 - }, - { - "element": { - "element_type": "minecraft:single_pool_element", - "location": "unicopia:clouds/pillars/pillar_2", - "processors": { - "processors": [] - }, - "projection": "rigid" - }, - "weight": 2 - }, - { - "element": { - "element_type": "minecraft:single_pool_element", - "location": "unicopia:clouds/pillars/pillar_3", - "processors": { - "processors": [] - }, - "projection": "rigid" - }, - "weight": 4 - }, - { - "element": { - "element_type": "minecraft:single_pool_element", - "location": "unicopia:clouds/pillars/pillar_4", - "processors": { - "processors": [] - }, - "projection": "rigid" - }, - "weight": 1 } ], "fallback": "minecraft:empty" From e4c76e979d2b2acc3d22c3be568235e0a085cc8f Mon Sep 17 00:00:00 2001 From: LingVarr <104311317+LingVarr@users.noreply.github.com> Date: Mon, 6 Nov 2023 04:54:34 +1100 Subject: [PATCH 24/90] Update ru_ru.json (not only) (#209) Update ru_ru.json --- HOW_TO_PLAY_RU.md | 2 +- .../resources/assets/unicopia/lang/ru_ru.json | 128 +++++++++++++++++- 2 files changed, 124 insertions(+), 6 deletions(-) diff --git a/HOW_TO_PLAY_RU.md b/HOW_TO_PLAY_RU.md index 6905272e..03ec7251 100644 --- a/HOW_TO_PLAY_RU.md +++ b/HOW_TO_PLAY_RU.md @@ -72,7 +72,7 @@ - Захват бурь - Дайте пегасу облако, и у него будет вода на день, дайте пегасу банку, и он поймает облака и устроит дождь на всё лето. + Дайте пегасу облако, и у него будет вода на день, дайте пегасу банку, и он поймает облако и устроит дождь на всё лето. Кажется, так гласит поговорка? Так вот, с помощью банок можно собрать дождь в банку во время грозы. Это позволит и остановить дождь, и сохранить погоду в банке для последующего использования. diff --git a/src/main/resources/assets/unicopia/lang/ru_ru.json b/src/main/resources/assets/unicopia/lang/ru_ru.json index ac299b9d..7ea1b685 100644 --- a/src/main/resources/assets/unicopia/lang/ru_ru.json +++ b/src/main/resources/assets/unicopia/lang/ru_ru.json @@ -10,6 +10,10 @@ "ability.unicopia.indoors": "Я не вижу отсюда неба", "ability.unicopia.too_low": "Мне нужно подняться повыше", "ability.unicopia.clear_skies": "Небо и так выглядит довольно чистым", + "ability.unicopia.too_calm.1": "Мне нужно разозлиться...", + "ability.unicopia.too_calm.2": "Я не чувствую злости...", + "ability.unicopia.too_calm.3": "У Брюса это выглядело проще...", + "ability.unicopia.too_calm.4": "Селестия, дай мне силы...", "itemGroup.unicopia.items": "Unicopia", "itemGroup.unicopia.foraging": "Unicopia - Корм", @@ -47,6 +51,7 @@ "item.unicopia.earth_badge": "Эмблема земного пони", "item.unicopia.changeling_badge": "Эмблема чейнджлинга", "item.unicopia.bat_badge": "Эмблема бэтпони", + "item.unicopia.kirin_badge": "Эмблема киринов", "item.unicopia.butterfly_spawn_egg": "Яйцо призыва бабочки", "item.unicopia.butterfly": "Бабочка", @@ -70,6 +75,10 @@ "item.unicopia.lightning_jar": "Молния в банке", "item.unicopia.zap_apple_jam_jar": "Джем из зап-яблока", + "item.unicopia.toast": "Тост", + "item.unicopia.burned_toast": "Подгоревший тост", + "item.unicopia.jam_toast": "Тост с зап-яблочным джемом", + "item.unicopia.crystal_heart": "Кристальное сердце", "item.unicopia.crystal_shard": "Осколок кристалла", "item.unicopia.dragon_breath_scroll": "Свиток дыхания дракона", @@ -95,11 +104,15 @@ "item.unicopia.sunglasses": "Солнцезащитные очки", "item.unicopia.broken_sunglasses": "Сломанные солнцезащитные очки", + "item.unicopia.carapace": "Панцырь", + "item.unicopia.pebbles": "Галька", "item.unicopia.rock": "Камень", "item.unicopia.weird_rock": "Странный камень", "item.unicopia.tom": "Том", - "item.unicopia.rock_stew": "Рагу из камня", + "item.unicopia.rock_stew": "Каменное рагу", + "item.unicopia.rock_candy": "Каменная конфета", + "item.unicopia.salt_cube": "Кубик соли", "item.unicopia.pinecone": "Шишка", "item.unicopia.acorn": "Жёлудь", "item.unicopia.green_apple_seeds": "Семена яблони Гренни Смит", @@ -107,6 +120,7 @@ "item.unicopia.sour_apple_seeds": "Семена кислой яблони", "item.unicopia.apple_pie_hoof": "Яблочный пирог с отпечатком копыта", "item.unicopia.apple_pie_slice": "Кусочек яблочного пирога", + "item.unicopia.candied_apple": "Засахаренное яблоко", "item.unicopia.oats": "Овёс", "item.unicopia.imported_oats": "Шикарный импортный овёс", @@ -116,6 +130,7 @@ "item.unicopia.hay_burger": "Сенобургер", "item.unicopia.hay_fries": "Картофель фри", "item.unicopia.crispy_hay_fries": "Хрустящий картофель фри", + "item.unicopia.horse_shoe_fries": "Подкова из картофеля фри", "item.unicopia.wheat_worms": "Пшеничные черви", "item.unicopia.muffin": "Маффин", @@ -126,6 +141,13 @@ "item.unicopia.alicorn_amulet": "Амулет аликорна", "item.unicopia.alicorn_amulet.lore": "Время ношения: %d", + "item.unicopia.horse_shoe.accuracy": "Точность: %d%%", + "item.unicopia.horse_shoe.speed": "Скорость: %d", + "item.unicopia.iron_horse_shoe": "Железная подкова", + "item.unicopia.golden_horse_shoe": "Золотая подкова", + "item.unicopia.copper_horse_shoe": "Медная подкова", + "item.unicopia.netherite_horse_shoe": "Незеритовая подкова", + "item.unicopia.broken_alicorn_amulet": "Сломанный амулет аликорна", "item.unicopia.unicorn_amulet": "Амулет единорога", "item.unicopia.unicorn_amulet.lore": "Наделяет носящего магическими способностями", @@ -154,6 +176,14 @@ "item.unicopia.music_disc_funk": "Пластинка", "item.unicopia.music_disc_funk.desc": "Фанк, просто фанк", + "item.unicopia.apple_bed_sheets": "Apple Patterned Bed Sheets", + "item.unicopia.barred_bed_sheets": "Bar Patterned Bed Sheets", + "item.unicopia.blue_bed_sheets": "Blue Bed Sheets", + "item.unicopia.checkered_bed_sheets": "Checker Patterned Bed Sheets", + "item.unicopia.orange_bed_sheets": "Orange Bed Sheets", + "item.unicopia.pink_bed_sheets": "Pink Bed Sheets", + "item.unicopia.rainbow_bed_sheets": "Rainbow Patterned Bed Sheets", + "block.unicopia.rocks": "Камни", "block.unicopia.bananas": "Бананы", "block.unicopia.zapling": "Саженец зап-яблони", @@ -199,6 +229,41 @@ "block.unicopia.sour_apple_sapling": "Саженец кислой яблони", "block.unicopia.sour_apple_sprout": "Росток кислой яблони", + "block.unicopia.surface_chitin": "Поверхностный хитин", + "block.unicopia.mysterious_egg": "Загадочное яйцо", + "block.unicopia.hive": "Улей", + "block.unicopia.slime_pustule": "Пустула со слизью", + "block.unicopia.chitin": "Хитиновый блок", + "block.unicopia.chitin_spikes": "Хитиновые шипы", + "block.unicopia.chiselled_chitin": "Резной хитиновый блок", + "block.unicopia.chiselled_chitin_hull": "Резной хитиновый остов", + "block.unicopia.chiselled_chitin_slab": "Резная хитиновая плита", + "block.unicopia.chiselled_chitin_stairs": "Резные хитиновые ступеньки", + + "block.unicopia.cloud": "Облако", + "block.unicopia.cloud_slab": "Плита из облака", + "block.unicopia.cloud_stairs": "Ступеньки из облака", + "block.unicopia.compacted_cloud": "Облако", + "block.unicopia.soggy_cloud": "Мокрое облако", + "block.unicopia.soggy_cloud_slab": "Плита из мокрого облака", + "block.unicopia.soggy_cloud_stairs": "Ступеньки из мокрого блока", + "block.unicopia.cloud_planks": "Облачные доски", + "block.unicopia.cloud_plank_slab": "Плита из облачных досок", + "block.unicopia.cloud_plank_stairs": "Ступеньки из облачных досок", + "block.unicopia.cloud_bricks": "Кирпичный блок из облака", + "block.unicopia.cloud_brick_slab": "Плита из облачных кирпичей", + "block.unicopia.cloud_brick_stairs": "Ступеньки из облачных кирпичей", + "block.unicopia.carved_cloud": "Резное облако", + "block.unicopia.compacted_cloud_bricks": "Кирпичный блок из облака", + "block.unicopia.compacted_cloud_planks": "Облачные доски", + "block.unicopia.unstable_cloud": "Нестабильное облако", + "block.unicopia.dense_cloud": "Плотное облако", + "block.unicopia.dense_cloud_slab": "Плита из плотного облака", + "block.unicopia.dense_cloud_stairs": "Ступеньки из плотного облака", + "block.unicopia.cloud_pillar": "Колонна из облака", + "block.unicopia.cloth_bed": "Кровать из шикарной ткани", + "block.unicopia.cloud_bed": "Кровать из облака", + "block.unicopia.oats": "Овёс", "block.unicopia.oats_stem": "Овёс", "block.unicopia.oats_crown": "Овёс", @@ -259,6 +324,12 @@ "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_bat": "Туманное зелье метаморфоз бэтпони", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_bat": "Стрела метаморфоз бэтпони", + "effect.unicopia.change_race_kirin": "Метаморфозы кирина", + "item.minecraft.potion.effect.unicopia.tribe_swap_kirin": "Зелье метаморфоз кирина", + "item.minecraft.splash_potion.effect.unicopia.tribe_swap_kirin": "Взрывное зелье метаморфоз кирина", + "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_kirin": "Туманное зелье метаморфоз кирина", + "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_kirin": "Стрела метаморфоз кирина", + "potion.potency.6": "VII", "spell.unicopia.frost": "Заморозка", @@ -369,6 +440,11 @@ "ability.unicopia.cast.with_spell.active": "Наложение \"%s\"", "ability.unicopia.cast.with_spell.hand": "Наложение \"%s\" с руки", "ability.unicopia.cast.with_spell.replacing": "Заменить \"%s\" на \"%s\"", + "ability.unicopia.kirin_cast": "Наложить заклинание", + "ability.unicopia.kirin_cast.with_spell": "Наложить \"%s\"", + "ability.unicopia.kirin_cast.with_spell.active": "Наложение \"%s\"", + "ability.unicopia.kirin_cast.with_spell.hand": "Наложение \"%s\" с руки", + "ability.unicopia.kirin_cast.with_spell.replacing": "Заменить \"%s\" на \"%s\"", "ability.unicopia.dispell": "Рассеять магию", "ability.unicopia.teleport": "Телепорт", "ability.unicopia.teleport.far": "Телепорт (далеко)", @@ -377,6 +453,7 @@ "ability.unicopia.grow": "Удобрить землю", "ability.unicopia.stomp": "Удар по земле", "ability.unicopia.kick": "Сокрушительный удар", + "ability.unicopia.hug": "Обнять", "ability.unicopia.pummel": "Сокрушительный удар", "ability.unicopia.carry": "Поднять/Высадить пассажира", "ability.unicopia.toggle_flight": "Взлететь/Приземлиться", @@ -387,6 +464,8 @@ "ability.unicopia.capture_cloud": "Захватить облако", "ability.unicopia.disguise": "Изменить форму", "ability.unicopia.rainboom": "Звуковая радуга", + "ability.unicopia.rage": "Ярость", + "ability.unicopia.nirik_blast": "Заряд нирика", "gui.unicopia.trait.label": "Элемент %s", "gui.unicopia.trait.group": "\n %s", @@ -417,7 +496,8 @@ "gui.unicopia.tribe_selection.describe.unicopia.unicorn": "Присоединитесь к племени единорогов, овладейте магическими искусствами", "gui.unicopia.tribe_selection.describe.unicopia.pegasus": "Присоединяйтесь к племени пегасов, парите вместе с Вондерболтами", "gui.unicopia.tribe_selection.describe.unicopia.bat": "Присоединяйтесь к племени бэтпони, станьте самой темной ночью", - "gui.unicopia.tribe_selection.describe.unicopia.changeling": "Присоединяйтесь к улью чейнджлингов, ваша королева требует этого", + "gui.unicopia.tribe_selection.describe.unicopia.kirin": "Присоединяйтесь к Деревне Киринов, дайте обет молчания", + "gui.unicopia.tribe_selection.describe.unicopia.changeling": "Присоединяйтесь к Улью Чейнджлингов, ваша королева требует этого", "gui.unicopia.tribe_selection.confirm": "Вы выбрали племя \"%s\"", "gui.unicopia.tribe_selection.confirm.goods": "%s имеют следующие преимущества:", @@ -450,6 +530,12 @@ "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.changeling": " - Могут летать и зависать на месте", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.changeling": " - Перевоплощаются практически в кого и что угодно", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.changeling": " - Плотоядны. Могут есть всё, от чего не тошнит", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.changeling": "", + + "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.kirin": " - Невосприимчивы ко всем видам огненного урона", + "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.kirin": " - Могут открыть способность ярости, получая урон", + "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.kirin": " - В обычном состоянии бесшумны и могут спокойно ходить рядом с Хранителем", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.kirin": " - Могут есть фрукты и овощи, мясо и некоторые виды кормов, обычно ядовитые для других", "gui.unicopia.tribe_selection.confirm.bads": "но они...", @@ -481,6 +567,11 @@ "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.changeling": " - Становятся больными от обычной пищи и должны питаться любовью, чтобы ускорить излечение", "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.changeling": "", + "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.kirin": " - Теряют свою бесшумность в состоянии ярости", + "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.kirin": " - Поджигают вещи, особенно когда близки к ярости", + "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.kirin": " - Легче, чем другие пони, и сильнее оттакливаются", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.kirin": " - Не любят воду", + "gui.unicopia.tribe_selection.join": "Присоединиться", "gui.unicopia.tribe_selection.cancel": "Назад", @@ -704,24 +795,35 @@ "unicopia.race.changeling.alt": "Чейнджлинги", "unicopia.race.bat": "Бэтпони", "unicopia.race.bat.alt": "Бэтпони", + "unicopia.race.kirin": "Кирин", + "unicopia.race.kirin.alt": "Кирины", "death.attack.unicopia.generic.and_also": "%1$s и %2$s", "death.attack.unicopia.generic.whilst_flying": "%1$s во время полёта", "death.attack.unicopia.tribe_swap": "%1$s был перерождён в другое племя", + "death.attack.unicopia.tribe_swap.self": "%1$s обрёк себя на перерождение в другое племя", "death.attack.unicopia.tribe_swap.player": "%1$s был обречён на перерождение в другое племя %2$s", "death.attack.unicopia.sun": "%1$ уставился на солнце", + "death.attack.unicopia.sun.self": "%1$s уставился на солнце", "death.attack.unicopia.sun.player": "%1$s уставился на солнце пока боролся с %2$s", "death.attack.unicopia.sunlight": "%1$s был сожжён солнцем", + "death.attack.unicopia.sunlight.self": "%1$s был сожжён солнцем", "death.attack.unicopia.sunlight.player": "%1$s был сожжён солнцем пока боролся с %2$s", "death.attack.unicopia.petrified": "%1$s превратился в камень", + "death.attack.unicopia.petrified.self": "%1$s превратился в камень", "death.attack.unicopia.petrified.player": "%1$s превратился в камень пока боролся с %2$s", "death.attack.unicopia.magical_exhaustion": "%1$s исчерпал себя", + "death.attack.unicopia.magical_exhaustion.self": "%1$s исчерпал себя", "death.attack.unicopia.magical_exhaustion.player": "%1$s исчерпал себя пока боролся с %2$s", "death.attack.unicopia.alicorn_amulet": "%1$s был сведён с ума", + "death.attack.unicopia.alicorn_amulet.self": "%1$s свёл себя с ума", "death.attack.unicopia.alicorn_amulet.player": "%1$s сошёл с ума пока боролся с %2$s", "death.attack.unicopia.darkness": "%1$s пропал без вести", - "death.attack.unicopia.love_draining": "%1$s был лишён всего живого", - "death.attack.unicopia.love_draining.player": "%1$s умер, чтобы накормить %2$s", + "death.attack.unicopia.darkness.self": "%1$s пропал без вести", + "death.attack.unicopia.darkness.player": "%1$s пропал без вести пока боролся с %2$s", + "death.attack.unicopia.love_draining": "%1$s был лишён всей любви", + "death.attack.unicopia.love_draining.self": "%1$s лишил себя всей своей любви", + "death.attack.unicopia.love_draining.player": "%2$s лишил %1$s всей любви", "death.attack.unicopia.life_draining": "%1$s был лишён всего живого", "death.attack.unicopia.life_draining.self": "%1$s был убит своим собственным заклинанием", "death.attack.unicopia.life_draining.player": "%1$s был убит заклинанием, созданным %2$s", @@ -734,22 +836,30 @@ "death.attack.unicopia.gravity_well_recoil.item": "%1$s превращён в спагетти заклинанием, созданным %2$s с помощью %3$s", "death.attack.unicopia.gravity_well_recoil.self": "%1$ произнёс заклинание, которое превратило его в спагетти", "death.attack.unicopia.smash": "%1$s был раздавлен копытом", + "death.attack.unicopia.smash.self": "%1$s раздавил себя копытом", "death.attack.unicopia.smash.player": "%1$s был раздавлен %2$s", "death.attack.unicopia.zap": "%1$s укусил зап-яблоко", + "death.attack.unicopia.zap.self": "%1$s укусил зап-яблоко", "death.attack.unicopia.zap.player": "%1$s укусил зап-яблоко пока боролся с %2$s", "death.attack.unicopia.paradox": "%1$s взорвался", + "death.attack.unicopia.paradox.self": "%1$s взорвал самого себя", "death.attack.unicopia.paradox.player": "%1$s взорвался с некоторой помощью %2$s", "death.attack.unicopia.food_poisoning": "%1$s умер от пищевого отравления", + "death.attack.unicopia.food_poisoning.self": "%1$s умер от пищевого отравления", "death.attack.unicopia.food_poisoning.player": "%2$s отравил %1$s до смерти", "death.attack.unicopia.black_hole": "%1$s был засосан в чёрную дыру", + "death.attack.unicopia.black_hole.self": "%1$s был засосан в чёрную дыру", "death.attack.unicopia.black_hole.player": "%1$s засосало в чёрную дыру %2$s", "death.attack.unicopia.kick": "%1$s был пнут очень сильно", + "death.attack.unicopia.kick.self": "%1$s пнул себя очень сильно", "death.attack.unicopia.kick.player": "%2$s очень сильно пнул %1$s", "death.attack.unicopia.steamroller": "%1$s был расплющен", + "death.attack.unicopia.steamroller.self": "%1$s был расплющен", "death.attack.unicopia.steamroller.player": "%2$s рассправился с %1$s", "death.attack.unicopia.stalagmite.pegasus": "%1$s пытался устроиться на сталагмите", - "death.attack.unicopia.stalagmite.pegasus.player": "%1$s влетел в сталагмит во время боя с %2$s", + "death.attack.unicopia.stalagmite.pegasus.player": "%1$s влетел в сталагмит пока боролся %2$s", "death.attack.unicopia.rock": "%1$s был избит", + "death.attack.unicopia.rock.self": "%1$s был избит", "death.attack.unicopia.rock.item": "%1$s был избит %2$s используя %3$s", "death.attack.unicopia.rock.player": "%1$s был избит %2$s", @@ -831,6 +941,8 @@ "unicopia.subtitle.item.alicorn_amulet.ambient": "Гул амулета Аликорна", "unicopia.subtitle.item.apple.rot": "Яблоко гниёт", "unicopia.subtitle.item.bracelet.sign": "Подписание браслета", + "unicopia.subtitle.block.chitin.ambience": "Трещание", + "unicopia.subtitle.block.slime_pustule.pop": "Пустула со слизью разбивается", "unicopia.subtitle.spell.cast.fail": "Заклинание не удалось", "unicopia.subtitle.spell.cast.success": "Заклинание накладывается", "unicopia.subtitle.spell.cast.shoot": "Единорог стреляет", @@ -882,6 +994,12 @@ "advancements.unicopia.apple_route.description": "Начните свой путь к яблоку легенды", "advancements.unicopia.juice.title": "Освежающий", "advancements.unicopia.juice.description": "Наконец-то нашлось применение всем этим яблокам", + "advancements.unicopia.toast.title": "Он хрустящий и вкусный!", + "advancements.unicopia.toast.description": "Сделать тостового компаньона", + "advancements.unicopia.burned_toast.title": "Тости НЕЕЕЕЕЕЕТ!", + "advancements.unicopia.burned_toast.description": "Поджарь Тости", + "advancements.unicopia.lucky.title": "Как на ТВ", + "advancements.unicopia.lucky.description": "Сделать несколько счастливых подков из картофеля фри", "advancements.unicopia.sweet_apple_acres.title": "Яблочная Аллея", "advancements.unicopia.sweet_apple_acres.description": "Получите по одному яблоку каждого сорта", "advancements.unicopia.brew_cider.title": "Лучшее от Эпплджек", From 8b286986500c4c784b3c79b0c5c4090dbe0568c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A8=AA=E5=88=80=E5=A4=A9=E7=AC=91=EF=BC=88Knife=20smile?= =?UTF-8?q?=EF=BC=89?= <131762804+Cryghast@users.noreply.github.com> Date: Mon, 6 Nov 2023 01:56:02 +0800 Subject: [PATCH 25/90] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B1=89=E5=8C=96=20(#?= =?UTF-8?q?210)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/assets/unicopia/lang/zh_cn.json | 120 ++++++++++++++++-- 1 file changed, 112 insertions(+), 8 deletions(-) diff --git a/src/main/resources/assets/unicopia/lang/zh_cn.json b/src/main/resources/assets/unicopia/lang/zh_cn.json index df5bb1d6..0a69a685 100644 --- a/src/main/resources/assets/unicopia/lang/zh_cn.json +++ b/src/main/resources/assets/unicopia/lang/zh_cn.json @@ -10,6 +10,10 @@ "ability.unicopia.indoors": "这里看不见天空", "ability.unicopia.too_low": "我得再走高点", "ability.unicopia.clear_skies": "天空已经很干净了", + "ability.unicopia.too_calm.1": "我得更生气一点……", + "ability.unicopia.too_calm.2": "我不觉得生气……", + "ability.unicopia.too_calm.3": "布鲁斯这样做的时候看起来挺轻松的……", + "ability.unicopia.too_calm.4": "大公主予我力量……", "itemGroup.unicopia.items": "奇幻小马国 - 综合", "itemGroup.unicopia.foraging": "奇幻小马国 - 觅食", @@ -47,6 +51,7 @@ "item.unicopia.earth_badge": "陆马徽章", "item.unicopia.changeling_badge": "幻形灵徽章", "item.unicopia.bat_badge": "夜骐徽章", + "item.unicopia.kirin_badge": "麒麟徽章", "item.unicopia.butterfly_spawn_egg": "蝴蝶刷怪蛋", "item.unicopia.butterfly": "蝴蝶", @@ -70,6 +75,10 @@ "item.unicopia.lightning_jar": "罐中 闪电", "item.unicopia.zap_apple_jam_jar": "魔虹苹果酱", + "item.unicopia.toast": "烤面包", + "item.unicopia.burned_toast": "烤焦的面包", + "item.unicopia.jam_toast": "蘸了魔虹苹果酱的烤面包", + "item.unicopia.crystal_heart": "水晶之心", "item.unicopia.crystal_shard": "水晶碎片", "item.unicopia.dragon_breath_scroll": "龙息卷轴", @@ -95,10 +104,14 @@ "item.unicopia.sunglasses": "墨镜", "item.unicopia.broken_sunglasses": "损坏的墨镜", + "item.unicopia.carapace": "甲壳", + "item.unicopia.pebbles": "石籽", "item.unicopia.rock": "石块", "item.unicopia.weird_rock": "怪石块", "item.unicopia.rock_stew": "炖石头", + "item.unicopia.rock_candy": "石头糖", + "item.unicopia.salt_cube": "盐块", "item.unicopia.pinecone": "松果", "item.unicopia.acorn": "橡子", "item.unicopia.green_apple_seeds": "史密斯婆婆苹果的种子", @@ -106,7 +119,8 @@ "item.unicopia.sour_apple_seeds": "酸苹果的种子", "item.unicopia.apple_pie_hoof": "蹄印苹果派", "item.unicopia.apple_pie_slice": "一片苹果派", - + "item.unicopia.candied_apple": "苹果蜜饯", + "item.unicopia.oats": "燕麦", "item.unicopia.imported_oats": "高档进口燕麦", "item.unicopia.oatmeal": "燕麦粥", @@ -115,6 +129,7 @@ "item.unicopia.hay_burger": "干草堡", "item.unicopia.hay_fries": "炸草条", "item.unicopia.crispy_hay_fries": "酥脆炸草条", + "item.unicopia.horse_shoe_fries": "炸蹄铁", "item.unicopia.wheat_worms": "小麦虫", "item.unicopia.muffin": "马芬", @@ -125,6 +140,13 @@ "item.unicopia.alicorn_amulet": "天角兽护符", "item.unicopia.alicorn_amulet.lore": "老化度: %d", + "item.unicopia.horse_shoe.accuracy": "精准度%d%%", + "item.unicopia.horse_shoe.speed": "速度:%d", + "item.unicopia.iron_horse_shoe": "铁蹄铁", + "item.unicopia.golden_horse_shoe": "金蹄铁", + "item.unicopia.copper_horse_shoe": "铜蹄铁", + "item.unicopia.netherite_horse_shoe": "下界合金蹄铁", + "item.unicopia.broken_alicorn_amulet": "损坏的天角兽护符", "item.unicopia.unicorn_amulet": "独角兽护符", "item.unicopia.unicorn_amulet.lore": "让穿戴者拥有使用魔法的能力", @@ -198,6 +220,35 @@ "block.unicopia.sour_apple_sapling": "酸苹果树树苗", "block.unicopia.sour_apple_sprout": "酸苹果树嫩芽", + "block.unicopia.surface_chitin": "几丁质表面", + "block.unicopia.mysterious_egg": "奇怪的蛋", + "block.unicopia.hive": "蜂巢", + "block.unicopia.slime_pustule": "黏液泡", + "block.unicopia.chitin": "几丁质块", + "block.unicopia.chitin_spikes": "几丁质尖刺", + "block.unicopia.chiselled_chitin": "雕纹几丁质块", + "block.unicopia.chiselled_chitin_hull": "雕纹几丁质船体", + "block.unicopia.chiselled_chitin_slab": "雕纹几丁质台阶", + "block.unicopia.chiselled_chitin_stairs": "雕纹几丁质楼梯", + + "block.unicopia.cloud": "浮云", + "block.unicopia.cloud_slab": "云台阶", + "block.unicopia.cloud_stairs": "云楼梯", + "block.unicopia.compacted_cloud": "云方块", + "block.unicopia.soggy_cloud": "潮湿的云方块", + "block.unicopia.soggy_cloud_slab": "潮湿的云台阶", + "block.unicopia.soggy_cloud_stairs": "潮湿的云楼梯", + "block.unicopia.cloud_planks": "浮云板", + "block.unicopia.cloud_planks_slab": "云板台阶", + "block.unicopia.cloud_planks_stairs": "云板楼梯", + "block.unicopia.compacted_cloud_planks": "云板", + "block.unicopia.unstable_cloud": "不稳定的云", + "block.unicopia.dense_cloud": "稠云", + "block.unicopia.dense_cloud_slab": "稠云台阶", + "block.unicopia.dense_cloud_stairs": "稠云楼梯", + "block.unicopia.cloud_pillar": "云柱块", + "block.unicopia.cloud_bed": "云床", + "block.unicopia.oats": "燕麦", "block.unicopia.oats_stem": "燕麦", "block.unicopia.oats_crown": "燕麦", @@ -258,6 +309,12 @@ "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_bat": "滞留型转生夜骐药水", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_bat": "转生夜骐之箭", + "effect.unicopia.change_race_kirin": "转生麒麟", + "item.minecraft.potion.effect.unicopia.tribe_swap_kirin": "转生麒麟药水", + "item.minecraft.splash_potion.effect.unicopia.tribe_swap_kirin": "喷溅型转生麒麟药水", + "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_kirin": "滞留型转生麒麟药水", + "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_kirin": "转生麒麟之箭", + "potion.potency.6": "VII", "spell.unicopia.frost": "霜冻", @@ -358,7 +415,7 @@ "toxicity.severe.name": "剧毒", "toxicity.lethal.name": "致命", - "ability.unicopia.shoot": "发射能量", + "ability.unicopia.shoot": "发射魔法", "ability.unicopia.shoot.with_spell": "发射 %s 魔咒", "ability.unicopia.shoot.with_spell.active": "正在发射 %s 魔咒", "ability.unicopia.shoot.with_spell.hand": "手持发射 %s 魔咒", @@ -368,6 +425,11 @@ "ability.unicopia.cast.with_spell.active": "正在原地施放 %s 魔咒", "ability.unicopia.cast.with_spell.hand": "手持原地施放 %s 魔咒", "ability.unicopia.cast.with_spell.replacing": "%s 魔咒已暂存,将优先原地施放 %s 魔咒", + "ability.unicopia.kirin_cast": "原地施放魔法", + "ability.unicopia.kirin_cast.with_spell": "原地施放 %s 魔咒", + "ability.unicopia.kirin_cast.with_spell.active": "正在原地施放 %s 魔咒", + "ability.unicopia.kirin_cast.with_spell.hand": "手持原地施放 %s 魔咒", + "ability.unicopia.kirin_cast.with_spell.replacing": "%s 魔咒已暂存,将优先原地施放 %s 魔咒", "ability.unicopia.dispell": "解除魔法", "ability.unicopia.teleport": "瞬移", "ability.unicopia.teleport.far": "瞬移(穿墙)", @@ -376,6 +438,7 @@ "ability.unicopia.grow": "滋养土地", "ability.unicopia.stomp": "击打地面", "ability.unicopia.kick": "尥蹶子", + "ability.unicopia.hug": "拥抱", "ability.unicopia.pummel": "重蹄出击", "ability.unicopia.carry": "抱起/放下 乘客", "ability.unicopia.toggle_flight": "起飞/降落", @@ -386,6 +449,8 @@ "ability.unicopia.capture_cloud": "捕获云朵", "ability.unicopia.disguise": "变形", "ability.unicopia.rainboom": "彩虹音爆", + "ability.unicopia.rage": "发火", + "ability.unicopia.nirik_blast": "逆麟", "gui.unicopia.trait.label": "%s 元素", "gui.unicopia.trait.group": "\n %s", @@ -416,6 +481,7 @@ "gui.unicopia.tribe_selection.describe.unicopia.unicorn": "加入独角兽族,精通高阶魔法", "gui.unicopia.tribe_selection.describe.unicopia.pegasus": "加入天马族,与闪电天马一起翱翔", "gui.unicopia.tribe_selection.describe.unicopia.bat": "加入夜骐族,成为最黑暗的夜晚", + "gui.unicopia.tribe_selection.describe.unicopia.kirin": "加入麒麟村,遵循沉默的誓言", "gui.unicopia.tribe_selection.describe.unicopia.changeling": "加入幻形灵蜂巢,你的女王需要你", "gui.unicopia.tribe_selection.confirm": "您已选择 %s", @@ -449,7 +515,13 @@ "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.changeling": " - 能够在原地飞行和悬停", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.changeling": " - 几乎能变形成任何生物或任何物体", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.changeling": " - 是肉食性的。可以吃任何不会让它们生病的东西", - + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.changeling": "", + + "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.kirin": " - 免疫一切火焰伤害", + "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.kirin": " - 受到伤害后可以发怒", + "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.kirin": " - 正常情况下很安静,可以在监守者周围自由行动", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.kirin": " - 可以吃水果和蔬菜,红肉,以及一些对其他种族来说有毒的食物", + "gui.unicopia.tribe_selection.confirm.bads": "但它们……", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.human": " - 没有任何魔法能力", @@ -479,7 +551,12 @@ "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.changeling": " - 需要爱,从小马或其它敌对生物那里收集来充饥", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.changeling": " - 吃普通食物会生病,必须汲取爱来加速治愈", "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.changeling": "", - + + "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.kirin": " - 发怒时就没那么沉默了", + "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.kirin": " - 容易使东西燃起来,发怒时更是如此", + "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.kirin": " - 比其他小马轻,更有可能被击退", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.kirin": " - 不喜欢水", + "gui.unicopia.tribe_selection.join": "加入种族", "gui.unicopia.tribe_selection.cancel": "返回", @@ -703,52 +780,71 @@ "unicopia.race.changeling.alt": "幻形灵", "unicopia.race.bat": "夜骐", "unicopia.race.bat.alt": "夜骐", - + "unicopia.race.kirin": "Kirin", + "unicopia.race.kirin.alt": "Kirins", + "death.attack.unicopia.generic.and_also": "%1$s 和 %2$s", "death.attack.unicopia.generic.whilst_flying": "%1$s而死于飞行途中", "death.attack.unicopia.tribe_swap": "%1$s 以另一个物种重生了", - "death.attack.unicopia.tribe_swap.player": "%1$s 注定要被 %2$s 变成另一个物种", + "death.attack.unicopia.tribe_swap.self": "%1$s 被自己变成了另一个物种", + "death.attack.unicopia.tribe_swap.player": "%1$s 被 %2$s 变成了另一个物种", "death.attack.unicopia.sun": "%1$s 直视了太阳", + "death.attack.unicopia.sun.self": "%1$s 直视了太阳", "death.attack.unicopia.sun.player": "%1$s 攻击 %2$s 时不小心直视了太阳 ", "death.attack.unicopia.sunlight": "%1$s 被太阳晒成了灰", + "death.attack.unicopia.sunlight.self": "%1$s 被太阳晒成了灰", "death.attack.unicopia.sunlight.player": "%1$s 在攻击 %2$s 时被太阳晒成了灰", "death.attack.unicopia.petrified": "%1$s 石化了", + "death.attack.unicopia.petrified.self": "%1$s 石化了", "death.attack.unicopia.petrified.player": "%1$s 在攻击 %2$s 时石化了", "death.attack.unicopia.magical_exhaustion": "%1$s 透支了精力", + "death.attack.unicopia.magical_exhaustion.self": "%1$s 透支了精力", "death.attack.unicopia.magical_exhaustion.player": "%1$s 在攻击 %2$s 时透支了精力", - "death.attack.unicopia.alicorn_amulet": "%1$s 发疯了", + "death.attack.unicopia.alicorn_amulet": "%1$s 被逼疯了", + "death.attack.unicopia.alicorn_amulet.self": "%1$s 自己把自己逼疯了", "death.attack.unicopia.alicorn_amulet.player": "%1$s 在攻击 %2$s 时发疯了", "death.attack.unicopia.darkness": "%1$s 消失不见了", + "death.attack.unicopia.darkness.self": "%1$s 消失不见了", + "death.attack.unicopia.darkness.player": "%1$s 在攻击 %2$s 时消失不见了", "death.attack.unicopia.love_draining": "%1$s 的爱被抽干了", + "death.attack.unicopia.love_draining.self": "%1$s 耗尽了自己所有的爱", "death.attack.unicopia.love_draining.player": "%1$s 的爱被 %2$s 抽干了", "death.attack.unicopia.life_draining": "%1$s 被吸干了", "death.attack.unicopia.life_draining.self": "%1$s 被自己的魔咒杀死了", "death.attack.unicopia.life_draining.player": "%1$s 被 %2$s 施放的魔咒杀死了", "death.attack.unicopia.bat_screech": "%1$s 吓到了", + "death.attack.unicopia.bat_screech.self": "%1$s 吓到了自己", "death.attack.unicopia.bat_screech.player": "%2$s 吓到了 %1$s", "death.attack.unicopia.bat_screech.item": "%1$s 被 %2$s 用 %3$s 吓到了", - "death.attack.unicopia.bat_screech.self": "%1$s 吓到了自己", "death.attack.unicopia.gravity_well_recoil": "%1$s 被拉成了意大利面条", "death.attack.unicopia.gravity_well_recoil.player": "%1$s 被 %2$s 施放的魔咒拉成了意大利面条", "death.attack.unicopia.gravity_well_recoil.item": "%1$s 被 %2$s 用 %3$s 施放的魔咒拉成了意大利面条", "death.attack.unicopia.gravity_well_recoil.self": "%1$s 把自己拉成了意大利面条", "death.attack.unicopia.smash": "%1$s 被铁蹄压扁了", + "death.attack.unicopia.smash.self": "%1$s 让自己被铁蹄压扁了", "death.attack.unicopia.smash.player": "%1$s 被 %2$s 的铁蹄压扁了", "death.attack.unicopia.zap": "%1$s 咬向了魔虹苹果", + "death.attack.unicopia.zap.self": "%1$s 咬向了魔虹苹果", "death.attack.unicopia.zap.player": "%1$s 在攻击 %2$s 时咬向了魔虹苹果", "death.attack.unicopia.paradox": "%1$s 自爆了", + "death.attack.unicopia.paradox.self": "%1$s 自行爆了", "death.attack.unicopia.paradox.player": "%1$s 在 %2$s 的帮助下自爆了", "death.attack.unicopia.food_poisoning": "%1$s 死于食物中毒", + "death.attack.unicopia.food_poisoning.self": "%1$s 死于食物中毒", "death.attack.unicopia.food_poisoning.player": "%2$s 毒死了 %1$s", "death.attack.unicopia.black_hole": "%1$s 被吸进了黑洞里", + "death.attack.unicopia.black_hole.self": "%1$s 被吸进了黑洞里", "death.attack.unicopia.black_hole.player": "%1$s 被吸进了 %2$s 制造的黑洞里", "death.attack.unicopia.kick": "%1$s 被踢得太狠", + "death.attack.unicopia.kick.self": "%1$s 被自己踢得太狠", "death.attack.unicopia.kick.player": "%2$s 踢 %1$s 时踢太狠了", "death.attack.unicopia.steamroller": "%1$s 被轧平了", + "death.attack.unicopia.steamroller.self": "%1$s 被轧平了", "death.attack.unicopia.steamroller.player": "%2$s 轧平了 %1$s ", "death.attack.unicopia.stalagmite.pegasus": "%1$s 试图降落在石笋上", "death.attack.unicopia.stalagmite.pegasus.player": "%1$s 在攻击 %2$s 时落在了石笋上", "death.attack.unicopia.rock": "%1$s 被击中了", + "death.attack.unicopia.rock.self": "%1$s 被击中了", "death.attack.unicopia.rock.item": "%1$s 被 %2$s 用 %3$s 击中了", "death.attack.unicopia.rock.player": "%1$s 被 %2$s 击中了", @@ -830,6 +926,8 @@ "unicopia.subtitle.item.alicorn_amulet.ambient": "天角兽护符 低鸣", "unicopia.subtitle.item.apple.rot": "苹果馊掉", "unicopia.subtitle.item.bracelet.sign": "在手环上签名", + "unicopia.subtitle.block.chitin.ambience": "飞溅", + "unicopia.subtitle.block.slime_pustule.pop": "黏液泡破掉", "unicopia.subtitle.spell.cast.fail": "魔咒施展失败", "unicopia.subtitle.spell.cast.success": "魔咒施展", "unicopia.subtitle.spell.cast.shoot": "独角发射", @@ -881,6 +979,12 @@ "advancements.unicopia.apple_route.description": "向传奇苹果进军", "advancements.unicopia.juice.title": "神清气爽", "advancements.unicopia.juice.description": "那些苹果终于有用处了", + "advancements.unicopia.toast.title": "又脆又美味!", + "advancements.unicopia.toast.description": "面包伴我行", + "advancements.unicopia.burned_toast.title": "面包,不!", + "advancements.unicopia.burned_toast.description": "烤过火了", + "advancements.unicopia.lucky.title": "和电视上一样", + "advancements.unicopia.lucky.description": "制作一些幸运炸蹄铁", "advancements.unicopia.sweet_apple_acres.title": "甜苹果园", "advancements.unicopia.sweet_apple_acres.description": "收集每一种苹果", "advancements.unicopia.brew_cider.title": "AJ家的特产", From 1cf6beafdc1f01f9aab78898a0e2a541f8acebc1 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 5 Nov 2023 21:40:49 +0000 Subject: [PATCH 26/90] Fix storm clouds moving too quickly fix logic for when they're above the world limit --- .../unicopia/entity/mob/StormCloudEntity.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java index 828b2593..e8f7a04f 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java @@ -20,6 +20,7 @@ import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; @@ -135,10 +136,13 @@ public class StormCloudEntity extends Entity implements MagicImmune { } if (isLogicalSideForUpdatingMovement()) { - float groundY = getWorld().getTopY(Type.MOTION_BLOCKING_NO_LEAVES, (int)getX(), (int)getZ()); - float cloudY = (float)getY() - (isStormy() ? STORMY_TARGET_ALTITUDE : CLEAR_TARGET_ALTITUDE); + float groundY = findSurfaceBelow(getWorld(), getBlockPos()).getY(); + float targetY = isStormy() ? STORMY_TARGET_ALTITUDE : CLEAR_TARGET_ALTITUDE; + float cloudY = (float)getY() - targetY; - addVelocity(0, 0.03F * (groundY - cloudY), 0); + System.out.println("Ground Y: " + groundY + ", TargetY: " + targetY + ", Stormy: " + isStormy()); + + addVelocity(0, 0.0003F * (groundY - cloudY), 0); if (!cursed && !isStormy()) { Vec3d wind = WeatherConditions.get(getWorld()).getWindDirection(); @@ -264,7 +268,7 @@ public class StormCloudEntity extends Entity implements MagicImmune { public static BlockPos findSurfaceBelow(World world, BlockPos pos) { BlockPos.Mutable mutable = new BlockPos.Mutable(); mutable.set(pos); - while (world.isInBuildLimit(mutable) && world.isAir(mutable)) { + while (mutable.getY() > world.getBottomY() && world.isAir(mutable)) { mutable.move(Direction.DOWN); } while (world.isInBuildLimit(mutable) && !world.isAir(mutable)) { @@ -348,7 +352,9 @@ public class StormCloudEntity extends Entity implements MagicImmune { public void readCustomDataFromNbt(NbtCompound nbt) { setStormTicks(nbt.getInt("stormTicks")); setClearTicks(nbt.getInt("clearTicks")); - setSize(currentSize = nbt.getFloat("size")); + if (nbt.contains("size", NbtElement.FLOAT_TYPE)) { + setSize(currentSize = nbt.getFloat("size")); + } cursed = nbt.getBoolean("cursed"); phase = nbt.getInt("phase"); nextPhase = nbt.getInt("nextPhase"); From 3a9978a6b16896bffe1b640f24c1800db09b69d8 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 5 Nov 2023 21:41:25 +0000 Subject: [PATCH 27/90] Add storm clouds to the spawn list in cloud continents (assuming this works) --- .../worldgen/structure/cloud_continent.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/resources/data/unicopia/worldgen/structure/cloud_continent.json b/src/main/resources/data/unicopia/worldgen/structure/cloud_continent.json index 4f127ea1..8651ff36 100644 --- a/src/main/resources/data/unicopia/worldgen/structure/cloud_continent.json +++ b/src/main/resources/data/unicopia/worldgen/structure/cloud_continent.json @@ -4,7 +4,19 @@ "max_distance_from_center": 80, "project_start_to_heightmap": "WORLD_SURFACE_WG", "size": 6, - "spawn_overrides": {}, + "spawn_overrides": { + "ambient": { + "bounding_box": "full", + "spawns": [ + { + "type": "unicopia:storm_cloud", + "weight": 3, + "minCount": 2, + "maxCount": 8 + } + ] + } + }, "start_height": { "absolute": 180 }, From 16b90e208b91b532c80a430ace890be12c6818ed Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 5 Nov 2023 22:31:50 +0000 Subject: [PATCH 28/90] Added more ways of getting cloud lumps --- .../unicopia/entity/mob/StormCloudEntity.java | 80 +++++++++++++++++-- .../loot_tables/entities/storm_cloud.json | 34 ++++++++ .../data/unicopia/recipes/cloud_lump.json | 7 ++ .../data/unicopia/tags/items/cloud_jars.json | 7 ++ 4 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/data/unicopia/loot_tables/entities/storm_cloud.json create mode 100644 src/main/resources/data/unicopia/recipes/cloud_lump.json create mode 100644 src/main/resources/data/unicopia/tags/items/cloud_jars.json diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java index e8f7a04f..d7f1054f 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/StormCloudEntity.java @@ -6,30 +6,42 @@ import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; +import com.minelittlepony.unicopia.EquineContext; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.entity.MagicImmune; import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.server.world.WeatherConditions; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityStatuses; import net.minecraft.entity.EntityType; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.LightningEntity; import net.minecraft.entity.boss.ServerBossBar; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.damage.DamageTypes; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContextParameterSet; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.loot.context.LootContextTypes; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; +import net.minecraft.particle.ParticleTypes; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.GameRules; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.World; @@ -140,8 +152,6 @@ public class StormCloudEntity extends Entity implements MagicImmune { float targetY = isStormy() ? STORMY_TARGET_ALTITUDE : CLEAR_TARGET_ALTITUDE; float cloudY = (float)getY() - targetY; - System.out.println("Ground Y: " + groundY + ", TargetY: " + targetY + ", Stormy: " + isStormy()); - addVelocity(0, 0.0003F * (groundY - cloudY), 0); if (!cursed && !isStormy()) { @@ -293,10 +303,46 @@ public class StormCloudEntity extends Entity implements MagicImmune { } @Override - public void onDamaged(DamageSource damageSource) { - if (random.nextInt(35) == 0) { - split(2 + random.nextInt(4)); + public boolean damage(DamageSource source, float amount) { + super.damage(source, amount); + if (!cursed) { + if (random.nextInt(35) == 0 || (source.isOf(DamageTypes.PLAYER_ATTACK) && EquineContext.of(source.getAttacker()).collidesWithClouds())) { + if (getSize(1) < 2) { + if (!getWorld().isClient() && getWorld().getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) { + Identifier identifier = getType().getLootTableId(); + LootContextParameterSet.Builder builder = new LootContextParameterSet.Builder((ServerWorld)this.getWorld()) + .add(LootContextParameters.THIS_ENTITY, this) + .add(LootContextParameters.ORIGIN, this.getPos()) + .add(LootContextParameters.DAMAGE_SOURCE, source) + .addOptional(LootContextParameters.KILLER_ENTITY, source.getAttacker()) + .addOptional(LootContextParameters.DIRECT_KILLER_ENTITY, source.getSource()); + if (source.getAttacker() instanceof PlayerEntity player) { + builder = builder.add(LootContextParameters.LAST_DAMAGE_PLAYER, player).luck(player.getLuck()); + } + getWorld().getServer().getLootManager().getLootTable(identifier) + .generateLoot(builder.build(LootContextTypes.ENTITY), 0L, this::dropStack); + } + kill(); + getWorld().sendEntityStatus(this, EntityStatuses.ADD_DEATH_PARTICLES); + } else { + split(2 + random.nextInt(4)); + } + } } + return false; + } + + @Override + @Nullable + public ItemEntity dropStack(ItemStack stack) { + stack = stack.copy(); + while (!stack.isEmpty()) { + ItemEntity drop = super.dropStack(stack.split(1)); + if (drop != null) { + drop.addVelocity(random.nextTriangular(0, 0.3), 0, random.nextTriangular(0, 0.3)); + } + } + return null; } public void split(int splitCount) { @@ -326,7 +372,29 @@ public class StormCloudEntity extends Entity implements MagicImmune { @Override public void handleStatus(byte status) { - super.handleStatus(status); + switch (status) { + case EntityStatuses.ADD_DEATH_PARTICLES: + for (int i = 0; i < 20; ++i) { + double d = random.nextGaussian() * 0.02; + double e = random.nextGaussian() * 0.02; + double f = random.nextGaussian() * 0.02; + getWorld().addParticle(ParticleTypes.POOF, getParticleX(1), getRandomBodyY(), getParticleZ(1), d, e, f); + } + break; + default: + super.handleStatus(status); + } + + } + + @Override + public boolean canBeHitByProjectile() { + return false; + } + + @Override + public final boolean canHit() { + return true; } private ServerBossBar getBossBar() { diff --git a/src/main/resources/data/unicopia/loot_tables/entities/storm_cloud.json b/src/main/resources/data/unicopia/loot_tables/entities/storm_cloud.json new file mode 100644 index 00000000..8d599d1a --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/entities/storm_cloud.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "rolls": 1, + "bonus_rolls": 0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 6.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:looting_enchant", + "count": { + "type": "minecraft:uniform", + "min": 0.0, + "max": 1.0 + } + } + ], + "name": "unicopia:cloud_lump" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/cloud_lump.json b/src/main/resources/data/unicopia/recipes/cloud_lump.json new file mode 100644 index 00000000..6174a53f --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/cloud_lump.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { "tag": "cloud_jars" } + ], + "result": { "item": "unicopia:cloud_lump", "count": 4 } +} diff --git a/src/main/resources/data/unicopia/tags/items/cloud_jars.json b/src/main/resources/data/unicopia/tags/items/cloud_jars.json new file mode 100644 index 00000000..3dad874d --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/cloud_jars.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "unicopia:rain_cloud_jar", + "unicopia:storm_cloud_jar" + ] +} From 034cc77808360202b40d59b4bec2ae2bacd1056c Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 7 Nov 2023 15:42:20 +0000 Subject: [PATCH 29/90] Fixed block ghosting when loading a world --- .../com/minelittlepony/unicopia/block/cloud/CloudBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java index 812f157a..0ceebaaf 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java @@ -59,7 +59,7 @@ public class CloudBlock extends Block { entity.handleFallDamage(fallDistance, 0, world.getDamageSources().fall()); generateSurfaceParticles(world, state, pos, ShapeContext.absent(), 9); - if (fallDistance > 7) { + if (!world.isClient && fallDistance > 7) { world.breakBlock(pos, true); } } From 53c16416c011cfd62f0341cf69968cac39bc9ea0 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 7 Nov 2023 15:42:55 +0000 Subject: [PATCH 30/90] Fixed cloud lump recipe --- .../advancements/recipes/cloud_lump.json | 30 +++++++++++++++++++ .../data/unicopia/recipes/cloud_lump.json | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/data/unicopia/advancements/recipes/cloud_lump.json diff --git a/src/main/resources/data/unicopia/advancements/recipes/cloud_lump.json b/src/main/resources/data/unicopia/advancements/recipes/cloud_lump.json new file mode 100644 index 00000000..39ec6b06 --- /dev/null +++ b/src/main/resources/data/unicopia/advancements/recipes/cloud_lump.json @@ -0,0 +1,30 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "unicopia:cloud_lump" + ] + }, + "criteria": { + "has_ingredients": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { "tag": "unicopia:cloud_jars" } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "unicopia:cloud_lump" + } + } + }, + "requirements": [ + [ + "has_ingredients", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/cloud_lump.json b/src/main/resources/data/unicopia/recipes/cloud_lump.json index 6174a53f..6890547d 100644 --- a/src/main/resources/data/unicopia/recipes/cloud_lump.json +++ b/src/main/resources/data/unicopia/recipes/cloud_lump.json @@ -1,7 +1,7 @@ { "type": "minecraft:crafting_shapeless", "ingredients": [ - { "tag": "cloud_jars" } + { "tag": "unicopia:cloud_jars" } ], "result": { "item": "unicopia:cloud_lump", "count": 4 } } From a2238640ddd1d3951bc1d6d823c857754a241125 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 7 Nov 2023 15:43:16 +0000 Subject: [PATCH 31/90] Fixed the burn toast advancement name and description --- src/main/resources/assets/unicopia/lang/en_us.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 9cf54e20..8017b7e3 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -1010,8 +1010,8 @@ "advancements.unicopia.juice.description": "Finally a use for all these apples", "advancements.unicopia.toast.title": "He Crispy and delicious!", "advancements.unicopia.toast.description": "Make a toasted companion", - "advancements.unicopia.burned_toast.title": "Toasty NOOOOOOO!", - "advancements.unicopia.burned_toast.description": "Burn Toasty", + "advancements.unicopia.burn_toast.title": "Toasty NOOOOOOO!", + "advancements.unicopia.burn_toast.description": "Burn Toasty", "advancements.unicopia.lucky.title": "As seen on TV", "advancements.unicopia.lucky.description": "Make some lucky horse shoe fries", "advancements.unicopia.sweet_apple_acres.title": "Sweet Apple Acres", From ca8cf8371ae4a4fc8beeb23a613a280fb9c45a54 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 7 Nov 2023 18:20:04 +0000 Subject: [PATCH 32/90] Changelings can now untransform by using their ability on something they've already transformed into --- .../unicopia/ability/ChangelingDisguiseAbility.java | 13 +++++++++---- .../unicopia/entity/behaviour/Disguise.java | 4 ++++ .../unicopia/entity/behaviour/EntityAppearance.java | 4 ++++ .../unicopia/entity/behaviour/EntityBehaviour.java | 4 ++++ .../entity/behaviour/FallingBlockBehaviour.java | 5 +++++ .../unicopia/entity/behaviour/PlayerBehaviour.java | 7 ++++++- 6 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java index 33a67ac0..6f3e2c60 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java @@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; +import com.minelittlepony.unicopia.entity.behaviour.Disguise; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.mixin.MixinFallingBlockEntity; import com.minelittlepony.unicopia.particle.UParticles; @@ -50,9 +51,13 @@ public class ChangelingDisguiseAbility extends ChangelingFeedAbility { player.getEntityWorld().playSound(null, player.getBlockPos(), USounds.ENTITY_PLAYER_CHANGELING_TRANSFORM, SoundCategory.PLAYERS, 1.4F, 0.4F); - iplayer.getSpellSlot().get(SpellType.CHANGELING_DISGUISE, true) - .orElseGet(() -> SpellType.CHANGELING_DISGUISE.withTraits().apply(iplayer, CastingMethod.INNATE)) - .setDisguise(looked); + Disguise currentDisguise = iplayer.getSpellSlot().get(SpellType.CHANGELING_DISGUISE, true) + .orElseGet(() -> SpellType.CHANGELING_DISGUISE.withTraits().apply(iplayer, CastingMethod.INNATE)); + + if (currentDisguise.isOf(looked)) { + looked = null; + } + currentDisguise.setDisguise(looked); if (!player.isCreative()) { iplayer.getMagicalReserves().getMana().multiply(0.1F); @@ -65,7 +70,7 @@ public class ChangelingDisguiseAbility extends ChangelingFeedAbility { @Override public void warmUp(Pony player, AbilitySlot slot) { - player.getMagicalReserves().getEnergy().add(20); + player.getMagicalReserves().getEnergy().add(2F); player.spawnParticles(UParticles.CHANGELING_MAGIC, 5); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Disguise.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Disguise.java index 56ecd0eb..272cde97 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Disguise.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/Disguise.java @@ -46,6 +46,10 @@ public interface Disguise extends FlightType.Provider, PlayerDimensions.Provider return getAppearance().flatMap(d -> d.getTargetDimensions(player)); } + default boolean isOf(@Nullable Entity entity) { + return getDisguise().isOf(entity); + } + default Disguise setDisguise(@Nullable Entity entity) { if (entity == getDisguise().getAppearance()) { entity = null; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java index edad3ecb..15c8fee6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityAppearance.java @@ -109,6 +109,10 @@ public class EntityAppearance implements NbtSerialisable, PlayerDimensions.Provi return entity != null; } + public boolean isOf(@Nullable Entity entity) { + return isPresent() && entity != null && EntityBehaviour.forEntity(this.entity).isEqual(this.entity, entity); + } + public NbtCompound getOrCreateTag() { if (tag == null) { tag = new NbtCompound(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java index 189ee33d..b37e06df 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/EntityBehaviour.java @@ -74,6 +74,10 @@ public class EntityBehaviour { entity.remove(RemovalReason.KILLED); } + public boolean isEqual(T a, Entity b) { + return a.getType() == b.getType(); + } + public Optional getCameraDistance(Entity entity, Pony player) { if (entity == null) { return Optional.empty(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/FallingBlockBehaviour.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/FallingBlockBehaviour.java index bc3fafd2..b9d440a4 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/FallingBlockBehaviour.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/FallingBlockBehaviour.java @@ -53,6 +53,11 @@ public class FallingBlockBehaviour extends EntityBehaviour { } } + @Override + public boolean isEqual(FallingBlockEntity a, Entity b) { + return b instanceof FallingBlockEntity f && f.getBlockState() == a.getBlockState(); + } + private FallingBlockEntity configure(FallingBlockEntity entity, Block block) { if (block instanceof MixinFallingBlock) { ((MixinFallingBlock)block).invokeConfigureFallingBlockEntity(entity); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/PlayerBehaviour.java b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/PlayerBehaviour.java index 612153bc..489248e6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/behaviour/PlayerBehaviour.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/behaviour/PlayerBehaviour.java @@ -4,6 +4,7 @@ import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.duck.*; import com.minelittlepony.unicopia.entity.player.Pony; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; public class PlayerBehaviour extends EntityBehaviour { @@ -29,8 +30,12 @@ public class PlayerBehaviour extends EntityBehaviour { entity.setSwimming(source.asEntity().isSwimming()); } if (source.asEntity() instanceof LivingEntityDuck duck) { - // TODO: CopyAngles duck.copyLeaningAnglesFrom(((LivingEntityDuck)entity)); } } + + @Override + public boolean isEqual(PlayerEntity a, Entity b) { + return b instanceof PlayerEntity p && p.getUuid().equals(b.getUuid()); + } } From a5c7a5e3a6512dc3f418f7cf0b439eb1ef3b9cf9 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 7 Nov 2023 18:20:41 +0000 Subject: [PATCH 33/90] Added some farming bonuses for Earth Ponies --- .../ability/EarthPonyGrowAbility.java | 23 ++- .../unicopia/block/ThornBlock.java | 151 ++++++++++++++++++ .../unicopia/block/ThornBudBlock.java | 116 ++++++++++++++ .../unicopia/block/UBlocks.java | 5 +- .../unicopia/client/URenderers.java | 1 + .../render/entity/LootBugEntityRenderer.java | 28 ++++ .../unicopia/entity/mob/LootBugEntity.java | 22 +++ .../unicopia/entity/mob/UEntities.java | 6 +- .../minelittlepony/unicopia/item/UItems.java | 3 +- .../unicopia/blockstates/plunder_vine.json | 128 +++++++++++++++ .../blockstates/plunder_vine_bud.json | 10 ++ .../models/block/plunder_vine_branch.json | 75 +++++++++ .../models/block/plunder_vine_branch_2.json | 75 +++++++++ .../models/block/plunder_vine_branch_3.json | 75 +++++++++ .../models/block/plunder_vine_branch_4.json | 75 +++++++++ .../models/block/plunder_vine_bud.json | 145 +++++++++++++++++ .../models/item/loot_bug_spawn_egg.json | 3 + .../unicopia/textures/block/plunder_leaf.png | Bin 0 -> 7251 bytes .../unicopia/textures/block/plunder_vine.png | Bin 0 -> 222 bytes .../entity/bed/sheets/original_cyan.png | Bin 0 -> 5842 bytes .../entity/bed/sheets/original_pink.png | Bin 0 -> 5948 bytes .../entity/bed/sheets/original_purple.png | Bin 0 -> 6253 bytes .../entity/bed/sheets/original_yellow.png | Bin 0 -> 5525 bytes .../unicopia/textures/entity/loot_bug.png | Bin 0 -> 5610 bytes .../loot_tables/blocks/plunder_vine.json | 42 +++++ .../loot_tables/entities/loot_bug.json | 87 ++++++++++ .../tags/items/loot_bug_high_value_drops.json | 28 ++++ 27 files changed, 1093 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/block/ThornBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/block/ThornBudBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/client/render/entity/LootBugEntityRenderer.java create mode 100644 src/main/java/com/minelittlepony/unicopia/entity/mob/LootBugEntity.java create mode 100644 src/main/resources/assets/unicopia/blockstates/plunder_vine.json create mode 100644 src/main/resources/assets/unicopia/blockstates/plunder_vine_bud.json create mode 100644 src/main/resources/assets/unicopia/models/block/plunder_vine_branch.json create mode 100644 src/main/resources/assets/unicopia/models/block/plunder_vine_branch_2.json create mode 100644 src/main/resources/assets/unicopia/models/block/plunder_vine_branch_3.json create mode 100644 src/main/resources/assets/unicopia/models/block/plunder_vine_branch_4.json create mode 100644 src/main/resources/assets/unicopia/models/block/plunder_vine_bud.json create mode 100644 src/main/resources/assets/unicopia/models/item/loot_bug_spawn_egg.json create mode 100644 src/main/resources/assets/unicopia/textures/block/plunder_leaf.png create mode 100644 src/main/resources/assets/unicopia/textures/block/plunder_vine.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/original_cyan.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/original_pink.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/original_purple.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/original_yellow.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/loot_bug.png create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/plunder_vine.json create mode 100644 src/main/resources/data/unicopia/loot_tables/entities/loot_bug.json create mode 100644 src/main/resources/data/unicopia/tags/items/loot_bug_high_value_drops.json diff --git a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java index ef901a39..ee82de7d 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java @@ -5,10 +5,12 @@ import java.util.Optional; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Pos; +import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.particle.MagicParticleEffect; import com.minelittlepony.unicopia.util.TraceHelper; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.item.BoneMealItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -71,8 +73,21 @@ public class EarthPonyGrowAbility implements Ability { ItemStack stack = new ItemStack(Items.BONE_MEAL); - if (BoneMealItem.useOnFertilizable(stack, w, pos) - || BoneMealItem.useOnGround(stack, w, pos, Direction.UP)) { + if (state.getBlock() instanceof Growable growable) { + return growable.grow(w, state, pos) ? 1 : 0; + } + + if (BoneMealItem.useOnFertilizable(stack, w, pos)) { + if (w.random.nextInt(350) == 0) { + if (w.getBlockState(pos.down()).isOf(Blocks.FARMLAND)) { + w.setBlockState(pos.down(), Blocks.DIRT.getDefaultState()); + } + w.setBlockState(pos, UBlocks.PLUNDER_VINE_BUD.getDefaultState()); + } + return 1; + } + + if (BoneMealItem.useOnGround(stack, w, pos, Direction.UP)) { return 1; } @@ -92,4 +107,8 @@ public class EarthPonyGrowAbility implements Ability { public void coolDown(Pony player, AbilitySlot slot) { } + + public interface Growable { + boolean grow(World world, BlockState state, BlockPos pos); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/block/ThornBlock.java b/src/main/java/com/minelittlepony/unicopia/block/ThornBlock.java new file mode 100644 index 00000000..a3b6fc32 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/ThornBlock.java @@ -0,0 +1,151 @@ +package com.minelittlepony.unicopia.block; + +import java.util.Collection; +import java.util.function.Supplier; +import com.minelittlepony.unicopia.ability.EarthPonyGrowAbility; +import com.minelittlepony.unicopia.entity.mob.UEntities; +import com.minelittlepony.unicopia.util.VecHelper; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ConnectingBlock; +import net.minecraft.block.Fertilizable; +import net.minecraft.entity.SpawnReason; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.registry.tag.BlockTags; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.IntProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.state.property.Property; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.random.Random; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; + +public class ThornBlock extends ConnectingBlock implements EarthPonyGrowAbility.Growable, Fertilizable { + static final Collection PROPERTIES = FACING_PROPERTIES.values(); + static final DirectionProperty FACING = Properties.FACING; + static final int MAX_DISTANCE = 25; + static final int MAX_AGE = 4; + static final IntProperty DISTANCE = IntProperty.of("distance", 0, MAX_DISTANCE); + static final IntProperty AGE = IntProperty.of("age", 0, MAX_AGE); + + private final Supplier bud; + + public ThornBlock(Settings settings, Supplier bud) { + super(0.125F, settings); + this.bud = bud; + PROPERTIES.forEach(property -> setDefaultState(getDefaultState().with(property, false))); + setDefaultState(getDefaultState() + .with(FACING, Direction.DOWN) + .with(DISTANCE, 0) + .with(AGE, 0) + .with(DOWN, true) + ); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(PROPERTIES.toArray(Property[]::new)); + builder.add(FACING, DISTANCE, AGE); + } + + @Override + @Deprecated + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (state.get(AGE) == MAX_AGE + && random.nextInt(1200) == 0 + && world.isPlayerInRange(pos.getX(), pos.getY(), pos.getZ(), 3)) { + UEntities.LOOT_BUG.spawn(world, pos, SpawnReason.NATURAL); + } + } + + @Override + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (!state.canPlaceAt(world, pos)) { + world.breakBlock(pos, true); + } + } + + @Override + public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + if (state.get(AGE) == MAX_AGE && world.isPlayerInRange(pos.getX(), pos.getY(), pos.getZ(), 3)) { + Vec3d particlePos = pos.toCenterPos().add(VecHelper.supply(() -> random.nextTriangular(0, 0.5))); + world.addImportantParticle(ParticleTypes.ASH, particlePos.x, particlePos.y, particlePos.z, 0, 0, 0); + } + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (direction == state.get(FACING) && !state.canPlaceAt(world, pos)) { + world.scheduleBlockTick(pos, this, 1); + } + return state; + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + Direction facing = state.get(FACING); + BlockState neighborState = world.getBlockState(pos.offset(facing)); + return (facing == Direction.DOWN && state.get(DISTANCE) == 0 && neighborState.isIn(BlockTags.DIRT)) + || neighborState.isOf(this) + || neighborState.isOf(bud.get()); + } + + @Override + public boolean grow(World world, BlockState state, BlockPos pos) { + if (state.get(DISTANCE) >= MAX_DISTANCE) { + return false; + } + + world.setBlockState(pos, state.with(AGE, Math.min(state.get(AGE) + 1, MAX_AGE))); + return FACING_PROPERTIES.keySet().stream() + .filter(direction -> isConnected(state, world.getBlockState(pos.offset(direction)), direction)) + .map(direction -> { + BlockPos p = pos.offset(direction); + BlockState s = world.getBlockState(p); + if (s.isAir()) { + // sprout a new branch for cut off nodes + world.setBlockState(p, bud.get().getDefaultState() + .with(FACING, direction.getOpposite()) + .with(DISTANCE, state.get(DISTANCE) + 1) + ); + return true; + } + return ((EarthPonyGrowAbility.Growable)s.getBlock()).grow(world, s, p); + }).reduce(false, Boolean::logicalOr); + } + + @Override + public boolean isFertilizable(WorldView world, BlockPos pos, BlockState state, boolean client) { + return true; + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + grow(world, state, pos); + } + + private boolean isConnected(BlockState state, BlockState neighborState, Direction direction) { + if (!state.get(FACING_PROPERTIES.get(direction))) { + return false; + } + if (neighborState.isAir()) { + return true; + } + return neighborState.getBlock() instanceof EarthPonyGrowAbility.Growable + && (neighborState.isOf(this) || neighborState.isOf(bud.get())) + && neighborState.get(FACING) == direction.getOpposite(); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/ThornBudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/ThornBudBlock.java new file mode 100644 index 00000000..1d99f0d1 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/ThornBudBlock.java @@ -0,0 +1,116 @@ +package com.minelittlepony.unicopia.block; + +import java.util.Optional; +import java.util.stream.Stream; + +import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.ability.EarthPonyGrowAbility; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Fertilizable; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.IntProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.random.Random; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; + +public class ThornBudBlock extends Block implements EarthPonyGrowAbility.Growable, Fertilizable { + static final DirectionProperty FACING = Properties.FACING; + static final int MAX_DISTANCE = 25; + static final IntProperty DISTANCE = IntProperty.of("distance", 0, MAX_DISTANCE); + + private final BlockState branchState; + + public ThornBudBlock(Settings settings, BlockState branchState) { + super(settings); + setDefaultState(getDefaultState().with(FACING, Direction.DOWN).with(DISTANCE, 0)); + this.branchState = branchState; + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(FACING, DISTANCE); + } + + @Override + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (random.nextInt(50) == 0) { + grow(world, state, pos); + } + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (direction == state.get(FACING) && !(neighborState.isOf(this) || neighborState.isOf(branchState.getBlock()))) { + return Blocks.AIR.getDefaultState(); + } + return state; + } + + @Override + public boolean grow(World world, BlockState state, BlockPos pos) { + if (state.get(DISTANCE) >= MAX_DISTANCE) { + return false; + } + return pickGrowthDirection(world, state, pos).map(randomDirection -> { + BlockPos p = pos.offset(randomDirection); + + if (!canReplace(world.getBlockState(p))) { + return false; + } + + world.playSound(null, pos, USounds.Vanilla.ITEM_BONE_MEAL_USE, SoundCategory.BLOCKS); + world.setBlockState(pos, branchState + .with(FACING, state.get(FACING)) + .with(ThornBlock.FACING_PROPERTIES.get(state.get(FACING)), true) + .with(ThornBlock.FACING_PROPERTIES.get(randomDirection), true)); + world.setBlockState(p, getDefaultState() + .with(FACING, randomDirection.getOpposite()) + .with(DISTANCE, state.get(DISTANCE) + 1) + ); + return true; + }).orElse(false); + } + + protected boolean canReplace(BlockState state) { + return state.isReplaceable(); + } + + private static Optional pickGrowthDirection(World world, BlockState state, BlockPos pos) { + Direction excluded = state.get(FACING); + return Util.getRandomOrEmpty(ThornBlock.FACING_PROPERTIES.keySet().stream() + .filter(direction -> direction != excluded) + .flatMap(direction -> getByWeight(direction, excluded)) + .toList(), world.getRandom()); + } + + private static Stream getByWeight(Direction input, Direction excluded) { + return Stream.generate(() -> input) + .limit(input.getAxis() == excluded.getAxis() ? 6L : input.getAxis() == Direction.Axis.Y ? 1L : 3L); + } + + @Override + public boolean isFertilizable(WorldView world, BlockPos pos, BlockState state, boolean client) { + return true; + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + grow(world, state, pos); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index ff33019b..75f82d8e 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -133,6 +133,9 @@ public interface UBlocks { SegmentedCropBlock OATS_STEM = register("oats_stem", OATS.createNext(5)); SegmentedCropBlock OATS_CROWN = register("oats_crown", OATS_STEM.createNext(5)); + Block PLUNDER_VINE = register("plunder_vine", new ThornBlock(Settings.create().mapColor(MapColor.DARK_CRIMSON).hardness(1).ticksRandomly().sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.DESTROY), () -> UBlocks.PLUNDER_VINE_BUD)); + Block PLUNDER_VINE_BUD = register("plunder_vine_bud", new ThornBudBlock(Settings.create().mapColor(MapColor.DARK_CRIMSON).hardness(1).nonOpaque().ticksRandomly().sounds(BlockSoundGroup.GRASS).pistonBehavior(PistonBehavior.DESTROY), PLUNDER_VINE.getDefaultState())); + Block CHITIN = register("chitin", new SnowyBlock(Settings.create().mapColor(MapColor.PALE_PURPLE).hardness(5).requiresTool().ticksRandomly().sounds(BlockSoundGroup.CORAL)), ItemGroups.NATURAL); Block SURFACE_CHITIN = register("surface_chitin", new GrowableBlock(Settings.copy(CHITIN), () -> CHITIN), ItemGroups.NATURAL); Block CHISELLED_CHITIN = register("chiselled_chitin", new Block(Settings.create().mapColor(MapColor.PALE_PURPLE).hardness(5).requiresTool()), ItemGroups.BUILDING_BLOCKS); @@ -218,7 +221,7 @@ public interface UBlocks { StrippableBlockRegistry.register(PALM_LOG, STRIPPED_PALM_LOG); StrippableBlockRegistry.register(ZAP_WOOD, STRIPPED_ZAP_WOOD); StrippableBlockRegistry.register(PALM_WOOD, STRIPPED_PALM_WOOD); - Collections.addAll(TRANSLUCENT_BLOCKS, WEATHER_VANE, CHITIN_SPIKES); + Collections.addAll(TRANSLUCENT_BLOCKS, WEATHER_VANE, CHITIN_SPIKES, PLUNDER_VINE, PLUNDER_VINE_BUD); TintedBlock.REGISTRY.add(PALM_LEAVES); FlammableBlockRegistry.getDefaultInstance().add(GREEN_APPLE_LEAVES, 30, 60); diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index f0c03424..b0e3a716 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -92,6 +92,7 @@ public interface URenderers { EntityRendererRegistry.register(UEntities.STORM_CLOUD, StormCloudEntityRenderer::new); EntityRendererRegistry.register(UEntities.AIR_BALLOON, AirBalloonEntityRenderer::new); EntityRendererRegistry.register(UEntities.FRIENDLY_CREEPER, FriendlyCreeperEntityRenderer::new); + EntityRendererRegistry.register(UEntities.LOOT_BUG, LootBugEntityRenderer::new); BlockEntityRendererFactories.register(UBlockEntities.WEATHER_VANE, WeatherVaneBlockEntityRenderer::new); BlockEntityRendererFactories.register(UBlockEntities.FANCY_BED, CloudBedBlockEntityRenderer::new); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/LootBugEntityRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/LootBugEntityRenderer.java new file mode 100644 index 00000000..b8ffe426 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/LootBugEntityRenderer.java @@ -0,0 +1,28 @@ +package com.minelittlepony.unicopia.client.render.entity; + +import com.minelittlepony.unicopia.Unicopia; + +import net.minecraft.client.render.entity.EntityRendererFactory.Context; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.mob.SilverfishEntity; +import net.minecraft.util.Identifier; +import net.minecraft.client.render.entity.SilverfishEntityRenderer; + +public class LootBugEntityRenderer extends SilverfishEntityRenderer { + private static final Identifier TEXTURE = Unicopia.id("textures/entity/loot_bug.png"); + + public LootBugEntityRenderer(Context context) { + super(context); + } + + @Override + public Identifier getTexture(SilverfishEntity entity) { + return TEXTURE; + } + + @Override + protected void scale(SilverfishEntity entity, MatrixStack matrices, float tickDelta) { + float scale = 2; + matrices.scale(scale, scale, scale); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/LootBugEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/LootBugEntity.java new file mode 100644 index 00000000..1c475e3d --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/LootBugEntity.java @@ -0,0 +1,22 @@ +package com.minelittlepony.unicopia.entity.mob; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.mob.SilverfishEntity; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.world.World; + +public class LootBugEntity extends SilverfishEntity { + public LootBugEntity(EntityType entityType, World world) { + super(entityType, world); + } + + @Override + public void tick() { + super.tick(); + + getWorld().addParticle(ParticleTypes.ELECTRIC_SPARK, + getParticleX(1), this.getEyeY(), getParticleZ(1), + random.nextFloat() - 0.5F, random.nextFloat(), random.nextFloat() - 0.5F + ); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntities.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntities.java index d369e99c..3e4b122b 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntities.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/UEntities.java @@ -46,7 +46,7 @@ public interface UEntities { .trackRangeBlocks(200) .dimensions(EntityDimensions.fixed(0.1F, 0.1F))); EntityType FRIENDLY_CREEPER = register("friendly_creeper", FabricEntityTypeBuilder.create(SpawnGroup.MISC, FriendlyCreeperEntity::new) - .trackRangeBlocks(8) + .trackRangeChunks(8) .dimensions(EntityDimensions.fixed(0.6f, 1.7f)) ); EntityType SPELLBOOK = register("spellbook", FabricEntityTypeBuilder.create(SpawnGroup.MISC, SpellbookEntity::new) @@ -64,6 +64,9 @@ public interface UEntities { EntityType AIR_BALLOON = register("air_balloon", FabricEntityTypeBuilder.create(SpawnGroup.MISC, AirBalloonEntity::new) .trackRangeBlocks(1000) .dimensions(EntityDimensions.changing(2.5F, 0.1F))); + EntityType LOOT_BUG = register("loot_bug", FabricEntityTypeBuilder.create(SpawnGroup.MONSTER, LootBugEntity::new) + .trackRangeChunks(8) + .dimensions(EntityDimensions.fixed(0.8F, 0.6F))); static EntityType register(String name, FabricEntityTypeBuilder builder) { EntityType type = builder.build(); @@ -77,6 +80,7 @@ public interface UEntities { FabricDefaultAttributeRegistry.register(AIR_BALLOON, FlyingEntity.createMobAttributes()); FabricDefaultAttributeRegistry.register(SOMBRA, SombraEntity.createMobAttributes()); FabricDefaultAttributeRegistry.register(FRIENDLY_CREEPER, FriendlyCreeperEntity.createCreeperAttributes()); + FabricDefaultAttributeRegistry.register(LOOT_BUG, LootBugEntity.createSilverfishAttributes()); if (!Unicopia.getConfig().disableButterflySpawning.get()) { final Predicate butterflySpawnable = BiomeSelectors.foundInOverworld() diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 9d52bd7a..011bff35 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -141,7 +141,8 @@ public interface UItems { Item DIAMOND_POLEARM = register("diamond_polearm", new PolearmItem(ToolMaterials.DIAMOND, 2, -3.6F, 5, new Item.Settings()), ItemGroups.COMBAT); Item NETHERITE_POLEARM = register("netherite_polearm", new PolearmItem(ToolMaterials.NETHERITE, 2, -3.6F, 5, new Item.Settings().fireproof()), ItemGroups.COMBAT); - Item BUTTERFLY_SPAWN_EGG = register("butterfly_spawn_egg", new SpawnEggItem(UEntities.BUTTERFLY, 0x222200, 0xaaeeff, new Item.Settings()), ItemGroups.SPAWN_EGGS); + Item LOOT_BUG_SPAWN_EGG = register("loot_bug_spawn_egg", new SpawnEggItem(UEntities.LOOT_BUG, 0x3C9D14, 0xE66F16, new Item.Settings()), ItemGroups.SPAWN_EGGS); + Item BUTTERFLY_SPAWN_EGG = register("butterfly_spawn_egg", new SpawnEggItem(UEntities.BUTTERFLY, 0x222200, 0xAAEEFF, new Item.Settings()), ItemGroups.SPAWN_EGGS); Item BUTTERFLY = register("butterfly", new Item(new Item.Settings().food(UFoodComponents.INSECTS)), ItemGroups.FOOD_AND_DRINK); Item PALM_BOAT = ItemGroupRegistry.register(TerraformBoatItemHelper.registerBoatItem(Unicopia.id("palm_boat"), UWoodTypes.PALM_BOAT_TYPE, false), ItemGroups.FUNCTIONAL); diff --git a/src/main/resources/assets/unicopia/blockstates/plunder_vine.json b/src/main/resources/assets/unicopia/blockstates/plunder_vine.json new file mode 100644 index 00000000..87b7ee61 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/plunder_vine.json @@ -0,0 +1,128 @@ +{ + "multipart": [ + { + "apply": { "model": "unicopia:block/plunder_vine_branch" }, + "when": { "age": 0, "down": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch", "x": 180 }, + "when": { "age": 0, "up": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch", "x": 90 }, + "when": { "age": 0, "south": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch", "x": 90, "y": 90 }, + "when": { "age": 0, "west": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch", "x": 90, "y": 180 }, + "when": { "age": 0, "north": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch", "x": 90, "y": 270 }, + "when": { "age": 0, "east": true } + }, + + { + "apply": { "model": "unicopia:block/plunder_vine_branch_2" }, + "when": { "age": 1, "down": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_2", "x": 180 }, + "when": { "age": 1, "up": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_2", "x": 90 }, + "when": { "age": 1, "south": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_2", "x": 90, "y": 90 }, + "when": { "age": 1, "west": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_2", "x": 90, "y": 180 }, + "when": { "age": 1, "north": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_2", "x": 90, "y": 270 }, + "when": { "age": 1, "east": true } + }, + + { + "apply": { "model": "unicopia:block/plunder_vine_branch_3" }, + "when": { "age": 2, "down": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_3", "x": 180 }, + "when": { "age": 2, "up": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_3", "x": 90 }, + "when": { "age": 2, "south": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_3", "x": 90, "y": 90 }, + "when": { "age": 2, "west": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_3", "x": 90, "y": 180 }, + "when": { "age": 2, "north": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_3", "x": 90, "y": 270 }, + "when": { "age": 2, "east": true } + }, + + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4" }, + "when": { "age": 3, "down": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 180 }, + "when": { "age": 3, "up": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 90 }, + "when": { "age": 3, "south": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 90, "y": 90 }, + "when": { "age": 3, "west": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 90, "y": 180 }, + "when": { "age": 3, "north": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 90, "y": 270 }, + "when": { "age": 3, "east": true } + }, + + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4" }, + "when": { "age": 4, "down": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 180 }, + "when": { "age": 4, "up": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 90 }, + "when": { "age": 4, "south": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 90, "y": 90 }, + "when": { "age": 4, "west": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 90, "y": 180 }, + "when": { "age": 4, "north": true } + }, + { + "apply": { "model": "unicopia:block/plunder_vine_branch_4", "x": 90, "y": 270 }, + "when": { "age": 4, "east": true } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/plunder_vine_bud.json b/src/main/resources/assets/unicopia/blockstates/plunder_vine_bud.json new file mode 100644 index 00000000..bf21be63 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/plunder_vine_bud.json @@ -0,0 +1,10 @@ +{ + "variants": { + "facing=down": { "model": "unicopia:block/plunder_vine_bud" }, + "facing=up": { "model": "unicopia:block/plunder_vine_bud", "x": 180 }, + "facing=south": { "model": "unicopia:block/plunder_vine_bud", "x": 90 }, + "facing=west": { "model": "unicopia:block/plunder_vine_bud", "x": 90, "y": 90 }, + "facing=north": { "model": "unicopia:block/plunder_vine_bud", "x": 90, "y": 180 }, + "facing=east": { "model": "unicopia:block/plunder_vine_bud", "x": 90, "y": 270 } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/plunder_vine_branch.json b/src/main/resources/assets/unicopia/models/block/plunder_vine_branch.json new file mode 100644 index 00000000..0c51be21 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/plunder_vine_branch.json @@ -0,0 +1,75 @@ +{ + "textures": { + "particle": "unicopia:block/plunder_vine", + "stem": "unicopia:block/plunder_vine", + "leaf": "unicopia:block/plunder_leaf" + }, + "elements": [ + { + "from": [7.3, 0, 7.3], + "to": [8.7, 9, 8.7], + "faces": { + "north": {"uv": [0, 2, 2, 11], "texture": "#stem"}, + "east": {"uv": [0, 2, 2, 11], "texture": "#stem"}, + "south": {"uv": [0, 2, 2, 11], "texture": "#stem"}, + "west": {"uv": [0, 2, 2, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [4, 0, 8], + "to": [12, 8, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [4, 5, 8], + "to": [12, 13, 8], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [6, 3.95, 8.1], + "to": [7, 4.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [7, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [6, 6.95, 8.1], + "to": [7, 7.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [7, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 2.35, 10.1], + "to": [8, 3.35, 11.1], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 8]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 5.35, 4.1], + "to": [8, 6.35, 5.1], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 8]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_2.json b/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_2.json new file mode 100644 index 00000000..ce94fc6c --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_2.json @@ -0,0 +1,75 @@ +{ + "textures": { + "particle": "unicopia:block/plunder_vine", + "stem": "unicopia:block/plunder_vine", + "leaf": "unicopia:block/plunder_leaf" + }, + "elements": [ + { + "from": [7, 0, 7], + "to": [9, 9, 9], + "faces": { + "north": {"uv": [0, 2, 2, 11], "texture": "#stem"}, + "east": {"uv": [0, 2, 2, 11], "texture": "#stem"}, + "south": {"uv": [0, 2, 2, 11], "texture": "#stem"}, + "west": {"uv": [0, 2, 2, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [4, 0, 8], + "to": [12, 8, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [4, 5, 8], + "to": [12, 13, 8], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [6, 3.95, 8.1], + "to": [7, 4.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [7, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [6, 6.95, 8.1], + "to": [7, 7.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [7, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 2.35, 10.1], + "to": [8, 3.35, 11.1], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 8]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 5.35, 4.1], + "to": [8, 6.35, 5.1], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 8]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_3.json b/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_3.json new file mode 100644 index 00000000..4aae794e --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_3.json @@ -0,0 +1,75 @@ +{ + "textures": { + "particle": "unicopia:block/plunder_vine", + "stem": "unicopia:block/plunder_vine", + "leaf": "unicopia:block/plunder_leaf" + }, + "elements": [ + { + "from": [6.5, 0, 6.5], + "to": [9.5, 9, 9.5], + "faces": { + "north": {"uv": [0, 2, 4, 11], "texture": "#stem"}, + "east": {"uv": [0, 2, 4, 11], "texture": "#stem"}, + "south": {"uv": [0, 2, 4, 11], "texture": "#stem"}, + "west": {"uv": [0, 2, 4, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [3, 0, 8], + "to": [13, 8, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [3, 5, 8], + "to": [13, 13, 8], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [5.6, 3.95, 8.1], + "to": [6.6, 4.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [6.6, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [6.4, 6.95, 8.1], + "to": [7.4, 7.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [7.4, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 2.35, 10.6], + "to": [8, 3.35, 11.6], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 8.5]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 5.35, 3.8], + "to": [8, 6.35, 4.8], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 7.7]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_4.json b/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_4.json new file mode 100644 index 00000000..d8d8c7d1 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/plunder_vine_branch_4.json @@ -0,0 +1,75 @@ +{ + "textures": { + "particle": "unicopia:block/plunder_vine", + "stem": "unicopia:block/plunder_vine", + "leaf": "unicopia:block/plunder_leaf" + }, + "elements": [ + { + "from": [6, 0, 6], + "to": [10, 9, 10], + "faces": { + "north": {"uv": [0, 2, 4, 11], "texture": "#stem"}, + "east": {"uv": [0, 2, 4, 11], "texture": "#stem"}, + "south": {"uv": [0, 2, 4, 11], "texture": "#stem"}, + "west": {"uv": [0, 2, 4, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [3, 0, 8], + "to": [13, 8, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [3, 5, 8], + "to": [13, 13, 8], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [4.8, 3.95, 8.1], + "to": [5.8, 4.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [5.8, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [7.8, 6.95, 8.1], + "to": [8.8, 7.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [8.8, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 2.35, 11.4], + "to": [8, 3.35, 12.4], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 9.3]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 5.35, 2.9], + "to": [8, 6.35, 3.9], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 6.8]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/plunder_vine_bud.json b/src/main/resources/assets/unicopia/models/block/plunder_vine_bud.json new file mode 100644 index 00000000..9721c814 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/plunder_vine_bud.json @@ -0,0 +1,145 @@ +{ + "textures": { + "particle": "unicopia:block/plunder_vine", + "stem": "unicopia:block/plunder_vine", + "leaf": "unicopia:block/plunder_leaf" + }, + "elements": [ + { + "from": [7.3, 0, 7.3], + "to": [8.7, 5, 8.7], + "faces": { + "north": {"uv": [0, 6, 2, 11], "texture": "#stem"}, + "east": {"uv": [0, 6, 2, 11], "texture": "#stem"}, + "south": {"uv": [0, 6, 2, 11], "texture": "#stem"}, + "west": {"uv": [0, 6, 2, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [7.3, 5, 7.3], + "to": [8.7, 13, 8.7], + "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 5.5, 8]}, + "faces": { + "north": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "east": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "south": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "west": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [7.3, 5, 7.3], + "to": [8.7, 13, 8.7], + "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 5.5, 8]}, + "faces": { + "north": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "east": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "south": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "west": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [7.3, 5, 7.3], + "to": [8.7, 13, 8.7], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 5.5, 8]}, + "faces": { + "north": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "east": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "south": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "west": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [7.3, 5, 7.3], + "to": [8.7, 13, 8.7], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 5.5, 8]}, + "faces": { + "north": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "east": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "south": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "west": {"uv": [0, 3, 2, 11], "texture": "#stem"}, + "up": {"uv": [2, 2, 0, 0], "texture": "#stem"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#stem"} + } + }, + { + "from": [0, 5, 8], + "to": [16, 19, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [8, -0.7, 2], + "to": [8, 10.3, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "east": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [0, 3, 8], + "to": [16, 19, 8], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [2.3, -0.8, 8], + "to": [14.3, 13.2, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#leaf"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#leaf"} + } + }, + { + "from": [6, 3.95, 8.1], + "to": [7, 4.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [7, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [6, 6.95, 8.1], + "to": [7, 7.95, 8.1], + "rotation": {"angle": -45, "axis": "z", "origin": [7, 4, 8]}, + "faces": { + "north": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "south": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 2.35, 10.1], + "to": [8, 3.35, 11.1], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 8]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + }, + { + "from": [8, 5.35, 4.1], + "to": [8, 6.35, 5.1], + "rotation": {"angle": 45, "axis": "x", "origin": [7, 4, 8]}, + "faces": { + "east": {"uv": [2, 0, 3, 1], "texture": "#stem"}, + "west": {"uv": [2, 0, 3, 1], "texture": "#stem"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/loot_bug_spawn_egg.json b/src/main/resources/assets/unicopia/models/item/loot_bug_spawn_egg.json new file mode 100644 index 00000000..d1aaa9d6 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/loot_bug_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/textures/block/plunder_leaf.png b/src/main/resources/assets/unicopia/textures/block/plunder_leaf.png new file mode 100644 index 0000000000000000000000000000000000000000..c39d84e5cf9d3b6865fd2256b62a621a047849e0 GIT binary patch literal 7251 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/original_pink.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/original_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..073cd3e3e49da147b9a8911e449443f83fe4c338 GIT binary patch literal 5948 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/original_purple.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/original_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..66e8a0f259f13315e384abf2decb7eef18d46a77 GIT binary patch literal 6253 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 Q|2GxGcJ+2S;S|39-ztAspa1{> literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/plunder_vine.json b/src/main/resources/data/unicopia/loot_tables/blocks/plunder_vine.json new file mode 100644 index 00000000..857d1f4c --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/plunder_vine.json @@ -0,0 +1,42 @@ +{ + "type": "minecraft:block", + "functions": [ + { + "function": "minecraft:explosion_decay" + } + ], + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:stick" + }, + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:stick" + }, + { + "type": "minecraft:item", + "name": "minecraft:dead_bush" + }, + { + "type": "minecraft:item", + "name": "unicopia:gryphon_feather" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/entities/loot_bug.json b/src/main/resources/data/unicopia/loot_tables/entities/loot_bug.json new file mode 100644 index 00000000..7e8ec0ae --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/entities/loot_bug.json @@ -0,0 +1,87 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "rolls": 11, + "bonus_rolls": 0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 6.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:looting_enchant", + "count": { + "type": "minecraft:uniform", + "min": 0.0, + "max": 3.0 + } + } + ], + "name": "minecraft:gold_nugget" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 6.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:looting_enchant", + "count": { + "type": "minecraft:uniform", + "min": 0.0, + "max": 3.0 + } + } + ], + "name": "minecraft:iron_nugget" + } + ] + }, + { + "rolls": 1, + "bonus_rolls": 0, + "entries": [ + { + "type": "minecraft:tag", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:looting_enchant", + "count": { + "type": "minecraft:uniform", + "min": 0.0, + "max": 6.0 + } + } + ], + "name": "unicopia:loot_bug_high_value_drops", + "expand": true + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/tags/items/loot_bug_high_value_drops.json b/src/main/resources/data/unicopia/tags/items/loot_bug_high_value_drops.json new file mode 100644 index 00000000..38c39b74 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/loot_bug_high_value_drops.json @@ -0,0 +1,28 @@ +{ + "replace": false, + "values": [ + "minecraft:diamond", + "minecraft:gold_nugget", + "minecraft:iron_nugget", + "#c:gold_ingots", + "#c:raw_gold_ores", + "#c:raw_gold_blocks", + "minecraft:golden_apple", + "minecraft:golden_carrot", + "minecraft:golden_boots", + "minecraft:golden_leggings", + "minecraft:golden_chestplate", + "minecraft:golden_helmet", + "minecraft:golden_horse_armor", + "unicopia:golden_horse_shoe", + "minecraft:golden_pickaxe", + "minecraft:golden_axe", + "minecraft:golden_shovel", + "minecraft:golden_sword", + "minecraft:golden_hoe", + "unicopia:golden_polearm", + "unicopia:golden_feather", + "unicopia:golden_wing", + { "id": "farmersdelight:golden_knife", "required": false } + ] +} From 04cefd8961325a36899a9e260f3830a8954b24dc Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 7 Nov 2023 18:21:18 +0000 Subject: [PATCH 34/90] Fix changeling climbing bugs --- .../minelittlepony/unicopia/entity/player/Pony.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 98e99aa4..16d064ba 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -396,13 +396,15 @@ public class Pony extends Living implements Copyable, Update BlockPos climbingPos = entity.getClimbingPos().orElse(null); - if (!getPhysics().isFlying() && !entity.getAbilities().flying && climbingPos != null && getObservedSpecies() == Race.CHANGELING) { + if (!getPhysics().isFlying() && !entity.getAbilities().flying + && climbingPos != null + && getObservedSpecies() == Race.CHANGELING) { Vec3d vel = entity.getVelocity(); if (entity.isSneaking()) { entity.setVelocity(vel.x, 0, vel.z); } - distanceClimbed += vel.length(); + distanceClimbed += Math.abs(getMotion().getClientVelocity().y); BlockPos hangingPos = entity.getBlockPos().up(); boolean canhangHere = canHangAt(hangingPos); @@ -450,6 +452,7 @@ public class Pony extends Living implements Copyable, Update } } else { distanceClimbed = 0; + attachDirection = null; } if (getObservedSpecies() == Race.KIRIN) { @@ -521,7 +524,7 @@ public class Pony extends Living implements Copyable, Update pos = pos.up(); BlockState state = asWorld().getBlockState(pos); - return state.isSolidSurface(asWorld(), pos, entity, Direction.DOWN); + return state.isSolidSurface(asWorld(), pos, entity, Direction.DOWN) && entity.getWorld().isAir(entity.getBlockPos().down()); } @Override @@ -563,7 +566,7 @@ public class Pony extends Living implements Copyable, Update if (isHanging()) { ((LivingEntityDuck)entity).setLeaningPitch(0); - if (!getObservedSpecies().canHang() || (ticksHanging++ > 2 && getHangingPosition().filter(getOrigin().down()::equals).filter(this::canHangAt).isEmpty())) { + if (!getObservedSpecies().canHang() || (ticksHanging++ > 2 && getHangingPosition().filter(this::canHangAt).isEmpty())) { if (!isClient()) { stopHanging(); } From 884ced25f128de1e54f9f568f596c33145e3884a Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 7 Nov 2023 18:46:05 +0000 Subject: [PATCH 35/90] Move all the logic for hanging and climbing into a separate class and fix bat ponies not automatically cancelling when they move --- .../unicopia/ability/BatPonyHangAbility.java | 12 +- .../unicopia/entity/player/Acrobatics.java | 183 ++++++++++++++++++ .../unicopia/entity/player/PlayerPhysics.java | 6 +- .../unicopia/entity/player/Pony.java | 141 ++------------ 4 files changed, 203 insertions(+), 139 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java diff --git a/src/main/java/com/minelittlepony/unicopia/ability/BatPonyHangAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/BatPonyHangAbility.java index f7e75dc2..9237ab34 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/BatPonyHangAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/BatPonyHangAbility.java @@ -38,13 +38,13 @@ public class BatPonyHangAbility implements Ability { @Override public Optional prepare(Pony player) { - if (player.isHanging()) { + if (player.getAcrobatics().isHanging()) { return Optional.of(new Multi(BlockPos.ZERO, 0)); } return TraceHelper.findBlock(player.asEntity(), 5, 1) .map(BlockPos::down) - .filter(player::canHangAt) + .filter(player.getAcrobatics()::canHangAt) .map(pos -> new Multi(pos, 1)); } @@ -55,13 +55,13 @@ public class BatPonyHangAbility implements Ability { @Override public boolean apply(Pony player, Multi data) { - if (data.hitType() == 0 && player.isHanging()) { - player.stopHanging(); + if (data.hitType() == 0 && player.getAcrobatics().isHanging()) { + player.getAcrobatics().stopHanging(); return true; } - if (data.hitType() == 1 && player.canHangAt(data.pos().pos())) { - player.startHanging(data.pos().pos()); + if (data.hitType() == 1 && player.getAcrobatics().canHangAt(data.pos().pos())) { + player.getAcrobatics().startHanging(data.pos().pos()); } return true; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java new file mode 100644 index 00000000..032d4f89 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java @@ -0,0 +1,183 @@ +package com.minelittlepony.unicopia.entity.player; + +import java.util.Optional; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; +import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation.Recipient; +import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; +import com.minelittlepony.unicopia.util.NbtSerialisable; +import com.minelittlepony.unicopia.util.Tickable; + +import net.minecraft.block.BlockState; +import net.minecraft.block.SideShapeType; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class Acrobatics implements Tickable, NbtSerialisable { + static final TrackedData> HANGING_POSITION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.OPTIONAL_BLOCK_POS); + + private int ticksHanging; + + private Direction attachDirection; + double distanceClimbed; + + private final Pony pony; + private final PlayerEntity entity; + + public Acrobatics(Pony pony) { + this.pony = pony; + this.entity = pony.asEntity(); + + entity.getDataTracker().startTracking(HANGING_POSITION, Optional.empty()); + + pony.addTicker(this::checkDislodge); + } + + @Override + public void tick() { + BlockPos climbingPos = entity.getClimbingPos().orElse(null); + + if (!pony.getPhysics().isFlying() && !entity.getAbilities().flying + && climbingPos != null + && pony.getObservedSpecies() == Race.CHANGELING) { + Vec3d vel = entity.getVelocity(); + if (entity.isSneaking()) { + entity.setVelocity(vel.x, 0, vel.z); + } + + distanceClimbed += Math.abs(pony.getMotion().getClientVelocity().y); + BlockPos hangingPos = entity.getBlockPos().up(); + boolean canhangHere = canHangAt(hangingPos); + + if (distanceClimbed > 1.5) { + if (vel.length() > 0.08F && entity.age % (3 + entity.getRandom().nextInt(5)) == 0) { + entity.playSound(USounds.ENTITY_PLAYER_CHANGELING_CLIMB, + (float)entity.getRandom().nextTriangular(0.5, 0.3), + entity.getSoundPitch() + ); + } + + boolean skipHangCheck = false; + Direction newAttachDirection = entity.getHorizontalFacing(); + if (isFaceClimbable(entity.getWorld(), entity.getBlockPos(), newAttachDirection) && (newAttachDirection != attachDirection)) { + attachDirection = newAttachDirection; + skipHangCheck = true; + } + + if (!skipHangCheck && canhangHere) { + if (!isHanging()) { + startHanging(hangingPos); + } else { + if (((LivingEntityDuck)entity).isJumping()) { + // Jump to let go + return; + } + entity.setVelocity(entity.getVelocity().multiply(1, 0, 1)); + entity.setSneaking(false); + } + } else if (attachDirection != null) { + if (isFaceClimbable(entity.getWorld(), entity.getBlockPos(), attachDirection)) { + entity.setBodyYaw(attachDirection.asRotation()); + entity.prevBodyYaw = attachDirection.asRotation(); + } else { + entity.setVelocity(vel); + entity.isClimbing(); + } + } + } + + if (canhangHere) { + pony.setAnimation(Animation.HANG, Recipient.ANYONE); + } else if (distanceClimbed > 1.5) { + pony.setAnimation(Animation.CLIMB, Recipient.ANYONE); + } + } else { + distanceClimbed = 0; + attachDirection = null; + } + } + + private void checkDislodge() { + if (isHanging()) { + ((LivingEntityDuck)entity).setLeaningPitch(0); + if (!pony.isClient() && !canKeepHanging()) { + stopHanging(); + } + } else { + ticksHanging = 0; + } + } + + boolean isFaceClimbable(World world, BlockPos pos, Direction direction) { + pos = pos.offset(direction); + return world.getBlockState(pos).isSideSolid(world, pos, direction, SideShapeType.CENTER); + } + + public Optional getHangingPosition() { + return entity.getDataTracker().get(HANGING_POSITION); + } + + public boolean isHanging() { + return getHangingPosition().isPresent(); + } + + public void stopHanging() { + entity.getDataTracker().set(HANGING_POSITION, Optional.empty()); + entity.calculateDimensions(); + ticksHanging = 0; + } + + public void startHanging(BlockPos pos) { + entity.getDataTracker().set(HANGING_POSITION, Optional.of(pos)); + entity.teleport(pos.getX() + 0.5, pos.getY() - 1, pos.getZ() + 0.5); + entity.setVelocity(Vec3d.ZERO); + entity.setSneaking(false); + entity.stopFallFlying(); + pony.getPhysics().cancelFlight(true); + } + + public boolean canHangAt(BlockPos pos) { + if (!pony.asWorld().isAir(pos) || !pony.asWorld().isAir(pos.down())) { + return false; + } + + pos = pos.up(); + BlockState state = pony.asWorld().getBlockState(pos); + + return state.isSolidSurface(pony.asWorld(), pos, entity, Direction.DOWN) && entity.getWorld().isAir(entity.getBlockPos().down()); + } + + private boolean canKeepHanging() { + Race race = pony.getObservedSpecies(); + if (!race.canHang()) { + return false; + } + if (ticksHanging++ <= 2) { + return true; + } + return getHangingPosition().filter(hangingPos -> { + return (race != Race.BAT || hangingPos.equals(pony.getOrigin().down())) && canHangAt(hangingPos); + }).isPresent(); + } + + @Override + public void toNBT(NbtCompound compound) { + compound.putInt("ticksHanging", ticksHanging); + BLOCK_POS.writeOptional("hangingPosition", compound, getHangingPosition()); + } + + @Override + public void fromNBT(NbtCompound compound) { + ticksHanging = compound.getInt("ticksHanging"); + pony.asEntity().getDataTracker().set(HANGING_POSITION, NbtSerialisable.BLOCK_POS.readOptional("hangingPosition", compound)); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index 045dbfdb..ca497829 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -115,7 +115,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickab @Override public float getGravityModifier() { float modifier = getPersistantGravityModifier(); - if (pony.isHanging() && pony.getObservedSpecies() == Race.BAT) { + if (pony.getAcrobatics().isHanging() && pony.getObservedSpecies() == Race.BAT) { modifier *= -0.05F; } return modifier; @@ -385,7 +385,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickab entity.setVelocity(velocity.toImmutable()); - if (isFlying() && !entity.isFallFlying() && !pony.isHanging() && pony.isClient()) { + if (isFlying() && !entity.isFallFlying() && !pony.getAcrobatics().isHanging() && pony.isClient()) { if (!MineLPDelegate.getInstance().getPlayerPonyRace(entity).isEquine() && getHorizontalMotion() > 0.03) { float pitch = ((LivingEntityDuck)entity).getLeaningPitch(); if (pitch < 1) { @@ -533,7 +533,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickab && pony.getJumpingHeuristic().hasChanged(Heuristic.TWICE); boolean fallingTakeOffCondition = !entity.isOnGround() && velocity.y < -1.6 * getGravitySignum() && entity.fallDistance > 1; - if ((takeOffCondition || fallingTakeOffCondition) && !pony.isHanging() && !isCancelled) { + if ((takeOffCondition || fallingTakeOffCondition) && !pony.getAcrobatics().isHanging() && !isCancelled) { initiateTakeoff(velocity); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 16d064ba..1a45d170 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -6,7 +6,6 @@ import java.util.stream.Stream; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; -import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation.Recipient; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.client.render.PlayerPoser.AnimationInstance; import com.minelittlepony.unicopia.*; @@ -37,8 +36,6 @@ import com.google.common.collect.Streams; import com.minelittlepony.common.util.animation.Interpolator; import com.mojang.authlib.GameProfile; -import net.minecraft.block.BlockState; -import net.minecraft.block.SideShapeType; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.*; import net.minecraft.entity.attribute.DefaultAttributeContainer; @@ -63,7 +60,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.math.*; import net.minecraft.world.GameMode; import net.minecraft.world.GameRules; -import net.minecraft.world.World; public class Pony extends Living implements Copyable, UpdateCallback { private static final TrackedData RACE = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.STRING); @@ -71,7 +67,6 @@ public class Pony extends Living implements Copyable, Update static final TrackedData ENERGY = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); static final TrackedData EXHAUSTION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); static final TrackedData EXERTION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); - static final TrackedData> HANGING_POSITION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.OPTIONAL_BLOCK_POS); static final TrackedData MANA = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); static final TrackedData XP = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); static final TrackedData CHARGE = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); @@ -87,6 +82,7 @@ public class Pony extends Living implements Copyable, Update private final PlayerCharmTracker charms = new PlayerCharmTracker(this); private final PlayerCamera camera = new PlayerCamera(this); private final TraitDiscovery discoveries = new TraitDiscovery(this); + private final Acrobatics acrobatics = new Acrobatics(this); private final Map advancementProgress = new HashMap<>(); @@ -101,8 +97,6 @@ public class Pony extends Living implements Copyable, Update private boolean dirty; - private int ticksHanging; - private float magicExhaustion = 0; private int ticksInvulnerable; @@ -111,9 +105,6 @@ public class Pony extends Living implements Copyable, Update private boolean hasShades; private int ticksSunImmunity = INITIAL_SUN_IMMUNITY; - private Direction attachDirection; - private double distanceClimbed; - private AnimationInstance animation = new AnimationInstance(Animation.NONE, Animation.Recipient.ANYONE); private int animationMaxDuration; private int animationDuration; @@ -125,7 +116,6 @@ public class Pony extends Living implements Copyable, Update this.mana = addTicker(new ManaContainer(this)); player.getDataTracker().startTracking(RACE, Race.DEFAULT_ID); - player.getDataTracker().startTracking(HANGING_POSITION, Optional.empty()); addTicker(this::updateAnimations); addTicker(this::updateBatPonyAbilities); @@ -250,6 +240,10 @@ public class Pony extends Living implements Copyable, Update return charms; } + public Acrobatics getAcrobatics() { + return acrobatics; + } + @Override public LevelStore getLevel() { return levels; @@ -393,67 +387,7 @@ public class Pony extends Living implements Copyable, Update magicExhaustion = ManaConsumptionUtil.burnFood(entity, magicExhaustion); powers.tick(); - - BlockPos climbingPos = entity.getClimbingPos().orElse(null); - - if (!getPhysics().isFlying() && !entity.getAbilities().flying - && climbingPos != null - && getObservedSpecies() == Race.CHANGELING) { - Vec3d vel = entity.getVelocity(); - if (entity.isSneaking()) { - entity.setVelocity(vel.x, 0, vel.z); - } - - distanceClimbed += Math.abs(getMotion().getClientVelocity().y); - BlockPos hangingPos = entity.getBlockPos().up(); - boolean canhangHere = canHangAt(hangingPos); - - if (distanceClimbed > 1.5) { - if (vel.length() > 0.08F && entity.age % (3 + entity.getRandom().nextInt(5)) == 0) { - entity.playSound(USounds.ENTITY_PLAYER_CHANGELING_CLIMB, - (float)entity.getRandom().nextTriangular(0.5, 0.3), - entity.getSoundPitch() - ); - } - - boolean skipHangCheck = false; - Direction newAttachDirection = entity.getHorizontalFacing(); - if (isFaceClimbable(entity.getWorld(), entity.getBlockPos(), newAttachDirection) && (newAttachDirection != attachDirection)) { - attachDirection = newAttachDirection; - skipHangCheck = true; - } - - if (!skipHangCheck && canhangHere) { - if (!isHanging()) { - startHanging(hangingPos); - } else { - if (((LivingEntityDuck)entity).isJumping()) { - // Jump to let go - return false; - } - entity.setVelocity(entity.getVelocity().multiply(1, 0, 1)); - entity.setSneaking(false); - } - } else if (attachDirection != null) { - if (isFaceClimbable(entity.getWorld(), entity.getBlockPos(), attachDirection)) { - entity.setBodyYaw(attachDirection.asRotation()); - entity.prevBodyYaw = attachDirection.asRotation(); - } else { - entity.setVelocity(vel); - entity.isClimbing(); - } - } - } - - if (canhangHere) { - setAnimation(Animation.HANG, Recipient.ANYONE); - } else if (distanceClimbed > 1.5) { - setAnimation(Animation.CLIMB, Recipient.ANYONE); - } - } else { - distanceClimbed = 0; - attachDirection = null; - } + acrobatics.tick(); if (getObservedSpecies() == Race.KIRIN) { var charge = getMagicalReserves().getCharge(); @@ -488,49 +422,10 @@ public class Pony extends Living implements Copyable, Update return super.beforeUpdate(); } - private boolean isFaceClimbable(World world, BlockPos pos, Direction direction) { - pos = pos.offset(direction); - return world.getBlockState(pos).isSideSolid(world, pos, direction, SideShapeType.CENTER); - } - - public Optional getHangingPosition() { - return entity.getDataTracker().get(HANGING_POSITION); - } - - public boolean isHanging() { - return getHangingPosition().isPresent(); - } - - public void stopHanging() { - entity.getDataTracker().set(HANGING_POSITION, Optional.empty()); - entity.calculateDimensions(); - ticksHanging = 0; - } - - public void startHanging(BlockPos pos) { - entity.getDataTracker().set(HANGING_POSITION, Optional.of(pos)); - entity.teleport(pos.getX() + 0.5, pos.getY() - 1, pos.getZ() + 0.5); - entity.setVelocity(Vec3d.ZERO); - entity.setSneaking(false); - entity.stopFallFlying(); - getPhysics().cancelFlight(true); - } - - public boolean canHangAt(BlockPos pos) { - if (!asWorld().isAir(pos) || !asWorld().isAir(pos.down())) { - return false; - } - - pos = pos.up(); - BlockState state = asWorld().getBlockState(pos); - - return state.isSolidSurface(asWorld(), pos, entity, Direction.DOWN) && entity.getWorld().isAir(entity.getBlockPos().down()); - } - @Override public Optional chooseClimbingPos() { if (getObservedSpecies() == Race.CHANGELING && getSpellSlot().get(SpellPredicate.IS_DISGUISE, false).isEmpty()) { - if (isFaceClimbable(entity.getWorld(), entity.getBlockPos(), entity.getHorizontalFacing()) || canHangAt(entity.getBlockPos())) { + if (acrobatics.isFaceClimbable(entity.getWorld(), entity.getBlockPos(), entity.getHorizontalFacing()) || acrobatics.canHangAt(entity.getBlockPos())) { return Optional.of(entity.getBlockPos()); } } @@ -539,7 +434,7 @@ public class Pony extends Living implements Copyable, Update private void updateAnimations() { - if (distanceClimbed > 0 + if (acrobatics.distanceClimbed > 0 && ((animation.isOf(Animation.CLIMB) && entity.isSneaking()) || animation.isOf(Animation.HANG)) && entity.getClimbingPos().isPresent() && entity.getVelocity().length() < 0.08F) { @@ -551,7 +446,7 @@ public class Pony extends Living implements Copyable, Update if (animationDuration > 0 && --animationDuration <= 0) { - if (animation.renderBothArms() && distanceClimbed > 0) { + if (animation.renderBothArms() && acrobatics.distanceClimbed > 0) { return; } @@ -564,17 +459,6 @@ public class Pony extends Living implements Copyable, Update ticksSunImmunity--; } - if (isHanging()) { - ((LivingEntityDuck)entity).setLeaningPitch(0); - if (!getObservedSpecies().canHang() || (ticksHanging++ > 2 && getHangingPosition().filter(this::canHangAt).isEmpty())) { - if (!isClient()) { - stopHanging(); - } - } - } else { - ticksHanging = 0; - } - if (getObservedSpecies() == Race.BAT && !entity.hasPortalCooldown()) { boolean hasShades = TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.FACE).anyMatch(s -> s.isIn(UTags.SHADES)); if (!this.hasShades && hasShades && getObservedSpecies() == Race.BAT) { @@ -859,10 +743,9 @@ public class Pony extends Living implements Copyable, Update super.toSyncronisedNbt(compound); compound.putString("playerSpecies", Race.REGISTRY.getId(getSpecies()).toString()); compound.putFloat("magicExhaustion", magicExhaustion); - compound.putInt("ticksHanging", ticksHanging); - BLOCK_POS.writeOptional("hangingPosition", compound, getHangingPosition()); compound.putInt("ticksInSun", ticksInSun); compound.putBoolean("hasShades", hasShades); + compound.put("acrobatics", acrobatics.toNBT()); compound.put("powers", powers.toNBT()); compound.put("gravity", gravity.toNBT()); compound.put("charms", charms.toNBT()); @@ -890,11 +773,9 @@ public class Pony extends Living implements Copyable, Update levels.set(compound.getInt("levels")); corruption.set(compound.getInt("corruption")); mana.fromNBT(compound.getCompound("mana")); - + acrobatics.fromNBT(compound.getCompound("acrobatics")); magicExhaustion = compound.getFloat("magicExhaustion"); - ticksHanging = compound.getInt("ticksHanging"); ticksInvulnerable = compound.getInt("ticksInvulnerable"); - entity.getDataTracker().set(HANGING_POSITION, NbtSerialisable.BLOCK_POS.readOptional("hangingPosition", compound)); ticksInSun = compound.getInt("ticksInSun"); hasShades = compound.getBoolean("hasShades"); From 6a09b04b8e3361f87f84a54add3a1ade23235877 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 7 Nov 2023 19:57:30 +0000 Subject: [PATCH 36/90] The metamorphosis potions no longer kill you in peaceful, easy, and hardcore mode, and spectral arrows are no longer deadly --- .../entity/effect/RaceChangeStatusEffect.java | 60 +++++++++++++++---- .../unicopia/entity/player/Pony.java | 11 ++++ 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java index cc937f94..f7168730 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java @@ -3,19 +3,24 @@ package com.minelittlepony.unicopia.entity.effect; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.entity.Equine; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.player.MagicReserves; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.util.ExplosionUtil; + import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.*; +import net.minecraft.entity.player.HungerManager; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.particle.ParticleTypes; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import net.minecraft.world.World.ExplosionSourceType; import net.minecraft.registry.Registry; import net.minecraft.registry.Registries; @@ -49,11 +54,21 @@ public class RaceChangeStatusEffect extends StatusEffect { return race; } + private void removeEffect(LivingEntity entity) { + entity.removeStatusEffect(this); + resetTicks(entity); + } + + private void resetTicks(LivingEntity entity) { + Pony.of(entity).ifPresent(pony -> pony.setTicksmetamorphising(0)); + } + @Override public void applyUpdateEffect(LivingEntity entity, int amplifier) { StatusEffectInstance state = entity.getStatusEffect(this); - if (state == null) { + if (state == null || entity.isDead()) { + resetTicks(entity); return; } @@ -63,6 +78,13 @@ public class RaceChangeStatusEffect extends StatusEffect { return; } + int metaTicks = 0; + + if (eq instanceof Pony pony) { + metaTicks = pony.getTicksMetamorphising() + 1; + pony.setTicksmetamorphising(metaTicks); + } + int ticks = Math.max(0, MAX_DURATION - state.getDuration()); Stage stage = Stage.forDuration(ticks / STAGE_DURATION); @@ -77,7 +99,7 @@ public class RaceChangeStatusEffect extends StatusEffect { if (progression == 0 && entity instanceof PlayerEntity player && stage == Stage.CRAWLING) { player.sendMessage(Stage.INITIAL.getMessage(race), true); } - entity.removeStatusEffect(this); + removeEffect(entity); return; } @@ -85,42 +107,60 @@ public class RaceChangeStatusEffect extends StatusEffect { player.sendMessage(stage.getMessage(race), true); } - entity.setHealth(1); - if (eq instanceof Pony pony) { MagicReserves magic = pony.getMagicalReserves(); pony.setRespawnRace(race); - magic.getExertion().addPercent(5); - magic.getEnergy().add(3); + magic.getExertion().add(5); + if (magic.getEnergy().get() < 1) { + magic.getEnergy().add(1.1F); + entity.playSound(USounds.BLOCK_CHITIN_AMBIENCE, 0.1F, 2F); + } magic.getExhaustion().add(3); if (state.shouldShowParticles()) { - pony.spawnParticles(ParticleTypes.TOTEM_OF_UNDYING, 5); + pony.spawnParticles(ParticleTypes.TOTEM_OF_UNDYING, 1); } } if (stage == Stage.DEATH) { - entity.removeStatusEffect(this); + removeEffect(entity); if (eq instanceof Caster) { ((Caster)eq).getSpellSlot().clear(); } - if (eq instanceof Pony pony) { + if (eq instanceof Pony pony && metaTicks > 200) { MagicReserves magic = pony.getMagicalReserves(); magic.getEnergy().set(0.6F); magic.getExhaustion().set(0); magic.getExertion().set(0); - if (!pony.asEntity().isCreative()) { + if (pony.asEntity().isCreative() || entity.getWorld().getDifficulty().getId() < 2 || entity.getWorld().getLevelProperties().isHardcore()) { + + if (!pony.asEntity().isCreative()) { + float cost = entity.getWorld().getLevelProperties().isHardcore() ? 0.75F : switch (entity.getWorld().getDifficulty()) { + case PEACEFUL -> 0.125F; + case EASY -> 0.25F; + default -> 0.5F; + }; + + entity.setHealth(Math.max(1, entity.getHealth() * cost)); + HungerManager hunger = pony.asEntity().getHungerManager(); + int food = hunger.getFoodLevel(); + pony.asEntity().getHungerManager().setFoodLevel(Math.max(Math.min(1, food), (int)(food * cost))); + } + pony.setSpecies(race); + } else if (!pony.asEntity().isCreative()) { if (!entity.damage(Living.living(entity).damageOf(UDamageTypes.TRIBE_SWAP), Float.MAX_VALUE)) { entity.setHealth(0); pony.setRespawnRace(Race.UNSET); pony.setSpecies(race); } } + entity.getWorld().createExplosion(entity, null, ExplosionUtil.NON_DESTRUCTIVE, entity.getPos(), 5, true, ExplosionSourceType.MOB); } else { eq.setSpecies(race); + entity.getWorld().createExplosion(entity, null, ExplosionUtil.NON_DESTRUCTIVE, entity.getPos(), 5, true, ExplosionSourceType.MOB); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 1a45d170..2487a67c 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -100,6 +100,7 @@ public class Pony extends Living implements Copyable, Update private float magicExhaustion = 0; private int ticksInvulnerable; + private int ticksMetamorphising; private int ticksInSun; private boolean hasShades; @@ -275,6 +276,14 @@ public class Pony extends Living implements Copyable, Update this.ticksInvulnerable = Math.max(0, ticks); } + public int getTicksMetamorphising() { + return ticksMetamorphising; + } + + public void setTicksmetamorphising(int ticks) { + ticksMetamorphising = ticks; + } + @Override public Affinity getAffinity() { return getSpecies().getAffinity(); @@ -754,6 +763,7 @@ public class Pony extends Living implements Copyable, Update compound.putInt("levels", levels.get()); compound.putInt("corruption", corruption.get()); compound.putInt("ticksInvulnerable", ticksInvulnerable); + compound.putInt("ticksMetamorphising", ticksMetamorphising); NbtCompound progress = new NbtCompound(); advancementProgress.forEach((key, count) -> { @@ -778,6 +788,7 @@ public class Pony extends Living implements Copyable, Update ticksInvulnerable = compound.getInt("ticksInvulnerable"); ticksInSun = compound.getInt("ticksInSun"); hasShades = compound.getBoolean("hasShades"); + ticksMetamorphising = compound.getInt("ticksMetamorphising"); NbtCompound progress = compound.getCompound("advancementProgress"); advancementProgress.clear(); From d91d3585520abe39b31d8cedbfa4b2766c3aef9a Mon Sep 17 00:00:00 2001 From: LingVarr <104311317+LingVarr@users.noreply.github.com> Date: Wed, 8 Nov 2023 10:00:38 +1100 Subject: [PATCH 37/90] Update ru_ru.json (#211) --- .../resources/assets/unicopia/lang/ru_ru.json | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/resources/assets/unicopia/lang/ru_ru.json b/src/main/resources/assets/unicopia/lang/ru_ru.json index 7ea1b685..6d3c45d2 100644 --- a/src/main/resources/assets/unicopia/lang/ru_ru.json +++ b/src/main/resources/assets/unicopia/lang/ru_ru.json @@ -176,13 +176,26 @@ "item.unicopia.music_disc_funk": "Пластинка", "item.unicopia.music_disc_funk.desc": "Фанк, просто фанк", - "item.unicopia.apple_bed_sheets": "Apple Patterned Bed Sheets", - "item.unicopia.barred_bed_sheets": "Bar Patterned Bed Sheets", - "item.unicopia.blue_bed_sheets": "Blue Bed Sheets", - "item.unicopia.checkered_bed_sheets": "Checker Patterned Bed Sheets", - "item.unicopia.orange_bed_sheets": "Orange Bed Sheets", - "item.unicopia.pink_bed_sheets": "Pink Bed Sheets", - "item.unicopia.rainbow_bed_sheets": "Rainbow Patterned Bed Sheets", + "item.unicopia.cloud_lump": "Облачная лампа", + "item.unicopia.light_gray_bed_sheets": "Светло-серая простынь", + "item.unicopia.gray_bed_sheets": "Серая простынь", + "item.unicopia.black_bed_sheets": "Черная простынь", + "item.unicopia.brown_bed_sheets": "Коричневая простынь", + "item.unicopia.red_bed_sheets": "Красная простынь", + "item.unicopia.orange_bed_sheets": "Оранжевая простынь", + "item.unicopia.yellow_bed_sheets": "Желтая простынь", + "item.unicopia.lime_bed_sheets": "Лаймовая простынь", + "item.unicopia.green_bed_sheets": "Зелёная простынь", + "item.unicopia.cyan_bed_sheets": "Голубая простынь", + "item.unicopia.light_blue_bed_sheets": "Светло-голубая простынь", + "item.unicopia.blue_bed_sheets": "Синяя простынь", + "item.unicopia.purple_bed_sheets": "Фиолетовая простынь", + "item.unicopia.magenta_bed_sheets": "Пурпурная простынь", + "item.unicopia.pink_bed_sheets": "Розовая простынь", + "item.unicopia.apple_bed_sheets": "Яблочная простынь", + "item.unicopia.barred_bed_sheets": "Простынь в полоску", + "item.unicopia.checkered_bed_sheets": "Простынь в клетку", + "item.unicopia.rainbow_bed_sheets": "Радужная простынь", "block.unicopia.rocks": "Камни", "block.unicopia.bananas": "Бананы", @@ -260,6 +273,7 @@ "block.unicopia.dense_cloud": "Плотное облако", "block.unicopia.dense_cloud_slab": "Плита из плотного облака", "block.unicopia.dense_cloud_stairs": "Ступеньки из плотного облака", + "block.unicopia.compacted_dense_cloud": "Плотное облако", "block.unicopia.cloud_pillar": "Колонна из облака", "block.unicopia.cloth_bed": "Кровать из шикарной ткани", "block.unicopia.cloud_bed": "Кровать из облака", From 0d0ea4558d4defd3da2699b23487eeecf680101d Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 8 Nov 2023 12:58:31 +0000 Subject: [PATCH 38/90] Added hippogriffs and seaponies --- .../minelittlepony/unicopia/Availability.java | 15 ++ .../unicopia/EquinePredicates.java | 1 + .../com/minelittlepony/unicopia/Race.java | 40 ++--- .../com/minelittlepony/unicopia/USounds.java | 2 + .../unicopia/ability/Abilities.java | 9 +- .../unicopia/ability/BatEeeeAbility.java | 106 +----------- .../unicopia/ability/FlyingDashAbility.java | 76 +++++++++ .../unicopia/ability/PeckAbility.java | 152 ++++++++++++++++++ .../unicopia/ability/ScreechAbility.java | 141 ++++++++++++++++ ...eAbility.java => ToggleFlightAbility.java} | 2 +- .../unicopia/client/gui/HudEffects.java | 61 +++++++ .../client/gui/TribeSelectionScreen.java | 2 +- .../client/minelittlepony/BodyPartGear.java | 3 +- .../unicopia/client/minelittlepony/Main.java | 4 +- .../client/render/ModelPartHooks.java | 4 - .../client/render/SmittenEyesRenderer.java | 5 - .../client/render/WingsFeatureRenderer.java | 3 +- .../client/render/WorldRenderDelegate.java | 37 +++++ .../unicopia/command/SpeciesCommand.java | 9 +- .../unicopia/entity/AmuletSelectors.java | 1 + .../unicopia/entity/duck/EntityDuck.java | 6 + .../entity/effect/RaceChangeStatusEffect.java | 1 + .../unicopia/entity/effect/UPotions.java | 2 + .../unicopia/entity/player/Acrobatics.java | 19 +++ .../entity/player/PlayerAttributes.java | 15 +- .../unicopia/entity/player/PlayerCamera.java | 16 ++ .../unicopia/entity/player/PlayerPhysics.java | 6 +- .../unicopia/entity/player/Pony.java | 40 +++++ .../minelittlepony/unicopia/item/UItems.java | 4 + .../unicopia/item/toxin/Toxics.java | 9 ++ .../mixin/MixinEnchantmentHelper.java | 25 +++ .../unicopia/mixin/MixinEntity.java | 8 + .../unicopia/mixin/MixinPlayerEntity.java | 17 ++ .../unicopia/mixin/MixinPufferfishEntity.java | 25 +++ .../unicopia/mixin/client/MixinCamera.java | 8 + .../unicopia/mixin/client/MixinInGameHud.java | 22 +-- .../mixin/client/MixinKeyboardInput.java | 5 + .../unicopia/mixin/client/MixinModelPart.java | 2 +- .../resources/assets/unicopia/lang/en_us.json | 33 +++- .../models/item/hippogriff_badge.json | 6 + .../unicopia/models/item/pearl_necklace.json | 6 + .../resources/assets/unicopia/sounds.json | 7 + .../unicopia/sounds/screech/screech0.ogg | Bin 0 -> 39055 bytes .../unicopia/textures/gui/ability/dash.png | Bin 0 -> 7125 bytes .../textures/gui/ability/dash_old.png | Bin 0 -> 8759 bytes .../unicopia/textures/gui/ability/peck.png | Bin 0 -> 7346 bytes .../unicopia/textures/gui/ability/screech.png | Bin 0 -> 7220 bytes .../ability/toggle_flight_land_hippogriff.png | Bin 0 -> 7240 bytes .../toggle_flight_takeoff_hippogriff.png | Bin 0 -> 8117 bytes .../unicopia/textures/gui/race/hippogriff.png | Bin 0 -> 6551 bytes .../textures/item/hippogriff_badge.png | Bin 0 -> 6551 bytes .../unicopia/textures/item/pearl_necklace.png | Bin 0 -> 6551 bytes .../trinkets/tags/items/chest/necklace.json | 3 +- src/main/resources/unicopia.mixin.json | 2 + 54 files changed, 792 insertions(+), 168 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/Availability.java create mode 100644 src/main/java/com/minelittlepony/unicopia/ability/FlyingDashAbility.java create mode 100644 src/main/java/com/minelittlepony/unicopia/ability/PeckAbility.java create mode 100644 src/main/java/com/minelittlepony/unicopia/ability/ScreechAbility.java rename src/main/java/com/minelittlepony/unicopia/ability/{PegasusFlightToggleAbility.java => ToggleFlightAbility.java} (97%) create mode 100644 src/main/java/com/minelittlepony/unicopia/client/gui/HudEffects.java create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinPufferfishEntity.java create mode 100644 src/main/resources/assets/unicopia/models/item/hippogriff_badge.json create mode 100644 src/main/resources/assets/unicopia/models/item/pearl_necklace.json create mode 100644 src/main/resources/assets/unicopia/sounds/screech/screech0.ogg create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/dash.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/dash_old.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/peck.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/screech.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/toggle_flight_land_hippogriff.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/toggle_flight_takeoff_hippogriff.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/race/hippogriff.png create mode 100644 src/main/resources/assets/unicopia/textures/item/hippogriff_badge.png create mode 100644 src/main/resources/assets/unicopia/textures/item/pearl_necklace.png diff --git a/src/main/java/com/minelittlepony/unicopia/Availability.java b/src/main/java/com/minelittlepony/unicopia/Availability.java new file mode 100644 index 00000000..f24497a3 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/Availability.java @@ -0,0 +1,15 @@ +package com.minelittlepony.unicopia; + +public enum Availability { + DEFAULT, + COMMANDS, + NONE; + + public boolean isSelectable() { + return this == DEFAULT; + } + + public boolean isGrantable() { + return this != NONE; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java index 0771db9d..be559b38 100644 --- a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java +++ b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java @@ -27,6 +27,7 @@ public interface EquinePredicates { Predicate PLAYER_CHANGELING = IS_PLAYER.and(ofRace(Race.CHANGELING)); Predicate PLAYER_KIRIN = IS_PLAYER.and(ofRace(Race.KIRIN)); Predicate PLAYER_PEGASUS = IS_PLAYER.and(e -> ((PlayerEntity)e).getAbilities().creativeMode || RACE_INTERACT_WITH_CLOUDS.test(e)); + Predicate PLAYER_SEAPONY = IS_PLAYER.and(raceMatches(Race::isFish)); Predicate PLAYER_CAN_USE_EARTH = IS_PLAYER.and(raceMatches(Race::canUseEarth)); Predicate IS_CASTER = e -> !e.isRemoved() && (e instanceof Caster || IS_PLAYER.test(e)); diff --git a/src/main/java/com/minelittlepony/unicopia/Race.java b/src/main/java/com/minelittlepony/unicopia/Race.java index e45fec10..1a214161 100644 --- a/src/main/java/com/minelittlepony/unicopia/Race.java +++ b/src/main/java/com/minelittlepony/unicopia/Race.java @@ -24,18 +24,18 @@ import net.minecraft.util.Identifier; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; -public record Race (Supplier compositeSupplier, boolean canCast, FlightType flightType, boolean canUseEarth, boolean isNocturnal, boolean canHang) implements Affine { +public record Race (Supplier compositeSupplier, Availability availability, boolean canCast, FlightType flightType, boolean canUseEarth, boolean isNocturnal, boolean canHang) implements Affine { public static final String DEFAULT_ID = "unicopia:unset"; public static final Registry REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race"), DEFAULT_ID); public static final RegistryKey> REGISTRY_KEY = REGISTRY.getKey(); private static final DynamicCommandExceptionType UNKNOWN_RACE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("race.unknown", id)); - public static Race register(String name, boolean magic, FlightType flight, boolean earth, boolean nocturnal, boolean canHang) { - return register(Unicopia.id(name), magic, flight, earth, nocturnal, canHang); + public static Race register(String name, Availability availability, boolean magic, FlightType flight, boolean earth, boolean nocturnal, boolean canHang) { + return register(Unicopia.id(name), availability, magic, flight, earth, nocturnal, canHang); } - public static Race register(Identifier id, boolean magic, FlightType flight, boolean earth, boolean nocturnal, boolean canHang) { - return Registry.register(REGISTRY, id, new Race(Suppliers.memoize(() -> new Composite(REGISTRY.get(id), null)), magic, flight, earth, nocturnal, canHang)); + public static Race register(Identifier id, Availability availability, boolean magic, FlightType flight, boolean earth, boolean nocturnal, boolean canHang) { + return Registry.register(REGISTRY, id, new Race(Suppliers.memoize(() -> new Composite(REGISTRY.get(id), null)), availability, magic, flight, earth, nocturnal, canHang)); } public static RegistryKeyArgumentType argument() { @@ -46,15 +46,17 @@ public record Race (Supplier compositeSupplier, boolean canCast, Flig * The default, unset race. * This is used if there are no other races. */ - public static final Race UNSET = register("unset", false, FlightType.NONE, false, false, false); - public static final Race HUMAN = register("human", false, FlightType.NONE, false, false, false); - public static final Race EARTH = register("earth", false, FlightType.NONE, true, false, false); - public static final Race UNICORN = register("unicorn", true, FlightType.NONE, false, false, false); - public static final Race PEGASUS = register("pegasus", false, FlightType.AVIAN, false, false, false); - public static final Race BAT = register("bat", false, FlightType.AVIAN, false, true, true); - public static final Race ALICORN = register("alicorn", true, FlightType.AVIAN, true, false, false); - public static final Race CHANGELING = register("changeling", false, FlightType.INSECTOID, false, false, true); - public static final Race KIRIN = register("kirin", true, FlightType.NONE, false, false, false); + public static final Race UNSET = register("unset", Availability.COMMANDS, false, FlightType.NONE, false, false, false); + public static final Race HUMAN = register("human", Availability.COMMANDS, false, FlightType.NONE, false, false, false); + public static final Race EARTH = register("earth", Availability.DEFAULT, false, FlightType.NONE, true, false, false); + public static final Race UNICORN = register("unicorn", Availability.DEFAULT, true, FlightType.NONE, false, false, false); + public static final Race PEGASUS = register("pegasus", Availability.DEFAULT, false, FlightType.AVIAN, false, false, false); + public static final Race BAT = register("bat", Availability.DEFAULT, false, FlightType.AVIAN, false, true, true); + public static final Race ALICORN = register("alicorn", Availability.COMMANDS, true, FlightType.AVIAN, true, false, false); + public static final Race CHANGELING = register("changeling", Availability.DEFAULT, false, FlightType.INSECTOID, false, false, true); + public static final Race KIRIN = register("kirin", Availability.DEFAULT, true, FlightType.NONE, false, false, false); + public static final Race HIPPOGRIFF = register("hippogriff", Availability.DEFAULT, false, FlightType.AVIAN, false, false, false); + public static final Race SEAPONY = register("seapony", Availability.NONE, false, FlightType.NONE, false, false, false); public static void bootstrap() {} @@ -83,6 +85,10 @@ public record Race (Supplier compositeSupplier, boolean canCast, Flig return !isHuman(); } + public boolean isFish() { + return this == SEAPONY; + } + public boolean isHuman() { return this == UNSET || this == HUMAN; } @@ -91,16 +97,12 @@ public record Race (Supplier compositeSupplier, boolean canCast, Flig return !isNocturnal(); } - public boolean isOp() { - return this == ALICORN; - } - public boolean canFly() { return !flightType().isGrounded(); } public boolean canInteractWithClouds() { - return canFly() && this != CHANGELING && this != BAT; + return canFly() && this != CHANGELING && this != BAT && this != HIPPOGRIFF; } public Identifier getId() { diff --git a/src/main/java/com/minelittlepony/unicopia/USounds.java b/src/main/java/com/minelittlepony/unicopia/USounds.java index 34d9beff..ec580e36 100644 --- a/src/main/java/com/minelittlepony/unicopia/USounds.java +++ b/src/main/java/com/minelittlepony/unicopia/USounds.java @@ -14,6 +14,8 @@ public interface USounds { SoundEvent ENTITY_PLAYER_CORRUPTION = PARTICLE_SOUL_ESCAPE; SoundEvent ENTITY_PLAYER_BATPONY_SCREECH = register("entity.player.batpony.screech"); + SoundEvent ENTITY_PLAYER_HIPPOGRIFF_SCREECH = register("entity.player.hippogriff.screech"); + SoundEvent ENTITY_PLAYER_HIPPOGRIFF_PECK = ENTITY_CHICKEN_STEP; SoundEvent ENTITY_PLAYER_REBOUND = register("entity.player.rebound"); SoundEvent ENTITY_PLAYER_PEGASUS_WINGSFLAP = register("entity.player.pegasus.wingsflap"); SoundEvent ENTITY_PLAYER_PEGASUS_FLYING = register("entity.player.pegasus.flying"); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java index 9dd0d724..f0964765 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java @@ -42,9 +42,14 @@ public interface Abilities { Ability RAINBOOM = register(new PegasusRainboomAbility(), "rainboom", AbilitySlot.PRIMARY); Ability CAPTURE_CLOUD = register(new PegasusCaptureStormAbility(), "capture_cloud", AbilitySlot.SECONDARY); - // pegasus / bat / alicorn / changeling + // hippogriff + Ability DASH = register(new FlyingDashAbility(), "dash", AbilitySlot.PRIMARY); + Ability SCREECH = register(new ScreechAbility(), "screech", AbilitySlot.SECONDARY); + Ability PECK = register(new PeckAbility(), "peck", AbilitySlot.SECONDARY); + + // pegasus / bat / alicorn / changeling / hippogriff Ability CARRY = register(new CarryAbility(), "carry", AbilitySlot.PRIMARY); - Ability TOGGLE_FLIGHT = register(new PegasusFlightToggleAbility(), "toggle_flight", AbilitySlot.TERTIARY); + Ability TOGGLE_FLIGHT = register(new ToggleFlightAbility(), "toggle_flight", AbilitySlot.TERTIARY); // changeling Ability DISGUISE = register(new ChangelingDisguiseAbility(), "disguise", AbilitySlot.SECONDARY); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java index f2ad4e28..867f67ae 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java @@ -1,55 +1,20 @@ package com.minelittlepony.unicopia.ability; -import java.util.Optional; - import com.minelittlepony.unicopia.AwaitTickQueue; -import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.USounds; -import com.minelittlepony.unicopia.UTags; -import com.minelittlepony.unicopia.ability.data.Numeric; -import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.advancement.UCriteria; -import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; -import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.player.Pony; -import com.minelittlepony.unicopia.util.RegistryUtils; -import com.minelittlepony.unicopia.util.VecHelper; -import net.minecraft.entity.LivingEntity; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.random.Random; +import net.minecraft.world.event.GameEvent; /** - * A magic casting ability for unicorns. - * (only shields for now) + * An ability to screeeeeeeeEeEeEeeee! */ -public class BatEeeeAbility implements Ability { +public class BatEeeeAbility extends ScreechAbility { public static final int SELF_SPOOK_PROBABILITY = 20000; - public static final int MOB_SPOOK_PROBABILITY = 1000; - - @Override - public int getWarmupTime(Pony player) { - return 30; - } - - @Override - public int getCooldownTime(Pony player) { - return 5; - } - - @Override - public double getCostEstimate(Pony player) { - return 0; - } - - @Override - public boolean activateOnEarlyRelease() { - return true; - } @Override public boolean canUse(Race race) { @@ -57,22 +22,7 @@ public class BatEeeeAbility implements Ability { } @Override - public Optional prepare(Pony player) { - return player.getAbilities().getActiveStat() - .map(stat -> (int)(stat.getWarmup() * getWarmupTime(player))) - .filter(i -> i >= 0) - .map(Numeric::new); - } - - @Override - public Numeric.Serializer getSerializer() { - return Numeric.SERIALIZER; - } - - @Override - public boolean apply(Pony player, Numeric data) { - float strength = 1 - MathHelper.clamp(data.type() / (float)getWarmupTime(player), 0, 1); - Random rng = player.asWorld().random; + protected void playSounds(Pony player, Random rng, float strength) { int count = 1 + rng.nextInt(10) + (int)(strength * 10); for (int i = 0; i < count; i++) { @@ -81,6 +31,7 @@ public class BatEeeeAbility implements Ability { 1.6F + (rng.nextFloat() - 0.5F) ); } + player.asWorld().emitGameEvent(player.asEntity(), GameEvent.ENTITY_ROAR, player.asEntity().getEyePos()); for (int j = 0; j < (int)(strength * 2); j++) { for (int k = 0; k < count; k++) { AwaitTickQueue.scheduleTask(player.asWorld(), w -> { @@ -88,59 +39,14 @@ public class BatEeeeAbility implements Ability { (0.9F + (rng.nextFloat() - 0.5F) / 2F) * strength, 1.6F + (rng.nextFloat() - 0.5F) ); + player.asWorld().emitGameEvent(player.asEntity(), GameEvent.ENTITY_ROAR, player.asEntity().getEyePos()); }, rng.nextInt(3)); } } - if (!player.getPhysics().isFlying()) { - player.setAnimation(Animation.SPREAD_WINGS, Animation.Recipient.ANYONE); - } - - Vec3d origin = player.getOriginVector(); - if (strength > 0.5F && rng.nextInt(SELF_SPOOK_PROBABILITY) == 0) { player.asEntity().damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), 0.1F); UCriteria.SCREECH_SELF.trigger(player.asEntity()); } - - int total = player.findAllEntitiesInRange((int)Math.max(1, 8 * strength)).mapToInt(e -> { - if (e instanceof LivingEntity living && !SpellType.SHIELD.isOn(e)) { - boolean isEarthPony = EquinePredicates.PLAYER_EARTH.test(e); - e.damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F); - if (e.getWorld().random.nextInt(MOB_SPOOK_PROBABILITY) == 0) { - RegistryUtils.pickRandom(e.getWorld(), UTags.SPOOKED_MOB_DROPS).ifPresent(drop -> { - e.dropStack(drop.getDefaultStack()); - e.playSound(USounds.Vanilla.ENTITY_ITEM_PICKUP, 1, 0.1F); - UCriteria.SPOOK_MOB.trigger(player.asEntity()); - }); - } - - Vec3d knockVec = origin.subtract(e.getPos()).multiply(strength); - living.takeKnockback((isEarthPony ? 0.3F : 0.5F) * strength, knockVec.getX(), knockVec.getZ()); - if (!isEarthPony) { - e.addVelocity(0, 0.1 * strength, 0); - } - Living.updateVelocity(e); - return 1; - } - return 0; - }).sum(); - - if (total >= 20) { - UCriteria.SCREECH_TWENTY_MOBS.trigger(player.asEntity()); - } - - return true; - } - - @Override - public void warmUp(Pony player, AbilitySlot slot) { - } - - @Override - public void coolDown(Pony player, AbilitySlot slot) { - for (int i = 0; i < 20; i++) { - player.addParticle(ParticleTypes.BUBBLE_POP, player.getPhysics().getHeadPosition().toCenterPos(), VecHelper.supply(() -> player.asWorld().getRandom().nextGaussian() - 0.5)); - } } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/FlyingDashAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/FlyingDashAbility.java new file mode 100644 index 00000000..0a9f5f6b --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/FlyingDashAbility.java @@ -0,0 +1,76 @@ +package com.minelittlepony.unicopia.ability; + +import java.util.Optional; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; +import com.minelittlepony.unicopia.entity.player.Pony; + +/** + * Dashing ability for flying creatures. + */ +public class FlyingDashAbility implements Ability { + + @Override + public int getWarmupTime(Pony player) { + return 19; + } + + @Override + public int getCooldownTime(Pony player) { + return 30; + } + + @Override + public boolean canUse(Race race) { + return race == Race.HIPPOGRIFF; + } + + @Nullable + @Override + public Optional prepare(Pony player) { + return Hit.of(player.getPhysics().isFlying()); + } + + @Override + public Hit.Serializer getSerializer() { + return Hit.SERIALIZER; + } + + @Override + public double getCostEstimate(Pony player) { + return 0; + } + + @Override + public boolean onQuickAction(Pony player, ActivationType type, Optional data) { + + if (type == ActivationType.TAP && !player.getMotion().isRainbooming() && player.getPhysics().isFlying() && player.getMagicalReserves().getMana().get() > 40) { + player.getPhysics().dashForward((float)player.asWorld().random.nextTriangular(2.5F, 0.3F)); + return true; + } + + return false; + } + + @Override + public boolean apply(Pony player, Hit data) { + player.getPhysics().dashForward((float)player.asWorld().random.nextTriangular(2.5F, 0.3F)); + player.subtractEnergyCost(2); + return true; + } + + @Override + public void warmUp(Pony player, AbilitySlot slot) { + player.getMagicalReserves().getExertion().addPercent(6); + } + + @Override + public void coolDown(Pony player, AbilitySlot slot) { + float velocityScale = player.getAbilities().getStat(slot).getCooldown(); + float multiplier = 1 + (0.02F * velocityScale); + player.asEntity().getVelocity().multiply(multiplier, 1, multiplier); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/ability/PeckAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/PeckAbility.java new file mode 100644 index 00000000..849dbb4c --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/PeckAbility.java @@ -0,0 +1,152 @@ +package com.minelittlepony.unicopia.ability; + +import java.util.Optional; + +import com.minelittlepony.unicopia.EquinePredicates; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.ability.data.Hit; +import com.minelittlepony.unicopia.ability.data.Numeric; +import com.minelittlepony.unicopia.entity.Living; +import com.minelittlepony.unicopia.entity.damage.UDamageTypes; +import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.util.TraceHelper; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.predicate.entity.EntityPredicates; +import net.minecraft.registry.tag.BlockTags; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.Text; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.random.Random; +import net.minecraft.world.World; +import net.minecraft.world.WorldEvents; +import net.minecraft.world.event.GameEvent; + +/** + * Hippogriff ability to use their beak as a weapon + */ +public class PeckAbility implements Ability { + + @Override + public int getWarmupTime(Pony player) { + return 1; + } + + @Override + public int getCooldownTime(Pony player) { + return 10; + } + + @Override + public double getCostEstimate(Pony player) { + return 0; + } + + @Override + public boolean activateOnEarlyRelease() { + return true; + } + + @Override + public boolean canUse(Race race) { + return race == Race.HIPPOGRIFF; + } + + @Override + public Optional prepare(Pony player) { + return Hit.INSTANCE; + } + + @Override + public Numeric.Serializer getSerializer() { + return Hit.SERIALIZER; + } + + protected LivingEntity findTarget(PlayerEntity player, World w) { + return TraceHelper.findEntity(player, 5, 1, hit -> { + return EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR.test(hit) && !player.isConnectedThroughVehicle(hit); + }).orElse(null); + } + + @Override + public boolean apply(Pony player, Hit hit) { + LivingEntity target = findTarget(player.asEntity(), player.asWorld()); + + playSounds(player, player.asWorld().getRandom(), 1); + + if (target != null) { + spookMob(player, target, 1); + } else { + BlockPos pos = TraceHelper.findBlock(player.asEntity(), 5, 1).orElse(BlockPos.ORIGIN); + if (pos != BlockPos.ORIGIN) { + BlockState state = player.asWorld().getBlockState(pos); + if (state.isReplaceable()) { + player.asWorld().breakBlock(pos, true); + } else if (state.isIn(BlockTags.DIRT) || player.asWorld().random.nextInt(40000) == 0) { + player.asWorld().syncWorldEvent(WorldEvents.BLOCK_BROKEN, pos, Block.getRawIdFromState(state)); + pos = pos.up(); + World world = player.asWorld(); + + if (world instanceof ServerWorld sw) { + for (ItemStack stack : Block.getDroppedStacks(state, sw, pos, null)) { + if (Block.getBlockFromItem(stack.getItem()) == Blocks.AIR) { + Block.dropStack(world, pos, stack); + } + } + state.onStacksDropped(sw, pos, ItemStack.EMPTY, true); + + if (world.random.nextInt(20) == 0) { + world.breakBlock(pos.down(), false); + player.asEntity().sendMessage(Text.translatable("ability.unicopia.peck.block.fled"), true); + } + } + } else { + player.asEntity().sendMessage(Text.translatable("ability.unicopia.peck.block.unfased"), true); + } + } + } + + return true; + } + + protected void playSounds(Pony player, Random rng, float strength) { + player.getMagicalReserves().getExertion().addPercent(100); + player.getMagicalReserves().getEnergy().addPercent(10); + player.playSound(USounds.Vanilla.ENTITY_CHICKEN_HURT, + 1, + 0.9F + (rng.nextFloat() - 0.5F) + ); + player.asWorld().emitGameEvent(player.asEntity(), GameEvent.STEP, player.asEntity().getEyePos()); + } + + protected void spookMob(Pony player, LivingEntity living, float strength) { + boolean isEarthPony = EquinePredicates.PLAYER_EARTH.test(living); + boolean isBracing = isEarthPony && player.asEntity().isSneaking(); + + if (!isBracing) { + living.damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F); + } + + Vec3d knockVec = player.getOriginVector().subtract(living.getPos()).multiply(strength); + living.takeKnockback((isBracing ? 0.2F : isEarthPony ? 0.3F : 0.5F) * strength, knockVec.getX(), knockVec.getZ()); + if (!isEarthPony) { + living.addVelocity(0, 0.1 * strength, 0); + } + Living.updateVelocity(living); + } + + @Override + public void warmUp(Pony player, AbilitySlot slot) { + } + + @Override + public void coolDown(Pony player, AbilitySlot slot) { + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ScreechAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ScreechAbility.java new file mode 100644 index 00000000..ac244ea0 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/ScreechAbility.java @@ -0,0 +1,141 @@ +package com.minelittlepony.unicopia.ability; + +import java.util.Optional; + +import com.minelittlepony.unicopia.EquinePredicates; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.UTags; +import com.minelittlepony.unicopia.ability.data.Numeric; +import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; +import com.minelittlepony.unicopia.advancement.UCriteria; +import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; +import com.minelittlepony.unicopia.entity.Living; +import com.minelittlepony.unicopia.entity.damage.UDamageTypes; +import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.util.RegistryUtils; +import com.minelittlepony.unicopia.util.VecHelper; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.random.Random; +import net.minecraft.world.event.GameEvent; + +/** + * An ability to scream very loud + */ +public class ScreechAbility implements Ability { + public static final int MOB_SPOOK_PROBABILITY = 1000; + + @Override + public int getWarmupTime(Pony player) { + return 30; + } + + @Override + public int getCooldownTime(Pony player) { + return 5; + } + + @Override + public double getCostEstimate(Pony player) { + return 0; + } + + @Override + public boolean activateOnEarlyRelease() { + return true; + } + + @Override + public boolean canUse(Race race) { + return race == Race.HIPPOGRIFF; + } + + @Override + public Optional prepare(Pony player) { + return player.getAbilities().getActiveStat() + .map(stat -> (int)(stat.getWarmup() * getWarmupTime(player))) + .filter(i -> i >= 0) + .map(Numeric::new); + } + + @Override + public Numeric.Serializer getSerializer() { + return Numeric.SERIALIZER; + } + + @Override + public boolean apply(Pony player, Numeric data) { + float strength = 1 - MathHelper.clamp(data.type() / (float)getWarmupTime(player), 0, 1); + Random rng = player.asWorld().random; + + playSounds(player, rng, strength); + + if (!player.getPhysics().isFlying()) { + player.setAnimation(Animation.SPREAD_WINGS, Animation.Recipient.ANYONE); + } + + int total = player.findAllEntitiesInRange((int)Math.max(1, 8 * strength)).mapToInt(e -> { + if (e instanceof LivingEntity living && !SpellType.SHIELD.isOn(e)) { + spookMob(player, living, strength); + return 1; + } + return 0; + }).sum(); + + if (total >= 20) { + UCriteria.SCREECH_TWENTY_MOBS.trigger(player.asEntity()); + } + + return true; + } + + protected void playSounds(Pony player, Random rng, float strength) { + player.playSound(USounds.ENTITY_PLAYER_HIPPOGRIFF_SCREECH, + (1.2F + (rng.nextFloat() - 0.5F) / 2F) * strength, + 1.1F + (rng.nextFloat() - 0.5F) + ); + player.asWorld().emitGameEvent(player.asEntity(), GameEvent.ENTITY_ROAR, player.asEntity().getEyePos()); + } + + protected void spookMob(Pony player, LivingEntity living, float strength) { + boolean isEarthPony = EquinePredicates.PLAYER_EARTH.test(living); + boolean isBracing = isEarthPony && player.asEntity().isSneaking(); + + if (!isBracing) { + living.damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F); + + + if (living.getWorld().random.nextInt(MOB_SPOOK_PROBABILITY) == 0) { + RegistryUtils.pickRandom(living.getWorld(), UTags.SPOOKED_MOB_DROPS).ifPresent(drop -> { + living.dropStack(drop.getDefaultStack()); + living.playSound(USounds.Vanilla.ENTITY_ITEM_PICKUP, 1, 0.1F); + UCriteria.SPOOK_MOB.trigger(player.asEntity()); + }); + } + } + + Vec3d knockVec = player.getOriginVector().subtract(living.getPos()).multiply(strength); + living.takeKnockback((isBracing ? 0.2F : isEarthPony ? 0.3F : 0.5F) * strength, knockVec.getX(), knockVec.getZ()); + if (!isEarthPony) { + living.addVelocity(0, 0.1 * strength, 0); + } + Living.updateVelocity(living); + } + + @Override + public void warmUp(Pony player, AbilitySlot slot) { + } + + @Override + public void coolDown(Pony player, AbilitySlot slot) { + for (int i = 0; i < 20; i++) { + player.addParticle(ParticleTypes.BUBBLE_POP, player.asEntity().getEyePos(), + VecHelper.supply(() -> (player.asWorld().getRandom().nextGaussian() - 0.5) * 0.3) + ); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/ability/PegasusFlightToggleAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ToggleFlightAbility.java similarity index 97% rename from src/main/java/com/minelittlepony/unicopia/ability/PegasusFlightToggleAbility.java rename to src/main/java/com/minelittlepony/unicopia/ability/ToggleFlightAbility.java index c0736de0..d9811e74 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/PegasusFlightToggleAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ToggleFlightAbility.java @@ -12,7 +12,7 @@ import com.minelittlepony.unicopia.entity.player.Pony; import net.minecraft.util.Identifier; -public class PegasusFlightToggleAbility implements Ability { +public class ToggleFlightAbility implements Ability { @Override public int getWarmupTime(Pony player) { diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/HudEffects.java b/src/main/java/com/minelittlepony/unicopia/client/gui/HudEffects.java new file mode 100644 index 00000000..2188245d --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/HudEffects.java @@ -0,0 +1,61 @@ +package com.minelittlepony.unicopia.client.gui; + +import java.util.HashSet; +import java.util.Set; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.entity.duck.EntityDuck; +import com.minelittlepony.unicopia.entity.effect.EffectUtils; +import com.minelittlepony.unicopia.entity.effect.UEffects; +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluid; +import net.minecraft.registry.tag.FluidTags; +import net.minecraft.registry.tag.TagKey; + +public class HudEffects { + + private static boolean addedHunger; + private static Set> originalTags = null; + + public static void tryApply(@Nullable PlayerEntity player, float tickDelta, boolean on) { + if (player != null) { + apply(Pony.of(player), tickDelta, on); + } + } + + private static void apply(Pony pony, float tickDelta, boolean on) { + if (on) { + if (!pony.asEntity().hasStatusEffect(StatusEffects.HUNGER) && EffectUtils.getAmplifier(pony.asEntity(), UEffects.FOOD_POISONING) > 0) { + addedHunger = true; + pony.asEntity().addStatusEffect(new StatusEffectInstance(StatusEffects.HUNGER, 1, 1, false, false)); + } + } else { + if (addedHunger) { + addedHunger = false; + pony.asEntity().removeStatusEffect(StatusEffects.HUNGER); + } + } + + if (pony.getCompositeRace().includes(Race.SEAPONY)) { + Set> fluidTags = ((EntityDuck)pony.asEntity()).getSubmergedFluidTags(); + if (on) { + originalTags = new HashSet<>(fluidTags); + if (fluidTags.contains(FluidTags.WATER)) { + fluidTags.clear(); + } else { + fluidTags.add(FluidTags.WATER); + } + } else if (originalTags != null) { + fluidTags.clear(); + fluidTags.addAll(originalTags); + originalTags = null; + } + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java index 302c546d..a999236f 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java @@ -54,7 +54,7 @@ public class TribeSelectionScreen extends GameGui implements HidesHud { final int itemWidth = 70 + 10; - List options = Race.REGISTRY.stream().filter(race -> !race.isHuman() && !race.isOp()).toList(); + List options = Race.REGISTRY.stream().filter(race -> race.availability().isSelectable()).toList(); int columns = Math.min(width / itemWidth, options.size()); diff --git a/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BodyPartGear.java b/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BodyPartGear.java index e99a9860..3ec5d015 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BodyPartGear.java +++ b/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/BodyPartGear.java @@ -15,6 +15,7 @@ import com.minelittlepony.client.model.entity.race.UnicornModel; import com.minelittlepony.client.model.part.UnicornHorn; import com.minelittlepony.mson.api.MsonModel; import com.minelittlepony.unicopia.EquinePredicates; +import com.minelittlepony.unicopia.FlightType; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.entity.AmuletSelectors; @@ -43,7 +44,7 @@ class BodyPartGear & MsonModel & IModel> public static final Predicate UNICORN_HORN_PREDICATE = MINE_LP_HAS_NO_HORN.and(AmuletSelectors.ALICORN_AMULET.or(EquinePredicates.raceMatches(Race::canCast))); public static final Identifier UNICORN_HORN = Unicopia.id("textures/models/horn/unicorn.png"); - public static final Predicate PEGA_WINGS_PREDICATE = MINE_LP_HAS_NO_WINGS.and(AmuletSelectors.PEGASUS_AMULET.or(EquinePredicates.raceMatches(Race::canInteractWithClouds))); + public static final Predicate PEGA_WINGS_PREDICATE = MINE_LP_HAS_NO_WINGS.and(AmuletSelectors.PEGASUS_AMULET.or(EquinePredicates.raceMatches(race -> race.flightType() == FlightType.AVIAN))); public static final Identifier PEGASUS_WINGS = Unicopia.id("textures/models/wings/pegasus_pony.png"); public static BodyPartGear pegasusWings() { diff --git a/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/Main.java b/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/Main.java index 1639d96b..4757d7a3 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/Main.java +++ b/src/main/java/com/minelittlepony/unicopia/client/minelittlepony/Main.java @@ -55,9 +55,9 @@ public class Main extends MineLPDelegate implements ClientModInitializer { registerRaceMapping(com.minelittlepony.api.pony.meta.Race.CHANGEDLING, Race.CHANGELING); registerRaceMapping(com.minelittlepony.api.pony.meta.Race.ZEBRA, Race.EARTH); registerRaceMapping(com.minelittlepony.api.pony.meta.Race.GRYPHON, Race.PEGASUS); - registerRaceMapping(com.minelittlepony.api.pony.meta.Race.HIPPOGRIFF, Race.PEGASUS); + registerRaceMapping(com.minelittlepony.api.pony.meta.Race.HIPPOGRIFF, Race.HIPPOGRIFF); registerRaceMapping(com.minelittlepony.api.pony.meta.Race.BATPONY, Race.BAT); - registerRaceMapping(com.minelittlepony.api.pony.meta.Race.SEAPONY, Race.UNICORN); + registerRaceMapping(com.minelittlepony.api.pony.meta.Race.SEAPONY, Race.SEAPONY); } private void onPonyModelPrepared(Entity entity, IModel model, ModelAttributes.Mode mode) { diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/ModelPartHooks.java b/src/main/java/com/minelittlepony/unicopia/client/render/ModelPartHooks.java index b892836b..21401622 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/ModelPartHooks.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/ModelPartHooks.java @@ -32,7 +32,6 @@ public class ModelPartHooks { final var bestCandidate = new EnqueudHeadRender(); - matrices.push(); part.forEachCuboid(matrices, (entry, name, index, cube) -> { float x = cube.maxX - cube.minX; float y = cube.maxY - cube.minY; @@ -47,7 +46,6 @@ public class ModelPartHooks { bestCandidate.maxSideLength = Math.max(Math.max(x, z), y); } }); - matrices.pop(); if (bestCandidate.transformation != null) { head.add(bestCandidate); @@ -75,8 +73,6 @@ public class ModelPartHooks { matrices.translate(x * PIXEL_SCALE, y * PIXEL_SCALE, z * PIXEL_SCALE); matrices.scale(scale, scale, scale); - //matrices.peek().getPositionMatrix().scaleAround(scale, x * PIXEL_SCALE, y * PIXEL_SCALE, z * PIXEL_SCALE); - //matrices.translate(cube.minX * PIXEL_SCALE, cube.minY * PIXEL_SCALE, cube.minZ * PIXEL_SCALE); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/SmittenEyesRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/SmittenEyesRenderer.java index 2459266a..9fa33446 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/SmittenEyesRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/SmittenEyesRenderer.java @@ -1,7 +1,6 @@ package com.minelittlepony.unicopia.client.render; import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.client.minelittlepony.MineLPDelegate; import com.minelittlepony.unicopia.entity.Creature; import com.minelittlepony.unicopia.item.enchantment.WantItNeedItEnchantment; @@ -20,7 +19,6 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; import net.minecraft.util.math.Box; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RotationAxis; public class SmittenEyesRenderer { private static final Identifier TEXTURE = Unicopia.id("textures/entity/smitten_eyes.png"); @@ -42,9 +40,6 @@ public class SmittenEyesRenderer { ModelPartHooks.stopCollecting().forEach(head -> { matrices.push(); head.transform(matrices, 0.95F); - if (MineLPDelegate.getInstance().getRace(pony.asEntity()).isEquine()) { - matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(-90), 0, 1.2F, 0); - } float scale = 1F + (1.3F + MathHelper.sin(pony.asEntity().age / 3F) * 0.06F); matrices.scale(scale, scale, scale); matrices.translate(0, 0.05F, 0); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WingsFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/WingsFeatureRenderer.java index b9d33535..10c8ecc3 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WingsFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WingsFeatureRenderer.java @@ -1,5 +1,6 @@ package com.minelittlepony.unicopia.client.render; +import com.minelittlepony.unicopia.FlightType; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.entity.player.Pony; @@ -50,7 +51,7 @@ public class WingsFeatureRenderer implements AccessoryFe } protected boolean canRender(E entity) { - return entity instanceof PlayerEntity && Pony.of((PlayerEntity)entity).getObservedSpecies().canInteractWithClouds(); + return entity instanceof PlayerEntity && Pony.of((PlayerEntity)entity).getObservedSpecies().flightType() == FlightType.AVIAN; } protected Identifier getTexture(E entity) { diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java index 30472c2c..78ca8e93 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java @@ -4,7 +4,10 @@ import java.util.Optional; import com.minelittlepony.client.util.render.RenderLayerUtil; import com.minelittlepony.unicopia.EquinePredicates; +import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.client.minelittlepony.MineLPDelegate; +import com.minelittlepony.unicopia.client.render.model.SphereModel; import com.minelittlepony.unicopia.entity.Creature; import com.minelittlepony.unicopia.entity.Equine; import com.minelittlepony.unicopia.entity.ItemImpl; @@ -80,6 +83,27 @@ public class WorldRenderDelegate { smittenEyesRenderer.render(creature, matrices, immediate, light, 0); } + if (pony instanceof Pony p) { + if (p.getCompositeRace().includes(Race.SEAPONY) + && pony.asEntity().isSubmergedInWater() + && MineLPDelegate.getInstance().getPlayerPonyRace(p.asEntity()) != Race.SEAPONY) { + + for (var head : ModelPartHooks.stopCollecting()) { + matrices.push(); + head.transform(matrices, 1F); + + Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); + RenderLayer layer = RenderLayers.getMagicColored(); + float scale = 0.9F; + + SphereModel.SPHERE.render(matrices, immediate.getBuffer(layer), light, 0, scale, 0.5F, 0.5F, 0.5F, 0.1F); + SphereModel.SPHERE.render(matrices, immediate.getBuffer(layer), light, 0, scale + 0.2F, 0.5F, 0.5F, 0.5F, 0.1F); + + matrices.pop(); + } + } + } + if (pony instanceof ItemImpl || pony instanceof Living) { matrices.pop(); @@ -162,6 +186,13 @@ public class WorldRenderDelegate { roll -= 180; } + if (p.getAcrobatics().isFloppy()) { + matrices.translate(0, -0.5, 0); + p.asEntity().setBodyYaw(0); + p.asEntity().setYaw(0); + matrices.multiply(RotationAxis.NEGATIVE_X.rotationDegrees(90)); + } + matrices.multiply(RotationAxis.NEGATIVE_Y.rotationDegrees(yaw)); matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(roll)); @@ -169,6 +200,12 @@ public class WorldRenderDelegate { matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(diveAngle)); matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(yaw)); + + if (p.getCompositeRace().includes(Race.SEAPONY) + && pony.asEntity().isSubmergedInWater() + && MineLPDelegate.getInstance().getPlayerPonyRace(p.asEntity()) != Race.SEAPONY) { + ModelPartHooks.startCollecting(); + } } else if (pony instanceof Creature creature && smittenEyesRenderer.isSmitten(creature)) { ModelPartHooks.startCollecting(); } diff --git a/src/main/java/com/minelittlepony/unicopia/command/SpeciesCommand.java b/src/main/java/com/minelittlepony/unicopia/command/SpeciesCommand.java index 6f93995b..1363ee96 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/SpeciesCommand.java +++ b/src/main/java/com/minelittlepony/unicopia/command/SpeciesCommand.java @@ -8,7 +8,6 @@ import com.minelittlepony.unicopia.network.MsgTribeSelect; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.command.argument.EntityArgumentType; -import net.minecraft.command.argument.RegistryKeyArgumentType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.CommandManager.RegistrationEnvironment; @@ -32,8 +31,6 @@ class SpeciesCommand { } } - RegistryKeyArgumentType raceArgument = Race.argument(); - return builder .then(CommandManager.literal("get") .executes(context -> get(context.getSource(), context.getSource().getPlayer(), true)) @@ -41,13 +38,13 @@ class SpeciesCommand { .executes(context -> get(context.getSource(), EntityArgumentType.getPlayer(context, "target"), false)) )) .then(CommandManager.literal("set") - .then(CommandManager.argument("race", raceArgument) + .then(CommandManager.argument("race", Race.argument()) .executes(context -> set(context.getSource(), context.getSource().getPlayer(), Race.fromArgument(context, "race"), true)) .then(CommandManager.argument("target", EntityArgumentType.player()) .executes(context -> set(context.getSource(), EntityArgumentType.getPlayer(context, "target"), Race.fromArgument(context, "race"), false))) )) .then(CommandManager.literal("describe") - .then(CommandManager.argument("race", raceArgument) + .then(CommandManager.argument("race", Race.argument()) .executes(context -> describe(context.getSource().getPlayer(), Race.fromArgument(context, "race"))) )) .then(CommandManager.literal("list") @@ -101,7 +98,7 @@ class SpeciesCommand { boolean first = true; for (Race i : Race.REGISTRY) { - if (!i.isUnset() && i.isPermitted(player)) { + if (i.availability().isGrantable() && !i.isUnset() && i.isPermitted(player)) { message.append(Text.literal((!first ? "\n" : "") + " - ")); message.append(i.getDisplayName()); first = false; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/AmuletSelectors.java b/src/main/java/com/minelittlepony/unicopia/entity/AmuletSelectors.java index 96fc930b..81211527 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/AmuletSelectors.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/AmuletSelectors.java @@ -10,6 +10,7 @@ public interface AmuletSelectors { Predicate ALICORN_AMULET = UItems.ALICORN_AMULET::isApplicable; Predicate PEGASUS_AMULET = UItems.PEGASUS_AMULET::isApplicable; Predicate UNICORN_AMULET = UItems.UNICORN_AMULET::isApplicable; + Predicate PEARL_NECKLACE = UItems.PEARL_NECKLACE::isApplicable; Predicate ALICORN_AMULET_AFTER_1_DAYS = ALICORN_AMULET.and(ItemTracker.wearing(UItems.ALICORN_AMULET, ItemTracker.after(ItemTracker.DAYS))); Predicate ALICORN_AMULET_AFTER_2_DAYS = ALICORN_AMULET.and(ItemTracker.wearing(UItems.ALICORN_AMULET, ItemTracker.after(2 * ItemTracker.DAYS))); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java b/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java index 0a61652d..659a3a24 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/duck/EntityDuck.java @@ -1,12 +1,18 @@ package com.minelittlepony.unicopia.entity.duck; +import java.util.Set; + import com.minelittlepony.unicopia.compat.pehkui.PehkuiEntityExtensions; import net.minecraft.entity.Entity; import net.minecraft.entity.Entity.RemovalReason; +import net.minecraft.fluid.Fluid; +import net.minecraft.registry.tag.TagKey; public interface EntityDuck extends LavaAffine, PehkuiEntityExtensions { + Set> getSubmergedFluidTags(); + void setRemovalReason(RemovalReason reason); void setVehicle(Entity vehicle); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java index f7168730..462936ad 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java @@ -34,6 +34,7 @@ public class RaceChangeStatusEffect extends StatusEffect { public static final StatusEffect CHANGE_RACE_BAT = register(0x0FFF00, Race.BAT); public static final StatusEffect CHANGE_RACE_CHANGELING = register(0xFFFF00, Race.CHANGELING); public static final StatusEffect CHANGE_RACE_KIRIN = register(0xFF8800, Race.KIRIN); + public static final StatusEffect CHANGE_RACE_HIPPOGRIFF = register(0x00FFFF, Race.HIPPOGRIFF); private final Race race; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/UPotions.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/UPotions.java index 2ff93a59..82f5a0b3 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/UPotions.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/UPotions.java @@ -18,6 +18,8 @@ public interface UPotions { Potion TRIBE_SWAP_PEGASUS = register("tribe_swap_pegasus", new Potion("unicopia.tribe_swap_pegasus", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_PEGASUS, RaceChangeStatusEffect.MAX_DURATION))); Potion TRIBE_SWAP_BAT = register("tribe_swap_bat", new Potion("unicopia.tribe_swap_bat", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_BAT, RaceChangeStatusEffect.MAX_DURATION))); Potion TRIBE_SWAP_CHANGELING = register("tribe_swap_changeling", new Potion("unicopia.tribe_swap_changeling", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_CHANGELING, RaceChangeStatusEffect.MAX_DURATION))); + Potion TRIBE_SWAP_KIRIN = register("tribe_swap_kirin", new Potion("unicopia.tribe_swap_kirin", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_KIRIN, RaceChangeStatusEffect.MAX_DURATION))); + Potion TRIBE_SWAP_HIPPOGRIFF = register("tribe_swap_hippogriff", new Potion("unicopia.tribe_swap_hippogriff", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_HIPPOGRIFF, RaceChangeStatusEffect.MAX_DURATION))); static Potion register(String name, Potion potion) { REGISTRY.add(potion); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java index 032d4f89..1607c64a 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java @@ -7,6 +7,7 @@ import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation.Recipient; import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; +import com.minelittlepony.unicopia.entity.mob.StormCloudEntity; import com.minelittlepony.unicopia.util.NbtSerialisable; import com.minelittlepony.unicopia.util.Tickable; @@ -17,6 +18,8 @@ import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; @@ -42,6 +45,17 @@ public class Acrobatics implements Tickable, NbtSerialisable { pony.addTicker(this::checkDislodge); } + public boolean isImmobile() { + return isFloppy() && entity.isOnGround(); + } + + public boolean isFloppy() { + if (entity.isCreative() && entity.getAbilities().flying) { + return false; + } + return pony.getCompositeRace().any(Race::isFish) && !entity.isTouchingWater() && !entity.getWorld().isWater(StormCloudEntity.findSurfaceBelow(entity.getWorld(), entity.getBlockPos())); + } + @Override public void tick() { BlockPos climbingPos = entity.getClimbingPos().orElse(null); @@ -115,6 +129,11 @@ public class Acrobatics implements Tickable, NbtSerialisable { } else { ticksHanging = 0; } + + + if (pony.getCompositeRace().includes(Race.SEAPONY) && !entity.isSubmergedInWater() && pony.landedChanged()) { + entity.getWorld().playSound(null, entity.getBlockPos(), SoundEvents.ENTITY_GUARDIAN_FLOP, SoundCategory.PLAYERS, 1, 1); + } } boolean isFaceClimbable(World world, BlockPos pos, Direction direction) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java index 1b396f98..8bbccdef 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java @@ -36,12 +36,23 @@ public class PlayerAttributes implements Tickable { new ToggleableAttribute( new EntityAttributeModifier(UUID.fromString("9e2699fc-3b8d-4f71-9d2d-fb92ee19b4f7"), "Pegasus Speed", 0.2, Operation.MULTIPLY_TOTAL), List.of(EntityAttributes.GENERIC_MOVEMENT_SPEED, EntityAttributes.GENERIC_ATTACK_SPEED), - pony -> pony.getCompositeRace().canFly() + pony -> pony.getCompositeRace().canFly() && !pony.getCompositeRace().includes(Race.HIPPOGRIFF) ), new ToggleableAttribute( new EntityAttributeModifier(UUID.fromString("707b50a8-03e8-40f4-8553-ecf67025fd6d"), "Pegasus Reach", 1.5, Operation.ADDITION), List.of(UEntityAttributes.EXTENDED_REACH_DISTANCE), - pony -> pony.getCompositeRace().canFly() + pony -> pony.getCompositeRace().canFly() && !pony.getCompositeRace().includes(Race.HIPPOGRIFF) + ), + + new ToggleableAttribute( + new EntityAttributeModifier(UUID.fromString("9e2699fc-3b8d-4f71-92dd-bef19b92e4f7"), "Hippogriff Speed", 0.1, Operation.MULTIPLY_TOTAL), + List.of(EntityAttributes.GENERIC_MOVEMENT_SPEED, EntityAttributes.GENERIC_ATTACK_SPEED), + pony -> pony.getCompositeRace().includes(Race.HIPPOGRIFF) + ), + new ToggleableAttribute( + new EntityAttributeModifier(UUID.fromString("707b50a8-03e8-40f4-5853-fc7e0f625d6d"), "Hippogriff Reach", 1.3, Operation.ADDITION), + List.of(UEntityAttributes.EXTENDED_REACH_DISTANCE), + pony -> pony.getCompositeRace().includes(Race.HIPPOGRIFF) ), new ToggleableAttribute( diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java index bd070bd7..04b5bf22 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java @@ -3,9 +3,11 @@ package com.minelittlepony.unicopia.entity.player; import java.util.Optional; import com.minelittlepony.common.util.animation.MotionCompositor; +import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; +import net.minecraft.client.render.CameraSubmersionType; import net.minecraft.util.math.Vec3d; public class PlayerCamera extends MotionCompositor { @@ -35,6 +37,11 @@ public class PlayerCamera extends MotionCompositor { roll = player.getInterpolator().interpolate("roll", (float)roll, 15); } + + if (player.getAcrobatics().isFloppy()) { + roll += 90; + } + return (float)roll; } @@ -54,6 +61,15 @@ public class PlayerCamera extends MotionCompositor { .map(d -> distance * d); } + public Optional getSubmersionType(CameraSubmersionType original) { + if (player.getCompositeRace().includes(Race.SEAPONY)) { + if (original == CameraSubmersionType.WATER) { + return Optional.of(CameraSubmersionType.NONE); + } + } + return Optional.empty(); + } + public double calculateFieldOfView(double fov) { fov += player.getMagicalReserves().getExertion().get() / 5F; fov += getEnergyAddition(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index ca497829..bb9b68e9 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -414,7 +414,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickab if (type.isAvian()) { if (pony.getObservedSpecies() != Race.BAT && entity.getWorld().random.nextInt(9000) == 0) { - entity.dropItem(UItems.PEGASUS_FEATHER); + entity.dropItem(pony.getObservedSpecies() == Race.HIPPOGRIFF ? UItems.GRYPHON_FEATHER : UItems.PEGASUS_FEATHER); playSound(USounds.ENTITY_PLAYER_PEGASUS_MOLT, 0.3F, 1); UCriteria.SHED_FEATHER.trigger(entity); } @@ -513,7 +513,9 @@ public class PlayerPhysics extends EntityPhysics implements Tickab if (entity.getWorld().random.nextInt(110) == 1 && !pony.isClient()) { pony.getLevel().add(1); - pony.getMagicalReserves().getCharge().addPercent(4); + if (Abilities.RAINBOOM.canUse(pony.getCompositeRace())) { + pony.getMagicalReserves().getCharge().addPercent(4); + } pony.getMagicalReserves().getExertion().set(0); pony.getMagicalReserves().getExhaustion().set(0); mana.set(mana.getMax() * 100); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 2487a67c..74dfa609 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -36,7 +36,9 @@ import com.google.common.collect.Streams; import com.minelittlepony.common.util.animation.Interpolator; import com.mojang.authlib.GameProfile; +import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.*; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.damage.DamageSource; @@ -359,6 +361,7 @@ public class Pony extends Living implements Copyable, Update .orElseGet(this::getSpecies).composite( AmuletSelectors.UNICORN_AMULET.test(entity) ? Race.UNICORN : AmuletSelectors.ALICORN_AMULET.test(entity) ? Race.ALICORN + : AmuletSelectors.PEARL_NECKLACE.test(entity) ? Race.SEAPONY : null ); } @@ -428,6 +431,23 @@ public class Pony extends Living implements Copyable, Update } } + if (getCompositeRace().includes(Race.SEAPONY)) { + if (entity.isSubmergedInWater()) { + if (entity.getVelocity().lengthSquared() > 0.02) { + spawnParticles(ParticleTypes.BUBBLE, 4); + } + } else { + if (entity.getAir() == entity.getMaxAir()) { + entity.setAir(entity.getAir() - 1); + } + + if (entity.getAir() == -20) { + entity.setAir(0); + entity.damage(entity.getDamageSources().dryOut(), 2); + } + } + } + return super.beforeUpdate(); } @@ -568,6 +588,14 @@ public class Pony extends Living implements Copyable, Update if (getObservedSpecies() == Race.KIRIN) { return Optional.of(speed.multiply(0.5, 1, 0.5)); } + if (getCompositeRace().includes(Race.SEAPONY)) { + float factor = entity.isSwimming() ? 1.132F : 1.232F; + return Optional.of(new Vec3d( + speed.x * factor, + speed.y * 1.101, + speed.z * factor + )); + } return Optional.empty(); } @@ -595,6 +623,18 @@ public class Pony extends Living implements Copyable, Update return false; } + public int getImplicitEnchantmentLevel(Enchantment enchantment) { + + if ((enchantment == Enchantments.AQUA_AFFINITY + || enchantment == Enchantments.DEPTH_STRIDER + || enchantment == Enchantments.LUCK_OF_THE_SEA + || enchantment == Enchantments.LURE) && getCompositeRace().includes(Race.SEAPONY)) { + return 3; + } + + return 0; + } + public Optional modifyDamage(DamageSource cause, float amount) { if (getObservedSpecies() == Race.KIRIN) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 011bff35..282f9e3e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -197,6 +197,9 @@ public interface UItems { .maxCount(1) .maxDamage(890) .rarity(Rarity.UNCOMMON), 0), ItemGroups.TOOLS); + AmuletItem PEARL_NECKLACE = register("pearl_necklace", new AmuletItem(new FabricItemSettings() + .maxCount(1) + .rarity(Rarity.UNCOMMON), 0), ItemGroups.TOOLS); GlassesItem SUNGLASSES = register("sunglasses", new GlassesItem(new FabricItemSettings().maxCount(1)), ItemGroups.COMBAT); GlassesItem BROKEN_SUNGLASSES = register("broken_sunglasses", new GlassesItem(new FabricItemSettings().maxCount(1)), ItemGroups.COMBAT); @@ -213,6 +216,7 @@ public interface UItems { Item BAT_BADGE = register(Race.BAT); Item CHANGELING_BADGE = register(Race.CHANGELING); Item KIRIN_BADGE = register(Race.KIRIN); + Item HIPPOGRIFF_BADGE = register(Race.HIPPOGRIFF); private static T register(String name, T item, RegistryKey group) { return ItemGroupRegistry.register(Unicopia.id(name), item, group); diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java index 051b9f73..82157234 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java @@ -22,12 +22,14 @@ public interface Toxics { Toxic EDIBLE = register("edible", new Toxic.Builder(Ailment.INNERT) .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) + .with(Race.SEAPONY, of(FAIR, FOOD_POISONING)) ); Toxic FORAGE_EDIBLE = register("forage_edible", new Toxic.Builder(Ailment.INNERT) .food(UFoodComponents.RANDOM_FOLIAGE) .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) + .with(Race.SEAPONY, of(FAIR, FOOD_POISONING)) ); Toxic FORAGE_EDIBLE_FILLING = register("forage_edible_filling", new Toxic.Builder(Ailment.INNERT) @@ -59,6 +61,7 @@ public interface Toxics { Toxic FORAGE_PRICKLY = register("forage_prickly", new Toxic.Builder(of(SAFE, INSTANT_DAMAGE.withChance(30))) .food(UFoodComponents.RANDOM_FOLIAGE) .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) + .with(Race.HIPPOGRIFF, Ailment.INNERT) .with(Race.KIRIN, Ailment.INNERT) ); Toxic FORAGE_STRENGHTENING = register("forage_strengthening", new Toxic.Builder(of(SEVERE, STRENGTH.and(FOOD_POISONING))) @@ -94,6 +97,7 @@ public interface Toxics { Toxic COOKED_MEAT = register("cooked_meat", new Toxic.Builder(of(FAIR, FOOD_POISONING)) .with(Race.HUMAN, Ailment.INNERT) .with(Race.CHANGELING, Ailment.INNERT) + .with(Race.HIPPOGRIFF, of(MILD, FOOD_POISONING)) .with(Race.BAT, Ailment.INNERT) .with(Race.KIRIN, Ailment.INNERT) ); @@ -101,12 +105,16 @@ public interface Toxics { Toxic RAW_FISH = register("raw_fish", new Toxic.Builder(of(FAIR, FOOD_POISONING.and(CHANCE_OF_POISON))) .with(Race.HUMAN, Ailment.INNERT) .with(Race.PEGASUS, of(MILD, FOOD_POISONING)) + .with(Race.HIPPOGRIFF, Ailment.INNERT) + .with(Race.SEAPONY, Ailment.INNERT) .with(Race.ALICORN, Ailment.INNERT) .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) ); Toxic COOKED_FISH = register("cooked_fish", new Toxic.Builder(of(MILD, FOOD_POISONING)) .with(Race.HUMAN, Ailment.INNERT) .with(Race.PEGASUS, Ailment.INNERT) + .with(Race.HIPPOGRIFF, Ailment.INNERT) + .with(Race.SEAPONY, Ailment.INNERT) .with(Race.ALICORN, Ailment.INNERT) .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) ); @@ -129,6 +137,7 @@ public interface Toxics { Toxic PINECONE = register("pinecone", new Toxic.Builder(of(Toxicity.SAFE, Toxin.healing(1))) .with(Race.HUMAN, Ailment.INNERT) + .with(Race.HIPPOGRIFF, of(Toxicity.SAFE, Toxin.healing(3))) ); Toxic BAT_PONYS_DELIGHT = register("bat_ponys_delight", new Toxic.Builder(Ailment.INNERT) diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java new file mode 100644 index 00000000..71ecc8f9 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java @@ -0,0 +1,25 @@ +package com.minelittlepony.unicopia.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.LivingEntity; + +@Mixin(EnchantmentHelper.class) +abstract class MixinEnchantmentHelper { + @Inject(method = "getEquipmentLevel", at = @At("RETURN"), cancellable = true) + private static void getEquipmentLevel(Enchantment enchantment, LivingEntity entity, CallbackInfoReturnable info) { + Pony.of(entity).ifPresent(pony -> { + int implicitLevel = pony.getImplicitEnchantmentLevel(enchantment); + if (implicitLevel > 0) { + info.setReturnValue(implicitLevel + info.getReturnValue()); + } + }); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java index a522b101..90febf2d 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia.mixin; +import java.util.Set; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; @@ -17,9 +19,15 @@ import com.minelittlepony.unicopia.entity.duck.EntityDuck; import net.minecraft.entity.Entity; import net.minecraft.entity.Entity.PositionUpdater; import net.minecraft.entity.Entity.RemovalReason; +import net.minecraft.fluid.Fluid; +import net.minecraft.registry.tag.TagKey; @Mixin(Entity.class) abstract class MixinEntity implements EntityDuck { + @Override + @Accessor("submergedFluidTag") + public abstract Set> getSubmergedFluidTags(); + @Override @Accessor public abstract void setRemovalReason(RemovalReason reason); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java index 9d96e9c1..71d0907c 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java @@ -11,6 +11,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.entity.duck.PlayerEntityDuck; +import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.entity.Equine; import com.minelittlepony.unicopia.entity.player.Pony; import com.mojang.datafixers.util.Either; @@ -114,4 +115,20 @@ abstract class MixinPlayerEntity extends LivingEntity implements Equine.Containe private void onGetBlockBreakingSpeed(BlockState state, CallbackInfoReturnable info) { info.setReturnValue(info.getReturnValue() * get().getBlockBreakingSpeed()); } + + @Override + protected int getNextAirUnderwater(int air) { + if (EquinePredicates.PLAYER_SEAPONY.test(this)) { + return super.getNextAirOnLand(air); + } + return super.getNextAirUnderwater(air); + } + + @Override + protected int getNextAirOnLand(int air) { + if (EquinePredicates.PLAYER_SEAPONY.test(this)) { + return super.getNextAirUnderwater(air); + } + return super.getNextAirOnLand(air); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPufferfishEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPufferfishEntity.java new file mode 100644 index 00000000..ecadb831 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPufferfishEntity.java @@ -0,0 +1,25 @@ +package com.minelittlepony.unicopia.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.passive.FishEntity; +import net.minecraft.entity.passive.PufferfishEntity; + +@Mixin(PufferfishEntity.class) +abstract class MixinPufferfishEntity extends FishEntity { + MixinPufferfishEntity() { super(null, null); } + + @Inject(method = "method_6591(Lnet/minecraft/class_1309;)Z", at = @At("HEAD"), cancellable = true) + private static void onShouldTarget(LivingEntity entity, CallbackInfoReturnable info) { + Pony.of(entity).filter(pony -> pony.getCompositeRace().includes(Race.SEAPONY)).ifPresent(pony -> { + info.setReturnValue(false); + }); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java index 81f9f5da..6444e002 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java @@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.client.UnicopiaClient; import net.minecraft.client.render.Camera; +import net.minecraft.client.render.CameraSubmersionType; @Mixin(Camera.class) abstract class MixinCamera { @@ -33,4 +34,11 @@ abstract class MixinCamera { private void redirectCameraDistance(double initial, CallbackInfoReturnable info) { UnicopiaClient.getCamera().flatMap(c -> c.calculateDistance(info.getReturnValueD())).ifPresent(info::setReturnValue); } + + @Inject(method = "getSubmersionType", + at = @At("RETURN"), + cancellable = true) + public void getSubmersionType(CallbackInfoReturnable info) { + UnicopiaClient.getCamera().flatMap(c -> c.getSubmersionType(info.getReturnValue())).ifPresent(info::setReturnValue); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinInGameHud.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinInGameHud.java index fa02c81d..e4306cbd 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinInGameHud.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinInGameHud.java @@ -6,43 +6,27 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.minelittlepony.unicopia.client.gui.HudEffects; import com.minelittlepony.unicopia.client.gui.UHud; -import com.minelittlepony.unicopia.entity.effect.EffectUtils; -import com.minelittlepony.unicopia.entity.effect.UEffects; - import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; @Mixin(InGameHud.class) abstract class MixinInGameHud { - private boolean addedHunger; - @Shadow abstract PlayerEntity getCameraPlayer(); @Inject(method = "render(Lnet/minecraft/client/gui/DrawContext;F)V", at = @At("HEAD")) private void onRender(DrawContext context, float tickDelta, CallbackInfo info) { - PlayerEntity player = getCameraPlayer(); - if (player != null && !player.hasStatusEffect(StatusEffects.HUNGER) && EffectUtils.getAmplifier(player, UEffects.FOOD_POISONING) > 0) { - addedHunger = true; - player.addStatusEffect(new StatusEffectInstance(StatusEffects.HUNGER, 1, 1, false, false)); - } + HudEffects.tryApply(getCameraPlayer(), tickDelta, true); UHud.INSTANCE.render((InGameHud)(Object)this, context, tickDelta); } @Inject(method = "render(Lnet/minecraft/client/gui/DrawContext;F)V", at = @At("RETURN")) private void afterRender(DrawContext context, float tickDelta, CallbackInfo info) { - if (addedHunger) { - addedHunger = false; - PlayerEntity player = getCameraPlayer(); - if (player != null) { - player.removeStatusEffect(StatusEffects.HUNGER); - } - } + HudEffects.tryApply(getCameraPlayer(), tickDelta, false); } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinKeyboardInput.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinKeyboardInput.java index c0fd45da..7bc83f17 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinKeyboardInput.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinKeyboardInput.java @@ -40,6 +40,11 @@ abstract class MixinKeyboardInput extends Input { movementForward = 0; jumping = false; } + + if (player.getAcrobatics().isImmobile()) { + movementSideways = 0; + movementForward = 0; + } } } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinModelPart.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinModelPart.java index 4fb5cd9a..aef4d87d 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinModelPart.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinModelPart.java @@ -39,7 +39,7 @@ abstract class MixinModelPart implements Hookable { isHeadPart = true; } - @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;IIFFFF)V", at = @At("RETURN")) + @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;IIFFFF)V", at = @At("HEAD")) public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha, CallbackInfo info) { if (visible && isHeadPart) { ModelPartHooks.onHeadRendered((ModelPart)(Object)this, matrices); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 8017b7e3..febcc802 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -52,6 +52,7 @@ "item.unicopia.changeling_badge": "Changeling Emblem", "item.unicopia.bat_badge": "Bat Pony Emblem", "item.unicopia.kirin_badge": "Kirin Emblem", + "item.unicopia.hippogriff_badge": "Hippogriff Emblem", "item.unicopia.butterfly_spawn_egg": "Butterfly Spawn Egg", "item.unicopia.butterfly": "Butterfly", @@ -141,13 +142,16 @@ "item.unicopia.alicorn_amulet": "Alicorn Amulet", "item.unicopia.alicorn_amulet.lore": "Time worn: %d", + "item.unicopia.pearl_necklace": "Pearl Necklace", + "item.unicopia.pearl_necklace.lore": "Gives underwater abilities to the wearer", + "item.unicopia.horse_shoe.accuracy": "Accuracy: %d%%", "item.unicopia.horse_shoe.speed": "Speed: %d", "item.unicopia.iron_horse_shoe": "Iron Horse Shoe", "item.unicopia.golden_horse_shoe": "Golden Horse Shoe", "item.unicopia.copper_horse_shoe": "Copper Horse Shoe", "item.unicopia.netherite_horse_shoe": "Netherite Horse Shoe", - + "item.unicopia.broken_alicorn_amulet": "Broken Alicorn Amulet", "item.unicopia.unicorn_amulet": "Unicorn Amulet", "item.unicopia.unicorn_amulet.lore": "Grants magical abilities to whoever wears it", @@ -344,6 +348,12 @@ "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_kirin": "Lingering Potion of Kirin Metamorphosis", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_kirin": "Arrow of Kirin Metamorphosis", + "effect.unicopia.change_race_hippogriff": "Hippogriff Metamorphosis", + "item.minecraft.potion.effect.unicopia.tribe_swap_hippogriff": "Potion of Hippogriff Metamorphosis", + "item.minecraft.splash_potion.effect.unicopia.tribe_swap_hippogriff": "Splash Potion of Hippogriff Metamorphosis", + "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "Lingering Potion of Hippogriff Metamorphosis", + "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "Arrow of Hippogriff Metamorphosis", + "potion.potency.6": "VII", "spell.unicopia.frost": "Frost", @@ -480,6 +490,11 @@ "ability.unicopia.rainboom": "Sonic Rainboom", "ability.unicopia.rage": "Rage", "ability.unicopia.nirik_blast": "Nirik Blast", + "ability.unicopia.screech": "Screech", + "ability.unicopia.peck": "Peck/Squawk", + "ability.unicopia.peck.block.fled": "The block has fled", + "ability.unicopia.peck.block.unfased": "The block is unfazed by your threats", + "ability.unicopia.dash": "Flying Dash", "gui.unicopia.trait.label": "Element of %s", "gui.unicopia.trait.group": "\n %s", @@ -511,6 +526,7 @@ "gui.unicopia.tribe_selection.describe.unicopia.pegasus": "Join the Pegasus Tribe, soar with the Wonderbolts", "gui.unicopia.tribe_selection.describe.unicopia.bat": "Join the Bat Tribe, become the darkest night", "gui.unicopia.tribe_selection.describe.unicopia.kirin": "Join the Kirin's Village, take the vow of silence", + "gui.unicopia.tribe_selection.describe.unicopia.hippogriff": "Join Hippogriff Tibe, screech at your neighbors", "gui.unicopia.tribe_selection.describe.unicopia.changeling": "Join the Changeling Hive, your Queen demands it", "gui.unicopia.tribe_selection.confirm": "You have selected %s", @@ -551,6 +567,11 @@ "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.kirin": " - Is silent in their default state, and can move freely around the warden", "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.kirin": " - Can eat fruits and vegetables, red meats, and some foraged items normally toxic to other races", + "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.hippogriff": " - Flight and the ability to train to build endurance", + "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.hippogriff": " - Can dash whilst flying", + "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.hippogriff": " - Has a sharp and noisy beak for screeching and pecking", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.hippogriff": " - Loves stairs, fish, and meat, but mostly stairs", + "gui.unicopia.tribe_selection.confirm.bads": "but they...", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.human": " - Have no magical abilities what-so-ever", @@ -586,6 +607,11 @@ "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.kirin": " - Lighter than other ponies, and might take increased knockback", "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.kirin": " - Doesn't like water", + "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.hippogriff": " - Weak to brute force attacks", + "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.hippogriff": " - Must rest between flights to regain their strength", + "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.hippogriff": " - Has a bird brain", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.hippogriff": "", + "gui.unicopia.tribe_selection.join": "Join Tribe", "gui.unicopia.tribe_selection.cancel": "Go Back", @@ -811,6 +837,10 @@ "unicopia.race.bat.alt": "Bat Ponies", "unicopia.race.kirin": "Kirin", "unicopia.race.kirin.alt": "Kirins", + "unicopia.race.hippogriff": "Hippogriff", + "unicopia.race.hippogriff.alt": "Hippogriffs", + "unicopia.race.seapony": "Sea Pony", + "unicopia.race.seapony.alt": "Sea Ponies", "death.attack.unicopia.generic.and_also": "%1$s and %2$s", "death.attack.unicopia.generic.whilst_flying": "%1$s whilst flying", @@ -932,6 +962,7 @@ "unicopia.subtitle.entity.player.kick": "Player kicks", "unicopia.subtitle.magic_aura": "Magic humming", "unicopia.subtitle.player.rebound": "Player Bounces Off Wall", + "unicopia.subtitle.screech": "Player Screeches", "unicopia.subtitle.ears_ringing": "Ears ringing", "unicopia.subtitle.heartbeat": "Heart beats", "unicopia.subtitle.entity.artefact.ambient": "Magic hums", diff --git a/src/main/resources/assets/unicopia/models/item/hippogriff_badge.json b/src/main/resources/assets/unicopia/models/item/hippogriff_badge.json new file mode 100644 index 00000000..c37d99ce --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/hippogriff_badge.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/hippogriff_badge" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/pearl_necklace.json b/src/main/resources/assets/unicopia/models/item/pearl_necklace.json new file mode 100644 index 00000000..8716891e --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/pearl_necklace.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/amulet", + "textures": { + "layer0": "unicopia:item/pearl_necklace" + } +} diff --git a/src/main/resources/assets/unicopia/sounds.json b/src/main/resources/assets/unicopia/sounds.json index 86d150a5..67885c5c 100644 --- a/src/main/resources/assets/unicopia/sounds.json +++ b/src/main/resources/assets/unicopia/sounds.json @@ -29,6 +29,13 @@ } ] }, + "entity.player.hippogriff.screech": { + "category": "player", + "subtitle": "unicopia.subtitle.screech", + "sounds": [ + "unicopia:screech/screech0" + ] + }, "item.magic.aura": { "category": "player", "subtitle": "unicopia.subtitle.magic_aura", diff --git a/src/main/resources/assets/unicopia/sounds/screech/screech0.ogg b/src/main/resources/assets/unicopia/sounds/screech/screech0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1343c5e5d1b245130979cf73b2a1d011336de62b GIT binary patch literal 39055 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ⅆLBR1*I&>-Fm6Ur2vGuA7n&^A@)6;pDrYnn># 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/dash.png b/src/main/resources/assets/unicopia/textures/gui/ability/dash.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f3938a977a669cc299a3382d4bcf09e04ff01d GIT binary patch literal 7125 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/dash_old.png b/src/main/resources/assets/unicopia/textures/gui/ability/dash_old.png new file mode 100644 index 0000000000000000000000000000000000000000..029293fef9d55aa2e8e8be3baba18d4254176ce8 GIT binary patch literal 8759 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 T=2>#!d;n|-+pIG;?mhfJ?zi~Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/peck.png b/src/main/resources/assets/unicopia/textures/gui/ability/peck.png new file mode 100644 index 0000000000000000000000000000000000000000..a89a7cb325cddd35006f5a7e7ac00e4e0c3f8930 GIT binary patch literal 7346 zcmeHMX;@R&);?h-h%zMBi>M(E1Y#fw36PYa0zt5%hAD^?49Ni^Lt+wSE=omfoKV4D zD-J}dieSWvK@jIzQOh8M2vr0@5m2Bw@$C~vTkrGL``rFBJ}YOPz1LoQz3*Ckk#pRz zWYK(mv3}g{iPC^jhz$_b7+npe z4yl8&bwG@Oj@Te#g3?r7HvxU}ke&{7!jO#`&?zW2NFQ7?flz^t0oNQL!u5lDodfzk zAUdjlZa_mk4`1iIdo00GttezG8yZ+orrIzm6eigo2fnHHOdC63joLpN5m*Z8LLZ?) z--xGSOo-cIOo%>=$qDG{L-8WaXpPaaLpp*Tr8el(4Ou&+a}jdEXE64GhXaj}!2(xz zSFjNR1AGnCLC%nlmX@}brjE9@wyv%YdK^Z7oSxpee;FB1z)UfjHg$@LsVQ!Tl{pSS zd%CG9!OmhfnL?w{rkOKX_EZOen~FF=>FVl^(;GKQUw;zS%+!qf#h-!mkf9C|lR63y zsTrcw4N(J^p=lsaO_b_02n7MEuA!-=t)q+90|uuJ5T?}CG}JXUH8j9%5}1cH3^k3+ zDD$+8IXrFrN(^<)wk)0LPWczGp7%Rv*aS;bbkP&Pne;D{nX}9Z7M3)+t(`rC>FmOG zo$uzpz{}gmm+QCGpD%zzLc@eBq_XH$F|l#+Kdwz(xBjOM^6fj)Gj{&`?_Iwr4jjz> z_0ZuXIVVn@I(?>~u&DUrrOQ{YUb}wd=7ZlVDyym=*3>rr{^V)%vzFH9ZC%~3-}LnM z{n7sx!G+)){tP1f6D~u5OHD&VT|*neg;I+_fE#LPno+cj=5e%nD~<8gH98olZCUvj zbf?>Rc4C7i_t6t)(3)m;A<$IF{vNQD{|ea%uu)vK&^UDzNS?YOGzaScC@1V!`zNHd zO5PLy;?Sb%iuUXU)fL@xVr6R{LqBO(*B)%g=_a2m_L5Am^#l$ZtD%`R00lvuxtf^2 zDG7Plww{_rdz4427i1_810VNfsn}+WZ{o8b?)AiXgPkpZDe~N0zNu9itwbNwy_DXV z$#6P104Y}!4&w+4IYdx^yZsYZ6O?7`jc9O-4Ee|llNJ?w=OsDG3CDgs zNKlk0vdakl=!mxuux9l*{9YO;C$>H~{$#QyhMT_RQHtkr z?$P^fUBBsIfaA?+#ys20WUe~^9W8tFx;DA)O!K=}3H=cX z2K%ZV@?Jmgc!9(ds0>QnbDK}x%L%*_I47_?h_N^HagAenU*h||!Pse!*=k@H}nLlOep{mHFiR^93@VmtgQt7hnyzu^W%|!uQt;R+b zS?r}bm2*MWsDTJpt3*}T{zcTy7v+d*T_Bg6e+9fmfh%MivLKCOp4_7)K!BLO^2t|)PEd+?C8bIKrBr^ zT}}uWhEH4JBkyYKSq;JY+Z_DJrchI8af$)eDqliK4hJzsAB3 zDbKaJhMQC5gd75LqLIeaev>#WmrrE*MtQ(^H+F)y1!#NT94_PaH;mU)+mTKY zsQmu;w?eRyzlmxmWH*E*EGb}@YZEw0@uj-;(}}4->50>K*>inIAy*Y9mld_19<>HE z9W669W(hb#D$#!2)2TUni$cN*VvZi~IQA+!{}?B~?G1;$B4TVuTFj2q$8OkM9;h?} zoUE?zHtEdi^Y6^LSm3<302C8Z-QcekMSzrLt)Qc-KMJpGf5PnZe{smO?_PVhZ{JW8 zCWagn5$cgz?Uq{_=V!wF%2p*ov5yf53_$BVkjctw>uJV-p4O#(6$`pq4~wxS45Te( zv6&K$^zK}ujB!*33gkHD&s8#Vj|6JjIo=$c87M+VqB|gVeH3*SshP zP&#w2N}I`<{fkev0&-8$hf?^tN*k`Y&s?Xrvtxa*WoNo=dmH8#-w(vHr`BC(6>I~4 zJyJRI&vZ|Sd zi?JFPCKzzPF=u~c(Ut6;#onZS?L%zLtCfA@JME4xq$e1y&ROa@D+43x_c8lJ?zqg-@6n;r&d;U#I}qf6JS&)S!FJNC7-a?!KY6V+CxJYUByndeX{e4g32;Xv+ei_0yS zpJ;ub_Q$sN6SqW}-;IA47gBLOkXOVL45+YawX>#g*sdoC1&&3WE5ZPj~xkwD^e{(Amu6K}UI z)80?`AtrpHxq1CTH>1|1{FhrfxI(>CCTBh*MbzaP<2uI$2&W|H>E2G<-q0GBKYjV~ z$%Ta-Vck>3Me5^N&$pW~JXil(=BLq6-nzT{d?U#qP?`|_>d70_bx-c|$&HN$lZc$& z;%jG}AC-Pc`1R4_33s`YTLH!sHh^cUSfRI{%+F&XlP`+2;t52-uvKiNSoK@eVNR@= z#}9{PxL`O`7{$WBI$MUv2?Z=Xm+nFK5Ie(RLbrGc>=nPrn;##}X9)0f9MKN3OyD3A zmho`0kr7c+W-JS@^2-D|GHi{wbgW<@5kV}+}zct&Qs!u`8r9 z_A20HD4@@-kb1|7VQWuVDvFlyVfHFGN;ZA03ju#*y*OGDp@JjeTf-4>BruhNT`8Yz zi9A7$tUxFT6-J6xs{q-bSjvPUqhx&&8#1GUGd2*ge8lf3*2CCU#=y$MgXtpTMBf-IT3=++jPA4&fc~p`BrVIECm`}H%Q^&Y+kCMuG zQG6J21)N(6fuCS9&7LCQlS#HPFN8!R^I#H#W*B1t3ytdYZma{%@ranDRh+=r;1oZM7ZnPF?lDxZ!{frwl>$t* z*fJeX;C{NWJ7aT#A zD2q?6W5Qr03xF^Zg+e0R|CuoBA;8v1&lpDRVEq?P98?BlnhaPsI0l**=!MoJ&2We_ zr0x8JpP^j*gF67%UpM(8e!tT7m98&h;ERmER@Ya$zKDS@GX7d!|1-MKqmNT?6!;Ys z10I$VH?gSTQA;cMyZJ8A1}FsDDr=ov21aznZcC-$f3}PfK|#M{P6C74GItNQc8i{l zp6Ser>W}-t({!@C%RFztOD}hpE>Pzfq?YOObmzSn<|bP&5MpZQBg(_z2{H-yrxw8EHfc=qR|Yu z&T@m@TUT*=E58>_QQjhJJg~j-UFr$DgO|3Govb;@-PIdi8@nv2wtDX~xZzl+-tV+; z{t0IVCe6VJpFoIkJNWiS$E?S*k8QiNaMP7%5bDPCK%*^Ba2uVjZfMB$CfKybk#A;K zw>I>fO|CoIdAOuB@p6OAfOz@ox2vl-Q`6r{cOR*t(VAW_6DHB;yI#yaKgII(PmWpj z#8;aq?pb6m)+_0*OLI$|RrbMSy!g0OLwfPHtm@zOn3E?P(HQ}v`UL%>r{(#z@vpAUHq@B3j|?69&=x-n-u4?SF>fI%l1I*8cWd-&$*v z4Vwb|=8r*HqaX+x!}j(J1a}N9#)jZ3PfhKHAXAhej4fod9Ux;c1}qW!5CXOVf*7Ui zA&?LfjI9SU9_X+QEY=7E-F*wtrwr-4fsPxp(E~aep$Clt_e>xZpj&}^E)da%!L=>{ zy&8zI?#CNwF!JzyKHE0{LvbXN9G$3OK8fPQAd?v+8U|b`bf5rhMAmzcz*NWt>W2og zVWi=hVA$c9V0}2Ic|b=F`3o~+I7&wk>2T}_y+KTGc41v5}FHiHR}F%xa98sj1oI@s?w)Y^|qFwY9df!OU>9$6#kq zx3R&w&YDdkQ>oNx_H=g|#SO$wfk6-^CMIU4W|PK@nMAR(v7>zUXW$An&KULyiNHd7 z;}FPkh=DR_8t~Hqq5BMm0tbrJH!w6ZHbI#JgL4)zQ%F61q=A9HK6tAH?;-th2IK9> z9)^}2t`RoDijuxF+j#oCQ&-V}w>xJzMakBhpe9V5G}-#AnfAC@4pe6sR~ntc^kjL> z_hv5$3SJZv8n$=|k1r5L$B0(Q6^Sd8l2cN@%~-d7!^TajUEl5Av-kTS_U%_6K63Qf z@thO6r_Y={_tW{pq6?+h%6`6HUhzxiZ@=HExm$a$uKv-#njg13X>EJj-lhGcyXRH! z>%KQ|TyUJjpTWpJifbH*OHW@Psc!_wh0sfa10SbvU`I9_@4+$RCRk!A>Bd&`c4nWt zYBJp^uoE36yN#MKgZk*JE;uw@WdB}ZYyYFjMgn^uS3P8gM1bTW$3b61ef=t2mfqhX zC3jUlsn3r4)!ykix}f%sR)w!=%cqY~?&~^$esS*6qMvE9%%BZ84hyYspd5gfL7ce; zR{y4~%15{N)cGCIoTy!}N0S3EsukKgU_{SVQ|d@G@)u$+k$c*-g33d zL50Gp*Nhf7b+N;xn;Kj}>h70fzZGXSVtAR5n z#sP@19WaFFK^h#O>S*3~xCgIqsd|@m=7Nm+fy9Djto;kwgPG16n+TG3>r!GtWg<~& zeqoVRIW|;>^V5na+O4I2x|Ypz;_gFY5ro#BwM zJ(zYHUbP@UJRI1<>3p@MEBDos-wp+}QHXsh+IRC*xP1RKocf~m!|Tnf^KQIo?ClU| z)Rl9VZbe^xcYXl!8-S+0M##72quOG(X_(0EZ>n4`#)fM&JIgnhDuwm+<>!OZE$EJ# zc6(kc52LZuL~87gEQE`+z%pZW1%FD%*Tr7XtBYNr^v|le+|qiZ2ZbxRUX)PSl&gJv zzU0k)USnKy-l+nHid;y{m%Y7v?#;6Jm}fC+RUa03o@LHBi_b1dy>yv){ax&j4d?Rj zzI~u|itbDsfS9#8YE}348CvVkTsVuR=b8J@!z3UrK4uK=P|&Z)mv7*1(h;f=Xsk7f z`6uuXy0y=i)fAQ7Z*0nei!4z#?pYO1T@tCHBkK;5mu_8I(}I4|tbKV>3wxKEa`WKcf0J3*A+oi>?Y~M)W8RSpyJp&axBDPnvkGZ>E;8tU{{~avnQBS_JP=>m(bT zCF!6t4eeM~0f-?nYU=4Uc>joC!7ah4DYf~z)aI(L;8*@>FCDJf)P*$o9;}o|lrn_5IOa#ECtdMX|c&)$*y#NOWXJBswglO&-z)dTe>raHEaB zgPufp8bGV^Q%lmKBRiJvZjXFptH^D9GgT7_QxaG6Ys(a{E27)G?c=u;fTGb=8e&f$SlGlY*c0BwtZ4)LCBt8r>Z%=8bq8Tytz<@L+&~SL=1s2JT`F&x z^Siouy{h`|qxVGK{ojckO)9K|-!6}WL;CMm+`pePwF7L2R;#3#SB>*8+>S)Errxh` zKfeQPr0E+uEGy_EK@8MEW%k8S!B?CN5tA9fW->AHGO17$CxD>jOyy2@?`v~yeqI)S z^k|69Gt9qsWHahmtg;g!*~aL3`PI4K{&I9#^$|OELV{I5kVs zJ5Jw_W-c^;nQn_C=(0_Il-vD;?ldiC{Z-axeyZml?XtG@R!af{X2 zJ%WPYZ9Gt$!`2!jDD62}DAR-`&VfGsn6IBcnzr&!Y!P3!=t{+@HP*r2+ot_Fc6Czh z1bh1jN4&?kDNjA$&cPI#p0)nzoigrzz9pv9EJ9@aO}@#^v|WvDF{h?4Up}R<@I{Pv zYJ3sW%>C&uJ9^-nW0%A98>`xW)LwZ=u!xkeihbGKji?9=eLCggLyJjx&Z`UM7nuzu z?^YdaXc~JfRCXi6a_lB>dPx=qhbh8*eHc8c*pbVZMhP5~#qqjtb#7lL$8&kH0tF^Y z5G|6pV_#mpjKzrf?$}UgUy^S;QxGHaPL&CQQvHH?sj)mdAN%zjlv^?b0Eh(&E+$zV zCy_If-LX1c2GHSQA{L`FQN+4q!@voIDU}H@R7a{KiNH!0t)yV*pfGMSzK{{<=`{oa zp4_o93Pn7FNK8sfa!hh^l**!sWICNrBvFVI3ISLUFNkp-jIC_R$!CDDGh8+6j z40&)$ynq-ekV_L~JOOK^K%$sF8iLOonIE4hi_?X}=Me>Q0x>X^gH_2NED4|0MrObi zM2p1nx>x_YwuP?(>%1eaZV|%(|;q@7O zDNn>_=v11J%y)I+@d#up#hE~j;<*xNBtDJcB8;MvT%uffR5EuI6k8%!a3wqe3qrHNm_yCIR zLZOrRQLY3YmnI-kU7Y9yE}bhNxR9x2p{tO_7t#lz_&kP}R3_$vbc)2>XaO-^60KVU zCY<3Bz;?${97*p-0^+y|A(-Hf^$|%Dli$Ax7KsHx3NFkh*@aH0QYmyQ&6(yzb{qiYHVmp2%KoV!xM*ZB#s24C@FxRPiA*gb~Ib$DF#iBb@7orTVPR~muJ zrBT5}Kqo|zD6Rww3G}=Zmq+C~4U#m1E|&@wNnDx0BO34sxB}&=``ZQvr%TkV4}D3B z5x`jhgb~PO0*Ur9VZ@<;iSV8=9I+emFPymP3`T7-VBX*u*u21ANF3P=hd2ZN{+*wp zT>PC&U@%`6`7D0F(Dj9`&tl-SjK5UZ7rH)+fzLAjQeFQwx=`Z&-U~P4!ia|v_w)$vgkJ#y!h>?zelYk&de-D&(KpXvHd}7=3{#=V68>FrRT=< zt@&G?2ayyVOMbCkGQGTuzKwTh!E-i8jq6hODtmdzZyG9EkN3Sh4E};33khc$+ik26 zJ+CNF8Gju84Z}FJHFD==aZ~K~l^gk(LjBaotbIu6@kRB`t+JdoJ~wyRKleJ5{_y0) z$|8c+52_Cve|!%rf$ep{vs-+mZK-;RVrJaw9a8fOhkyezpL^Cpk1ew!UiZ2DV}20E z$o_l6MC-3A_BsU~Zt1qQ@%IX$%{mDcYDEhiEsZrZW?%z7yeC9Bg&W*1)5E8mWc2^q zaN_~a0NR+hy|N+J`hwrN{+MOTQ&XbWIUj5OrK&r(&<~j%f25zmD6?)%2!EBH)vA~8e5NStrun!(`DF)onLz{3 bd+*!dtMARZ8+Gh8e2!+b{5%WhEnoXTINNi~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/toggle_flight_land_hippogriff.png b/src/main/resources/assets/unicopia/textures/gui/ability/toggle_flight_land_hippogriff.png new file mode 100644 index 0000000000000000000000000000000000000000..4d981f1e75d54241e5fb5c20c2fef66403e323bf GIT binary patch literal 7240 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/toggle_flight_takeoff_hippogriff.png b/src/main/resources/assets/unicopia/textures/gui/ability/toggle_flight_takeoff_hippogriff.png new file mode 100644 index 0000000000000000000000000000000000000000..46068f0d68715b369ac7e693e87711415db71cd4 GIT binary patch literal 8117 zcmeHMd011|wm;01ib_%yQ7~3P(~yBMMGys|paMpbAX6HW01-k$5@sV-MQd&yNuB{G1(0qG4+g;$U2aBpQ_!LA$3_;KWTb8T6kG=hRNENgJOF2bI4z>Xz z_k}JmrvNE{wxd8610A-3MO#iucK-qB%V+gipc~BE$O9cOClAdB_aq<$pd-Nj5)k&W znYoIAUJXQ5_Gbq)7EZgGc+QC@i>AJ36Ce?%=GX$lCc@d*ce#L{ruS@ zFceaQrl1*Y7-^0Z3_HgO*5^1`16^U(UpO+#U+BnL9p)}4KZ9upkDb*g=D`!p`99q+ z-3Be(w#9x6m8%R}ISw&e%RYgTbO-)sO9%BAH4UKur7HerDR%q+4T%oO_ zqxZF;z8>nE)jB!`rt7}J;fX||uD-dY8NmYZCcq$aYHDipH0CXxKYuAa-4$lySq@lR}pq|2NyZu59f+ zQ&%@SFdU*jWOWTAF*SWuH$HwIO-4|wlD{J(cFKJrDhW?LCwa(^U94^U&(wSnqX#aH zeD&K#{LiUkgN4+~^*;eAh>5DGitiCQ&5x>R9S@bNk1Y^)^ggNlaKOt+P(pJ;y9O*G{6Znv~dIJp-7@%;!jIYKU+?v(X6Qt z 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 W?nC(PQUmxnZclc!&9?sb(0>722C8}h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/race/hippogriff.png b/src/main/resources/assets/unicopia/textures/gui/race/hippogriff.png new file mode 100644 index 0000000000000000000000000000000000000000..057c22409e21fdc91613ef0bc6383267b36b0e52 GIT binary patch literal 6551 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/hippogriff_badge.png b/src/main/resources/assets/unicopia/textures/item/hippogriff_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..057c22409e21fdc91613ef0bc6383267b36b0e52 GIT binary patch literal 6551 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/pearl_necklace.png b/src/main/resources/assets/unicopia/textures/item/pearl_necklace.png new file mode 100644 index 0000000000000000000000000000000000000000..057c22409e21fdc91613ef0bc6383267b36b0e52 GIT binary patch literal 6551 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/trinkets/tags/items/chest/necklace.json b/src/main/resources/data/trinkets/tags/items/chest/necklace.json index 675082d4..6b3f0e07 100644 --- a/src/main/resources/data/trinkets/tags/items/chest/necklace.json +++ b/src/main/resources/data/trinkets/tags/items/chest/necklace.json @@ -3,6 +3,7 @@ "values": [ "unicopia:alicorn_amulet", "unicopia:pegasus_amulet", - "unicopia:unicorn_amulet" + "unicopia:unicorn_amulet", + "unicopia:pearl_necklace" ] } \ No newline at end of file diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 95738783..045db477 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -17,6 +17,7 @@ "MixinChunkBlockLightProvider", "MutableBlockLightStorage", "MixinDamageSource", + "MixinEnchantmentHelper", "MixinFallLocation", "MixinEntity", "MixinEntityShapeContext", @@ -34,6 +35,7 @@ "MixinPlayerManager", "MixinPowderSnowBlock", "MixinProjectileEntity", + "MixinPufferfishEntity", "MixinServerPlayerEntity", "MixinServerPlayNetworkHandler", "MixinServerWorld", From 917af90f37a6470d1ce25f0cb9e85019235f07b0 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 8 Nov 2023 14:51:54 +0000 Subject: [PATCH 39/90] Revamp the tribe selection screen so it can handle more options --- .../unicopia/client/gui/TextBlock.java | 2 +- .../unicopia/client/gui/TribeButton.java | 6 +- .../client/gui/TribeConfirmationScreen.java | 57 +++++++++--- .../client/gui/TribeSelectionScreen.java | 93 +++++++++++++++---- .../resources/assets/unicopia/lang/en_us.json | 32 ++++--- 5 files changed, 138 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/TextBlock.java b/src/main/java/com/minelittlepony/unicopia/client/gui/TextBlock.java index 8943da6e..b72f46fc 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/TextBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/TextBlock.java @@ -13,13 +13,13 @@ public class TextBlock extends Label { public TextBlock(int x, int y, int width) { super(x, y); this.maxWidth = width; - this.render(null, x, y, width); } @Override public Bounds getBounds() { Bounds bounds = super.getBounds(); bounds.height = getFont().wrapLines(getStyle().getText(), maxWidth).size() * getFont().fontHeight; + bounds.width = 0; return bounds; } diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeButton.java b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeButton.java index 46e09f3a..2b4549a6 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeButton.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeButton.java @@ -41,10 +41,10 @@ public class TribeButton extends Button { MinecraftClient mc = MinecraftClient.getInstance(); context.drawTexture(TribeSelectionScreen.TEXTURE, getX() - 3, getY() - 13, 0, 0, 76, 69); - if (isHovered()) { + if (isSelected()) { context.drawTexture(TribeSelectionScreen.TEXTURE, getX() - 4, getY() - 14, 76, 0, 78, 71); - if (hovered && screenWidth > 0) { + if (isFocused() && screenWidth > 0) { Identifier id = Race.REGISTRY.getId(race); context.drawCenteredTextWithShadow(getFont(), Text.translatable("gui.unicopia.tribe_selection.describe." + id.getNamespace() + "." + id.getPath()), screenWidth / 2, getY() + height, 0xFFFFFFFF); } @@ -59,7 +59,7 @@ public class TribeButton extends Button { int foreColor = getStyle().getColor(); if (!active) { foreColor = 10526880; - } else if (isHovered()) { + } else if (isSelected()) { foreColor = 16777120; } diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeConfirmationScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeConfirmationScreen.java index bc241ebd..bc8ea6a8 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeConfirmationScreen.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeConfirmationScreen.java @@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.client.gui; import org.lwjgl.glfw.GLFW; import com.minelittlepony.common.client.gui.GameGui; +import com.minelittlepony.common.client.gui.ScrollContainer; import com.minelittlepony.common.client.gui.element.Button; import com.minelittlepony.common.client.gui.element.Label; import com.minelittlepony.unicopia.Race; @@ -17,6 +18,8 @@ public class TribeConfirmationScreen extends GameGui implements HidesHud { private final BooleanConsumer callback; + private final ScrollContainer textBody = new ScrollContainer(); + public TribeConfirmationScreen(BooleanConsumer callback, Race selection) { super(Text.translatable("gui.unicopia.tribe_selection")); this.callback = callback; @@ -25,12 +28,26 @@ public class TribeConfirmationScreen extends GameGui implements HidesHud { @Override protected void init() { - final int columnHeight = 167; final int columnWidth = 310; final int padding = 15; int top = (height - columnHeight) / 2; + int left = (width - columnWidth) / 2 + 8; + int maxWidth = 295; + + textBody.verticalScrollbar.layoutToEnd = true; + textBody.margin.top = top + 43; + textBody.margin.left = left; + textBody.margin.right = width - (left + maxWidth); + textBody.margin.bottom = height - (textBody.margin.top + 130); + textBody.getContentPadding().top = 10; + textBody.getContentPadding().left = 8; + textBody.getContentPadding().bottom = 100; + textBody.getContentPadding().right = 0; + textBody.init(this::buildTextBody); + + getChildElements().add(textBody); addDrawableChild(new Button(width / 2 + 5, top + columnHeight + padding, 100, 20)) .onClick(b -> callback.accept(true)) @@ -42,38 +59,40 @@ public class TribeConfirmationScreen extends GameGui implements HidesHud { addDrawable(new Label(width / 2, top - 30).setCentered()).getStyle().setText(Text.translatable("gui.unicopia.tribe_selection.confirm", selection.getDisplayName().copy().formatted(Formatting.YELLOW))); addDrawable(new TribeButton((width - 70) / 2, top, 0, selection)); + } - top += 43; + private void buildTextBody() { + int top = 0; - int left = (width - columnWidth) / 2 + padding; + int left = 0; Text race = selection.getAltDisplayName().copy().formatted(Formatting.YELLOW); - addDrawable(new Label(left - 3, top += 10)).getStyle().setText(Text.translatable("gui.unicopia.tribe_selection.confirm.goods", race).formatted(Formatting.YELLOW)); + textBody.addButton(new Label(left - 3, top += 10)).getStyle().setText(Text.translatable("gui.unicopia.tribe_selection.confirm.goods", race).formatted(Formatting.YELLOW)); top += 15; - int maxWidth = 280; + int maxWidth = 270; Identifier id = Race.REGISTRY.getId(selection); - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 10; i++) { String key = String.format("gui.unicopia.tribe_selection.confirm.goods.%d.%s.%s", i, id.getNamespace(), id.getPath()); if (Language.getInstance().hasTranslation(key)) { - TextBlock block = addDrawable(new TextBlock(left, top, maxWidth)); + TextBlock block = textBody.addButton(new TextBlock(left, top, maxWidth)); block.getStyle().setText(Text.translatable(key)); top += block.getBounds().height; } } - addDrawable(new Label(left - 3, top += 5)).getStyle().setText(Text.translatable("gui.unicopia.tribe_selection.confirm.bads", race).formatted(Formatting.YELLOW)); + textBody.addButton(new Label(left - 3, top += 5)).getStyle().setText(Text.translatable("gui.unicopia.tribe_selection.confirm.bads", race).formatted(Formatting.YELLOW)); top += 15; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 10; i++) { String key = String.format("gui.unicopia.tribe_selection.confirm.bads.%d.%s.%s", i, id.getNamespace(), id.getPath()); if (Language.getInstance().hasTranslation(key)) { - TextBlock block = addDrawable(new TextBlock(left, top, maxWidth)); + TextBlock block = textBody.addButton(new TextBlock(left, top, maxWidth)); block.getStyle().setText(Text.translatable(key)); top += block.getBounds().height; } @@ -91,7 +110,7 @@ public class TribeConfirmationScreen extends GameGui implements HidesHud { int top = (height - columnHeight) / 2; int left = (width - columnWidth) / 2; - top += 25; + top += 40; final int zOffset = 0; @@ -106,12 +125,16 @@ public class TribeConfirmationScreen extends GameGui implements HidesHud { left = width / 2; context.drawTexture(TribeSelectionScreen.TEXTURE, left - 55, top, 140, 70, 21, 50); - - context.drawTexture(TribeSelectionScreen.TEXTURE, left - 35, top, 10, 70, 69, 50); - context.drawTexture(TribeSelectionScreen.TEXTURE, left + 35, top, 148, 70, 21, 50); + textBody.render(context, mouseX, mouseY, delta); + + context.getMatrices().push(); + context.getMatrices().translate(0, 0, 2); + context.drawTexture(TribeSelectionScreen.TEXTURE, left - 35, top - 5, 10, 70, 69, 50); + context.drawTexture(TribeSelectionScreen.TEXTURE, left - 35, top - 15, 10, 70, 69, 50); super.render(context, mouseX, mouseY, delta); + context.getMatrices().pop(); } @Override @@ -122,7 +145,11 @@ public class TribeConfirmationScreen extends GameGui implements HidesHud { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_ESCAPE) { - + callback.accept(false); + return true; + } + if (keyCode == GLFW.GLFW_KEY_ENTER) { + callback.accept(true); return true; } return super.keyPressed(keyCode, scanCode, modifiers); diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java index a999236f..73551090 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java @@ -1,8 +1,11 @@ package com.minelittlepony.unicopia.client.gui; +import java.util.ArrayList; import java.util.List; import java.util.Set; +import org.lwjgl.glfw.GLFW; + import com.minelittlepony.common.client.gui.GameGui; import com.minelittlepony.common.client.gui.element.Label; import com.minelittlepony.unicopia.Race; @@ -14,6 +17,7 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; public class TribeSelectionScreen extends GameGui implements HidesHud { static final Identifier TEXTURE = Unicopia.id("textures/gui/tribe_selection.png"); @@ -25,6 +29,13 @@ public class TribeSelectionScreen extends GameGui implements HidesHud { private boolean finished; + private final List options = new ArrayList<>(); + private static int SELECTION = -1; + + private int prevScrollPosition; + private int scrollPosition; + private int targetScroll; + public TribeSelectionScreen(Set allowedRaces, String baseString) { super(Text.translatable(baseString)); this.allowedRaces = allowedRaces; @@ -52,33 +63,26 @@ public class TribeSelectionScreen extends GameGui implements HidesHud { top += block.getBounds().height; top += 30; - final int itemWidth = 70 + 10; - List options = Race.REGISTRY.stream().filter(race -> race.availability().isSelectable()).toList(); - - int columns = Math.min(width / itemWidth, options.size()); - - int x = (width - (columns * itemWidth)) / 2; - int y = top; - - int column = 0; - int row = 0; + this.options.clear(); for (Race race : options) { - addOption(race, x + (column * itemWidth), y + (row * itemWidth)); - column++; - if (column >= columns) { - column = 0; - row++; - } + addOption(race, top); } - top = height - 20; + if (SELECTION == -1) { + SELECTION = options.size() / 2; + } + scroll(SELECTION, false); } - private void addOption(Race race, int x, int y) { - addDrawableChild(new TribeButton(x, y, width, race)).onClick(b -> { + private void addOption(Race race, int y) { + var option = new TribeButton(0, y, width, race); + int index = options.size(); + options.add(addDrawableChild(option)); + option.onClick(b -> { finished = true; + scroll(index, false); client.setScreen(new TribeConfirmationScreen(result -> { finished = false; @@ -92,8 +96,32 @@ public class TribeSelectionScreen extends GameGui implements HidesHud { }).setEnabled(allowedRaces.contains(race)); } + @Override + public void tick() { + prevScrollPosition = scrollPosition; + if (scrollPosition < targetScroll) { + scrollPosition++; + } + if (scrollPosition > targetScroll) { + scrollPosition--; + } + } + + private void updateScolling() { + final int itemWidth = 70 + 10; + int x = (width - itemWidth) / 2; + float diff = MathHelper.lerp(client.getTickDelta(), prevScrollPosition, scrollPosition) / 8F; + + for (int i = 0; i < options.size(); i++) { + var option = options.get(i); + option.setX((int)(x + (i - diff) * itemWidth)); + option.setFocused(i == SELECTION); + } + } + @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { + updateScolling(); renderBackground(context); super.render(context, mouseX, mouseY, delta); } @@ -104,6 +132,33 @@ public class TribeSelectionScreen extends GameGui implements HidesHud { close(); } + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + + if (keyCode == GLFW.GLFW_KEY_LEFT) { + scroll(Math.max(SELECTION - 1, 0), true); + return true; + } + if (keyCode == GLFW.GLFW_KEY_RIGHT) { + scroll(Math.min(SELECTION + 1, options.size() - 1), true); + return true; + } + if (keyCode == GLFW.GLFW_KEY_ENTER) { + options.get(SELECTION).onPress(); + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + private void scroll(int target, boolean animate) { + SELECTION = target; + targetScroll = SELECTION * 8; + if (!animate) { + scrollPosition = targetScroll; + prevScrollPosition = scrollPosition; + } + } + @Override public boolean shouldCloseOnEsc() { return false; diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index febcc802..9d0d14ab 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -535,12 +535,14 @@ "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.human": " - Are omnivores and can eat all types of food except for love", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.human": " - Opposable thumbs", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.human": " - Walking upright", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.human": "", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.earth": " - Stronger knockback and resistance to magic", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.earth": " - Have extra weight makes them effective against magic and brute force", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.earth": " - A special connection to the earth that makes farming 10,000% more effective!", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.earth": " - Cute floppy pony ears", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.earth": " - Has powerful punches, kicks, and stomps that they can use to defend or attack their environment", + "gui.unicopia.tribe_selection.confirm.goods.5.unicopia.earth": " - Is the only one that can hug creepers and survive", + "gui.unicopia.tribe_selection.confirm.goods.6.unicopia.earth": " - Can eat rocks", + "gui.unicopia.tribe_selection.confirm.goods.7.unicopia.earth": " - Cute floppy pony ears", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.unicorn": " - Teleportation and magic spells", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.unicorn": " - Research and craft magical artefacts that enhance their abilities", @@ -550,7 +552,8 @@ "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.pegasus": " - Flight and the ability to train to build endurace", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.pegasus": " - Use stored mana to dash in short bursts or build it up to perform a powerful rainboom", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.pegasus": " - Moves faster and takes less fall damage", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.pegasus": " - Can eat vegetables and certain types of fish", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.pegasus": " - Can interact directly with cloud items and blocks", + "gui.unicopia.tribe_selection.confirm.goods.5.unicopia.pegasus": " - Can eat vegetables and certain types of fish", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.bat": " - Flight and the ability to train to build endurance", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.bat": " - Sees better in the night", @@ -559,8 +562,8 @@ "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.changeling": " - Able to fly and hover in place", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.changeling": " - Shapeshift and morph into nearly anyone or anyling", - "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.changeling": " - Is carnivorous. Can eat anything that doesn't make them sick", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.changeling": "", + "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.changeling": " - Sticks to walls and can climb over almost enything", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.changeling": " - Is carnivorous. Can eat anything that doesn't make them sick", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.kirin": " - Immune to all types of fire damage", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.kirin": " - Can unlock a rage ability by taking damage", @@ -570,18 +573,21 @@ "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.hippogriff": " - Flight and the ability to train to build endurance", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.hippogriff": " - Can dash whilst flying", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.hippogriff": " - Has a sharp and noisy beak for screeching and pecking", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.hippogriff": " - Loves stairs, fish, and meat, but mostly stairs", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.hippogriff": " - Can eat raw and cooked fish, cooked meat", + "gui.unicopia.tribe_selection.confirm.goods.5.unicopia.hippogriff": " - Heals extra hearts when eating pinecones", + "gui.unicopia.tribe_selection.confirm.goods.6.unicopia.hippogriff": " - Loves stairs", "gui.unicopia.tribe_selection.confirm.bads": "but they...", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.human": " - Have no magical abilities what-so-ever", - "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.human": " - Need an Elytra to fly", + "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.human": " - Needs an Elytra to fly", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.human": " - Must grow food the old fashioned way, through hard work and manual labour", "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.human": " - No floppy ears", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.earth": " - Cannot fly", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.earth": " - Are weak to certain types of magic", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.earth": " - Can only eat plants and vegetables", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.earth": " - Heavier and moves slower than the other ponies", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.unicorn": " - Cannot fly", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.unicorn": " - Are weak to brute force attacks", @@ -590,17 +596,15 @@ "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.pegasus": " - Light weight makes them the weakest to brute force", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.pegasus": " - Must rest between flights to regain their strength", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.pegasus": " - Cannot use magic without aid from others", - "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.pegasus": "", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.bat": " - Light weight makes them weak to brute force attacks", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.bat": " - Must rest between flights to regain their strength", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.bat": " - Is sometimes scared of even themselves", - "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.bat": " - Is carnivorous. Can eat anything that doesn't make them sick", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.bat": " - Is carnivorous. Can eat raw and cooked meat, or sustain themselved purely on stolen love.", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.changeling": " - Are always starving", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.changeling": " - Requires love, collected from ponies or other hostile mobs to subsidise their diet", - "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.changeling": " - Becomes sick from eating regular food and must eat love to hasten a cure", - "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.changeling": "", + "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.changeling": " - Becomes sick from eating most regular food and must harvest love to hasten a cure", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.kirin": " - Are no longer quiet whilst raging", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.kirin": " - Has a tendency to burn things, especially when close to raging", @@ -608,9 +612,9 @@ "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.kirin": " - Doesn't like water", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.hippogriff": " - Weak to brute force attacks", - "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.hippogriff": " - Must rest between flights to regain their strength", - "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.hippogriff": " - Has a bird brain", - "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.hippogriff": "", + "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.hippogriff": " - Cannot interact with clouds", + "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.hippogriff": " - Must rest between flights to regain their strength", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.hippogriff": " - Has a bird brain", "gui.unicopia.tribe_selection.join": "Join Tribe", "gui.unicopia.tribe_selection.cancel": "Go Back", From c656eb2309e351c7335eff08a43d5d1a4310c5d8 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 8 Nov 2023 15:19:07 +0000 Subject: [PATCH 40/90] Make beds waterlog --- .../unicopia/mixin/MixinBlockItem.java | 11 +++++++++++ .../unicopia/mixin/MixinStateManager.java | 2 +- .../server/world/WaterLoggingManager.java | 16 +++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java index 06382199..3cc48210 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java @@ -1,12 +1,18 @@ package com.minelittlepony.unicopia.mixin; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.item.toxin.ToxicHolder; +import com.minelittlepony.unicopia.server.world.WaterLoggingManager; +import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; +import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; @@ -28,4 +34,9 @@ abstract class MixinBlockItem extends Item implements ToxicHolder { .map(t -> t.use(world, player, hand)) .orElseGet(() -> super.use(world, player, hand)); } + + @Inject(method = "getPlacementState", at = @At("RETURN"), cancellable = true) + private void onGetPlacementState(ItemPlacementContext context, CallbackInfoReturnable info) { + WaterLoggingManager.getInstance().getPlacementState(context, info); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinStateManager.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinStateManager.java index c31f2822..ff62db5f 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinStateManager.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinStateManager.java @@ -69,4 +69,4 @@ abstract class MixinBlockState extends State { private void onGetStateForNeighborUpdate(Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos, CallbackInfoReturnable info) { WaterLoggingManager.getInstance().getUpdatedState(world, pos, asBlockState(), info); } -} \ No newline at end of file +} diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/WaterLoggingManager.java b/src/main/java/com/minelittlepony/unicopia/server/world/WaterLoggingManager.java index 2372a3bb..9d96541e 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/WaterLoggingManager.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/WaterLoggingManager.java @@ -8,6 +8,8 @@ import net.minecraft.block.*; import net.minecraft.block.enums.DoubleBlockHalf; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.registry.tag.FluidTags; import net.minecraft.state.State; import net.minecraft.state.property.Properties; import net.minecraft.state.property.Property; @@ -35,11 +37,22 @@ public class WaterLoggingManager> { } public void getDefaultState(O owner, CallbackInfoReturnable info) { + if (owner instanceof BedBlock) { + return; + } if (appliesTo(owner, info.getReturnValue())) { info.setReturnValue(info.getReturnValue().with(Properties.WATERLOGGED, true)); } } + @SuppressWarnings("unchecked") + public void getPlacementState(ItemPlacementContext context, CallbackInfoReturnable info) { + BlockState state = info.getReturnValue(); + if (state != null && appliesTo((O)state.getBlock(), (S)state)) { + info.setReturnValue(state.with(Properties.WATERLOGGED, context.getWorld().getFluidState(context.getBlockPos()).isIn(FluidTags.WATER))); + } + } + public void getFluidState(O owner, S state, CallbackInfoReturnable info) { if (appliesTo(owner, state)) { info.setReturnValue((state.get(Properties.WATERLOGGED) ? Fluids.WATER : Fluids.EMPTY).getDefaultState()); @@ -61,7 +74,8 @@ public class WaterLoggingManager> { && (block instanceof SeagrassBlock || block instanceof TallSeagrassBlock || block instanceof KelpBlock - || block instanceof KelpPlantBlock); + || block instanceof KelpPlantBlock + || block instanceof BedBlock); } public boolean shouldPreventRemoval(WorldAccess world, BlockPos pos, AbstractBlock.AbstractBlockState oldState, AbstractBlock.AbstractBlockState newState) { From 873297ca4450f2cf3dabea0f5536bf6aa4dbc8d6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 9 Nov 2023 15:07:56 +0000 Subject: [PATCH 41/90] Added respawn logic to place seaponies in water --- .../unicopia/entity/player/Pony.java | 12 +-- .../unicopia/entity/player/SpawnLocator.java | 82 +++++++++++++------ 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 74dfa609..486e0316 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -54,6 +54,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.particle.ParticleTypes; import net.minecraft.registry.tag.DamageTypeTags; +import net.minecraft.registry.tag.FluidTags; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; @@ -340,11 +341,12 @@ public class Pony extends Living implements Copyable, Update } public void onSpawn() { - if (entity.getWorld() instanceof ServerWorld sw - && getObservedSpecies() == Race.BAT - && sw.getServer().getSaveProperties().getGameMode() != GameMode.ADVENTURE - && MeteorlogicalUtil.isPositionExposedToSun(sw, getOrigin())) { - SpawnLocator.selectSpawnPosition(sw, entity); + if (entity.getWorld() instanceof ServerWorld sw && sw.getServer().getSaveProperties().getGameMode() != GameMode.ADVENTURE) { + boolean mustAvoidSun = getObservedSpecies() == Race.BAT && MeteorlogicalUtil.isPositionExposedToSun(sw, getOrigin()); + boolean mustAvoidAir = getCompositeRace().includes(Race.SEAPONY) && !sw.getFluidState(getOrigin()).isIn(FluidTags.WATER); + if (mustAvoidSun || mustAvoidAir) { + SpawnLocator.selectSpawnPosition(sw, entity, mustAvoidAir, mustAvoidSun); + } } ticksSunImmunity = INITIAL_SUN_IMMUNITY; } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/SpawnLocator.java b/src/main/java/com/minelittlepony/unicopia/entity/player/SpawnLocator.java index 4c49f017..13d30bf3 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/SpawnLocator.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/SpawnLocator.java @@ -1,37 +1,68 @@ package com.minelittlepony.unicopia.entity.player; -import java.util.Optional; - import com.minelittlepony.unicopia.util.MeteorlogicalUtil; -import net.minecraft.entity.ai.FuzzyPositions; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.FluidState; +import net.minecraft.registry.tag.FluidTags; import net.minecraft.server.network.SpawnLocating; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.*; import net.minecraft.util.math.random.Random; +import net.minecraft.world.Heightmap; +import net.minecraft.world.chunk.WorldChunk; public class SpawnLocator extends SpawnLocating { - - public static BlockPos findSafeSpawnLocation(ServerWorld world, int x, int z) { - return SpawnLocating.findOverworldSpawn(world, x, z); - } - - public static Optional fuzz(ServerWorld world, BlockPos pos, int horizontal, int vertical) { - - for (int attempt = 0; attempt < 6; attempt++) { - BlockPos target = FuzzyPositions.localFuzz(world.random, horizontal, vertical); - target = findSafeSpawnLocation(world, target.getX(), target.getZ()); - - if (target != null) { - return Optional.of(target); - } + private static BlockPos findSafeSpawnLocation(ServerWorld world, int x, int z, boolean avoidAir) { + if (!avoidAir) { + return findOverworldSpawn(world, x, z); } - return Optional.empty(); + boolean hasCeiling = world.getDimension().hasCeiling(); + WorldChunk chunk = world.getChunk(ChunkSectionPos.getSectionCoord(x), ChunkSectionPos.getSectionCoord(z)); + int startHeight = hasCeiling + ? world.getChunkManager().getChunkGenerator().getSpawnHeight(world) + : chunk.sampleHeightmap(Heightmap.Type.MOTION_BLOCKING, x & 0xF, z & 0xF); + if (startHeight < world.getBottomY()) { + return null; + } + + int terrainHeight = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, x & 0xF, z & 0xF); + if (terrainHeight <= startHeight && terrainHeight > chunk.sampleHeightmap(Heightmap.Type.OCEAN_FLOOR, x & 0xF, z & 0xF)) { + return null; + } + + BlockPos.Mutable mutable = new BlockPos.Mutable(); + for (int y = startHeight + 1; y >= world.getBottomY(); --y) { + mutable.set(x, y, z); + BlockState state = world.getBlockState(mutable); + FluidState fluid = state.getFluidState(); + if (fluid.isEmpty()) { + continue; + } + if (!fluid.isIn(FluidTags.WATER)) { + break; + } + if (!Block.isFaceFullSquare(state.getCollisionShape(world, mutable), Direction.UP)) { + continue; + } + + return mutable.up().toImmutable(); + } + return null; } - public static void selectSpawnPosition(ServerWorld world, PlayerEntity entity) { + private static boolean checkAtmosphere(ServerWorld world, BlockPos pos, boolean avoidAir) { + if (avoidAir) { + return world.getFluidState(pos).isIn(FluidTags.WATER); + + } + return world.getFluidState(pos).isEmpty(); + } + + public static void selectSpawnPosition(ServerWorld world, PlayerEntity entity, boolean avoidAir, boolean avoidSun) { BlockPos spawnPos = world.getSpawnPos(); int spawnRadius = Math.min( MathHelper.floor(world.getWorldBorder().getDistanceInsideBorder(spawnPos.getX(), spawnPos.getZ())), @@ -53,7 +84,8 @@ public class SpawnLocator extends SpawnLocating { BlockPos candidatePos = findSafeSpawnLocation(world, spawnPos.getX() + x - spawnRadius, - spawnPos.getZ() + z - spawnRadius + spawnPos.getZ() + z - spawnRadius, + avoidAir ); if (candidatePos == null) { @@ -70,7 +102,7 @@ public class SpawnLocator extends SpawnLocating { mutable.move(0, -1, 0); } - if (!world.getFluidState(mutable).isEmpty()) { + if (!checkAtmosphere(world, mutable, avoidAir)) { continue; } @@ -78,13 +110,17 @@ public class SpawnLocator extends SpawnLocating { mutable.move(0, 1, 0); } - if (!world.getFluidState(mutable).isEmpty()) { + if (!checkAtmosphere(world, mutable, avoidAir)) { continue; } entity.refreshPositionAndAngles(mutable, 0, 0); - if (!world.isSpaceEmpty(entity) || MeteorlogicalUtil.isPositionExposedToSun(world, mutable)) { + if (!world.isSpaceEmpty(entity)) { + continue; + } + + if (avoidSun && MeteorlogicalUtil.isPositionExposedToSun(world, mutable)) { continue; } From d3821f1c7c8412b4bf6b6bfb7669dcb043c8ec25 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 9 Nov 2023 15:08:07 +0000 Subject: [PATCH 42/90] Fixed seaponies moving too quickly --- .../unicopia/entity/player/Pony.java | 15 ++++++++------- .../unicopia/mixin/MixinEnchantmentHelper.java | 7 ++++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 486e0316..63d32a65 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -591,11 +591,12 @@ public class Pony extends Living implements Copyable, Update return Optional.of(speed.multiply(0.5, 1, 0.5)); } if (getCompositeRace().includes(Race.SEAPONY)) { - float factor = entity.isSwimming() ? 1.132F : 1.232F; + float factor = entity.isSwimming() ? 1.132F : 1.0232F; + float max = 0.6F; return Optional.of(new Vec3d( - speed.x * factor, - speed.y * 1.101, - speed.z * factor + MathHelper.clamp(speed.x * factor, -max, max), + speed.y * ((speed.y * getPhysics().getGravitySignum()) > 0 ? 1.2 : 1.101), + MathHelper.clamp(speed.z * factor, -max, max) )); } return Optional.empty(); @@ -625,16 +626,16 @@ public class Pony extends Living implements Copyable, Update return false; } - public int getImplicitEnchantmentLevel(Enchantment enchantment) { + public int getImplicitEnchantmentLevel(Enchantment enchantment, int initial) { if ((enchantment == Enchantments.AQUA_AFFINITY || enchantment == Enchantments.DEPTH_STRIDER || enchantment == Enchantments.LUCK_OF_THE_SEA || enchantment == Enchantments.LURE) && getCompositeRace().includes(Race.SEAPONY)) { - return 3; + return MathHelper.clamp(initial + 3, enchantment.getMinLevel(), enchantment.getMaxLevel()); } - return 0; + return initial; } public Optional modifyDamage(DamageSource cause, float amount) { diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java index 71ecc8f9..4458399c 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEnchantmentHelper.java @@ -16,9 +16,10 @@ abstract class MixinEnchantmentHelper { @Inject(method = "getEquipmentLevel", at = @At("RETURN"), cancellable = true) private static void getEquipmentLevel(Enchantment enchantment, LivingEntity entity, CallbackInfoReturnable info) { Pony.of(entity).ifPresent(pony -> { - int implicitLevel = pony.getImplicitEnchantmentLevel(enchantment); - if (implicitLevel > 0) { - info.setReturnValue(implicitLevel + info.getReturnValue()); + int initial = info.getReturnValue(); + int implicitLevel = pony.getImplicitEnchantmentLevel(enchantment, initial); + if (implicitLevel != initial) { + info.setReturnValue(implicitLevel); } }); } From 5dbff11d7a487ef9b522562d893226312d839f58 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 9 Nov 2023 16:25:24 +0000 Subject: [PATCH 43/90] Fixed beds generating with water on them --- .../unicopia/server/world/WaterLoggingManager.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/WaterLoggingManager.java b/src/main/java/com/minelittlepony/unicopia/server/world/WaterLoggingManager.java index 9d96541e..5b2b57f4 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/WaterLoggingManager.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/WaterLoggingManager.java @@ -37,11 +37,8 @@ public class WaterLoggingManager> { } public void getDefaultState(O owner, CallbackInfoReturnable info) { - if (owner instanceof BedBlock) { - return; - } if (appliesTo(owner, info.getReturnValue())) { - info.setReturnValue(info.getReturnValue().with(Properties.WATERLOGGED, true)); + info.setReturnValue(info.getReturnValue().with(Properties.WATERLOGGED, !(owner instanceof BedBlock))); } } From e0826bf1e3eb1c7f4023e177b2b987590e32759d Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 9 Nov 2023 16:26:26 +0000 Subject: [PATCH 44/90] Make the seapony transformation into an ability granted if you're wearing the necklace --- .../com/minelittlepony/unicopia/Race.java | 19 +++- .../unicopia/ability/Abilities.java | 3 + .../unicopia/ability/AbilityDispatcher.java | 4 + .../unicopia/ability/ChangeFormAbility.java | 99 +++++++++++++++++++ .../ability/EarthPonyKickAbility.java | 3 +- .../unicopia/entity/player/Pony.java | 31 +++++- 6 files changed, 148 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java diff --git a/src/main/java/com/minelittlepony/unicopia/Race.java b/src/main/java/com/minelittlepony/unicopia/Race.java index 1a214161..ac63cfff 100644 --- a/src/main/java/com/minelittlepony/unicopia/Race.java +++ b/src/main/java/com/minelittlepony/unicopia/Race.java @@ -27,6 +27,7 @@ import net.minecraft.registry.RegistryKey; public record Race (Supplier compositeSupplier, Availability availability, boolean canCast, FlightType flightType, boolean canUseEarth, boolean isNocturnal, boolean canHang) implements Affine { public static final String DEFAULT_ID = "unicopia:unset"; public static final Registry REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race"), DEFAULT_ID); + public static final Registry COMMAND_REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race/grantable"), DEFAULT_ID); public static final RegistryKey> REGISTRY_KEY = REGISTRY.getKey(); private static final DynamicCommandExceptionType UNKNOWN_RACE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("race.unknown", id)); @@ -35,11 +36,15 @@ public record Race (Supplier compositeSupplier, Availability availabi } public static Race register(Identifier id, Availability availability, boolean magic, FlightType flight, boolean earth, boolean nocturnal, boolean canHang) { - return Registry.register(REGISTRY, id, new Race(Suppliers.memoize(() -> new Composite(REGISTRY.get(id), null)), availability, magic, flight, earth, nocturnal, canHang)); + Race race = Registry.register(REGISTRY, id, new Race(Suppliers.memoize(() -> new Composite(REGISTRY.get(id), null, null)), availability, magic, flight, earth, nocturnal, canHang)); + if (availability.isGrantable()) { + Registry.register(COMMAND_REGISTRY, id, race); + } + return race; } public static RegistryKeyArgumentType argument() { - return RegistryKeyArgumentType.registryKey(REGISTRY_KEY); + return RegistryKeyArgumentType.registryKey(COMMAND_REGISTRY.getKey()); } /** @@ -64,8 +69,8 @@ public record Race (Supplier compositeSupplier, Availability availabi return compositeSupplier.get(); } - public Composite composite(@Nullable Race pseudo) { - return pseudo == null ? composite() : new Composite(this, pseudo); + public Composite composite(@Nullable Race pseudo, @Nullable Race potential) { + return pseudo == null && potential == null ? composite() : new Composite(this, pseudo, potential); } @Override @@ -147,6 +152,10 @@ public record Race (Supplier compositeSupplier, Availability availabi return this; } + public Race or(Race other) { + return isEquine() ? this : other; + } + @Override public int hashCode() { return getId().hashCode(); @@ -194,7 +203,7 @@ public record Race (Supplier compositeSupplier, Availability availabi return REGISTRY.stream().filter(r -> r.isPermitted(player)).collect(Collectors.toSet()); } - public record Composite (Race physical, @Nullable Race pseudo) { + public record Composite (Race physical, @Nullable Race pseudo, @Nullable Race potential) { public Race collapsed() { return pseudo == null ? physical : pseudo; } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java index f0964765..dbf06852 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java @@ -24,6 +24,9 @@ public interface Abilities { .toList(); }); + // all races + Ability CHANGE_FORM = register(new ChangeFormAbility(), "change_form", AbilitySlot.PRIMARY); + // unicorn / alicorn Ability CAST = register(new UnicornCastingAbility(), "cast", AbilitySlot.PRIMARY); Ability SHOOT = register(new UnicornProjectileAbility(), "shoot", AbilitySlot.PRIMARY); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java index 14bb8370..d9a977b4 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java @@ -179,6 +179,10 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable { return; } + if (cooldown > 100 && player.asEntity().isCreative()) { + cooldown = Math.max(10, cooldown - 100); + } + if (cooldown > 0 && cooldown-- > 0) { ability.coolDown(player, slot); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java new file mode 100644 index 00000000..fb60bdac --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java @@ -0,0 +1,99 @@ +package com.minelittlepony.unicopia.ability; + +import java.util.Optional; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.ability.data.Hit; +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.particle.ParticleTypes; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Identifier; + +public class ChangeFormAbility implements Ability { + + @Override + public int getWarmupTime(Pony player) { + return 10; + } + + @Override + public int getCooldownTime(Pony player) { + return 1000; + } + + @Override + public boolean canUse(Race.Composite race) { + return race.potential() != null; + } + + @Override + public boolean canUse(Race race) { + return true; + } + + @Override + public Identifier getIcon(Pony player) { + Race potential = player.getCompositeRace().potential(); + if (potential == null) { + return Ability.super.getIcon(player); + } + return getId().withPath(p -> "textures/gui/ability/" + p + "_" + potential.getId().getPath() + ".png"); + } + + @Nullable + @Override + public Optional prepare(Pony player) { + return Hit.of(canUse(player.getCompositeRace())); + } + + @Override + public Hit.Serializer getSerializer() { + return Hit.SERIALIZER; + } + + @Override + public double getCostEstimate(Pony player) { + return 5; + } + + @Override + public boolean apply(Pony player, Hit data) { + if (prepare(player).isEmpty()) { + return false; + } + + player.subtractEnergyCost(5); + + Race.Composite composite = player.getCompositeRace(); + Race actualRace = player.getSpecies(); + player.setSpecies(composite.potential()); + player.setSuppressedRace(actualRace.availability().isGrantable() ? actualRace : Race.UNSET); + + return true; + } + + @Override + public void warmUp(Pony player, AbilitySlot slot) { + player.getMagicalReserves().getExertion().addPercent(6); + + if (player.getAbilities().getStat(slot).getWarmup() % 5 == 0) { + player.asWorld().playSound(null, player.getOrigin(), SoundEvents.BLOCK_BUBBLE_COLUMN_WHIRLPOOL_INSIDE, SoundCategory.PLAYERS); + } + + if (player.asWorld().random.nextInt(5) == 0) { + player.asWorld().playSound(null, player.getOrigin(), USounds.Vanilla.BLOCK_BUBBLE_COLUMN_BUBBLE_POP, SoundCategory.PLAYERS); + } + + player.spawnParticles(ParticleTypes.BUBBLE_COLUMN_UP, 15); + player.spawnParticles(ParticleTypes.BUBBLE_POP, 15); + } + + @Override + public void coolDown(Pony player, AbilitySlot slot) { + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyKickAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyKickAbility.java index 086032bf..9f6bb09c 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyKickAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyKickAbility.java @@ -60,8 +60,7 @@ public class EarthPonyKickAbility implements Ability { @Override public Identifier getIcon(Pony player) { - Identifier id = Abilities.REGISTRY.getId(this); - return new Identifier(id.getNamespace(), "textures/gui/ability/" + id.getPath() + return getId().withPath(p -> "textures/gui/ability/" + p + "_" + player.getObservedSpecies().getId().getPath() + "_" + (getKickDirection(player) > 0 ? "forward" : "backward") + ".png"); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 63d32a65..221d4dc3 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -66,6 +66,7 @@ import net.minecraft.world.GameRules; public class Pony extends Living implements Copyable, UpdateCallback { private static final TrackedData RACE = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.STRING); + private static final TrackedData SUPPRESSED_RACE = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.STRING); static final TrackedData ENERGY = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); static final TrackedData EXHAUSTION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); @@ -120,6 +121,7 @@ public class Pony extends Living implements Copyable, Update this.mana = addTicker(new ManaContainer(this)); player.getDataTracker().startTracking(RACE, Race.DEFAULT_ID); + player.getDataTracker().startTracking(SUPPRESSED_RACE, Race.DEFAULT_ID); addTicker(this::updateAnimations); addTicker(this::updateBatPonyAbilities); @@ -223,8 +225,13 @@ public class Pony extends Living implements Copyable, Update @Override public void setSpecies(Race race) { race = race.validate(entity); + Race current = getSpecies(); + entity.getDataTracker().set(RACE, Race.REGISTRY.getId(race.validate(entity)).toString()); + if (race != current) { + clearSuppressedRace(); + } + ticksInSun = 0; - entity.getDataTracker().set(RACE, Race.REGISTRY.getId(race).toString()); gravity.updateFlightState(); entity.sendAbilitiesUpdate(); @@ -232,6 +239,18 @@ public class Pony extends Living implements Copyable, Update UCriteria.PLAYER_CHANGE_RACE.trigger(entity); } + public void setSuppressedRace(Race race) { + entity.getDataTracker().set(SUPPRESSED_RACE, Race.REGISTRY.getId(race.validate(entity)).toString()); + } + + public void clearSuppressedRace() { + setSuppressedRace(Race.UNSET); + } + + private Race getSuppressedRace() { + return Race.fromName(entity.getDataTracker().get(SUPPRESSED_RACE), Race.UNSET); + } + public TraitDiscovery getDiscoveries() { return discoveries; } @@ -354,17 +373,19 @@ public class Pony extends Living implements Copyable, Update @Override public boolean beforeUpdate() { if (compositeRace.includes(Race.UNSET) || entity.age % 2 == 0) { + Race intrinsicRace = getSpecies(); + Race suppressedRace = getSuppressedRace(); compositeRace = getSpellSlot() .get(SpellPredicate.IS_MIMIC, true) .map(AbstractDisguiseSpell::getDisguise) .map(EntityAppearance::getAppearance) .flatMap(Pony::of) .map(Pony::getSpecies) - .orElseGet(this::getSpecies).composite( + .orElse(intrinsicRace).composite( AmuletSelectors.UNICORN_AMULET.test(entity) ? Race.UNICORN : AmuletSelectors.ALICORN_AMULET.test(entity) ? Race.ALICORN - : AmuletSelectors.PEARL_NECKLACE.test(entity) ? Race.SEAPONY - : null + : null, + AmuletSelectors.PEARL_NECKLACE.test(entity) ? suppressedRace.or(Race.SEAPONY) : null ); } @@ -794,6 +815,7 @@ public class Pony extends Living implements Copyable, Update public void toSyncronisedNbt(NbtCompound compound) { super.toSyncronisedNbt(compound); compound.putString("playerSpecies", Race.REGISTRY.getId(getSpecies()).toString()); + compound.putString("suppressedSpecies", Race.REGISTRY.getId(getSuppressedRace()).toString()); compound.putFloat("magicExhaustion", magicExhaustion); compound.putInt("ticksInSun", ticksInSun); compound.putBoolean("hasShades", hasShades); @@ -819,6 +841,7 @@ public class Pony extends Living implements Copyable, Update public void fromSynchronizedNbt(NbtCompound compound) { super.fromSynchronizedNbt(compound); setSpecies(Race.fromName(compound.getString("playerSpecies"), Race.HUMAN)); + setSuppressedRace(Race.fromName(compound.getString("suppressedSpecies"), Race.UNSET)); powers.fromNBT(compound.getCompound("powers")); gravity.fromNBT(compound.getCompound("gravity")); charms.fromNBT(compound.getCompound("charms")); From 617a5f3a9f8bbc77487d08488ec2d3f4619ae7cc Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 9 Nov 2023 19:19:35 +0000 Subject: [PATCH 45/90] Implement proper underwater vision for seaponies --- .../client/render/WorldRenderDelegate.java | 11 ++++++++++ .../unicopia/entity/player/PlayerCamera.java | 11 ---------- .../mixin/client/MixinBackgroundRenderer.java | 20 +++++++++++++++++++ .../unicopia/mixin/client/MixinCamera.java | 8 -------- src/main/resources/unicopia.mixin.json | 1 + 5 files changed, 32 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBackgroundRenderer.java diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java index 78ca8e93..90a9fd4d 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java @@ -14,9 +14,11 @@ import com.minelittlepony.unicopia.entity.ItemImpl; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.duck.LavaAffine; import com.minelittlepony.unicopia.entity.player.Pony; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; +import net.minecraft.client.render.BackgroundRenderer.FogType; import net.minecraft.client.render.VertexConsumerProvider.Immediate; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.*; @@ -46,6 +48,15 @@ public class WorldRenderDelegate { return Optional.empty(); } + public void applyFog(Camera camera, FogType fogType, float viewDistance, boolean thickFog, float tickDelta) { + if (camera.getSubmersionType() == CameraSubmersionType.WATER) { + if (EquinePredicates.PLAYER_SEAPONY.test(MinecraftClient.getInstance().player)) { + RenderSystem.setShaderFogStart(RenderSystem.getShaderFogStart() - 30); + RenderSystem.setShaderFogEnd(RenderSystem.getShaderFogEnd() + 190); + } + } + } + public boolean beforeEntityRender(Entity entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertices, int light) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java index 04b5bf22..11b71c2e 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java @@ -3,11 +3,9 @@ package com.minelittlepony.unicopia.entity.player; import java.util.Optional; import com.minelittlepony.common.util.animation.MotionCompositor; -import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; -import net.minecraft.client.render.CameraSubmersionType; import net.minecraft.util.math.Vec3d; public class PlayerCamera extends MotionCompositor { @@ -61,15 +59,6 @@ public class PlayerCamera extends MotionCompositor { .map(d -> distance * d); } - public Optional getSubmersionType(CameraSubmersionType original) { - if (player.getCompositeRace().includes(Race.SEAPONY)) { - if (original == CameraSubmersionType.WATER) { - return Optional.of(CameraSubmersionType.NONE); - } - } - return Optional.empty(); - } - public double calculateFieldOfView(double fov) { fov += player.getMagicalReserves().getExertion().get() / 5F; fov += getEnergyAddition(); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBackgroundRenderer.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBackgroundRenderer.java new file mode 100644 index 00000000..566236f5 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBackgroundRenderer.java @@ -0,0 +1,20 @@ +package com.minelittlepony.unicopia.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.minelittlepony.unicopia.client.render.WorldRenderDelegate; + +import net.minecraft.client.render.BackgroundRenderer; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.BackgroundRenderer.FogType; + +@Mixin(BackgroundRenderer.class) +abstract class MixinBackgroundRenderer { + @Inject(method = "applyFog", at = @At("RETURN")) + private static void onApplyFog(Camera camera, FogType fogType, float viewDistance, boolean thickFog, float tickDelta, CallbackInfo info) { + WorldRenderDelegate.INSTANCE.applyFog(camera, fogType, viewDistance, thickFog, tickDelta); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java index 6444e002..81f9f5da 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java @@ -8,7 +8,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.client.UnicopiaClient; import net.minecraft.client.render.Camera; -import net.minecraft.client.render.CameraSubmersionType; @Mixin(Camera.class) abstract class MixinCamera { @@ -34,11 +33,4 @@ abstract class MixinCamera { private void redirectCameraDistance(double initial, CallbackInfoReturnable info) { UnicopiaClient.getCamera().flatMap(c -> c.calculateDistance(info.getReturnValueD())).ifPresent(info::setReturnValue); } - - @Inject(method = "getSubmersionType", - at = @At("RETURN"), - cancellable = true) - public void getSubmersionType(CallbackInfoReturnable info) { - UnicopiaClient.getCamera().flatMap(c -> c.getSubmersionType(info.getReturnValue())).ifPresent(info::setReturnValue); - } } diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 045db477..b85f5823 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -59,6 +59,7 @@ "client": [ "client.MixinAnimalModel", "client.MixinArmorFeatureRenderer", + "client.MixinBackgroundRenderer", "client.MixinCamera", "client.MixinClientWorld", "client.MixinEntityRenderDispatcher", From a2c78c2b35a4be6918c2c411031d82a4106bb97c Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 9 Nov 2023 23:40:17 +0000 Subject: [PATCH 46/90] Added textures and name for the icon ability --- .../resources/assets/unicopia/lang/en_us.json | 1 + .../textures/gui/ability/change_form_alicorn.png | Bin 0 -> 6625 bytes .../textures/gui/ability/change_form_bat.png | Bin 0 -> 6489 bytes .../gui/ability/change_form_changeling.png | Bin 0 -> 6795 bytes .../textures/gui/ability/change_form_earth.png | Bin 0 -> 6040 bytes .../gui/ability/change_form_hippogriff.png | Bin 0 -> 5685 bytes .../textures/gui/ability/change_form_kirin.png | Bin 0 -> 6253 bytes .../textures/gui/ability/change_form_pegasus.png | Bin 0 -> 5727 bytes .../textures/gui/ability/change_form_seapony.png | Bin 0 -> 4895 bytes .../textures/gui/ability/change_form_unicorn.png | Bin 0 -> 5753 bytes .../textures/models/armor/pearl_necklace.png | Bin 0 -> 4955 bytes 11 files changed, 1 insertion(+) create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_alicorn.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_bat.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_changeling.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_earth.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_hippogriff.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_kirin.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_pegasus.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_seapony.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/change_form_unicorn.png create mode 100644 src/main/resources/assets/unicopia/textures/models/armor/pearl_necklace.png diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 9d0d14ab..4f9efbd1 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -495,6 +495,7 @@ "ability.unicopia.peck.block.fled": "The block has fled", "ability.unicopia.peck.block.unfased": "The block is unfazed by your threats", "ability.unicopia.dash": "Flying Dash", + "ability.unicopia.change_form": "Change Form", "gui.unicopia.trait.label": "Element of %s", "gui.unicopia.trait.group": "\n %s", diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/change_form_alicorn.png b/src/main/resources/assets/unicopia/textures/gui/ability/change_form_alicorn.png new file mode 100644 index 0000000000000000000000000000000000000000..798eca4cde19608e2fec686a4ee75861a254271e GIT binary patch literal 6625 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 VTe3D0yFe;|6oFx~J^l+<{0D=t39$eG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/change_form_bat.png b/src/main/resources/assets/unicopia/textures/gui/ability/change_form_bat.png new file mode 100644 index 0000000000000000000000000000000000000000..791a3755c37314849ea41feec33bd0cac6cc272c GIT binary patch literal 6489 zcmeHLX;c(f7H()k1Q$>=s2JN8f}+)3RlQcR$lB6G77+zktgfnt5_+M#*@Fr)4n{GO zQOpIOEQTDf=d*QfFedPcnG54ArVH@32F?=ylN2fOwO6(8TFUl=XKqB@4oNd z``vqAy{>iPp|eNWPO#;0I3tun0TJNJW1EdN_%)`d{{}9X>1d@|sdVSqfE%D`F@$5m z>VRf3NVc@#a=4&xEoh^G%<8ahf`yg&x&g=&`{m6*p4P9!&Ot0JIU~SzJ7_479l^B( zH0G~;Yn=cx`>`>9WtJSX#`EiJWk@&=6(F!cBnIf44r4qN#YGq{g2DP0MK3I3 zkyf<$<^lV17=Qn8rN2K4K`P|99!I_cH!@sz-X(!$o80Z{7 z_T%s=S8Yr2&t}J5-aSQ`nCQ5~Zlw3P10w~O%JAd1*)80&^_9xHz~G*kh&YGV(}}ZA zly|k>^;msi>)4BTaxJ!LKi?m)1&xWI{Vs$>(;HAs%6uI-S1=fbCmD7tfb01?@w&au6C|&yJ%Wb z_?g={Tg}X4MyU=3`FqmB9)7P6jajJ1FV1y2lIxml&)fC! z=&BpHcXj62^9Gui?1O%m1(SlTso(&ksb5^RJAmeEhPesQvS}%TA`AI&Hp}hD}k`OpV z?@z}uLFop1UV3OGnI2DK6n~btt!F9@05r6T;H7F3v_?GDi*Lrofy{Ob`8>0VDc*}8 z4f4oeXP|jvfmi@TfvHR~%J;VAc^W7+9uc7EhX8k8{5X?Ij|+tdEkqT*zQ(1^Ui~!n58W_Ea(P?=sCZWUXa$vqb z$&g@nha!b^0<8h6MzAXK(vob&4a{IEh-EZ-^DIF2OPVG|{erBQY-2~v?hG~rOdr5~ zN&C6)W@Vri5`qWl$RyT0Wq=o-T_2}(BtzkSB8{mKnp8tDEGHqc6hl{^Y5z-`EgqgH&<7z8VvJz@G;>#9Ma`oV z`|kQ~6Bu(T@p$HIsP;&BRqhEuI za$JnPJr`k&1hos(5CVfxibWDog``>viR83IDi;x$2o=3<7g3P#=-YEq3OtdZ5*m_V zG7w4{6+?s+WGhTlA|PN=1nsN;fzP*`vB)BkjPlS}Y;?-qF_e&5mcj;>c?;FXl$W!F2p zUWtKMQht|RuZ=F-7cZ!2E%;xV0$xAW?1{_)udb|BAI=Wo^s?WgisHY4o?-f+g+>m? zZVcNjINP>6fzF{OWk}%AcDrHY+}`h=dAO3p;qF!j_(n#bxmZxETO4SAe%4pzU0xoE z*}>OsrUid!_5Fn@vbGts9mAQMHS4&&oK?2Hiith~HBWwIm*RO9|)_ssvB)4x7er;3h;H+@(Nqf9y zj^R>GRo1t%!j{ev0i!M5zFY7|0)GJ&v0AZf=ino_q56cnDGW+3a&K!53RATqmD;&{RA@!sF-K zG-oU-Ex6jzy>8Mbh99$ZX}!JW!U6|B-npRSA9pS|V6nV(PyLDuH52Rhb$XAwCCyC7kwL*zrVz1{@hdNGruUj_uDm(9Q$9o(;WkSZHVwc zT2BcLah+qE4z4VUE6Nof*&SVe>Z?mBSGF!~cSaQ796L5Nwxjz=%dYbB@&~#j-rO{g zYs>1$`#%ScPqR8!GI7E!Bx_{$=^*J40YAt7gE{b&iocI+XpC6fC?gN~OjWqc$Nkjx z)TOrk#waAx(aOWaqrG`Y-jkUVoqT*hFG=%=Lf4+X)8u~Tc302P@sj)d?gZUS+&lMX z`<48e)h(PF&D1elcJ?;R@UhA2B&3Fzl&=mnENaS>J?XtszU}UA*D+nbiP4*yL+CFQ zZFfC>^}M?;wHYp&_4&^}&9>T+A*XD5B9M}m5nHOxplk9FCuFza z_T##v4>NqO%C|k+>mI>(88upY_XC3~^nb>WweLPZ{> zOfDO?&r*13`uSaa(_#F}%7n|4!rtF8ZM6e;+;QLEGdK@+{xGNQF~D6!CN^v-+f?AX z*2=cX^6ZaEBOh0vE-oDUq@KuwvYr$};oOa@mtm9KCc7DEWJ2r|>w`!2*N5B1v>fy= z^Sfym+5P>O72j|xbm=7}YijaGPESLf)6|BA*`sPsii9HL@(HC;RY#k0i6-8I dlSfx^3Pv3-Ir1nk8I&+b85kOH$ZvV}e*nOl$}Io@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/change_form_changeling.png b/src/main/resources/assets/unicopia/textures/gui/ability/change_form_changeling.png new file mode 100644 index 0000000000000000000000000000000000000000..ef67059e969c9268edaa0cada3922dd8d6dbd75c GIT binary patch literal 6795 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 rwj<;Cg@Sc~Wp}qO`*uOYpZ)e#9~5-ice5L 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/change_form_kirin.png b/src/main/resources/assets/unicopia/textures/gui/ability/change_form_kirin.png new file mode 100644 index 0000000000000000000000000000000000000000..51cd0f737db27271154293a5be9ee48a5e0059d5 GIT binary patch literal 6253 zcmeHLYg7~07EVAB11cyW3SL6M3dkfglgVQSP>_d2L?{n|)`FAC1V>0FB;l#FpcXB* zRIQ3wm5No7LZuH|m6x{lU9Q%mR;|_rDqOWi@pZ37y=MXpJ8Sv~!FU0W#~Y!F42uK3kZZO!;MY`8a0hfJ=wy{vrSjw1f(M|8GorV}+;~fyGh`*u$ulKoA1Pg(yl$Wdte*>+?T(x+4xL ztGCGn_P2xy4UJWWh6)WvR?B44JYL?0!j%D$-v_%NY}q!WFu~ovs(r;~;%s=hdxmpq ztY@2`j#xK6?Zl^^s;n%hId&tbxO_HJ{Lj6_Zo#5U)<2v&p!z9%MsHf&JjagxSyP)E zx;y>|DEh42x%JvI{(Ak#JHqB1)+D`qVsgPxAB5a=UF&pg-IxR33lE(MvdU~){-yt8 z(>rBTWa+-a!NM}%5@rnRa6I#zO-G?R)pv&9E&SFJ)mZPhHG6N|a_d-h%>CHqR`dK# z>n6DfbpGFd5r@gznf7Hh|5|;V4xBxXMNS`0+?pSA?>ob+v=lAT`nq@hvWd$agj-5S zAFX%XnmFmew9|8tnjle z(`ku8pKh7p2q!{fRY4+D3_l%-%_PlQU=Spl$>_85o=zk%Iy&A=a%>`U9GA&)DJsVh z1eN!>ZNZyO8%-b+IZR9Kw3u^YA%HW0SdzyvTjFH(V|C~dQEBZ(pKsT{kb1rG5L(&0{fGd!mmcLL!A4{NoEu0N#=gyUUHBunpasLP`LiizPQgko|~mX)L$Qc6J-HBzk5~(C1nL;bW5DHWxsrE&?Xt^gp>tdjUyP`ZP zuz`~QDZzaTgYGn-O!bX{yArs1Ne1p-{q+kJyub6)U;6*fC4|CPi#!*lIzk#lUkZzsjx`Mwj5}+Z$RB{^`mE?`C!$So0BhuVbT*njXe`%zZy;+Rlv( zH$~Sax zqWE3ucBQs~3k5Zc#g4HtA?Y?S59_pmkmdHwc!c{{J&-L*J!#Op3g zO~)Vg`e-(8wmO@$tuFmd6y0}KF}5vb|ANqzh}xl5(=OJ%`=I>ft@tAkgQp+Dw-@1e8tO(_*CPa6vte}K3m-r~)s zx-C2;qAH@KG^*}Wd87Sk4`1i>jBKC$^BLIa@)dRTwc0KAyXp?yowg++u2TL{(YQ-H zhr6u`2{3;caB`26V@TrJv$K;d z*x3_n2rP4wjZZU_kT{Ah^Dn*8yLZc?6Pt8fLR6KiL&oe+kDPsD+j~(3M-H^L4;#8o z;Cv3NI-RVo{CLd{tF8w>$&QCU&e{K5-vei8Pg=7&8} bbg<>8mK?ktQac-*T%Ia?R@mp$<}Ug#cM^BI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/change_form_pegasus.png b/src/main/resources/assets/unicopia/textures/gui/ability/change_form_pegasus.png new file mode 100644 index 0000000000000000000000000000000000000000..8a460f545947d85ccb46a5b56f00aef56528d958 GIT binary patch literal 5727 zcmeHKYg7~077h87!#711PCY~f)){} zB5JFYqP5jRQSn|MV5QiKwo()+l%-y)SMY^aQBhipa?b=rT(@i8VQmrMq0l9)-;R7%RXEtk7jUK2+ZR0fIrOPiV;K%ix?b^m@5?X_+Wmk@>da2 zNdI{8d=iK+j|>TkmW6~c^ah=Z)DSe9xioY0jEL`Md7l2}i`kj6o}+hP-?U47Q7ZLR zyA(vf*GjJve-ys7dCz;Y6)T(&;_(C+*)bn*9i{Mu%}j0+osy4|)pH-0ps!E4o-c8Rs-#D+uD z`;FN}f&4_DS+f{LKI_N{I>+;xOLiTZ$^@U;z7ItY^JMRMW#P5=9(r`FY4mLDY%(n` z`^ejso;>|%bqtSxoxGl3ai`=w5wPH09rE+pxX;t)KK)idXX!$fxM`l(!Tc%tj*QO= zoX#E`|9PBuLvX>2~yC0t9K0or%8EQ;~GiL_U1I%IokW83RhB;ZIHHys=rUh3FWJ=9uGAt%0wS=hv zbrhmA5DXrR$ATfLnM~y{1L=$a1FjOsgoX`5fF}tv$z;-t+3d8mG*%jyr86Y55s^s5 zhB<5w2Lcw5F3V`4Ll|`_28@uV5?a&b;Se}B7xj zU*>Kx23B&pI8=wFP~pi!B}{65F|NZ%Ts$BWA|*m#DhP&!7{n9697rfcfrPa zR5Ls(3JM2MLY`2G5=tDxVGauMlmZc?RAD&8gE=a$zY-G&__zfM$HZYeLoy1MlT1bv z3ASFFXc?dg7Y9YlBuowqex-@lpe7Y?kT9c2ZHoETKrER|%r~JFn}|Rp;tNE44xh&t z!5q#jqXmS)2r7}nw49xm5o%e)AQ?a`O4TU4xPiXFVA5=7#70=;ZtyO9Zss!|Ccqjc^Cn}9xQnTX$149TT}x(YCf@I z;A!AdLt3^HgJIbeViX%l!HA|30}KPKfgvmj)g}_)^cXDHmwNI~N&&?%1V%(E2hGL_!FW5#8}a*=uD5i(5d&{z z{IiWy*qQ816CbZzcY#Mmw{k3aTBzRr6Q$~h|()y`y`H8(-fW|=| zvCv4Pjha9;E831yH=wjP$>dV|TcaFYr$X~@^%v7#q#2Cw^ZNE;n){3-M$)YLu&;9>GrND)+B=hf;-ugeaVEJ(_j^f&Oaq}XS<9&XirPZEyX zYNYjQ`E+Ml-YMLXG1_`V_;%iM{P#c9jzNA5H!t^9NgJ>3r@Ma0`tt6g)~mIO+(W(1 zA&Tn7FUS!=`yLl0{*oP>+T%bwtJrjF%5~cnYwj$HTCR9;-@PC>_Sp^j?5fkOf6Ff> zytsGBw_tq8O-@$-&AH-Yf&Et}1tJ6S$!pf6QuSIo(g~=(-i( zmVYvQ?sAX%2Hp8BA3GGfMJW%iZxH6XN5n+-6qrxOtt%OuQ&_Pgd_t zjbN@WjvpaSXlbk!ZYi(0wzYPjOzgvSG~Bo|uGe8!b!<{%cKDIP`bX=DG03&AI$FlH z&#N~8_>Wkirvf z3c1qy+sO`l!ISI1fB5Ovs`~p!Dr+x!+1u_8i`~j(dqh|MnAP2BlM)#ek=U~N6G)%`f{ z!w2R$FNub37OZQ&b9rR)gvy>Mx^-RmZ#&COOMQFW3Qa*v8Ig;lYyvfK;BT9=6xf|f zx6c+iHLsoF@zvLdkeWx2YfigWpL1GO-iyyoEu3{ZZn{gww2G#Hnl{FxPZ#!EkM_1J VFEP$`1cwSuCY=+yKX}=i{{XlX3e*4q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/change_form_seapony.png b/src/main/resources/assets/unicopia/textures/gui/ability/change_form_seapony.png new file mode 100644 index 0000000000000000000000000000000000000000..8950414d732b541d21494a3e6dbf12bc59ee39f1 GIT binary patch literal 4895 zcmeHKc~nzZ8h-(iZEyi9C|E;q0cw($g)C133Pchm%93GmL0(>7Ad=1G#RO=zD(FaY zP{g8wEFH(K73&nWRsk8@PzRkJokG=u*y>oz;)vqT+!t17dd?irnf^y|ZtnN){e8dt z-QWH02XAxCq9`|)DJ~EMxk)9FaiFJ?&1o$7HDzV>fbJTeBvnbJL68%807%Lhh(cmO zql~caDE5#&7~2S%JFrO%*``n&Y<)hkeFp3zUO6CDfIM;sz27&c0qBY{#8-sAVnHMAOT&ehEdM?WT6;4GhVvi{_S}_)QL*9LgrMzde}QKH+FmI(BkP z^50`N@88^zcPO@Y>#F2Cr_UwR6O$j8y~?dGJ^q&~=H32(z$Pw~gy-Z3EeL1`&q>(g z=@IySLFThfQ`Z(QW1n1*`eV{uhoI>f#=mi_I~Dvme!DIX9!u0VKfT~Rq1j&feG3Ivxu!RpE3OqpFo6T4JyamKh@ObhRYQ zh{tCwl4DsJm{3Uz3v~&xB7i`P6DZZH)#yx!RYbG#BETkxnKY^mLS%?&Ng$6R^hTV@ zWpEiVU2IjaX467ls3AtB3WuWV7i2 zK{sXU2-Hf~nfytLevU}ogc;QaLao%HCLK14#uvl-!M$Xu_Gcpk1KE(SLdT{SHFhI#< zNTeP!li^7tMKp4KM5)KrN~GV!g$fpqspv2)!022a%%%$jD6lY?qvFFX7K#c+P)T(r z0@YzSNd?FmYQV!%VW^Oeap)*d0n@ocj71l4S;2Ia%T>U*LZQM0BPkXe)gUWT&B&-o zDkY#2a0Ln!S19R9n2pl83Z9S-+?8}L%vN#u3XI1KR@$ObV#s{GQHz4(RBO>RoN3Ud z*(ONAk$Evv5sl4&heu*GD4_xlB3iUsXSNPc$kkdromeC86Yf5<|!bsjf1@)5k?#(^hUW}uMyFPs_xLV3|uEAN}!P_ zfdkT^IxHWo!ymvf0{4ec(#iBnwJP&}p~=fb4FPy?c3I(_^SS={zr}4 zc9p19+oeEItbYq8bT!_uFyQK+!qQP)8V;(*K)Mc&tA8aGPz+ z7iZChm;l9Ln9qax{UQyqoAfHef*SF8X+TGy6-ZCpUnpvT?Vti}nhl{X={R``KrlLs zMTdp|DHwBL!%VVf4DL9D`CpoZ*Z?Dn4Djn81H}u}Lgr909MB9z@LPTc&f>RRf=V4- zOnRNw7b+B3_220nb`5ZtMeomKP!QpM2`lqnV$`rAqN6|KGtJ zrt8+~84ElwN-mwR@r#M*$-e#i8=sHIKMgB+@;v_aHwm%zSK$2m3-;M^JLqwu>3LgY z;N4Q}S)-vNxn^sXpzqtxo~{?}-fMZs3th#zMIK&981lNR#E)MbwlB_^uJFlz?sju; zM$dzb?bBlG9q;vB*(^+<=;Jo*I@~^*@)GjUB6`SiK-CKGf{1~E-Yk0$dx%Bxj zd)7TIPVgJkY(MS{BR`0F#zEQL6qfJwB#s7c80X}8eeSWZ`4#I*If1i`jrryI9Vt%# z%sp$MtQn`(P$V-bU#{r5JHP7kmDa@a8VzIe)GeC(jB5)wH;9YA>O66PSRXQF*DiBj zSixTP5{s@gY$cV5{ZmQy_j4APEZGEk_?bKA4r!=6CkErg6{AJIiwzwRO$jw|{Ag<}dH6c58K< z^XyJV;=V$6`!J~DUpG1*TAj;wJi7N?QMy=(LzXRTh^Q{yzdzT~v`S2~ky z|J8j#L1VlEg07TZm7o0iA73O-vtx<#T*3t=>*LR-e#w*0sNQ+C$#>j^AFYZxX%&l} zTuM&pgrYw%ubAb&?8HR=x|Eg!CF5Gx^d?+BP~18u+IG+<`SRV3GJ^#}- z-i`85(GE*loJ+mMoKkD`eSexx6s5Vz(-?byu8}59)A+pfDzG!JX%+LkKx#u$@uJA8 I@YMDH25lMTKL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/ability/change_form_unicorn.png b/src/main/resources/assets/unicopia/textures/gui/ability/change_form_unicorn.png new file mode 100644 index 0000000000000000000000000000000000000000..b212aa39e8185357f3fe5e58a734305518a7fbe7 GIT binary patch literal 5753 zcmeHLYg7~077m1m2DKoFRH25bAm}8M$#bTFAOVaR3K$eytDVeDV1ztK0t6HliWX6k zS|13MBGh70F1Gi!zLrv?+NxElMNr!c6|Yu&)mHJ*qW4UKi1&7_yIg(zGFc~Q&pG>i zXYX(CeNK{<@o_Q3Ib%317Hhb2x*`$uT&4|i0iWjF+}ogQrIM9er81Z`1Uvvu2Pc*T zqXU}5AlcD@&0>SG6`+j-GNZ$^F%HhQel?KC_RH&mJgHxYStE3CWDN&>C1?ncy+B_N z8vT}iuLD44UPEkenIp@l@wksss^Yl_UkLL>Vz3@YM3_*B!6+9&Fp(UCC18Jt>L(U4 zNLyU*Zw2-h(vgwz%E(Br(PYrl=@g4)t;~D-<>@WqzK5GWn31RU9aeLpbPIMiD#|x) zRB^n28>ay)i&@b6zP~af!)u<~h%oQ%BlsuwV!Js7UF^?KA5wlDHRHDhiK!ml%^6b< z?7P{0pQ{+&tulP_g?@Myd^47_@U$2Sy$!DY2u`3YDWLEFt$^yEV4E;F#~Ri^nYs ztI7hsIl3vkK1vizF3=Z>>aVOnNrlXQ(I9L;nzS|NmEMEKxCL{y*ztr3JBub3xpQla zM;_hju{A01(6r*-?y!d*9fEbS0dt0OQ1AGBmm_!H>}$TMZ}_e4{Y_pa>~{qvzX)9l zv+|>lXB=4TSC`@F^j`kt{r_%k%Rl?dsWb>OIo&p}M|VJ~^K5?hvMqs;$iz9EQx|{E z>FQg3AjoalcaEWH^9{%ID#KWGPjC*~*VnPz`RM$+IoWd-86H*9y?5D`22qB`r_cigjG#Sd9BT>OB zV6rxm_U%7oz2e{@eQUFfe=Me z0gMO`1Ogh6IY)27t&rY4o`JAqC@3>wqKy{Xpyx7}xW;;vDnRyAnig97gsi7*V`gmb3^oKTAHaP| z`?2pfWuT=}VG0A0$(W~9gz}jEG15TLBxV;WR3oGaEd;}I0uoDM1d_{fAQ7-gD}#kX z9G4G*QtHhXTu)F86aeSb0Ea-Ou!xk%AT1&mL1Gyp0uUN4giu0KDwc|bFd`fT@rsEC zS&63)wu*rw0hC-U*Wi?fgh&{{A+bh^LK-bWLSh)viewr>DwU8nD3ZXU4JI89!b$7! z6iQ&!r`RSK!m)^WWhf8f!%s%y({YOyEC}Vzr1hEBClhK~N6oU}44XnJib|xYST2#s z5E&|ZqBNT_nL#Epn6|UiHp7Gk1I_?qaVAdzfNdQ3f<>Ar++r}P4Tkhk-oU9lFs%aR zMB)})fmKQy^9(c0ge!2NGukD#6-keNG`>NkVZoih#Vy(q?~x#=s&?l zIVMK`J{Mt>Kw&9NK|&aWQY?~yDkQX0NF=8uQn?66MTosP2IBI^T|_{_BY&TZGLn=b zQc4Di2v`md8X(CLaApy54Jj7Mq@*1GuQK@KF513fJ?&zMfVtcrmu86Ie~QZ(x#bWD}iU@Ub%l8|PrIAryhnLpX-)M+CH}orFyk6}! zni!K&i*R?V7L(fAvDpQj3r!cI;}eY6HR}>QjSXCOjmR@X0q-^i5*3yQ2kJ{!^~7QC z#MLdrij$3d+P3yA>AZi!^I>D`f<8qZdijJ?`t`^pcIS<$N6_q&xL@~uc(XjG`R0!A z5{fy(71jCQYd5`@d(!{C{r->S`QJ|7^~tygtw$qZSEcS%bswq z487>G@tk{Z>5-XDWwH5KTQU(b%q#ESb?>6;#-;U-iXEeeC5$g@?sl3|J*)d3ys zpZMV5qGDORYiV;zT5`MLUPP5je?}0|z1ZpS+gH*v3%`mO)@3%j>~IjYnnGUhoH2TD zc-yba_q*FW_iY@lKd7lHh>e~%PugNx);IEg&+Dkjxny_OCu=1M8x%F1@c~2HJU+hl zP>{vZg`Qit(kWnWV@FtGTuC(L3=ipt{%VhtB$uS+^$;|Hco5r^i5lN z;C6F!-u<6-FFLb*9KBy&K0EW!DbH9_?wI-Mb=gk6Gq#ogIt2D_T0ibuU)0+B-^`p_ z{OHH6m-R24wZ;aFDofZNbNaIhYp;B;@S|CiUaB;|^QKXJ?^2a#&B41Xi|)R(_l=hj z6E8pEr%S7%9i|Prw|&W!4^6e|H0TBuSR3pcP!ukVuW`Pk&olY??0RrDZsh zrug~0{PrqOeSXsEa>W}v94qRRQ;)h-6qUOunMrMPWBk_bIK5^@ZS>+xu5T@K?rKC` z*JXI`bsN!i(ZfT%q3=$f-wD^`u8=F=JI@`pxqfuzr@0-Aj&!!;4Jz***0#8aXy0pY z)u`X%0LR+1_!?Ds%eUTE)){tiYWa$58?LNq*&JBo9$C(I?c1hbSeZFJs7A=@E?9}>N5ZU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/models/armor/pearl_necklace.png b/src/main/resources/assets/unicopia/textures/models/armor/pearl_necklace.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ce0dbc6d35b1fff107c6ca05612bc75d8c3c3d GIT binary patch literal 4955 zcmeHLdsGwI8K3Y5!Ma;t>vC!~TI*|)$z+mAW(k4`!ng#1L6W;Bf_SjSZBRQA* z&Aq?-yWjV_-~B?eIyEIRDq=ze1VK?`l0F^uOF@eZ3ju$du6*zT=)Pn#Nef9%hr+-E zK#GDO5wMnmChE20fE^$TgaSdo613NWEntK;K@{xo*8=;^UV9U;r}komHF8k^6b1SU z&`@BH2K_$JxQ}}FIt6Uu73P2A0gxZj*C&#OR52=*BT@wh)+4Bbkjn`~BSujIQ4tsd z_809O@JL`Xe&-WHSjJHZt@5Wg+%YR0Od)HUJ-_cP# z?yIbu_g+LV$-iP=I&boNwC=M}j!_p2G9nv0&%BkfVSbytExb&c)OFTVe;04`eH6U? z4b*tf*EZ_l76-j+UDoMKt9Gxh+xJ`JsSSl$cTd)5&6uC{WP8_&)1RF>bl$V|H>>E^ z-q|3Y9X}>vQ)>M3jBTSwkk?9l9f{Gkdg+Rs1jIFSXJpi&+o9dRY;DP|-b>=s#s>z- zjy;!$@a+NXw%R_Jc)jp;(6_S!7Zm?_(Sg9jJ1U#Avpd4RX$_GcSh)32Xihs+H*aOZ zpVr^mJ?)O`_nmJnF@}sk8C-nj#?7sr>LpP6rTJ|kYIV>bpKPjWf82iH>CG3~zdm>r zs&00bG~P@93j~c^$eA+vOhYn3J8V*lahO@D*X9%s42qfMbyDDinHH>6dY($Kg00cIcr^H@cf!$4bwGuxs0c>Gd zCK3A~{9>&n6XcQ3;bO&@6q6!wf|n~qC9x6W7#Cw9()DwCDZrCflE?E-LMAIJDv}l{ zqz;!=Cf8^*G6a>OC=3v=+h^w~FKl;D5-55&^sJk9aZa9d*u?@TWp;RYtwaLm#eM$S zoCZTbz1`ib0?2>G_SGY|+Co4;5-42h7W)lioJ3nbK z1w;3*cY0g}{%{yt#ul(P0Cj_1{mhbNW{Sv4j63 z0n7V&hoJjn_k#h-U?B7k+9S9}>a`MKe}Zw)97Fg`HKt+|8YKfOm8b^BD5VmnaNGj3 z7=xP4lv2*H_#i6M?&c{w%?eb2T*?6+7T4eugUVrznwGegdjK(pGs;as1z9(NiCpw3s|6)By)C;cVNQA*;pe_32Mq!8jVtg zs}Ka2hKH%A&?&T1v-O+;Vi!Yh88Z5I0oRsktcC(u)ohg)N`YZ z?0Y>=J&y&P|0;>a{!2knbWaFws*q*;egdwZDLRj`TUk&°OUocn=PP@)K~FtbXS zrpyW$Q(!1ep%xlu8C+?>FeRqK6hqnF4hvsIx!8Cs&=F__($oJ5C7$X(sA)sdMR}}n z3P3OzQNt*1LQq1fBv5n)0zStOiR{&fh~v0|v4F&sBPu0~S(G3}Rj3+f7+j@dlnM=n zutS~xpF@<(VMOzGleD0Mx^qyp+Dfat+J%QVP5jcsRR;<$5UvUJ5*%UH><^A_l%OvUc!~UJ>{{C{8#F zejE;5vu1Z07zuYKWw{|}#E*q0g0@zS2ZNzJX-EjYHzIs&$kb!uvRd#X z#~4x{Z}MJyc=clbgtXBOk6V}Tc|7lOYW9X@w_|8wj!`T@v;nSoG zf4=montm>S` zYVM({8YA~L-!HAq*uN|P=-_5> ztFpge)vO@%Ri7L?d{`HuKNuVt5?EIG*gKP)K6Xt}Y*MoaE<2Z0dg$s*SpW=e%o9D= zT|BgI(`2r*{^`Wl8+RH`nirD$qK}Rf=bS%!(9?aPJYvlCwMI4@k~Da7-MP)}CrW^a zzU^sguS03iA|FglNiJT6 zDVOcXtLi(>ovz*%UD1tRThfZRes7zQJm!30@RPW0HOBi7wlziMiM-$L`0#J~In^!q zyPsd*m{r?~lM%6Jj$}$R>e^0hB-5YXUD>pwskAZ;DV?nKJ#m**b+&%~d@>|a1l_DW zT$I1-4@R=-Ol|VI1(Ck) Date: Thu, 9 Nov 2023 23:41:09 +0000 Subject: [PATCH 47/90] Anyone who can use the change form ability can also sign and use the friendship bracelets --- .../unicopia/ability/ChangeFormAbility.java | 43 ++++++++++++------- .../unicopia/entity/player/Pony.java | 2 +- .../unicopia/item/FriendshipBraceletItem.java | 3 +- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java index fb60bdac..ead40298 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java @@ -1,6 +1,8 @@ package com.minelittlepony.unicopia.ability; +import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import org.jetbrains.annotations.Nullable; @@ -8,6 +10,7 @@ import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.item.FriendshipBraceletItem; import net.minecraft.particle.ParticleTypes; import net.minecraft.sound.SoundCategory; @@ -67,12 +70,17 @@ public class ChangeFormAbility implements Ability { return false; } - player.subtractEnergyCost(5); - - Race.Composite composite = player.getCompositeRace(); - Race actualRace = player.getSpecies(); - player.setSpecies(composite.potential()); - player.setSuppressedRace(actualRace.availability().isGrantable() ? actualRace : Race.UNSET); + List targets = getTargets(player).toList(); + player.subtractEnergyCost(5 * targets.size()); + boolean isTransforming = player.getSuppressedRace().isUnset(); + targets.forEach(target -> { + Race supressed = target.getSuppressedRace(); + if (target == player || supressed.isUnset() == isTransforming) { + Race actualRace = target.getSpecies(); + target.setSpecies(supressed.or(player.getCompositeRace().potential())); + target.setSuppressedRace(isTransforming ? actualRace : Race.UNSET); + } + }); return true; } @@ -80,20 +88,25 @@ public class ChangeFormAbility implements Ability { @Override public void warmUp(Pony player, AbilitySlot slot) { player.getMagicalReserves().getExertion().addPercent(6); + getTargets(player).forEach(target -> { + if (player.getAbilities().getStat(slot).getWarmup() % 5 == 0) { + player.asWorld().playSound(target.asEntity(), target.getOrigin(), SoundEvents.BLOCK_BUBBLE_COLUMN_WHIRLPOOL_INSIDE, SoundCategory.PLAYERS); + } - if (player.getAbilities().getStat(slot).getWarmup() % 5 == 0) { - player.asWorld().playSound(null, player.getOrigin(), SoundEvents.BLOCK_BUBBLE_COLUMN_WHIRLPOOL_INSIDE, SoundCategory.PLAYERS); - } + if (player.asWorld().random.nextInt(5) == 0) { + player.asWorld().playSound(target.asEntity(), target.getOrigin(), USounds.Vanilla.BLOCK_BUBBLE_COLUMN_BUBBLE_POP, SoundCategory.PLAYERS); + } - if (player.asWorld().random.nextInt(5) == 0) { - player.asWorld().playSound(null, player.getOrigin(), USounds.Vanilla.BLOCK_BUBBLE_COLUMN_BUBBLE_POP, SoundCategory.PLAYERS); - } - - player.spawnParticles(ParticleTypes.BUBBLE_COLUMN_UP, 15); - player.spawnParticles(ParticleTypes.BUBBLE_POP, 15); + target.spawnParticles(ParticleTypes.BUBBLE_COLUMN_UP, 15); + target.spawnParticles(ParticleTypes.BUBBLE_POP, 15); + }); } @Override public void coolDown(Pony player, AbilitySlot slot) { } + + private Stream getTargets(Pony player) { + return Stream.concat(Stream.of(player), FriendshipBraceletItem.getPartyMembers(player, 3)); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 221d4dc3..8dfef123 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -247,7 +247,7 @@ public class Pony extends Living implements Copyable, Update setSuppressedRace(Race.UNSET); } - private Race getSuppressedRace() { + public Race getSuppressedRace() { return Race.fromName(entity.getDataTracker().get(SUPPRESSED_RACE), Race.UNSET); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java b/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java index 5575d357..326ddd43 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java @@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; +import com.minelittlepony.unicopia.entity.AmuletSelectors; import com.minelittlepony.unicopia.entity.player.Pony; import net.fabricmc.api.EnvType; @@ -37,7 +38,7 @@ public class FriendshipBraceletItem extends WearableItem implements DyeableItem, public TypedActionResult use(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getStackInHand(hand); - if (!isSigned(stack) && EquinePredicates.PLAYER_UNICORN.test(player)) { + if (!isSigned(stack) && (EquinePredicates.PLAYER_UNICORN.test(player) || AmuletSelectors.PEARL_NECKLACE.test(player))) { player.setCurrentHand(hand); ItemStack result = stack.copy(); From e49828fea15a79b90abd7b35992dd2eb879b3dc5 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 9 Nov 2023 23:41:30 +0000 Subject: [PATCH 48/90] Adjust icon size and positioning in the main ability slot --- .../com/minelittlepony/unicopia/client/gui/ManaRingSlot.java | 2 +- src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/ManaRingSlot.java b/src/main/java/com/minelittlepony/unicopia/client/gui/ManaRingSlot.java index c796e6d3..73ef3bdb 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/ManaRingSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/ManaRingSlot.java @@ -13,7 +13,7 @@ import net.minecraft.client.util.math.MatrixStack; class ManaRingSlot extends Slot { public ManaRingSlot(UHud uHud, AbilitySlot normalSlot, AbilitySlot backupSlot, int x, int y) { - super(uHud, normalSlot, backupSlot, x, y, 8, UHud.PRIMARY_SLOT_SIZE, 33, 43, 42); + super(uHud, normalSlot, backupSlot, x, y, 8, UHud.PRIMARY_SLOT_SIZE, 33, 43, 30); background(0, 5); foreground(0, 59); } diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java b/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java index e337ddf3..4117c7e1 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java @@ -93,8 +93,9 @@ class Slot { AbilityDispatcher.Stat stat = abilities.getStat(bSwap ? bSlot : aSlot); + int iconPosition = ((size - iconSize + slotPadding + 1) / 2); int sz = iconSize - slotPadding; - uHud.renderAbilityIcon(context, stat, slotPadding, slotPadding, sz, sz, sz, sz); + uHud.renderAbilityIcon(context, stat, iconPosition, iconPosition, sz, sz, sz, sz); float cooldown = stat.getFillProgress(); From 38422bda42ff2c345ce0d95e62afc479398dd085 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 10 Nov 2023 14:11:53 +0000 Subject: [PATCH 49/90] Implement seapony diets --- .../unicopia/ability/ChangeFormAbility.java | 2 +- .../unicopia/item/DrinkableItem.java | 10 +--------- .../unicopia/item/ZapAppleItem.java | 2 +- .../unicopia/item/toxin/Ailment.java | 5 ----- .../unicopia/item/toxin/Toxic.java | 18 ++++++++++++++++-- .../unicopia/item/toxin/ToxicHolder.java | 5 ++++- .../unicopia/item/toxin/Toxics.java | 15 ++++++++++++--- .../unicopia/mixin/MixinBlockItem.java | 6 ++++-- .../unicopia/mixin/MixinItem.java | 13 ++++++++----- .../unicopia/mixin/client/MixinItem.java | 2 +- .../resources/data/c/tags/items/fruit.json | 8 -------- .../resources/data/c/tags/items/pineapple.json | 6 ------ .../food_types/cooked_sea_vegitable.json} | 2 +- .../items/food_types/raw_sea_vegitable.json | 12 ++++++++++++ 14 files changed, 61 insertions(+), 45 deletions(-) delete mode 100644 src/main/resources/data/c/tags/items/fruit.json delete mode 100644 src/main/resources/data/c/tags/items/pineapple.json rename src/main/resources/data/{c/tags/items/banana.json => unicopia/tags/items/food_types/cooked_sea_vegitable.json} (56%) create mode 100644 src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java index ead40298..4c841b1a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java @@ -31,7 +31,7 @@ public class ChangeFormAbility implements Ability { @Override public boolean canUse(Race.Composite race) { - return race.potential() != null; + return race.potential() != null && race.potential() != race.physical(); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java b/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java index a9394c3c..23fa0dd1 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java @@ -2,11 +2,8 @@ package com.minelittlepony.unicopia.item; import java.util.Optional; -import com.minelittlepony.unicopia.item.toxin.ToxicHolder; - import net.minecraft.advancement.criterion.Criteria; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; @@ -21,18 +18,13 @@ public class DrinkableItem extends Item { @Override public ItemStack finishUsing(ItemStack stack, World world, LivingEntity user) { + super.finishUsing(stack, world, user); if (user instanceof ServerPlayerEntity) { ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity)user; Criteria.CONSUME_ITEM.trigger(serverPlayerEntity, stack); serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(this)); } - ((ToxicHolder)this).getToxic(stack).finishUsing(stack, world, user); - - if (user instanceof PlayerEntity && !((PlayerEntity)user).getAbilities().creativeMode) { - stack.decrement(1); - } - return stack.isEmpty() ? Optional.ofNullable(getRecipeRemainder()).map(Item::getDefaultStack).orElse(ItemStack.EMPTY) : stack; } diff --git a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java index e2e60e79..ea0c241e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java @@ -118,7 +118,7 @@ public class ZapAppleItem extends Item implements ChameleonItem, ToxicHolder, Mu } @Override - public Toxic getToxic(ItemStack stack) { + public Toxic getToxic(ItemStack stack, LivingEntity entity) { return hasAppearance(stack) ? Toxics.SEVERE_INNERT : Toxics.FORAGE_EDIBLE; } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java index 0433df21..ccd9aade 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java @@ -31,11 +31,6 @@ public record Ailment ( } } - public ItemStack finishUsing(ItemStack stack, World world, LivingEntity entity) { - effect().afflict((PlayerEntity)entity, stack); - return stack; - } - public TypedActionResult use(World world, PlayerEntity player, Hand hand) { if (!Pony.of(player).getObservedSpecies().hasIronGut()) { return TypedActionResult.fail(player.getStackInHand(hand)); diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java index 2395e8ba..2a57be3d 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java @@ -1,8 +1,11 @@ package com.minelittlepony.unicopia.item.toxin; import java.util.*; +import java.util.function.Function; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.entity.player.Pony; + import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; @@ -14,7 +17,7 @@ import net.minecraft.world.World; public record Toxic ( Optional useAction, - Optional component, + Function> food, Ailment.Set ailment ) { public void appendTooltip(PlayerEntity player, List tooltip, TooltipContext context) { @@ -36,6 +39,7 @@ public record Toxic ( private final Ailment def; private final Map overrides = new HashMap<>(); private Optional action = Optional.of(UseAction.EAT); + private final Map components = new HashMap<>(); private Optional component = Optional.empty(); public Builder(Ailment def) { @@ -52,13 +56,23 @@ public record Toxic ( return this; } + public Builder food(Race race, FoodComponent food) { + components.put(race, food); + return this; + } + public Builder with(Race race, Ailment ailment) { overrides.put(race, ailment); return this; } public Toxic build() { - return new Toxic(action, component, Ailment.Set.of(def, overrides)); + return new Toxic(action, entity -> { + if (entity instanceof PlayerEntity player) { + return Optional.ofNullable(components.get(Pony.of(player).getObservedSpecies())).or(() -> component); + } + return component; + }, Ailment.Set.of(def, overrides)); } public Optional buildOptional() { diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java index 466b7b15..a873170c 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java @@ -1,7 +1,10 @@ package com.minelittlepony.unicopia.item.toxin; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.entity.LivingEntity; import net.minecraft.item.*; public interface ToxicHolder { - Toxic getToxic(ItemStack stack); + Toxic getToxic(ItemStack stack, @Nullable LivingEntity entity); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java index 82157234..f8b64265 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java @@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.item.toxin; import com.minelittlepony.unicopia.*; import com.minelittlepony.unicopia.util.RegistryUtils; +import net.minecraft.entity.LivingEntity; import net.minecraft.item.FoodComponent; import net.minecraft.registry.Registry; @@ -16,7 +17,7 @@ import org.jetbrains.annotations.Nullable; public interface Toxics { Registry REGISTRY = RegistryUtils.createSimple(Unicopia.id("toxic")); - Toxic EMPTY = new Toxic(Optional.empty(), Optional.empty(), Ailment.Set.EMPTY); + Toxic EMPTY = new Toxic(Optional.empty(), entity -> Optional.empty(), Ailment.Set.EMPTY); Toxic SEVERE_INNERT = Toxic.innert(Toxicity.SEVERE); @@ -144,20 +145,28 @@ public interface Toxics { .with(Race.BAT, of(Toxicity.SAFE, Toxin.BAT_PONY_INTOXICATION)) ); + Toxic RAW_SEA_VEGITABLES = register("raw_sea_vegitable", new Toxic.Builder(Ailment.INNERT) + .food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE) + ); + + Toxic COOKED_SEA_VEGITABLES = register("cooked_sea_vegitable", new Toxic.Builder(Ailment.INNERT) + .food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE_FILLING) + ); + static void bootstrap() {} static Toxic register(String name, Toxic.Builder builder) { return Registry.register(REGISTRY, Unicopia.id(name), new ToxicRegistryEntry(builder.build(), UTags.item("food_types/" + name))).value(); } - static Toxic lookup(ItemDuck item) { + static Toxic lookup(ItemDuck item, @Nullable LivingEntity entity) { @Nullable FoodComponent food = item.asItem().getFoodComponent(); return REGISTRY.stream() .filter(i -> i.matches(item.asItem())) .map(ToxicRegistryEntry::value) .map(t -> { if (food == null) { - t.component().ifPresent(item::setFoodComponent); + t.food().apply(entity).ifPresent(item::setFoodComponent); } return t; }).findFirst().orElse(food == null ? Toxics.EMPTY : Toxics.EDIBLE); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java index 3cc48210..63e33c3a 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java @@ -25,12 +25,14 @@ abstract class MixinBlockItem extends Item implements ToxicHolder { @Override public UseAction getUseAction(ItemStack stack) { - return getToxic(stack).useAction().orElseGet(() -> super.getUseAction(stack)); + return getToxic(stack, null).useAction().orElseGet(() -> super.getUseAction(stack)); } @Override public TypedActionResult use(World world, PlayerEntity player, Hand hand) { - return getToxic(player.getStackInHand(hand)).ailment().get(player) + return getToxic(player.getStackInHand(hand), player) + .ailment() + .get(player) .map(t -> t.use(world, player, hand)) .orElseGet(() -> super.use(world, player, hand)); } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java index d4924f25..160d8368 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; @@ -43,14 +44,16 @@ abstract class MixinItem implements ItemDuck { public abstract void setFoodComponent(FoodComponent food); @Override - public Toxic getToxic(ItemStack stack) { - setFoodComponent(originalFoodComponent.get()); - return Toxics.lookup(this); + public Toxic getToxic(ItemStack stack, @Nullable LivingEntity entity) { + if (entity != null) { + setFoodComponent(originalFoodComponent.get()); + } + return Toxics.lookup(this, entity); } - @Inject(method = "finishUsing", at = @At("HEAD"), cancellable = true) + @Inject(method = "finishUsing", at = @At("HEAD")) private void finishUsing(ItemStack stack, World world, LivingEntity entity, CallbackInfoReturnable info) { - getToxic(stack).finishUsing(stack, world, entity); + getToxic(stack, entity).finishUsing(stack, world, entity); } @Inject(method = "use", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java index 5196f529..9918c27c 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java @@ -21,6 +21,6 @@ import net.minecraft.world.World; abstract class MixinItem implements ToxicHolder { @Inject(method = "appendTooltip", at = @At("RETURN")) private void onAppendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context, CallbackInfo into) { - getToxic(stack).appendTooltip(MinecraftClient.getInstance().player, tooltip, context); + getToxic(stack, MinecraftClient.getInstance().player).appendTooltip(MinecraftClient.getInstance().player, tooltip, context); } } diff --git a/src/main/resources/data/c/tags/items/fruit.json b/src/main/resources/data/c/tags/items/fruit.json deleted file mode 100644 index 6cd22ee2..00000000 --- a/src/main/resources/data/c/tags/items/fruit.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "replace": false, - "values": [ - "unicopia:mango", - "unicopia:banana", - "unicopia:pineapple" - ] -} diff --git a/src/main/resources/data/c/tags/items/pineapple.json b/src/main/resources/data/c/tags/items/pineapple.json deleted file mode 100644 index 60c5a61e..00000000 --- a/src/main/resources/data/c/tags/items/pineapple.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "replace": false, - "values": [ - "unicopia:pineapple" - ] -} diff --git a/src/main/resources/data/c/tags/items/banana.json b/src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json similarity index 56% rename from src/main/resources/data/c/tags/items/banana.json rename to src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json index f2e0bcc6..1eb87a74 100644 --- a/src/main/resources/data/c/tags/items/banana.json +++ b/src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json @@ -1,6 +1,6 @@ { "replace": false, "values": [ - "unicopia:banana" + "minecraft:dried_kelp_block" ] } diff --git a/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json b/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json new file mode 100644 index 00000000..c0298e4a --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json @@ -0,0 +1,12 @@ +{ + "replace": false, + "values": [ + "minecraft:kelp", + "minecraft:dried_kelp", + "minecraft:seagrass", + "minecraft:sea_pickle", + { "id": "farmersdelight:melon_popsicle", "required": false }, + { "id": "farmersdelight:kelp_roll", "required": false }, + { "id": "farmersdelight:kelp_roll_slice", "required": false } + ] +} From 4a1ac9fede7e13aeed4f98f0c7af131b50537a8b Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 10 Nov 2023 18:14:02 +0000 Subject: [PATCH 50/90] Added a creative tab and more food for seaponies --- .../unicopia/item/group/UItemGroups.java | 1 + src/main/resources/assets/unicopia/lang/en_us.json | 1 + src/main/resources/data/c/tags/items/coral_blocks.json | 10 ++++++++++ src/main/resources/data/c/tags/items/coral_fans.json | 10 ++++++++++ src/main/resources/data/c/tags/items/corals.json | 10 ++++++++++ .../tags/items/food_types/cooked_sea_vegitable.json | 4 +++- .../tags/items/food_types/raw_sea_vegitable.json | 2 ++ .../data/unicopia/tags/items/groups/sea_pony.json | 9 +++++++++ 8 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/data/c/tags/items/coral_blocks.json create mode 100644 src/main/resources/data/c/tags/items/coral_fans.json create mode 100644 src/main/resources/data/c/tags/items/corals.json create mode 100644 src/main/resources/data/unicopia/tags/items/groups/sea_pony.json diff --git a/src/main/java/com/minelittlepony/unicopia/item/group/UItemGroups.java b/src/main/java/com/minelittlepony/unicopia/item/group/UItemGroups.java index 9fe298f6..a1f0efae 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/group/UItemGroups.java +++ b/src/main/java/com/minelittlepony/unicopia/item/group/UItemGroups.java @@ -17,6 +17,7 @@ public interface UItemGroups { RegistryKey UNICORN_ITEMS = ItemGroupRegistry.createGroupFromTag("unicorn", UItems.UNICORN_BADGE::getDefaultStack); RegistryKey PEGASUS_ITEMS = ItemGroupRegistry.createGroupFromTag("pegasus", UItems.PEGASUS_BADGE::getDefaultStack); RegistryKey BAT_PONY_ITEMS = ItemGroupRegistry.createGroupFromTag("bat_pony", UItems.BAT_BADGE::getDefaultStack); + RegistryKey SEA_PON_ITEMS = ItemGroupRegistry.createGroupFromTag("sea_pony", UItems.PEARL_NECKLACE::getDefaultStack); RegistryKey CHANGELING_ITEMS = ItemGroupRegistry.createGroupFromTag("changeling", UItems.CHANGELING_BADGE::getDefaultStack); static void bootstrap() { diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 4f9efbd1..c3ea7de1 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -21,6 +21,7 @@ "itemGroup.unicopia.unicorn": "Unicopia - Canterlot", "itemGroup.unicopia.pegasus": "Unicopia - Cloudsdale", "itemGroup.unicopia.bat_pony": "Unicopia - Hollow Shades", + "itemGroup.unicopia.sea_pony": "Unicopia - From The Depths", "itemGroup.unicopia.changeling": "Unicopia - Cheese Cliffs", "item.unicopia.friendship_bracelet": "Bangle of Comradery", diff --git a/src/main/resources/data/c/tags/items/coral_blocks.json b/src/main/resources/data/c/tags/items/coral_blocks.json new file mode 100644 index 00000000..e907eedc --- /dev/null +++ b/src/main/resources/data/c/tags/items/coral_blocks.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:tube_coral_block", + "minecraft:brain_coral_block", + "minecraft:bubble_coral_block", + "minecraft:fire_coral_block", + "minecraft:horn_coral_block" + ] +} diff --git a/src/main/resources/data/c/tags/items/coral_fans.json b/src/main/resources/data/c/tags/items/coral_fans.json new file mode 100644 index 00000000..531d24c9 --- /dev/null +++ b/src/main/resources/data/c/tags/items/coral_fans.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:tube_coral_fan", + "minecraft:brain_coral_fan", + "minecraft:bubble_coral_fan", + "minecraft:fire_coral_fan", + "minecraft:horn_coral_fan" + ] +} diff --git a/src/main/resources/data/c/tags/items/corals.json b/src/main/resources/data/c/tags/items/corals.json new file mode 100644 index 00000000..cec1b08e --- /dev/null +++ b/src/main/resources/data/c/tags/items/corals.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:tube_coral", + "minecraft:brain_coral", + "minecraft:bubble_coral", + "minecraft:fire_coral", + "minecraft:horn_coral" + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json b/src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json index 1eb87a74..30ffdfce 100644 --- a/src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json +++ b/src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json @@ -1,6 +1,8 @@ { "replace": false, "values": [ - "minecraft:dried_kelp_block" + "minecraft:dried_kelp_block", + "minecraft:glow_lichen", + "#c:coral_blocks" ] } diff --git a/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json b/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json index c0298e4a..c570e4a4 100644 --- a/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json +++ b/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json @@ -5,6 +5,8 @@ "minecraft:dried_kelp", "minecraft:seagrass", "minecraft:sea_pickle", + "#c:corals", + "#c:coral_fans", { "id": "farmersdelight:melon_popsicle", "required": false }, { "id": "farmersdelight:kelp_roll", "required": false }, { "id": "farmersdelight:kelp_roll_slice", "required": false } diff --git a/src/main/resources/data/unicopia/tags/items/groups/sea_pony.json b/src/main/resources/data/unicopia/tags/items/groups/sea_pony.json new file mode 100644 index 00000000..523b4a0a --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/groups/sea_pony.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "unicopia:pearl_necklace", + "minecraft:nautilus_shell", + "#unicopia:food_types/raw_sea_vegitable", + "#unicopia:food_types/cooked_sea_vegitable" + ] +} From 2305775a553e694cb08ee6e891431e23dc509653 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 10 Nov 2023 18:14:26 +0000 Subject: [PATCH 51/90] Added an ability for seaponies --- .../com/minelittlepony/unicopia/UPOIs.java | 16 +++ .../com/minelittlepony/unicopia/USounds.java | 6 + .../com/minelittlepony/unicopia/Unicopia.java | 1 + .../unicopia/ability/Abilities.java | 3 + .../ability/SeaponySonarPulseAbility.java | 112 ++++++++++++++++++ .../resources/assets/unicopia/lang/en_us.json | 5 +- .../resources/assets/unicopia/sounds.json | 10 +- .../unicopia/sounds/screech/screech1.ogg | Bin 0 -> 69388 bytes .../unicopia/sounds/screech/screech2.ogg | Bin 0 -> 36431 bytes .../assets/unicopia/sounds/sonar/sonar0.ogg | Bin 0 -> 48028 bytes .../textures/gui/ability/sonar_pulse.png | Bin 0 -> 9864 bytes 11 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/UPOIs.java create mode 100644 src/main/java/com/minelittlepony/unicopia/ability/SeaponySonarPulseAbility.java create mode 100644 src/main/resources/assets/unicopia/sounds/screech/screech1.ogg create mode 100644 src/main/resources/assets/unicopia/sounds/screech/screech2.ogg create mode 100644 src/main/resources/assets/unicopia/sounds/sonar/sonar0.ogg create mode 100644 src/main/resources/assets/unicopia/textures/gui/ability/sonar_pulse.png diff --git a/src/main/java/com/minelittlepony/unicopia/UPOIs.java b/src/main/java/com/minelittlepony/unicopia/UPOIs.java new file mode 100644 index 00000000..3a7b07e4 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/UPOIs.java @@ -0,0 +1,16 @@ +package com.minelittlepony.unicopia; + +import net.fabricmc.fabric.api.object.builder.v1.world.poi.PointOfInterestHelper; +import net.minecraft.block.AbstractChestBlock; +import net.minecraft.block.Block; +import net.minecraft.registry.Registries; +import net.minecraft.world.poi.PointOfInterestType; + +public interface UPOIs { + PointOfInterestType CHESTS = PointOfInterestHelper.register(Unicopia.id("chests"), 1, 64, Registries.BLOCK.getEntrySet().stream() + .map(entry -> entry.getValue()) + .filter(b -> b instanceof AbstractChestBlock) + .toArray(Block[]::new)); + + static void bootstrap() { } +} diff --git a/src/main/java/com/minelittlepony/unicopia/USounds.java b/src/main/java/com/minelittlepony/unicopia/USounds.java index ec580e36..23980e16 100644 --- a/src/main/java/com/minelittlepony/unicopia/USounds.java +++ b/src/main/java/com/minelittlepony/unicopia/USounds.java @@ -29,6 +29,7 @@ public interface USounds { SoundEvent ENTITY_PLAYER_UNICORN_TELEPORT = register("entity.player.unicorn.teleport"); SoundEvent ENTITY_PLAYER_KIRIN_RAGE = ENTITY_POLAR_BEAR_WARNING; SoundEvent ENTITY_PLAYER_KIRIN_RAGE_LOOP = register("entity.player.kirin.rage.loop"); + SoundEvent ENTITY_PLAYER_SEAPONY_SONAR = register("entity.player.seapony.sonar", 64); SoundEvent ENTITY_PLAYER_EARS_RINGING = register("entity.player.ears_ring"); SoundEvent ENTITY_PLAYER_HEARTBEAT = register("entity.player.heartbeat"); @@ -148,6 +149,11 @@ public interface USounds { return Registry.register(Registries.SOUND_EVENT, id, SoundEvent.of(id)); } + static SoundEvent register(String name, float range) { + Identifier id = Unicopia.id(name); + return Registry.register(Registries.SOUND_EVENT, id, SoundEvent.of(id, range)); + } + static void bootstrap() {} static final class Vanilla extends SoundEvents {} diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 28922b79..4b1f6f3a 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -91,6 +91,7 @@ public class Unicopia implements ModInitializer { UGameEvents.bootstrap(); UBlocks.bootstrap(); + UPOIs.bootstrap(); UItems.bootstrap(); UPotions.bootstrap(); UParticles.bootstrap(); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java index dbf06852..39b66b8f 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java @@ -67,6 +67,9 @@ public interface Abilities { Ability NIRIK_BLAST = register(new NirikBlastAbility(), "nirik_blast", AbilitySlot.SECONDARY); Ability KIRIN_CAST = register(new KirinCastingAbility(), "kirin_cast", AbilitySlot.SECONDARY); + // seapony + Ability SONAR_PULSE = register(new SeaponySonarPulseAbility(), "sonar_pulse", AbilitySlot.SECONDARY); + static > T register(T power, String name, AbilitySlot slot) { Identifier id = Unicopia.id(name); BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()).add(power); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/SeaponySonarPulseAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/SeaponySonarPulseAbility.java new file mode 100644 index 00000000..c4df03a4 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/SeaponySonarPulseAbility.java @@ -0,0 +1,112 @@ +package com.minelittlepony.unicopia.ability; + +import java.util.Comparator; +import java.util.Optional; +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.AwaitTickQueue; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.UPOIs; +import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.ability.data.Hit; +import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; +import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.particle.ParticleUtils; +import com.minelittlepony.unicopia.particle.UParticles; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityGroup; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.HostileEntity; +import net.minecraft.registry.tag.FluidTags; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.event.GameEvent; +import net.minecraft.world.poi.PointOfInterestStorage.OccupationStatus; + +public class SeaponySonarPulseAbility implements Ability { + + @Override + public int getWarmupTime(Pony player) { + return 10; + } + + @Override + public int getCooldownTime(Pony player) { + return 100; + } + + @Override + public boolean canUse(Race race) { + return race == Race.SEAPONY; + } + + @Nullable + @Override + public Optional prepare(Pony player) { + return Hit.INSTANCE; + } + + @Override + public Hit.Serializer getSerializer() { + return Hit.SERIALIZER; + } + + @Override + public double getCostEstimate(Pony player) { + return 5; + } + + @Override + public boolean apply(Pony player, Hit data) { + player.setAnimation(Animation.ARMS_UP, Animation.Recipient.ANYONE); + + for (Entity target : player.findAllEntitiesInRange(64, e -> { + return (e instanceof LivingEntity && (e instanceof HostileEntity || ((LivingEntity)e).getGroup() == EntityGroup.AQUATIC)) && e.isSubmergedInWater(); + }).sorted(Comparator.comparing(e -> e.distanceTo(player.asEntity()))).toList()) { + Vec3d offset = target.getPos().subtract(player.getOriginVector()); + float distance = target.distanceTo(player.asEntity()); + if (distance < 4) { + float scale = 1 - (distance/10F); + ((LivingEntity)target).takeKnockback(0.7 * scale, -offset.x, -offset.z); + target.damage(target.getDamageSources().sonicBoom(player.asEntity()), 10 * scale); + } else { + emitPing(player, target.getPos(), 10, 1, 1.3F); + } + } + player.subtractEnergyCost(5); + + if (player.asWorld() instanceof ServerWorld sw) { + sw.getPointOfInterestStorage().getNearestPosition( + type -> type.value() == UPOIs.CHESTS, + pos -> player.asWorld().getFluidState(pos).isIn(FluidTags.WATER), player.getOrigin(), 64, OccupationStatus.ANY) + .ifPresent(chestPos -> { + emitPing(player, chestPos.toCenterPos(), 20, 0.5F, 2F); + }); + } + + player.playSound(USounds.ENTITY_PLAYER_SEAPONY_SONAR, 1); + player.spawnParticles(UParticles.SHOCKWAVE, 1); + player.asEntity().emitGameEvent(GameEvent.INSTRUMENT_PLAY); + + return true; + } + + private void emitPing(Pony player, Vec3d pos, int delay, float volume, float pitch) { + AwaitTickQueue.scheduleTask(player.asWorld(), w -> { + ParticleUtils.spawnParticle(w, UParticles.SHOCKWAVE, pos, Vec3d.ZERO); + float loudness = Math.max(0, 1.4F - (float)Math.log10(player.getOriginVector().distanceTo(pos))); + w.playSound(null, pos.x, pos.y, pos.z, USounds.ENTITY_PLAYER_SEAPONY_SONAR, SoundCategory.AMBIENT, volume * loudness, pitch); + w.emitGameEvent(player.asEntity(), GameEvent.INSTRUMENT_PLAY, pos); + }, delay + (int)player.getOriginVector().distanceTo(pos)); + } + + @Override + public void warmUp(Pony player, AbilitySlot slot) { + player.getMagicalReserves().getExertion().addPercent(6); + } + + @Override + public void coolDown(Pony player, AbilitySlot slot) { + } +} diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index c3ea7de1..77647277 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -497,6 +497,7 @@ "ability.unicopia.peck.block.unfased": "The block is unfazed by your threats", "ability.unicopia.dash": "Flying Dash", "ability.unicopia.change_form": "Change Form", + "ability.unicopia.sonar_pulse": "Sonar Pulse", "gui.unicopia.trait.label": "Element of %s", "gui.unicopia.trait.group": "\n %s", @@ -959,8 +960,10 @@ "unicopia.subtitle.wind_rush": "Wind gusts", "unicopia.subtitle.insects": "Insects Scurrying", "unicopia.subtitle.changeling_buzz": "Drone buzzing", - "unicopia.subtitle.batpony_eeee": "Batpony screeches", + "unicopia.subtitle.batpony_eeee": "Batpony Screeches", + "unicopia.subtitle.sonar": "Sonar Pulses", "unicopia.subtitle.changeling.transform": "Changeling transforms", + "unicopia.subtitle.screech": "Hippogriff Screeches", "unicopia.subtitle.pegasus.molt": "Pegasus loses feather", "unicopia.subtitle.unicorn.teleport": "Magic pops", "unicopia.subtitle.player.wololo": "Wololo!", diff --git a/src/main/resources/assets/unicopia/sounds.json b/src/main/resources/assets/unicopia/sounds.json index 67885c5c..f914ffea 100644 --- a/src/main/resources/assets/unicopia/sounds.json +++ b/src/main/resources/assets/unicopia/sounds.json @@ -33,7 +33,15 @@ "category": "player", "subtitle": "unicopia.subtitle.screech", "sounds": [ - "unicopia:screech/screech0" + "unicopia:screech/screech1", + "unicopia:screech/screech2" + ] + }, + "entity.player.seapony.sonar": { + "category": "player", + "subtitle": "unicopia.subtitle.sonar", + "sounds": [ + "unicopia:sonar/sonar0" ] }, "item.magic.aura": { diff --git a/src/main/resources/assets/unicopia/sounds/screech/screech1.ogg b/src/main/resources/assets/unicopia/sounds/screech/screech1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d7d9d38b912f06ed0f1fbf6a95572b34b345c1a0 GIT binary patch literal 69388 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�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

      =w2_@~m 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/sounds/screech/screech2.ogg b/src/main/resources/assets/unicopia/sounds/screech/screech2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b60cb9bd4a3cfdf795fe88b8dc42177598eb15a1 GIT binary patch literal 36431 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 aIY&eeKtP;`>Bo9WhgC38LIVH*3JwlNKL0`h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/sounds/sonar/sonar0.ogg b/src/main/resources/assets/unicopia/sounds/sonar/sonar0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7b61c0b32e5f04126454e6669244c7aced4846a1 GIT binary patch literal 48028 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 literal 0 HcmV?d00001 From 3f480b666449685753f788ccaa6cfe4308656f3e Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 10 Nov 2023 18:15:09 +0000 Subject: [PATCH 52/90] Reduce seaponies' visibility on land and fix suppressed races not transferring when respawning --- .../unicopia/client/render/WorldRenderDelegate.java | 5 +++++ .../com/minelittlepony/unicopia/entity/player/Pony.java | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java index 90a9fd4d..70a7c975 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java @@ -55,6 +55,11 @@ public class WorldRenderDelegate { RenderSystem.setShaderFogEnd(RenderSystem.getShaderFogEnd() + 190); } } + if (camera.getSubmersionType() == CameraSubmersionType.NONE) { + if (EquinePredicates.PLAYER_SEAPONY.test(MinecraftClient.getInstance().player)) { + RenderSystem.setShaderFogStart(-130); + } + } } public boolean beforeEntityRender(Entity entity, diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 8dfef123..538dd8d6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -57,6 +57,7 @@ import net.minecraft.registry.tag.DamageTypeTags; import net.minecraft.registry.tag.FluidTags; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; @@ -464,6 +465,10 @@ public class Pony extends Living implements Copyable, Update entity.setAir(entity.getAir() - 1); } + if (entity.age % 60 == 0) { + entity.playSound(SoundEvents.ENTITY_TURTLE_AMBIENT_LAND, 1, 1); + } + if (entity.getAir() == -20) { entity.setAir(0); entity.damage(entity.getDamageSources().dryOut(), 2); @@ -872,10 +877,13 @@ public class Pony extends Living implements Copyable, Update && oldPlayer.respawnRace.isUnset()) || oldPlayer.getSpecies().isUnset(); + Race oldSuppressedRace = oldPlayer.getSuppressedRace(); + if (alive) { oldPlayer.getSpellSlot().stream(true).forEach(getSpellSlot()::put); } else { if (forcedSwap) { + oldSuppressedRace = Race.UNSET; Channel.SERVER_SELECT_TRIBE.sendToPlayer(new MsgTribeSelect(Race.allPermitted(entity), "gui.unicopia.tribe_selection.respawn"), (ServerPlayerEntity)entity); } else { oldPlayer.getSpellSlot().stream(true).filter(SpellPredicate.IS_PLACED).forEach(getSpellSlot()::put); @@ -894,6 +902,7 @@ public class Pony extends Living implements Copyable, Update } setSpecies(oldPlayer.respawnRace != Race.UNSET && !alive ? oldPlayer.respawnRace : oldPlayer.getSpecies()); + setSuppressedRace(oldSuppressedRace); getDiscoveries().copyFrom(oldPlayer.getDiscoveries(), alive); getPhysics().copyFrom(oldPlayer.getPhysics(), alive); if (!forcedSwap) { From 3ce297b8ca8fec7f9aa28b974f0bfc4343bcd623 Mon Sep 17 00:00:00 2001 From: LingVarr <104311317+LingVarr@users.noreply.github.com> Date: Sat, 11 Nov 2023 08:25:04 +1100 Subject: [PATCH 53/90] Update ru_ru.json (#214) --- .../resources/assets/unicopia/lang/en_us.json | 2 +- .../resources/assets/unicopia/lang/ru_ru.json | 76 ++++++++++++++----- 2 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 77647277..dc2905db 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -529,7 +529,7 @@ "gui.unicopia.tribe_selection.describe.unicopia.pegasus": "Join the Pegasus Tribe, soar with the Wonderbolts", "gui.unicopia.tribe_selection.describe.unicopia.bat": "Join the Bat Tribe, become the darkest night", "gui.unicopia.tribe_selection.describe.unicopia.kirin": "Join the Kirin's Village, take the vow of silence", - "gui.unicopia.tribe_selection.describe.unicopia.hippogriff": "Join Hippogriff Tibe, screech at your neighbors", + "gui.unicopia.tribe_selection.describe.unicopia.hippogriff": "Join Hippogriff Tribe, screech at your neighbors", "gui.unicopia.tribe_selection.describe.unicopia.changeling": "Join the Changeling Hive, your Queen demands it", "gui.unicopia.tribe_selection.confirm": "You have selected %s", diff --git a/src/main/resources/assets/unicopia/lang/ru_ru.json b/src/main/resources/assets/unicopia/lang/ru_ru.json index 6d3c45d2..e3484934 100644 --- a/src/main/resources/assets/unicopia/lang/ru_ru.json +++ b/src/main/resources/assets/unicopia/lang/ru_ru.json @@ -51,7 +51,8 @@ "item.unicopia.earth_badge": "Эмблема земного пони", "item.unicopia.changeling_badge": "Эмблема чейнджлинга", "item.unicopia.bat_badge": "Эмблема бэтпони", - "item.unicopia.kirin_badge": "Эмблема киринов", + "item.unicopia.kirin_badge": "Эмблема кирина", + "item.unicopia.hippogriff_badge": "Эмблема гиппогрифа", "item.unicopia.butterfly_spawn_egg": "Яйцо призыва бабочки", "item.unicopia.butterfly": "Бабочка", @@ -141,6 +142,9 @@ "item.unicopia.alicorn_amulet": "Амулет аликорна", "item.unicopia.alicorn_amulet.lore": "Время ношения: %d", + "item.unicopia.pearl_necklace": "Жемчужное ожерелье", + "item.unicopia.pearl_necklace.lore": "Наделяет владельца подводными способностями", + "item.unicopia.horse_shoe.accuracy": "Точность: %d%%", "item.unicopia.horse_shoe.speed": "Скорость: %d", "item.unicopia.iron_horse_shoe": "Железная подкова", @@ -176,7 +180,7 @@ "item.unicopia.music_disc_funk": "Пластинка", "item.unicopia.music_disc_funk.desc": "Фанк, просто фанк", - "item.unicopia.cloud_lump": "Облачная лампа", + "item.unicopia.cloud_lump": "Облачный ком", "item.unicopia.light_gray_bed_sheets": "Светло-серая простынь", "item.unicopia.gray_bed_sheets": "Серая простынь", "item.unicopia.black_bed_sheets": "Черная простынь", @@ -344,6 +348,12 @@ "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_kirin": "Туманное зелье метаморфоз кирина", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_kirin": "Стрела метаморфоз кирина", + "effect.unicopia.change_race_hippogriff": "Метаморфозы гиппогрифа", + "item.minecraft.potion.effect.unicopia.tribe_swap_hippogriff": "Зелье метаморфоз гиппогрифа", + "item.minecraft.splash_potion.effect.unicopia.tribe_swap_hippogriff": "Взрывное зелье метаморфоз гиппогрифа", + "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "Туманное зелье метаморфоз гиппогрифа", + "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "Стрела метаморфоз гиппогрифа", + "potion.potency.6": "VII", "spell.unicopia.frost": "Заморозка", @@ -480,6 +490,12 @@ "ability.unicopia.rainboom": "Звуковая радуга", "ability.unicopia.rage": "Ярость", "ability.unicopia.nirik_blast": "Заряд нирика", + "ability.unicopia.screech": "Кричать", + "ability.unicopia.peck": "Клевать", + "ability.unicopia.peck.block.fled": "Блок сбежал", + "ability.unicopia.peck.block.unfased": "Блок не обращает внимания на ваши угрозы", + "ability.unicopia.dash": "Рывок", + "ability.unicopia.change_form": "Изменить форму", "gui.unicopia.trait.label": "Элемент %s", "gui.unicopia.trait.group": "\n %s", @@ -511,6 +527,7 @@ "gui.unicopia.tribe_selection.describe.unicopia.pegasus": "Присоединяйтесь к племени пегасов, парите вместе с Вондерболтами", "gui.unicopia.tribe_selection.describe.unicopia.bat": "Присоединяйтесь к племени бэтпони, станьте самой темной ночью", "gui.unicopia.tribe_selection.describe.unicopia.kirin": "Присоединяйтесь к Деревне Киринов, дайте обет молчания", + "gui.unicopia.tribe_selection.describe.unicopia.hippogriff": "Присоединяйтесь к племени гиппогрифов, кричите на своих соседей", "gui.unicopia.tribe_selection.describe.unicopia.changeling": "Присоединяйтесь к Улью Чейнджлингов, ваша королева требует этого", "gui.unicopia.tribe_selection.confirm": "Вы выбрали племя \"%s\"", @@ -519,37 +536,47 @@ "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.human": " - Всеядны и могут есть все виды пищи, кроме любви", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.human": " - Противоположные большие пальцы", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.human": " - Ходят прямо", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.human": "", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.earth": " - Более сильная отдача и сопротивление магии", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.earth": " - Дополнительный вес делает их эффективными против магии и грубой силы", - "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.earth": " - Особая связь с землей, которая делает земледелие на 10,000% эффективнее!", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.earth": " - Милые висячие пони-ушки", + "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.earth": " - Особая связь с землёй, которая делает земледелие на 10,000% эффективнее!", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.earth": " - Обладают мощными ударами, пинками и топтанием, которые они могут использовать для защиты или нападения на окружающую среду", + "gui.unicopia.tribe_selection.confirm.goods.5.unicopia.earth": " - Единственные, кто может обняться с крипером и выжить", + "gui.unicopia.tribe_selection.confirm.goods.6.unicopia.earth": " - Могут есть камни", + "gui.unicopia.tribe_selection.confirm.goods.7.unicopia.earth": " - Милые висячие пони-ушки", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.unicorn": " - Телепортация и магические заклинания", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.unicorn": " - Исследуют и создают магические артефакты, усиливающие их способности", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.unicorn": " - Могут использовать магию для обнаружения или раскрытия находящихся поблизости чейнджлингов", "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.unicorn": " - Имеют заостренные палки на голове", - "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.pegasus": " - Могут летать", + "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.pegasus": " - Полёт и способность к тренировкам для повышения выносливости", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.pegasus": " - Используют накопленную ману для выполнения мощной звуковой радуги", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.pegasus": " - Двигаются быстрее и получают меньше урона от падения", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.pegasus": " - Могут есть овощи и некоторые виды рыбы", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.pegasus": " - Можно напрямую взаимодействовать с облачными предметами и блоками", + "gui.unicopia.tribe_selection.confirm.goods.5.unicopia.pegasus": " - Могут есть овощи и некоторые виды рыбы", - "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.bat": " - Могут летать", + "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.bat": " - Полёт и способность к тренировкам для повышения выносливости", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.bat": " - Лучше видят ночью", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.bat": " - Способность цепляться за нижнюю часть блоков", "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.bat": " - Имеют ужасающий, но очаровательный (и слегка раздражающий) визг", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.changeling": " - Могут летать и зависать на месте", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.changeling": " - Перевоплощаются практически в кого и что угодно", - "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.changeling": " - Плотоядны. Могут есть всё, от чего не тошнит", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.changeling": "", + "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.changeling": " - Прилипают к стенам и могут перелезть практически через всё", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.changeling": " - Плотоядны. Могут есть всё, от чего не тошнит", "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.kirin": " - Невосприимчивы ко всем видам огненного урона", "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.kirin": " - Могут открыть способность ярости, получая урон", "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.kirin": " - В обычном состоянии бесшумны и могут спокойно ходить рядом с Хранителем", - "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.kirin": " - Могут есть фрукты и овощи, мясо и некоторые виды кормов, обычно ядовитые для других", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.kirin": " - Могут есть фрукты и овощи, мясо и некоторые виды кормов, обычно ядовитые для других рас", + + "gui.unicopia.tribe_selection.confirm.goods.1.unicopia.hippogriff": " - Полёт и способность к тренировкам для повышения выносливости", + "gui.unicopia.tribe_selection.confirm.goods.2.unicopia.hippogriff": " - Могут совершать рывки в полёте", + "gui.unicopia.tribe_selection.confirm.goods.3.unicopia.hippogriff": " - Имеют острый и шумный клюв для кричания и клевания", + "gui.unicopia.tribe_selection.confirm.goods.4.unicopia.hippogriff": " - Могут употреблять сырую и варёную рыбу, варёное мясо", + "gui.unicopia.tribe_selection.confirm.goods.5.unicopia.hippogriff": " - При поедании шишек восстанавливают здоровье", + "gui.unicopia.tribe_selection.confirm.goods.6.unicopia.hippogriff": " - Любят лестницы", "gui.unicopia.tribe_selection.confirm.bads": "но они...", @@ -561,31 +588,35 @@ "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.earth": " - Не могут летать", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.earth": " - Слабы к некоторым видам магии", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.earth": " - Могут есть только растения и овощи", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.earth": " - Тяжелее и передвигаются медленнее, чем другие пони", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.unicorn": " - Не могут летать", - "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.unicorn": " - Слабы к атакам грубой силы", + "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.unicorn": " - Слабы к грубым атакам", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.unicorn": " - Могут есть только растения и овощи", - "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.pegasus": " - Слабы к атакам грубой силы", + "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.pegasus": " - Слабы к грубым атакам", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.pegasus": " - Должны отдыхать между полётами", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.pegasus": " - Не могут использовать магию без помощи", - "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.pegasus": "", - "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.bat": " - Слабы к атакам грубой силы", + "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.bat": " - Слабы к грубым атакам", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.bat": " - Должны отдыхать между полётами", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.bat": " - Иногда боятся даже самих себя", - "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.bat": " - Плотоядны. Могут есть всё, от чего не тошнит", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.bat": " - Плотоядны. Могут есть сырое и варёное мясо или питаться исключительно ворованной любовью", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.changeling": " - Постоянно голодают", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.changeling": " - Требуют любви, которую собирают с пони или других мобов для поддержания своего рациона", - "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.changeling": " - Становятся больными от обычной пищи и должны питаться любовью, чтобы ускорить излечение", - "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.changeling": "", + "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.changeling": " - Становятся больными от употребления самой обычной пищи и должны собирать любовь, чтобы ускорить излечение", "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.kirin": " - Теряют свою бесшумность в состоянии ярости", "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.kirin": " - Поджигают вещи, особенно когда близки к ярости", "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.kirin": " - Легче, чем другие пони, и сильнее оттакливаются", "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.kirin": " - Не любят воду", + "gui.unicopia.tribe_selection.confirm.bads.1.unicopia.hippogriff": " - Слабы к грубым атакам", + "gui.unicopia.tribe_selection.confirm.bads.2.unicopia.hippogriff": " - Не могут взаимодействовать с облаками", + "gui.unicopia.tribe_selection.confirm.bads.3.unicopia.hippogriff": " - Должны отдыхать между полётами, чтобы восстановить силы", + "gui.unicopia.tribe_selection.confirm.bads.4.unicopia.hippogriff": " - Имеют куриный мозг", + "gui.unicopia.tribe_selection.join": "Присоединиться", "gui.unicopia.tribe_selection.cancel": "Назад", @@ -811,6 +842,10 @@ "unicopia.race.bat.alt": "Бэтпони", "unicopia.race.kirin": "Кирин", "unicopia.race.kirin.alt": "Кирины", + "unicopia.race.hippogriff": "Гиппогриф", + "unicopia.race.hippogriff.alt": "Гиппогрифы", + "unicopia.race.seapony": "Морской пони", + "unicopia.race.seapony.alt": "Морские пони", "death.attack.unicopia.generic.and_also": "%1$s и %2$s", "death.attack.unicopia.generic.whilst_flying": "%1$s во время полёта", @@ -932,6 +967,7 @@ "unicopia.subtitle.entity.player.kick": "Игрок бьёт", "unicopia.subtitle.magic_aura": "Магическое гудение", "unicopia.subtitle.player.rebound": "Игрок отскакивает от стены", + "unicopia.subtitle.screech": "Игрок кричит", "unicopia.subtitle.ears_ringing": "Звон в ушах", "unicopia.subtitle.heartbeat": "Стук сердца", "unicopia.subtitle.entity.artefact.ambient": "Магическое гудение", @@ -1010,8 +1046,8 @@ "advancements.unicopia.juice.description": "Наконец-то нашлось применение всем этим яблокам", "advancements.unicopia.toast.title": "Он хрустящий и вкусный!", "advancements.unicopia.toast.description": "Сделать тостового компаньона", - "advancements.unicopia.burned_toast.title": "Тости НЕЕЕЕЕЕЕТ!", - "advancements.unicopia.burned_toast.description": "Поджарь Тости", + "advancements.unicopia.burn_toast.title": "Тости НЕЕЕЕЕЕЕТ!", + "advancements.unicopia.burn_toast.description": "Поджарь Тости", "advancements.unicopia.lucky.title": "Как на ТВ", "advancements.unicopia.lucky.description": "Сделать несколько счастливых подков из картофеля фри", "advancements.unicopia.sweet_apple_acres.title": "Яблочная Аллея", From 2017aefc5ae1a9c8058ac8c9412e38c862cca90a Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 11 Nov 2023 00:34:06 +0000 Subject: [PATCH 54/90] Add more bed sheet variants and kelp bed sheets --- .../unicopia/block/FancyBedBlock.java | 13 +++++++++---- .../com/minelittlepony/unicopia/item/UItems.java | 5 +++++ .../resources/assets/unicopia/lang/en_us.json | 5 +++++ .../unicopia/models/item/kelp_bed_sheets.json | 6 ++++++ .../models/item/rainbow_bpw_bed_sheets.json | 6 ++++++ .../models/item/rainbow_bpy_bed_sheets.json | 6 ++++++ .../models/item/rainbow_pbg_bed_sheets.json | 6 ++++++ .../models/item/rainbow_pwr_bed_sheets.json | 6 ++++++ .../unicopia/textures/entity/bed/sheets/kelp.png | Bin 0 -> 6368 bytes .../textures/entity/bed/sheets/rainbow_bpw.png | Bin 0 -> 6218 bytes .../textures/entity/bed/sheets/rainbow_bpy.png | Bin 0 -> 6024 bytes .../textures/entity/bed/sheets/rainbow_pbg.png | Bin 0 -> 6174 bytes .../textures/entity/bed/sheets/rainbow_pwr.png | Bin 0 -> 6456 bytes .../unicopia/textures/item/kelp_bed_sheets.png | Bin 0 -> 7632 bytes .../textures/item/rainbow_bpw_bed_sheets.png | Bin 0 -> 7293 bytes .../textures/item/rainbow_bpy_bed_sheets.png | Bin 0 -> 7298 bytes .../textures/item/rainbow_pbg_bed_sheets.png | Bin 0 -> 7313 bytes .../textures/item/rainbow_pwr_bed_sheets.png | Bin 0 -> 7314 bytes .../data/unicopia/tags/items/bed_sheets.json | 7 ++++++- 19 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/unicopia/models/item/kelp_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/rainbow_bpw_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/rainbow_bpy_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/rainbow_pbg_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/rainbow_pwr_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/kelp.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_bpw.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_bpy.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_pbg.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_pwr.png create mode 100644 src/main/resources/assets/unicopia/textures/item/kelp_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/rainbow_bpw_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/rainbow_bpy_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/rainbow_pbg_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/rainbow_pwr_bed_sheets.png diff --git a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java index 160290aa..b3494074 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java @@ -102,21 +102,26 @@ public class FancyBedBlock extends BedBlock { BLACK(DyeColor.BLACK), BROWN(DyeColor.BROWN), RED(DyeColor.RED), - ORANGE(DyeColor.ORANGE),// + ORANGE(DyeColor.ORANGE), YELLOW(DyeColor.YELLOW), LIME(DyeColor.LIME), GREEN(DyeColor.GREEN), CYAN(DyeColor.CYAN), LIGHT_BLUE(DyeColor.LIGHT_BLUE), - BLUE(DyeColor.BLUE),// + BLUE(DyeColor.BLUE), PURPLE(DyeColor.PURPLE), MAGENTA(DyeColor.MAGENTA), - PINK(DyeColor.PINK), // + PINK(DyeColor.PINK), APPLE(null), BARS(null), CHECKER(null), - RAINBOW(null); + KELP(null), + RAINBOW(null), + RAINBOW_BPW(null), + RAINBOW_BPY(null), + RAINBOW_PBG(null), + RAINBOW_PWR(null); @SuppressWarnings("deprecation") public static final Codec CODEC = StringIdentifiable.createCodec(SheetPattern::values); diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 282f9e3e..dd36c523 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -182,7 +182,12 @@ public interface UItems { Item APPLE_BED_SHEETS = register(CloudBedBlock.SheetPattern.APPLE); Item BARRED_BED_SHEETS = register("barred_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.BARS, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); Item CHECKERED_BED_SHEETS = register("checkered_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.CHECKER, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item KELP_BED_SHEETS = register(CloudBedBlock.SheetPattern.KELP); Item RAINBOW_BED_SHEETS = register(CloudBedBlock.SheetPattern.RAINBOW); + Item RAINBOW_BPW_BED_SHEETS = register(CloudBedBlock.SheetPattern.RAINBOW_BPW); + Item RAINBOW_BPY_BED_SHEETS = register(CloudBedBlock.SheetPattern.RAINBOW_BPY); + Item RAINBOW_PBG_BED_SHEETS = register(CloudBedBlock.SheetPattern.RAINBOW_PBG); + Item RAINBOW_PWR_BED_SHEETS = register(CloudBedBlock.SheetPattern.RAINBOW_PWR); AmuletItem PEGASUS_AMULET = register("pegasus_amulet", new PegasusAmuletItem(new FabricItemSettings() .maxCount(1) diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index dc2905db..e19929cf 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -200,7 +200,12 @@ "item.unicopia.apple_bed_sheets": "Apple Patterned Bed Sheets", "item.unicopia.barred_bed_sheets": "Bar Patterned Bed Sheets", "item.unicopia.checkered_bed_sheets": "Checker Patterned Bed Sheets", + "item.unicopia.kelp_bed_sheets": "Kelp Bed Sheets", "item.unicopia.rainbow_bed_sheets": "Rainbow Patterned Bed Sheets", + "item.unicopia.rainbow_bpw_bed_sheets": "BPW Rainbow Patterned Bed Sheets", + "item.unicopia.rainbow_bpy_bed_sheets": "BPY Rainbow Patterned Bed Sheets", + "item.unicopia.rainbow_pbg_bed_sheets": "PGB Rainbow Patterned Bed Sheets", + "item.unicopia.rainbow_pwr_bed_sheets": "PWR Rainbow Patterned Bed Sheets", "block.unicopia.rocks": "Rocks", "block.unicopia.bananas": "Bananas", diff --git a/src/main/resources/assets/unicopia/models/item/kelp_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/kelp_bed_sheets.json new file mode 100644 index 00000000..8234a2b0 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/kelp_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/kelp_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/rainbow_bpw_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/rainbow_bpw_bed_sheets.json new file mode 100644 index 00000000..7930b725 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/rainbow_bpw_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/rainbow_bpw_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/rainbow_bpy_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/rainbow_bpy_bed_sheets.json new file mode 100644 index 00000000..50c3f6c4 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/rainbow_bpy_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/rainbow_bpy_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/rainbow_pbg_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/rainbow_pbg_bed_sheets.json new file mode 100644 index 00000000..0b4d249f --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/rainbow_pbg_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/rainbow_pbg_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/rainbow_pwr_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/rainbow_pwr_bed_sheets.json new file mode 100644 index 00000000..94dd563f --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/rainbow_pwr_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/rainbow_pwr_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/kelp.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/kelp.png new file mode 100644 index 0000000000000000000000000000000000000000..02fbc460474bcddb212686345cd26fdbdb30acf8 GIT binary patch literal 6368 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 F_!m5F(g^?n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_bpw.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_bpw.png new file mode 100644 index 0000000000000000000000000000000000000000..8a846140edb45d9a982170702c794420ad1f9c79 GIT binary patch literal 6218 zcmeHLd010d7JpHcy?`r-+7K2|Nb+75vJ_+sN+=-v_F3d5?*&rGLK0*Vm8GEI4z!8` z78P+pu`YBFWwF$8L)79(1qFm!he5#=P+aCFAmB{DZ$4+*{^d(#A#r>=sIK8*d=a0&2+{#J07=k-2x<%{gbDH_ z!enSNXv+p=8j#f(b(uq$qNz6m*?d$k0J7~UMm+{0Oo9wST?7gZ$TL8F2o&+Uk-2Jt ztiE(KAJ!yDgLqdj<@@*%X%qye&>3JnOrvuV1bm4w%tcsSgaPI!l#FYnW^xT1N(TC6 zirwA)`0nmRxk4rq$Keo^RJ3}VlV^jAX?91MmxrC+O5^woe#H;=kTzH9c^okQGAm@B zH|2GvjUhjG!`{va`J?D#|Lp8KT%K7@)OnLuRn1;l?U~bIoiz(-kH6ips$*C&IFHC! z=5G`;=W~2)!q{OXpbFgQ$I(;TLbL z-=DMhP+4H@*5_gO&YTM`zY*5E>s8j>GquMX6C(C{3QRuVN_2BI#Dk(Nmz?&^&0-WU zNPT5lv4XVSt%7FCndO%?_15#uw`cp?BeD+isSAss>J@YE3k`H0PP$Uvo%-o#zE8Du z7EcaMXM1EL zXKE{(;$K48fzX5Iot?&})PRBNtEX3ShX-Un^i4+FH$X%wui3|#Z z0+T(G#4Bl}#d<_X1t#JK@Rp2HfIBBrj7lZvQmKiFiIhY-MW%?RA{-8f3e%`G8W|wS z%4DeuO(IK`mTHO-4j!%)D#UV?SSBT^IZ=TuLFGgufqvpU{UmZ9pD}u=a?}gJAJimN zPDLm%RU)BI9HCTstOO*Z3jO8?Wl*vlrv~6kS%N}{d#uEzD$9u!m~d>oJV6nsF$WV; z@i<%pph_?+^4^r{4L3GI?Sg2rM6MYHoc$hBB^Hf4>pk7nJsNW+DguU&@xF(CXS)Ur zP(D6fo=ljaR*%nfBB|%+Vltr^<7z|(6A`hQ2#XA}5GI*{JHTWCjL^w!9H-*~fe5EF z&W4csAvvMA=`n&AhU#QpbdjVBXigeY%Ujh2RP$h(tA~CUt6h)XTyJ#sJ5n>No`ins#6d*Ij|5Dw!fkCW~_-jV0Z& zZXd9nFjR%|P!$eH$I@`nyEJSE1b9S!HJy(P6N{4n8(O`2h>idcmfTaU1oJ0rnnre1 zARa$*H*y;%)@&srQL`zysBpvtCAt#FGHo(>IufKlmw|D}XiWSGCUOKqIupel$POYHn24*>0Y@k#3ve2Xjlc+u zA|o4mEJpr!6A`eGLEte2W^-v^6*Xc1CzvQg*g_@(3&|p;14?EvX$YB(F+^mLuNW}X z0Ye4YNZR{-Oho>DXOEibNL3$h@3y8R^*=W62w=i#2m*Yh4V<#z(58-^+M|&V^!+2R z(WLQ5PC+DooaBT2`_Ww=-St5p_#p7d==$ic5AwhVfj>sq@8&MO@%MgQ3Le)J!CU=q zf72T9kHA#H=Sz9eTlJ@;W`90t(Up6KD zDq8Fyl3P>Zx^>#Oi<^6R{l)E{9gVE%y1bpboH9GIHkIFBENO%3W#UOhQp}O~#owBp z-v+>ub!&>HWWvk0MzW4te5Xy*{ijNon#5m|%LbdCr+Dy^p8jeGUcGr*l_B5YyKlZM zDv`9AW~ax`JylnCzR@)MuFcF6sK29be?dkevf1)e=QX@w|KP=I-x#D7-tD^@{N`ED z^k&B6$K6Y_(Wo{DuZ5{YkJ1aKJ$0OJ()e`a`tK@wAKG-jd9y3vl9IUMVC7E{miu^K zIqT~i{qAI)u-AwB-YkD{^hsUhQGI&YEk_DZE5APSGX3TVS2_PMRvhMAx>9^)o zOuDi)plbMWsC^AR7s`3Ly{`L6x6tCbFLpPvZs?vA?(;Lh{Qd5mG8TbfaLptw+0VY7 zcfF72UzSWNoZh!%P9oPy_8oz?WvF^vHL_;d&?33RG1~rYspa?Nzy1X(w8?(jbL;hR zh?&>!qUeB!*Ear|9V5c5Nc9<|ZUZjW`Pu30=pT!ZhBzO3biwncxBd3+CMWjDRdp)4 zUiN0-Xwu`Cs~|6SIR{$%YS4Log8QUKL+!{{L%lVpdd@yLd++MnecqOYFfC3-$C|g3 zq2@4Kt+!v8?~5F2HgZ0FDme{0Y+>J(x5gV;r5df73ulCDAMY<-;gu7fP6EF4 zaPep85@rPFF4~Uo-RFJX`%=p3nzWWp2~=+4ez(}-zGKT0D4{7CzG(>}letUtuGv=& zT)Ok3@m`AchI%pYb3zo98*CrdyE0#QYt7`w0<_e?vZeP2c!sgX?Tb$@h)oBYbDRX|?x0oS)u&AgO&*Y}>%>$~1#2 zv%@n_elg()`-c3s9_u_}x$NvzI7TEf^ied-k80u!#1h4XL`8`0s>*y0 zhQ1oG&YO~IRIzx@j^+sK^1S@c>SY;FNG_A_t$S>+>*P1!k)~~kRIj#0Eyg6x> zR!mFQjLn0--)!8aA3V+D>zl2$Tg+bfcx`fwGCN?G(NUp|T`|B{2z}Xp7fWX^$cB#0 zD>v+)=aUg*6Z^L#uCs0z#qWB2-i{NUQvNJNm!m=(vu#+adis(w`@%^ag#ETM|CBWcq#aTmLRy zMH<F8h!7N~D2O580veK+J&~}6RX{cowF+5YAW9aJKmu-1QGx=3f-6=K z7qp04MO3tixX`-L3c|D?GVT^dPyroO<|ZKGOwXC)%yj-TIXCxv_x|qhe%t+SURG#` z-&oU0rVs>;4e;lLgWf~i&_>|*kSMVobU!1}0m6U)X9x`*01{;Yp|lv#P@`l$ls=>n z#@2y04#--JwoO7A>iTRT+YHMEK%Oy-(XN3}deB(V7lB3svK8nLfhNiv+Uo}(Yd>h+ zm#zot5FdKKfZ$Lp$pt35kSSn2kwj*}FbgJPfk2|OU<%kDRs2ySEz>;n2n(QJhREAH zG{D;%E0arwq67qj)I}@v+5UANwwGce_Jz-!JZr|?yb{*0K0d6a6V`{?H<=!0ZTtG~ zhQX6IS$*YKTiMZZg?Fp=(t`QM^F1+dp~R%baAp3u!4|897uB-1jjDb-)pMvMjJx9& zc})Bn@&3&w@XkdO^p8CD!+4_|T*z0qZQg6;dZmTEV#T=)J+q!GR_CIqQuzGzaSf!p z6Ipak98J9DrCVY~p`h?}k@~{kG2`6jixc1ED2`pyYslWV{grECM)a)YV>d6A3zlAN zycjmG(J7|>Ou4-MZuz{W`Q$FWKqm`*)$GhwwoQ%!d^=heA zRef$DQ_{?m3eTX-&C`2u$dTn|tB+Jyt!_9mFn~IdgdiRB@2A_*J!yt)R56$#k5`P5)yu*@5Y7x|~kk%-ig zNPg-vK2v~mcQbWWvjBk@QF5_rae_p_QnPV7UKWtG!vq{w2T?9#w`1qGS@z%@pe@7YJG59N%FI@WjT&E0r=9fuK^UTvTKisXUGVGnq^RkwhSo@Bo2V zq)3!pHD01{&{7O>a1aGwE|MulQVCYe$>m9tlx!Rh%ws?3Czb^VkI+jL!(IUXAgH-A z0_;L0h{c4_D-=qfWI!^k&>yZ)M5f3PLO7z3Cdv7TPckA=I*g_e@JH6mlH>_Ga|C<> zl7NT-Q~`E{KiN`y;zm|zT@WV{%XF)Nvp+#9MZ%BH`b0PFjLw|Vih$)Kyq};y*scQu zRB$khBjqP))eGRTaoYV^0x4f4VCh5(6&5n6Fda{%!&E#4p%L*sB230J5QL2IctV6s z;f|sTkSLT~2_Ml?0df}+;Gqlne2RdC;AuRj5Kp1e>3ANQ3@Df|lgA*#3;~}$iej!@ z1hSHwFj^}ul>ktYXjDFf#-!lsdpJZq#{%X!lckC6q1fgz-ReND8M^F?ZSAa~^a_VZQZblmx7BB`lmaENEK%g53wy?bA2v;eUM@pp$Y}`oI z9hnXW$4S6dayeWj0!T;daO8(NJd;Rd5r@>*(gjNeB4NtELu(HY))nAE$o)kMuz!kf zXy`;mAc;dyLyrj}-BH3~b%%n*B^B;u(EOeZr)d_KbCf6A_q3Y99Z9Px|;egwV(>8ZP+urqXl za{3glibu3j01m^$L_CQY2{Tw!5{p8eNrbfyBmDU$l9&QANk}B&$#jsX6duSR-(UqXB{2%hxmGCc_Jp>qaRe$5!YS>P|(^*?i$>BpC1 zL<0WHs=zC+Lu}?W@Vacoo8!lU2DRVfa|bqq5fhpJ0tEz(8Lw?9Xh)GX7&KM}1p632 z8e{sEjk#uuekKGN#sqLYBh|k>`;~pfHekZ#p234HUE7y$Ej;Ga0lhZJJC-*NhmN`$ z=jiD#u)*1<*Lz${vyDEPbiKD#eWv=*4W@yjx_M&%O3Q0wv;*VEBLNF&7k|mgE{gWWzLmRU0q%N zPWjTY7S2s>s3um$k=dje!8g{Tipimv4fc)+Q}Z?C&)17#K|b@p_NZ z{0FZ#*L-8m{E9+w(SoLT)WR;>0u9#y`B}X9~Trcn*y`Pdf~E;=J;#! z8Q1;I+JXvq?wo$V{6v(0&z93xv!-`7Ty=ZYr3+i@;>GSAud0u{V@xR)+;D%__+VYo zsUvS6?vB~BKh`%V-~Ihc@76#v*XD9V&1>7p?SV$BRqxi^8DDyHp~Iu?b-Qai-acO* zg8HHV7NJ7ohk@ia*;YNO>1|_=rws(6C(x(PCEMY=3y}qnIc>W(=}~>mGbhfUYO>d$ z%PVlLcmP`Da4XQfC$(R%^Rexg38&eRWq*40&jWrZsMh+1=9O56Ft;8dF7MptVk?z0 zcZX!7WW~+qGZvDXZSDnD)uGNWn_3t&s9qHxn^tXkkF(t(K1fi6EDp2iFv6KB_FL6w z>K|x)@;$sB`~6X|SGHFh&C!>V(K*(m$~T7gqUU_3#T3gdjjiZ#-DBH8+=C$3_Dy?S zm6~j8ho!lFA?ORlx@$j9>~J_|EGvOdN?L572v2?45|fgSic`Ctrg{YyHIJnpklNt9 zg0gnFOvag{SF8^*{)uu=@~WcD^pKwC<9n^bCrN$!%@gG52RDTu=+|f*NE%^N0op#z z`C;zPW6G(T;zRcfx=;4h)-FC+nRhd`)oR|#GOOx#Q}oLqukPlsdBv6v+njdJuG^*P zJT)-{Yg{_5}rYkMAP|4%oKe-G*0<%lVb-Gb&`VE+=CkJSwH8ew6~(-(0y$}~@LEj#RMldqkN z`%#kU*`?mUw3qF}T=Qo(&P%Mybe>e8cgfax){>rCd2{UNj&IUq>@(Zb7P|fyuRY(9 zuGNPT4J=G7OCDxq`$A3Gr=zajxM(dpT>3jkPt(!jI_8zzUsKmKr`Mh|%*%mUM)h^@ zuO7s#f`abMO?Kw`7*$hA^ThnC=TgkKIiu^7R-v{+xk;(fhgkM|Gxagv23}G}x-D90 zyQc(gq^vG_TQ>1wZqDVCCSBxlr!#ymXf@-r^*l>5+ RZ=m`@0X`v|3a{92{sDedmbL%@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_pbg.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_pbg.png new file mode 100644 index 0000000000000000000000000000000000000000..c07851225fd45d2f6aae18fe96756c6ef509e3e0 GIT binary patch literal 6174 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_pwr.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow_pwr.png new file mode 100644 index 0000000000000000000000000000000000000000..69312e520295fbd445a3904d002b06d89e7c41f0 GIT binary patch literal 6456 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 IOTXy<0G}9{iU0rr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/rainbow_bpw_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/rainbow_bpw_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3613351ff64e52a060018a26b5b5d1be2951fc GIT binary patch literal 7293 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/rainbow_pbg_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/rainbow_pbg_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..65c3c3f60268a19e79c2e1f6e78e491da2571737 GIT binary patch literal 7313 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 H@2LL(4g6M> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/rainbow_pwr_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/rainbow_pwr_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..88f4a338b14ef3f4d7a1bb765ca3770fd6b92c93 GIT binary patch literal 7314 zcmeHMcT`hLw@;8>1e7K!hFAbKq>~T{sDKa@1wo}LoFpd@APFR)DIk|3f)!CwPy`e# zSE&}Hh)S{0lrAa=7o;ecq6mn{cM{9h_rA5>x@+D0{xZpAX7=p)&ECJ+bI#dGoZV(C zC3$Um7!0OFv$og@)hePQD-C@wc{d9{RX*rMW6@|UVX{z14hDlu!r&qusK9?{OTg#A z=0LLDP?-m{MLMFQ4VMzv5m0;K*Yt^ZX=GzSZpfGI)sQK;acwi;BYLPhkF6~9Rm zFtPMoZAG)SL*NXt7(+Y(nuEdNDOfD@L0~Wx9GODI!S3Y^4Z~pa6t=m!ot+m?$P;++ z{17yAbA%tC$71_}Fj(-JvnPWb9a}YG>q~=nr`KZC49tg1l@O(*%MBL5sRbVTbLQd+ zdAb=As+Ja#>gytr(g*h;^N{f|5gzw+jv~@3Jk;#%L-6_Ag}uF{NlBecJi~m>l}=DS zhr?QmU`I=4ZkGt1ff<4Q{SQmmapTZnm^+cwNPE zS060nezuLsTbHaT$6?V|so)Z|FS2-+|#=yhICd%3f$`S~JLD%WK zJ0{ZO`j*oW4|DO@M|E{ZulY_@-I1TuX9q?|@0%wMRt|jDSAKam@vd5ye1CUQUV}qp zOz3WwbYf-t!kLi$v;ME#&y{1M6Yq8jf;0B}Jw5Ip5|_(8XE& zriR#Nt$>TD(UtCz4O#oyPF78-a$TH?^1Ss^PgY!#Tp4>MopMR;qYg!CXGHe;s3%k} zwdBa~*p719O_7&#aaWa6?kcuPeTXW5b;1u>qFooI&^6?z?xwsX>Uo#KNWi3#iG*3K zr)q?Xs&>XcEnUS5B{_?X1j**w5YnCDZ{h~eo)@GRq(O>Kxm){3=7>x1novaQq58_Cu7x8zC*hyS z;i(AQC%R;n`?8Os4@IwBuh2EGOSels!P-%;eO^?YTemb_eUv;Z?|*#q@G|oTz1s-7zR4M0Ok1GQll?(|jLz!g@BQawXGE5dZVkIgyOxHZ^-V?Z*Mu%j!Zo; z7uSx{!TFwEf7%?U30CRLT1Itm0PKzIwe^$q|8P{?7CUHen|0Ez?ED7@PbSDjf#slp z>BFplc=(A*vQcg9Nt;#Y&!)XhFHLedDMiPuqN#2Pv)a5#7rx2bMQ2|FF?%V|>yXC%(Jf_J$qu_Acjz)|a=i zw>w)t+h}Yak~3!6%T`a0FR;nCiFxdN!eCqcmGdii+*m(;W)NSr`ejV2O-{zd6VImO zO(o6I-T~e--tPt}gVoInO|H#L*eV1qZ8>dq?U&m4KxqoKSX`+n>D4{u&Ri5?^Wvxj~hZ1N>|Z^C~d8Djp#gaaAud7S*l3#~ng zmrt;-u%ia%;1}TC3nU5*3p#7ZYn@*cU*B5&P$O024T^%=<)ZDxU#;xaaU;V?%88RV zc=Mwdhf#Zro0ppZ^m<&uGf#X?8ZJ^R^WdtRUamWykKeq=>3rt=T<-1Wwiy z?5yn2R-;y9(wbX0xP32GgU}Q7iE!lwM|yRdb&gP*sq?8RRL_#DB`v{cCpPSv4jF#0 z^TGZDFh!WEnQWiT9v>QAIu-MA+cb5wb)s)NNa`;94!l@G$FR|*%C$vRRw7IyNXk^c zLC$6Idj@6&S-)__BzwQJb+|Q8e>uVEy;pwCQdRodMx^pMQp{+ zI0xEh+6h{t8;MJt0P}USo&B7Tgj^D-=IILBl*)%Q}5R(#f-ubXI(V16JUa;l0b>9g8BY#|Qt9Nrx z$m_6T=^OiQWUX;W?PYxKcS*Vt@Fp!_^i5H#&sDUW*`0eneQ9^Sk!l&#T>)l5${K{G?^M>)TsRTuV+bcc_z<#~Hr4rSfgJ&+@G0Czda3*dEs%{6+zDHj>UV-9QC$!X8T`bzr1*z_x#T7nYT0MGG~;pH?3?v*>uP3AvO3` z-S63@yNd6Osl2vpNx!JnrBvF9yTkEz^j*#V6nrWuxX1coLh6c?tgQ1kR@KQ}EZ|*J z-YEv@j$k&spz=~?_K6l3{-Q;iI(t8ay_g8vJbAX?^bz^lSX7Jhbh|#Ma>#BEcY2f6 z)(6&}j(x8TIvrl_{IHW_rac=xdA)rg8K3X@xNcsZM(R#-QV{n;Xw}q!LY!t*5upaxZTJs$WyaL1ON47WFh+_2Kp`YSm@dcU7*|9EZs zxs0zgh1b^6ukA(&4t&V&zi&H{lEj;OQ53%C+0eZ;)x$3qA6}qyyZX+W5cGIQ^|bRu z-xA;8{oziZtOxCT8JQ2p&ECwspwOv&R#VvZVOoEp4C88EUm5fB7*H}|FvaeT9<*q@ zFx4|)P=9%0{dSXuds9b4!;AWN47g8}J_#Ew=hc;s*ILvaEbA$An=E~Q;{NaDIVks_ zdg)rz@Wc0O8M|@&VMeQ7*%oEZ1`UnRQgcqd`((68 zxd8@KHf1|H37u>=Q5ZaqA;9F(LBn8lC z5N$EGe&(PT+j=)2blAPwk+Iu{Va!CDnaZ04Qy>5iCzecUAc9~>FvOrNgV}*Nq^Uf@gwJGAwpwiX3IX+~NH3w#kAg-A1qB%f z;SG6wPc+up*cgq$p>a4Aq=6EIaD_lHiYr(ug7|`A0SXv=wx5vA<03?u0G$^gq#}{f zIO3aq96wvz@9V)Uj8Qm%4nSgpF@^|=p_mNH1|FXSK-|Q!?w_IVgf?I0uX`_==WUF@msFA z3Tj}!^G>nlG1;t;|4UnRcn~IEw%nR6fYuKYi@uyF2hjgZ?@QO0Ej~&Jg!oWU0LB*= z1VA9j6x#`5eHmhS0bEZIx_W#K*Kcz6e+dQ9h|XjXNpuvGNMfJ}Opt)0gDfJnodl8* zgMlRxSzq?=JGy|!5(WW$aGfW_Bg7RHo?@;L`r?f;_}P{qFHp1#5Md}R28G8uVxi0$ z%Cd1^2}A$;F5<{U0!YLFCU;sRdjKf1+29pk5EN~s_`x+Kd)cu>UuP5r?TmpgkwaDM%_ZMBi==xg>{4M2Q z(e;b2zs11cQvMZP{}^5JePezyNTgY!YobSXk`JL6}{6+FD60~IX`P> z0Su-vUsT|*>EPdOfTi;J2rJ2a(l{)~G#S2c#FqZB!Y)Lkrp;nKd4OI{j8 zjOyd3OnQ+Sw~SL$%DZ@zsk->hZK`spX{d6i%;#yN{VGOZRAkelD++jPDs4`CB*r{wuDJK~UH6elVAj8J(Fk0ntxO@}u-z$8Z{v!y_Xg+c zMyE}`h?7o`bZYLE*76u0Vb49ZD~;o-b&Eeb_ByPwQ-`1wDerTmdGu@U|Ey=AcPRJ?X!JV=l zM{Q_(`Szb~#s%toExKml6IJCw`_0Nm^2t@TqQ&NLRM8BiZEH_(Z IulI=j4?r?k2><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/tags/items/bed_sheets.json b/src/main/resources/data/unicopia/tags/items/bed_sheets.json index 99f4c7d3..295c3f4d 100644 --- a/src/main/resources/data/unicopia/tags/items/bed_sheets.json +++ b/src/main/resources/data/unicopia/tags/items/bed_sheets.json @@ -21,6 +21,11 @@ "unicopia:apple_bed_sheets", "unicopia:barred_bed_sheets", "unicopia:checkered_bed_sheets", - "unicopia:rainbow_bed_sheets" + "unicopia:kelp_bed_sheets", + "unicopia:rainbow_bed_sheets", + "unicopia:rainbow_bpw_bed_sheets", + "unicopia:rainbow_bpy_bed_sheets", + "unicopia:rainbow_pbg_bed_sheets", + "unicopia:rainbow_pwr_bed_sheets" ] } From 7ffa77f12f92e45cc047647bfdaf09eaf1012f5b Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 12 Nov 2023 20:26:12 +0000 Subject: [PATCH 55/90] Shhhhh --- assets/models/changeling.bbmodel | 1 + 1 file changed, 1 insertion(+) create mode 100644 assets/models/changeling.bbmodel diff --git a/assets/models/changeling.bbmodel b/assets/models/changeling.bbmodel new file mode 100644 index 00000000..3854a2c6 --- /dev/null +++ b/assets/models/changeling.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"free","box_uv":true},"name":"minelittlepony:races/alex/changeling","model_identifier":"","visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"right_arm","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-4,-24,0],"to":[-1,-12,4],"autouv":0,"color":9,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,47,32]},"east":{"uv":[40,20,44,32]},"south":{"uv":[51,20,54,32]},"west":{"uv":[47,20,51,32]},"up":{"uv":[47,20,44,16]},"down":{"uv":[50,16,47,20]}},"type":"cube","uuid":"1d8264fe-4073-4137-b67f-755b78874f9a"},{"name":"left_leg","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1,-24,9],"to":[4,-12,13],"autouv":0,"color":8,"origin":[0,0,0],"uv_offset":[16,48],"faces":{"north":{"uv":[20,52,23,64]},"east":{"uv":[16,52,20,64]},"south":{"uv":[27,52,30,64]},"west":{"uv":[23,52,27,64]},"up":{"uv":[23,52,20,48]},"down":{"uv":[26,48,23,52]}},"type":"cube","uuid":"2224c5bb-33a1-45aa-8df2-7b245faf572e"},{"name":"torso","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-4,-12,-2],"to":[4,-4,14],"autouv":0,"color":5,"origin":[0,0,0],"uv_offset":[4,4],"faces":{"north":{"uv":[20,20,28,28]},"east":{"uv":[4,20,20,28]},"south":{"uv":[44,20,52,28]},"west":{"uv":[28,20,44,28]},"up":{"uv":[28,20,20,4]},"down":{"uv":[36,4,28,20]}},"type":"cube","uuid":"0416c2d2-5521-4e77-85c1-ceb3224e34a1"},{"name":"head","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-4,-2,-6],"to":[4,6,2],"autouv":0,"color":6,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16]},"east":{"uv":[0,8,8,16]},"south":{"uv":[24,8,32,16]},"west":{"uv":[16,8,24,16]},"up":{"uv":[16,8,8,0]},"down":{"uv":[24,0,16,8]}},"type":"cube","uuid":"5398561f-992a-42d9-8aac-2359cb9f783e"},{"name":"left_ear","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,6,-1],"to":[4,8,1],"autouv":0,"color":5,"origin":[0,0,0],"uv_offset":[12,16],"faces":{"north":{"uv":[14,18,16,20]},"east":{"uv":[12,18,14,20]},"south":{"uv":[18,18,20,20]},"west":{"uv":[16,18,18,20]},"up":{"uv":[16,18,14,16]},"down":{"uv":[18,16,16,18]}},"type":"cube","uuid":"67772092-a7ec-4b41-9bc3-6d9c78303b33"},{"name":"right_ear","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-4,6,-1],"to":[-2,8,1],"autouv":0,"color":9,"origin":[0,0,0],"uv_offset":[12,16],"faces":{"north":{"uv":[14,18,16,20]},"east":{"uv":[12,18,14,20]},"south":{"uv":[18,18,20,20]},"west":{"uv":[16,18,18,20]},"up":{"uv":[16,18,14,16]},"down":{"uv":[18,16,16,18]}},"type":"cube","uuid":"a9803b7d-652c-4b9e-9360-850d3d32406e"},{"name":"bone","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-0.5,7,-3.5],"to":[0.5,11,-2.5],"autouv":0,"color":6,"rotation":[-25,0,0],"origin":[0,0,0],"uv_offset":[0,3],"faces":{"north":{"uv":[1,4,2,8]},"east":{"uv":[0,4,1,8]},"south":{"uv":[3,4,4,8]},"west":{"uv":[2,4,3,8]},"up":{"uv":[2,4,1,3]},"down":{"uv":[3,3,2,4]}},"type":"cube","uuid":"f495b1c9-8836-4873-9abf-e32119dfebdf"},{"name":"left_arm","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1,-24,0],"to":[4,-12,4],"autouv":0,"color":5,"origin":[0,0,0],"uv_offset":[32,48],"faces":{"north":{"uv":[36,52,39,64]},"east":{"uv":[32,52,36,64]},"south":{"uv":[43,52,46,64]},"west":{"uv":[39,52,43,64]},"up":{"uv":[39,52,36,48]},"down":{"uv":[42,48,39,52]}},"type":"cube","uuid":"b6b07f07-21da-4a4f-98fb-b100c8ed3d49"},{"name":"right_leg","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-4,-24,9],"to":[-1,-12,13],"autouv":0,"color":2,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[4,20,7,32]},"east":{"uv":[0,20,4,32]},"south":{"uv":[11,20,14,32]},"west":{"uv":[7,20,11,32]},"up":{"uv":[7,20,4,16]},"down":{"uv":[10,16,7,20]}},"type":"cube","uuid":"f21f6c04-9c32-48e3-b959-be34311f9d5f"},{"name":"hat","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-4.5,-2.5,-6.5],"to":[4.5,6.5,2.5],"autouv":0,"color":7,"visibility":false,"origin":[0,0,0],"uv_offset":[32,0],"faces":{"north":{"uv":[41,9,50,18]},"east":{"uv":[32,9,41,18]},"south":{"uv":[59,9,68,18]},"west":{"uv":[50,9,59,18]},"up":{"uv":[50,9,41,0]},"down":{"uv":[59,0,50,9]}},"type":"cube","uuid":"bb8858c3-14b6-4e16-a2de-745a8e65336e"},{"name":"tail","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-2,-17,16],"to":[2,-2,20],"autouv":1,"color":0,"origin":[0,-3,16],"uv_offset":[-2,-2],"faces":{"north":{"uv":[2,2,6,17]},"east":{"uv":[-2,2,2,17]},"south":{"uv":[10,2,14,17]},"west":{"uv":[6,2,10,17]},"up":{"uv":[6,2,2,-2]},"down":{"uv":[10,-2,6,2]}},"type":"cube","uuid":"5adca51a-e69d-9aab-9771-29d8b56ea43c"},{"name":"neck","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-2,-5,-2.75],"to":[2,-1,1.25],"autouv":1,"color":0,"rotation":[-9,0,0],"origin":[0,0,0],"uv_offset":[-2,-2],"faces":{"north":{"uv":[2,2,6,6]},"east":{"uv":[-2,2,2,6]},"south":{"uv":[10,2,14,6]},"west":{"uv":[6,2,10,6]},"up":{"uv":[6,2,2,-2]},"down":{"uv":[10,-2,6,2]}},"type":"cube","uuid":"10c33114-4039-f51d-26c8-d0eb1d84d00d"},{"name":"tail_stub","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-1,-13,8.75],"to":[1,-11,13.75],"autouv":1,"color":0,"rotation":[-29,0,0],"origin":[0,-1,-2.25],"uv_offset":[-3,-3],"faces":{"north":{"uv":[2,2,4,4]},"east":{"uv":[-3,2,2,4]},"south":{"uv":[9,2,11,4]},"west":{"uv":[4,2,9,4]},"up":{"uv":[4,2,2,-3]},"down":{"uv":[6,-3,4,2]}},"type":"cube","uuid":"caed00cb-bb23-d4d7-898a-f63b47e96948"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-2,-2,-7],"to":[2,0,-6],"autouv":1,"color":0,"origin":[0,0,0],"uv_offset":[1,1],"faces":{"north":{"uv":[2,2,6,4]},"east":{"uv":[1,2,2,4]},"south":{"uv":[7,2,11,4]},"west":{"uv":[6,2,7,4]},"up":{"uv":[6,2,2,1]},"down":{"uv":[10,1,6,2]}},"type":"cube","uuid":"b29482ca-b64c-f284-64c9-569945a66b90"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-1,0,-7],"to":[1,1,-6],"autouv":1,"color":0,"origin":[0,0,0],"uv_offset":[1,1],"faces":{"north":{"uv":[2,2,4,3]},"east":{"uv":[1,2,2,3]},"south":{"uv":[5,2,7,3]},"west":{"uv":[4,2,5,3]},"up":{"uv":[4,2,2,1]},"down":{"uv":[6,1,4,2]}},"type":"cube","uuid":"8f742406-4f87-ad08-d533-eda4374d7e6d"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-2,-2,-7],"to":[2,1,-6],"autouv":1,"color":0,"visibility":false,"origin":[0,0,0],"uv_offset":[1,1],"faces":{"north":{"uv":[2,2,6,5]},"east":{"uv":[1,2,2,5]},"south":{"uv":[7,2,11,5]},"west":{"uv":[6,2,7,5]},"up":{"uv":[6,2,2,1]},"down":{"uv":[10,1,6,2]}},"type":"cube","uuid":"42084153-147e-681d-58b0-c6aada64e0c9"},{"name":"left","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[4,-5,4],"to":[16,-5,10],"autouv":1,"color":0,"rotation":[7.5,0,37.50000000000003],"origin":[4,-5,7],"uv_offset":[-4,-4],"faces":{"north":{"uv":[2,2,14,2]},"east":{"uv":[-4,2,2,2]},"south":{"uv":[20,2,32,2]},"west":{"uv":[14,2,20,2]},"up":{"uv":[14,2,2,-4]},"down":{"uv":[26,-4,14,2]}},"type":"cube","uuid":"295ecf47-5eb2-53a2-9a06-96ba0b864206"},{"name":"right","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-16,-4,4],"to":[-4,-4,10],"autouv":1,"color":0,"rotation":[7.5,3.578124016646456e-15,-37.500000000000064],"origin":[-4,-4,7],"uv_offset":[-4,-4],"faces":{"north":{"uv":[2,2,14,2]},"east":{"uv":[-4,2,2,2]},"south":{"uv":[20,2,32,2]},"west":{"uv":[14,2,20,2]},"up":{"uv":[14,2,2,-4]},"down":{"uv":[26,-4,14,2]}},"type":"cube","uuid":"4e372f3c-39b6-945c-1597-5ee203dd8fbe"},{"name":"left_comp","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[3,-5,4],"to":[15,-5,10],"autouv":1,"color":0,"rotation":[10,0,67.49999999999999],"origin":[3,-5,7],"uv_offset":[-4,-4],"faces":{"north":{"uv":[2,2,14,2]},"east":{"uv":[-4,2,2,2]},"south":{"uv":[20,2,32,2]},"west":{"uv":[14,2,20,2]},"up":{"uv":[14,2,2,-4]},"down":{"uv":[26,-4,14,2]}},"type":"cube","uuid":"7ad679d8-2c63-2f04-741c-f5156f12a98f"},{"name":"right_comp","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-15,-4,4],"to":[-3,-4,10],"autouv":1,"color":0,"rotation":[10,0,-67.49999999999999],"origin":[-3,-4,7],"uv_offset":[-4,-4],"faces":{"north":{"uv":[2,2,14,2]},"east":{"uv":[-4,2,2,2]},"south":{"uv":[20,2,32,2]},"west":{"uv":[14,2,20,2]},"up":{"uv":[14,2,2,-4]},"down":{"uv":[26,-4,14,2]}},"type":"cube","uuid":"d981e2c7-b1f1-035e-adb7-a82b9b83d4f3"}],"outliner":[{"name":"body","origin":[0,0,0],"color":0,"uuid":"b7f58495-d35a-49f7-9018-7cb0790d7e7d","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["0416c2d2-5521-4e77-85c1-ceb3224e34a1","10c33114-4039-f51d-26c8-d0eb1d84d00d",{"name":"tail","origin":[0,-5,13],"color":0,"uuid":"8c3663fd-66f3-4700-9b48-f40c53471614","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["caed00cb-bb23-d4d7-898a-f63b47e96948","5adca51a-e69d-9aab-9771-29d8b56ea43c"]},{"name":"wings","origin":[0,0,0],"color":0,"uuid":"ed904a49-16c2-f559-f0d4-46d57735e79d","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["295ecf47-5eb2-53a2-9a06-96ba0b864206","7ad679d8-2c63-2f04-741c-f5156f12a98f","4e372f3c-39b6-945c-1597-5ee203dd8fbe","d981e2c7-b1f1-035e-adb7-a82b9b83d4f3"]}]},{"name":"head","origin":[0,0,0],"color":0,"uuid":"4e4e43eb-6b25-4753-b192-48cbda23758e","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["5398561f-992a-42d9-8aac-2359cb9f783e","67772092-a7ec-4b41-9bc3-6d9c78303b33","a9803b7d-652c-4b9e-9360-850d3d32406e",{"name":"horn","origin":[0,0,0],"color":0,"uuid":"36833de9-990e-414f-881f-12cb96eb6cdc","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["f495b1c9-8836-4873-9abf-e32119dfebdf"]},{"name":"snout","origin":[0,0,0],"color":0,"uuid":"72d884c7-00a0-4508-9f8a-f2c3d89741f6","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":[{"name":"mare","origin":[0,0,0],"color":0,"uuid":"804d414a-6eab-4af7-8ac3-0876598d2f2f","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["b29482ca-b64c-f284-64c9-569945a66b90","8f742406-4f87-ad08-d533-eda4374d7e6d"]},{"name":"stallion","origin":[0,0,0],"color":0,"uuid":"bf66d113-c543-4ec4-a176-3bd46ac4c161","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":false,"autouv":0,"children":["42084153-147e-681d-58b0-c6aada64e0c9"]}]}]},"bb8858c3-14b6-4e16-a2de-745a8e65336e","b6b07f07-21da-4a4f-98fb-b100c8ed3d49","1d8264fe-4073-4137-b67f-755b78874f9a","2224c5bb-33a1-45aa-8df2-7b245faf572e","f21f6c04-9c32-48e3-b959-be34311f9d5f"],"textures":[]} \ No newline at end of file From 98ad16e52d9fa0da4f3b014fb7333b9e0dad1364 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 18 Nov 2023 14:18:58 +0000 Subject: [PATCH 56/90] Added different sea shells, and a recipe to craft the necklace --- assets/models/block_shell.bbmodel | 1 + assets/models/block_shell_2.bbmodel | 1 + assets/models/clam_shell_3.bbmodel | 1 + assets/models/clam_shell_4.bbmodel | 1 + .../unicopia/block/ShellsBlock.java | 74 ++++++++++++++ .../unicopia/block/UBlocks.java | 6 +- .../minelittlepony/unicopia/item/UItems.java | 5 + .../unicopia/item/toxin/Toxics.java | 8 ++ .../unicopia/item/toxin/UFoodComponents.java | 3 + .../unicopia/server/world/UWorldGen.java | 46 +++++++++ .../unicopia/blockstates/clam_shell.json | 8 ++ .../unicopia/blockstates/scallop_shell.json | 8 ++ .../unicopia/blockstates/turret_shell.json | 8 ++ .../resources/assets/unicopia/lang/en_us.json | 4 + .../unicopia/models/block/clam_shell_1.json | 16 +++ .../unicopia/models/block/clam_shell_2.json | 24 +++++ .../unicopia/models/block/clam_shell_3.json | 32 ++++++ .../unicopia/models/block/clam_shell_4.json | 40 ++++++++ .../models/block/scallop_shell_1.json | 6 ++ .../models/block/scallop_shell_2.json | 6 ++ .../models/block/scallop_shell_3.json | 6 ++ .../models/block/scallop_shell_4.json | 6 ++ .../unicopia/models/block/turret_shell_1.json | 6 ++ .../unicopia/models/block/turret_shell_2.json | 6 ++ .../unicopia/models/block/turret_shell_3.json | 6 ++ .../unicopia/models/block/turret_shell_4.json | 6 ++ .../unicopia/models/item/clam_shell.json | 6 ++ .../unicopia/models/item/scallop_shell.json | 6 ++ .../assets/unicopia/models/item/shelly.json | 6 ++ .../unicopia/models/item/turret_shell.json | 6 ++ .../unicopia/textures/item/clam_shell.png | Bin 0 -> 4721 bytes .../unicopia/textures/item/scallop_shell.png | Bin 0 -> 5107 bytes .../assets/unicopia/textures/item/shelly.png | Bin 0 -> 4934 bytes .../unicopia/textures/item/turret_shell.png | Bin 0 -> 5226 bytes .../unicopia/advancements/recipes/shelly.json | 30 ++++++ .../loot_tables/blocks/clam_shell.json | 96 ++++++++++++++++++ .../loot_tables/blocks/scallop_shell.json | 96 ++++++++++++++++++ .../loot_tables/blocks/turret_shell.json | 96 ++++++++++++++++++ .../data/unicopia/recipes/pearl_necklace.json | 15 +++ .../data/unicopia/recipes/shelly.json | 14 +++ .../tags/items/food_types/shells.json | 11 ++ .../tags/items/food_types/shelly.json | 6 ++ .../unicopia/tags/items/groups/sea_pony.json | 2 + .../loot_tables/archaeology/desert_well.json | 17 ++++ .../loot_tables/chests/buried_treasure.json | 25 +++++ .../loot_tables/chests/shipwreck_supply.json | 20 ++++ .../chests/shipwreck_treasure.json | 25 +++++ .../chests/underwater_ruin_big.json | 30 ++++++ .../chests/underwater_ruin_small.json | 20 ++++ 49 files changed, 860 insertions(+), 1 deletion(-) create mode 100644 assets/models/block_shell.bbmodel create mode 100644 assets/models/block_shell_2.bbmodel create mode 100644 assets/models/clam_shell_3.bbmodel create mode 100644 assets/models/clam_shell_4.bbmodel create mode 100644 src/main/java/com/minelittlepony/unicopia/block/ShellsBlock.java create mode 100644 src/main/resources/assets/unicopia/blockstates/clam_shell.json create mode 100644 src/main/resources/assets/unicopia/blockstates/scallop_shell.json create mode 100644 src/main/resources/assets/unicopia/blockstates/turret_shell.json create mode 100644 src/main/resources/assets/unicopia/models/block/clam_shell_1.json create mode 100644 src/main/resources/assets/unicopia/models/block/clam_shell_2.json create mode 100644 src/main/resources/assets/unicopia/models/block/clam_shell_3.json create mode 100644 src/main/resources/assets/unicopia/models/block/clam_shell_4.json create mode 100644 src/main/resources/assets/unicopia/models/block/scallop_shell_1.json create mode 100644 src/main/resources/assets/unicopia/models/block/scallop_shell_2.json create mode 100644 src/main/resources/assets/unicopia/models/block/scallop_shell_3.json create mode 100644 src/main/resources/assets/unicopia/models/block/scallop_shell_4.json create mode 100644 src/main/resources/assets/unicopia/models/block/turret_shell_1.json create mode 100644 src/main/resources/assets/unicopia/models/block/turret_shell_2.json create mode 100644 src/main/resources/assets/unicopia/models/block/turret_shell_3.json create mode 100644 src/main/resources/assets/unicopia/models/block/turret_shell_4.json create mode 100644 src/main/resources/assets/unicopia/models/item/clam_shell.json create mode 100644 src/main/resources/assets/unicopia/models/item/scallop_shell.json create mode 100644 src/main/resources/assets/unicopia/models/item/shelly.json create mode 100644 src/main/resources/assets/unicopia/models/item/turret_shell.json create mode 100644 src/main/resources/assets/unicopia/textures/item/clam_shell.png create mode 100644 src/main/resources/assets/unicopia/textures/item/scallop_shell.png create mode 100644 src/main/resources/assets/unicopia/textures/item/shelly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/turret_shell.png create mode 100644 src/main/resources/data/unicopia/advancements/recipes/shelly.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/clam_shell.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/scallop_shell.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/turret_shell.json create mode 100644 src/main/resources/data/unicopia/recipes/pearl_necklace.json create mode 100644 src/main/resources/data/unicopia/recipes/shelly.json create mode 100644 src/main/resources/data/unicopia/tags/items/food_types/shells.json create mode 100644 src/main/resources/data/unicopia/tags/items/food_types/shelly.json create mode 100644 src/main/resources/data/unicopiamc/loot_tables/chests/buried_treasure.json create mode 100644 src/main/resources/data/unicopiamc/loot_tables/chests/shipwreck_supply.json create mode 100644 src/main/resources/data/unicopiamc/loot_tables/chests/shipwreck_treasure.json create mode 100644 src/main/resources/data/unicopiamc/loot_tables/chests/underwater_ruin_big.json create mode 100644 src/main/resources/data/unicopiamc/loot_tables/chests/underwater_ruin_small.json diff --git a/assets/models/block_shell.bbmodel b/assets/models/block_shell.bbmodel new file mode 100644 index 00000000..c174edb6 --- /dev/null +++ b/assets/models/block_shell.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"block_shell","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2.4000000000000004,0,0],"to":[10.399999999999999,0,8],"autouv":0,"color":9,"rotation":[0,45,0],"origin":[12,0,4],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]} \ No newline at end of file diff --git a/assets/models/block_shell_2.bbmodel b/assets/models/block_shell_2.bbmodel new file mode 100644 index 00000000..aed1740d --- /dev/null +++ b/assets/models/block_shell_2.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_2","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6.4,0,0],"to":[14.399999999999999,0,8],"autouv":0,"color":9,"rotation":[0,45,0],"origin":[12,0,4],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1.2117749006091447,0,6.788225099390861],"to":[9.211774900609145,0,14.78822509939086],"autouv":0,"color":9,"rotation":[0,-22.5,0],"origin":[5.211774900609143,0,10.788225099390859],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[0,0,0,0],"rotation":270,"texture":null}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]} \ No newline at end of file diff --git a/assets/models/clam_shell_3.bbmodel b/assets/models/clam_shell_3.bbmodel new file mode 100644 index 00000000..8d203b86 --- /dev/null +++ b/assets/models/clam_shell_3.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_3","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6.4,0,-1],"to":[14.399999999999999,0,7],"autouv":0,"color":9,"rotation":[0,45,0],"origin":[12,0,3],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0.3640158355865708,0,4.022858234660681],"to":[8.36401583558657,0,12.022858234660681],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[4.364015835586571,0,8.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":180,"texture":0},"down":{"uv":[0,0,0,0],"rotation":180,"texture":null}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.755052095676865,0,8.084325693581398],"to":[15.755052095676865,0,16.0843256935814],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[11.755052095676865,0,12.0843256935814],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[0,0,0,0],"rotation":270,"texture":null}},"type":"cube","uuid":"a13cf19e-6339-91b6-4d9b-0d3500abf734"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2","a13cf19e-6339-91b6-4d9b-0d3500abf734"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]} \ No newline at end of file diff --git a/assets/models/clam_shell_4.bbmodel b/assets/models/clam_shell_4.bbmodel new file mode 100644 index 00000000..952aa7fc --- /dev/null +++ b/assets/models/clam_shell_4.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_4","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.4,0,-1],"to":[15.399999999999999,0,7],"autouv":0,"color":9,"rotation":[0,45,0],"origin":[13,0,3],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0.3640158355865708,0,7.022858234660681],"to":[8.36401583558657,0,15.022858234660681],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[4.364015835586571,0,11.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":180,"texture":0},"down":{"uv":[0,0,0,0],"rotation":180,"texture":null}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.755052095676865,0,8.084325693581398],"to":[15.755052095676865,0,16.0843256935814],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[11.755052095676865,0,12.0843256935814],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[0,0,0,0],"rotation":270,"texture":null}},"type":"cube","uuid":"a13cf19e-6339-91b6-4d9b-0d3500abf734"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1.3640158355865708,0,0.022858234660681376],"to":[9.36401583558657,0,8.022858234660681],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[5.364015835586571,0,4.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":270,"texture":0},"down":{"uv":[0,0,0,0],"rotation":90,"texture":null}},"type":"cube","uuid":"60843fa4-6abd-3b89-20f7-67fc05e29ba3"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2","60843fa4-6abd-3b89-20f7-67fc05e29ba3","a13cf19e-6339-91b6-4d9b-0d3500abf734"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/block/ShellsBlock.java b/src/main/java/com/minelittlepony/unicopia/block/ShellsBlock.java new file mode 100644 index 00000000..ec5053c8 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/ShellsBlock.java @@ -0,0 +1,74 @@ +package com.minelittlepony.unicopia.block; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.block.Waterloggable; +import net.minecraft.entity.ai.pathing.NavigationType; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.registry.tag.FluidTags; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.IntProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.WorldAccess; + +public class ShellsBlock extends Block implements Waterloggable { + public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; + public static final IntProperty COUNT = IntProperty.of("count", 1, 4); + + private static final VoxelShape SHAPE = Block.createCuboidShape(0, 0, 0, 16, 1, 16); + + public ShellsBlock(Settings settings) { + super(settings); + } + + @Override + @Deprecated + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return SHAPE; + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); + builder.add(COUNT, WATERLOGGED); + } + + @Override + @Nullable + public BlockState getPlacementState(ItemPlacementContext ctx) { + return getDefaultState().with(WATERLOGGED, ctx.getWorld().getFluidState(ctx.getBlockPos()).getFluid() == Fluids.WATER); + } + + @Deprecated + @Override + public FluidState getFluidState(BlockState state) { + if (state.get(WATERLOGGED).booleanValue()) { + return Fluids.WATER.getStill(false); + } + return super.getFluidState(state); + } + + @Deprecated + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (state.get(WATERLOGGED).booleanValue()) { + world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); + } + + @Override + public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { + return (type == NavigationType.WATER) == world.getFluidState(pos).isIn(FluidTags.WATER); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 75f82d8e..889676c5 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -185,6 +185,10 @@ public interface UBlocks { Block CLOTH_BED = register("cloth_bed", new FancyBedBlock("cloth", Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOD))); Block CLOUD_BED = register("cloud_bed", new CloudBedBlock("cloud", CLOUD.getDefaultState(), Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); + Block CLAM_SHELL = register("clam_shell", new ShellsBlock(Settings.create().mapColor(MapColor.DULL_PINK).breakInstantly().nonOpaque())); + Block SCALLOP_SHELL = register("scallop_shell", new ShellsBlock(Settings.create().mapColor(MapColor.DULL_PINK).breakInstantly().nonOpaque())); + Block TURRET_SHELL = register("turret_shell", new ShellsBlock(Settings.create().mapColor(MapColor.DULL_PINK).breakInstantly().nonOpaque())); + private static T register(String name, T item) { return register(Unicopia.id(name), item); } @@ -221,7 +225,7 @@ public interface UBlocks { StrippableBlockRegistry.register(PALM_LOG, STRIPPED_PALM_LOG); StrippableBlockRegistry.register(ZAP_WOOD, STRIPPED_ZAP_WOOD); StrippableBlockRegistry.register(PALM_WOOD, STRIPPED_PALM_WOOD); - Collections.addAll(TRANSLUCENT_BLOCKS, WEATHER_VANE, CHITIN_SPIKES, PLUNDER_VINE, PLUNDER_VINE_BUD); + Collections.addAll(TRANSLUCENT_BLOCKS, WEATHER_VANE, CHITIN_SPIKES, PLUNDER_VINE, PLUNDER_VINE_BUD, CLAM_SHELL, SCALLOP_SHELL, TURRET_SHELL); TintedBlock.REGISTRY.add(PALM_LEAVES); FlammableBlockRegistry.getDefaultInstance().add(GREEN_APPLE_LEAVES, 30, 60); diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index dd36c523..97c99e4e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -209,6 +209,11 @@ public interface UItems { GlassesItem SUNGLASSES = register("sunglasses", new GlassesItem(new FabricItemSettings().maxCount(1)), ItemGroups.COMBAT); GlassesItem BROKEN_SUNGLASSES = register("broken_sunglasses", new GlassesItem(new FabricItemSettings().maxCount(1)), ItemGroups.COMBAT); + Item CLAM_SHELL = register("clam_shell", new Item(new Item.Settings()), ItemGroups.INGREDIENTS); + Item SCALLOP_SHELL = register("scallop_shell", new Item(new Item.Settings()), ItemGroups.INGREDIENTS); + Item TURRET_SHELL = register("turret_shell", new Item(new Item.Settings()), ItemGroups.INGREDIENTS); + Item SHELLY = register("shelly", new Item(new Item.Settings()), ItemGroups.INGREDIENTS); + Item CARAPACE = register("carapace", new Item(new Item.Settings()), ItemGroups.INGREDIENTS); Item CLOTH_BED = register("cloth_bed", new FancyBedItem(UBlocks.CLOTH_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); Item CLOUD_BED = register("cloud_bed", new CloudBedItem(UBlocks.CLOUD_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java index f8b64265..5e5bf92f 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java @@ -153,6 +153,14 @@ public interface Toxics { .food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE_FILLING) ); + Toxic SHELLS = register("shells", new Toxic.Builder(Ailment.INNERT) + .food(Race.SEAPONY, UFoodComponents.SHELL) + ); + + Toxic SHELLY = register("shelly", new Toxic.Builder(Ailment.INNERT) + .food(Race.SEAPONY, UFoodComponents.SHELLY) + ); + static void bootstrap() {} static Toxic register(String name, Toxic.Builder builder) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java index d690af7c..987d0a46 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java @@ -51,6 +51,9 @@ public interface UFoodComponents { FoodComponent CANDY = builder(7, 0.9F).alwaysEdible().build(); FoodComponent SALT_CUBE = builder(0, 2.9F).alwaysEdible().build(); + FoodComponent SHELL = builder(3, 5).build(); + FoodComponent SHELLY = builder(6, 7).build(); + static FoodComponent.Builder builder(int hunger, float saturation) { return new FoodComponent.Builder() .hunger(hunger) diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/UWorldGen.java b/src/main/java/com/minelittlepony/unicopia/server/world/UWorldGen.java index cd1ae14f..097fdc9f 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/UWorldGen.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/UWorldGen.java @@ -3,19 +3,36 @@ package com.minelittlepony.unicopia.server.world; import java.util.List; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.block.ShellsBlock; +import com.minelittlepony.unicopia.block.UBlocks; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.tag.BiomeTags; +import net.minecraft.util.collection.DataPool; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3i; +import net.minecraft.util.math.intprovider.UniformIntProvider; +import net.minecraft.world.biome.BiomeKeys; import net.minecraft.world.gen.GenerationStep; +import net.minecraft.world.gen.blockpredicate.BlockPredicate; +import net.minecraft.world.gen.feature.ConfiguredFeatures; +import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.PlacedFeature; import net.minecraft.world.gen.feature.PlacedFeatures; +import net.minecraft.world.gen.feature.RandomPatchFeature; +import net.minecraft.world.gen.feature.RandomPatchFeatureConfig; +import net.minecraft.world.gen.feature.SimpleBlockFeatureConfig; import net.minecraft.world.gen.placementmodifier.BiomePlacementModifier; import net.minecraft.world.gen.placementmodifier.RarityFilterPlacementModifier; import net.minecraft.world.gen.placementmodifier.SquarePlacementModifier; +import net.minecraft.world.gen.stateprovider.RandomizedIntBlockStateProvider; +import net.minecraft.world.gen.stateprovider.WeightedBlockStateProvider; public interface UWorldGen { PineapplePlantFeature PINEAPPLE_PLANT_FEATURE = Registry.register(Registries.FEATURE, Unicopia.id("pineapple_plant"), new PineapplePlantFeature()); @@ -26,8 +43,37 @@ public interface UWorldGen { BiomePlacementModifier.of() )); + RandomPatchFeature SHELLS_FEATURE = Registry.register(Registries.FEATURE, Unicopia.id("shells"), new RandomPatchFeature(RandomPatchFeatureConfig.CODEC)); + RegistryKey SHELLS_PLACED_FEATURE = FeatureRegistry.registerPlaceableFeature(Unicopia.id("shells"), SHELLS_FEATURE, ConfiguredFeatures.createRandomPatchFeatureConfig( + 25, + PlacedFeatures.createEntry(Feature.SIMPLE_BLOCK, new SimpleBlockFeatureConfig( + new RandomizedIntBlockStateProvider( + new WeightedBlockStateProvider(DataPool.builder() + .add(UBlocks.CLAM_SHELL.getDefaultState(), 1) + .add(UBlocks.SCALLOP_SHELL.getDefaultState(), 2) + .add(UBlocks.TURRET_SHELL.getDefaultState(), 2) + ), + ShellsBlock.COUNT, + UniformIntProvider.create(1, 4) + ) + ), BlockPredicate.allOf( + BlockPredicate.matchingBlocks(Blocks.WATER), + BlockPredicate.hasSturdyFace(new Vec3i(0, -1, 0), Direction.UP) + ))), List.of( + RarityFilterPlacementModifier.of(1), + SquarePlacementModifier.of(), + PlacedFeatures.OCEAN_FLOOR_WG_HEIGHTMAP, + BiomePlacementModifier.of() + )); + static void bootstrap() { BiomeModifications.addFeature(BiomeSelectors.tag(BiomeTags.IS_JUNGLE), GenerationStep.Feature.VEGETAL_DECORATION, PINEAPPLE_PLANT_PLACED_FEATURE); + BiomeModifications.addFeature( + BiomeSelectors.tag(BiomeTags.IS_OCEAN) + .or(BiomeSelectors.tag(BiomeTags.IS_DEEP_OCEAN) + .or(BiomeSelectors.tag(BiomeTags.IS_RIVER)) + .or(BiomeSelectors.includeByKey(BiomeKeys.STONY_SHORE)) + ), GenerationStep.Feature.VEGETAL_DECORATION, SHELLS_PLACED_FEATURE); UTreeGen.bootstrap(); } } diff --git a/src/main/resources/assets/unicopia/blockstates/clam_shell.json b/src/main/resources/assets/unicopia/blockstates/clam_shell.json new file mode 100644 index 00000000..9efb55d9 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/clam_shell.json @@ -0,0 +1,8 @@ +{ + "variants": { + "count=1": { "model": "unicopia:block/clam_shell_1" }, + "count=2": { "model": "unicopia:block/clam_shell_2" }, + "count=3": { "model": "unicopia:block/clam_shell_3" }, + "count=4": { "model": "unicopia:block/clam_shell_4" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/scallop_shell.json b/src/main/resources/assets/unicopia/blockstates/scallop_shell.json new file mode 100644 index 00000000..92a7659f --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/scallop_shell.json @@ -0,0 +1,8 @@ +{ + "variants": { + "count=1": { "model": "unicopia:block/scallop_shell_1" }, + "count=2": { "model": "unicopia:block/scallop_shell_2" }, + "count=3": { "model": "unicopia:block/scallop_shell_3" }, + "count=4": { "model": "unicopia:block/scallop_shell_4" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/turret_shell.json b/src/main/resources/assets/unicopia/blockstates/turret_shell.json new file mode 100644 index 00000000..e7388398 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/turret_shell.json @@ -0,0 +1,8 @@ +{ + "variants": { + "count=1": { "model": "unicopia:block/turret_shell_1" }, + "count=2": { "model": "unicopia:block/turret_shell_2" }, + "count=3": { "model": "unicopia:block/turret_shell_3" }, + "count=4": { "model": "unicopia:block/turret_shell_4" } + } +} diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index e19929cf..6da46c1e 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -145,6 +145,10 @@ "item.unicopia.pearl_necklace": "Pearl Necklace", "item.unicopia.pearl_necklace.lore": "Gives underwater abilities to the wearer", + "item.unicopia.clam_shell": "Clam Shell", + "item.unicopia.scallop_shell": "Scallop Shell", + "item.unicopia.turret_shell": "Turret Shell", + "item.unicopia.shelly": "Shelly", "item.unicopia.horse_shoe.accuracy": "Accuracy: %d%%", "item.unicopia.horse_shoe.speed": "Speed: %d", diff --git a/src/main/resources/assets/unicopia/models/block/clam_shell_1.json b/src/main/resources/assets/unicopia/models/block/clam_shell_1.json new file mode 100644 index 00000000..d3597b41 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/clam_shell_1.json @@ -0,0 +1,16 @@ +{ + "textures": { + "shell": "unicopia:item/clam_shell", + "particle": "#shell" + }, + "elements": [ + { + "from": [2.4, 0.1, 0], + "to": [10.4, 0.1, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [12, 0, 4]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "texture": "#shell"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/clam_shell_2.json b/src/main/resources/assets/unicopia/models/block/clam_shell_2.json new file mode 100644 index 00000000..55468f94 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/clam_shell_2.json @@ -0,0 +1,24 @@ +{ + "textures": { + "shell": "unicopia:item/clam_shell", + "particle": "#shell" + }, + "elements": [ + { + "from": [6.4, 0.1, 0], + "to": [14.4, 0.1, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [12, 0, 4]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "texture": "#shell"} + } + }, + { + "from": [1.21177, 0.1, 6.78823], + "to": [9.21177, 0.1, 14.78823], + "rotation": {"angle": -22.5, "axis": "y", "origin": [5.21177, 0, 10.78823]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/clam_shell_3.json b/src/main/resources/assets/unicopia/models/block/clam_shell_3.json new file mode 100644 index 00000000..20200ef0 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/clam_shell_3.json @@ -0,0 +1,32 @@ +{ + "textures": { + "shell": "unicopia:item/clam_shell", + "particle": "#shell" + }, + "elements": [ + { + "from": [6.4, 0.1, -1], + "to": [14.4, 0.1, 7], + "rotation": {"angle": 45, "axis": "y", "origin": [12, 0, 3]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "texture": "#shell"} + } + }, + { + "from": [0.36402, 0.1, 4.02286], + "to": [8.36402, 0.1, 12.02286], + "rotation": {"angle": 22.5, "axis": "y", "origin": [4.36402, 0, 8.02286]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#shell"} + } + }, + { + "from": [7.75505, 0.1, 8.08433], + "to": [15.75505, 0.1, 16.08433], + "rotation": {"angle": 22.5, "axis": "y", "origin": [11.75505, 0, 12.08433]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/clam_shell_4.json b/src/main/resources/assets/unicopia/models/block/clam_shell_4.json new file mode 100644 index 00000000..2610cb33 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/clam_shell_4.json @@ -0,0 +1,40 @@ +{ + "textures": { + "shell": "unicopia:item/clam_shell", + "particle": "#shell" + }, + "elements": [ + { + "from": [7.4, 0.1, -1], + "to": [15.4, 0.1, 7], + "rotation": {"angle": 45, "axis": "y", "origin": [13, 0, 3]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "texture": "#shell"} + } + }, + { + "from": [0.36402, 0.1, 7.02286], + "to": [8.36402, 0.1, 15.02286], + "rotation": {"angle": 22.5, "axis": "y", "origin": [4.36402, 0, 11.02286]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#shell"} + } + }, + { + "from": [1.36402, 0.1, 0.02286], + "to": [9.36402, 0.1, 8.02286], + "rotation": {"angle": 22.5, "axis": "y", "origin": [5.36402, 0, 4.02286]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#shell"} + } + }, + { + "from": [7.75505, 0.1, 8.08433], + "to": [15.75505, 0.1, 16.08433], + "rotation": {"angle": 22.5, "axis": "y", "origin": [11.75505, 0, 12.08433]}, + "faces": { + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/scallop_shell_1.json b/src/main/resources/assets/unicopia/models/block/scallop_shell_1.json new file mode 100644 index 00000000..dc24de27 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/scallop_shell_1.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/clam_shell_1", + "textures": { + "shell": "unicopia:item/scallop_shell" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/scallop_shell_2.json b/src/main/resources/assets/unicopia/models/block/scallop_shell_2.json new file mode 100644 index 00000000..31cb6d3a --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/scallop_shell_2.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/clam_shell_2", + "textures": { + "shell": "unicopia:item/scallop_shell" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/scallop_shell_3.json b/src/main/resources/assets/unicopia/models/block/scallop_shell_3.json new file mode 100644 index 00000000..e1568583 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/scallop_shell_3.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/clam_shell_3", + "textures": { + "shell": "unicopia:item/scallop_shell" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/scallop_shell_4.json b/src/main/resources/assets/unicopia/models/block/scallop_shell_4.json new file mode 100644 index 00000000..d3b086a3 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/scallop_shell_4.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/clam_shell_4", + "textures": { + "shell": "unicopia:item/scallop_shell" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/turret_shell_1.json b/src/main/resources/assets/unicopia/models/block/turret_shell_1.json new file mode 100644 index 00000000..1357d241 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/turret_shell_1.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/clam_shell_1", + "textures": { + "shell": "unicopia:item/turret_shell" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/turret_shell_2.json b/src/main/resources/assets/unicopia/models/block/turret_shell_2.json new file mode 100644 index 00000000..3d0cdd97 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/turret_shell_2.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/clam_shell_2", + "textures": { + "shell": "unicopia:item/turret_shell" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/turret_shell_3.json b/src/main/resources/assets/unicopia/models/block/turret_shell_3.json new file mode 100644 index 00000000..90abe4d6 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/turret_shell_3.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/clam_shell_3", + "textures": { + "shell": "unicopia:item/turret_shell" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/turret_shell_4.json b/src/main/resources/assets/unicopia/models/block/turret_shell_4.json new file mode 100644 index 00000000..f25b45cc --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/turret_shell_4.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/clam_shell_4", + "textures": { + "shell": "unicopia:item/turret_shell" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/clam_shell.json b/src/main/resources/assets/unicopia/models/item/clam_shell.json new file mode 100644 index 00000000..cde6769f --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/clam_shell.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/clam_shell" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/scallop_shell.json b/src/main/resources/assets/unicopia/models/item/scallop_shell.json new file mode 100644 index 00000000..779ff3eb --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/scallop_shell.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/scallop_shell" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/shelly.json b/src/main/resources/assets/unicopia/models/item/shelly.json new file mode 100644 index 00000000..9d5976c3 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/shelly.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/shelly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/turret_shell.json b/src/main/resources/assets/unicopia/models/item/turret_shell.json new file mode 100644 index 00000000..24bf2c41 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/turret_shell.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/turret_shell" + } +} diff --git a/src/main/resources/assets/unicopia/textures/item/clam_shell.png b/src/main/resources/assets/unicopia/textures/item/clam_shell.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b2e222565dfdbd64083fe11233e520efc9cc7f GIT binary patch literal 4721 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 HORN741M%{# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/shelly.png b/src/main/resources/assets/unicopia/textures/item/shelly.png new file mode 100644 index 0000000000000000000000000000000000000000..784cbb1e3333d8ce4bf442995f948a5dfb2482d6 GIT binary patch literal 4934 zcmeHKdsGu=79V^N4G%?KrP@=&s4YGwlbIxwWR{>vK%xXGP>V;bPG%-#ggi(F2;!^g zilV2&DQl~X6;afRi?-BC1;huU?yi8;RqM94iq%C|?OEL7V|DkN3D2`VXOHL9{|M*H zcjtch`+fKR?)`3^DKb-JoUm$K5Z3 zZzfg5uaoXtVEyaKTdk8TK#y>w}fSrR`sCo7-?EHtQY#+OiQ5{&3#HZ3`PqCQrGTvEsYaXRp+R zHs4+Gp!wpV+cSJ08*TskIap?x?yKl$wi8=E&ydUJ8%7XB{Pea=$Po zvp2D$A;kPyOXJ)LRb`(B%@4|d$Fy%nNZV(B%Gp%4pz`zE`X_#Cbt~Cz_f&I=PQY7b z5$p1%%?&*rUA$n&7{964wq*abrFzxI6zNxUm)=UAHFP|4WyA|fea(@7emMHQ1VtcU zuWdRTJo4($@#?cr!m~;mhySqJxAM`}`UHt3+<5577e56l4hN*9996L+s=xJFztjJl z;>G9ZC!V|Wey8&3-Wdws?@?t=ow_sQDYWO)idz9r=djJ=LUZd**W_NyebyOURX_3h zm#*s{a6QxD5H zMi0NMHYrTbNY={5EO)Vq%j1&h~c& zR20+cbf^MHaU1~_h&#v5Qy#?bo+LncF$}Dmc5zOgbJ%49CS`VH@_HBs>#}bDY)+G@ z2j1@PVgc}hdMGD~$rY&0hW6dz=A*IzNS8yuxWk>4<7CkU*6ql2(QH%}Yv(8Rg<$BO z{mx8Rx)=^aqii~B1Ey|pD%S5v;l}ms5GY9HY))|(AiJL>&sloO>gSuVB8Jn~5wN`n zx1V))?4mKSGMPw&gU%G(GaB@;a6ZX6XpSL85yzDbtHEhRsi8E8%0epHZjwy;`+#kB;;A1EXp z#SjRkrf{>Fu`p`fOHvQI+hO6eDHj`&3U~xuf$|i8p=6OJgkt)24F!a@jh%;IXfoTweMF|8WW5^4g`SS%FA(gdzinEN~ZD}*TgHun!P z3>Dg9cT&U9|4F;opidtK)OdBEKZACU_VoKM&H%};^3zprukr|)Y~YZW;&*_q0lHp_ zftNBKsICFJUW$R2G9IX|UyUwl?;9g)2mk10gZDvs?$T)RF6nEYH^%^d0&RwhH)uaP z3N*u=F$>)gi zJFg{M|7hM{ppLRW`CzjD)`o_^mnQCh^W5GHEQ4=-j0W%CRCFO?@Y=wJlOty54Ik1_ z8fvaMV+fkw(zeo)j z$Y;r-pGF6_-S_W!;lBvYT{tFU^Ua4L53b+ad(86I#dGk1yEi}19x*X)bqH70Vm(@T z!D4lEVoEIH*yp3_tatu#aqOAc!sdIifm@0eH?`hROYm*{zN)rvti!E5aAEzKHi}APhKlDL+ VrSie~{h&M`V^o}>a`w`^{{na&&}skx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/turret_shell.png b/src/main/resources/assets/unicopia/textures/item/turret_shell.png new file mode 100644 index 0000000000000000000000000000000000000000..a68cdb80090be954c73520ae5d6967ab559abaed GIT binary patch literal 5226 zcmeHLYj6|S6<$HG!NwB<4iAHejhrxc%}V=}R$B>TEI(9RU~DDW6b!4~D|>^bm8G>M zn*>sd9YZrJM_ohch9PmV zZ-R}4asuq%hfR7pvR5;d)z?VvZ61bb8ohnC!eo11p?xc*jEsCoMh5B+$R4R2AV|3B#dWrvBl!unYu_vQ>-gxO*R$fb z*;RALw4IB|+!p_Q?Q=&D*7 zjltXpZ-3NQ-PLq3G!><{=k2Yz^3vAxo@u|04?cL7xW77mrS9%C4X=X}xdn;M-&D?d z(G?;#UcJ;+T6=26v9GfA6-|@2IuE8>4@i@nx>hCcn7;jJ=h0WEB{ke%cWrf>+>~pG zwNh>mAL#s6;VuG_StdC!T;`9cmq zCbt2dm7es3i%-s4^kzcrq;qrb-_KsyVmH(-cmfYhe>*B}&$Z~~zrM70|LV^ROA1nS zcMq|jw6XCQM$C_EdoZJ_>GY`haMZ55Yg$e})-l5&EBn40gYS!5upmT($NzLem$h;9 z*~W#b&*Y|z|5X=Nv(<{f5IcHDb#Te8D|dAteYWE>^WoMf@wuC?SH88hD|GV4rH%Kx zmmz<@9$50_J9qv7bLvUSRiqR-^Eg5F8hBB514G#BR|AGvXNLW}ummWm8E(c|G z*r-P}6=jJ{Uj*|gLk<9xHqZtf%M43Zq<%&WY7K}UuE3tv0|B3G`Z7iFb4Ft*6f%S; zgB&O|5*CZah?7Q=#GnQitoA8<81n^_Rfq_N9R!7d5bjD0+ET5!z7;A3rIOdLt%76^(o`f*KUsrpQ)e`H1{wmF z_u&rG?)6<$hFVT1XP1Ra)jWsYrdRjpL|KqTP7~cGi$^qj7>rH#Kp+S+QN`5GPHjdF3kRKn#PVvMLI773#x~=SV@gf3-Fgsi;Cw5qXL{mP=YG zp{Q0A94|y%2=Y}x)a-;`mgn;2d&e+NA%dz26#0O_TWN5~aSPwj?6Q?x*(4z?v!2Gl4(!Z3os2+~EEITGgx zQx9RrNAIFQ!$c&_W{e_89=b>XjAw8fBXJRWXktx_NDVgnhr3AA9L4^0F0u?DSe6kn z5grW~?I8q=rQIG(G+6-7m`u2tid11=j{HCu;r9^6#8Ko==c2{TkQ4{udSH&ds(X8D*LSr2{^*-GW+hB?ueezE z=cV>DH&Wg$yLs&w7ndEJkg#g9JpWiiHM=&a{i*41S&R~uJg#7YE9d&X@o(7T4jfOn zCT489Eq1nFE8qRj=)aW|zqVtF`Ra%gf7#_P@GGNseXy&(?PluE_wuU$7!|)NYvj$F zd!_vqA>te`ENeMawS4T+TW3@$qjKul`HNr`x=@`O2-!(^?+1w(nbX oLR`O+&o5q>xllM%yS#NAHf;OzyBof)hvXxU%-Qx`vlg%TFF4-t3;+NC literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/advancements/recipes/shelly.json b/src/main/resources/data/unicopia/advancements/recipes/shelly.json new file mode 100644 index 00000000..08119d10 --- /dev/null +++ b/src/main/resources/data/unicopia/advancements/recipes/shelly.json @@ -0,0 +1,30 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "unicopia:shelly" + ] + }, + "criteria": { + "has_ingredients": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { "items": [ "unicopia:clam_shell", "unicopia:rock_candy" ] } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "unicopia:shelly" + } + } + }, + "requirements": [ + [ + "has_ingredients", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/clam_shell.json b/src/main/resources/data/unicopia/loot_tables/blocks/clam_shell.json new file mode 100644 index 00000000..f21c580e --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/clam_shell.json @@ -0,0 +1,96 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:clam_shell", + "conditions": [ + { + "block": "unicopia:clam_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "1" + } + } + ], + "functions": [ + { + "add": false, + "count": 1, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:clam_shell", + "conditions": [ + { + "block": "unicopia:clam_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "2" + } + } + ], + "functions": [ + { + "add": false, + "count": 2, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:clam_shell", + "conditions": [ + { + "block": "unicopia:clam_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "3" + } + } + ], + "functions": [ + { + "add": false, + "count": 3, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:clam_shell", + "conditions": [ + { + "block": "unicopia:clam_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "4" + } + } + ], + "functions": [ + { + "add": false, + "count": 4, + "function": "minecraft:set_count" + } + ] + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/scallop_shell.json b/src/main/resources/data/unicopia/loot_tables/blocks/scallop_shell.json new file mode 100644 index 00000000..c1e002b1 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/scallop_shell.json @@ -0,0 +1,96 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:scallop_shell", + "conditions": [ + { + "block": "unicopia:scallop_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "1" + } + } + ], + "functions": [ + { + "add": false, + "count": 1, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:scallop_shell", + "conditions": [ + { + "block": "unicopia:scallop_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "2" + } + } + ], + "functions": [ + { + "add": false, + "count": 2, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:scallop_shell", + "conditions": [ + { + "block": "unicopia:scallop_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "3" + } + } + ], + "functions": [ + { + "add": false, + "count": 3, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:scallop_shell", + "conditions": [ + { + "block": "unicopia:scallop_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "4" + } + } + ], + "functions": [ + { + "add": false, + "count": 4, + "function": "minecraft:set_count" + } + ] + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/turret_shell.json b/src/main/resources/data/unicopia/loot_tables/blocks/turret_shell.json new file mode 100644 index 00000000..b300a2d4 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/turret_shell.json @@ -0,0 +1,96 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:turret_shell", + "conditions": [ + { + "block": "unicopia:turret_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "1" + } + } + ], + "functions": [ + { + "add": false, + "count": 1, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:turret_shell", + "conditions": [ + { + "block": "unicopia:turret_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "2" + } + } + ], + "functions": [ + { + "add": false, + "count": 2, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:turret_shell", + "conditions": [ + { + "block": "unicopia:turret_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "3" + } + } + ], + "functions": [ + { + "add": false, + "count": 3, + "function": "minecraft:set_count" + } + ] + }, + { + "type": "minecraft:item", + "name": "unicopia:turret_shell", + "conditions": [ + { + "block": "unicopia:turret_shell", + "condition": "minecraft:block_state_property", + "properties": { + "count": "4" + } + } + ], + "functions": [ + { + "add": false, + "count": 4, + "function": "minecraft:set_count" + } + ] + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/pearl_necklace.json b/src/main/resources/data/unicopia/recipes/pearl_necklace.json new file mode 100644 index 00000000..4b9a4db6 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/pearl_necklace.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + "# #", + "~#~" + ], + "key": { + "#": { "tag": "unicopia:food_types/shells" }, + "~": { "item": "minecraft:string" } + }, + "result": { + "item": "unicopia:pearl_necklace" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/shelly.json b/src/main/resources/data/unicopia/recipes/shelly.json new file mode 100644 index 00000000..54c4a93d --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/shelly.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "o o", + " C " + ], + "key": { + "C": { "item": "unicopia:clam_shell" }, + "o": { "item": "unicopia:rock_candy" } + }, + "result": { + "item": "unicopia:shelly" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/tags/items/food_types/shells.json b/src/main/resources/data/unicopia/tags/items/food_types/shells.json new file mode 100644 index 00000000..d62b7052 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/food_types/shells.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "minecraft:nautilus_shell", + "unicopia:clam_shell", + "unicopia:scallop_shell", + "unicopia:turret_shell", + "minecraft:seagrass", + "minecraft:sea_pickle" + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/food_types/shelly.json b/src/main/resources/data/unicopia/tags/items/food_types/shelly.json new file mode 100644 index 00000000..f8790589 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/food_types/shelly.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "unicopia:shelly" + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/groups/sea_pony.json b/src/main/resources/data/unicopia/tags/items/groups/sea_pony.json index 523b4a0a..a9259060 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/sea_pony.json +++ b/src/main/resources/data/unicopia/tags/items/groups/sea_pony.json @@ -3,6 +3,8 @@ "values": [ "unicopia:pearl_necklace", "minecraft:nautilus_shell", + "#unicopia:food_types/shells", + "#unicopia:food_types/shelly", "#unicopia:food_types/raw_sea_vegitable", "#unicopia:food_types/cooked_sea_vegitable" ] diff --git a/src/main/resources/data/unicopiamc/loot_tables/archaeology/desert_well.json b/src/main/resources/data/unicopiamc/loot_tables/archaeology/desert_well.json index 25d4fc53..c6c149e1 100644 --- a/src/main/resources/data/unicopiamc/loot_tables/archaeology/desert_well.json +++ b/src/main/resources/data/unicopiamc/loot_tables/archaeology/desert_well.json @@ -28,6 +28,23 @@ "type": "minecraft:item", "name": "unicopia:pebbles", "weight": 1 + }, + { + "type": "minecraft:item", + "name": "unicopia:shelly", + "weight": 1 + }, + { + "type": "minecraft:tag", + "name": "unicopia:food_types/shells", + "expand": true, + "weight": 2 + }, + { + "type": "minecraft:tag", + "name": "unicopia:food_types/pearl_necklace", + "expand": true, + "weight": 1 } ], "rolls": 1.0 diff --git a/src/main/resources/data/unicopiamc/loot_tables/chests/buried_treasure.json b/src/main/resources/data/unicopiamc/loot_tables/chests/buried_treasure.json new file mode 100644 index 00000000..d94e9dc6 --- /dev/null +++ b/src/main/resources/data/unicopiamc/loot_tables/chests/buried_treasure.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "rolls": { + "min": 1.0, + "max": 4.0, + "type": "minecraft:uniform" + }, + "entries": [ + { + "type": "minecraft:item", + "weight": 1, + "name": "unicopia:pearl_necklace" + }, + { + "type": "minecraft:tag", + "weight": 3, + "expand": true, + "name": "unicopia:food_types/shells" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopiamc/loot_tables/chests/shipwreck_supply.json b/src/main/resources/data/unicopiamc/loot_tables/chests/shipwreck_supply.json new file mode 100644 index 00000000..4181ec0e --- /dev/null +++ b/src/main/resources/data/unicopiamc/loot_tables/chests/shipwreck_supply.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "rolls": { + "min": 1.0, + "max": 6.0, + "type": "minecraft:uniform" + }, + "entries": [ + { + "type": "minecraft:tag", + "weight": 3, + "expand": true, + "name": "unicopia:food_types/shells" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopiamc/loot_tables/chests/shipwreck_treasure.json b/src/main/resources/data/unicopiamc/loot_tables/chests/shipwreck_treasure.json new file mode 100644 index 00000000..d94e9dc6 --- /dev/null +++ b/src/main/resources/data/unicopiamc/loot_tables/chests/shipwreck_treasure.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "rolls": { + "min": 1.0, + "max": 4.0, + "type": "minecraft:uniform" + }, + "entries": [ + { + "type": "minecraft:item", + "weight": 1, + "name": "unicopia:pearl_necklace" + }, + { + "type": "minecraft:tag", + "weight": 3, + "expand": true, + "name": "unicopia:food_types/shells" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopiamc/loot_tables/chests/underwater_ruin_big.json b/src/main/resources/data/unicopiamc/loot_tables/chests/underwater_ruin_big.json new file mode 100644 index 00000000..a4eea670 --- /dev/null +++ b/src/main/resources/data/unicopiamc/loot_tables/chests/underwater_ruin_big.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "rolls": { + "min": 1.0, + "max": 2.0, + "type": "minecraft:uniform" + }, + "entries": [ + { + "type": "minecraft:item", + "weight": 1, + "name": "unicopia:pearl_necklace" + }, + { + "type": "minecraft:item", + "weight": 4, + "name": "unicopia:shelly" + }, + { + "type": "minecraft:tag", + "weight": 8, + "expand": true, + "name": "unicopia:food_types/shells" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopiamc/loot_tables/chests/underwater_ruin_small.json b/src/main/resources/data/unicopiamc/loot_tables/chests/underwater_ruin_small.json new file mode 100644 index 00000000..31d47b83 --- /dev/null +++ b/src/main/resources/data/unicopiamc/loot_tables/chests/underwater_ruin_small.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "rolls": { + "min": 1.0, + "max": 4.0, + "type": "minecraft:uniform" + }, + "entries": [ + { + "type": "minecraft:tag", + "weight": 1, + "expand": true, + "name": "unicopia:food_types/shells" + } + ] + } + ] +} \ No newline at end of file From b0ebf65a5eb0f50eeebc3de3fd6894daeeff8367 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 18 Nov 2023 14:20:30 +0000 Subject: [PATCH 57/90] Added translations for the block versions of the shells --- src/main/resources/assets/unicopia/lang/en_us.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 6da46c1e..e66dbb7e 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -246,6 +246,10 @@ "block.unicopia.mango_sapling": "Mango Sapling", "block.unicopia.pineapple": "Pineapple Plant", + "block.unicopia.clam_shell": "Clam Shell", + "block.unicopia.scallop_shell": "Scallop Shell", + "block.unicopia.turret_shell": "Turret Shell", + "block.unicopia.green_apple_leaves": "Granny Smith Leaves", "block.unicopia.green_apple_sapling": "Granny Smith Sapling", "block.unicopia.green_apple_sprout": "Granny Smith Sprout", From b8e88a16adc2bee4ba341a8adf09b7990be44b24 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 18 Nov 2023 14:43:01 +0000 Subject: [PATCH 58/90] Updated shell block models to look more natural --- assets/models/clam_shell_3.bbmodel | 2 +- assets/models/clam_shell_4.bbmodel | 2 +- .../unicopia/models/block/clam_shell_1.json | 13 +++--- .../unicopia/models/block/clam_shell_2.json | 22 +++++----- .../unicopia/models/block/clam_shell_3.json | 31 ++++++------- .../unicopia/models/block/clam_shell_4.json | 44 ++++++++++--------- 6 files changed, 61 insertions(+), 53 deletions(-) diff --git a/assets/models/clam_shell_3.bbmodel b/assets/models/clam_shell_3.bbmodel index 8d203b86..a7dee723 100644 --- a/assets/models/clam_shell_3.bbmodel +++ b/assets/models/clam_shell_3.bbmodel @@ -1 +1 @@ -{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_3","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6.4,0,-1],"to":[14.399999999999999,0,7],"autouv":0,"color":9,"rotation":[0,45,0],"origin":[12,0,3],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0.3640158355865708,0,4.022858234660681],"to":[8.36401583558657,0,12.022858234660681],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[4.364015835586571,0,8.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":180,"texture":0},"down":{"uv":[0,0,0,0],"rotation":180,"texture":null}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.755052095676865,0,8.084325693581398],"to":[15.755052095676865,0,16.0843256935814],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[11.755052095676865,0,12.0843256935814],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[0,0,0,0],"rotation":270,"texture":null}},"type":"cube","uuid":"a13cf19e-6339-91b6-4d9b-0d3500abf734"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2","a13cf19e-6339-91b6-4d9b-0d3500abf734"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]} \ No newline at end of file +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_3","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[6.100000000000001,0.4,0.6000000000000014],"to":[14.100000000000005,0.4,8.600000000000001],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[10.100000000000005,0.4,3],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":270,"texture":0},"down":{"uv":[0,0,0,0],"rotation":90,"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0.3640158355865708,0,4.022858234660681],"to":[8.36401583558657,0,12.022858234660681],"autouv":0,"color":9,"rotation":[0,0,22.5],"origin":[4.364015835586571,0,8.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":180,"texture":0},"down":{"uv":[0,0,0,0],"rotation":180,"texture":null}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.755052095676865,0,8.084325693581398],"to":[15.755052095676865,0,16.0843256935814],"autouv":0,"color":9,"rotation":[-22.5,0,0],"origin":[11.755052095676865,0,12.0843256935814],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[16,0,0,16],"rotation":90,"texture":0}},"type":"cube","uuid":"a13cf19e-6339-91b6-4d9b-0d3500abf734"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2","a13cf19e-6339-91b6-4d9b-0d3500abf734"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]} \ No newline at end of file diff --git a/assets/models/clam_shell_4.bbmodel b/assets/models/clam_shell_4.bbmodel index 952aa7fc..822daf6b 100644 --- a/assets/models/clam_shell_4.bbmodel +++ b/assets/models/clam_shell_4.bbmodel @@ -1 +1 @@ -{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_4","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.4,0,-1],"to":[15.399999999999999,0,7],"autouv":0,"color":9,"rotation":[0,45,0],"origin":[13,0,3],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0.3640158355865708,0,7.022858234660681],"to":[8.36401583558657,0,15.022858234660681],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[4.364015835586571,0,11.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":180,"texture":0},"down":{"uv":[0,0,0,0],"rotation":180,"texture":null}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.755052095676865,0,8.084325693581398],"to":[15.755052095676865,0,16.0843256935814],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[11.755052095676865,0,12.0843256935814],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[0,0,0,0],"rotation":270,"texture":null}},"type":"cube","uuid":"a13cf19e-6339-91b6-4d9b-0d3500abf734"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1.3640158355865708,0,0.022858234660681376],"to":[9.36401583558657,0,8.022858234660681],"autouv":0,"color":9,"rotation":[0,22.5,0],"origin":[5.364015835586571,0,4.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":270,"texture":0},"down":{"uv":[0,0,0,0],"rotation":90,"texture":null}},"type":"cube","uuid":"60843fa4-6abd-3b89-20f7-67fc05e29ba3"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2","60843fa4-6abd-3b89-20f7-67fc05e29ba3","a13cf19e-6339-91b6-4d9b-0d3500abf734"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]} \ No newline at end of file +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"clam_shell_4","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[8,0.5,0.6000000000000014],"to":[16,0.5,8.600000000000001],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[12,0.5,3],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":270,"texture":0},"down":{"uv":[16,0,0,16],"rotation":270,"texture":0}},"type":"cube","uuid":"1c53fe40-1877-60c2-80b2-135dff0afe56"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0.3640158355865708,0,7.022858234660681],"to":[8.36401583558657,0,15.022858234660681],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[4.364015835586571,0,11.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":270,"texture":0},"down":{"uv":[16,0,0,16],"rotation":270,"texture":0}},"type":"cube","uuid":"f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[7.755052095676865,0,8.084325693581398],"to":[15.755052095676865,0,16.0843256935814],"autouv":0,"color":9,"rotation":[-22.5,0,0],"origin":[11.755052095676865,0,12.0843256935814],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":90,"texture":0},"down":{"uv":[0,16,16,0],"rotation":270,"texture":0}},"type":"cube","uuid":"a13cf19e-6339-91b6-4d9b-0d3500abf734"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1.3640158355865708,0,0.022858234660681376],"to":[9.36401583558657,0,8.022858234660681],"autouv":0,"color":9,"rotation":[0,0,22.5],"origin":[5.364015835586571,0,4.022858234660681],"faces":{"north":{"uv":[0,0,8,0],"texture":null},"east":{"uv":[0,0,8,0],"texture":null},"south":{"uv":[0,0,8,0],"texture":null},"west":{"uv":[0,0,8,0],"texture":null},"up":{"uv":[0,0,16,16],"rotation":180,"texture":0},"down":{"uv":[0,16,16,0],"rotation":180,"texture":0}},"type":"cube","uuid":"60843fa4-6abd-3b89-20f7-67fc05e29ba3"}],"outliner":["1c53fe40-1877-60c2-80b2-135dff0afe56","f8ee1a59-5c1f-ddd7-783f-bb14a40c36a2","60843fa4-6abd-3b89-20f7-67fc05e29ba3","a13cf19e-6339-91b6-4d9b-0d3500abf734"],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/src/main/resources/assets/unicopia/textures/item/clam_shell.png","name":"clam_shell.png","folder":"item","namespace":"unicopia","id":"shell","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1a1accdc-ffd7-c20a-9047-a5db72ecf496","relative_path":"../../../src/main/resources/assets/unicopia/textures/item/clam_shell.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAihJREFUOE+l09tL02Ecx/H3+C3XDr9y+21Yk9lhbWyyxYg8BFoXkXRYQlQEi6CCLosg6H+IoIu6CIoIDaKgjPJGwhBUQqVINHYo+0XqXB6mzsPSxm9PYLIQMwifywc+L57vh+erY51Ht848/wQaW9+LzFSaYrsDq8OBGo9y5VTdisxfgdtPW4Sy1UltbZBFQAJsQErT+BJXCQe8hdwq4O6LNrGnJkCp3U5/NFqYsAxILCwwPZ7j4uHqtYGXvb3CqGlYDAasPh8+SUJdZjpa33H+UMXaIzxq+yC8pp/YKyuxAKP9/ej1ejKZDB0D37l+7sSqF6+4eNYTFaEKPzpVJZ/P8zlnIZfLUb/bxafhEVre9uELedA0E0fLnUvZAvCks084t5WhzCRxuVykZBnt8iv8d+oLPWRuqLDRTKOzj9Id2zlZ4dUtATcfNgnbJoHX70dSdrHvwSBjCAzGzeApQj4ik23KoqkTsDiHGs4RzxYRqQksAw3PhVJiR7bacClGJIsFz60EmlFGMphB2gCzEwydMeJ2u3kTizEzJ3H2QOg30PC6RyhbrKRGktgUJwf3eoh3dzNtMuExm5mfnycYDNLV1cXO6mraexKcrvL96eBec7tIqgNYHSVcjRzTPe78KIptNjxuBf3kJD9kmfFEgrJQCPXbLIMDCS7UVa0s8X5zu7h0fH+h1O60EF9jUdyBckaHU4yNDIHIM5VOcy0SXvsj/e9yrXsbfwHRlcQRuWinHQAAAABJRU5ErkJggg=="}]} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/clam_shell_1.json b/src/main/resources/assets/unicopia/models/block/clam_shell_1.json index d3597b41..281bf5ee 100644 --- a/src/main/resources/assets/unicopia/models/block/clam_shell_1.json +++ b/src/main/resources/assets/unicopia/models/block/clam_shell_1.json @@ -1,15 +1,16 @@ { "textures": { - "shell": "unicopia:item/clam_shell", - "particle": "#shell" + "particle": "#shell", + "shell": "unicopia:item/clam_shell" }, "elements": [ { - "from": [2.4, 0.1, 0], - "to": [10.4, 0.1, 8], - "rotation": {"angle": 45, "axis": "y", "origin": [12, 0, 4]}, + "from": [4, 1.1, 3.6], + "to": [12, 1.1, 11.6], + "rotation": {"angle": -22.5, "axis": "x", "origin": [12, 0.1, 9.6]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#shell"}, + "down": {"uv": [16, 0, 0, 16], "rotation": 270, "texture": "#shell"} } } ] diff --git a/src/main/resources/assets/unicopia/models/block/clam_shell_2.json b/src/main/resources/assets/unicopia/models/block/clam_shell_2.json index 55468f94..fb31088b 100644 --- a/src/main/resources/assets/unicopia/models/block/clam_shell_2.json +++ b/src/main/resources/assets/unicopia/models/block/clam_shell_2.json @@ -1,23 +1,25 @@ { - "textures": { - "shell": "unicopia:item/clam_shell", - "particle": "#shell" - }, + "textures": { + "particle": "#shell", + "shell": "unicopia:item/clam_shell" + }, "elements": [ { "from": [6.4, 0.1, 0], "to": [14.4, 0.1, 8], - "rotation": {"angle": 45, "axis": "y", "origin": [12, 0, 4]}, + "rotation": {"angle": 22.5, "axis": "x", "origin": [12, 0, 4]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "texture": "#shell"}, + "down": {"uv": [0, 16, 16, 0], "texture": "#shell"} } }, { - "from": [1.21177, 0.1, 6.78823], - "to": [9.21177, 0.1, 14.78823], - "rotation": {"angle": -22.5, "axis": "y", "origin": [5.21177, 0, 10.78823]}, + "from": [1.21177, -0.3, 6.78823], + "to": [9.21177, -0.3, 14.78823], + "rotation": {"angle": -22.5, "axis": "x", "origin": [5.21177, -0.4, 10.78823]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"}, + "down": {"uv": [16, 0, 0, 16], "rotation": 90, "texture": "#shell"} } } ] diff --git a/src/main/resources/assets/unicopia/models/block/clam_shell_3.json b/src/main/resources/assets/unicopia/models/block/clam_shell_3.json index 20200ef0..14cadc84 100644 --- a/src/main/resources/assets/unicopia/models/block/clam_shell_3.json +++ b/src/main/resources/assets/unicopia/models/block/clam_shell_3.json @@ -1,31 +1,32 @@ { - "textures": { - "shell": "unicopia:item/clam_shell", - "particle": "#shell" - }, + "textures": { + "particle": "#shell", + "shell": "unicopia:item/clam_shell" + }, "elements": [ { - "from": [6.4, 0.1, -1], - "to": [14.4, 0.1, 7], - "rotation": {"angle": 45, "axis": "y", "origin": [12, 0, 3]}, + "from": [6.1, 0.4, 0.6], + "to": [14.1, 0.4, 8.6], + "rotation": {"angle": 22.5, "axis": "x", "origin": [10.1, 0.4, 3]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#shell"} } }, { - "from": [0.36402, 0.1, 4.02286], - "to": [8.36402, 0.1, 12.02286], - "rotation": {"angle": 22.5, "axis": "y", "origin": [4.36402, 0, 8.02286]}, + "from": [0.36402, 0, 4.02286], + "to": [8.36402, 0, 12.02286], + "rotation": {"angle": 22.5, "axis": "z", "origin": [4.36402, 0, 8.02286]}, "faces": { "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#shell"} } }, { - "from": [7.75505, 0.1, 8.08433], - "to": [15.75505, 0.1, 16.08433], - "rotation": {"angle": 22.5, "axis": "y", "origin": [11.75505, 0, 12.08433]}, + "from": [7.75505, 0, 8.08433], + "to": [15.75505, 0, 16.08433], + "rotation": {"angle": -22.5, "axis": "x", "origin": [11.75505, 0, 12.08433]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"}, + "down": {"uv": [16, 0, 0, 16], "rotation": 90, "texture": "#shell"} } } ] diff --git a/src/main/resources/assets/unicopia/models/block/clam_shell_4.json b/src/main/resources/assets/unicopia/models/block/clam_shell_4.json index 2610cb33..e269cd5a 100644 --- a/src/main/resources/assets/unicopia/models/block/clam_shell_4.json +++ b/src/main/resources/assets/unicopia/models/block/clam_shell_4.json @@ -1,39 +1,43 @@ { - "textures": { - "shell": "unicopia:item/clam_shell", - "particle": "#shell" - }, + "textures": { + "particle": "#shell", + "shell": "unicopia:item/clam_shell" + }, "elements": [ { - "from": [7.4, 0.1, -1], - "to": [15.4, 0.1, 7], - "rotation": {"angle": 45, "axis": "y", "origin": [13, 0, 3]}, + "from": [8, 0.5, 0.6], + "to": [16, 0.5, 8.6], + "rotation": {"angle": 22.5, "axis": "x", "origin": [12, 0.5, 3]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#shell"}, + "down": {"uv": [16, 0, 0, 16], "rotation": 270, "texture": "#shell"} } }, { - "from": [0.36402, 0.1, 7.02286], - "to": [8.36402, 0.1, 15.02286], - "rotation": {"angle": 22.5, "axis": "y", "origin": [4.36402, 0, 11.02286]}, + "from": [0.36402, 0, 7.02286], + "to": [8.36402, 0, 15.02286], + "rotation": {"angle": 22.5, "axis": "x", "origin": [4.36402, 0, 11.02286]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#shell"}, + "down": {"uv": [16, 0, 0, 16], "rotation": 270, "texture": "#shell"} } }, { - "from": [1.36402, 0.1, 0.02286], - "to": [9.36402, 0.1, 8.02286], - "rotation": {"angle": 22.5, "axis": "y", "origin": [5.36402, 0, 4.02286]}, + "from": [1.36402, 0, 0.02286], + "to": [9.36402, 0, 8.02286], + "rotation": {"angle": 22.5, "axis": "z", "origin": [5.36402, 0, 4.02286]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#shell"}, + "down": {"uv": [0, 16, 16, 0], "rotation": 180, "texture": "#shell"} } }, { - "from": [7.75505, 0.1, 8.08433], - "to": [15.75505, 0.1, 16.08433], - "rotation": {"angle": 22.5, "axis": "y", "origin": [11.75505, 0, 12.08433]}, + "from": [7.75505, 0, 8.08433], + "to": [15.75505, 0, 16.08433], + "rotation": {"angle": -22.5, "axis": "x", "origin": [11.75505, 0, 12.08433]}, "faces": { - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"} + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#shell"}, + "down": {"uv": [0, 16, 16, 0], "rotation": 270, "texture": "#shell"} } } ] From 63243e254d9856c830eb078c5401c0c58e1163fc Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 20 Nov 2023 22:30:21 +0000 Subject: [PATCH 59/90] Added the shaping bench --- .../unicopia/block/UBlocks.java | 2 + .../block/cloud/ShapingBenchBlock.java | 41 ++++++ .../block/cloud/UnstableCloudBlock.java | 4 + .../unicopia/client/UnicopiaClient.java | 2 + .../client/gui/ShapingBenchScreen.java | 12 ++ .../container/ShapingBenchScreenHandler.java | 96 +++++++++++++ .../unicopia/container/UScreenHandlers.java | 2 + .../unicopia/item/URecipes.java | 5 + .../item/cloud/CloudShapingRecipe.java | 32 +++++ .../unicopia/blockstates/shaping_bench.json | 7 + .../resources/assets/unicopia/lang/en_us.json | 3 +- .../unicopia/models/block/shaping_bench.json | 130 ++++++++++++++++++ .../unicopia/models/item/shaping_bench.json | 3 + .../textures/block/shaping_bench_bottom.png | Bin 0 -> 653 bytes .../textures/block/shaping_bench_inside.png | Bin 0 -> 655 bytes .../textures/block/shaping_bench_rim.png | Bin 0 -> 403 bytes .../textures/block/shaping_bench_side.png | Bin 0 -> 654 bytes .../textures/block/shaping_bench_top.png | Bin 0 -> 623 bytes .../blocks/carving/carved_cloud_cutting.json | 6 + .../carving/cloud_brick_slab_cutting.json | 6 + .../carving/cloud_brick_stairs_cutting.json | 6 + .../blocks/carving/cloud_bricks_cutting.json | 6 + .../blocks/carving/cloud_pillar_cutting.json | 6 + .../carving/cloud_plank_slab_cutting.json | 6 + .../carving/cloud_plank_stairs_cutting.json | 6 + .../blocks/carving/cloud_planks_cutting.json | 6 + .../blocks/carving/cloud_slab_cutting.json | 6 + .../blocks/carving/cloud_stairs_cutting.json | 6 + .../carving/dense_cloud_slab_cutting.json | 6 + .../carving/dense_cloud_stairs_cutting.json | 6 + .../carving/unstable_cloud_cutting.json | 6 + .../recipes/blocks/shaping_bench.json | 13 ++ 32 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/client/gui/ShapingBenchScreen.java create mode 100644 src/main/java/com/minelittlepony/unicopia/container/ShapingBenchScreenHandler.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/cloud/CloudShapingRecipe.java create mode 100644 src/main/resources/assets/unicopia/blockstates/shaping_bench.json create mode 100644 src/main/resources/assets/unicopia/models/block/shaping_bench.json create mode 100644 src/main/resources/assets/unicopia/models/item/shaping_bench.json create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_bottom.png create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_inside.png create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_rim.png create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_side.png create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_top.png create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/carved_cloud_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_brick_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_brick_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_bricks_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_pillar_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_plank_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_plank_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_planks_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/dense_cloud_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/dense_cloud_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/unstable_cloud_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/shaping_bench.json diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 889676c5..078f267d 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -12,6 +12,7 @@ import com.minelittlepony.unicopia.block.cloud.CompactedCloudBlock; import com.minelittlepony.unicopia.block.cloud.NaturalCloudBlock; import com.minelittlepony.unicopia.block.cloud.OrientedCloudBlock; import com.minelittlepony.unicopia.block.cloud.PoreousCloudStairsBlock; +import com.minelittlepony.unicopia.block.cloud.ShapingBenchBlock; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; import com.minelittlepony.unicopia.block.cloud.CloudBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudBlock; @@ -147,6 +148,7 @@ public interface UBlocks { Block MYSTERIOUS_EGG = register("mysterious_egg", new PileBlock(Settings.copy(Blocks.SLIME_BLOCK), PileBlock.MYSTERIOUS_EGG_SHAPES), ItemGroups.NATURAL); Block SLIME_PUSTULE = register("slime_pustule", new SlimePustuleBlock(Settings.copy(Blocks.SLIME_BLOCK)), ItemGroups.NATURAL); + Block SHAPING_BENCH = register("shaping_bench", new ShapingBenchBlock(Settings.create().mapColor(MapColor.OFF_WHITE).hardness(0.3F).resistance(0).sounds(BlockSoundGroup.WOOL)), ItemGroups.FUNCTIONAL); Block CLOUD = register("cloud", new NaturalCloudBlock(Settings.create().mapColor(MapColor.OFF_WHITE).hardness(0.3F).resistance(0).sounds(BlockSoundGroup.WOOL), true, () -> UBlocks.SOGGY_CLOUD, () -> UBlocks.COMPACTED_CLOUD), ItemGroups.NATURAL); diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java new file mode 100644 index 00000000..624836d9 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java @@ -0,0 +1,41 @@ +package com.minelittlepony.unicopia.block.cloud; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.container.ShapingBenchScreenHandler; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.screen.SimpleNamedScreenHandlerFactory; +import net.minecraft.stat.Stats; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class ShapingBenchBlock extends CloudBlock { + public ShapingBenchBlock(Settings settings) { + super(settings, false); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (world.isClient) { + return ActionResult.SUCCESS; + } + player.openHandledScreen(state.createScreenHandlerFactory(world, pos)); + player.incrementStat(Stats.INTERACT_WITH_STONECUTTER); + return ActionResult.CONSUME; + } + + @Override + @Nullable + public NamedScreenHandlerFactory createScreenHandlerFactory(BlockState state, World world, BlockPos pos) { + return new SimpleNamedScreenHandlerFactory((syncId, playerInventory, player) -> { + return new ShapingBenchScreenHandler(syncId, playerInventory, ScreenHandlerContext.create(world, pos)); + }, getName()); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java index 554e20b6..30bf49c4 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java @@ -59,6 +59,10 @@ public class UnstableCloudBlock extends CloudBlock { } world.playSound(null, pos, SoundEvents.BLOCK_WOOL_HIT, SoundCategory.BLOCKS, 1, 1); + if (world.isClient) { + return; + } + if (fallDistance > 3) { world.breakBlock(pos, true); return; diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java index fc89eaa0..32b01a8e 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java @@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.client.gui.LanSettingsScreen; +import com.minelittlepony.unicopia.client.gui.ShapingBenchScreen; import com.minelittlepony.unicopia.client.gui.UHud; import com.minelittlepony.unicopia.client.gui.spellbook.SpellbookScreen; import com.minelittlepony.unicopia.client.minelittlepony.MineLPDelegate; @@ -101,6 +102,7 @@ public class UnicopiaClient implements ClientModInitializer { URenderers.bootstrap(); HandledScreens.register(UScreenHandlers.SPELL_BOOK, SpellbookScreen::new); + HandledScreens.register(UScreenHandlers.SHAPING_BENCH, ShapingBenchScreen::new); ClientTickEvents.END_CLIENT_TICK.register(this::onTick); ClientTickEvents.END_WORLD_TICK.register(this::onWorldTick); diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/ShapingBenchScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/ShapingBenchScreen.java new file mode 100644 index 00000000..e38e96d7 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/ShapingBenchScreen.java @@ -0,0 +1,12 @@ +package com.minelittlepony.unicopia.client.gui; + +import net.minecraft.client.gui.screen.ingame.StonecutterScreen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.screen.StonecutterScreenHandler; +import net.minecraft.text.Text; + +public class ShapingBenchScreen extends StonecutterScreen { + public ShapingBenchScreen(StonecutterScreenHandler handler, PlayerInventory inventory, Text title) { + super(handler, inventory, title); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/ShapingBenchScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/ShapingBenchScreenHandler.java new file mode 100644 index 00000000..3ff1ac4a --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/ShapingBenchScreenHandler.java @@ -0,0 +1,96 @@ +package com.minelittlepony.unicopia.container; + +import com.minelittlepony.unicopia.block.UBlocks; +import com.minelittlepony.unicopia.item.URecipes; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.screen.StonecutterScreenHandler; +import net.minecraft.screen.slot.Slot; +import net.minecraft.world.World; + +public class ShapingBenchScreenHandler extends StonecutterScreenHandler { + + private final ScreenHandlerContext context; + private final World world; + + private ItemStack inputStack = ItemStack.EMPTY; + + public ShapingBenchScreenHandler(int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { + super(syncId, playerInventory, context); + this.context = context; + this.world = playerInventory.player.getWorld(); + } + + public ShapingBenchScreenHandler(int syncId, PlayerInventory playerInventory) { + super(syncId, playerInventory); + this.context = ScreenHandlerContext.EMPTY; + this.world = playerInventory.player.getWorld(); + } + + @Override + public ScreenHandlerType getType() { + return UScreenHandlers.SHAPING_BENCH; + } + + @Override + public boolean canUse(PlayerEntity player) { + return canUse(context, player, UBlocks.SHAPING_BENCH); + } + + @Override + public void onContentChanged(Inventory inventory) { + ItemStack stack = slots.get(0).getStack(); + if (!stack.isOf(inputStack.getItem())) { + inputStack = stack.copy(); + getAvailableRecipes().clear(); + setProperty(0, -1); + slots.get(1).setStackNoCallbacks(ItemStack.EMPTY); + if (!stack.isEmpty()) { + getAvailableRecipes().addAll(world.getRecipeManager().getAllMatches(URecipes.CLOUD_SHAPING, input, world)); + } + } + } + + @Override + public ItemStack quickMove(PlayerEntity player, int slot) { + ItemStack originalStack = ItemStack.EMPTY; + Slot srcSlot = slots.get(slot); + if (srcSlot != null && srcSlot.hasStack()) { + ItemStack movingStack = srcSlot.getStack(); + Item item = movingStack.getItem(); + originalStack = movingStack.copy(); + if (slot == 1) { + item.onCraft(movingStack, player.getWorld(), player); + if (!insertItem(movingStack, 2, 38, true)) { + return ItemStack.EMPTY; + } + srcSlot.onQuickTransfer(movingStack, originalStack); + } else if (slot == 0 + ? !insertItem(movingStack, 2, 38, false) + : (world.getRecipeManager().getFirstMatch(URecipes.CLOUD_SHAPING, new SimpleInventory(movingStack), world).isPresent() + ? !insertItem(movingStack, 0, 1, false) + : (slot >= 2 && slot < 29 + ? !insertItem(movingStack, 29, 38, false) + : slot >= 29 && slot < 38 && !insertItem(movingStack, 2, 29, false)))) { + return ItemStack.EMPTY; + } + if (movingStack.isEmpty()) { + srcSlot.setStack(ItemStack.EMPTY); + } + srcSlot.markDirty(); + if (movingStack.getCount() == originalStack.getCount()) { + return ItemStack.EMPTY; + } + srcSlot.onTakeItem(player, movingStack); + this.sendContentUpdates(); + } + return originalStack; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/UScreenHandlers.java b/src/main/java/com/minelittlepony/unicopia/container/UScreenHandlers.java index f2fba259..f62a097a 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/UScreenHandlers.java +++ b/src/main/java/com/minelittlepony/unicopia/container/UScreenHandlers.java @@ -6,10 +6,12 @@ import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.registry.Registry; +import net.minecraft.resource.featuretoggle.FeatureFlags; import net.minecraft.registry.Registries; public interface UScreenHandlers { ScreenHandlerType SPELL_BOOK = register("spell_book", new ExtendedScreenHandlerType<>(SpellbookScreenHandler::new)); + ScreenHandlerType SHAPING_BENCH = register("shaping_bench", new ScreenHandlerType<>(ShapingBenchScreenHandler::new, FeatureFlags.VANILLA_FEATURES)); static ScreenHandlerType register(String name, ScreenHandlerType type) { return Registry.register(Registries.SCREEN_HANDLER, Unicopia.id(name), type); diff --git a/src/main/java/com/minelittlepony/unicopia/item/URecipes.java b/src/main/java/com/minelittlepony/unicopia/item/URecipes.java index d04d170d..2c0a8573 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/URecipes.java +++ b/src/main/java/com/minelittlepony/unicopia/item/URecipes.java @@ -4,21 +4,25 @@ import java.util.List; import com.google.gson.JsonArray; import com.minelittlepony.unicopia.ability.magic.spell.crafting.*; +import com.minelittlepony.unicopia.item.cloud.CloudShapingRecipe; import net.fabricmc.fabric.api.loot.v2.LootTableEvents; import net.minecraft.loot.LootTable; import net.minecraft.loot.context.LootContextTypes; +import net.minecraft.recipe.CuttingRecipe; import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.RecipeSerializer; import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.ShapedRecipe; import net.minecraft.recipe.ShapelessRecipe; import net.minecraft.recipe.SpecialRecipeSerializer; +import net.minecraft.recipe.StonecuttingRecipe; import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; public interface URecipes { RecipeType SPELLBOOK = RecipeType.register("unicopia:spellbook"); + RecipeType CLOUD_SHAPING = RecipeType.register("unicopia:cloud_shaping"); RecipeSerializer ZAP_APPLE_SERIALIZER = RecipeSerializer.register("unicopia:crafting_zap_apple", new ZapAppleRecipe.Serializer()); RecipeSerializer GLOWING_SERIALIZER = RecipeSerializer.register("unicopia:crafting_glowing", new SpecialRecipeSerializer<>(GlowingRecipe::new)); @@ -28,6 +32,7 @@ public interface URecipes { RecipeSerializer TRAIT_REQUIREMENT = RecipeSerializer.register("unicopia:spellbook/crafting", new SpellCraftingRecipe.Serializer()); RecipeSerializer TRAIT_COMBINING = RecipeSerializer.register("unicopia:spellbook/combining", new SpellEnhancingRecipe.Serializer()); RecipeSerializer SPELL_DUPLICATING = RecipeSerializer.register("unicopia:spellbook/duplicating", new SpellDuplicatingRecipe.Serializer()); + RecipeSerializer CLOUD_SHAPING_SERIALIZER = RecipeSerializer.register("unicopia:cloud_shaping", new CuttingRecipe.Serializer<>(CloudShapingRecipe::new) {}); static DefaultedList getIngredients(JsonArray json) { DefaultedList defaultedList = DefaultedList.of(); diff --git a/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudShapingRecipe.java b/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudShapingRecipe.java new file mode 100644 index 00000000..c88a5abd --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudShapingRecipe.java @@ -0,0 +1,32 @@ +package com.minelittlepony.unicopia.item.cloud; + +import com.minelittlepony.unicopia.block.UBlocks; +import com.minelittlepony.unicopia.item.URecipes; + +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.RecipeSerializer; +import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.StonecuttingRecipe; +import net.minecraft.util.Identifier; + +public class CloudShapingRecipe extends StonecuttingRecipe { + public CloudShapingRecipe(Identifier id, String group, Ingredient input, ItemStack output) { + super(id, group, input, output); + } + + @Override + public RecipeType getType() { + return URecipes.CLOUD_SHAPING; + } + + @Override + public RecipeSerializer getSerializer() { + return URecipes.CLOUD_SHAPING_SERIALIZER; + } + + @Override + public ItemStack createIcon() { + return new ItemStack(UBlocks.SHAPING_BENCH); + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/shaping_bench.json b/src/main/resources/assets/unicopia/blockstates/shaping_bench.json new file mode 100644 index 00000000..fb0ebd3e --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/shaping_bench.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/shaping_bench" + } + } +} diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index e66dbb7e..f1dfae00 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -270,7 +270,8 @@ "block.unicopia.chiselled_chitin_hull": "Chiselled Chitin Hull", "block.unicopia.chiselled_chitin_slab": "Chiselled Chitin Slab", "block.unicopia.chiselled_chitin_stairs": "Chiselled Chitin Stairs", - + + "block.unicopia.shaping_bench": "Shaping Bench", "block.unicopia.cloud": "Cloud", "block.unicopia.cloud_slab": "Cloud Slab", "block.unicopia.cloud_stairs": "Cloud Stairs", diff --git a/src/main/resources/assets/unicopia/models/block/shaping_bench.json b/src/main/resources/assets/unicopia/models/block/shaping_bench.json new file mode 100644 index 00000000..55eb5b56 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/shaping_bench.json @@ -0,0 +1,130 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "3": "unicopia:block/shaping_bench_rim", + "4": "unicopia:block/shaping_bench_inside", + "side": "unicopia:block/shaping_bench_side", + "bottom": "unicopia:block/shaping_bench_bottom", + "particle": "unicopia:block/shaping_bench_top", + "top": "unicopia:block/shaping_bench_top" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 4, 16], + "faces": { + "north": {"uv": [0, 12, 16, 16], "texture": "#side"}, + "east": {"uv": [0, 12, 16, 16], "texture": "#side"}, + "south": {"uv": [0, 12, 16, 16], "texture": "#side"}, + "west": {"uv": [0, 12, 16, 16], "texture": "#side"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#bottom"} + } + }, + { + "from": [2, 4, 2], + "to": [14, 13, 14], + "faces": { + "north": {"uv": [2, 3, 14, 12], "texture": "#side"}, + "east": {"uv": [2, 3, 14, 12], "texture": "#side"}, + "south": {"uv": [2, 3, 14, 12], "texture": "#side"}, + "west": {"uv": [2, 3, 14, 12], "texture": "#side"} + } + }, + { + "from": [2, 16, 2], + "to": [14, 17, 14], + "faces": { + "north": {"uv": [2, 2, 14, 3], "texture": "#top"}, + "east": {"uv": [2, 2, 14, 3], "texture": "#top"}, + "south": {"uv": [2, 2, 14, 3], "texture": "#top"}, + "west": {"uv": [2, 2, 14, 3], "texture": "#top"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#top"} + } + }, + { + "from": [0, 13, 14], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [0, 2, 2, 5], "texture": "#side"}, + "south": {"uv": [0, 2, 16, 5], "texture": "#side"}, + "west": {"uv": [14, 2, 16, 5], "texture": "#side"}, + "up": {"uv": [0, 14, 16, 16], "texture": "#top"}, + "down": {"uv": [0, 0, 16, 2], "texture": "#3"} + } + }, + { + "from": [0, 13, 0], + "to": [16, 16, 2], + "faces": { + "north": {"uv": [0, 2, 16, 5], "texture": "#side"}, + "east": {"uv": [14, 2, 16, 5], "texture": "#side"}, + "west": {"uv": [0, 2, 2, 5], "texture": "#side"}, + "up": {"uv": [0, 1, 16, 3], "texture": "#top"}, + "down": {"uv": [0, 14, 16, 16], "texture": "#3"} + } + }, + { + "from": [0, 13, 2], + "to": [2, 16, 14], + "faces": { + "west": {"uv": [2, 2, 14, 5], "texture": "#side"}, + "up": {"uv": [1, 2, 3, 14], "texture": "#top"}, + "down": {"uv": [0, 2, 2, 14], "texture": "#3"} + } + }, + { + "from": [14, 13, 2], + "to": [16, 16, 14], + "faces": { + "east": {"uv": [2, 2, 14, 5], "texture": "#side"}, + "up": {"uv": [13, 2, 15, 14], "texture": "#top"}, + "down": {"uv": [14, 2, 16, 14], "texture": "#3"} + } + }, + { + "from": [13, 16, 0], + "to": [16, 18, 3], + "faces": { + "north": {"uv": [0, 0, 3, 2], "texture": "#side"}, + "east": {"uv": [13, 0, 16, 2], "texture": "#side"}, + "south": {"uv": [2, 12, 5, 14], "texture": "#top"}, + "west": {"uv": [11, 12, 14, 14], "texture": "#top"}, + "up": {"uv": [13, 0, 16, 3], "texture": "#4"} + } + }, + { + "from": [0, 16, 0], + "to": [3, 18, 3], + "faces": { + "north": {"uv": [13, 0, 16, 2], "texture": "#side"}, + "east": {"uv": [2, 12, 5, 14], "texture": "#top"}, + "south": {"uv": [11, 12, 14, 14], "texture": "#top"}, + "west": {"uv": [0, 0, 3, 2], "texture": "#side"}, + "up": {"uv": [0, 0, 3, 3], "texture": "#4"} + } + }, + { + "from": [13, 16, 13], + "to": [16, 18, 16], + "faces": { + "north": {"uv": [11, 12, 14, 14], "texture": "#top"}, + "east": {"uv": [0, 0, 3, 2], "texture": "#side"}, + "south": {"uv": [13, 0, 16, 2], "texture": "#side"}, + "west": {"uv": [2, 12, 5, 14], "texture": "#top"}, + "up": {"uv": [13, 13, 16, 16], "texture": "#4"} + } + }, + { + "from": [0, 16, 13], + "to": [3, 18, 16], + "faces": { + "north": {"uv": [2, 12, 5, 14], "texture": "#top"}, + "east": {"uv": [11, 12, 14, 14], "texture": "#top"}, + "south": {"uv": [0, 0, 3, 2], "texture": "#side"}, + "west": {"uv": [13, 0, 16, 2], "texture": "#side"}, + "up": {"uv": [0, 13, 3, 16], "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/shaping_bench.json b/src/main/resources/assets/unicopia/models/item/shaping_bench.json new file mode 100644 index 00000000..4ad37e87 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/shaping_bench.json @@ -0,0 +1,3 @@ +{ + "parent": "unicopia:block/shaping_bench" +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_bottom.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..c7793827397828ec1579a713df43e232d26bed83 GIT binary patch literal 653 zcmV;80&@L{P)WfFh;kd)px(Nm6pUd2@4~x)tr6e=4xhOu*RC-9=LIi=L0OU%_iilW1L^X)lxYa4BAR8(8Fm@%Qi-RYyF zn<7)Vxw+A8+nR`wl|}*yo|Ppf#Ehw;&E0u?dQ=3CFGn9^@ay+4NOM#daDOslGi2yR}b zRbvh$MFf%4=TpAEzN&w6Bbe}kCL+z7BO=o?a@8!IYeEnoWLWQ=x3@Pv{yLHc5z$5; z6VRqjHs4xRg=*89%-V1Ew*Rrq=3C3iB_{K9I>pn=lP(tGf||B5#;Pi^lD+MsEE)wA zMPMjoWtp0N|NcGCcjxZvfl#gv1yzNrLV=12CMJFKm6^ndN)kcz>-|?-a}g`@dcCgI z*96GQ88a#f9KhU6N&c8AQZ9PDh#>(SumA`n9KLCXpdq+ZsxY zKJxbNmd&@UETRHatM`B3b8owvnAvU=6)^)x;s3kHYo@B=&FR-pYYirAFiJ&PxoqXa z)DRPGdqd`&FBKI(AAh2%NQzoBMjuH53f>$R4gU}ba2!WcAi45IRHCv}5GjhxWR8h8 nU6LYz`TkKr5LPTi1ry^xAl{j>o-HS_00000NkvXXu0mjf%B?UX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_inside.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..92c9b36d3859cc9973d30934f57c946b1a005488 GIT binary patch literal 655 zcmV;A0&x9_P)Q5+Ea?fgjx8_P0LX2RHxRv}IZD03;&^3M5Z^ z-+NV|s!Trd`u56vn8`JnK207Gtn1p%%np7yQJ`6glrZ|}D(bV(KH205J|AZGeP{YK z0bpiK(qq(%*Z zecu;zb8T9&MVOf*01zX{kv%e)=b5n$D9%A(nMqbM`Q#{L-}XcRfy!dkplPf9eP_Oz zwMlDjZfxtu=mT4RFG4|P>iKl;s*1U>tsCwRo!Hq+MTv|S8LaQCzP!AAxX8@9J>6DT ze#SYA%6VCqvmnRV8-`j+D#< p13?&lAT9`ksX@Wx<0G@r{11y_hNCWG2ciG~002ovPDHLkV1h4xJlOyM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_rim.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_rim.png new file mode 100644 index 0000000000000000000000000000000000000000..0873c673c58b5124aae7a9c6b7daf962c664c200 GIT binary patch literal 403 zcmV;E0c`$>P) z!EV$*5JX?~^z3qtkg-A(CF1|ThYvuzUdPT6i8bTt=D-0sns;oeo>ZmQ{l|TgX@6he z&*M0TQq0S2!^04%Yy@EFw%krH&o4oT>wLBGaooIk_2NbC-fH{V8X_gROw=Ocn`+a>^u9(%Uq9Zr6#ndxTLve6EAhzQR0 zEMun4rz3*x`!?91;`tB4JegO$v%cV+PMe_gv002ovPDHLkV1jt-!f5~i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_side.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_side.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff82a577901df92daecd47b1062c738c72bdf96 GIT binary patch literal 654 zcmV;90&)F`P)Ub<5JX@9%zPG*MIs4?2w2MfPZiM&MOsSWh2eyp>FLfwQPl;i@T%nbkLSM-qIqjo z1qGtQx-L?3l7J#8-n~OYzI(cPb90lsU+?Vo?R9>6`cjIzm_R~FSyjz>nV6ZnIXE2l zhxPdTqn(Z?e8oat>7P31!&wkk5GV>juGG>ZGXd6Gi{88Nzr3|Z-#QPUA8gDqs|r=6 zx6aRhezJYq$V<|H=@t=oxm>2ZI}0fA^S84IqA_D4Y-WatfIzI6b53q=Hp@1X8lzzQ48IZkG|k@pxSKclYVdn^#p6 zmFenLS~bQHDUtK(Y#E8Vf}$i7Fn32)TkGu#OwW~}OJ%Ofyv`*i1#Gvsx4CT_F#|W} zcs#ao9oN2fcXhh=cAeK!ZCaCA+s)Rtn@zg)mXRSQv#Lr=2m%~LrHwJ7>Yd8gHgSSR zGAW9MVUU&e`t7x?Sj)Skr~=ijG3KDEP*X^7F+oe^IC;W|EcCTW_j5$8}^% z>gjyasv;{<(OP4%wM|XT`qs6m>zWHkK~u>};u86>!rR|&v$aN!jK!+czbB0hiwssS zFtlky4u`|vYpu20?Lt+N5;ZsW&wD8NsP%CFVAAB{6C966r9d+BO;lE8sUT9kBbsBP oO+!)yFyH+B>Iks{QNhIc4+IX06!FuAod5s;07*qoM6N<$g5qI2TmS$7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_top.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_top.png new file mode 100644 index 0000000000000000000000000000000000000000..07c51185175c894e71686c52e35de7c4f62c4a94 GIT binary patch literal 623 zcmV-#0+9WQP)M-l8ANh?n9%5Px$b&q##A` ztCNz002E10Tj~N6q{;oi8T(v-;38t8LcOb`WX;Smt|JQt0;o5M+k(@dCqbBwqbL9| zLsOH80GM;m+s*Jeqi}pV>SnW9GZR&%)yB_XKUwY;;u^HCt-3qc>vdc%mv(qMBncWB zDJje`hlcuRic<+7NhZJV&d8#rj6Qt3+peZIfvlxM zLS~{xA;F{wnks8wJt9hYA#gzjePl6o`m1`&0}u05dCs1PbTN zS?|B!^SFHs1c2hxi5c Date: Mon, 20 Nov 2023 22:57:41 +0000 Subject: [PATCH 60/90] Added emi integration for the shaping bench --- .../unicopia/compat/emi/Main.java | 15 +++++++++++++++ .../resources/assets/unicopia/lang/en_us.json | 1 + .../blocks/carving/unstable_cloud_cutting.json | 6 ------ .../recipes/blocks/unstable_cloud.json | 18 ++++++++++++++++++ .../unicopia/tags/items/groups/pegasus.json | 1 + 5 files changed, 35 insertions(+), 6 deletions(-) delete mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/unstable_cloud_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/unstable_cloud.json diff --git a/src/main/java/com/minelittlepony/unicopia/compat/emi/Main.java b/src/main/java/com/minelittlepony/unicopia/compat/emi/Main.java index fbf4ce4f..01adac1f 100644 --- a/src/main/java/com/minelittlepony/unicopia/compat/emi/Main.java +++ b/src/main/java/com/minelittlepony/unicopia/compat/emi/Main.java @@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellEnhancingRe import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellShapedCraftingRecipe; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; +import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.item.EnchantableItem; import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.URecipes; @@ -22,6 +23,7 @@ import dev.emi.emi.api.recipe.EmiRecipeCategory; import dev.emi.emi.api.render.EmiTexture; import dev.emi.emi.api.stack.Comparison; import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.recipe.EmiStonecuttingRecipe; import net.minecraft.item.ItemStack; import net.minecraft.recipe.RecipeType; import net.minecraft.registry.DynamicRegistryManager; @@ -30,7 +32,9 @@ import net.minecraft.util.Identifier; public class Main implements EmiPlugin { static final EmiStack SPELL_BOOK_STATION = EmiStack.of(UItems.SPELLBOOK); + static final EmiStack CLOUD_SHAPING_STATION = EmiStack.of(UBlocks.SHAPING_BENCH); static final EmiRecipeCategory SPELL_BOOK_CATEGORY = new EmiRecipeCategory(Unicopia.id("spellbook"), SPELL_BOOK_STATION, SPELL_BOOK_STATION); + static final EmiRecipeCategory CLOUD_SHAPING_CATEGORY = new EmiRecipeCategory(Unicopia.id("cloud_shaping"), CLOUD_SHAPING_STATION, CLOUD_SHAPING_STATION); static final Identifier WIDGETS = Unicopia.id("textures/gui/widgets.png"); static final EmiTexture EMPTY_ARROW = new EmiTexture(WIDGETS, 44, 0, 24, 17); @@ -70,6 +74,17 @@ public class Main implements EmiPlugin { } }); + registry.addCategory(CLOUD_SHAPING_CATEGORY); + registry.addWorkstation(CLOUD_SHAPING_CATEGORY, CLOUD_SHAPING_STATION); + registry.getRecipeManager().listAllOfType(URecipes.CLOUD_SHAPING).forEach(recipe -> { + registry.addRecipe(new EmiStonecuttingRecipe(recipe) { + @Override + public EmiRecipeCategory getCategory() { + return CLOUD_SHAPING_CATEGORY; + } + }); + }); + Stream.of(UItems.GEMSTONE, UItems.BOTCHED_GEM, UItems.MAGIC_STAFF, UItems.FILLED_JAR).forEach(item -> { registry.setDefaultComparison(item, comparison -> Comparison.compareNbt()); }); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index f1dfae00..997b1770 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -45,6 +45,7 @@ "item.unicopia.spellbook": "Spellbook", "emi.category.unicopia.spellbook": "Spellbook", + "emi.category.unicopia.cloud_shaping": "Shaping", "item.unicopia.alicorn_badge": "Alicorn Emblem", "item.unicopia.unicorn_badge": "Unicorn Emblem", diff --git a/src/main/resources/data/unicopia/recipes/blocks/carving/unstable_cloud_cutting.json b/src/main/resources/data/unicopia/recipes/blocks/carving/unstable_cloud_cutting.json deleted file mode 100644 index 5fc507d0..00000000 --- a/src/main/resources/data/unicopia/recipes/blocks/carving/unstable_cloud_cutting.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "unicopia:cloud_shaping", - "ingredient": { "item": "unicopia:cloud" }, - "result": "unicopia:unstable_cloud", - "count": 1 -} diff --git a/src/main/resources/data/unicopia/recipes/blocks/unstable_cloud.json b/src/main/resources/data/unicopia/recipes/blocks/unstable_cloud.json new file mode 100644 index 00000000..6ccbf5d4 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/blocks/unstable_cloud.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#O#", + "###" + ], + "key": { + "#": [ + { "item": "unicopia:cloud" } + ], + "O": [ + { "item": "unicopia:lightning_jar" }, + { "item": "unicopia:zap_apple_jam_jar" } + ] + }, + "result": { "item": "unicopia:unstable_cloud", "count": 8 } +} diff --git a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json index 1d26b745..81c0a88c 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json +++ b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ + "unicopia:shaping_bench", "#unicopia:clouds", "#unicopia:bed_sheets", "#unicopia:food_types/raw_fish", From 094cf2383dab5f4c4f410fa059517758ddf89cfb Mon Sep 17 00:00:00 2001 From: LingVarr <104311317+LingVarr@users.noreply.github.com> Date: Thu, 23 Nov 2023 05:54:27 +1100 Subject: [PATCH 61/90] Update ru_ru.json (#216) --- .../resources/assets/unicopia/lang/ru_ru.json | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/unicopia/lang/ru_ru.json b/src/main/resources/assets/unicopia/lang/ru_ru.json index e3484934..8d360623 100644 --- a/src/main/resources/assets/unicopia/lang/ru_ru.json +++ b/src/main/resources/assets/unicopia/lang/ru_ru.json @@ -21,6 +21,7 @@ "itemGroup.unicopia.unicorn": "Unicopia - Кантерлот", "itemGroup.unicopia.pegasus": "Unicopia - Клаудсдейл", "itemGroup.unicopia.bat_pony": "Unicopia - Лощина Теней", + "itemGroup.unicopia.sea_pony": "Unicopia - Из глубин", "itemGroup.unicopia.changeling": "Unicopia - Сырные Холмы", "item.unicopia.friendship_bracelet": "Браслет товарищества", @@ -44,6 +45,7 @@ "item.unicopia.spellbook": "Книга заклинаний", "emi.category.unicopia.spellbook": "Книга заклинаний", + "emi.category.unicopia.cloud_shaping": "Формоизменение", "item.unicopia.alicorn_badge": "Эмблема аликорна", "item.unicopia.unicorn_badge": "Эмблема единорога", @@ -138,12 +140,16 @@ "item.unicopia.pegasus_amulet": "Крылья Икара", "item.unicopia.pegasus_amulet.lore": "Дарует временный полёт тому, кто носит его", "item.unicopia.amulet.energy": "Энергия: %d / %d", - + "item.unicopia.alicorn_amulet": "Амулет аликорна", "item.unicopia.alicorn_amulet.lore": "Время ношения: %d", "item.unicopia.pearl_necklace": "Жемчужное ожерелье", "item.unicopia.pearl_necklace.lore": "Наделяет владельца подводными способностями", + "item.unicopia.clam_shell": "Раковина моллюска", + "item.unicopia.scallop_shell": "Раковина гребешка", + "item.unicopia.turret_shell": "Раковина туррителлы", + "item.unicopia.shelly": "Шелли", "item.unicopia.horse_shoe.accuracy": "Точность: %d%%", "item.unicopia.horse_shoe.speed": "Скорость: %d", @@ -154,7 +160,7 @@ "item.unicopia.broken_alicorn_amulet": "Сломанный амулет аликорна", "item.unicopia.unicorn_amulet": "Амулет единорога", - "item.unicopia.unicorn_amulet.lore": "Наделяет носящего магическими способностями", + "item.unicopia.unicorn_amulet.lore": "Наделяет носящего магическими способностями", "item.unicopia.grogars_bell": "Колокольчик Грогара", "item.unicopia.grogars_bell.charges": "Заряды: %d / %d", @@ -199,7 +205,12 @@ "item.unicopia.apple_bed_sheets": "Яблочная простынь", "item.unicopia.barred_bed_sheets": "Простынь в полоску", "item.unicopia.checkered_bed_sheets": "Простынь в клетку", + "item.unicopia.kelp_bed_sheets": "Простынь из ламинарии", "item.unicopia.rainbow_bed_sheets": "Радужная простынь", + "item.unicopia.rainbow_bpw_bed_sheets": "Простынь с радужным СРБ узором", + "item.unicopia.rainbow_bpy_bed_sheets": "Простынь с радужным СРЖ узором", + "item.unicopia.rainbow_pbg_bed_sheets": "Простынь с радужным ФСЧ узором", + "item.unicopia.rainbow_pwr_bed_sheets": "Простынь с радужным РБК узором", "block.unicopia.rocks": "Камни", "block.unicopia.bananas": "Бананы", @@ -235,7 +246,11 @@ "block.unicopia.mango_leaves": "Листья мангового дерева", "block.unicopia.mango_sapling": "Саженец мангового дерева", "block.unicopia.pineapple": "Ананас", - + + "block.unicopia.clam_shell": "Раковина моллюска", + "block.unicopia.scallop_shell": "Раковина гребешка", + "block.unicopia.turret_shell": "Раковина туррителлы", + "block.unicopia.green_apple_leaves": "Листья яблони Гренни Смит", "block.unicopia.green_apple_sapling": "Саженец яблони Гренни Смит", "block.unicopia.green_apple_sprout": "Росток яблони Гренни Смит", @@ -257,6 +272,7 @@ "block.unicopia.chiselled_chitin_slab": "Резная хитиновая плита", "block.unicopia.chiselled_chitin_stairs": "Резные хитиновые ступеньки", + "block.unicopia.shaping_bench": "Стенд формоизменения", "block.unicopia.cloud": "Облако", "block.unicopia.cloud_slab": "Плита из облака", "block.unicopia.cloud_stairs": "Ступеньки из облака", @@ -496,6 +512,7 @@ "ability.unicopia.peck.block.unfased": "Блок не обращает внимания на ваши угрозы", "ability.unicopia.dash": "Рывок", "ability.unicopia.change_form": "Изменить форму", + "ability.unicopia.sonar_pulse": "Сонарный импульс", "gui.unicopia.trait.label": "Элемент %s", "gui.unicopia.trait.group": "\n %s", @@ -740,7 +757,7 @@ "experience.unicopia.twisted.faustian_legend": "Тёмная личность легенды", "experience.unicopia.corrupt.faustian_legend": "Старый Бог", "experience.unicopia.monstrous.faustian_legend": "Потусторонний ужас", - + "unicopia.category.name": "Способности пони", "key.unicopia.primary": "Первичная способность", @@ -959,7 +976,9 @@ "unicopia.subtitle.insects": "Насекомые снуют", "unicopia.subtitle.changeling_buzz": "Жужжание дронов", "unicopia.subtitle.batpony_eeee": "Бэтпони кричит", + "unicopia.subtitle.sonar": "Сонарные импульсы", "unicopia.subtitle.changeling.transform": "Чейнджлинг трансформируется", + "unicopia.subtitle.screech": "Гиппогриф кричит", "unicopia.subtitle.pegasus.molt": "Пегас теряет перо", "unicopia.subtitle.unicorn.teleport": "Звук магии", "unicopia.subtitle.player.wololo": "Вололо!", @@ -1014,7 +1033,7 @@ "advancements.unicopia.lightning_bug.title": "Ошибка молнии", "advancements.unicopia.lightning_bug.description": "Привлеките 10 ударов молний", "advancements.unicopia.jar.title": "О, ничего себе. Что это?", - "advancements.unicopia.jar.description": "Найдите пустую банку", + "advancements.unicopia.jar.description": "Найдите пустую банку", "advancements.unicopia.gotcha.title": "Попался!", "advancements.unicopia.gotcha.description": "Захватите бурю", "advancements.unicopia.trick_apple.title": "Яблоко раздора", From d88c0d0755f9e301f3627b24c3097ad78de69c3e Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 24 Nov 2023 15:43:36 +0000 Subject: [PATCH 62/90] Start moving pony diet information to data packs --- .../unicopia/item/ZapAppleItem.java | 3 +- .../unicopia/item/toxin/Ailment.java | 2 +- .../unicopia/item/toxin/Toxic.java | 31 ++- .../item/toxin/ToxicRegistryEntry.java | 3 +- .../unicopia/item/toxin/Toxicity.java | 12 +- .../unicopia/item/toxin/Toxics.java | 177 +++--------------- .../unicopia/item/toxin/Toxin.java | 26 ++- .../unicopia/item/toxin/UFoodComponents.java | 4 + .../data/unicopia/diets/alicorn.json | 65 +++++++ .../resources/data/unicopia/diets/bat.json | 153 +++++++++++++++ .../data/unicopia/diets/changeling.json | 151 +++++++++++++++ .../resources/data/unicopia/diets/earth.json | 39 ++++ .../diets/food_effects/fish/cooked.json | 13 ++ .../unicopia/diets/food_effects/fish/raw.json | 19 ++ .../diets/food_effects/fish/rotten.json | 20 ++ .../diets/food_effects/foraging/blinding.json | 22 +++ .../food_effects/foraging/dangerous.json | 18 ++ .../diets/food_effects/foraging/edible.json | 11 ++ .../food_effects/foraging/edible_filling.json | 11 ++ .../diets/food_effects/foraging/moderate.json | 18 ++ .../food_effects/foraging/nauseating.json | 23 +++ .../diets/food_effects/foraging/prickly.json | 18 ++ .../food_effects/foraging/radioactive.json | 23 +++ .../diets/food_effects/foraging/risky.json | 18 ++ .../foraging/severely_nauseating.json | 22 +++ .../foraging/severely_prickly.json | 22 +++ .../food_effects/foraging/strengthening.json | 23 +++ .../diets/food_effects/insect/cooked.json | 13 ++ .../diets/food_effects/insect/raw.json | 13 ++ .../diets/food_effects/meat/cooked.json | 13 ++ .../unicopia/diets/food_effects/meat/raw.json | 20 ++ .../diets/food_effects/meat/rotten.json | 20 ++ .../unicopia/diets/food_effects/pinecone.json | 12 ++ .../data/unicopia/diets/hippogriff.json | 91 +++++++++ .../resources/data/unicopia/diets/human.json | 22 +++ .../resources/data/unicopia/diets/kirin.json | 68 +++++++ .../data/unicopia/diets/pegasus.json | 67 +++++++ .../data/unicopia/diets/seapony.json | 111 +++++++++++ .../data/unicopia/diets/unicorn.json | 33 ++++ 39 files changed, 1261 insertions(+), 169 deletions(-) create mode 100644 src/main/resources/data/unicopia/diets/alicorn.json create mode 100644 src/main/resources/data/unicopia/diets/bat.json create mode 100644 src/main/resources/data/unicopia/diets/changeling.json create mode 100644 src/main/resources/data/unicopia/diets/earth.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/fish/cooked.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/fish/raw.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/fish/rotten.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/blinding.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/dangerous.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/edible.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/edible_filling.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/moderate.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/nauseating.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/prickly.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/radioactive.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/risky.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/severely_nauseating.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/severely_prickly.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/strengthening.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/insect/cooked.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/insect/raw.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/meat/cooked.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/meat/raw.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/meat/rotten.json create mode 100644 src/main/resources/data/unicopia/diets/food_effects/pinecone.json create mode 100644 src/main/resources/data/unicopia/diets/hippogriff.json create mode 100644 src/main/resources/data/unicopia/diets/human.json create mode 100644 src/main/resources/data/unicopia/diets/kirin.json create mode 100644 src/main/resources/data/unicopia/diets/pegasus.json create mode 100644 src/main/resources/data/unicopia/diets/seapony.json create mode 100644 src/main/resources/data/unicopia/diets/unicorn.json diff --git a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java index ea0c241e..9d104e56 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java @@ -117,9 +117,10 @@ public class ZapAppleItem extends Item implements ChameleonItem, ToxicHolder, Mu return hasAppearance(stack) ? getAppearanceStack(stack).getName() : super.getName(stack); } + @SuppressWarnings("deprecation") @Override public Toxic getToxic(ItemStack stack, LivingEntity entity) { - return hasAppearance(stack) ? Toxics.SEVERE_INNERT : Toxics.FORAGE_EDIBLE; + return hasAppearance(stack) ? Toxic.SEVERE_INNERT : Toxics.FORAGE_EDIBLE; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java index ccd9aade..8da95eff 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java @@ -4,7 +4,6 @@ import java.util.*; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.entity.player.Pony; - import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; @@ -20,6 +19,7 @@ public record Ailment ( ) { public static final Ailment INNERT = of(Toxicity.SAFE, Toxin.INNERT); + @Deprecated public static Ailment of(Toxicity toxicity, Toxin effect) { return new Ailment(toxicity, effect); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java index 2a57be3d..9ae67b13 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java @@ -1,11 +1,12 @@ package com.minelittlepony.unicopia.item.toxin; +import static com.minelittlepony.unicopia.item.toxin.Toxicity.FAIR; +import static com.minelittlepony.unicopia.item.toxin.Toxicity.SEVERE; import java.util.*; import java.util.function.Function; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.entity.player.Pony; - import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; @@ -20,6 +21,18 @@ public record Toxic ( Function> food, Ailment.Set ailment ) { + public static final Toxic EMPTY = new Toxic(Optional.empty(), entity -> Optional.empty(), Ailment.Set.EMPTY); + /** + * Default for all food that doesn't have a mapping + */ + @Deprecated + public static final Toxic DEFAULT = new Toxic.Builder(Ailment.INNERT) + .with(Race.CHANGELING, new Ailment(FAIR, Toxin.LOVE_SICKNESS)) + .with(Race.SEAPONY, new Ailment(FAIR, Toxin.FOOD_POISONING)) + .build(); + + public static final Toxic SEVERE_INNERT = new Builder(new Ailment(SEVERE, Toxin.INNERT)).build(); + public void appendTooltip(PlayerEntity player, List tooltip, TooltipContext context) { ailment.get(player).ifPresent(ailment -> ailment.appendTooltip(tooltip, context)); } @@ -31,10 +44,7 @@ public record Toxic ( return stack; } - public static Toxic innert(Toxicity toxicity) { - return new Builder(Ailment.of(toxicity, Toxin.INNERT)).build(); - } - + @Deprecated public static class Builder { private final Ailment def; private final Map overrides = new HashMap<>(); @@ -66,6 +76,13 @@ public record Toxic ( return this; } + public Builder with(Ailment ailment, Race... races) { + for (Race race : races) { + overrides.put(race, ailment); + } + return this; + } + public Toxic build() { return new Toxic(action, entity -> { if (entity instanceof PlayerEntity player) { @@ -74,9 +91,5 @@ public record Toxic ( return component; }, Ailment.Set.of(def, overrides)); } - - public Optional buildOptional() { - return Optional.of(build()); - } } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicRegistryEntry.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicRegistryEntry.java index 2db1d93f..7c4e51ba 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicRegistryEntry.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicRegistryEntry.java @@ -3,14 +3,13 @@ package com.minelittlepony.unicopia.item.toxin; import net.minecraft.item.Item; import net.minecraft.registry.tag.TagKey; +@Deprecated public record ToxicRegistryEntry ( Toxic value, TagKey tag ) { - @SuppressWarnings("deprecation") public boolean matches(Item item) { return item.getRegistryEntry().isIn(tag); } - } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxicity.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxicity.java index f901adac..43355b79 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxicity.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxicity.java @@ -1,14 +1,16 @@ package com.minelittlepony.unicopia.item.toxin; import java.util.Arrays; +import java.util.Locale; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import net.minecraft.util.StringIdentifiable; -public enum Toxicity { +public enum Toxicity implements StringIdentifiable { SAFE(Formatting.GRAY), MILD(Formatting.DARK_AQUA), FAIR(Formatting.DARK_BLUE), @@ -16,8 +18,11 @@ public enum Toxicity { LETHAL(Formatting.RED); private static final Map REGISTRY = Arrays.stream(values()).collect(Collectors.toMap(Toxicity::name, Function.identity())); + @SuppressWarnings("deprecation") + public static final Codec CODEC = StringIdentifiable.createCodec(Toxicity::values); private final Formatting color; + private final String name = name().toLowerCase(Locale.ROOT); Toxicity(Formatting color) { this.color = color; @@ -34,4 +39,9 @@ public enum Toxicity { public static Toxicity byName(String name) { return REGISTRY.get(name.toUpperCase()); } + + @Override + public String asString() { + return name; + } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java index 5e5bf92f..30e0a97f 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java @@ -11,157 +11,40 @@ import static com.minelittlepony.unicopia.item.toxin.Toxicity.*; import static com.minelittlepony.unicopia.item.toxin.Ailment.*; import static com.minelittlepony.unicopia.item.toxin.Toxin.*; -import java.util.Optional; import org.jetbrains.annotations.Nullable; +@Deprecated public interface Toxics { Registry REGISTRY = RegistryUtils.createSimple(Unicopia.id("toxic")); + Toxic FORAGE_EDIBLE = register("forage_edible", new Toxic.Builder(Ailment.INNERT).food(UFoodComponents.RANDOM_FOLIAGE).with(Race.HUMAN, of(LETHAL, FOOD_POISONING)).with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)).with(Race.SEAPONY, of(FAIR, FOOD_POISONING))); - Toxic EMPTY = new Toxic(Optional.empty(), entity -> Optional.empty(), Ailment.Set.EMPTY); - - Toxic SEVERE_INNERT = Toxic.innert(Toxicity.SEVERE); - - Toxic EDIBLE = register("edible", new Toxic.Builder(Ailment.INNERT) - .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) - .with(Race.SEAPONY, of(FAIR, FOOD_POISONING)) - ); - - Toxic FORAGE_EDIBLE = register("forage_edible", new Toxic.Builder(Ailment.INNERT) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) - .with(Race.SEAPONY, of(FAIR, FOOD_POISONING)) - ); - - Toxic FORAGE_EDIBLE_FILLING = register("forage_edible_filling", new Toxic.Builder(Ailment.INNERT) - .food(UFoodComponents.RANDOM_FOLIAGE_FILLING) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) - ); - - Toxic FORAGE_RISKY = register("forage_risky", new Toxic.Builder(of(FAIR, FOOD_POISONING.withChance(20))) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - ); - Toxic FORAGE_MODERATE = register("forage_moderate", new Toxic.Builder(of(MILD, FOOD_POISONING)) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, STRONG_FOOD_POISONING)) - ); - Toxic FORAGE_DANGEROUS = register("forage_dangerous", new Toxic.Builder(of(SEVERE, FOOD_POISONING)) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - ); - Toxic FORAGE_NAUSEATING = register("forage_nauseating", new Toxic.Builder(of(SAFE, FOOD_POISONING.and(WEAKNESS.withChance(30)))) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - ); - Toxic FORAGE_RADIOACTIVE = register("forage_radioactive", new Toxic.Builder(of(SAFE, FOOD_POISONING.and(GLOWING.withChance(30)))) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - ); - Toxic FORAGE_PRICKLY = register("forage_prickly", new Toxic.Builder(of(SAFE, INSTANT_DAMAGE.withChance(30))) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - .with(Race.HIPPOGRIFF, Ailment.INNERT) - .with(Race.KIRIN, Ailment.INNERT) - ); - Toxic FORAGE_STRENGHTENING = register("forage_strengthening", new Toxic.Builder(of(SEVERE, STRENGTH.and(FOOD_POISONING))) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING.and(WEAKNESS))) - .with(Race.KIRIN, Ailment.INNERT) - ); - Toxic FORAGE_SEVERELY_NAUSEATING = register("forage_severely_nauseating", new Toxic.Builder(of(SEVERE, FOOD_POISONING.and(WEAKNESS))) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING.and(WEAKNESS))) - ); - Toxic FORAGE_BLINDING = register("forage_blinding", new Toxic.Builder(of(SEVERE, BLINDNESS.and(FOOD_POISONING))) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - .with(Race.KIRIN, Ailment.INNERT) - ); - Toxic FORAGE_SEVERELY_PRICKLY = register("forage_severely_prickly", new Toxic.Builder(of(SEVERE, FOOD_POISONING.and(INSTANT_DAMAGE))) - .food(UFoodComponents.RANDOM_FOLIAGE) - .with(Race.HUMAN, of(LETHAL, FOOD_POISONING)) - .with(Race.KIRIN, Ailment.INNERT) - ); - Toxic RAW_MEAT = register("raw_meat", new Toxic.Builder(of(SEVERE, FOOD_POISONING.withChance(5).and(CHANCE_OF_POISON))) - .with(Race.HUMAN, Ailment.INNERT) - .with(Race.CHANGELING, Ailment.INNERT) - .with(Race.BAT, of(MILD, FOOD_POISONING)) - .with(Race.KIRIN, Ailment.INNERT) - ); - Toxic ROTTEN_MEAT = register("rotten_meat", new Toxic.Builder(of(SEVERE, STRONG_FOOD_POISONING)) - .with(Race.HUMAN, Ailment.INNERT) - .with(Race.BAT, of(MILD, FOOD_POISONING)) - .with(Race.CHANGELING, Ailment.INNERT) - ); - Toxic COOKED_MEAT = register("cooked_meat", new Toxic.Builder(of(FAIR, FOOD_POISONING)) - .with(Race.HUMAN, Ailment.INNERT) - .with(Race.CHANGELING, Ailment.INNERT) - .with(Race.HIPPOGRIFF, of(MILD, FOOD_POISONING)) - .with(Race.BAT, Ailment.INNERT) - .with(Race.KIRIN, Ailment.INNERT) - ); - - Toxic RAW_FISH = register("raw_fish", new Toxic.Builder(of(FAIR, FOOD_POISONING.and(CHANCE_OF_POISON))) - .with(Race.HUMAN, Ailment.INNERT) - .with(Race.PEGASUS, of(MILD, FOOD_POISONING)) - .with(Race.HIPPOGRIFF, Ailment.INNERT) - .with(Race.SEAPONY, Ailment.INNERT) - .with(Race.ALICORN, Ailment.INNERT) - .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) - ); - Toxic COOKED_FISH = register("cooked_fish", new Toxic.Builder(of(MILD, FOOD_POISONING)) - .with(Race.HUMAN, Ailment.INNERT) - .with(Race.PEGASUS, Ailment.INNERT) - .with(Race.HIPPOGRIFF, Ailment.INNERT) - .with(Race.SEAPONY, Ailment.INNERT) - .with(Race.ALICORN, Ailment.INNERT) - .with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)) - ); - - Toxic RAW_INSECT = register("raw_insect", new Toxic.Builder(of(LETHAL, FOOD_POISONING)) - .with(Race.BAT, of(MILD, WEAK_FOOD_POISONING)) - .with(Race.CHANGELING, Ailment.INNERT) - ); - - Toxic COOKED_INSECT = register("cooked_insect", new Toxic.Builder(of(LETHAL, FOOD_POISONING)) - .food(UFoodComponents.INSECTS) - .with(Race.CHANGELING, Ailment.INNERT) - .with(Race.KIRIN, Ailment.INNERT) - .with(Race.BAT, Ailment.INNERT) - ); - - Toxic LOVE = register("love", new Toxic.Builder(Ailment.INNERT) - .with(Race.CHANGELING, of(Toxicity.SAFE, Toxin.LOVE_CONSUMPTION)) - ); - - Toxic PINECONE = register("pinecone", new Toxic.Builder(of(Toxicity.SAFE, Toxin.healing(1))) - .with(Race.HUMAN, Ailment.INNERT) - .with(Race.HIPPOGRIFF, of(Toxicity.SAFE, Toxin.healing(3))) - ); - - Toxic BAT_PONYS_DELIGHT = register("bat_ponys_delight", new Toxic.Builder(Ailment.INNERT) - .with(Race.BAT, of(Toxicity.SAFE, Toxin.BAT_PONY_INTOXICATION)) - ); - - Toxic RAW_SEA_VEGITABLES = register("raw_sea_vegitable", new Toxic.Builder(Ailment.INNERT) - .food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE) - ); - - Toxic COOKED_SEA_VEGITABLES = register("cooked_sea_vegitable", new Toxic.Builder(Ailment.INNERT) - .food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE_FILLING) - ); - - Toxic SHELLS = register("shells", new Toxic.Builder(Ailment.INNERT) - .food(Race.SEAPONY, UFoodComponents.SHELL) - ); - - Toxic SHELLY = register("shelly", new Toxic.Builder(Ailment.INNERT) - .food(Race.SEAPONY, UFoodComponents.SHELLY) - ); - - static void bootstrap() {} + static void bootstrap() { + register("forage_edible_filling", new Toxic.Builder(Ailment.INNERT).food(UFoodComponents.RANDOM_FOLIAGE_FILLING).with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)).with(Race.SEAPONY, of(FAIR, FOOD_POISONING))); + register("forage_risky", new Toxic.Builder(of(FAIR, FOOD_POISONING.withChance(20))).food(UFoodComponents.RANDOM_FOLIAGE)); + register("forage_moderate", new Toxic.Builder(of(MILD, FOOD_POISONING)).food(UFoodComponents.RANDOM_FOLIAGE)); + register("forage_dangerous", new Toxic.Builder(of(SEVERE, FOOD_POISONING)).food(UFoodComponents.RANDOM_FOLIAGE)); + register("forage_nauseating", new Toxic.Builder(of(SAFE, FOOD_POISONING.and(WEAKNESS.withChance(30)))).food(UFoodComponents.RANDOM_FOLIAGE)); + register("forage_radioactive", new Toxic.Builder(of(SAFE, FOOD_POISONING.and(GLOWING.withChance(30)))).food(UFoodComponents.RANDOM_FOLIAGE)); + register("forage_prickly", new Toxic.Builder(of(SAFE, INSTANT_DAMAGE.withChance(30))).food(UFoodComponents.RANDOM_FOLIAGE).with(Ailment.INNERT, Race.HIPPOGRIFF, Race.KIRIN)); + register("forage_strengthening", new Toxic.Builder(of(SEVERE, STRENGTH.and(FOOD_POISONING))).food(UFoodComponents.RANDOM_FOLIAGE).with(Race.KIRIN, Ailment.INNERT)); + register("forage_severely_nauseating", new Toxic.Builder(of(SEVERE, FOOD_POISONING.and(WEAKNESS))).food(UFoodComponents.RANDOM_FOLIAGE)); + register("forage_blinding", new Toxic.Builder(of(SEVERE, BLINDNESS.and(FOOD_POISONING))).food(UFoodComponents.RANDOM_FOLIAGE).with(Race.KIRIN, Ailment.INNERT)); + register("forage_severely_prickly", new Toxic.Builder(of(SEVERE, FOOD_POISONING.and(INSTANT_DAMAGE))).food(UFoodComponents.RANDOM_FOLIAGE).with(Race.KIRIN, Ailment.INNERT)); + register("raw_meat", new Toxic.Builder(of(SEVERE, FOOD_POISONING.withChance(5).and(CHANCE_OF_POISON))).with(Ailment.INNERT, Race.HUMAN, Race.CHANGELING, Race.KIRIN).with(of(MILD, FOOD_POISONING), Race.BAT)); + register("rotten_meat", new Toxic.Builder(of(SEVERE, STRONG_FOOD_POISONING)).with(Ailment.INNERT, Race.HUMAN, Race.CHANGELING).with(of(MILD, FOOD_POISONING), Race.BAT)); + register("cooked_meat", new Toxic.Builder(of(FAIR, FOOD_POISONING)).with(Ailment.INNERT, Race.HUMAN, Race.CHANGELING, Race.BAT, Race.KIRIN).with(of(MILD, FOOD_POISONING), Race.HIPPOGRIFF)); + register("raw_fish", new Toxic.Builder(of(FAIR, FOOD_POISONING.and(CHANCE_OF_POISON))).with(Ailment.INNERT, Race.HUMAN, Race.HIPPOGRIFF, Race.SEAPONY, Race.ALICORN).with(of(MILD, FOOD_POISONING), Race.PEGASUS).with(of(FAIR, LOVE_SICKNESS), Race.CHANGELING)); + register("cooked_fish", new Toxic.Builder(of(MILD, FOOD_POISONING)).with(Ailment.INNERT, Race.HUMAN, Race.PEGASUS, Race.HIPPOGRIFF, Race.SEAPONY, Race.ALICORN).with(of(FAIR, LOVE_SICKNESS), Race.CHANGELING)); + register("raw_insect", new Toxic.Builder(of(LETHAL, FOOD_POISONING)).food(UFoodComponents.INSECTS).with(Ailment.INNERT, Race.CHANGELING).with(of(MILD, WEAK_FOOD_POISONING), Race.BAT)); + register("cooked_insect", new Toxic.Builder(of(LETHAL, FOOD_POISONING)).food(UFoodComponents.INSECTS).with(Ailment.INNERT, Race.CHANGELING, Race.KIRIN, Race.BAT)); + register("love", new Toxic.Builder(Ailment.INNERT).with(of(Toxicity.SAFE, Toxin.LOVE_CONSUMPTION), Race.CHANGELING)); + register("bat_ponys_delight", new Toxic.Builder(Ailment.INNERT).with(of(Toxicity.SAFE, Toxin.BAT_PONY_INTOXICATION), Race.BAT)); + register("raw_sea_vegitable", new Toxic.Builder(Ailment.INNERT).food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE)); + register("cooked_sea_vegitable", new Toxic.Builder(Ailment.INNERT).food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE_FILLING)); + register("shells", new Toxic.Builder(Ailment.INNERT).food(Race.SEAPONY, UFoodComponents.SHELL)); + register("shelly", new Toxic.Builder(Ailment.INNERT).food(Race.SEAPONY, UFoodComponents.SHELLY)); + register("pinecone", new Toxic.Builder(of(Toxicity.SAFE, Toxin.healing(1))).with(Ailment.INNERT, Race.HUMAN).with(of(Toxicity.SAFE, Toxin.healing(3)), Race.HIPPOGRIFF)); + } static Toxic register(String name, Toxic.Builder builder) { return Registry.register(REGISTRY, Unicopia.id(name), new ToxicRegistryEntry(builder.build(), UTags.item("food_types/" + name))).value(); @@ -177,6 +60,6 @@ public interface Toxics { t.food().apply(entity).ifPresent(item::setFoodComponent); } return t; - }).findFirst().orElse(food == null ? Toxics.EMPTY : Toxics.EDIBLE); + }).findFirst().orElse(food == null ? Toxic.EMPTY : Toxic.DEFAULT); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java index 041dbe0d..36cbe1f8 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java @@ -3,7 +3,6 @@ package com.minelittlepony.unicopia.item.toxin; import java.util.List; import com.minelittlepony.unicopia.entity.effect.UEffects; - import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; @@ -15,41 +14,48 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.StringHelper; import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Difficulty; public interface Toxin extends Affliction { - Predicate IF_NOT_PEACEFUL = Predicate.of(Text.of("when not in peaceful "), (player, stack) -> player.getWorld().getDifficulty() != Difficulty.PEACEFUL); - Toxin INNERT = of(Text.of("No Effect"), (player, stack) -> {}); - + @Deprecated Toxin INSTANT_DAMAGE = of(StatusEffects.INSTANT_DAMAGE, 1, 0); + @Deprecated Toxin GLOWING = of(StatusEffects.GLOWING, 15, 0); - + @Deprecated Toxin WEAKNESS = of(StatusEffects.WEAKNESS, 200, 1); - + @Deprecated Toxin STRENGTH = of(StatusEffects.STRENGTH, 30, 0); + @Deprecated Toxin BLINDNESS = of(StatusEffects.BLINDNESS, 30, 0); + @Deprecated Toxin CHANCE_OF_POISON = of(StatusEffects.POISON, 45, 2).withChance(80); + @Deprecated Toxin FOOD_POISONING = of(UEffects.FOOD_POISONING, 100, 2); + @Deprecated Toxin WEAK_FOOD_POISONING = of(UEffects.FOOD_POISONING, 50, 1); + @Deprecated Toxin STRONG_FOOD_POISONING = of(UEffects.FOOD_POISONING, 400, 3); + @Deprecated Toxin LOVE_SICKNESS = of(Text.of("Love Sickness "), (player, stack) -> { FoodComponent food = stack.getItem().getFoodComponent(); player.getHungerManager().add(-food.getHunger()/2, -food.getSaturationModifier()/2); - }).and(FOOD_POISONING).and(IF_NOT_PEACEFUL.then(WEAK_FOOD_POISONING.withChance(20))).and(WEAKNESS); + }).and(FOOD_POISONING).and(WEAKNESS); + @Deprecated Toxin LOVE_CONSUMPTION = of(Text.literal("Love"), (player, stack) -> { player.heal(stack.isFood() ? stack.getItem().getFoodComponent().getHunger() : 1); player.removeStatusEffect(StatusEffects.NAUSEA); player.removeStatusEffect(UEffects.FOOD_POISONING); }); + @Deprecated Toxin BAT_PONY_INTOXICATION = Toxin.of(StatusEffects.HEALTH_BOOST, 30, 60, 2, 6) .and(Toxin.of(StatusEffects.JUMP_BOOST, 30, 60, 1, 6)) .and(Toxin.of(StatusEffects.SPEED, 30, 30, 1, 6)) .and(Toxin.of(StatusEffects.REGENERATION, 3, 30, 3, 6)); + @Deprecated static Toxin healing(int hearts) { return of(Text.literal("Healing " + hearts + " Hearts"), (player, stack) -> player.heal(hearts)); } @@ -58,12 +64,14 @@ public interface Toxin extends Affliction { tooltip.add(getName()); } + @Deprecated default Toxin withChance(int max) { return Predicate.of(Text.of("1 in " + max + " chance of "), (player, stack) -> player.getWorld().random.nextInt(max) == 0).then(this); } Text getName(); + @Deprecated default Toxin and(Toxin other) { Toxin self = this; return new Toxin() { @@ -86,6 +94,7 @@ public interface Toxin extends Affliction { }; } + @Deprecated static Toxin of(Text name, Affliction affliction) { return new Toxin() { @Override @@ -100,6 +109,7 @@ public interface Toxin extends Affliction { }; } + @Deprecated static Toxin of(StatusEffect effect, int seconds, int amplifier) { return of(effect, seconds, -1, amplifier, -1); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java index 987d0a46..4d71bd2f 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java @@ -23,7 +23,9 @@ public interface UFoodComponents { FoodComponent JUICE = builder(2, 1.8F).alwaysEdible().build(); FoodComponent BURNED_JUICE = builder(3, 1).build(); + @Deprecated FoodComponent RANDOM_FOLIAGE = builder(2, 1).build(); + @Deprecated FoodComponent RANDOM_FOLIAGE_FILLING = builder(18, 1).build(); FoodComponent WORMS = builder(1, 1.5F).alwaysEdible().meat().build(); FoodComponent INSECTS = builder(1, 0).alwaysEdible().build(); @@ -51,7 +53,9 @@ public interface UFoodComponents { FoodComponent CANDY = builder(7, 0.9F).alwaysEdible().build(); FoodComponent SALT_CUBE = builder(0, 2.9F).alwaysEdible().build(); + @Deprecated FoodComponent SHELL = builder(3, 5).build(); + @Deprecated FoodComponent SHELLY = builder(6, 7).build(); static FoodComponent.Builder builder(int hunger, float saturation) { diff --git a/src/main/resources/data/unicopia/diets/alicorn.json b/src/main/resources/data/unicopia/diets/alicorn.json new file mode 100644 index 00000000..76cdea56 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/alicorn.json @@ -0,0 +1,65 @@ +{ + "default_multiplier": 0.8, + "foraging_multiplier": 1, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/cooked_fish" + ], + "hunger": 1.5, + "saturation": 1.5 + }, + { + "tags": [ + "unicopia:food_types/raw_fish" + ], + "hunger": 0.5, + "saturation": 0.6 + }, + { + "tags": [ + "unicopia:food_types/cooked_insect", + "unicopia:food_types/cooked_meat" + ], + "hunger": 0.1, + "saturation": 0.1 + }, + { + "tags": [ + "unicopia:food_types/love", + "unicopia:food_types/raw_insect", + "unicopia:food_types/raw_meat", + "unicopia:food_types/rotten_meat" + ], + "hunger": 0, + "saturation": 0 + }, + { + "tags": [ + "unicopia:food_types/pinecone" + ], + "hunger": 0.9, + "saturation": 0.9 + } + ], + "effects": [ + { + "tag": "unicopia:food_types/cooked_fish", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/raw_fish", + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/bat.json b/src/main/resources/data/unicopia/diets/bat.json new file mode 100644 index 00000000..e00adbee --- /dev/null +++ b/src/main/resources/data/unicopia/diets/bat.json @@ -0,0 +1,153 @@ +{ + "default_multiplier": 0.5, + "foraging_multiplier": 0.9, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/cooked_fish" + ], + "hunger": 0.75, + "saturation": 0.75 + }, + { + "tags": [ + "unicopia:food_types/raw_fish" + ], + "hunger": 0.5, + "saturation": 0.6 + }, + { + "tags": [ + "unicopia:food_types/cooked_insect" + ], + "hunger": 1.75, + "saturation": 1.75 + }, + { + "tags": [ + "unicopia:food_types/cooked_meat" + ], + "hunger": 1.15, + "saturation": 1.15 + }, + { + "tags": [ + "unicopia:food_types/raw_insect" + ], + "hunger": 1, + "saturation": 1 + }, + { + "tags": [ + "unicopia:food_types/raw_meat" + ], + "hunger": 0.25, + "saturation": 0.25 + }, + { + "tags": [ + "unicopia:food_types/rotten_meat" + ], + "hunger": 0.2, + "saturation": 0.2 + }, + { + "tags": [ + "unicopia:food_types/love" + ], + "hunger": 0, + "saturation": 0 + }, + { + "tags": [ + "unicopia:food_types/pinecone" + ], + "hunger": 0.9, + "saturation": 0.9 + } + ], + "effects": [ + { + "tag": "unicopia:food_types/rotten_fish", + "ailment": { + "toxicity": "mild", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2, + "chance": 5 + } + ] + } + }, + { + "tags": [ + "unicopia:food_types/cooked_insect", + "unicopia:food_types/cooked_meat" + ], + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/raw_insect", + "ailment": { + "toxicity": "mild", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 50, + "amplifier": 1 + } + ] + } + }, + { + "tags": [ + "unicopia:food_types/raw_meat", + "unicopia:food_types/rotten_meat" + ], + "ailment": { + "toxicity": "risky", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2, + "chance": 5 + } + ] + } + }, + { + "tag": "unicopia:food_types/bat_ponys_delight", + "ailment": { + "toxicity": "safe", + "effects": [ + { + "effect": "minecraft:health_boost", + "seconds": { "min": 30, "max": 60 }, + "amplifier": { "min": 2, "max": 6 } + }, + { + "effect": "minecraft:jump_boost", + "seconds": { "min": 30, "max": 60 }, + "amplifier": { "min": 1, "max": 6 } + }, + { + "effect": "minecraft:health_boost", + "seconds": 30, + "amplifier": { "min": 1, "max": 6 } + }, + { + "effect": "minecraft:regeneration", + "seconds": { "min": 3, "max": 30 }, + "amplifier": { "min": 3, "max": 6 } + } + ] + } + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/changeling.json b/src/main/resources/data/unicopia/diets/changeling.json new file mode 100644 index 00000000..f4e04ebe --- /dev/null +++ b/src/main/resources/data/unicopia/diets/changeling.json @@ -0,0 +1,151 @@ +{ + "default_multiplier": 0.15, + "foraging_multiplier": 0, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/cooked_insect" + ], + "hunger": 0.3, + "saturation": 0.3 + }, + { + "tags": [ + "unicopia:food_types/cooked_meat" + ], + "hunger": 0.1, + "saturation": 0.1 + }, + { + "tags": [ + "unicopia:food_types/raw_insect" + ], + "hunger": 1, + "saturation": 1 + }, + { + "tags": [ + "unicopia:food_types/raw_meat" + ], + "hunger": 0.25, + "saturation": 0.25 + }, + { + "tags": [ + "unicopia:food_types/rotten_meat" + ], + "hunger": 0.6, + "saturation": 0.6 + }, + { + "tags": [ + "unicopia:food_types/love" + ], + "hunger": 1, + "saturation": 1 + } + ], + "default_effects": { + "toxicity": "fair", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + }, + { + "effect": "minecraft:weakness", + "seconds": 200, + "amplifier": 1 + }, + { + "type": "unicopia:multiply_hunger", + "multiplier": 0.5 + } + ] + }, + "effects": [ + { + "tags": [ + "unicopia:food_types/love" + ], + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [ + { + "name": "Love Consumption", + "type": "unicopia:clear_love_sickness" + } + ] + } + }, + { + "tags": [ + "unicopia:food_types/cooked_fish", + "unicopia:food_types/raw_fish" + ], + "ailment": { + "toxicity": "fair", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 50, + "amplifier": 2 + }, + { + "name": "unicopia.affliction.love_sickness", + "type": "unicopia:multiply_hunger", + "multiplier": 0.5 + } + ] + } + }, + { + "tags": [ + "unicopia:food_types/rotten_fish", + "unicopia:food_types/cooked_insect", + "unicopia:food_types/raw_insect", + "unicopia:food_types/cooked_meat", + "unicopia:food_types/raw_meat", + "unicopia:food_types/rotten_meat" + ], + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tags": [ + "unicopia:food_types/forage_edible", + "unicopia:food_types/forage_edible_filling", + ], + "food_component": { + "hunger": 18, + "saturation": 9 + }, + "ailment": { + "toxicity": "fair", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + }, + { + "effect": "minecraft:weakness", + "seconds": 200, + "amplifier": 1 + }, + { + "type": "unicopia:multiply_hunger", + "multiplier": 0.5 + } + ] + } + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/earth.json b/src/main/resources/data/unicopia/diets/earth.json new file mode 100644 index 00000000..0c429144 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/earth.json @@ -0,0 +1,39 @@ +{ + "default_multiplier": 0.3, + "foraging_multiplier": 1, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/cooked_fish" + ], + "hunger": 0.2, + "saturation": 0.2 + }, + { + "tags": [ + "unicopia:food_types/cooked_insect", + "unicopia:food_types/cooked_meat" + ], + "hunger": 0.1, + "saturation": 0.1 + }, + { + "tags": [ + "unicopia:food_types/love", + "unicopia:food_types/raw_fish", + "unicopia:food_types/raw_insect", + "unicopia:food_types/raw_meat", + "unicopia:food_types/rotten_meat" + ], + "hunger": 0, + "saturation": 0 + }, + { + "tags": [ + "unicopia:food_types/pinecone" + ], + "hunger": 1, + "saturation": 1 + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/food_effects/fish/cooked.json b/src/main/resources/data/unicopia/diets/food_effects/fish/cooked.json new file mode 100644 index 00000000..deb27a4a --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/fish/cooked.json @@ -0,0 +1,13 @@ +{ + "tag": "unicopia:food_types/cooked_fish", + "ailment": { + "toxicity": "fair", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/fish/raw.json b/src/main/resources/data/unicopia/diets/food_effects/fish/raw.json new file mode 100644 index 00000000..49c0fa62 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/fish/raw.json @@ -0,0 +1,19 @@ +{ + "tag": "unicopia:food_types/raw_fish", + "ailment": { + "toxicity": "risky", + "effects": [ + { + "effect": "minecraft:poison", + "seconds": 45, + "amplifier": 2, + "chance": 80 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/fish/rotten.json b/src/main/resources/data/unicopia/diets/food_effects/fish/rotten.json new file mode 100644 index 00000000..6259f9a2 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/fish/rotten.json @@ -0,0 +1,20 @@ +{ + "tag": "unicopia:food_types/rotten_fish", + "ailment": { + "toxicity": "severe", + "effects": [ + { + "effect": "minecraft:poison", + "seconds": 45, + "amplifier": 2, + "chance": 80 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 400, + "amplifier": 3, + "chance": 5 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/blinding.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/blinding.json new file mode 100644 index 00000000..c9d1e15e --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/blinding.json @@ -0,0 +1,22 @@ +{ + "tag": "unicopia:food_types/forage_blinding", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "severe", + "effects": [ + { + "effect": "minecraft:blindness", + "seconds": 30, + "amplifier": 0 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/dangerous.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/dangerous.json new file mode 100644 index 00000000..7ba1dfbb --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/dangerous.json @@ -0,0 +1,18 @@ +{ + "tag": "unicopia:food_types/forage_dangerous", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "mild", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 250, + "amplifier": 2, + "chance": 4 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/edible.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/edible.json new file mode 100644 index 00000000..0142aeab --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/edible.json @@ -0,0 +1,11 @@ +{ + "tag": "unicopia:food_types/forage_edible", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/edible_filling.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/edible_filling.json new file mode 100644 index 00000000..8ee0ec31 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/edible_filling.json @@ -0,0 +1,11 @@ +{ + "tag": "unicopia:food_types/forage_edible_filling", + "food_component": { + "hunger": 18, + "saturation": 9 + }, + "ailment": { + "toxicity": "safe", + "effects": [] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/moderate.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/moderate.json new file mode 100644 index 00000000..1a6682cb --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/moderate.json @@ -0,0 +1,18 @@ +{ + "tag": "unicopia:food_types/forage_moderate", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "mild", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2, + "chance": 40 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/nauseating.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/nauseating.json new file mode 100644 index 00000000..03b8943f --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/nauseating.json @@ -0,0 +1,23 @@ +{ + "tag": "unicopia:food_types/forage_nauseating", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "severe", + "effects": [ + { + "effect": "minecraft:weakness", + "seconds": 200, + "amplifier": 1, + "chance": 30 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/prickly.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/prickly.json new file mode 100644 index 00000000..f341f99c --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/prickly.json @@ -0,0 +1,18 @@ +{ + "tag": "unicopia:food_types/forage_prickly", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [ + { + "effect": "minecraft:instant_damage", + "seconds": 1, + "amplifier": 0, + "chance": 30 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/radioactive.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/radioactive.json new file mode 100644 index 00000000..911aba9d --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/radioactive.json @@ -0,0 +1,23 @@ +{ + "tag": "unicopia:food_types/forage_radioactive", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "severe", + "effects": [ + { + "effect": "minecraft:glowing", + "seconds": 15, + "amplifier": 0, + "chance": 30 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/risky.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/risky.json new file mode 100644 index 00000000..c7053b6d --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/risky.json @@ -0,0 +1,18 @@ +{ + "tag": "unicopia:food_types/forage_risky", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "fair", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2, + "chance": 80 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_nauseating.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_nauseating.json new file mode 100644 index 00000000..fe8dd8a5 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_nauseating.json @@ -0,0 +1,22 @@ +{ + "tag": "unicopia:food_types/forage_severely_nauseating", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "severe", + "effects": [ + { + "effect": "minecraft:weakness", + "seconds": 200, + "amplifier": 1 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_prickly.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_prickly.json new file mode 100644 index 00000000..263e9bdd --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_prickly.json @@ -0,0 +1,22 @@ +{ + "tag": "unicopia:food_types/forage_severely_prickly", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "severe", + "effects": [ + { + "effect": "minecraft:instant_damage", + "seconds": 1, + "amplifier": 0 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/strengthening.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/strengthening.json new file mode 100644 index 00000000..9d12fd6c --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/strengthening.json @@ -0,0 +1,23 @@ +{ + "tag": "unicopia:food_types/forage_strengthening", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [ + { + "effect": "minecraft:strength", + "seconds": 30, + "amplifier": 0 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2, + "chance": 10 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/insect/cooked.json b/src/main/resources/data/unicopia/diets/food_effects/insect/cooked.json new file mode 100644 index 00000000..fe3dcc3d --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/insect/cooked.json @@ -0,0 +1,13 @@ +{ + "tag": "unicopia:food_types/cooked_insect", + "ailment": { + "toxicity": "severe", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/insect/raw.json b/src/main/resources/data/unicopia/diets/food_effects/insect/raw.json new file mode 100644 index 00000000..3d9d2860 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/insect/raw.json @@ -0,0 +1,13 @@ +{ + "tag": "unicopia:food_types/raw_insect", + "ailment": { + "toxicity": "lethal", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/meat/cooked.json b/src/main/resources/data/unicopia/diets/food_effects/meat/cooked.json new file mode 100644 index 00000000..dd186cf3 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/meat/cooked.json @@ -0,0 +1,13 @@ +{ + "tag": "unicopia:food_types/cooked_meat", + "ailment": { + "toxicity": "fair", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/meat/raw.json b/src/main/resources/data/unicopia/diets/food_effects/meat/raw.json new file mode 100644 index 00000000..eb105ca2 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/meat/raw.json @@ -0,0 +1,20 @@ +{ + "tag": "unicopia:food_types/raw_meat", + "ailment": { + "toxicity": "risky", + "effects": [ + { + "effect": "minecraft:poison", + "seconds": 45, + "amplifier": 2, + "chance": 80 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2, + "chance": 5 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/meat/rotten.json b/src/main/resources/data/unicopia/diets/food_effects/meat/rotten.json new file mode 100644 index 00000000..4139359d --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/meat/rotten.json @@ -0,0 +1,20 @@ +{ + "tag": "unicopia:food_types/rotten_meat", + "ailment": { + "toxicity": "severe", + "effects": [ + { + "effect": "minecraft:poison", + "seconds": 45, + "amplifier": 2, + "chance": 80 + }, + { + "effect": "unicopia:food_poisoning", + "seconds": 400, + "amplifier": 3, + "chance": 5 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/pinecone.json b/src/main/resources/data/unicopia/diets/food_effects/pinecone.json new file mode 100644 index 00000000..a57d220d --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/pinecone.json @@ -0,0 +1,12 @@ +{ + "tag": "unicopia:food_types/pinecone", + "ailment": { + "toxicity": "safe", + "effects": [ + { + "type": "unicopia:healing", + "health": 1 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/hippogriff.json b/src/main/resources/data/unicopia/diets/hippogriff.json new file mode 100644 index 00000000..15565d9e --- /dev/null +++ b/src/main/resources/data/unicopia/diets/hippogriff.json @@ -0,0 +1,91 @@ +{ + "default_multiplier": 0.3, + "foraging_multiplier": 0.8, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/cooked_meat", + "unicopia:food_types/cooked_fish" + ], + "hunger": 1.6, + "saturation": 1.6 + }, + { + "tags": [ + "unicopia:food_types/raw_meat", + "unicopia:food_types/raw_fish" + ], + "hunger": 0.6, + "saturation": 0.6 + }, + { + "tags": [ + "unicopia:food_types/rotten_meat" + ], + "hunger": 0.3, + "saturation": 0.3 + }, + { + "tags": [ + "unicopia:food_types/love", + "unicopia:food_types/raw_insect", + "unicopia:food_types/cooked_insect" + ], + "hunger": 0, + "saturation": 0 + }, + { + "tags": [ + "unicopia:food_types/pinecone" + ], + "hunger": 1, + "saturation": 1 + } + ], + "effects": [ + { + "tag": "unicopia:food_types/cooked_fish", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/raw_fish", + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tags": [ + "unicopia:food_types/forage_prickly", + "unicopia:food_types/forage_severely_prickly" + ], + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/pinecone", + "ailment": { + "toxicity": "safe", + "effects": [ + { + "type": "unicopia:healing", + "health": 3 + } + ] + } + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/human.json b/src/main/resources/data/unicopia/diets/human.json new file mode 100644 index 00000000..a36216f0 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/human.json @@ -0,0 +1,22 @@ +{ + "default_multiplier": 1, + "foraging_multiplier": 0, + "multipliers": [ ], + "effects": [ + { + "tags": [ + "unicopia:food_types/cooked_fish", + "unicopia:food_types/raw_fish", + "unicopia:food_types/rotten_fish", + "unicopia:food_types/cooked_meat", + "unicopia:food_types/raw_meat", + "unicopia:food_types/rotten_meat", + "unicopia:food_types/pinecone" + ], + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/kirin.json b/src/main/resources/data/unicopia/diets/kirin.json new file mode 100644 index 00000000..7eaac714 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/kirin.json @@ -0,0 +1,68 @@ +{ + "default_multiplier": 0, + "foraging_multiplier": 0.9, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/cooked_meat" + ], + "hunger": 1.5, + "saturation": 1.5 + }, + { + "tags": [ + "unicopia:food_types/raw_meat" + ], + "hunger": 0.5, + "saturation": 0.6 + }, + { + "tags": [ + "unicopia:food_types/cooked_insect", + "unicopia:food_types/cooked_fish" + ], + "hunger": 0.1, + "saturation": 0.1 + }, + { + "tags": [ + "unicopia:food_types/love", + "unicopia:food_types/raw_insect", + "unicopia:food_types/raw_fish", + "unicopia:food_types/rotten_meat" + ], + "hunger": 0, + "saturation": 0 + }, + { + "tags": [ + "unicopia:food_types/pinecone" + ], + "hunger": 0.9, + "saturation": 0.9 + } + ], + "effects": [ + { + "tags": [ + "unicopia:food_types/rotten_fish", + "unicopia:food_types/cooked_insect", + "unicopia:food_types/cooked_meat", + "unicopia:food_types/raw_meat", + "unicopia:food_types/rotten_meat", + "unicopia:food_types/forage_blinding", + "unicopia:food_types/forage_prickly", + "unicopia:food_types/forage_severely_prickly", + "unicopia:food_types/forage_strengthening" + ], + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/pegasus.json b/src/main/resources/data/unicopia/diets/pegasus.json new file mode 100644 index 00000000..11865b7a --- /dev/null +++ b/src/main/resources/data/unicopia/diets/pegasus.json @@ -0,0 +1,67 @@ +{ + "default_multiplier": 0, + "foraging_multiplier": 1, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/cooked_fish" + ], + "hunger": 1.5, + "saturation": 1.5 + }, + { + "tags": [ + "unicopia:food_types/raw_fish" + ], + "hunger": 0.5, + "saturation": 0.6 + }, + { + "tags": [ + "unicopia:food_types/cooked_insect", + "unicopia:food_types/cooked_meat" + ], + "hunger": 0.1, + "saturation": 0.1 + }, + { + "tags": [ + "unicopia:food_types/love", + "unicopia:food_types/raw_insect", + "unicopia:food_types/raw_meat", + "unicopia:food_types/rotten_meat" + ], + "hunger": 0, + "saturation": 0 + }, + { + "tags": [ + "unicopia:food_types/pinecone" + ], + "hunger": 0.9, + "saturation": 0.9 + } + ], + "effects": [ + { + "tag": "unicopia:food_types/cooked_fish", + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/raw_fish", + "ailment": { + "toxicity": "mild", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 50, + "amplifier": 2 + } + ] + } + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/seapony.json b/src/main/resources/data/unicopia/diets/seapony.json new file mode 100644 index 00000000..ac2e8858 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/seapony.json @@ -0,0 +1,111 @@ +{ + "default_multiplier": 0.5, + "foraging_multiplier": 0.7, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/raw_sea_vegitable" + ], + "hunger": 1, + "saturation": 1 + }, + { + "tags": [ + "unicopia:food_types/shells", + "unicopia:food_types/shelly" + ], + "hunger": 1, + "saturation": 1 + } + ], + "default_effects": { + "toxicity": "fair", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + }, + "effects": [ + { + "tag": "unicopia:food_types/cooked_fish", + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/raw_fish", + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tags": [ + "unicopia:food_types/forage_edible", + "unicopia:food_types/forage_edible_filling", + ], + "food_component": { + "hunger": 18, + "saturation": 9 + }, + "ailment": { + "toxicity": "fair", + "effects": [ + { + "effect": "unicopia:food_poisoning", + "seconds": 100, + "amplifier": 2 + } + ] + } + }, + { + "tag": "unicopia:food_types/raw_sea_vegitable", + "food_component": { + "hunger": 2, + "saturation": 1 + }, + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/cooked_sea_vegitable", + "food_component": { + "hunger": 6, + "saturation": 2 + }, + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/shells", + "food_component": { + "hunger": 3, + "saturation": 5 + }, + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + }, + { + "tag": "unicopia:food_types/shelly", + "food_component": { + "hunger": 6, + "saturation": 7 + }, + "ailment": { + "toxicity": "safe", + "effects": [ ] + } + } + ] +} diff --git a/src/main/resources/data/unicopia/diets/unicorn.json b/src/main/resources/data/unicopia/diets/unicorn.json new file mode 100644 index 00000000..670dcd4e --- /dev/null +++ b/src/main/resources/data/unicopia/diets/unicorn.json @@ -0,0 +1,33 @@ +{ + "default_multiplier": 0.7, + "foraging_multiplier": 1, + "multipliers": [ + { + "tags": [ + "unicopia:food_types/cooked_insect", + "unicopia:food_types/cooked_meat", + "unicopia:food_types/cooked_fish" + ], + "hunger": 0.1, + "saturation": 0.1 + }, + { + "tags": [ + "unicopia:food_types/love", + "unicopia:food_types/raw_insect", + "unicopia:food_types/raw_meat", + "unicopia:food_types/raw_fish", + "unicopia:food_types/rotten_meat" + ], + "hunger": 0, + "saturation": 0 + }, + { + "tags": [ + "unicopia:food_types/pinecone" + ], + "hunger": 0.9, + "saturation": 0.9 + } + ] +} From a1568feab4fe1340a3ec56dbdc3598b1b5a01ef0 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 24 Nov 2023 15:47:38 +0000 Subject: [PATCH 63/90] Added translations for the plunder vine and loot bug --- src/main/resources/assets/unicopia/lang/en_us.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 997b1770..6f45d142 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -58,6 +58,8 @@ "item.unicopia.butterfly_spawn_egg": "Butterfly Spawn Egg", "item.unicopia.butterfly": "Butterfly", + "item.unicopia.loot_bug_spawn_egg": "Loot Bug Spawn Egg", + "item.unicopia.loot_bug": "Loot bug", "item.unicopia.green_apple": "Granny Smith Apple", "item.unicopia.sweet_apple": "Sweet Apple Acres Apple", @@ -213,6 +215,8 @@ "item.unicopia.rainbow_pwr_bed_sheets": "PWR Rainbow Patterned Bed Sheets", "block.unicopia.rocks": "Rocks", + "block.unicopia.plunder_vine": "Plunder Vine", + "block.unicopia.plunder_vine_bud": "Plunder Vine Bud", "block.unicopia.bananas": "Bananas", "block.unicopia.zapling": "Zapling", "block.unicopia.zap_log": "Zap Apple Log", From 9ae1ef13ff184758c91c7a9e840cbeed8388951c Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 24 Nov 2023 16:13:02 +0000 Subject: [PATCH 64/90] Added recipes for the remaining bed sheet patterns --- .../unicopia/recipes/bed_sheets/kelp.json | 18 +++++++++++++ .../recipes/bed_sheets/rainbow_bpw.json | 24 +++++++++++++++++ .../recipes/bed_sheets/rainbow_bpy.json | 24 +++++++++++++++++ .../recipes/bed_sheets/rainbow_pgb.json | 27 +++++++++++++++++++ .../recipes/bed_sheets/rainbow_pwr.json | 24 +++++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/kelp.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_bpw.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_bpy.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_pgb.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_pwr.json diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/kelp.json b/src/main/resources/data/unicopia/recipes/bed_sheets/kelp.json new file mode 100644 index 00000000..31590054 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/kelp.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:kelp" + } + }, + "result": { + "count": 1, + "item": "unicopia:kelp_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_bpw.json b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_bpw.json new file mode 100644 index 00000000..431b5bad --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_bpw.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "PWP", + "B B", + " WP" + ], + "key": { + "B": { + "item": "minecraft:light_blue_wool" + }, + "P": { + "item": "minecraft:pink_wool" + }, + "W": { + "item": "minecraft:white_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:rainbow_bpw_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_bpy.json b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_bpy.json new file mode 100644 index 00000000..f67eb380 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_bpy.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "PBP", + "Y Y", + " BP" + ], + "key": { + "P": { + "item": "minecraft:pink_wool" + }, + "B": { + "item": "minecraft:light_blue_wool" + }, + "Y": { + "item": "minecraft:yellow_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:rainbow_bpy_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_pgb.json b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_pgb.json new file mode 100644 index 00000000..3e61b550 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_pgb.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "WGB", + "P G", + " PW" + ], + "key": { + "P": { + "item": "minecraft:purple_wool" + }, + "W": { + "item": "minecraft:white_wool" + }, + "G": { + "item": "minecraft:light_gray_wool" + }, + "B": { + "item": "minecraft:black_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:rainbow_pbg_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_pwr.json b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_pwr.json new file mode 100644 index 00000000..ba2c76df --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow_pwr.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "WRW", + "P P", + " RW" + ], + "key": { + "P": { + "item": "minecraft:pink_wool" + }, + "W": { + "item": "minecraft:white_wool" + }, + "R": { + "item": "minecraft:red_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:rainbow_pwr_bed_sheets" + } +} \ No newline at end of file From 44578ab4acb7f3f3ce82a2a424ffc33cf852c0b1 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 01:27:18 +0000 Subject: [PATCH 65/90] Add a proper collision box for the shaping bench --- .../block/cloud/ShapingBenchBlock.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java index 624836d9..06c47ceb 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java @@ -2,9 +2,12 @@ package com.minelittlepony.unicopia.block.cloud; import org.jetbrains.annotations.Nullable; +import com.minelittlepony.unicopia.EquineContext; import com.minelittlepony.unicopia.container.ShapingBenchScreenHandler; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.screen.ScreenHandlerContext; @@ -14,13 +17,31 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; import net.minecraft.world.World; public class ShapingBenchBlock extends CloudBlock { + private static final VoxelShape SHAPE = VoxelShapes.union( + Block.createCuboidShape(0, 13, 0, 3, 18, 3), + Block.createCuboidShape(13, 13, 0, 16, 18, 3), + Block.createCuboidShape(0, 13, 13, 3, 18, 16), + Block.createCuboidShape(13, 13, 13, 16, 18, 16), + Block.createCuboidShape(0, 13, 0, 16, 16, 16), + Block.createCuboidShape(2, 0, 2, 14, 17, 14), + Block.createCuboidShape(0, 0, 0, 16, 4, 16) + ); + public ShapingBenchBlock(Settings settings) { super(settings, false); } + @Override + protected VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, EquineContext equineContext) { + return SHAPE; + } + @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (world.isClient) { From 7e25107f7a4d08260f7994bc91df4882298a4bf5 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 02:15:29 +0000 Subject: [PATCH 66/90] Add proper collission shapes for the cloud beds --- .../unicopia/block/FancyBedBlock.java | 26 ++++++++++ .../unicopia/util/VoxelShapeUtil.java | 52 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/main/java/com/minelittlepony/unicopia/util/VoxelShapeUtil.java diff --git a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java index b3494074..44dd6f8e 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java @@ -1,14 +1,18 @@ package com.minelittlepony.unicopia.block; +import java.util.List; import java.util.Locale; +import java.util.function.Function; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.item.BedsheetsItem; +import com.minelittlepony.unicopia.util.VoxelShapeUtil; import net.minecraft.block.BedBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; import net.minecraft.block.entity.BedBlockEntity; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; @@ -19,9 +23,26 @@ import net.minecraft.util.DyeColor; import net.minecraft.util.StringIdentifiable; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; import net.minecraft.world.World; public class FancyBedBlock extends BedBlock { + private static final List> SHAPES = List.of( + VoxelShapeUtil.rotator(VoxelShapes.union( + createCuboidShape(0, 3, 1, 16, 9, 16), + createCuboidShape(-0.5, 0, 1, 1.5, 13, 4), + createCuboidShape(14.5, 0, 1, 16.5, 13, 4), + createCuboidShape(1.5, 1, 0, 14.5, 16, 3) + )), + VoxelShapeUtil.rotator(VoxelShapes.union( + createCuboidShape(0, 3, 0, 16, 9, 16), + createCuboidShape(-0.5, 0, -1, 2.5, 10, 2), + createCuboidShape(13.5, 0, -1, 16.5, 10, 2), + createCuboidShape(1.5, 1, -2, 14.5, 12, 1) + )) + ); private final String base; @@ -30,6 +51,11 @@ public class FancyBedBlock extends BedBlock { this.base = base; } + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return SHAPES.get(state.get(PART).ordinal()).apply(BedBlock.getOppositePartDirection(state)); + } + @Override public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { return new Tile(pos, state); diff --git a/src/main/java/com/minelittlepony/unicopia/util/VoxelShapeUtil.java b/src/main/java/com/minelittlepony/unicopia/util/VoxelShapeUtil.java new file mode 100644 index 00000000..adff046a --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/util/VoxelShapeUtil.java @@ -0,0 +1,52 @@ +package com.minelittlepony.unicopia.util; + +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Direction.Axis; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; + +import java.util.function.Function; + +public interface VoxelShapeUtil { + Vec3d CENTER = new Vec3d(0.5, 0, 0.5); + + static Function rotator(VoxelShape base) { + return d -> rotate(base, d); + } + + static VoxelShape rotate(VoxelShape shape, Direction direction) { + if (direction.asRotation() == 0) { + return shape; + } + if (direction.getAxis() == Axis.X) { + direction = direction.getOpposite(); + } + float angle = direction.asRotation() * MathHelper.RADIANS_PER_DEGREE; + return VoxelShapes.union(VoxelShapes.empty(), shape.getBoundingBoxes().stream() + .map(box -> { + //These first two are enough for orthogonal rotations + Vec3d a = rotate(box.minX, box.minZ, angle); + Vec3d b = rotate(box.maxX, box.maxZ, angle); + //These cover odd angles + Vec3d c = rotate(box.minX, box.maxZ, angle); + Vec3d d = rotate(box.maxX, box.minZ, angle); + + return VoxelShapes.cuboid(new Box( + Math.min(Math.min(a.x, b.x), Math.min(c.x, d.x)), + box.minY, + Math.min(Math.min(a.z, b.z), Math.min(c.z, d.z)), + Math.max(Math.max(a.x, b.x), Math.max(c.x, d.x)), + box.maxY, + Math.max(Math.max(a.z, b.z), Math.max(c.z, d.z)) + )); + }) + .toArray(VoxelShape[]::new)); + } + + static Vec3d rotate(double x, double z, float angle) { + return new Vec3d(x, 0, z).subtract(CENTER).rotateY(angle).add(CENTER); + } +} From a7ac895fd18ea685ee687d4836194225cd5ce716 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 02:37:10 +0000 Subject: [PATCH 67/90] Trigger an update when a bed's sheets are changed --- .../java/com/minelittlepony/unicopia/block/FancyBedBlock.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java index 44dd6f8e..259aca1d 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java @@ -19,6 +19,7 @@ import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.enums.BedPart; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.DyeColor; import net.minecraft.util.StringIdentifiable; import net.minecraft.util.math.BlockPos; @@ -114,6 +115,9 @@ public class FancyBedBlock extends BedBlock { public void setPattern(SheetPattern pattern) { this.pattern = pattern; markDirty(); + if (world instanceof ServerWorld sw) { + sw.getChunkManager().markForUpdate(getPos()); + } } public SheetPattern getPattern() { From 3ab4159125138a76b15810da53a0c74be3acb065 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 02:51:19 +0000 Subject: [PATCH 68/90] Improve bed rendering performance --- .../entity/CloudBedBlockEntityRenderer.java | 68 ++++++++++++------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java index 6fdcae7a..9d10611a 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudBedBlockEntityRenderer.java @@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.client.render.entity; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.block.FancyBedBlock.SheetPattern; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; import com.minelittlepony.unicopia.client.render.RenderLayers; @@ -18,7 +19,7 @@ import net.minecraft.client.model.ModelPartBuilder; import net.minecraft.client.model.ModelPartData; import net.minecraft.client.model.ModelTransform; import net.minecraft.client.model.TexturedModelData; -import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; @@ -31,12 +32,19 @@ import net.minecraft.util.math.RotationAxis; import net.minecraft.world.World; public class CloudBedBlockEntityRenderer implements BlockEntityRenderer { - private final ModelPart bedHead; - private final ModelPart bedFoot; + private final ModelPart bedHead = getHeadTexturedModelData().createModel(); + private final ModelPart bedFoot = getFootTexturedModelData().createModel(); + private final ModelPart bedSheetsHead = getSheetsTexturedModelData(0, 3, 13).createModel(); + private final ModelPart bedSheetsFoot = getSheetsTexturedModelData(22, 0, 15).createModel(); public CloudBedBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) { - this.bedHead = getHeadTexturedModelData().createModel(); - this.bedFoot = getFootTexturedModelData().createModel(); + } + + public static TexturedModelData getSheetsTexturedModelData(int v, int y, int height) { + ModelData data = new ModelData(); + ModelPartData root = data.getRoot(); + root.addChild("main", ModelPartBuilder.create().uv(0, v).cuboid(0, y, 0, 16, height, 6), ModelTransform.NONE); + return TexturedModelData.of(data, 64, 64); } public static TexturedModelData getHeadTexturedModelData() { @@ -65,16 +73,17 @@ public class CloudBedBlockEntityRenderer implements BlockEntityRenderer()).get(worldLight); } - private void renderModel(MatrixStack matrices, VertexConsumerProvider vertices, ModelPart part, Direction direction, Identifier texture, int light, int overlay, boolean translate) { + private void renderModel(MatrixStack matrices, VertexConsumerProvider vertices, ModelPart part, Direction direction, VertexConsumer buffer, int light, int overlay, boolean translate, boolean sheets) { matrices.push(); matrices.translate(0, 0.5625f, translate ? -1 : 0); matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90)); matrices.translate(0.5f, 0.5f, 0.5f); - if (texture.getPath().indexOf("sheet") != -1) { - float beddingScale = 1.0001F; + if (sheets) { + float beddingScale = 1.002F; matrices.scale(beddingScale, beddingScale, beddingScale); } matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180 + direction.asRotation())); matrices.translate(-0.5f, -0.5f, -0.5f); - RenderLayer layer = RenderLayers.getEntityTranslucent(texture); - part.render(matrices, vertices.getBuffer(layer), light, overlay); + part.render(matrices, buffer, light, overlay); matrices.pop(); } } From 515efb93cb8b118956b2f56e44691dcaf0238432 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 03:05:45 +0000 Subject: [PATCH 69/90] Render the pattern on beds with nbt --- .../unicopia/client/URenderers.java | 5 ++++- .../unicopia/item/FancyBedItem.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index b0e3a716..b8f72b61 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -25,6 +25,7 @@ import com.minelittlepony.unicopia.client.render.spell.SpellRendererFactory; import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.EnchantableItem; +import com.minelittlepony.unicopia.item.FancyBedItem; import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.particle.UParticles; import com.terraformersmc.terraform.boat.api.client.TerraformBoatClientHelper; @@ -127,7 +128,9 @@ public interface URenderers { @SuppressWarnings("unchecked") private static void renderBedItem(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { - MinecraftClient.getInstance().getBlockEntityRenderDispatcher().renderEntity(((Supplier)stack.getItem()).get(), matrices, vertices, light, overlay); + BlockEntity entity = ((Supplier)stack.getItem()).get(); + ((FancyBedBlock.Tile)entity).setPattern(FancyBedItem.getPattern(stack)); + MinecraftClient.getInstance().getBlockEntityRenderDispatcher().renderEntity(entity, matrices, vertices, light, overlay); } private static void renderJarItem(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/FancyBedItem.java b/src/main/java/com/minelittlepony/unicopia/item/FancyBedItem.java index 4dd2b6a8..cc63ea79 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/FancyBedItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/FancyBedItem.java @@ -2,12 +2,18 @@ package com.minelittlepony.unicopia.item; import java.util.function.Supplier; +import org.jetbrains.annotations.Nullable; + import com.google.common.base.Suppliers; +import com.minelittlepony.unicopia.block.FancyBedBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockEntityProvider; import net.minecraft.block.entity.BlockEntity; import net.minecraft.item.BedItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; import net.minecraft.util.math.BlockPos; public class FancyBedItem extends BedItem implements Supplier { @@ -23,4 +29,13 @@ public class FancyBedItem extends BedItem implements Supplier { public BlockEntity get() { return renderEntity.get(); } + + public static FancyBedBlock.SheetPattern getPattern(ItemStack stack) { + @Nullable + NbtCompound blockEntityNbt = getBlockEntityNbt(stack); + if (blockEntityNbt == null || !blockEntityNbt.contains("pattern", NbtElement.STRING_TYPE)) { + return FancyBedBlock.SheetPattern.NONE; + } + return FancyBedBlock.SheetPattern.byId(blockEntityNbt.getString("pattern")); + } } From aa595d42847ba2a6cade2578a7846c88dae34e39 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 03:08:49 +0000 Subject: [PATCH 70/90] Reduce slime spawn rate --- .../com/minelittlepony/unicopia/block/SlimePustuleBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java b/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java index 8ce82add..b8be2a44 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java @@ -82,7 +82,7 @@ public class SlimePustuleBlock extends Block { @Deprecated @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (state.get(SHAPE) == Shape.POD) { + if (state.get(SHAPE) == Shape.POD && random.nextInt(130) == 0) { SlimeEntity slime = EntityType.SLIME.create(world); slime.setSize(1, true); slime.setPosition(pos.toCenterPos()); From 3f7a9a0a78d5127496e552e2a1f096160274187e Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 03:53:24 +0000 Subject: [PATCH 71/90] Slime pustules now conduct redstone --- .../unicopia/block/SlimePustuleBlock.java | 90 ++++++++++++++++--- 1 file changed, 79 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java b/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java index b8be2a44..a931844c 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java @@ -1,7 +1,10 @@ package com.minelittlepony.unicopia.block; +import java.util.Arrays; import java.util.Locale; +import org.joml.Vector3f; + import com.minelittlepony.unicopia.USounds; import net.minecraft.block.Block; @@ -14,11 +17,14 @@ import net.minecraft.entity.mob.SlimeEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.particle.BlockStateParticleEffect; +import net.minecraft.particle.DustParticleEffect; import net.minecraft.particle.ParticleTypes; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.EnumProperty; +import net.minecraft.state.property.Properties; import net.minecraft.util.StringIdentifiable; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; @@ -34,24 +40,29 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; public class SlimePustuleBlock extends Block { - static final EnumProperty SHAPE = EnumProperty.of("shape", Shape.class); - static final VoxelShape SHAFT_SHAPE = Block.createCuboidShape(7.5, 0, 7.5, 8.5, 16, 8.5); - static final VoxelShape DRIP_SHAPE = VoxelShapes.union( + private static final EnumProperty SHAPE = EnumProperty.of("shape", Shape.class); + private static final BooleanProperty POWERED = Properties.POWERED; + private static final Direction[] DIRECTIONS = Arrays.stream(Direction.values()) + .filter(direction -> direction != Direction.UP) + .toArray(Direction[]::new); + private static final VoxelShape SHAFT_SHAPE = Block.createCuboidShape(7.5, 0, 7.5, 8.5, 16, 8.5); + private static final VoxelShape DRIP_SHAPE = VoxelShapes.union( Block.createCuboidShape(7, 10, 7, 9, 16, 9), Block.createCuboidShape(3, 15, 4, 9, 16, 10), Block.createCuboidShape(7, 15, 7, 12, 16, 12) ); - static final VoxelShape BULB_SHAPE = VoxelShapes.union( + private static final VoxelShape BULB_SHAPE = VoxelShapes.union( Block.createCuboidShape(4, 1, 4, 12, 10, 12), Block.createCuboidShape(5, 10, 5, 11, 13, 11), Block.createCuboidShape(6, 13, 6, 10, 15, 10), Block.createCuboidShape(7, 13, 7, 9, 20, 9) ); - static final VoxelShape CAP_SHAPE = VoxelShapes.union(SHAFT_SHAPE, DRIP_SHAPE); + private static final VoxelShape CAP_SHAPE = VoxelShapes.union(SHAFT_SHAPE, DRIP_SHAPE); + private static final Vector3f DUST_COLOR = new Vector3f(1, 0.2F, 0.1F); public SlimePustuleBlock(Settings settings) { super(settings.ticksRandomly()); - setDefaultState(getDefaultState().with(SHAPE, Shape.DRIP)); + setDefaultState(getDefaultState().with(SHAPE, Shape.DRIP).with(POWERED, false)); } @Override @@ -68,6 +79,17 @@ public class SlimePustuleBlock extends Block { public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { super.randomDisplayTick(state, world, pos, random); + if (state.get(POWERED)) { + + VoxelShape shape = state.getCullingShape(world, pos); + float x = (float)MathHelper.lerp(random.nextFloat(), shape.getMin(Axis.X), shape.getMax(Axis.X)); + float z = (float)MathHelper.lerp(random.nextFloat(), shape.getMin(Axis.Z), shape.getMax(Axis.Z)); + world.addParticle(new DustParticleEffect(DUST_COLOR, 1), + pos.getX() + x, + pos.getY() + random.nextDouble(), + pos.getZ() + z, 0, 0, 0); + } + if (random.nextInt(15) == 0) { VoxelShape shape = state.getCullingShape(world, pos); float x = (float)MathHelper.lerp(random.nextFloat(), shape.getMin(Axis.X), shape.getMax(Axis.X)); @@ -132,7 +154,7 @@ public class SlimePustuleBlock extends Block { @Override protected void appendProperties(StateManager.Builder builder) { - builder.add(SHAPE); + builder.add(SHAPE, POWERED); } @Deprecated @@ -154,20 +176,66 @@ public class SlimePustuleBlock extends Block { Shape currentShape = state.get(SHAPE); if (direction == Direction.DOWN && (currentShape == Shape.CAP || currentShape == Shape.STRING)) { - return state; + return state.with(POWERED, getReceivedRedstonePower(world, pos) > 0); } Shape shape = determineShape(world, pos); - return state.with(SHAPE, shape); + return state.with(SHAPE, shape).with(POWERED, getReceivedRedstonePower(world, pos) > 0); } - return state; + return state.with(POWERED, getReceivedRedstonePower(world, pos) > 0); } @Override public BlockState getPlacementState(ItemPlacementContext ctx) { Shape shape = determineShape(ctx.getWorld(), ctx.getBlockPos()); - return super.getPlacementState(ctx).with(SHAPE, shape == Shape.STRING ? Shape.POD : shape); + return super.getPlacementState(ctx) + .with(SHAPE, shape == Shape.STRING ? Shape.POD : shape) + .with(POWERED, getReceivedRedstonePower(ctx.getWorld(), ctx.getBlockPos()) > 0); + } + + @Override + @Deprecated + public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { + super.onStateReplaced(state, world, pos, newState, moved); + if (state.isOf(this) && newState.isOf(this) && state.get(POWERED) != newState.get(POWERED)) { + world.updateNeighbor(pos.up(), this, pos); + } + } + + @Override + @Deprecated + public boolean emitsRedstonePower(BlockState state) { + return state.get(POWERED); + } + + @Override + @Deprecated + public int getWeakRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { + if (direction == Direction.DOWN && emitsRedstonePower(state)) { + return 15; + } + return 0; + } + + @Override + @Deprecated + public int getStrongRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { + if (direction == Direction.DOWN && emitsRedstonePower(state)) { + return 15; + } + return 0; + } + + private int getReceivedRedstonePower(BlockView world, BlockPos pos) { + int power = 0; + for (Direction direction : DIRECTIONS) { + power = Math.max(power, world.getBlockState(pos.offset(direction)).getStrongRedstonePower(world, pos, direction)); + if (power >= 15) { + return Math.min(15, power); + } + } + return Math.min(15, power); } private Shape determineShape(WorldAccess world, BlockPos pos) { From ec136e6045ce040133a32878c6dc2219ef86dd02 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 03:58:55 +0000 Subject: [PATCH 72/90] Only play kirin rage theme to the kirin themselves --- .../unicopia/ability/magic/spell/RageAbilitySpell.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java index 3edec65a..f12938b0 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java @@ -94,7 +94,7 @@ public class RageAbilitySpell extends AbstractSpell { } if (source instanceof Pony pony) { - if (source.isClient() && pony.asEntity().getAttackCooldownProgress(0) == 0) { + if (pony.isClientPlayer() && pony.asEntity().getAttackCooldownProgress(0) == 0) { InteractionManager.instance().playLoopingSound(source.asEntity(), InteractionManager.SOUND_KIRIN_RAGE, source.asWorld().random.nextLong()); } Bar energyBar = pony.getMagicalReserves().getEnergy(); From 277753b81b4a3c28ab301a94b4bb421e3dda01de Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 19:15:37 +0000 Subject: [PATCH 73/90] Add missing cloud blocks to the creative tab for pegasi --- .../unicopia/tags/items/groups/pegasus.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json index 81c0a88c..d0f069f3 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json +++ b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json @@ -2,7 +2,22 @@ "replace": false, "values": [ "unicopia:shaping_bench", - "#unicopia:clouds", + "unicopia:cloud_lump", + "unicopia:cloud", + "unicopia:cloud_slab", + "unicopia:cloud_stairs", + "unicopia:cloud_planks", + "unicopia:cloud_plank_slab", + "unicopia:cloud_plank_stairs", + "unicopia:cloud_bricks", + "unicopia:cloud_brick_slab", + "unicopia:cloud_brick_stairs", + "unicopia:dense_cloud", + "unicopia:dense_cloud_slab", + "unicopia:dense_cloud_stairs", + "unicopia:unstable_cloud", + "unicopia:cloud_pillar", + "unicopia:cloud_bed", "#unicopia:bed_sheets", "#unicopia:food_types/raw_fish", "#unicopia:food_types/cooked_fish", From cb94d3c8410887b1650a966e22a993df3bd3f7dc Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 20:12:54 +0000 Subject: [PATCH 74/90] Add interaction indicators to the tribe selection gui --- .../client/gui/TribeSelectionScreen.java | 25 ++++++++++++++++-- .../unicopia/textures/gui/tribe_selection.png | Bin 5533 -> 6593 bytes 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java index 73551090..32c7dabb 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/TribeSelectionScreen.java @@ -14,6 +14,7 @@ import com.minelittlepony.unicopia.network.Channel; import com.minelittlepony.unicopia.network.MsgRequestSpeciesChange; import net.minecraft.client.gui.DrawContext; +import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; @@ -110,7 +111,7 @@ public class TribeSelectionScreen extends GameGui implements HidesHud { private void updateScolling() { final int itemWidth = 70 + 10; int x = (width - itemWidth) / 2; - float diff = MathHelper.lerp(client.getTickDelta(), prevScrollPosition, scrollPosition) / 8F; + float diff = MathHelper.lerp(client.getTickDelta(), prevScrollPosition, scrollPosition) / 4F; for (int i = 0; i < options.size(); i++) { var option = options.get(i); @@ -124,6 +125,21 @@ public class TribeSelectionScreen extends GameGui implements HidesHud { updateScolling(); renderBackground(context); super.render(context, mouseX, mouseY, delta); + + if (!options.isEmpty()) { + var element = options.get(0); + + float diff = (targetScroll - MathHelper.lerp(client.getTickDelta(), prevScrollPosition, scrollPosition)) * 7; + context.drawTexture(TEXTURE, (width / 2) + 40 + (scrollPosition < targetScroll ? (int)diff : 0), element.getY() - 20, 10, 165, 153, 30, 85, 312, 312); + context.drawTexture(TEXTURE, (width / 2) - 80 + (scrollPosition > targetScroll ? (int)diff : 0), element.getY() - 20, 10, 195, 153, 30, 85, 312, 312); + if (element.getBounds().left < 0) { + context.drawTexture(TEXTURE, 20, element.getY() - 10, 10, 188, 235, 24, 60, 312, 312); + } + element = options.get(options.size() - 1); + if (element.getBounds().right() > width) { + context.drawTexture(TEXTURE, width - 50, element.getY() - 10, 10, 164, 235, 24, 60, 312, 312); + } + } } @Override @@ -151,11 +167,16 @@ public class TribeSelectionScreen extends GameGui implements HidesHud { } private void scroll(int target, boolean animate) { + if (target == SELECTION) { + return; + } SELECTION = target; - targetScroll = SELECTION * 8; + targetScroll = SELECTION * 4; if (!animate) { scrollPosition = targetScroll; prevScrollPosition = scrollPosition; + } else { + playSound(SoundEvents.UI_BUTTON_CLICK); } } diff --git a/src/main/resources/assets/unicopia/textures/gui/tribe_selection.png b/src/main/resources/assets/unicopia/textures/gui/tribe_selection.png index 51ae0fb09b625e697fbb3c16678e68f64800de17..445d6dfefdf43ef6a05921dd1765021fc4f2f5b6 100644 GIT binary patch literal 6593 zcmeHMd010t)_)U35EVroKmmzy#?OW9At5OcgdmHu6v1L8N|p;o$wC$qKnUQV*5&g< zX^VZ=fY+g4qcD zg?U59Vl03KwAcdA8BiVt0$>it(k$Hj<*L-+Vp*#y-i{UBW zI_m2Jl+nZ5{KLcov&E}xKu}0Hj!LAEi8MN#Po~n?6bhT_j-#;HbUK?xhW;^yuOmW{ zPX9=0gz;yK{rtj%{QPiog)B~-fB>M)Ps{NNyzJv#y>8{{FaKcm!7&ffFTc zTIib{vE)=+tfJL{E)I-{akeyOZFb!eW#tghbBVEB+GX*#yVXIp{=q}*BG%jecrlUl zxIXn!mBpV^_8pH4m=*4RJ+N9RSWvlm;@a9B^QOc)^JdU`&x)v+nr`(p*L9tE&+CJa z3jPvyZQqoxPyY7d5hwfZiQPAj6e%D7k8Syvho=|J40BX1eHu`Dov2SFdboAn_`jUc zn=`j=tM+xeF1fLNOR#5%^Qy>QKWFc}ZqrP-wc+e{`}>}erZk=U6e+E9Uh2Ff+II$C z6#1d=YE@zsw+6l zG7ZGr$L_!EE0-`sfr%zBIz99$n>-klQc{$?J7YxB`1D-SwN%4%TXO&5(Kcbye3g!dO|@nWeLzOzz~$B9K=_>bH} z$RTn+WW6{rMS-kL35^t{Y!tFYc#gM?rT=crz*#N(7;VES89Y(3k`oU%(*H;}90X197JkM0AAe z!DLa~Jy`B$D3Or8Os0_V;c|*4{CI>Um&Th1P{P?u!-Kr=R3iDcCOmk*%pjZk0C!1BHJ8C78IC?jFn;57Fj#0cF+Ac39#jEBU zR2selSsD*{gj~V$G(Vzn3(X6)=xuAwdIVhsNEm@aAyC~>!f0eRjW$LY>Gw|&5xB?2 ziRc~#x;vdhfaM}02oNfTAo36h$V@6sQ7~Gf;{^Wp6wMFkw^Q^ap>6TiqI#14Y1u~& z-sq!{no%9>&#>K-#{2ykXE5I1^B60)-_r#S_uk1n@%x^x_jJ7z1Mg(~zPjGi^-c`D zlkxlN`hTO#=JgvRB87kGY2f={+oAb$;k)ES!SVnuI0SZr+-)A8e*-m>_2 zlht?O=$<}1jZ^HO4(uPiowt03wGKNW^+MQpeh(KWZr#_wVtl(d>+9$FUw?RyRFu2( z(n0;Q&gN6|SR3*gI~x9I@^s!+BVSOFRiWQgHG9e4HP$<;Irb)gd+&gsMik+yvx!yI z>#Vw(+}qCGx|$%~zW|SaP_b)UAgkF8gtkxEX-v}qdyX~m0l>dMvBjylc<~0Gxvs84 z#({maTR_F(hzs^RvR7vUFahAqA9+wyESL^5ev``V@xOqH#bLsY>StMbGjg9@`9hXg z(_E`Qn1elPcJDK3{}GDy&XGAj!Hb^vrbsTiE^5wS8GJ2}{FyB-DhlDgT>p@P$M=fw zZ_UVIIp;2WlHO4qyY}S#E5!wm*qJpB`tI4QK;b2xG;8$`xZDCFY04)pO#vEqsRNI> zCh0`_cVAWx#IU-x9(5dhj-4H(^Em_yVY*? zAAO+X#FxhOXyrEWW7QbJ|B-Hk%OKyn(QPn^5R3&jUFXv7e>=UPuwxboEgL$}QG29L zyy9q`-qh9CshF}p%nxHYI&*l~Si;CjOG#mC-2&39?M&&4=MBA%J*Dm5D$7ueV^bUF z{g{#ovwqo&VuBfNXhSC#eK*>Q9u=kJxb0mnbDaT{49nH4d>c*X`7)R@Ol z9lZxxA$44yv9_Y4_MqWqP5Tm4xP~zU$iFNu#y1b~Yr~G#1upWR(o*7c6l|(&(CenP z%Ig}ITZvcxI*4<8@YINr*A{DEEcmN#WayLU3f7q=Ey8=OH9($oZTPOsVb{5HODhTo z3R0g)uGTrOjmH?G?0=~my4Bp=e6!~C)U%+_r>3Sx-0pmkK*VN^R%QnEjJ0+1!;vW$ zab@H-&^URAu6^&8)xgm2koI`((D0RAuCA_Dv$0rk>qLL8y8hNQ%d-=Ka79MR_69ZY zt5qkqZHq2hRUSjM`c-!aV@SL+Sj{-i#Jo227=Wl3FTWK`64496wV%5agP zDNxQmo_4%?ol#8>>1kz3WR01&=#E?oY!Cf-Bv-*R9?<8lSn&C#;uqB=t4?T>lkX2D zUv+3!fk*zZUX8)uI`4t9yDU-P1iNN95|WR)RWBRo==+e zO$sx%?$clNx`*wF3wEr78$VnoZsfD3YW^K6|Q>;g6FZvBaY{LIe z$qaMt%?7cBJcHf5uGXg?4O;?>(^aW8ho;{<+dr*iU^9pXJi{h$PBMiV^7SN(yQuqr z=tdVly2aA)9PDHbb(|kwR$1_j{o(bAy?7ZQ)?n*4@)utKZBLkTc9>$VTd-*3a}@U)EzzABzTr0s@}A;`!KOBy%HeiT zo6F0~)8)a}b)6Nvna%kULa9aLjowbvJhaW0_Y5^8o|$L}RP&hIEEh~rfta<$#chqu z`hJ&;o8`To6E-#V_VXrukLk+JPHMq_tVqCS*lo=aDn~m=_&H~z{$i88-VZopLwR|u z=40*b(lb6vp0PXS1O0Tge>axK9G`r(jN^bYcvYBq#_CPp`Zm)3n&#mvsRt)o1DjTC zqz-=82QSv@=E%Pw#;zPLOG`073N&{tkBy+b=l<|-g-0ibUbIK>46M7RXTm4sX_iQ5 z*2B~KrjkCJM+4kOr$t51b8QxbGb32f=8t{q=pP!@=e^H;kXAIH=WJ8q^Y%&Z)EaAyqw4L8!jPj}VzTZ6s!tq?E{99%gpJTdvInio(< zw`!OQcX0R5KR>OW4jx5A{w@==VPRp+Dkph)G&fjA6NQ~@oRzVBtD&+?Su-pQaFDm1 z&e*%#63trrk7E1^Q;+0`QRk)dW^IFZ1%9;jjw55AqM?mioqK{T)^NY%l-- literal 5533 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 Date: Sat, 25 Nov 2023 20:16:32 +0000 Subject: [PATCH 75/90] Exclude non-grantable tribes from the lan settings screen --- .../minelittlepony/unicopia/client/gui/LanSettingsScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/LanSettingsScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/LanSettingsScreen.java index 866ba85f..5d3d0e80 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/LanSettingsScreen.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/LanSettingsScreen.java @@ -113,7 +113,7 @@ public class LanSettingsScreen extends GameGui { WHITELIST_GRID_PACKER.start(); for (Race race : Race.REGISTRY) { - if (!race.isUnset()) { + if (!race.isUnset() && race.availability().isGrantable()) { Bounds bound = WHITELIST_GRID_PACKER.next(); Button button = content.addButton(new Toggle(LEFT + bound.left + 10, row + bound.top, whitelist.contains(race.getId().toString()))) From e45ec6e1ff5d3137fba12be20ed6bbfb4ac546ab Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 20:28:20 +0000 Subject: [PATCH 76/90] Add the final necklace texture --- .../textures/models/armor/pearl_necklace.png | Bin 4955 -> 5222 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/unicopia/textures/models/armor/pearl_necklace.png b/src/main/resources/assets/unicopia/textures/models/armor/pearl_necklace.png index b6ce0dbc6d35b1fff107c6ca05612bc75d8c3c3d..5d15b0f7bd4423cec07c34faa18e9fb69a6602c4 100644 GIT binary patch delta 1230 zcmcbu_Do~KZ8alP1tSA1BXcW5a|T8R#s$nkk^zi?6vN9$A=yA)>tseo+4`-EMA@xZ zSfs4rOA;3?TobC{)EcC{Uq)C z>rZ@8hT!9ah4%OER^Qpn+)_1jWtzK4faz(Eqsd8XyS3QjE_N&OB*?@H8GqfGV#Ij< zV=2FU{Cg#v)4%V`U+jN!CeMe?BZ2kHq{Tk6eLS;lY4JUEzKx5P2+SAumnd<3Nk}OrB+yAxOleEjk{KQs>&_gufAeGVlSwB-nUs$+X$2@+)_t)5ad+*^ z`Sr6(CN~)__r?;D@}SI02tZ_)ORc9xC|4E%PPArU1JzCKpTn`bdKGO3s(rWqNT8mH+RrkR`T znphZE>L!^Ro9mhz8Ch7SnkJfASQt;XXI;u~ZeU<(Vq#!yZeeO-VQe}1Giw32k!c7l zvM1-UDI@bY&tdz*IC(95jEbp6TB4<~X|k?)a;l-ONvf%ZZlZabsjg|7NwQIrfk|>& zlEGwM4lfklO&oa~VxOKX&H^SHwj^(N7lwHZJq%MiET(Ut%qFN%FDW7|==#?qih+U2 z#?!?yq~g}wTfY9nfg;B~roWoN_eFGr?|}yGeNFO?W^a5Vc786NnXrh{Ft4X{Vdt^6 zda-5doYPq@Y?NIdoMt5>E_y^`eV)Xx|GBr8m~XcDzVrFFdtpos#*xR*Sf$;~yM9jU z`5fctb0UxTtP*W5zt>>Eqg&sl1KOSb!bMNGq0ZRH#TBNb- z!jt(tjqiW23R}JE`sn&{YQyR_g}&tO$MrK9 zL@T*}+`2#g|Gt&)XD{~lfAa9P z+~Y5b$$KAeP1lZkx$cjh z+CHP(_g>um=62psPWG}%=&WT~wsXF5I5xg#tXEn2eNTGt*S2z#os+hd=llQLy{t}U z;n z7w~`3e_M8YvdZ@*`P|)GKYA)kX~{0#6`X7E()_LUfy^}Rt&hJ)&dZ#V9#S-kNr2_? zby@R&Gk?5WoN#;1KTocP?awN$^@7a2ruGJ{vdCndu%z{;)av?6H>Ec}VXgl^>y5x3 iRTfaOgBu*E|INAo%}eRvlfjcgsyto&T-G@yGywn`{u|c- delta 1110 zcmV-c1gZPxDBC8G+a@qMATlyKFg7|gFaQAn0iXi_0RR910RR9100000Q}lTX0004m zlK}x8e~Vug1&fF{WT;MdQ4z;lg(6f4wL+^7CYOFelZK?l#ZhoAIQX$xb#QUk)xlK| z1V2DrU7QqMq{ROvg%&X$9QWhhy~o`jU&^r9O>2w*^F zmN6$u33!gLd-(Wz7vWjn=l&dhYSvQU;t;WzZ)2s6S;5qZr-{R=rc=IOOPN!K@~-mP(g%NofHd6+K+koM;yOIE`?l0Fmf!Q3=Oj52mgcL-CDV+ ze@Qnf7y|+?w*4^%bnXI;nr(j{+jipw@IM1rddpv~1GAr`*IHWm2y{D6t>JcD+ z2^Iz@wh1r40006NNklICt*voKZ)&Xfzro zN#$}`xm?byo5atEFmxwdx2D*4o3V)oLb57Z(?jq)MftWHPySz2|x6 zIIG90REk57hz&|W0{oV4w`-+RY3=&qaA=dsM3PkaTv%=X+#v}_06b)yw=J+EGf6rQ zk8fO;&*!ghd#~3sNoqEmwzIQC3PiC53M$Gl=&Nva&R7a&~BwXt>o&6f%l+l*6XS^y%)bzO5^ z*Y3NI=XvINo>5T}08#o3>>o}{lH!*=JpX$0&copNyN4xwg7?}k4^0sG*c&J1? z)GVB87EaY}x39(c$-%ju9Gw4uGTMFLH{bVd8cY?;0|oOyoxM}*?48mIXaRWepMmK_ zM!DVV|NYyMS-;;mNeVv1v{)`y!{WP c0D!;d2gnVyv~RYR*#H0l07*qoM6N<$f~8>dzW@LL From c8dc41a68e55b6e4fe0aa2c85b9e68ee2de6600e Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 20:49:47 +0000 Subject: [PATCH 77/90] Fixed not being able to equip amulets, bracelets, and necklaces when trinkets is not installed --- .../unicopia/compat/trinkets/TrinketsDelegate.java | 3 ++- .../java/com/minelittlepony/unicopia/item/WearableItem.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java b/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java index beb2e98e..dfa184dc 100644 --- a/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java @@ -6,6 +6,7 @@ import java.util.stream.Stream; import com.minelittlepony.unicopia.EntityConvertable; import com.minelittlepony.unicopia.container.SpellbookScreenHandler; + import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; @@ -67,7 +68,7 @@ public interface TrinketsDelegate { } default Set getAvailableTrinketSlots(LivingEntity entity, Set probedSlots) { - return probedSlots.stream().filter(slot -> getEquipped(entity, slot).count() == 0).collect(Collectors.toSet()); + return probedSlots.stream().filter(slot -> getEquipped(entity, slot).anyMatch(ItemStack::isEmpty)).collect(Collectors.toSet()); } default Stream getEquipped(LivingEntity entity, Identifier slot) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java b/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java index 9ff3c50c..b745b9bb 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java @@ -51,11 +51,11 @@ public abstract class WearableItem extends Item implements Equipment { @Override public final EquipmentSlot getSlotType() { - return EquipmentSlot.OFFHAND; + return getSlotType(getDefaultStack()); } public EquipmentSlot getSlotType(ItemStack stack) { - return getSlotType(); + return EquipmentSlot.OFFHAND; } public static boolean dispenseArmor(BlockPointer pointer, ItemStack armor) { From e44347e8ed70d872ba77593aeea97022cc105c82 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 21:01:07 +0000 Subject: [PATCH 78/90] Fix food component not being updated correctly --- src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java index 160d8368..7dfb69ab 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java @@ -58,6 +58,8 @@ abstract class MixinItem implements ItemDuck { @Inject(method = "use", at = @At("HEAD"), cancellable = true) private void use(World world, PlayerEntity user, Hand hand, CallbackInfoReturnable> info) { + // ensure the food component is updated before attempting to use + getToxic(user.getStackInHand(hand), user); TypedActionResult result = FoodPoisoningStatusEffect.apply(this, user, hand); if (result.getResult() != ActionResult.PASS) { info.setReturnValue(result); From ea78257ffde49d203540a7da5d3b43721f7d29f5 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 21:27:29 +0000 Subject: [PATCH 79/90] Force ponies to use the seapony model (if they have one) when they are a seapony in unicopia --- .../unicopia/UnicopiaMixinPlugin.java | 3 +++ .../mixin/client/minelp/MixinPonyPosture.java | 22 +++++++++++++++++++ src/main/resources/unicopia.mixin.json | 1 + 3 files changed, 26 insertions(+) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/minelp/MixinPonyPosture.java diff --git a/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java b/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java index 48dcf6b7..df5394d9 100644 --- a/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java +++ b/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java @@ -35,6 +35,9 @@ public class UnicopiaMixinPlugin implements IMixinConfigPlugin { if (mixinClassName.indexOf("ad_astra") != -1) { return FabricLoader.getInstance().isModLoaded("ad_astra"); } + if (mixinClassName.indexOf("minelp") != -1) { + return FabricLoader.getInstance().isModLoaded("minelp"); + } } return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/minelp/MixinPonyPosture.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/minelp/MixinPonyPosture.java new file mode 100644 index 00000000..618907d7 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/minelp/MixinPonyPosture.java @@ -0,0 +1,22 @@ +package com.minelittlepony.unicopia.mixin.client.minelp; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.minelittlepony.api.pony.PonyPosture; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.entity.LivingEntity; + +@Mixin(PonyPosture.class) +abstract class MixinPonyPosture { + @Inject(method = "isPartiallySubmerged", at = @At("HEAD"), cancellable = true) + private static void isPartiallySubmerged(LivingEntity entity, CallbackInfoReturnable info) { + if (Pony.of(entity).filter(pony -> pony.getCompositeRace().includes(Race.SEAPONY)).isPresent()) { + info.setReturnValue(true); + } + } +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index b85f5823..0c6d99ef 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -78,6 +78,7 @@ "client.MixinTranslationStorage", "client.MixinWorldRenderer", "client.sodium.MixinSodiumWorldRenderer", + "client.minelp.MixinPonyPosture", "trinkets.MixinTrinketCreativeSlot" ], "injectors": { From fb7a85c5d8f1f1e18601f3d11a2eee41c29ff7e0 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 25 Nov 2023 21:42:58 +0000 Subject: [PATCH 80/90] Guardians no longer attack seaponies --- .../mixin/MixinGuardianTargetPredicate.java | 21 +++++++++++++++++++ .../mixin/client/minelp/MixinPonyPosture.java | 6 ++---- src/main/resources/unicopia.mixin.json | 1 + 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinGuardianTargetPredicate.java diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinGuardianTargetPredicate.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinGuardianTargetPredicate.java new file mode 100644 index 00000000..b7beed91 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinGuardianTargetPredicate.java @@ -0,0 +1,21 @@ +package com.minelittlepony.unicopia.mixin; + +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.minelittlepony.unicopia.EquinePredicates; + +import net.minecraft.entity.LivingEntity; + +@Mixin(targets = "net.minecraft.entity.mob.GuardianEntity$GuardianTargetPredicate") +abstract class MixinGuardianTargetPredicate { + @Inject(method = "test", at = @At("HEAD"), cancellable = true) + private void test(@Nullable LivingEntity livingEntity, CallbackInfoReturnable info) { + if (EquinePredicates.PLAYER_SEAPONY.test(livingEntity)) { + info.setReturnValue(false); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/minelp/MixinPonyPosture.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/minelp/MixinPonyPosture.java index 618907d7..faaa44bc 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/minelp/MixinPonyPosture.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/minelp/MixinPonyPosture.java @@ -6,16 +6,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.api.pony.PonyPosture; -import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.entity.player.Pony; - +import com.minelittlepony.unicopia.EquinePredicates; import net.minecraft.entity.LivingEntity; @Mixin(PonyPosture.class) abstract class MixinPonyPosture { @Inject(method = "isPartiallySubmerged", at = @At("HEAD"), cancellable = true) private static void isPartiallySubmerged(LivingEntity entity, CallbackInfoReturnable info) { - if (Pony.of(entity).filter(pony -> pony.getCompositeRace().includes(Race.SEAPONY)).isPresent()) { + if (EquinePredicates.PLAYER_SEAPONY.test(entity)) { info.setReturnValue(true); } } diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 0c6d99ef..5acbbf09 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -24,6 +24,7 @@ "MixinFallingBlock", "MixinFallingBlockEntity", "MixinFlowableFluid", + "MixinGuardianTargetPredicate", "MixinItem", "MixinItemEntity", "MixinLivingEntity", From 9809f13fd103e73b6915cef38ae45af8ec9f63ff Mon Sep 17 00:00:00 2001 From: LingVarr <104311317+LingVarr@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:24:13 +1100 Subject: [PATCH 81/90] Update ru_ru.json (#217) --- src/main/resources/assets/unicopia/lang/ru_ru.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/assets/unicopia/lang/ru_ru.json b/src/main/resources/assets/unicopia/lang/ru_ru.json index 8d360623..d7ce9dc2 100644 --- a/src/main/resources/assets/unicopia/lang/ru_ru.json +++ b/src/main/resources/assets/unicopia/lang/ru_ru.json @@ -58,6 +58,8 @@ "item.unicopia.butterfly_spawn_egg": "Яйцо призыва бабочки", "item.unicopia.butterfly": "Бабочка", + "item.unicopia.loot_bug_spawn_egg": "Яйцо призыва жука-сборщика", + "item.unicopia.loot_bug": "Жук-сборщик", "item.unicopia.green_apple": "Яблоко Гренни Смит", "item.unicopia.sweet_apple": "Яблоко Яблочной Аллеи", @@ -213,6 +215,8 @@ "item.unicopia.rainbow_pwr_bed_sheets": "Простынь с радужным РБК узором", "block.unicopia.rocks": "Камни", + "block.unicopia.plunder_vine": "Чёрная лоза", + "block.unicopia.plunder_vine_bud": "Бутон чёрной лозы", "block.unicopia.bananas": "Бананы", "block.unicopia.zapling": "Саженец зап-яблони", "block.unicopia.zap_log": "Бревно зап-яблони", From 2df34bd986c953945cd5b00dddaea79ddf9f5511 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 26 Nov 2023 18:18:34 +0000 Subject: [PATCH 82/90] Prevent zap leaves from changing state when placed manually --- .../unicopia/block/BaseZapAppleLeavesBlock.java | 8 +++++++- .../unicopia/block/ZapAppleLeavesBlock.java | 11 +++++++++-- .../unicopia/server/world/ZapAppleStageStore.java | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/block/BaseZapAppleLeavesBlock.java b/src/main/java/com/minelittlepony/unicopia/block/BaseZapAppleLeavesBlock.java index d59a56b0..0b56490b 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BaseZapAppleLeavesBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BaseZapAppleLeavesBlock.java @@ -41,6 +41,10 @@ public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (state.get(PERSISTENT)) { + return state; + } + if (world instanceof ServerWorld sw) { ZapAppleStageStore store = ZapAppleStageStore.get(sw); ZapAppleStageStore.Stage currentStage = store.getStage(); @@ -56,7 +60,9 @@ public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { super.scheduledTick(state, world, pos, random); tryAdvanceStage(state, world, pos, random); - world.scheduleBlockTick(pos, this, 1); + if (!state.get(PERSISTENT)) { + world.scheduleBlockTick(pos, this, 1); + } } private void tryAdvanceStage(BlockState state, ServerWorld world, BlockPos pos, Random random) { diff --git a/src/main/java/com/minelittlepony/unicopia/block/ZapAppleLeavesBlock.java b/src/main/java/com/minelittlepony/unicopia/block/ZapAppleLeavesBlock.java index b036532a..4e83cbcf 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/ZapAppleLeavesBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/ZapAppleLeavesBlock.java @@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.block; import com.minelittlepony.unicopia.server.world.ZapAppleStageStore; import net.minecraft.block.*; +import net.minecraft.item.ItemPlacementContext; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; import net.minecraft.state.property.*; @@ -13,12 +14,13 @@ public class ZapAppleLeavesBlock extends BaseZapAppleLeavesBlock { public static final EnumProperty STAGE = EnumProperty.of("stage", ZapAppleStageStore.Stage.class); ZapAppleLeavesBlock() { - setDefaultState(getDefaultState().with(STAGE, ZapAppleStageStore.Stage.HIBERNATING)); + setDefaultState(getDefaultState().with(STAGE, ZapAppleStageStore.Stage.GREENING)); } @Override public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { - if (oldState.isOf(state.getBlock()) + if (state.get(PERSISTENT) + || oldState.isOf(state.getBlock()) || oldState.isOf(UBlocks.ZAP_LEAVES) || oldState.isOf(UBlocks.FLOWERING_ZAP_LEAVES) || oldState.isOf(UBlocks.ZAP_LEAVES_PLACEHOLDER) @@ -33,6 +35,11 @@ public class ZapAppleLeavesBlock extends BaseZapAppleLeavesBlock { } } + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + return super.getPlacementState(ctx).with(STAGE, ZapAppleStageStore.Stage.GREENING); + } + @Override protected ZapAppleStageStore.Stage getStage(BlockState state) { return state.get(STAGE); diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/ZapAppleStageStore.java b/src/main/java/com/minelittlepony/unicopia/server/world/ZapAppleStageStore.java index 4111a432..e1460494 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/ZapAppleStageStore.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/ZapAppleStageStore.java @@ -171,7 +171,7 @@ public class ZapAppleStageStore extends PersistentState implements Tickable { if (this == ZapAppleStageStore.Stage.FLOWERING) { return UBlocks.FLOWERING_ZAP_LEAVES.getDefaultState(); } - return UBlocks.FLOWERING_ZAP_LEAVES.getDefaultState().withIfExists(ZapAppleLeavesBlock.STAGE, this); + return UBlocks.ZAP_LEAVES.getDefaultState().with(ZapAppleLeavesBlock.STAGE, this); } @Override From 8a85f0709e0a21c5f0d473fba4ff98c07932f5fd Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 27 Nov 2023 16:02:38 +0000 Subject: [PATCH 83/90] Kirins can now cool themselves off by drinking bottles of water, juice, and eating melon slices --- .../com/minelittlepony/unicopia/UTags.java | 1 + .../ability/magic/spell/RageAbilitySpell.java | 12 ++++++- .../effect/FoodPoisoningStatusEffect.java | 10 +++--- .../unicopia/entity/player/Pony.java | 17 +++++++++- .../unicopia/item/toxin/Ailment.java | 11 ------ .../unicopia/item/toxin/Toxic.java | 17 ++++++++-- .../unicopia/mixin/MixinBlockItem.java | 13 ------- .../unicopia/mixin/MixinItem.java | 25 -------------- .../unicopia/mixin/MixinItemStack.java | 34 +++++++++++++++++++ .../unicopia/mixin/MixinPlayerEntity.java | 12 +++++-- .../unicopia/tags/items/cools_off_kirins.json | 9 +++++ src/main/resources/unicopia.mixin.json | 1 + 12 files changed, 100 insertions(+), 62 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java create mode 100644 src/main/resources/data/unicopia/tags/items/cools_off_kirins.json diff --git a/src/main/java/com/minelittlepony/unicopia/UTags.java b/src/main/java/com/minelittlepony/unicopia/UTags.java index c6ba480c..7eb7649b 100644 --- a/src/main/java/com/minelittlepony/unicopia/UTags.java +++ b/src/main/java/com/minelittlepony/unicopia/UTags.java @@ -27,6 +27,7 @@ public interface UTags { TagKey SPOOKED_MOB_DROPS = item("spooked_mob_drops"); TagKey IS_DELIVERED_AGGRESSIVELY = item("is_delivered_aggressively"); TagKey FLOATS_ON_CLOUDS = item("floats_on_clouds"); + TagKey COOLS_OFF_KIRINS = item("cools_off_kirins"); TagKey POLEARMS = item("polearms"); TagKey HORSE_SHOES = item("horse_shoes"); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java index f12938b0..1f3e2ada 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java @@ -30,11 +30,17 @@ public class RageAbilitySpell extends AbstractSpell { private int age; private int ticksExtenguishing; + private int ticksToExtenguish; + public RageAbilitySpell(CustomisedSpellType type) { super(type); setHidden(true); } + public void setExtenguishing() { + ticksToExtenguish += 15; + } + @Override public boolean tick(Caster source, Situation situation) { @@ -42,7 +48,7 @@ public class RageAbilitySpell extends AbstractSpell { return false; } - if (source.asEntity().isInsideWaterOrBubbleColumn()) { + if (source.asEntity().isInsideWaterOrBubbleColumn() || source.asEntity().isFrozen() || ticksToExtenguish > 0) { ticksExtenguishing++; source.playSound(SoundEvents.ENTITY_GENERIC_EXTINGUISH_FIRE, 1); source.spawnParticles(ParticleTypes.CLOUD, 12); @@ -51,6 +57,10 @@ public class RageAbilitySpell extends AbstractSpell { ticksExtenguishing = 0; } + if (ticksToExtenguish > 0) { + ticksToExtenguish--; + } + if (ticksExtenguishing > 10) { return false; } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/FoodPoisoningStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/FoodPoisoningStatusEffect.java index e8bd62a7..f216cc67 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/FoodPoisoningStatusEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/FoodPoisoningStatusEffect.java @@ -12,10 +12,8 @@ import net.minecraft.entity.effect.StatusEffectCategory; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.FoodComponent; -import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.sound.SoundCategory; -import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; public class FoodPoisoningStatusEffect extends StatusEffect { @@ -54,18 +52,18 @@ public class FoodPoisoningStatusEffect extends StatusEffect { return i <= 0 || duration % i == 0; } - public static TypedActionResult apply(ItemConvertible sender, PlayerEntity user, Hand hand) { + public static TypedActionResult apply(ItemStack stack, PlayerEntity user) { @Nullable - FoodComponent food = sender.asItem().getFoodComponent(); + FoodComponent food = stack.getItem().getFoodComponent(); if (food == null || !user.canConsume(food.isAlwaysEdible()) || !user.hasStatusEffect(UEffects.FOOD_POISONING)) { - return TypedActionResult.pass(user.getStackInHand(hand)); + return TypedActionResult.pass(stack); } user.getWorld().playSound(null, user.getX(), user.getY(), user.getZ(), USounds.Vanilla.ENTITY_PLAYER_BURP, SoundCategory.NEUTRAL, 1, 1 + (user.getWorld().random.nextFloat() - user.getWorld().random.nextFloat()) * 0.4f); user.addStatusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 100, 1, true, false, false)); - return TypedActionResult.fail(user.getStackInHand(hand)); + return TypedActionResult.fail(stack); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 538dd8d6..6a12cabe 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -13,6 +13,7 @@ import com.minelittlepony.unicopia.ability.*; import com.minelittlepony.unicopia.ability.magic.*; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod; +import com.minelittlepony.unicopia.ability.magic.spell.RageAbilitySpell; import com.minelittlepony.unicopia.ability.magic.spell.Spell; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.trait.TraitDiscovery; @@ -53,6 +54,8 @@ import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.particle.ParticleTypes; +import net.minecraft.potion.PotionUtil; +import net.minecraft.potion.Potions; import net.minecraft.registry.tag.DamageTypeTags; import net.minecraft.registry.tag.FluidTags; import net.minecraft.server.network.ServerPlayerEntity; @@ -428,7 +431,7 @@ public class Pony extends Living implements Copyable, Update if (getObservedSpecies() == Race.KIRIN) { var charge = getMagicalReserves().getCharge(); - if (entity.isTouchingWater()) { + if (entity.isTouchingWater() || entity.isFrozen()) { charge.multiply(0.5F); } @@ -734,6 +737,18 @@ public class Pony extends Living implements Copyable, Update return Optional.empty(); } + public void onEat(ItemStack stack) { + if (isClient()) { + return; + } + + if (getObservedSpecies() == Race.KIRIN + && (stack.isIn(UTags.COOLS_OFF_KIRINS) || PotionUtil.getPotion(stack) == Potions.WATER)) { + getMagicalReserves().getCharge().multiply(0.5F); + getSpellSlot().get(SpellType.RAGE, false).ifPresent(RageAbilitySpell::setExtenguishing); + } + } + @SuppressWarnings("deprecation") @Override protected void handleFall(float distance, float damageMultiplier, DamageSource cause) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java index 8da95eff..0fa02187 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java @@ -7,11 +7,7 @@ import com.minelittlepony.unicopia.entity.player.Pony; import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; import net.minecraft.text.Text; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; public record Ailment ( Toxicity toxicity, @@ -31,13 +27,6 @@ public record Ailment ( } } - public TypedActionResult use(World world, PlayerEntity player, Hand hand) { - if (!Pony.of(player).getObservedSpecies().hasIronGut()) { - return TypedActionResult.fail(player.getStackInHand(hand)); - } - return null; - } - public interface Set { Set EMPTY = e -> Optional.empty(); diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java index 9ae67b13..d2810839 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java @@ -6,13 +6,17 @@ import java.util.*; import java.util.function.Function; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.entity.effect.FoodPoisoningStatusEffect; import com.minelittlepony.unicopia.entity.player.Pony; import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; import net.minecraft.item.FoodComponent; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; import net.minecraft.util.UseAction; import net.minecraft.world.World; @@ -37,11 +41,20 @@ public record Toxic ( ailment.get(player).ifPresent(ailment -> ailment.appendTooltip(tooltip, context)); } - public ItemStack finishUsing(ItemStack stack, World world, LivingEntity entity) { + public TypedActionResult startUsing(ItemStack stack, World world, PlayerEntity user, Hand hand) { + if (stack.getItem() instanceof BlockItem && ailment().get(user).isPresent() && !Pony.of(user).getObservedSpecies().hasIronGut()) { + return TypedActionResult.fail(stack); + } + return FoodPoisoningStatusEffect.apply(stack, user); + } + + public void finishUsing(ItemStack stack, World world, LivingEntity entity) { if (entity instanceof PlayerEntity player) { ailment.get(entity).ifPresent(ailment -> ailment.effect().afflict(player, stack)); } - return stack; + if (stack.isFood() || stack.getUseAction() == UseAction.DRINK) { + Pony.of(entity).ifPresent(pony -> pony.onEat(stack)); + } } @Deprecated diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java index 63e33c3a..5cb06970 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java @@ -9,15 +9,11 @@ import com.minelittlepony.unicopia.item.toxin.ToxicHolder; import com.minelittlepony.unicopia.server.world.WaterLoggingManager; import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; import net.minecraft.util.UseAction; -import net.minecraft.world.World; @Mixin(BlockItem.class) abstract class MixinBlockItem extends Item implements ToxicHolder { @@ -28,15 +24,6 @@ abstract class MixinBlockItem extends Item implements ToxicHolder { return getToxic(stack, null).useAction().orElseGet(() -> super.getUseAction(stack)); } - @Override - public TypedActionResult use(World world, PlayerEntity player, Hand hand) { - return getToxic(player.getStackInHand(hand), player) - .ailment() - .get(player) - .map(t -> t.use(world, player, hand)) - .orElseGet(() -> super.use(world, player, hand)); - } - @Inject(method = "getPlacementState", at = @At("RETURN"), cancellable = true) private void onGetPlacementState(ItemPlacementContext context, CallbackInfoReturnable info) { WaterLoggingManager.getInstance().getPlacementState(context, info); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java index 7dfb69ab..5670dbbe 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java @@ -8,25 +8,15 @@ import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import com.google.common.base.Suppliers; import com.minelittlepony.unicopia.entity.ItemImpl; import com.minelittlepony.unicopia.entity.ItemImpl.GroundTickCallback; -import com.minelittlepony.unicopia.entity.effect.FoodPoisoningStatusEffect; import com.minelittlepony.unicopia.item.toxin.*; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.FoodComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; @Mixin(Item.class) abstract class MixinItem implements ItemDuck { @@ -50,19 +40,4 @@ abstract class MixinItem implements ItemDuck { } return Toxics.lookup(this, entity); } - - @Inject(method = "finishUsing", at = @At("HEAD")) - private void finishUsing(ItemStack stack, World world, LivingEntity entity, CallbackInfoReturnable info) { - getToxic(stack, entity).finishUsing(stack, world, entity); - } - - @Inject(method = "use", at = @At("HEAD"), cancellable = true) - private void use(World world, PlayerEntity user, Hand hand, CallbackInfoReturnable> info) { - // ensure the food component is updated before attempting to use - getToxic(user.getStackInHand(hand), user); - TypedActionResult result = FoodPoisoningStatusEffect.apply(this, user, hand); - if (result.getResult() != ActionResult.PASS) { - info.setReturnValue(result); - } - } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java new file mode 100644 index 00000000..118f1b4c --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java @@ -0,0 +1,34 @@ +package com.minelittlepony.unicopia.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.minelittlepony.unicopia.item.toxin.ToxicHolder; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; + +@Mixin(ItemStack.class) +abstract class MixinItemStack { + @Inject(method = "use", at = @At("HEAD"), cancellable = true) + private void onUse(World world, PlayerEntity user, Hand hand, CallbackInfoReturnable> info) { + ItemStack self = (ItemStack)(Object)this; + TypedActionResult result = ((ToxicHolder)self.getItem()).getToxic(self, user).startUsing(self, world, user, hand); + if (result.getResult() != ActionResult.PASS) { + info.setReturnValue(result); + } + } + + @Inject(method = "finishUsing", at = @At("HEAD")) + private void onFinishUsing(World world, LivingEntity user, CallbackInfoReturnable info) { + ItemStack self = (ItemStack)(Object)this; + ((ToxicHolder)self.getItem()).getToxic(self, user).finishUsing(self, world, user); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java index 71d0907c..d61ad769 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java @@ -29,6 +29,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.stat.Stats; import net.minecraft.util.Unit; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; @Mixin(PlayerEntity.class) abstract class MixinPlayerEntity extends LivingEntity implements Equine.Container, PlayerEntityDuck { @@ -42,6 +43,11 @@ abstract class MixinPlayerEntity extends LivingEntity implements Equine.Containe return new Pony((PlayerEntity)(Object)this); } + @Inject(method = "createPlayerAttributes()Lnet/minecraft/entity/attribute/DefaultAttributeContainer$Builder;", at = @At("RETURN")) + private static void onCreateAttributes(CallbackInfoReturnable info) { + Pony.registerAttributes(info.getReturnValue()); + } + @ModifyVariable(method = "applyDamage(Lnet/minecraft/entity/damage/DamageSource;F)V", at = @At("HEAD"), ordinal = 0) protected float modifyDamageAmount(float amount, DamageSource source) { return get().modifyDamage(source, amount).orElse(amount); @@ -60,9 +66,9 @@ abstract class MixinPlayerEntity extends LivingEntity implements Equine.Containe }); } - @Inject(method = "createPlayerAttributes()Lnet/minecraft/entity/attribute/DefaultAttributeContainer$Builder;", at = @At("RETURN")) - private static void onCreateAttributes(CallbackInfoReturnable info) { - Pony.registerAttributes(info.getReturnValue()); + @Inject(method = "eatFood(Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;)Lnet/minecraft/item/ItemStack;", at = @At("HEAD")) + private void onEatFood(World world, ItemStack stack, CallbackInfoReturnable info) { + get().onEat(stack); } @Inject(method = "trySleep(Lnet/minecraft/util/math/BlockPos;)Lcom/mojang/datafixers/util/Either;", diff --git a/src/main/resources/data/unicopia/tags/items/cools_off_kirins.json b/src/main/resources/data/unicopia/tags/items/cools_off_kirins.json new file mode 100644 index 00000000..15e752ad --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/cools_off_kirins.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:melon_slice", + "unicopia:juice", + { "id": "farmersdelight:melon_popsicle", "required": false }, + { "id": "farmersdelight:melon_juice", "required": false } + ] +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 5acbbf09..b6e5e32b 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -27,6 +27,7 @@ "MixinGuardianTargetPredicate", "MixinItem", "MixinItemEntity", + "MixinItemStack", "MixinLivingEntity", "MixinMilkBucketItem", "MixinMobEntity", From 16a7b96f815cc7863a54265262658b080c7194ec Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 28 Nov 2023 15:26:55 +0000 Subject: [PATCH 84/90] wip --- .../com/minelittlepony/unicopia/Unicopia.java | 18 ++-- .../unicopia/diet/Affliction.java | 70 ++++++++++++++++ .../unicopia/diet/AfflictionType.java | 44 ++++++++++ .../minelittlepony/unicopia/diet/Ailment.java | 23 ++++++ .../diet/ClearLoveSicknessAffliction.java | 35 ++++++++ .../unicopia/diet/CompoundAffliction.java | 50 +++++++++++ .../unicopia/diet/DietProfile.java | 82 +++++++++++++++++++ .../unicopia/diet/DietsLoader.java | 74 +++++++++++++++++ .../minelittlepony/unicopia/diet/Effect.java | 56 +++++++++++++ .../diet/MultiplyHungerAffliction.java | 43 ++++++++++ .../unicopia/diet/PonyDiets.java | 57 +++++++++++++ .../minelittlepony/unicopia/diet/Range.java | 39 +++++++++ .../unicopia/diet/StatusEffectAffliction.java | 78 ++++++++++++++++++ .../unicopia/item/toxin/Toxin.java | 1 - .../unicopia/network/MsgServerResources.java | 11 ++- .../handler/ClientNetworkHandlerImpl.java | 2 + .../resources/assets/unicopia/lang/en_us.json | 1 + .../unicopia/diets/{ => races}/alicorn.json | 0 .../data/unicopia/diets/{ => races}/bat.json | 0 .../diets/{ => races}/changeling.json | 0 .../unicopia/diets/{ => races}/earth.json | 0 .../diets/{ => races}/hippogriff.json | 0 .../unicopia/diets/{ => races}/human.json | 0 .../unicopia/diets/{ => races}/kirin.json | 0 .../unicopia/diets/{ => races}/pegasus.json | 0 .../unicopia/diets/{ => races}/seapony.json | 0 .../unicopia/diets/{ => races}/unicorn.json | 0 27 files changed, 675 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/Affliction.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/AfflictionType.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/Ailment.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/ClearLoveSicknessAffliction.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/CompoundAffliction.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/Effect.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/MultiplyHungerAffliction.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/Range.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/StatusEffectAffliction.java rename src/main/resources/data/unicopia/diets/{ => races}/alicorn.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/bat.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/changeling.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/earth.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/hippogriff.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/human.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/kirin.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/pegasus.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/seapony.json (100%) rename src/main/resources/data/unicopia/diets/{ => races}/unicorn.json (100%) diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 4b1f6f3a..e683b561 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -22,6 +22,8 @@ import com.minelittlepony.unicopia.command.Commands; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.container.SpellbookChapterLoader; import com.minelittlepony.unicopia.container.UScreenHandlers; +import com.minelittlepony.unicopia.diet.AfflictionType; +import com.minelittlepony.unicopia.diet.DietsLoader; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.effect.UPotions; import com.minelittlepony.unicopia.entity.mob.UEntities; @@ -83,11 +85,7 @@ public class Unicopia implements ModInitializer { }); NocturnalSleepManager.bootstrap(); - ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(TreeTypeLoader.INSTANCE); - ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(UEnchantments.POISONED_JOKE); - ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(new TraitLoader()); - ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(StateMapLoader.INSTANCE); - ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(SpellbookChapterLoader.INSTANCE); + registerServerDataReloaders(ResourceManagerHelper.get(ResourceType.SERVER_DATA)); UGameEvents.bootstrap(); UBlocks.bootstrap(); @@ -98,6 +96,7 @@ public class Unicopia implements ModInitializer { USounds.bootstrap(); Race.bootstrap(); SpellType.bootstrap(); + AfflictionType.bootstrap(); Abilities.bootstrap(); UScreenHandlers.bootstrap(); UWorldGen.bootstrap(); @@ -105,6 +104,15 @@ public class Unicopia implements ModInitializer { UDamageTypes.bootstrap(); } + private void registerServerDataReloaders(ResourceManagerHelper registry) { + registry.registerReloadListener(TreeTypeLoader.INSTANCE); + registry.registerReloadListener(UEnchantments.POISONED_JOKE); + registry.registerReloadListener(new TraitLoader()); + registry.registerReloadListener(StateMapLoader.INSTANCE); + registry.registerReloadListener(SpellbookChapterLoader.INSTANCE); + registry.registerReloadListener(new DietsLoader()); + } + public interface SidedAccess { Optional getPony(); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Affliction.java b/src/main/java/com/minelittlepony/unicopia/diet/Affliction.java new file mode 100644 index 00000000..d3d69b3b --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/Affliction.java @@ -0,0 +1,70 @@ +package com.minelittlepony.unicopia.diet; + +import java.util.List; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; +import net.minecraft.util.dynamic.Codecs; + +public interface Affliction { + Text NO_EFFECT_TEXT = Text.of("No Effect"); + Affliction EMPTY = new Affliction() { + @Override + public void afflict(PlayerEntity player, ItemStack stack) { } + + @Override + public Text getName() { + return NO_EFFECT_TEXT; + } + + @Override + public AfflictionType getType() { + return AfflictionType.EMPTY; + } + + @Override + public void toBuffer(PacketByteBuf buffer) { } + }; + Codec CODEC = Codecs.xor(Codec.list(AfflictionType.CODEC) + .mapResult(null) + .xmap( + afflictions -> { + afflictions.removeIf(f -> f.getType() == AfflictionType.EMPTY); + return switch (afflictions.size()) { + case 0 -> EMPTY; + case 1 -> afflictions.get(0); + default -> new CompoundAffliction(afflictions); + }; + }, + affliction -> ((CompoundAffliction)affliction).afflictions + ), AfflictionType.CODEC).xmap( + either -> either.left().or(either::right).get(), + affliction -> affliction instanceof CompoundAffliction ? Either.left(affliction) : Either.right(affliction) + ); + + void afflict(PlayerEntity player, ItemStack stack); + + default void appendTooltip(List tooltip) { + tooltip.add(getName()); + } + + Text getName(); + + AfflictionType getType(); + + void toBuffer(PacketByteBuf buffer); + + static void write(PacketByteBuf buffer, Affliction affliction) { + buffer.writeIdentifier(affliction.getType().id()); + affliction.toBuffer(buffer); + } + + static Affliction read(PacketByteBuf buffer) { + return AfflictionType.REGISTRY.get(buffer.readIdentifier()).reader().apply(buffer); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/AfflictionType.java b/src/main/java/com/minelittlepony/unicopia/diet/AfflictionType.java new file mode 100644 index 00000000..5fae39f1 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/AfflictionType.java @@ -0,0 +1,44 @@ +package com.minelittlepony.unicopia.diet; + +import com.google.gson.JsonObject; +import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.util.RegistryUtils; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; + +import net.minecraft.network.PacketByteBuf.PacketReader; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; +import net.minecraft.util.dynamic.Codecs; + +public record AfflictionType(Codec codec, Identifier id, PacketReader reader) { + public static final String DEFAULT_ID = "unicopia:apply_status_effect"; + public static final Registry> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("affliction_type"), DEFAULT_ID); + @SuppressWarnings("unchecked") + public static final Codec CODEC = Codecs.JSON_ELEMENT.flatXmap(json -> { + JsonObject obj = json.getAsJsonObject(); + return Identifier.validate(obj.has("type") ? obj.get("type").getAsString() : AfflictionType.DEFAULT_ID).flatMap(type -> { + return AfflictionType.REGISTRY.get(type).codec().parse(JsonOps.INSTANCE, json); + }); + }, thing -> { + AfflictionType type = thing.getType(); + return ((Codec)type.codec()).encodeStart(JsonOps.INSTANCE, thing).map(json -> { + if (json.isJsonObject()) { + json.getAsJsonObject().addProperty("type", type.id().toString()); + } + return json; + }); + }); + + public static final AfflictionType EMPTY = register("empty", Codec.unit(Affliction.EMPTY), buffer -> Affliction.EMPTY); + public static final AfflictionType MANY = register("many", CompoundAffliction.CODEC, CompoundAffliction::new); + public static final AfflictionType APPLY_STATUS_EFFECT = register("apply_status_effect", StatusEffectAffliction.CODEC, StatusEffectAffliction::new); + public static final AfflictionType MULTIPLY_HUNGER = register("multiply_hunger", MultiplyHungerAffliction.CODEC, MultiplyHungerAffliction::new); + public static final AfflictionType CLEAR_LOVE_SICKNESS = register("clear_love_sickness", ClearLoveSicknessAffliction.CODEC, buffer -> ClearLoveSicknessAffliction.INSTANCE); + + static AfflictionType register(String name, Codec codec, PacketReader reader) { + return Registry.register(REGISTRY, Unicopia.id(name), new AfflictionType<>(codec, Unicopia.id(name), reader)); + } + + public static void bootstrap() { } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java b/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java new file mode 100644 index 00000000..f16ae703 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java @@ -0,0 +1,23 @@ +package com.minelittlepony.unicopia.diet; + +import com.minelittlepony.unicopia.item.toxin.Toxicity; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.network.PacketByteBuf; + +public record Ailment(Toxicity toxicity, Affliction effects) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Toxicity.CODEC.fieldOf("toxicity").forGetter(Ailment::toxicity), + Affliction.CODEC.fieldOf("effects").forGetter(Ailment::effects) + ).apply(instance, Ailment::new)); + + public Ailment(PacketByteBuf buffer) { + this(Toxicity.byName(buffer.readString()), Affliction.read(buffer)); + } + + public void toBuffer(PacketByteBuf buffer) { + buffer.writeString(toxicity.name()); + Affliction.write(buffer, effects); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/ClearLoveSicknessAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/ClearLoveSicknessAffliction.java new file mode 100644 index 00000000..17bbea7d --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/ClearLoveSicknessAffliction.java @@ -0,0 +1,35 @@ +package com.minelittlepony.unicopia.diet; + +import com.minelittlepony.unicopia.entity.effect.UEffects; +import com.mojang.serialization.Codec; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; + +public final class ClearLoveSicknessAffliction implements Affliction { + public static final ClearLoveSicknessAffliction INSTANCE = new ClearLoveSicknessAffliction(); + public static final Codec CODEC = Codec.unit(INSTANCE); + + @Override + public AfflictionType getType() { + return AfflictionType.CLEAR_LOVE_SICKNESS; + } + + @Override + public void afflict(PlayerEntity player, ItemStack stack) { + player.heal(stack.isFood() ? stack.getItem().getFoodComponent().getHunger() : 1); + player.removeStatusEffect(StatusEffects.NAUSEA); + player.removeStatusEffect(UEffects.FOOD_POISONING); + } + + @Override + public Text getName() { + return Text.literal("Love"); + } + + @Override + public void toBuffer(PacketByteBuf buffer) { + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/CompoundAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/CompoundAffliction.java new file mode 100644 index 00000000..ba04a0db --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/CompoundAffliction.java @@ -0,0 +1,50 @@ +package com.minelittlepony.unicopia.diet; + +import java.util.List; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; + +class CompoundAffliction implements Affliction { + public final List afflictions; + private final Text name; + + public CompoundAffliction(List afflictions) { + this.afflictions = afflictions; + name = afflictions.stream().map(Affliction::getName).reduce(null, (a, b) -> { + return a == null ? b : a.copy().append(" + ").append(b); + }); + } + + public CompoundAffliction(PacketByteBuf buffer) { + this(buffer.readList(Affliction::read)); + } + + @Override + public void toBuffer(PacketByteBuf buffer) { + buffer.writeCollection(afflictions, Affliction::write); + } + + @Override + public AfflictionType getType() { + return AfflictionType.MANY; + } + + @Override + public void appendTooltip(List tooltip) { + afflictions.forEach(i -> i.appendTooltip(tooltip)); + } + + @Override + public Text getName() { + return name; + } + + + @Override + public void afflict(PlayerEntity player, ItemStack stack) { + afflictions.forEach(i -> i.afflict(player, stack)); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java b/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java new file mode 100644 index 00000000..bb14b3e4 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java @@ -0,0 +1,82 @@ +package com.minelittlepony.unicopia.diet; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.tag.TagKey; + +public record DietProfile( + float defaultMultiplier, + float foragingMultiplier, + List multipliers, + List effects + ) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.FLOAT.fieldOf("default_multiplier").forGetter(DietProfile::defaultMultiplier), + Codec.FLOAT.fieldOf("foraging_multiplier").forGetter(DietProfile::foragingMultiplier), + Codec.list(Multiplier.CODEC).fieldOf("multipliers").forGetter(DietProfile::multipliers), + Codec.list(Effect.CODEC).fieldOf("effects").forGetter(DietProfile::effects) + ).apply(instance, DietProfile::new)); + + public DietProfile(PacketByteBuf buffer) { + this(buffer.readFloat(), buffer.readFloat(), buffer.readList(Multiplier::new), buffer.readList(Effect::new)); + } + + public void toBuffer(PacketByteBuf buffer) { + buffer.writeFloat(defaultMultiplier); + buffer.writeFloat(foragingMultiplier); + buffer.writeCollection(multipliers, (b, t) -> t.toBuffer(b)); + buffer.writeCollection(effects, (b, t) -> t.toBuffer(b)); + } + + public Optional findMultiplier(ItemStack stack) { + return multipliers.stream().filter(m -> m.test(stack)).findFirst(); + } + + public Optional findEffect(ItemStack stack) { + return effects.stream().filter(m -> m.test(stack)).findFirst(); + } + + public record Multiplier( + Set> tags, + float hunger, + float saturation + ) implements Predicate { + public static final Codec>> TAGS_CODEC = Codec.list(TagKey.unprefixedCodec(RegistryKeys.ITEM)).xmap( + l -> l.stream().distinct().collect(Collectors.toSet()), + set -> new ArrayList<>(set) + ); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + TAGS_CODEC.fieldOf("tags").forGetter(Multiplier::tags), + Codec.FLOAT.fieldOf("hunger").forGetter(Multiplier::hunger), + Codec.FLOAT.fieldOf("saturation").forGetter(Multiplier::saturation) + ).apply(instance, Multiplier::new)); + + public Multiplier(PacketByteBuf buffer) { + this(buffer.readCollection(HashSet::new, p -> TagKey.of(RegistryKeys.ITEM, p.readIdentifier())), buffer.readFloat(), buffer.readFloat()); + } + + @Override + public boolean test(ItemStack stack) { + return tags.stream().anyMatch(tag -> stack.isIn(tag)); + } + + public void toBuffer(PacketByteBuf buffer) { + buffer.writeCollection(tags, (p, t) -> p.writeIdentifier(t.id())); + buffer.writeFloat(hunger); + buffer.writeFloat(saturation); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java b/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java new file mode 100644 index 00000000..35801d78 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java @@ -0,0 +1,74 @@ +package com.minelittlepony.unicopia.diet; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +import org.slf4j.Logger; + +import com.google.gson.JsonElement; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.util.Resources; +import com.mojang.logging.LogUtils; +import com.mojang.serialization.JsonOps; + +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.minecraft.resource.JsonDataLoader; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; +import net.minecraft.util.profiler.Profiler; + +public class DietsLoader implements IdentifiableResourceReloadListener { + private static final Logger LOGGER = LogUtils.getLogger(); + private static final Identifier ID = Unicopia.id("diets"); + + @Override + public Identifier getFabricId() { + return ID; + } + + @Override + public CompletableFuture reload(Synchronizer sync, ResourceManager manager, + Profiler prepareProfiler, Profiler applyProfiler, + Executor prepareExecutor, Executor applyExecutor) { + + var dietsLoadTask = loadData(manager, prepareExecutor, "diets/races").thenApplyAsync(data -> { + Map profiles = new HashMap<>(); + for (var entry : data.entrySet()) { + Identifier id = entry.getKey(); + Race.REGISTRY.getOrEmpty(id).ifPresentOrElse(race -> DietProfile.CODEC.parse(JsonOps.INSTANCE, entry.getValue()) + .resultOrPartial(LOGGER::error) + .ifPresent(profile -> profiles.put(race, profile)), () -> LOGGER.warn("Skipped diet for unknown race: " + id)); + } + return profiles; + }, applyExecutor); + + var effectsLoadTask = loadData(manager, prepareExecutor, "diets/food_effects").thenApplyAsync(data -> data.values().stream() + .map(value -> Effect.CODEC.parse(JsonOps.INSTANCE, value) + .resultOrPartial(LOGGER::error)) + .filter(Optional::isPresent) + .map(Optional::get) + .toList()); + + var future = CompletableFuture.allOf(dietsLoadTask, effectsLoadTask); + sync.getClass(); + return future.thenRunAsync(() -> { + PonyDiets.load(new PonyDiets( + dietsLoadTask.getNow(Map.of()), + effectsLoadTask.getNow(List.of()) + )); + }, applyExecutor); + } + + private static CompletableFuture> loadData(ResourceManager manager, Executor prepareExecutor, String path) { + return CompletableFuture.supplyAsync(() -> { + Map results = new HashMap<>(); + JsonDataLoader.load(manager, path, Resources.GSON, results); + return results; + }); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Effect.java b/src/main/java/com/minelittlepony/unicopia/diet/Effect.java new file mode 100644 index 00000000..49a3c249 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/Effect.java @@ -0,0 +1,56 @@ +package com.minelittlepony.unicopia.diet; + +import java.util.Optional; +import java.util.function.Predicate; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.tag.TagKey; + +public record Effect( + TagKey tag, + Optional foodComponent, + Ailment ailment +) implements Predicate { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + TagKey.unprefixedCodec(RegistryKeys.ITEM).fieldOf("tag").forGetter(Effect::tag), + FoodComponent.CODEC.optionalFieldOf("food_component").forGetter(Effect::foodComponent), + Ailment.CODEC.fieldOf("ailment").forGetter(Effect::ailment) + ).apply(instance, Effect::new)); + + public Effect(PacketByteBuf buffer) { + this(TagKey.of(RegistryKeys.ITEM, buffer.readIdentifier()), buffer.readOptional(FoodComponent::new), new Ailment(buffer)); + } + + public void toBuffer(PacketByteBuf buffer) { + buffer.writeIdentifier(tag.id()); + buffer.writeOptional(foodComponent, (b, f) -> f.toBuffer(b)); + ailment.toBuffer(buffer); + } + + @Override + public boolean test(ItemStack stack) { + return stack.isIn(tag); + } + + public record FoodComponent (float hunger, float saturation) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.FLOAT.fieldOf("hunger").forGetter(FoodComponent::hunger), + Codec.FLOAT.fieldOf("saturation").forGetter(FoodComponent::saturation) + ).apply(instance, FoodComponent::new)); + + public FoodComponent(PacketByteBuf buffer) { + this(buffer.readFloat(), buffer.readFloat()); + } + + public void toBuffer(PacketByteBuf buffer) { + buffer.writeFloat(hunger); + buffer.writeFloat(saturation); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/diet/MultiplyHungerAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/MultiplyHungerAffliction.java new file mode 100644 index 00000000..d503ff7e --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/MultiplyHungerAffliction.java @@ -0,0 +1,43 @@ +package com.minelittlepony.unicopia.diet; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.FoodComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; + +public record MultiplyHungerAffliction(float multiplier) implements Affliction { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.FLOAT.fieldOf("multiplier").forGetter(MultiplyHungerAffliction::multiplier) + ).apply(instance, MultiplyHungerAffliction::new)); + + public MultiplyHungerAffliction(PacketByteBuf buffer) { + this(buffer.readFloat()); + } + + @Override + public void toBuffer(PacketByteBuf buffer) { + buffer.writeFloat(multiplier); + } + + @Override + public AfflictionType getType() { + return AfflictionType.MULTIPLY_HUNGER; + } + + @Override + public void afflict(PlayerEntity player, ItemStack stack) { + FoodComponent food = stack.getItem().getFoodComponent(); + player.getHungerManager().setFoodLevel((int)(food.getHunger() * multiplier)); + player.getHungerManager().setSaturationLevel(food.getSaturationModifier() * multiplier); + } + + @Override + public Text getName() { + return Text.translatable("Lose %s%% hunger", multiplier * 100); + } + +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java b/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java new file mode 100644 index 00000000..5ef1a7e8 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java @@ -0,0 +1,57 @@ +package com.minelittlepony.unicopia.diet; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.diet.DietProfile.Multiplier; +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; + +public class PonyDiets { + private final Map diets; + private final List effects; + + static PonyDiets INSTANCE = new PonyDiets(Map.of(), List.of()); + + public static PonyDiets getinstance() { + return INSTANCE; + } + + public static void load(PonyDiets diets) { + INSTANCE = diets; + } + + PonyDiets(Map diets, List effects) { + this.diets = diets; + this.effects = effects; + } + + public PonyDiets(PacketByteBuf buffer) { + this(buffer.readMap(b -> b.readRegistryValue(Race.REGISTRY), DietProfile::new), buffer.readList(Effect::new)); + } + + public void toBuffer(PacketByteBuf buffer) { + buffer.writeMap(diets, (b, r) -> b.writeRegistryValue(Race.REGISTRY, r), (b, e) -> e.toBuffer(b)); + buffer.writeCollection(effects, (b, e) -> e.toBuffer(b)); + } + + public Optional getDiet(Race race) { + return Optional.ofNullable(diets.get(race)); + } + + public Optional getEffects(ItemStack stack) { + return effects.stream().filter(effect -> effect.test(stack)).findFirst(); + } + + public Optional getEffects(ItemStack stack, Pony pony) { + return getDiet(pony.getObservedSpecies()).flatMap(diet -> diet.findEffect(stack)).or(() -> getEffects(stack)); + } + + public Optional getMultiplier(ItemStack stack, Pony pony) { + return getDiet(pony.getObservedSpecies()).flatMap(diet -> diet.findMultiplier(stack)); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Range.java b/src/main/java/com/minelittlepony/unicopia/diet/Range.java new file mode 100644 index 00000000..5b33c3a8 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/Range.java @@ -0,0 +1,39 @@ +package com.minelittlepony.unicopia.diet; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.dynamic.Codecs; + +public record Range(int min, int max) { + public static final Codec CODEC = Codecs.xor( + Codec.INT.xmap(value -> Range.of(value, -1), range -> range.min()), + RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("min").forGetter(Range::min), + Codec.INT.fieldOf("max").forGetter(Range::max) + ).apply(instance, Range::of)) + ).xmap(either -> either.left().or(either::right).get(), l -> Either.right(l)); + + public static Range of(int min, int max) { + return new Range(min, max); + } + + public static Range of(PacketByteBuf buffer) { + return of(buffer.readInt(), buffer.readInt()); + } + + public void toBuffer(PacketByteBuf buffer) { + buffer.writeInt(min); + buffer.writeInt(max); + } + + public int getTicks(int currentTicks) { + return clamp((min * 20) + currentTicks); + } + + public int clamp(int value) { + return max > 0 ? Math.min(value, max * 20) : value; + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/diet/StatusEffectAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/StatusEffectAffliction.java new file mode 100644 index 00000000..9005b5dc --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/StatusEffectAffliction.java @@ -0,0 +1,78 @@ +package com.minelittlepony.unicopia.diet; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.registry.Registries; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import net.minecraft.util.StringHelper; +import net.minecraft.util.math.MathHelper; + +public record StatusEffectAffliction(Identifier effect, Range seconds, Range amplifier, int chance) implements Affliction { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Identifier.CODEC.fieldOf("effect").forGetter(StatusEffectAffliction::effect), + Range.CODEC.fieldOf("seconds").forGetter(StatusEffectAffliction::seconds), + Range.CODEC.optionalFieldOf("amplifier", Range.of(0, -1)).forGetter(StatusEffectAffliction::amplifier), + Codec.INT.optionalFieldOf("chance", 0).forGetter(StatusEffectAffliction::chance) + ).apply(instance, StatusEffectAffliction::new)); + + public StatusEffectAffliction(PacketByteBuf buffer) { + this(buffer.readIdentifier(), Range.of(buffer), Range.of(buffer), buffer.readInt()); + } + + public void toBuffer(PacketByteBuf buffer) { + buffer.writeIdentifier(effect); + seconds.toBuffer(buffer); + amplifier.toBuffer(buffer); + buffer.writeInt(chance); + } + + @Override + public AfflictionType getType() { + return AfflictionType.APPLY_STATUS_EFFECT; + } + + @Override + public void afflict(PlayerEntity player, ItemStack stack) { + if (chance > 0 && player.getWorld().random.nextInt(chance) > 0) { + return; + } + Registries.STATUS_EFFECT.getOrEmpty(effect).ifPresent(effect -> { + float health = player.getHealth(); + StatusEffectInstance current = player.getStatusEffect(effect); + player.addStatusEffect(new StatusEffectInstance(effect, + seconds.getTicks(current == null ? 0 : current.getDuration()), + amplifier.getTicks(current == null ? 0 : current.getAmplifier()) + )); + // keep original health + if (effect.getAttributeModifiers().containsKey(EntityAttributes.GENERIC_MAX_HEALTH)) { + player.setHealth(MathHelper.clamp(health, 0, player.getMaxHealth())); + } + }); + } + + @Override + public Text getName() { + return Registries.STATUS_EFFECT.getOrEmpty(effect).map(effect -> { + MutableText text = effect.getName().copy(); + + if (amplifier.min() > 0) { + text = Text.translatable("potion.withAmplifier", text, Text.translatable("potion.potency." + (amplifier.min() * 20))); + } + + text = Text.translatable("potion.withDuration", text, StringHelper.formatTicks(seconds.min() * 20)); + + if (chance > 0) { + text = Text.translatable("potion.withChance", chance, text); + } + return (Text)text; + }).orElse(Text.of("No Effect")); + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java index 36cbe1f8..6866a7b8 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java @@ -94,7 +94,6 @@ public interface Toxin extends Affliction { }; } - @Deprecated static Toxin of(Text name, Affliction affliction) { return new Toxin() { @Override diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java b/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java index bd08c145..dd3d8a27 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java @@ -6,6 +6,7 @@ import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.ability.data.tree.TreeTypeLoader; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.container.SpellbookChapterLoader; +import com.minelittlepony.unicopia.diet.PonyDiets; import com.sollace.fabwork.api.packets.Packet; import net.minecraft.entity.player.PlayerEntity; @@ -15,13 +16,15 @@ import net.minecraft.util.Identifier; public record MsgServerResources ( Map traits, Map chapters, - Map treeTypes + Map treeTypes, + PonyDiets diets ) implements Packet { public MsgServerResources() { this( SpellTraits.all(), SpellbookChapterLoader.INSTANCE.getChapters(), - TreeTypeLoader.INSTANCE.getEntries() + TreeTypeLoader.INSTANCE.getEntries(), + PonyDiets.getinstance() ); } @@ -29,7 +32,8 @@ public record MsgServerResources ( this( buffer.readMap(PacketByteBuf::readIdentifier, SpellTraits::fromPacket), InteractionManager.instance().readChapters(buffer), - buffer.readMap(PacketByteBuf::readIdentifier, TreeTypeLoader.TreeTypeDef::new) + buffer.readMap(PacketByteBuf::readIdentifier, TreeTypeLoader.TreeTypeDef::new), + new PonyDiets(buffer) ); } @@ -38,5 +42,6 @@ public record MsgServerResources ( buffer.writeMap(traits, PacketByteBuf::writeIdentifier, (r, v) -> v.write(r)); buffer.writeMap(chapters, PacketByteBuf::writeIdentifier, (r, v) -> ((SpellbookChapterLoader.Chapter)v).write(r)); buffer.writeMap(treeTypes, PacketByteBuf::writeIdentifier, (r, v) -> v.write(r)); + diets.toBuffer(buffer); } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/handler/ClientNetworkHandlerImpl.java b/src/main/java/com/minelittlepony/unicopia/network/handler/ClientNetworkHandlerImpl.java index a9e25256..d2dd56cd 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/handler/ClientNetworkHandlerImpl.java +++ b/src/main/java/com/minelittlepony/unicopia/network/handler/ClientNetworkHandlerImpl.java @@ -15,6 +15,7 @@ import com.minelittlepony.unicopia.client.UnicopiaClient; import com.minelittlepony.unicopia.client.gui.TribeSelectionScreen; import com.minelittlepony.unicopia.client.gui.spellbook.ClientChapters; import com.minelittlepony.unicopia.client.gui.spellbook.SpellbookChapterList.Chapter; +import com.minelittlepony.unicopia.diet.PonyDiets; import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.network.*; @@ -97,6 +98,7 @@ public class ClientNetworkHandlerImpl { SpellTraits.load(packet.traits()); ClientChapters.load((Map)packet.chapters()); TreeTypes.load(packet.treeTypes()); + PonyDiets.load(packet.diets()); } private void handlePlayerAnimation(PlayerEntity sender, MsgPlayerAnimationChange packet) { diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 6f45d142..12db0baf 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -374,6 +374,7 @@ "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "Lingering Potion of Hippogriff Metamorphosis", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "Arrow of Hippogriff Metamorphosis", + "potion.withChance": "1 in %s chance of %s", "potion.potency.6": "VII", "spell.unicopia.frost": "Frost", diff --git a/src/main/resources/data/unicopia/diets/alicorn.json b/src/main/resources/data/unicopia/diets/races/alicorn.json similarity index 100% rename from src/main/resources/data/unicopia/diets/alicorn.json rename to src/main/resources/data/unicopia/diets/races/alicorn.json diff --git a/src/main/resources/data/unicopia/diets/bat.json b/src/main/resources/data/unicopia/diets/races/bat.json similarity index 100% rename from src/main/resources/data/unicopia/diets/bat.json rename to src/main/resources/data/unicopia/diets/races/bat.json diff --git a/src/main/resources/data/unicopia/diets/changeling.json b/src/main/resources/data/unicopia/diets/races/changeling.json similarity index 100% rename from src/main/resources/data/unicopia/diets/changeling.json rename to src/main/resources/data/unicopia/diets/races/changeling.json diff --git a/src/main/resources/data/unicopia/diets/earth.json b/src/main/resources/data/unicopia/diets/races/earth.json similarity index 100% rename from src/main/resources/data/unicopia/diets/earth.json rename to src/main/resources/data/unicopia/diets/races/earth.json diff --git a/src/main/resources/data/unicopia/diets/hippogriff.json b/src/main/resources/data/unicopia/diets/races/hippogriff.json similarity index 100% rename from src/main/resources/data/unicopia/diets/hippogriff.json rename to src/main/resources/data/unicopia/diets/races/hippogriff.json diff --git a/src/main/resources/data/unicopia/diets/human.json b/src/main/resources/data/unicopia/diets/races/human.json similarity index 100% rename from src/main/resources/data/unicopia/diets/human.json rename to src/main/resources/data/unicopia/diets/races/human.json diff --git a/src/main/resources/data/unicopia/diets/kirin.json b/src/main/resources/data/unicopia/diets/races/kirin.json similarity index 100% rename from src/main/resources/data/unicopia/diets/kirin.json rename to src/main/resources/data/unicopia/diets/races/kirin.json diff --git a/src/main/resources/data/unicopia/diets/pegasus.json b/src/main/resources/data/unicopia/diets/races/pegasus.json similarity index 100% rename from src/main/resources/data/unicopia/diets/pegasus.json rename to src/main/resources/data/unicopia/diets/races/pegasus.json diff --git a/src/main/resources/data/unicopia/diets/seapony.json b/src/main/resources/data/unicopia/diets/races/seapony.json similarity index 100% rename from src/main/resources/data/unicopia/diets/seapony.json rename to src/main/resources/data/unicopia/diets/races/seapony.json diff --git a/src/main/resources/data/unicopia/diets/unicorn.json b/src/main/resources/data/unicopia/diets/races/unicorn.json similarity index 100% rename from src/main/resources/data/unicopia/diets/unicorn.json rename to src/main/resources/data/unicopia/diets/races/unicorn.json From ad7a7d84c08dbad7da283eff6a2efab33154e791 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 3 Dec 2023 02:39:55 +0000 Subject: [PATCH 85/90] New food system: - Foods fill for different amounts for different races - Certain foods can no longer be eaten by certain races - Added food categories for candy, rocks, desserts - Moved everything to datapacks --- .../com/minelittlepony/unicopia/UTags.java | 6 - .../com/minelittlepony/unicopia/Unicopia.java | 3 +- .../minelittlepony/unicopia/diet/Ailment.java | 9 +- .../unicopia/diet/DietProfile.java | 83 +++++++- .../unicopia/diet/DietView.java | 27 +++ .../unicopia/diet/DietsLoader.java | 33 ++-- .../minelittlepony/unicopia/diet/Effect.java | 66 ++++--- .../unicopia/diet/FoodAttributes.java | 60 ++++++ .../diet/MultiplyHungerAffliction.java | 43 ----- .../unicopia/diet/PonyDiets.java | 80 ++++++-- .../diet/{ => affliction}/Affliction.java | 29 ++- .../diet/{ => affliction}/AfflictionType.java | 24 ++- .../ClearLoveSicknessAffliction.java | 12 +- .../{ => affliction}/CompoundAffliction.java | 7 +- .../diet/affliction/HealingAffliction.java | 39 ++++ .../diet/affliction/LoseHungerAffliction.java | 41 ++++ .../unicopia/diet/{ => affliction}/Range.java | 12 +- .../StatusEffectAffliction.java | 13 +- .../unicopia/item/ItemDuck.java | 16 ++ .../item/{toxin => }/UFoodComponents.java | 2 +- .../minelittlepony/unicopia/item/UItems.java | 1 - .../unicopia/item/ZapAppleItem.java | 9 +- .../unicopia/item/toxin/Affliction.java | 12 -- .../unicopia/item/toxin/Ailment.java | 47 ----- .../unicopia/item/toxin/ItemDuck.java | 9 - .../unicopia/item/toxin/Toxic.java | 108 ----------- .../unicopia/item/toxin/ToxicHolder.java | 10 - .../item/toxin/ToxicRegistryEntry.java | 15 -- .../unicopia/item/toxin/Toxicity.java | 47 ----- .../unicopia/item/toxin/Toxics.java | 65 ------- .../unicopia/item/toxin/Toxin.java | 180 ------------------ .../unicopia/mixin/MixinBlockItem.java | 11 +- .../unicopia/mixin/MixinItem.java | 21 +- .../unicopia/mixin/MixinItemStack.java | 7 +- .../unicopia/mixin/client/MixinItem.java | 26 --- .../unicopia/mixin/client/MixinItemStack.java | 24 +++ .../unicopia/network/MsgServerResources.java | 2 +- .../resources/assets/unicopia/lang/en_us.json | 48 ++++- .../diets/food_effects/fish/cooked.json | 7 +- .../unicopia/diets/food_effects/fish/raw.json | 7 +- .../diets/food_effects/fish/rotten.json | 7 +- .../diets/food_effects/foraging/blinding.json | 3 +- .../food_effects/foraging/dangerous.json | 3 +- .../diets/food_effects/foraging/edible.json | 3 +- .../food_effects/foraging/edible_filling.json | 3 +- .../diets/food_effects/foraging/moderate.json | 3 +- .../food_effects/foraging/nauseating.json | 3 +- .../diets/food_effects/foraging/prickly.json | 3 +- .../food_effects/foraging/radioactive.json | 3 +- .../diets/food_effects/foraging/risky.json | 3 +- .../foraging/severely_nauseating.json | 3 +- .../foraging/severely_prickly.json | 3 +- .../food_effects/foraging/strengthening.json | 3 +- .../diets/food_effects/insect/cooked.json | 7 +- .../diets/food_effects/insect/raw.json | 7 +- .../diets/food_effects/meat/cooked.json | 7 +- .../unicopia/diets/food_effects/meat/raw.json | 7 +- .../diets/food_effects/meat/rotten.json | 7 +- .../unicopia/diets/food_effects/pinecone.json | 7 +- .../unicopia/diets/food_effects/rocks.json | 10 + .../data/unicopia/diets/races/alicorn.json | 18 +- .../data/unicopia/diets/races/bat.json | 47 ++--- .../data/unicopia/diets/races/changeling.json | 35 +--- .../data/unicopia/diets/races/earth.json | 47 ++++- .../data/unicopia/diets/races/hippogriff.json | 18 +- .../data/unicopia/diets/races/human.json | 1 - .../data/unicopia/diets/races/kirin.json | 13 +- .../data/unicopia/diets/races/pegasus.json | 20 +- .../data/unicopia/diets/races/seapony.json | 26 +-- .../data/unicopia/diets/races/unicorn.json | 7 +- .../unicopia/tags/items/food_types/candy.json | 10 + .../tags/items/food_types/desserts.json | 8 + .../unicopia/tags/items/food_types/rocks.json | 6 + src/main/resources/unicopia.mixin.json | 2 +- 74 files changed, 723 insertions(+), 891 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/DietView.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/FoodAttributes.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/diet/MultiplyHungerAffliction.java rename src/main/java/com/minelittlepony/unicopia/diet/{ => affliction}/Affliction.java (75%) rename src/main/java/com/minelittlepony/unicopia/diet/{ => affliction}/AfflictionType.java (64%) rename src/main/java/com/minelittlepony/unicopia/diet/{ => affliction}/ClearLoveSicknessAffliction.java (76%) rename src/main/java/com/minelittlepony/unicopia/diet/{ => affliction}/CompoundAffliction.java (89%) create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/affliction/HealingAffliction.java create mode 100644 src/main/java/com/minelittlepony/unicopia/diet/affliction/LoseHungerAffliction.java rename src/main/java/com/minelittlepony/unicopia/diet/{ => affliction}/Range.java (75%) rename src/main/java/com/minelittlepony/unicopia/diet/{ => affliction}/StatusEffectAffliction.java (86%) create mode 100644 src/main/java/com/minelittlepony/unicopia/item/ItemDuck.java rename src/main/java/com/minelittlepony/unicopia/item/{toxin => }/UFoodComponents.java (98%) delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/Affliction.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/ItemDuck.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicRegistryEntry.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/Toxicity.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemStack.java create mode 100644 src/main/resources/data/unicopia/diets/food_effects/rocks.json create mode 100644 src/main/resources/data/unicopia/tags/items/food_types/candy.json create mode 100644 src/main/resources/data/unicopia/tags/items/food_types/desserts.json create mode 100644 src/main/resources/data/unicopia/tags/items/food_types/rocks.json diff --git a/src/main/java/com/minelittlepony/unicopia/UTags.java b/src/main/java/com/minelittlepony/unicopia/UTags.java index 7eb7649b..91b4fcae 100644 --- a/src/main/java/com/minelittlepony/unicopia/UTags.java +++ b/src/main/java/com/minelittlepony/unicopia/UTags.java @@ -1,7 +1,5 @@ package com.minelittlepony.unicopia; -import com.minelittlepony.unicopia.item.toxin.Toxics; - import net.minecraft.block.Block; import net.minecraft.entity.EntityType; import net.minecraft.entity.damage.DamageType; @@ -79,8 +77,4 @@ public interface UTags { static TagKey dimension(String name) { return TagKey.of(RegistryKeys.DIMENSION_TYPE, new Identifier("c", name)); } - - static void bootstrap() { - Toxics.bootstrap(); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index e683b561..03e48838 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -22,8 +22,8 @@ import com.minelittlepony.unicopia.command.Commands; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.container.SpellbookChapterLoader; import com.minelittlepony.unicopia.container.UScreenHandlers; -import com.minelittlepony.unicopia.diet.AfflictionType; import com.minelittlepony.unicopia.diet.DietsLoader; +import com.minelittlepony.unicopia.diet.affliction.AfflictionType; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.effect.UPotions; import com.minelittlepony.unicopia.entity.mob.UEntities; @@ -66,7 +66,6 @@ public class Unicopia implements ModInitializer { @Override public void onInitialize() { Channel.bootstrap(); - UTags.bootstrap(); UCriteria.bootstrap(); UEntities.bootstrap(); Commands.bootstrap(); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java b/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java index f16ae703..9dadb1a8 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/Ailment.java @@ -1,23 +1,22 @@ package com.minelittlepony.unicopia.diet; -import com.minelittlepony.unicopia.item.toxin.Toxicity; +import com.minelittlepony.unicopia.diet.affliction.Affliction; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.network.PacketByteBuf; -public record Ailment(Toxicity toxicity, Affliction effects) { +public record Ailment(Affliction effects) { + public static final Ailment EMPTY = new Ailment(Affliction.EMPTY); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Toxicity.CODEC.fieldOf("toxicity").forGetter(Ailment::toxicity), Affliction.CODEC.fieldOf("effects").forGetter(Ailment::effects) ).apply(instance, Ailment::new)); public Ailment(PacketByteBuf buffer) { - this(Toxicity.byName(buffer.readString()), Affliction.read(buffer)); + this(Affliction.read(buffer)); } public void toBuffer(PacketByteBuf buffer) { - buffer.writeString(toxicity.name()); Affliction.write(buffer, effects); } } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java b/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java index bb14b3e4..46900f8f 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java @@ -8,30 +8,43 @@ import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.item.ItemDuck; +import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.FoodComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketByteBuf; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.UseAction; public record DietProfile( float defaultMultiplier, float foragingMultiplier, List multipliers, - List effects + List effects, + Optional defaultEffect ) { + public static final DietProfile EMPTY = new DietProfile(1, 1, List.of(), List.of(), Optional.empty()); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.FLOAT.fieldOf("default_multiplier").forGetter(DietProfile::defaultMultiplier), Codec.FLOAT.fieldOf("foraging_multiplier").forGetter(DietProfile::foragingMultiplier), Codec.list(Multiplier.CODEC).fieldOf("multipliers").forGetter(DietProfile::multipliers), - Codec.list(Effect.CODEC).fieldOf("effects").forGetter(DietProfile::effects) + Codec.list(Effect.CODEC).fieldOf("effects").forGetter(DietProfile::effects), + Effect.CODEC.optionalFieldOf("default_effect").forGetter(DietProfile::defaultEffect) ).apply(instance, DietProfile::new)); public DietProfile(PacketByteBuf buffer) { - this(buffer.readFloat(), buffer.readFloat(), buffer.readList(Multiplier::new), buffer.readList(Effect::new)); + this(buffer.readFloat(), buffer.readFloat(), buffer.readList(Multiplier::new), buffer.readList(Effect::new), buffer.readOptional(Effect::new)); } public void toBuffer(PacketByteBuf buffer) { @@ -39,6 +52,7 @@ public record DietProfile( buffer.writeFloat(foragingMultiplier); buffer.writeCollection(multipliers, (b, t) -> t.toBuffer(b)); buffer.writeCollection(effects, (b, t) -> t.toBuffer(b)); + buffer.writeOptional(defaultEffect, (b, t) -> t.toBuffer(b)); } public Optional findMultiplier(ItemStack stack) { @@ -46,7 +60,68 @@ public record DietProfile( } public Optional findEffect(ItemStack stack) { - return effects.stream().filter(m -> m.test(stack)).findFirst(); + return effects.stream().filter(m -> m.test(stack)).findFirst().or(this::defaultEffect); + } + + static boolean isForaged(ItemStack stack) { + return ((ItemDuck)stack.getItem()).getOriginalFoodComponent().isEmpty(); + } + + @Nullable + public FoodComponent getAdjustedFoodComponent(ItemStack stack) { + var food = stack.getItem().getFoodComponent(); + if (this == EMPTY) { + return food; + } + + var ratios = getRatios(stack); + if (isInedible(ratios)) { + return null; + } + + return FoodAttributes.copy(food) + .hunger(Math.max(1, (int)(food.getHunger() * ratios.getFirst()))) + .saturationModifier(food.getSaturationModifier() * ratios.getSecond()) + .build(); + } + + public boolean isInedible(ItemStack stack) { + return isInedible(getRatios(stack)); + } + + public boolean isInedible(Pair ratios) { + return ratios.getFirst() <= 0.01F && ratios.getSecond() <= 0.01F; + } + + public Pair getRatios(ItemStack stack) { + Optional multiplier = findMultiplier(stack); + + float baseMultiplier = (isForaged(stack) ? foragingMultiplier() : defaultMultiplier()); + float hungerMultiplier = multiplier.map(Multiplier::hunger).orElse(baseMultiplier); + float saturationMultiplier = multiplier.map(Multiplier::saturation).orElse(baseMultiplier); + return Pair.of(hungerMultiplier, saturationMultiplier); + } + + public void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipContext context) { + var food = stack.getItem().getFoodComponent(); + var ratios = getRatios(stack); + if (food == null || isInedible(ratios)) { + if (stack.getUseAction() != UseAction.DRINK) { + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.not_edible")).formatted(Formatting.DARK_GRAY)); + } + return; + } + + float baseMultiplier = (isForaged(stack) ? foragingMultiplier() : defaultMultiplier()); + + if (context.isAdvanced()) { + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.base_multiplier", baseMultiplier).formatted(Formatting.DARK_GRAY))); + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.hunger.detailed", Math.max(1, (int)(ratios.getFirst() * food.getHunger())), food.getHunger(), (int)(ratios.getFirst() * 100))).formatted(Formatting.DARK_GRAY)); + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.saturation.detailed", String.format("%.2f", ratios.getSecond() * food.getSaturationModifier()), (int)(ratios.getSecond() * 100))).formatted(Formatting.DARK_GRAY)); + } else { + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.hunger", (int)(ratios.getFirst() * 100))).formatted(Formatting.DARK_GRAY)); + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.saturation", (int)(ratios.getSecond() * 100))).formatted(Formatting.DARK_GRAY)); + } } public record Multiplier( diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietView.java b/src/main/java/com/minelittlepony/unicopia/diet/DietView.java new file mode 100644 index 00000000..4d872462 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietView.java @@ -0,0 +1,27 @@ +package com.minelittlepony.unicopia.diet; + +import java.util.List; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.client.item.TooltipContext; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; + +public interface DietView { + TypedActionResult startUsing(ItemStack stack, World world, PlayerEntity user, Hand hand); + + void finishUsing(ItemStack stack, World world, LivingEntity entity); + + void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipContext context); + + interface Holder { + default DietView getDiets(ItemStack stack) { + return PonyDiets.getInstance(); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java b/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java index 35801d78..963efb77 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietsLoader.java @@ -40,23 +40,34 @@ public class DietsLoader implements IdentifiableResourceReloadListener { Map profiles = new HashMap<>(); for (var entry : data.entrySet()) { Identifier id = entry.getKey(); - Race.REGISTRY.getOrEmpty(id).ifPresentOrElse(race -> DietProfile.CODEC.parse(JsonOps.INSTANCE, entry.getValue()) - .resultOrPartial(LOGGER::error) - .ifPresent(profile -> profiles.put(race, profile)), () -> LOGGER.warn("Skipped diet for unknown race: " + id)); + try { + Race.REGISTRY.getOrEmpty(id).ifPresentOrElse(race -> { + DietProfile.CODEC.parse(JsonOps.INSTANCE, entry.getValue()) + .resultOrPartial(error -> LOGGER.error("Could not load diet profile {}: {}", id, error)) + .ifPresent(profile -> profiles.put(race, profile)); + }, () -> LOGGER.warn("Skipped diet for unknown race: " + id)); + } catch (Throwable t) { + LOGGER.error("Could not load diet profile {}", id, t); + } } return profiles; - }, applyExecutor); + }, prepareExecutor); - var effectsLoadTask = loadData(manager, prepareExecutor, "diets/food_effects").thenApplyAsync(data -> data.values().stream() - .map(value -> Effect.CODEC.parse(JsonOps.INSTANCE, value) - .resultOrPartial(LOGGER::error)) + var effectsLoadTask = loadData(manager, prepareExecutor, "diets/food_effects").thenApplyAsync(data -> data.entrySet().stream() + .map(entry -> { + try { + return Effect.CODEC.parse(JsonOps.INSTANCE, entry.getValue()) + .resultOrPartial(error -> LOGGER.error("Could not load food effect {}: {}", entry.getKey(), error)); + } catch (Throwable t) { + LOGGER.error("Could not load food effects {}", entry.getKey(), t); + } + return Optional.empty(); + }) .filter(Optional::isPresent) .map(Optional::get) - .toList()); + .toList(), prepareExecutor); - var future = CompletableFuture.allOf(dietsLoadTask, effectsLoadTask); - sync.getClass(); - return future.thenRunAsync(() -> { + return CompletableFuture.allOf(dietsLoadTask, effectsLoadTask).thenCompose(sync::whenPrepared).thenRunAsync(() -> { PonyDiets.load(new PonyDiets( dietsLoadTask.getNow(Map.of()), effectsLoadTask.getNow(List.of()) diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Effect.java b/src/main/java/com/minelittlepony/unicopia/diet/Effect.java index 49a3c249..4d0f1bb4 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/Effect.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/Effect.java @@ -1,56 +1,76 @@ package com.minelittlepony.unicopia.diet; +import java.util.List; import java.util.Optional; import java.util.function.Predicate; +import com.minelittlepony.unicopia.entity.player.Pony; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.item.FoodComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketByteBuf; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.UseAction; +import net.minecraft.util.Util; public record Effect( - TagKey tag, + List> tags, Optional foodComponent, Ailment ailment ) implements Predicate { + public static final Effect EMPTY = new Effect(List.of(), Optional.empty(), Ailment.EMPTY); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - TagKey.unprefixedCodec(RegistryKeys.ITEM).fieldOf("tag").forGetter(Effect::tag), - FoodComponent.CODEC.optionalFieldOf("food_component").forGetter(Effect::foodComponent), + TagKey.unprefixedCodec(RegistryKeys.ITEM).listOf().fieldOf("tags").forGetter(Effect::tags), + FoodAttributes.CODEC.optionalFieldOf("food_component").forGetter(Effect::foodComponent), Ailment.CODEC.fieldOf("ailment").forGetter(Effect::ailment) ).apply(instance, Effect::new)); public Effect(PacketByteBuf buffer) { - this(TagKey.of(RegistryKeys.ITEM, buffer.readIdentifier()), buffer.readOptional(FoodComponent::new), new Ailment(buffer)); + this(buffer.readList(b -> TagKey.of(RegistryKeys.ITEM, b.readIdentifier())), buffer.readOptional(FoodAttributes::read), new Ailment(buffer)); + } + + public void afflict(Pony pony, ItemStack stack) { + ailment().effects().afflict(pony.asEntity(), stack); + } + + public void appendTooltip(ItemStack stack, List tooltip, TooltipContext context) { + int size = tooltip.size(); + tags.forEach(tag -> { + if (stack.isIn(tag)) { + tooltip.add(Text.literal(" ").append(Text.translatable(Util.createTranslationKey("tag", tag.id()))).formatted(Formatting.GRAY)); + } + }); + if (tooltip.size() == size) { + if (stack.isFood()) { + tooltip.add(Text.literal(" ").append(Text.translatable("tag.unicopia.food_types.fruits_and_vegetables")).formatted(Formatting.GRAY)); + } else if (stack.getUseAction() == UseAction.DRINK) { + tooltip.add(Text.literal(" ").append(Text.translatable("tag.unicopia.food_types.drinks")).formatted(Formatting.GRAY)); + } + } + + if (context.isAdvanced() && stack.isFood()) { + if (!ailment().effects().isEmpty()) { + tooltip.add(Text.translatable("unicopia.diet.side_effects").formatted(Formatting.DARK_PURPLE)); + ailment().effects().appendTooltip(tooltip); + } + } } public void toBuffer(PacketByteBuf buffer) { - buffer.writeIdentifier(tag.id()); - buffer.writeOptional(foodComponent, (b, f) -> f.toBuffer(b)); + buffer.writeCollection(tags, (b, t) -> b.writeIdentifier(t.id())); + buffer.writeOptional(foodComponent, FoodAttributes::write); ailment.toBuffer(buffer); } @Override public boolean test(ItemStack stack) { - return stack.isIn(tag); - } - - public record FoodComponent (float hunger, float saturation) { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.FLOAT.fieldOf("hunger").forGetter(FoodComponent::hunger), - Codec.FLOAT.fieldOf("saturation").forGetter(FoodComponent::saturation) - ).apply(instance, FoodComponent::new)); - - public FoodComponent(PacketByteBuf buffer) { - this(buffer.readFloat(), buffer.readFloat()); - } - - public void toBuffer(PacketByteBuf buffer) { - buffer.writeFloat(hunger); - buffer.writeFloat(saturation); - } + return tags.stream().anyMatch(stack::isIn); } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/diet/FoodAttributes.java b/src/main/java/com/minelittlepony/unicopia/diet/FoodAttributes.java new file mode 100644 index 00000000..d1682982 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/FoodAttributes.java @@ -0,0 +1,60 @@ +package com.minelittlepony.unicopia.diet; + +import java.util.List; + +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.item.FoodComponent; +import net.minecraft.network.PacketByteBuf; + +final class FoodAttributes { + static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("hunger").forGetter(FoodComponent::getHunger), + Codec.FLOAT.fieldOf("saturation").forGetter(FoodComponent::getSaturationModifier), + Codec.BOOL.optionalFieldOf("petFood", false).forGetter(FoodComponent::isMeat), + Codec.BOOL.optionalFieldOf("fastFood", false).forGetter(FoodComponent::isAlwaysEdible), + Codec.BOOL.optionalFieldOf("eatenQuickly", false).forGetter(FoodComponent::isSnack) + ).apply(instance, FoodAttributes::create)); + + static FoodComponent create(int hunger, float saturation, boolean petFood, boolean fastFood, boolean eatenQuickly) { + return create(hunger, saturation, petFood, fastFood, eatenQuickly, List.of()).build(); + } + + static FoodComponent.Builder create(int hunger, float saturation, boolean petFood, boolean fastFood, boolean eatenQuickly, List> effects) { + var builder = new FoodComponent.Builder() + .hunger(hunger) + .saturationModifier(saturation); + if (petFood) { + builder.meat(); + } + if (fastFood) { + builder.alwaysEdible(); + } + if (eatenQuickly) { + builder.snack(); + } + for (var effect : effects) { + builder.statusEffect(effect.getFirst(), effect.getSecond()); + } + return builder; + } + + static FoodComponent.Builder copy(FoodComponent food) { + return create(food.getHunger(), food.getSaturationModifier(), food.isMeat(), food.isAlwaysEdible(), food.isSnack(), food.getStatusEffects()); + } + + static FoodComponent read(PacketByteBuf buffer) { + return create(buffer.readInt(), buffer.readFloat(), buffer.readBoolean(), buffer.readBoolean(), buffer.readBoolean()); + } + + static void write(PacketByteBuf buffer, FoodComponent food) { + buffer.writeInt(food.getHunger()); + buffer.writeFloat(food.getSaturationModifier()); + buffer.writeBoolean(food.isMeat()); + buffer.writeBoolean(food.isAlwaysEdible()); + buffer.writeBoolean(food.isSnack()); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/MultiplyHungerAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/MultiplyHungerAffliction.java deleted file mode 100644 index d503ff7e..00000000 --- a/src/main/java/com/minelittlepony/unicopia/diet/MultiplyHungerAffliction.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.minelittlepony.unicopia.diet; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.FoodComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.text.Text; - -public record MultiplyHungerAffliction(float multiplier) implements Affliction { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.FLOAT.fieldOf("multiplier").forGetter(MultiplyHungerAffliction::multiplier) - ).apply(instance, MultiplyHungerAffliction::new)); - - public MultiplyHungerAffliction(PacketByteBuf buffer) { - this(buffer.readFloat()); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeFloat(multiplier); - } - - @Override - public AfflictionType getType() { - return AfflictionType.MULTIPLY_HUNGER; - } - - @Override - public void afflict(PlayerEntity player, ItemStack stack) { - FoodComponent food = stack.getItem().getFoodComponent(); - player.getHungerManager().setFoodLevel((int)(food.getHunger() * multiplier)); - player.getHungerManager().setSaturationLevel(food.getSaturationModifier() * multiplier); - } - - @Override - public Text getName() { - return Text.translatable("Lose %s%% hunger", multiplier * 100); - } - -} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java b/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java index 5ef1a7e8..a9b5459b 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java @@ -4,20 +4,30 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.diet.DietProfile.Multiplier; -import com.minelittlepony.unicopia.entity.player.Pony; +import org.jetbrains.annotations.Nullable; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.entity.effect.FoodPoisoningStatusEffect; +import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.item.ItemDuck; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; -public class PonyDiets { +public class PonyDiets implements DietView { private final Map diets; private final List effects; - static PonyDiets INSTANCE = new PonyDiets(Map.of(), List.of()); + private static PonyDiets INSTANCE = new PonyDiets(Map.of(), List.of()); - public static PonyDiets getinstance() { + public static PonyDiets getInstance() { return INSTANCE; } @@ -39,19 +49,61 @@ public class PonyDiets { buffer.writeCollection(effects, (b, e) -> e.toBuffer(b)); } - public Optional getDiet(Race race) { - return Optional.ofNullable(diets.get(race)); + private DietProfile getDiet(Pony pony) { + return Optional.ofNullable(diets.get(pony.getObservedSpecies())).orElse(DietProfile.EMPTY); } - public Optional getEffects(ItemStack stack) { - return effects.stream().filter(effect -> effect.test(stack)).findFirst(); + private Effect getEffects(ItemStack stack) { + return effects.stream().filter(effect -> effect.test(stack)).findFirst().orElse(Effect.EMPTY); } - public Optional getEffects(ItemStack stack, Pony pony) { - return getDiet(pony.getObservedSpecies()).flatMap(diet -> diet.findEffect(stack)).or(() -> getEffects(stack)); + private Effect getEffects(ItemStack stack, Pony pony) { + return getDiet(pony).findEffect(stack).orElseGet(() -> getEffects(stack)); } - public Optional getMultiplier(ItemStack stack, Pony pony) { - return getDiet(pony.getObservedSpecies()).flatMap(diet -> diet.findMultiplier(stack)); + @Override + public TypedActionResult startUsing(ItemStack stack, World world, PlayerEntity user, Hand hand) { + return initEdibility(stack, user) + ? FoodPoisoningStatusEffect.apply(stack, user) + : TypedActionResult.fail(stack); + } + + @Override + public void finishUsing(ItemStack stack, World world, LivingEntity entity) { + if (initEdibility(stack, entity)) { + Pony.of(entity).ifPresent(pony -> getEffects(stack, pony).afflict(pony, stack)); + } + } + + @Override + public void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipContext context) { + if (initEdibility(stack, user)) { + Pony pony = Pony.of(user); + + tooltip.add(Text.translatable("unicopia.diet.information").formatted(Formatting.DARK_PURPLE)); + getEffects(stack, pony).appendTooltip(stack, tooltip, context); + getDiet(pony).appendTooltip(stack, user, tooltip, context); + } + } + + private boolean initEdibility(ItemStack stack, LivingEntity user) { + ItemDuck item = (ItemDuck)stack.getItem(); + item.resetFoodComponent(); + return Pony.of(user).filter(pony -> { + DietProfile diet = getDiet(pony); + + if (!stack.isFood() && pony.getObservedSpecies().hasIronGut()) { + diet.findEffect(stack) + .flatMap(Effect::foodComponent) + .or(() -> getEffects(stack).foodComponent()) + .ifPresent(item::setFoodComponent); + } + + if (stack.isFood()) { + item.setFoodComponent(diet.getAdjustedFoodComponent(stack)); + } + + return true; + }).isPresent(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Affliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Affliction.java similarity index 75% rename from src/main/java/com/minelittlepony/unicopia/diet/Affliction.java rename to src/main/java/com/minelittlepony/unicopia/diet/affliction/Affliction.java index d3d69b3b..013d3f51 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/Affliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Affliction.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.diet; +package com.minelittlepony.unicopia.diet.affliction; import java.util.List; @@ -9,19 +9,14 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketByteBuf; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.dynamic.Codecs; public interface Affliction { - Text NO_EFFECT_TEXT = Text.of("No Effect"); Affliction EMPTY = new Affliction() { @Override public void afflict(PlayerEntity player, ItemStack stack) { } - @Override - public Text getName() { - return NO_EFFECT_TEXT; - } - @Override public AfflictionType getType() { return AfflictionType.EMPTY; @@ -30,11 +25,9 @@ public interface Affliction { @Override public void toBuffer(PacketByteBuf buffer) { } }; - Codec CODEC = Codecs.xor(Codec.list(AfflictionType.CODEC) - .mapResult(null) - .xmap( + Codec CODEC = Codecs.xor(AfflictionType.CODEC, Codec.list(AfflictionType.CODEC).xmap( afflictions -> { - afflictions.removeIf(f -> f.getType() == AfflictionType.EMPTY); + afflictions = afflictions.stream().filter(f -> !f.isEmpty()).toList(); return switch (afflictions.size()) { case 0 -> EMPTY; case 1 -> afflictions.get(0); @@ -42,18 +35,24 @@ public interface Affliction { }; }, affliction -> ((CompoundAffliction)affliction).afflictions - ), AfflictionType.CODEC).xmap( + )).xmap( either -> either.left().or(either::right).get(), affliction -> affliction instanceof CompoundAffliction ? Either.left(affliction) : Either.right(affliction) ); void afflict(PlayerEntity player, ItemStack stack); - default void appendTooltip(List tooltip) { - tooltip.add(getName()); + default boolean isEmpty() { + return getType() == AfflictionType.EMPTY; } - Text getName(); + default void appendTooltip(List tooltip) { + tooltip.add(Text.literal(" ").append(getName()).formatted(Formatting.DARK_GRAY)); + } + + default Text getName() { + return Text.translatable(getType().getTranslationKey()); + } AfflictionType getType(); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/AfflictionType.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/AfflictionType.java similarity index 64% rename from src/main/java/com/minelittlepony/unicopia/diet/AfflictionType.java rename to src/main/java/com/minelittlepony/unicopia/diet/affliction/AfflictionType.java index 5fae39f1..6d9f405f 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/AfflictionType.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/AfflictionType.java @@ -1,14 +1,16 @@ -package com.minelittlepony.unicopia.diet; +package com.minelittlepony.unicopia.diet.affliction; -import com.google.gson.JsonObject; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.util.RegistryUtils; import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; import com.mojang.serialization.JsonOps; import net.minecraft.network.PacketByteBuf.PacketReader; import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; +import net.minecraft.util.JsonHelper; +import net.minecraft.util.Util; import net.minecraft.util.dynamic.Codecs; public record AfflictionType(Codec codec, Identifier id, PacketReader reader) { @@ -16,10 +18,11 @@ public record AfflictionType(Codec codec, Identifier id public static final Registry> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("affliction_type"), DEFAULT_ID); @SuppressWarnings("unchecked") public static final Codec CODEC = Codecs.JSON_ELEMENT.flatXmap(json -> { - JsonObject obj = json.getAsJsonObject(); - return Identifier.validate(obj.has("type") ? obj.get("type").getAsString() : AfflictionType.DEFAULT_ID).flatMap(type -> { - return AfflictionType.REGISTRY.get(type).codec().parse(JsonOps.INSTANCE, json); - }); + if (!json.isJsonObject()) { + return DataResult.error(() -> "Not a JSON object"); + } + return Identifier.validate(JsonHelper.getString(JsonHelper.asObject(json, "affliction"), "type", AfflictionType.DEFAULT_ID)) + .flatMap(type -> AfflictionType.REGISTRY.get(type).codec().parse(JsonOps.INSTANCE, json)); }, thing -> { AfflictionType type = thing.getType(); return ((Codec)type.codec()).encodeStart(JsonOps.INSTANCE, thing).map(json -> { @@ -33,12 +36,17 @@ public record AfflictionType(Codec codec, Identifier id public static final AfflictionType EMPTY = register("empty", Codec.unit(Affliction.EMPTY), buffer -> Affliction.EMPTY); public static final AfflictionType MANY = register("many", CompoundAffliction.CODEC, CompoundAffliction::new); public static final AfflictionType APPLY_STATUS_EFFECT = register("apply_status_effect", StatusEffectAffliction.CODEC, StatusEffectAffliction::new); - public static final AfflictionType MULTIPLY_HUNGER = register("multiply_hunger", MultiplyHungerAffliction.CODEC, MultiplyHungerAffliction::new); - public static final AfflictionType CLEAR_LOVE_SICKNESS = register("clear_love_sickness", ClearLoveSicknessAffliction.CODEC, buffer -> ClearLoveSicknessAffliction.INSTANCE); + public static final AfflictionType LOSE_HUNGER = register("lose_hunger", LoseHungerAffliction.CODEC, LoseHungerAffliction::new); + public static final AfflictionType HEALING = register("healing", HealingAffliction.CODEC, HealingAffliction::new); + public static final AfflictionType CURE_LOVE_SICKNESS = register("cure_love_sickness", ClearLoveSicknessAffliction.CODEC, buffer -> ClearLoveSicknessAffliction.INSTANCE); static AfflictionType register(String name, Codec codec, PacketReader reader) { return Registry.register(REGISTRY, Unicopia.id(name), new AfflictionType<>(codec, Unicopia.id(name), reader)); } + public String getTranslationKey() { + return Util.createTranslationKey("affliction", id()); + } + public static void bootstrap() { } } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/ClearLoveSicknessAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/ClearLoveSicknessAffliction.java similarity index 76% rename from src/main/java/com/minelittlepony/unicopia/diet/ClearLoveSicknessAffliction.java rename to src/main/java/com/minelittlepony/unicopia/diet/affliction/ClearLoveSicknessAffliction.java index 17bbea7d..79343432 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/ClearLoveSicknessAffliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/ClearLoveSicknessAffliction.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.diet; +package com.minelittlepony.unicopia.diet.affliction; import com.minelittlepony.unicopia.entity.effect.UEffects; import com.mojang.serialization.Codec; @@ -6,15 +6,14 @@ import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketByteBuf; -import net.minecraft.text.Text; -public final class ClearLoveSicknessAffliction implements Affliction { +final class ClearLoveSicknessAffliction implements Affliction { public static final ClearLoveSicknessAffliction INSTANCE = new ClearLoveSicknessAffliction(); public static final Codec CODEC = Codec.unit(INSTANCE); @Override public AfflictionType getType() { - return AfflictionType.CLEAR_LOVE_SICKNESS; + return AfflictionType.CURE_LOVE_SICKNESS; } @Override @@ -24,11 +23,6 @@ public final class ClearLoveSicknessAffliction implements Affliction { player.removeStatusEffect(UEffects.FOOD_POISONING); } - @Override - public Text getName() { - return Text.literal("Love"); - } - @Override public void toBuffer(PacketByteBuf buffer) { } diff --git a/src/main/java/com/minelittlepony/unicopia/diet/CompoundAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/CompoundAffliction.java similarity index 89% rename from src/main/java/com/minelittlepony/unicopia/diet/CompoundAffliction.java rename to src/main/java/com/minelittlepony/unicopia/diet/affliction/CompoundAffliction.java index ba04a0db..d41cf4ad 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/CompoundAffliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/CompoundAffliction.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.diet; +package com.minelittlepony.unicopia.diet.affliction; import java.util.List; @@ -32,6 +32,11 @@ class CompoundAffliction implements Affliction { return AfflictionType.MANY; } + @Override + public boolean isEmpty() { + return afflictions.isEmpty(); + } + @Override public void appendTooltip(List tooltip) { afflictions.forEach(i -> i.appendTooltip(tooltip)); diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/HealingAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/HealingAffliction.java new file mode 100644 index 00000000..71590879 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/HealingAffliction.java @@ -0,0 +1,39 @@ +package com.minelittlepony.unicopia.diet.affliction; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; + +record HealingAffliction(float health) implements Affliction { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.FLOAT.fieldOf("health").forGetter(HealingAffliction::health) + ).apply(instance, HealingAffliction::new)); + + public HealingAffliction(PacketByteBuf buffer) { + this(buffer.readFloat()); + } + + @Override + public void toBuffer(PacketByteBuf buffer) { + buffer.writeFloat(health); + } + + @Override + public AfflictionType getType() { + return AfflictionType.HEALING; + } + + @Override + public void afflict(PlayerEntity player, ItemStack stack) { + player.heal(health()); + } + + @Override + public Text getName() { + return Text.translatable(getType().getTranslationKey(), health()); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/LoseHungerAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/LoseHungerAffliction.java new file mode 100644 index 00000000..fe9ff84f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/LoseHungerAffliction.java @@ -0,0 +1,41 @@ +package com.minelittlepony.unicopia.diet.affliction; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; + +public record LoseHungerAffliction(float multiplier) implements Affliction { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.FLOAT.fieldOf("multiplier").forGetter(LoseHungerAffliction::multiplier) + ).apply(instance, LoseHungerAffliction::new)); + + public LoseHungerAffliction(PacketByteBuf buffer) { + this(buffer.readFloat()); + } + + @Override + public void toBuffer(PacketByteBuf buffer) { + buffer.writeFloat(multiplier); + } + + @Override + public AfflictionType getType() { + return AfflictionType.LOSE_HUNGER; + } + + @Override + public void afflict(PlayerEntity player, ItemStack stack) { + var hunger = player.getHungerManager(); + hunger.setFoodLevel((int)(hunger.getFoodLevel() * multiplier)); + hunger.setSaturationLevel(hunger.getSaturationLevel() * multiplier); + } + + @Override + public Text getName() { + return Text.translatable(getType().getTranslationKey(), multiplier * 100); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/diet/Range.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java similarity index 75% rename from src/main/java/com/minelittlepony/unicopia/diet/Range.java rename to src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java index 5b33c3a8..dfe7e009 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/Range.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.diet; +package com.minelittlepony.unicopia.diet.affliction; import com.mojang.datafixers.util.Either; import com.mojang.serialization.Codec; @@ -7,7 +7,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.network.PacketByteBuf; import net.minecraft.util.dynamic.Codecs; -public record Range(int min, int max) { +record Range(int min, int max) { public static final Codec CODEC = Codecs.xor( Codec.INT.xmap(value -> Range.of(value, -1), range -> range.min()), RecordCodecBuilder.create(instance -> instance.group( @@ -29,11 +29,11 @@ public record Range(int min, int max) { buffer.writeInt(max); } - public int getTicks(int currentTicks) { - return clamp((min * 20) + currentTicks); + public int getClamped(int currentTicks, int multiplier) { + return clamp((min * multiplier) + currentTicks, multiplier); } - public int clamp(int value) { - return max > 0 ? Math.min(value, max * 20) : value; + public int clamp(int value, int multiplier) { + return max > 0 ? Math.min(value, max * multiplier) : value; } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/diet/StatusEffectAffliction.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/StatusEffectAffliction.java similarity index 86% rename from src/main/java/com/minelittlepony/unicopia/diet/StatusEffectAffliction.java rename to src/main/java/com/minelittlepony/unicopia/diet/affliction/StatusEffectAffliction.java index 9005b5dc..d0c0b91c 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/StatusEffectAffliction.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/StatusEffectAffliction.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.diet; +package com.minelittlepony.unicopia.diet.affliction; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -15,7 +15,7 @@ import net.minecraft.util.Identifier; import net.minecraft.util.StringHelper; import net.minecraft.util.math.MathHelper; -public record StatusEffectAffliction(Identifier effect, Range seconds, Range amplifier, int chance) implements Affliction { +record StatusEffectAffliction(Identifier effect, Range seconds, Range amplifier, int chance) implements Affliction { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Identifier.CODEC.fieldOf("effect").forGetter(StatusEffectAffliction::effect), Range.CODEC.fieldOf("seconds").forGetter(StatusEffectAffliction::seconds), @@ -27,6 +27,7 @@ public record StatusEffectAffliction(Identifier effect, Range seconds, Range amp this(buffer.readIdentifier(), Range.of(buffer), Range.of(buffer), buffer.readInt()); } + @Override public void toBuffer(PacketByteBuf buffer) { buffer.writeIdentifier(effect); seconds.toBuffer(buffer); @@ -48,8 +49,8 @@ public record StatusEffectAffliction(Identifier effect, Range seconds, Range amp float health = player.getHealth(); StatusEffectInstance current = player.getStatusEffect(effect); player.addStatusEffect(new StatusEffectInstance(effect, - seconds.getTicks(current == null ? 0 : current.getDuration()), - amplifier.getTicks(current == null ? 0 : current.getAmplifier()) + seconds.getClamped(current == null ? 0 : current.getDuration(), 20), + amplifier.getClamped(current == null ? 0 : current.getAmplifier(), 1) )); // keep original health if (effect.getAttributeModifiers().containsKey(EntityAttributes.GENERIC_MAX_HEALTH)) { @@ -64,7 +65,7 @@ public record StatusEffectAffliction(Identifier effect, Range seconds, Range amp MutableText text = effect.getName().copy(); if (amplifier.min() > 0) { - text = Text.translatable("potion.withAmplifier", text, Text.translatable("potion.potency." + (amplifier.min() * 20))); + text = Text.translatable("potion.withAmplifier", text, Text.translatable("potion.potency." + (amplifier.min()))); } text = Text.translatable("potion.withDuration", text, StringHelper.formatTicks(seconds.min() * 20)); @@ -73,6 +74,6 @@ public record StatusEffectAffliction(Identifier effect, Range seconds, Range amp text = Text.translatable("potion.withChance", chance, text); } return (Text)text; - }).orElse(Text.of("No Effect")); + }).orElse(EMPTY.getName()); } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemDuck.java b/src/main/java/com/minelittlepony/unicopia/item/ItemDuck.java new file mode 100644 index 00000000..ee280da5 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemDuck.java @@ -0,0 +1,16 @@ +package com.minelittlepony.unicopia.item; + +import java.util.Optional; + +import com.minelittlepony.unicopia.entity.ItemImpl; +import net.minecraft.item.*; + +public interface ItemDuck extends ItemConvertible, ItemImpl.TickableItem { + void setFoodComponent(FoodComponent food); + + Optional getOriginalFoodComponent(); + + default void resetFoodComponent() { + setFoodComponent(getOriginalFoodComponent().orElse(null)); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java b/src/main/java/com/minelittlepony/unicopia/item/UFoodComponents.java similarity index 98% rename from src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java rename to src/main/java/com/minelittlepony/unicopia/item/UFoodComponents.java index 4d71bd2f..24dcf544 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/UFoodComponents.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UFoodComponents.java @@ -1,4 +1,4 @@ -package com.minelittlepony.unicopia.item.toxin; +package com.minelittlepony.unicopia.item; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 97c99e4e..e9863be6 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -12,7 +12,6 @@ import com.minelittlepony.unicopia.item.cloud.CloudBedItem; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.item.group.ItemGroupRegistry; import com.minelittlepony.unicopia.item.group.UItemGroups; -import com.minelittlepony.unicopia.item.toxin.UFoodComponents; import com.terraformersmc.terraform.boat.api.TerraformBoatType; import com.terraformersmc.terraform.boat.api.TerraformBoatTypeRegistry; import com.terraformersmc.terraform.boat.api.item.TerraformBoatItemHelper; diff --git a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java index 9d104e56..711cbec8 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java @@ -9,7 +9,6 @@ import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.item.group.MultiItem; -import com.minelittlepony.unicopia.item.toxin.*; import com.minelittlepony.unicopia.particle.LightningBoltParticleEffect; import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.util.TraceHelper; @@ -36,7 +35,7 @@ import net.minecraft.registry.Registries; import net.minecraft.world.World; import net.minecraft.world.event.GameEvent; -public class ZapAppleItem extends Item implements ChameleonItem, ToxicHolder, MultiItem { +public class ZapAppleItem extends Item implements ChameleonItem, MultiItem { public ZapAppleItem(Settings settings) { super(settings); } @@ -117,12 +116,6 @@ public class ZapAppleItem extends Item implements ChameleonItem, ToxicHolder, Mu return hasAppearance(stack) ? getAppearanceStack(stack).getName() : super.getName(stack); } - @SuppressWarnings("deprecation") - @Override - public Toxic getToxic(ItemStack stack, LivingEntity entity) { - return hasAppearance(stack) ? Toxic.SEVERE_INNERT : Toxics.FORAGE_EDIBLE; - } - @Override public Rarity getRarity(ItemStack stack) { if (hasAppearance(stack)) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Affliction.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Affliction.java deleted file mode 100644 index f2350be5..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Affliction.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; - -public interface Affliction { - void afflict(PlayerEntity player, ItemStack stack); - - interface Predicate { - boolean test(PlayerEntity player, ItemStack stack); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java deleted file mode 100644 index 0fa02187..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import java.util.*; - -import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.entity.player.Pony; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.Text; - -public record Ailment ( - Toxicity toxicity, - Toxin effect - ) { - public static final Ailment INNERT = of(Toxicity.SAFE, Toxin.INNERT); - - @Deprecated - public static Ailment of(Toxicity toxicity, Toxin effect) { - return new Ailment(toxicity, effect); - } - - public void appendTooltip(List tooltip, TooltipContext context) { - tooltip.add(toxicity().getTooltip()); - if (context.isAdvanced()) { - effect().appendTooltip(tooltip); - } - } - - public interface Set { - Set EMPTY = e -> Optional.empty(); - - Optional get(LivingEntity entity); - - static Ailment.Set of(Ailment def, Map map) { - if (map.isEmpty()) { - return of(def); - } - return entity -> Optional.of(entity instanceof PlayerEntity player ? map.getOrDefault(Pony.of(player).getObservedSpecies(), def) : def); - } - - static Ailment.Set of(Ailment ailment) { - final Optional value = Optional.of(ailment); - return entity -> value; - } - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/ItemDuck.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/ItemDuck.java deleted file mode 100644 index 4ff27425..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/ItemDuck.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import com.minelittlepony.unicopia.entity.ItemImpl; - -import net.minecraft.item.*; - -public interface ItemDuck extends ItemConvertible, ToxicHolder, ItemImpl.TickableItem { - void setFoodComponent(FoodComponent food); -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java deleted file mode 100644 index d2810839..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import static com.minelittlepony.unicopia.item.toxin.Toxicity.FAIR; -import static com.minelittlepony.unicopia.item.toxin.Toxicity.SEVERE; -import java.util.*; -import java.util.function.Function; - -import com.minelittlepony.unicopia.Race; -import com.minelittlepony.unicopia.entity.effect.FoodPoisoningStatusEffect; -import com.minelittlepony.unicopia.entity.player.Pony; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.FoodComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.util.UseAction; -import net.minecraft.world.World; - -public record Toxic ( - Optional useAction, - Function> food, - Ailment.Set ailment - ) { - public static final Toxic EMPTY = new Toxic(Optional.empty(), entity -> Optional.empty(), Ailment.Set.EMPTY); - /** - * Default for all food that doesn't have a mapping - */ - @Deprecated - public static final Toxic DEFAULT = new Toxic.Builder(Ailment.INNERT) - .with(Race.CHANGELING, new Ailment(FAIR, Toxin.LOVE_SICKNESS)) - .with(Race.SEAPONY, new Ailment(FAIR, Toxin.FOOD_POISONING)) - .build(); - - public static final Toxic SEVERE_INNERT = new Builder(new Ailment(SEVERE, Toxin.INNERT)).build(); - - public void appendTooltip(PlayerEntity player, List tooltip, TooltipContext context) { - ailment.get(player).ifPresent(ailment -> ailment.appendTooltip(tooltip, context)); - } - - public TypedActionResult startUsing(ItemStack stack, World world, PlayerEntity user, Hand hand) { - if (stack.getItem() instanceof BlockItem && ailment().get(user).isPresent() && !Pony.of(user).getObservedSpecies().hasIronGut()) { - return TypedActionResult.fail(stack); - } - return FoodPoisoningStatusEffect.apply(stack, user); - } - - public void finishUsing(ItemStack stack, World world, LivingEntity entity) { - if (entity instanceof PlayerEntity player) { - ailment.get(entity).ifPresent(ailment -> ailment.effect().afflict(player, stack)); - } - if (stack.isFood() || stack.getUseAction() == UseAction.DRINK) { - Pony.of(entity).ifPresent(pony -> pony.onEat(stack)); - } - } - - @Deprecated - public static class Builder { - private final Ailment def; - private final Map overrides = new HashMap<>(); - private Optional action = Optional.of(UseAction.EAT); - private final Map components = new HashMap<>(); - private Optional component = Optional.empty(); - - public Builder(Ailment def) { - this.def = def; - } - - public Builder action(UseAction action) { - this.action = Optional.of(action); - return this; - } - - public Builder food(FoodComponent food) { - component = Optional.ofNullable(food); - return this; - } - - public Builder food(Race race, FoodComponent food) { - components.put(race, food); - return this; - } - - public Builder with(Race race, Ailment ailment) { - overrides.put(race, ailment); - return this; - } - - public Builder with(Ailment ailment, Race... races) { - for (Race race : races) { - overrides.put(race, ailment); - } - return this; - } - - public Toxic build() { - return new Toxic(action, entity -> { - if (entity instanceof PlayerEntity player) { - return Optional.ofNullable(components.get(Pony.of(player).getObservedSpecies())).or(() -> component); - } - return component; - }, Ailment.Set.of(def, overrides)); - } - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java deleted file mode 100644 index a873170c..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import org.jetbrains.annotations.Nullable; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.*; - -public interface ToxicHolder { - Toxic getToxic(ItemStack stack, @Nullable LivingEntity entity); -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicRegistryEntry.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicRegistryEntry.java deleted file mode 100644 index 7c4e51ba..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicRegistryEntry.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import net.minecraft.item.Item; -import net.minecraft.registry.tag.TagKey; - -@Deprecated -public record ToxicRegistryEntry ( - Toxic value, - TagKey tag - ) { - - public boolean matches(Item item) { - return item.getRegistryEntry().isIn(tag); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxicity.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxicity.java deleted file mode 100644 index 43355b79..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxicity.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import java.util.Arrays; -import java.util.Locale; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.StringIdentifiable; - -public enum Toxicity implements StringIdentifiable { - SAFE(Formatting.GRAY), - MILD(Formatting.DARK_AQUA), - FAIR(Formatting.DARK_BLUE), - SEVERE(Formatting.DARK_PURPLE), - LETHAL(Formatting.RED); - - private static final Map REGISTRY = Arrays.stream(values()).collect(Collectors.toMap(Toxicity::name, Function.identity())); - @SuppressWarnings("deprecation") - public static final Codec CODEC = StringIdentifiable.createCodec(Toxicity::values); - - private final Formatting color; - private final String name = name().toLowerCase(Locale.ROOT); - - Toxicity(Formatting color) { - this.color = color; - } - - public String getTranslationKey() { - return String.format("toxicity.%s.name", name().toLowerCase()); - } - - public Text getTooltip() { - return Text.translatable(getTranslationKey()).formatted(color); - } - - public static Toxicity byName(String name) { - return REGISTRY.get(name.toUpperCase()); - } - - @Override - public String asString() { - return name; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java deleted file mode 100644 index 30e0a97f..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import com.minelittlepony.unicopia.*; -import com.minelittlepony.unicopia.util.RegistryUtils; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.FoodComponent; -import net.minecraft.registry.Registry; - -import static com.minelittlepony.unicopia.item.toxin.Toxicity.*; -import static com.minelittlepony.unicopia.item.toxin.Ailment.*; -import static com.minelittlepony.unicopia.item.toxin.Toxin.*; - -import org.jetbrains.annotations.Nullable; - -@Deprecated -public interface Toxics { - Registry REGISTRY = RegistryUtils.createSimple(Unicopia.id("toxic")); - Toxic FORAGE_EDIBLE = register("forage_edible", new Toxic.Builder(Ailment.INNERT).food(UFoodComponents.RANDOM_FOLIAGE).with(Race.HUMAN, of(LETHAL, FOOD_POISONING)).with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)).with(Race.SEAPONY, of(FAIR, FOOD_POISONING))); - - static void bootstrap() { - register("forage_edible_filling", new Toxic.Builder(Ailment.INNERT).food(UFoodComponents.RANDOM_FOLIAGE_FILLING).with(Race.CHANGELING, of(FAIR, LOVE_SICKNESS)).with(Race.SEAPONY, of(FAIR, FOOD_POISONING))); - register("forage_risky", new Toxic.Builder(of(FAIR, FOOD_POISONING.withChance(20))).food(UFoodComponents.RANDOM_FOLIAGE)); - register("forage_moderate", new Toxic.Builder(of(MILD, FOOD_POISONING)).food(UFoodComponents.RANDOM_FOLIAGE)); - register("forage_dangerous", new Toxic.Builder(of(SEVERE, FOOD_POISONING)).food(UFoodComponents.RANDOM_FOLIAGE)); - register("forage_nauseating", new Toxic.Builder(of(SAFE, FOOD_POISONING.and(WEAKNESS.withChance(30)))).food(UFoodComponents.RANDOM_FOLIAGE)); - register("forage_radioactive", new Toxic.Builder(of(SAFE, FOOD_POISONING.and(GLOWING.withChance(30)))).food(UFoodComponents.RANDOM_FOLIAGE)); - register("forage_prickly", new Toxic.Builder(of(SAFE, INSTANT_DAMAGE.withChance(30))).food(UFoodComponents.RANDOM_FOLIAGE).with(Ailment.INNERT, Race.HIPPOGRIFF, Race.KIRIN)); - register("forage_strengthening", new Toxic.Builder(of(SEVERE, STRENGTH.and(FOOD_POISONING))).food(UFoodComponents.RANDOM_FOLIAGE).with(Race.KIRIN, Ailment.INNERT)); - register("forage_severely_nauseating", new Toxic.Builder(of(SEVERE, FOOD_POISONING.and(WEAKNESS))).food(UFoodComponents.RANDOM_FOLIAGE)); - register("forage_blinding", new Toxic.Builder(of(SEVERE, BLINDNESS.and(FOOD_POISONING))).food(UFoodComponents.RANDOM_FOLIAGE).with(Race.KIRIN, Ailment.INNERT)); - register("forage_severely_prickly", new Toxic.Builder(of(SEVERE, FOOD_POISONING.and(INSTANT_DAMAGE))).food(UFoodComponents.RANDOM_FOLIAGE).with(Race.KIRIN, Ailment.INNERT)); - register("raw_meat", new Toxic.Builder(of(SEVERE, FOOD_POISONING.withChance(5).and(CHANCE_OF_POISON))).with(Ailment.INNERT, Race.HUMAN, Race.CHANGELING, Race.KIRIN).with(of(MILD, FOOD_POISONING), Race.BAT)); - register("rotten_meat", new Toxic.Builder(of(SEVERE, STRONG_FOOD_POISONING)).with(Ailment.INNERT, Race.HUMAN, Race.CHANGELING).with(of(MILD, FOOD_POISONING), Race.BAT)); - register("cooked_meat", new Toxic.Builder(of(FAIR, FOOD_POISONING)).with(Ailment.INNERT, Race.HUMAN, Race.CHANGELING, Race.BAT, Race.KIRIN).with(of(MILD, FOOD_POISONING), Race.HIPPOGRIFF)); - register("raw_fish", new Toxic.Builder(of(FAIR, FOOD_POISONING.and(CHANCE_OF_POISON))).with(Ailment.INNERT, Race.HUMAN, Race.HIPPOGRIFF, Race.SEAPONY, Race.ALICORN).with(of(MILD, FOOD_POISONING), Race.PEGASUS).with(of(FAIR, LOVE_SICKNESS), Race.CHANGELING)); - register("cooked_fish", new Toxic.Builder(of(MILD, FOOD_POISONING)).with(Ailment.INNERT, Race.HUMAN, Race.PEGASUS, Race.HIPPOGRIFF, Race.SEAPONY, Race.ALICORN).with(of(FAIR, LOVE_SICKNESS), Race.CHANGELING)); - register("raw_insect", new Toxic.Builder(of(LETHAL, FOOD_POISONING)).food(UFoodComponents.INSECTS).with(Ailment.INNERT, Race.CHANGELING).with(of(MILD, WEAK_FOOD_POISONING), Race.BAT)); - register("cooked_insect", new Toxic.Builder(of(LETHAL, FOOD_POISONING)).food(UFoodComponents.INSECTS).with(Ailment.INNERT, Race.CHANGELING, Race.KIRIN, Race.BAT)); - register("love", new Toxic.Builder(Ailment.INNERT).with(of(Toxicity.SAFE, Toxin.LOVE_CONSUMPTION), Race.CHANGELING)); - register("bat_ponys_delight", new Toxic.Builder(Ailment.INNERT).with(of(Toxicity.SAFE, Toxin.BAT_PONY_INTOXICATION), Race.BAT)); - register("raw_sea_vegitable", new Toxic.Builder(Ailment.INNERT).food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE)); - register("cooked_sea_vegitable", new Toxic.Builder(Ailment.INNERT).food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE_FILLING)); - register("shells", new Toxic.Builder(Ailment.INNERT).food(Race.SEAPONY, UFoodComponents.SHELL)); - register("shelly", new Toxic.Builder(Ailment.INNERT).food(Race.SEAPONY, UFoodComponents.SHELLY)); - register("pinecone", new Toxic.Builder(of(Toxicity.SAFE, Toxin.healing(1))).with(Ailment.INNERT, Race.HUMAN).with(of(Toxicity.SAFE, Toxin.healing(3)), Race.HIPPOGRIFF)); - } - - static Toxic register(String name, Toxic.Builder builder) { - return Registry.register(REGISTRY, Unicopia.id(name), new ToxicRegistryEntry(builder.build(), UTags.item("food_types/" + name))).value(); - } - - static Toxic lookup(ItemDuck item, @Nullable LivingEntity entity) { - @Nullable FoodComponent food = item.asItem().getFoodComponent(); - return REGISTRY.stream() - .filter(i -> i.matches(item.asItem())) - .map(ToxicRegistryEntry::value) - .map(t -> { - if (food == null) { - t.food().apply(entity).ifPresent(item::setFoodComponent); - } - return t; - }).findFirst().orElse(food == null ? Toxic.EMPTY : Toxic.DEFAULT); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java deleted file mode 100644 index 6866a7b8..00000000 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxin.java +++ /dev/null @@ -1,180 +0,0 @@ -package com.minelittlepony.unicopia.item.toxin; - -import java.util.List; - -import com.minelittlepony.unicopia.entity.effect.UEffects; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.FoodComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.StringHelper; -import net.minecraft.util.math.MathHelper; - -public interface Toxin extends Affliction { - Toxin INNERT = of(Text.of("No Effect"), (player, stack) -> {}); - @Deprecated - Toxin INSTANT_DAMAGE = of(StatusEffects.INSTANT_DAMAGE, 1, 0); - @Deprecated - Toxin GLOWING = of(StatusEffects.GLOWING, 15, 0); - @Deprecated - Toxin WEAKNESS = of(StatusEffects.WEAKNESS, 200, 1); - @Deprecated - Toxin STRENGTH = of(StatusEffects.STRENGTH, 30, 0); - @Deprecated - Toxin BLINDNESS = of(StatusEffects.BLINDNESS, 30, 0); - @Deprecated - Toxin CHANCE_OF_POISON = of(StatusEffects.POISON, 45, 2).withChance(80); - @Deprecated - Toxin FOOD_POISONING = of(UEffects.FOOD_POISONING, 100, 2); - @Deprecated - Toxin WEAK_FOOD_POISONING = of(UEffects.FOOD_POISONING, 50, 1); - @Deprecated - Toxin STRONG_FOOD_POISONING = of(UEffects.FOOD_POISONING, 400, 3); - - @Deprecated - Toxin LOVE_SICKNESS = of(Text.of("Love Sickness "), (player, stack) -> { - FoodComponent food = stack.getItem().getFoodComponent(); - player.getHungerManager().add(-food.getHunger()/2, -food.getSaturationModifier()/2); - }).and(FOOD_POISONING).and(WEAKNESS); - - @Deprecated - Toxin LOVE_CONSUMPTION = of(Text.literal("Love"), (player, stack) -> { - player.heal(stack.isFood() ? stack.getItem().getFoodComponent().getHunger() : 1); - player.removeStatusEffect(StatusEffects.NAUSEA); - player.removeStatusEffect(UEffects.FOOD_POISONING); - }); - - @Deprecated - Toxin BAT_PONY_INTOXICATION = Toxin.of(StatusEffects.HEALTH_BOOST, 30, 60, 2, 6) - .and(Toxin.of(StatusEffects.JUMP_BOOST, 30, 60, 1, 6)) - .and(Toxin.of(StatusEffects.SPEED, 30, 30, 1, 6)) - .and(Toxin.of(StatusEffects.REGENERATION, 3, 30, 3, 6)); - - @Deprecated - static Toxin healing(int hearts) { - return of(Text.literal("Healing " + hearts + " Hearts"), (player, stack) -> player.heal(hearts)); - } - - default void appendTooltip(List tooltip) { - tooltip.add(getName()); - } - - @Deprecated - default Toxin withChance(int max) { - return Predicate.of(Text.of("1 in " + max + " chance of "), (player, stack) -> player.getWorld().random.nextInt(max) == 0).then(this); - } - - Text getName(); - - @Deprecated - default Toxin and(Toxin other) { - Toxin self = this; - return new Toxin() { - @Override - public void afflict(PlayerEntity player, ItemStack stack) { - self.afflict(player, stack); - other.afflict(player, stack); - } - - @Override - public void appendTooltip(List tooltip) { - self.appendTooltip(tooltip); - other.appendTooltip(tooltip); - } - - @Override - public Text getName() { - return self.getName().copy().append(" + ").append(other.getName()); - } - }; - } - - static Toxin of(Text name, Affliction affliction) { - return new Toxin() { - @Override - public void afflict(PlayerEntity player, ItemStack stack) { - affliction.afflict(player, stack); - } - - @Override - public Text getName() { - return name; - } - }; - } - - @Deprecated - static Toxin of(StatusEffect effect, int seconds, int amplifier) { - return of(effect, seconds, -1, amplifier, -1); - } - - static Toxin of(StatusEffect effect, int seconds, int maxSeconds, int amplifier, int maxAmplifier) { - final int ticks = seconds * 20; - final int maxTicks = maxSeconds * 20; - - MutableText text = effect.getName().copy(); - - if (amplifier > 0) { - text = Text.translatable("potion.withAmplifier", text, Text.translatable("potion.potency." + amplifier)); - } - - text = Text.translatable("potion.withDuration", text, StringHelper.formatTicks(ticks)); - - return of(text, (player, stack) -> { - float health = player.getHealth(); - StatusEffectInstance current = player.getStatusEffect(effect); - int t = applyLimit(ticks + (current == null ? 0 : current.getDuration()), maxTicks); - int a = applyLimit(amplifier + (current == null ? 0 : current.getAmplifier()), maxAmplifier); - player.addStatusEffect(new StatusEffectInstance(effect, t, a)); - // keep original health - if (effect.getAttributeModifiers().containsKey(EntityAttributes.GENERIC_MAX_HEALTH)) { - player.setHealth(MathHelper.clamp(health, 0, player.getMaxHealth())); - } - }); - } - - private static int applyLimit(int value, int max) { - return max > 0 ? Math.min(value, max) : value; - } - - interface Predicate { - static Predicate of(Text name, Affliction.Predicate predicate) { - return new Predicate() { - @Override - public boolean test(PlayerEntity player, ItemStack stack) { - return predicate.test(player, stack); - } - - @Override - public Text getName() { - return name; - } - }; - } - - boolean test(PlayerEntity player, ItemStack stack); - - Text getName(); - - default Toxin then(Toxin toxin) { - return new Toxin() { - @Override - public void afflict(PlayerEntity player, ItemStack stack) { - if (test(player, stack)) { - toxin.afflict(player, stack); - } - } - - @Override - public Text getName() { - return Predicate.this.getName().copy().append(toxin.getName()); - } - }; - } - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java index 5cb06970..c7970a50 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java @@ -5,24 +5,21 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.minelittlepony.unicopia.item.toxin.ToxicHolder; import com.minelittlepony.unicopia.server.world.WaterLoggingManager; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.util.UseAction; @Mixin(BlockItem.class) -abstract class MixinBlockItem extends Item implements ToxicHolder { +abstract class MixinBlockItem extends Item { MixinBlockItem() {super(null); } - @Override + /*@Override public UseAction getUseAction(ItemStack stack) { - return getToxic(stack, null).useAction().orElseGet(() -> super.getUseAction(stack)); - } + return PonyDiets.getinstance().getUseAction(stack).orElseGet(() -> super.getUseAction(stack)); + }*/ @Inject(method = "getPlacementState", at = @At("RETURN"), cancellable = true) private void onGetPlacementState(ItemPlacementContext context, CallbackInfoReturnable info) { diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java index 5670dbbe..cad3a18e 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java @@ -2,26 +2,26 @@ package com.minelittlepony.unicopia.mixin; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; import com.google.common.base.Suppliers; +import com.minelittlepony.unicopia.diet.DietView; import com.minelittlepony.unicopia.entity.ItemImpl; import com.minelittlepony.unicopia.entity.ItemImpl.GroundTickCallback; -import com.minelittlepony.unicopia.item.toxin.*; - -import net.minecraft.entity.LivingEntity; +import com.minelittlepony.unicopia.item.ItemDuck; import net.minecraft.item.FoodComponent; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; @Mixin(Item.class) -abstract class MixinItem implements ItemDuck { +abstract class MixinItem implements ItemDuck, DietView.Holder { private final List tickCallbacks = new ArrayList<>(); - private final Supplier originalFoodComponent = Suppliers.memoize(((Item)(Object)this)::getFoodComponent); + private final Supplier> originalFoodComponent = Suppliers.memoize(() -> { + return Optional.ofNullable(((Item)(Object)this).getFoodComponent()); + }); @Override public List getCallbacks() { @@ -34,10 +34,7 @@ abstract class MixinItem implements ItemDuck { public abstract void setFoodComponent(FoodComponent food); @Override - public Toxic getToxic(ItemStack stack, @Nullable LivingEntity entity) { - if (entity != null) { - setFoodComponent(originalFoodComponent.get()); - } - return Toxics.lookup(this, entity); + public Optional getOriginalFoodComponent() { + return originalFoodComponent.get(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java index 118f1b4c..35658fea 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItemStack.java @@ -5,8 +5,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.minelittlepony.unicopia.item.toxin.ToxicHolder; - +import com.minelittlepony.unicopia.diet.DietView; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -20,7 +19,7 @@ abstract class MixinItemStack { @Inject(method = "use", at = @At("HEAD"), cancellable = true) private void onUse(World world, PlayerEntity user, Hand hand, CallbackInfoReturnable> info) { ItemStack self = (ItemStack)(Object)this; - TypedActionResult result = ((ToxicHolder)self.getItem()).getToxic(self, user).startUsing(self, world, user, hand); + TypedActionResult result = ((DietView.Holder)self.getItem()).getDiets(self).startUsing(self, world, user, hand); if (result.getResult() != ActionResult.PASS) { info.setReturnValue(result); } @@ -29,6 +28,6 @@ abstract class MixinItemStack { @Inject(method = "finishUsing", at = @At("HEAD")) private void onFinishUsing(World world, LivingEntity user, CallbackInfoReturnable info) { ItemStack self = (ItemStack)(Object)this; - ((ToxicHolder)self.getItem()).getToxic(self, user).finishUsing(self, world, user); + ((DietView.Holder)self.getItem()).getDiets(self).finishUsing(self, world, user); } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java deleted file mode 100644 index 9918c27c..00000000 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.minelittlepony.unicopia.mixin.client; - -import java.util.List; -import org.jetbrains.annotations.Nullable; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.minelittlepony.unicopia.item.toxin.ToxicHolder; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -@Mixin(Item.class) -abstract class MixinItem implements ToxicHolder { - @Inject(method = "appendTooltip", at = @At("RETURN")) - private void onAppendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context, CallbackInfo into) { - getToxic(stack, MinecraftClient.getInstance().player).appendTooltip(MinecraftClient.getInstance().player, tooltip, context); - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemStack.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemStack.java new file mode 100644 index 00000000..81a3b67f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItemStack.java @@ -0,0 +1,24 @@ +package com.minelittlepony.unicopia.mixin.client; + +import java.util.List; +import org.jetbrains.annotations.Nullable; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.minelittlepony.unicopia.diet.DietView; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +@Mixin(ItemStack.class) +abstract class MixinItemStack { + @Inject(method = "getTooltip", at = @At("RETURN")) + private void onGetTooltip(@Nullable PlayerEntity player, TooltipContext context, CallbackInfoReturnable> info) { + ItemStack self = (ItemStack)(Object)this; + ((DietView.Holder)self.getItem()).getDiets(self).appendTooltip(self, player, info.getReturnValue(), context); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java b/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java index dd3d8a27..715a0180 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgServerResources.java @@ -24,7 +24,7 @@ public record MsgServerResources ( SpellTraits.all(), SpellbookChapterLoader.INSTANCE.getChapters(), TreeTypeLoader.INSTANCE.getEntries(), - PonyDiets.getinstance() + PonyDiets.getInstance() ); } diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 12db0baf..33c35b1e 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -469,11 +469,57 @@ "trait.unicopia.poison.name": "Poison", "trait.unicopia.poison.description": "A deadly dart kill a beast.", + "unicopia.diet.information": "Diet Information:", + "unicopia.diet.side_effects": "Side-Effects:", + "unicopia.diet.not_edible": "Item is not edible", + "unicopia.diet.base_multiplier": "Base Multiplier: %s%%", + "unicopia.diet.hunger.detailed": "Hunger gained: %s of %s (%s%%)", + "unicopia.diet.saturation.detailed": "Saturation gained: %s (%s%%)", + "unicopia.diet.hunger": "Hunger Ratio: %s%%", + "unicopia.diet.saturation": "Saturation Ratio: %s%%", + + "tag.unicopia.food_types.rotten_meat": "Rotting Meat", + "tag.unicopia.food_types.raw_meat": "Fresh Meat", + "tag.unicopia.food_types.cooked_meat": "Prepared Meat", + "tag.unicopia.food_types.raw_fish": "Fresh Fish", + "tag.unicopia.food_types.cooked_fish": "Prepared Fish", + "tag.unicopia.food_types.raw_insect": "Bugs & Insects", + "tag.unicopia.food_types.cooked_insect": "Cooked Bugs & Insects", + "tag.unicopia.food_types.love": "Love", + "tag.unicopia.food_types.rocks": "Rocks", + "tag.unicopia.food_types.pinecone": "Nuts & Seeds", + "tag.unicopia.food_types.bat_ponys_delight": "Bat Pony Treats", + "tag.unicopia.food_types.cooked_sea_vegitables": "Prepared Fish Food", + "tag.unicopia.food_types.raw_sea_vegitables": "Fresh Fish Food", + "tag.unicopia.food_types.shells": "Sea Shells", + "tag.unicopia.food_types.shelly": "Sea Shells", + "tag.unicopia.food_types.candy": "Candy", + "tag.unicopia.food_types.desserts": "Desserts", + "tag.unicopia.food_types.fruits_and_vegetables": "Fruits & Vegetables", + "tag.unicopia.food_types.drinks": "Drinks", + + "tag.unicopia.food_types.forage_edible_filling": "Bulky Plant Matter", + "tag.unicopia.food_types.forage_edible": "Plant Matter", + "tag.unicopia.food_types.forage_nauseating": "Nauseating", + "tag.unicopia.food_types.forage_prickly": "Prickly", + "tag.unicopia.food_types.forage_risky": "Unsafe", + "tag.unicopia.food_types.forage_strengthening": "Strength Enhancing", + "tag.unicopia.food_types.forage_severely_prickly": "Very Prickly", + "tag.unicopia.food_types.forage_severely_nauseating": "Sickening", + "tag.unicopia.food_types.forage_radioactive": "Glowy", + "tag.unicopia.food_types.forage_dangerous": "Dangerous", + "tag.unicopia.food_types.forage_blinding": "Toxic", + "toxicity.safe.name": "Safe", "toxicity.mild.name": "Mildly Toxic", "toxicity.fair.name": "Fairly Toxic", "toxicity.severe.name": "Toxic", "toxicity.lethal.name": "Lethal", + + "affliction.unicopia.empty": "No Effect", + "affliction.unicopia.healing": "Gain %s%% health", + "affliction.unicopia.cure_love_sickness": "Cure Love Sickness", + "affliction.unicopia.lose_hunger": "Lose %s%% hunger", "ability.unicopia.shoot": "Shoot Magic", "ability.unicopia.shoot.with_spell": "Shoot %s", @@ -1068,7 +1114,7 @@ "advancements.unicopia.apple_route.description": "Start your journey towards the apple of legend", "advancements.unicopia.juice.title": "Refreshing", "advancements.unicopia.juice.description": "Finally a use for all these apples", - "advancements.unicopia.toast.title": "He Crispy and delicious!", + "advancements.unicopia.toast.title": "He's Crispy and delicious!", "advancements.unicopia.toast.description": "Make a toasted companion", "advancements.unicopia.burn_toast.title": "Toasty NOOOOOOO!", "advancements.unicopia.burn_toast.description": "Burn Toasty", diff --git a/src/main/resources/data/unicopia/diets/food_effects/fish/cooked.json b/src/main/resources/data/unicopia/diets/food_effects/fish/cooked.json index deb27a4a..423e578f 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/fish/cooked.json +++ b/src/main/resources/data/unicopia/diets/food_effects/fish/cooked.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/cooked_fish", + "tags": [ "unicopia:food_types/cooked_fish" ], + "food_component": { + "hunger": 1, + "saturation": 0.1 + }, "ailment": { - "toxicity": "fair", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/food_effects/fish/raw.json b/src/main/resources/data/unicopia/diets/food_effects/fish/raw.json index 49c0fa62..40368a26 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/fish/raw.json +++ b/src/main/resources/data/unicopia/diets/food_effects/fish/raw.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/raw_fish", + "tags": [ "unicopia:food_types/raw_fish" ], + "food_component": { + "hunger": 1, + "saturation": 0.1 + }, "ailment": { - "toxicity": "risky", "effects": [ { "effect": "minecraft:poison", diff --git a/src/main/resources/data/unicopia/diets/food_effects/fish/rotten.json b/src/main/resources/data/unicopia/diets/food_effects/fish/rotten.json index 6259f9a2..4259828b 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/fish/rotten.json +++ b/src/main/resources/data/unicopia/diets/food_effects/fish/rotten.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/rotten_fish", + "tags": [ "unicopia:food_types/rotten_fish" ], + "food_component": { + "hunger": 1, + "saturation": 0.1 + }, "ailment": { - "toxicity": "severe", "effects": [ { "effect": "minecraft:poison", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/blinding.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/blinding.json index c9d1e15e..ca392e74 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/blinding.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/blinding.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_blinding", + "tags": [ "unicopia:food_types/forage_blinding" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "severe", "effects": [ { "effect": "minecraft:blindness", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/dangerous.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/dangerous.json index 7ba1dfbb..372abede 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/dangerous.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/dangerous.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_dangerous", + "tags": [ "unicopia:food_types/forage_dangerous" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "mild", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/edible.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/edible.json index 0142aeab..33887410 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/edible.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/edible.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_edible", + "tags": [ "unicopia:food_types/forage_edible" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [] } } \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/edible_filling.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/edible_filling.json index 8ee0ec31..b6721b3f 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/edible_filling.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/edible_filling.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_edible_filling", + "tags": [ "unicopia:food_types/forage_edible_filling" ], "food_component": { "hunger": 18, "saturation": 9 }, "ailment": { - "toxicity": "safe", "effects": [] } } \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/moderate.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/moderate.json index 1a6682cb..4d7a238a 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/moderate.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/moderate.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_moderate", + "tags": [ "unicopia:food_types/forage_moderate" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "mild", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/nauseating.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/nauseating.json index 03b8943f..e79628a0 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/nauseating.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/nauseating.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_nauseating", + "tags": [ "unicopia:food_types/forage_nauseating" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "severe", "effects": [ { "effect": "minecraft:weakness", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/prickly.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/prickly.json index f341f99c..d3c61180 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/prickly.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/prickly.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_prickly", + "tags": [ "unicopia:food_types/forage_prickly" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [ { "effect": "minecraft:instant_damage", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/radioactive.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/radioactive.json index 911aba9d..7a023788 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/radioactive.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/radioactive.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_radioactive", + "tags": [ "unicopia:food_types/forage_radioactive" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "severe", "effects": [ { "effect": "minecraft:glowing", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/risky.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/risky.json index c7053b6d..9ee5d1dc 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/risky.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/risky.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_risky", + "tags": [ "unicopia:food_types/forage_risky" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "fair", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_nauseating.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_nauseating.json index fe8dd8a5..7f4ef36e 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_nauseating.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_nauseating.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_severely_nauseating", + "tags": [ "unicopia:food_types/forage_severely_nauseating" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "severe", "effects": [ { "effect": "minecraft:weakness", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_prickly.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_prickly.json index 263e9bdd..3b5a1cd6 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_prickly.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/severely_prickly.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_severely_prickly", + "tags": [ "unicopia:food_types/forage_severely_prickly" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "severe", "effects": [ { "effect": "minecraft:instant_damage", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/strengthening.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/strengthening.json index 9d12fd6c..11477833 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/foraging/strengthening.json +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/strengthening.json @@ -1,11 +1,10 @@ { - "tag": "unicopia:food_types/forage_strengthening", + "tags": [ "unicopia:food_types/forage_strengthening" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [ { "effect": "minecraft:strength", diff --git a/src/main/resources/data/unicopia/diets/food_effects/insect/cooked.json b/src/main/resources/data/unicopia/diets/food_effects/insect/cooked.json index fe3dcc3d..9dbdc566 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/insect/cooked.json +++ b/src/main/resources/data/unicopia/diets/food_effects/insect/cooked.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/cooked_insect", + "tags": [ "unicopia:food_types/cooked_insect" ], + "food_component": { + "hunger": 1, + "saturation": 0.1 + }, "ailment": { - "toxicity": "severe", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/food_effects/insect/raw.json b/src/main/resources/data/unicopia/diets/food_effects/insect/raw.json index 3d9d2860..8683f240 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/insect/raw.json +++ b/src/main/resources/data/unicopia/diets/food_effects/insect/raw.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/raw_insect", + "tags": [ "unicopia:food_types/raw_insect" ], + "food_component": { + "hunger": 1, + "saturation": 0.1 + }, "ailment": { - "toxicity": "lethal", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/food_effects/meat/cooked.json b/src/main/resources/data/unicopia/diets/food_effects/meat/cooked.json index dd186cf3..80b1e542 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/meat/cooked.json +++ b/src/main/resources/data/unicopia/diets/food_effects/meat/cooked.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/cooked_meat", + "tags": [ "unicopia:food_types/cooked_meat" ], + "food_component": { + "hunger": 12, + "saturation": 1.2 + }, "ailment": { - "toxicity": "fair", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/food_effects/meat/raw.json b/src/main/resources/data/unicopia/diets/food_effects/meat/raw.json index eb105ca2..f2c547d9 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/meat/raw.json +++ b/src/main/resources/data/unicopia/diets/food_effects/meat/raw.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/raw_meat", + "tags": [ "unicopia:food_types/raw_meat" ], + "food_component": { + "hunger": 1, + "saturation": 1 + }, "ailment": { - "toxicity": "risky", "effects": [ { "effect": "minecraft:poison", diff --git a/src/main/resources/data/unicopia/diets/food_effects/meat/rotten.json b/src/main/resources/data/unicopia/diets/food_effects/meat/rotten.json index 4139359d..72faee0e 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/meat/rotten.json +++ b/src/main/resources/data/unicopia/diets/food_effects/meat/rotten.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/rotten_meat", + "tags": [ "unicopia:food_types/rotten_meat" ], + "food_component": { + "hunger": 1, + "saturation": 1 + }, "ailment": { - "toxicity": "severe", "effects": [ { "effect": "minecraft:poison", diff --git a/src/main/resources/data/unicopia/diets/food_effects/pinecone.json b/src/main/resources/data/unicopia/diets/food_effects/pinecone.json index a57d220d..75f92718 100644 --- a/src/main/resources/data/unicopia/diets/food_effects/pinecone.json +++ b/src/main/resources/data/unicopia/diets/food_effects/pinecone.json @@ -1,7 +1,10 @@ { - "tag": "unicopia:food_types/pinecone", + "tags": [ "unicopia:food_types/pinecone" ], + "food_component": { + "hunger": 1, + "saturation": 0.1 + }, "ailment": { - "toxicity": "safe", "effects": [ { "type": "unicopia:healing", diff --git a/src/main/resources/data/unicopia/diets/food_effects/rocks.json b/src/main/resources/data/unicopia/diets/food_effects/rocks.json new file mode 100644 index 00000000..ebe7b986 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/rocks.json @@ -0,0 +1,10 @@ +{ + "tags": [ "unicopia:food_types/rocks" ], + "food_component": { + "hunger": 1, + "saturation": 0.1 + }, + "ailment": { + "effects": [] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/diets/races/alicorn.json b/src/main/resources/data/unicopia/diets/races/alicorn.json index 76cdea56..d318454c 100644 --- a/src/main/resources/data/unicopia/diets/races/alicorn.json +++ b/src/main/resources/data/unicopia/diets/races/alicorn.json @@ -3,16 +3,12 @@ "foraging_multiplier": 1, "multipliers": [ { - "tags": [ - "unicopia:food_types/cooked_fish" - ], + "tags": [ "unicopia:food_types/cooked_fish" ], "hunger": 1.5, "saturation": 1.5 }, { - "tags": [ - "unicopia:food_types/raw_fish" - ], + "tags": [ "unicopia:food_types/raw_fish" ], "hunger": 0.5, "saturation": 0.6 }, @@ -35,29 +31,25 @@ "saturation": 0 }, { - "tags": [ - "unicopia:food_types/pinecone" - ], + "tags": [ "unicopia:food_types/pinecone" ], "hunger": 0.9, "saturation": 0.9 } ], "effects": [ { - "tag": "unicopia:food_types/cooked_fish", + "tags": [ "unicopia:food_types/cooked_fish" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/raw_fish", + "tags": [ "unicopia:food_types/raw_fish" ], "ailment": { - "toxicity": "safe", "effects": [ ] } } diff --git a/src/main/resources/data/unicopia/diets/races/bat.json b/src/main/resources/data/unicopia/diets/races/bat.json index e00adbee..2aedf250 100644 --- a/src/main/resources/data/unicopia/diets/races/bat.json +++ b/src/main/resources/data/unicopia/diets/races/bat.json @@ -3,74 +3,55 @@ "foraging_multiplier": 0.9, "multipliers": [ { - "tags": [ - "unicopia:food_types/cooked_fish" - ], + "tags": [ "unicopia:food_types/cooked_fish" ], "hunger": 0.75, "saturation": 0.75 }, { - "tags": [ - "unicopia:food_types/raw_fish" - ], + "tags": [ "unicopia:food_types/raw_fish" ], "hunger": 0.5, "saturation": 0.6 }, { - "tags": [ - "unicopia:food_types/cooked_insect" - ], + "tags": [ "unicopia:food_types/cooked_insect" ], "hunger": 1.75, "saturation": 1.75 }, { - "tags": [ - "unicopia:food_types/cooked_meat" - ], + "tags": [ "unicopia:food_types/cooked_meat" ], "hunger": 1.15, "saturation": 1.15 }, { - "tags": [ - "unicopia:food_types/raw_insect" - ], + "tags": [ "unicopia:food_types/raw_insect" ], "hunger": 1, "saturation": 1 }, { - "tags": [ - "unicopia:food_types/raw_meat" - ], + "tags": [ "unicopia:food_types/raw_meat" ], "hunger": 0.25, "saturation": 0.25 }, { - "tags": [ - "unicopia:food_types/rotten_meat" - ], + "tags": [ "unicopia:food_types/rotten_meat" ], "hunger": 0.2, "saturation": 0.2 }, { - "tags": [ - "unicopia:food_types/love" - ], + "tags": [ "unicopia:food_types/love" ], "hunger": 0, "saturation": 0 }, { - "tags": [ - "unicopia:food_types/pinecone" - ], + "tags": [ "unicopia:food_types/pinecone" ], "hunger": 0.9, "saturation": 0.9 } ], "effects": [ { - "tag": "unicopia:food_types/rotten_fish", + "tags": [ "unicopia:food_types/rotten_fish" ], "ailment": { - "toxicity": "mild", "effects": [ { "effect": "unicopia:food_poisoning", @@ -87,14 +68,12 @@ "unicopia:food_types/cooked_meat" ], "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/raw_insect", + "tags": [ "unicopia:food_types/raw_insect" ], "ailment": { - "toxicity": "mild", "effects": [ { "effect": "unicopia:food_poisoning", @@ -110,7 +89,6 @@ "unicopia:food_types/rotten_meat" ], "ailment": { - "toxicity": "risky", "effects": [ { "effect": "unicopia:food_poisoning", @@ -122,9 +100,8 @@ } }, { - "tag": "unicopia:food_types/bat_ponys_delight", + "tags": [ "unicopia:food_types/bat_ponys_delight" ], "ailment": { - "toxicity": "safe", "effects": [ { "effect": "minecraft:health_boost", diff --git a/src/main/resources/data/unicopia/diets/races/changeling.json b/src/main/resources/data/unicopia/diets/races/changeling.json index f4e04ebe..e6255344 100644 --- a/src/main/resources/data/unicopia/diets/races/changeling.json +++ b/src/main/resources/data/unicopia/diets/races/changeling.json @@ -3,50 +3,37 @@ "foraging_multiplier": 0, "multipliers": [ { - "tags": [ - "unicopia:food_types/cooked_insect" - ], + "tags": [ "unicopia:food_types/cooked_insect" ], "hunger": 0.3, "saturation": 0.3 }, { - "tags": [ - "unicopia:food_types/cooked_meat" - ], + "tags": [ "unicopia:food_types/cooked_meat" ], "hunger": 0.1, "saturation": 0.1 }, { - "tags": [ - "unicopia:food_types/raw_insect" - ], + "tags": [ "unicopia:food_types/raw_insect" ], "hunger": 1, "saturation": 1 }, { - "tags": [ - "unicopia:food_types/raw_meat" - ], + "tags": [ "unicopia:food_types/raw_meat" ], "hunger": 0.25, "saturation": 0.25 }, { - "tags": [ - "unicopia:food_types/rotten_meat" - ], + "tags": [ "unicopia:food_types/rotten_meat" ], "hunger": 0.6, "saturation": 0.6 }, { - "tags": [ - "unicopia:food_types/love" - ], + "tags": [ "unicopia:food_types/love" ], "hunger": 1, "saturation": 1 } ], "default_effects": { - "toxicity": "fair", "effects": [ { "effect": "unicopia:food_poisoning", @@ -66,15 +53,12 @@ }, "effects": [ { - "tags": [ - "unicopia:food_types/love" - ], + "tags": [ "unicopia:food_types/love" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [ { "name": "Love Consumption", @@ -89,7 +73,6 @@ "unicopia:food_types/raw_fish" ], "ailment": { - "toxicity": "fair", "effects": [ { "effect": "unicopia:food_poisoning", @@ -114,21 +97,19 @@ "unicopia:food_types/rotten_meat" ], "ailment": { - "toxicity": "safe", "effects": [ ] } }, { "tags": [ "unicopia:food_types/forage_edible", - "unicopia:food_types/forage_edible_filling", + "unicopia:food_types/forage_edible_filling" ], "food_component": { "hunger": 18, "saturation": 9 }, "ailment": { - "toxicity": "fair", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/races/earth.json b/src/main/resources/data/unicopia/diets/races/earth.json index 0c429144..a8b48e87 100644 --- a/src/main/resources/data/unicopia/diets/races/earth.json +++ b/src/main/resources/data/unicopia/diets/races/earth.json @@ -1,11 +1,18 @@ { - "default_multiplier": 0.3, + "default_multiplier": 1, "foraging_multiplier": 1, "multipliers": [ { "tags": [ - "unicopia:food_types/cooked_fish" - ], + "unicopia:food_types/candy", + "unicopia:food_types/desserts", + "unicopia:food_types/rocks" + ], + "hunger": 2.5, + "saturation": 1.7 + }, + { + "tags": [ "unicopia:food_types/cooked_fish" ], "hunger": 0.2, "saturation": 0.2 }, @@ -29,11 +36,39 @@ "saturation": 0 }, { - "tags": [ - "unicopia:food_types/pinecone" - ], + "tags": [ "unicopia:food_types/pinecone" ], "hunger": 1, "saturation": 1 } + ], + "effects": [ + { + "tags": [ + "unicopia:food_types/candy", + "unicopia:food_types/rocks" + ], + "food_component": { + "hunger": 5, + "saturation": 12, + "fastFood": true + }, + "ailment": { + "effects": [ ] + } + }, + { + "tags": [ + "unicopia:food_types/desserts" + ], + "food_component": { + "hunger": 12, + "saturation": 32, + "eatenQuickly": true, + "fastFood": true + }, + "ailment": { + "effects": [ ] + } + } ] } diff --git a/src/main/resources/data/unicopia/diets/races/hippogriff.json b/src/main/resources/data/unicopia/diets/races/hippogriff.json index 15565d9e..8ecea1ad 100644 --- a/src/main/resources/data/unicopia/diets/races/hippogriff.json +++ b/src/main/resources/data/unicopia/diets/races/hippogriff.json @@ -19,9 +19,7 @@ "saturation": 0.6 }, { - "tags": [ - "unicopia:food_types/rotten_meat" - ], + "tags": [ "unicopia:food_types/rotten_meat" ], "hunger": 0.3, "saturation": 0.3 }, @@ -35,29 +33,25 @@ "saturation": 0 }, { - "tags": [ - "unicopia:food_types/pinecone" - ], + "tags": [ "unicopia:food_types/pinecone" ], "hunger": 1, "saturation": 1 } ], "effects": [ { - "tag": "unicopia:food_types/cooked_fish", + "tags": [ "unicopia:food_types/cooked_fish" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/raw_fish", + "tags": [ "unicopia:food_types/raw_fish" ], "ailment": { - "toxicity": "safe", "effects": [ ] } }, @@ -71,14 +65,12 @@ "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/pinecone", + "tags": [ "unicopia:food_types/pinecone" ], "ailment": { - "toxicity": "safe", "effects": [ { "type": "unicopia:healing", diff --git a/src/main/resources/data/unicopia/diets/races/human.json b/src/main/resources/data/unicopia/diets/races/human.json index a36216f0..ddf024b3 100644 --- a/src/main/resources/data/unicopia/diets/races/human.json +++ b/src/main/resources/data/unicopia/diets/races/human.json @@ -14,7 +14,6 @@ "unicopia:food_types/pinecone" ], "ailment": { - "toxicity": "safe", "effects": [ ] } } diff --git a/src/main/resources/data/unicopia/diets/races/kirin.json b/src/main/resources/data/unicopia/diets/races/kirin.json index 7eaac714..2f2f4172 100644 --- a/src/main/resources/data/unicopia/diets/races/kirin.json +++ b/src/main/resources/data/unicopia/diets/races/kirin.json @@ -3,16 +3,12 @@ "foraging_multiplier": 0.9, "multipliers": [ { - "tags": [ - "unicopia:food_types/cooked_meat" - ], + "tags": [ "unicopia:food_types/cooked_meat" ], "hunger": 1.5, "saturation": 1.5 }, { - "tags": [ - "unicopia:food_types/raw_meat" - ], + "tags": [ "unicopia:food_types/raw_meat" ], "hunger": 0.5, "saturation": 0.6 }, @@ -35,9 +31,7 @@ "saturation": 0 }, { - "tags": [ - "unicopia:food_types/pinecone" - ], + "tags": [ "unicopia:food_types/pinecone" ], "hunger": 0.9, "saturation": 0.9 } @@ -60,7 +54,6 @@ "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [ ] } } diff --git a/src/main/resources/data/unicopia/diets/races/pegasus.json b/src/main/resources/data/unicopia/diets/races/pegasus.json index 11865b7a..da8220b7 100644 --- a/src/main/resources/data/unicopia/diets/races/pegasus.json +++ b/src/main/resources/data/unicopia/diets/races/pegasus.json @@ -1,18 +1,14 @@ { - "default_multiplier": 0, + "default_multiplier": 0.5, "foraging_multiplier": 1, "multipliers": [ { - "tags": [ - "unicopia:food_types/cooked_fish" - ], + "tags": [ "unicopia:food_types/cooked_fish" ], "hunger": 1.5, "saturation": 1.5 }, { - "tags": [ - "unicopia:food_types/raw_fish" - ], + "tags": [ "unicopia:food_types/raw_fish" ], "hunger": 0.5, "saturation": 0.6 }, @@ -35,25 +31,21 @@ "saturation": 0 }, { - "tags": [ - "unicopia:food_types/pinecone" - ], + "tags": [ "unicopia:food_types/pinecone" ], "hunger": 0.9, "saturation": 0.9 } ], "effects": [ { - "tag": "unicopia:food_types/cooked_fish", + "tags": [ "unicopia:food_types/cooked_fish" ], "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/raw_fish", + "tags": [ "unicopia:food_types/raw_fish" ], "ailment": { - "toxicity": "mild", "effects": [ { "effect": "unicopia:food_poisoning", diff --git a/src/main/resources/data/unicopia/diets/races/seapony.json b/src/main/resources/data/unicopia/diets/races/seapony.json index ac2e8858..4bf9a4cb 100644 --- a/src/main/resources/data/unicopia/diets/races/seapony.json +++ b/src/main/resources/data/unicopia/diets/races/seapony.json @@ -3,9 +3,7 @@ "foraging_multiplier": 0.7, "multipliers": [ { - "tags": [ - "unicopia:food_types/raw_sea_vegitable" - ], + "tags": [ "unicopia:food_types/raw_sea_vegitable" ], "hunger": 1, "saturation": 1 }, @@ -19,7 +17,6 @@ } ], "default_effects": { - "toxicity": "fair", "effects": [ { "effect": "unicopia:food_poisoning", @@ -30,30 +27,27 @@ }, "effects": [ { - "tag": "unicopia:food_types/cooked_fish", + "tags": [ "unicopia:food_types/cooked_fish" ], "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/raw_fish", + "tags": [ "unicopia:food_types/raw_fish" ], "ailment": { - "toxicity": "safe", "effects": [ ] } }, { "tags": [ "unicopia:food_types/forage_edible", - "unicopia:food_types/forage_edible_filling", + "unicopia:food_types/forage_edible_filling" ], "food_component": { "hunger": 18, "saturation": 9 }, "ailment": { - "toxicity": "fair", "effects": [ { "effect": "unicopia:food_poisoning", @@ -64,46 +58,42 @@ } }, { - "tag": "unicopia:food_types/raw_sea_vegitable", + "tags": [ "unicopia:food_types/raw_sea_vegitable" ], "food_component": { "hunger": 2, "saturation": 1 }, "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/cooked_sea_vegitable", + "tags": [ "unicopia:food_types/cooked_sea_vegitable" ], "food_component": { "hunger": 6, "saturation": 2 }, "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/shells", + "tags": [ "unicopia:food_types/shells" ], "food_component": { "hunger": 3, "saturation": 5 }, "ailment": { - "toxicity": "safe", "effects": [ ] } }, { - "tag": "unicopia:food_types/shelly", + "tags": [ "unicopia:food_types/shelly" ], "food_component": { "hunger": 6, "saturation": 7 }, "ailment": { - "toxicity": "safe", "effects": [ ] } } diff --git a/src/main/resources/data/unicopia/diets/races/unicorn.json b/src/main/resources/data/unicopia/diets/races/unicorn.json index 670dcd4e..866ba9e2 100644 --- a/src/main/resources/data/unicopia/diets/races/unicorn.json +++ b/src/main/resources/data/unicopia/diets/races/unicorn.json @@ -23,11 +23,10 @@ "saturation": 0 }, { - "tags": [ - "unicopia:food_types/pinecone" - ], + "tags": [ "unicopia:food_types/pinecone" ], "hunger": 0.9, "saturation": 0.9 } - ] + ], + "effects": [] } diff --git a/src/main/resources/data/unicopia/tags/items/food_types/candy.json b/src/main/resources/data/unicopia/tags/items/food_types/candy.json new file mode 100644 index 00000000..8a152f67 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/food_types/candy.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "unicopia:rock_candy", + "unicopia:candied_apple", + "minecraft:sugar", + { "id": "bakersdelight:sweet_berry_cheesecake_slice", "required": false }, + { "id": "bakersdelight:cake_slice", "required": false } + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/food_types/desserts.json b/src/main/resources/data/unicopia/tags/items/food_types/desserts.json new file mode 100644 index 00000000..0e14adc0 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/food_types/desserts.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "minecraft:cake", + "#unicopia:pies", + { "id": "bakersdelight:sweet_berry_cheesecake", "required": false } + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/food_types/rocks.json b/src/main/resources/data/unicopia/tags/items/food_types/rocks.json new file mode 100644 index 00000000..229f317a --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/food_types/rocks.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "unicopia:rock_stew" + ] +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index b6e5e32b..d8654fc3 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -69,8 +69,8 @@ "client.MixinHeldItemRenderer", "client.MixinInGameHud", "client.MixinInGameHud$HeartType", - "client.MixinItem", "client.MixinItemModels", + "client.MixinItemStack", "client.MixinKeyboardInput", "client.MixinLivingEntityRenderer", "client.MixinModelPart", From f76956803101d7b2ea48f0b24bd803d0505a03cd Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 3 Dec 2023 21:19:36 +0000 Subject: [PATCH 86/90] *punches gradle in the gut* --- .../java/com/minelittlepony/unicopia/diet/affliction/Range.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java index dfe7e009..ed84ad97 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/affliction/Range.java @@ -10,7 +10,7 @@ import net.minecraft.util.dynamic.Codecs; record Range(int min, int max) { public static final Codec CODEC = Codecs.xor( Codec.INT.xmap(value -> Range.of(value, -1), range -> range.min()), - RecordCodecBuilder.create(instance -> instance.group( + RecordCodecBuilder.create(instance -> instance.group( Codec.INT.fieldOf("min").forGetter(Range::min), Codec.INT.fieldOf("max").forGetter(Range::max) ).apply(instance, Range::of)) From d8565f326061d836a0bc074fc5ae841ccc7bf158 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 4 Dec 2023 14:49:24 +0000 Subject: [PATCH 87/90] Added etched clouds and cloud chests --- assets/models/cloud_chest.bbmodel | 1 + assets/models/cloud_chest.java | 32 +++ assets/models/cloud_chest.png | Bin 0 -> 1278 bytes .../unicopia/block/UBlockEntities.java | 3 + .../unicopia/block/UBlocks.java | 17 +- .../unicopia/block/cloud/CloudBedBlock.java | 2 +- .../unicopia/block/cloud/CloudBlock.java | 6 +- .../unicopia/block/cloud/CloudChestBlock.java | 159 +++++++++++ .../unicopia/block/cloud/CloudLike.java | 5 + .../block/cloud/CloudStairsBlock.java | 2 +- .../unicopia/client/URenderers.java | 9 + .../entity/CloudChestBlockEntityRenderer.java | 125 ++++++++ .../unicopia/blockstates/cloud_chest.json | 5 + .../blockstates/compacted_etched_cloud.json | 268 ++++++++++++++++++ .../unicopia/blockstates/etched_cloud.json | 5 + .../blockstates/etched_cloud_slab.json | 7 + .../blockstates/etched_cloud_stairs.json | 209 ++++++++++++++ .../resources/assets/unicopia/lang/en_us.json | 6 + .../unicopia/models/block/cloud_chest.json | 5 + .../unicopia/models/block/etched_cloud.json | 6 + .../models/block/etched_cloud_slab.json | 8 + .../models/block/etched_cloud_slab_top.json | 8 + .../models/block/etched_cloud_stairs.json | 8 + .../block/etched_cloud_stairs_inner.json | 8 + .../block/etched_cloud_stairs_outer.json | 8 + .../flattened_etched_cloud_corner_full.json | 6 + .../flattened_etched_cloud_corner_x.json | 6 + .../flattened_etched_cloud_corner_xy.json | 6 + .../flattened_etched_cloud_corner_xyz.json | 6 + .../flattened_etched_cloud_corner_xz.json | 6 + .../flattened_etched_cloud_corner_y.json | 6 + .../flattened_etched_cloud_corner_yz.json | 6 + .../flattened_etched_cloud_corner_z.json | 6 + .../unicopia/models/item/cloud_chest.json | 6 + .../unicopia/models/item/etched_cloud.json | 3 + .../models/item/etched_cloud_slab.json | 3 + .../models/item/etched_cloud_stairs.json | 3 + .../unicopia/textures/block/etched_cloud.png | Bin 0 -> 7296 bytes .../unicopia/textures/entity/chest/cloud.png | Bin 0 -> 5746 bytes .../textures/entity/chest/cloud_left.png | Bin 0 -> 6032 bytes .../textures/entity/chest/cloud_right.png | Bin 0 -> 6129 bytes .../blocks/carving/etched_cloud_cutting.json | 6 + .../carving/etched_cloud_slab_cutting.json | 6 + .../carving/etched_cloud_stairs_cutting.json | 6 + .../unicopia/recipes/blocks/cloud_chest.json | 14 + .../unicopia/tags/blocks/cloud_slabs.json | 1 + .../unicopia/tags/blocks/cloud_stairs.json | 1 + .../data/unicopia/tags/blocks/clouds.json | 1 + .../data/unicopia/tags/items/cloud_slabs.json | 1 + .../unicopia/tags/items/cloud_stairs.json | 1 + .../data/unicopia/tags/items/clouds.json | 1 + .../unicopia/tags/items/groups/pegasus.json | 4 + 52 files changed, 1005 insertions(+), 12 deletions(-) create mode 100644 assets/models/cloud_chest.bbmodel create mode 100644 assets/models/cloud_chest.java create mode 100644 assets/models/cloud_chest.png create mode 100644 src/main/java/com/minelittlepony/unicopia/block/cloud/CloudChestBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/block/cloud/CloudLike.java create mode 100644 src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudChestBlockEntityRenderer.java create mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_chest.json create mode 100644 src/main/resources/assets/unicopia/blockstates/compacted_etched_cloud.json create mode 100644 src/main/resources/assets/unicopia/blockstates/etched_cloud.json create mode 100644 src/main/resources/assets/unicopia/blockstates/etched_cloud_slab.json create mode 100644 src/main/resources/assets/unicopia/blockstates/etched_cloud_stairs.json create mode 100644 src/main/resources/assets/unicopia/models/block/cloud_chest.json create mode 100644 src/main/resources/assets/unicopia/models/block/etched_cloud.json create mode 100644 src/main/resources/assets/unicopia/models/block/etched_cloud_slab.json create mode 100644 src/main/resources/assets/unicopia/models/block/etched_cloud_slab_top.json create mode 100644 src/main/resources/assets/unicopia/models/block/etched_cloud_stairs.json create mode 100644 src/main/resources/assets/unicopia/models/block/etched_cloud_stairs_inner.json create mode 100644 src/main/resources/assets/unicopia/models/block/etched_cloud_stairs_outer.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_full.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_x.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xy.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xyz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_y.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_yz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_z.json create mode 100644 src/main/resources/assets/unicopia/models/item/cloud_chest.json create mode 100644 src/main/resources/assets/unicopia/models/item/etched_cloud.json create mode 100644 src/main/resources/assets/unicopia/models/item/etched_cloud_slab.json create mode 100644 src/main/resources/assets/unicopia/models/item/etched_cloud_stairs.json create mode 100644 src/main/resources/assets/unicopia/textures/block/etched_cloud.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/chest/cloud.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/chest/cloud_left.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/chest/cloud_right.png create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/cloud_chest.json diff --git a/assets/models/cloud_chest.bbmodel b/assets/models/cloud_chest.bbmodel new file mode 100644 index 00000000..bdafb853 --- /dev/null +++ b/assets/models/cloud_chest.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"modded_entity","box_uv":true},"name":"cloud_chest","model_identifier":"","modded_entity_version":"Fabric 1.17+","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"chest","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-7,0,-7],"to":[7,10,7],"autouv":0,"color":0,"origin":[0,0,0],"uv_offset":[0,19],"faces":{"north":{"uv":[14,33,28,43],"texture":0},"east":{"uv":[0,33,14,43],"texture":0},"south":{"uv":[42,33,56,43],"texture":0},"west":{"uv":[28,33,42,43],"texture":0},"up":{"uv":[28,33,14,19],"texture":0},"down":{"uv":[42,19,28,33],"texture":0}},"type":"cube","uuid":"980d20de-fc20-da45-2218-55df01317a6a"},{"name":"lock","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-1,6,6.800000000000001],"to":[1,10,7.800000000000001],"autouv":0,"color":0,"origin":[0,0,-0.20000000000000004],"faces":{"north":{"uv":[1,1,3,5],"texture":0},"east":{"uv":[0,1,1,5],"texture":0},"south":{"uv":[4,1,6,5],"texture":0},"west":{"uv":[3,1,4,5],"texture":0},"up":{"uv":[3,1,1,0],"texture":0},"down":{"uv":[5,0,3,1],"texture":0}},"type":"cube","uuid":"daa8bcc6-6f9e-aa77-77d6-a2132c7efdb0"},{"name":"lock","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-1,7,7],"to":[1,9,8],"autouv":0,"color":0,"origin":[0,0,0],"faces":{"north":{"uv":[1,1,3,3],"texture":0},"east":{"uv":[0,1,1,3],"texture":0},"south":{"uv":[4,1,6,3],"texture":0},"west":{"uv":[3,1,4,3],"texture":0},"up":{"uv":[3,1,1,0],"texture":0},"down":{"uv":[5,0,3,1],"texture":0}},"type":"cube","uuid":"3761dece-0deb-4f9f-03b8-7179e5d4230d"},{"name":"lock","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,7,6.8],"to":[4,11,7.8],"autouv":0,"color":0,"rotation":[0,0,90],"origin":[1.9999999999999998,7,7.300000000000001],"faces":{"north":{"uv":[1,1,3,5],"texture":0},"east":{"uv":[0,1,1,5],"texture":0},"south":{"uv":[4,1,6,5],"texture":0},"west":{"uv":[3,1,4,5],"texture":0},"up":{"uv":[3,1,1,0],"texture":0},"down":{"uv":[5,0,3,1],"texture":0}},"type":"cube","uuid":"2d515302-358d-138a-85df-aec20530862a"},{"name":"lid","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-7,8,-7],"to":[7,13,7],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[14,14,28,19],"texture":0},"east":{"uv":[0,14,14,19],"texture":0},"south":{"uv":[42,14,56,19],"texture":0},"west":{"uv":[28,14,42,19],"texture":0},"up":{"uv":[28,14,14,0],"texture":0},"down":{"uv":[42,0,28,14],"texture":0}},"type":"cube","uuid":"07486e85-57dd-1353-ef68-fd182245f73d"}],"outliner":["980d20de-fc20-da45-2218-55df01317a6a",{"name":"lid","origin":[0,8,-7],"rotation":[-62.5,0,0],"color":0,"uuid":"426e7ac7-0b4a-e1da-2265-dd376403fc38","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["daa8bcc6-6f9e-aa77-77d6-a2132c7efdb0","3761dece-0deb-4f9f-03b8-7179e5d4230d","2d515302-358d-138a-85df-aec20530862a","07486e85-57dd-1353-ef68-fd182245f73d"]}],"textures":[{"path":"/home/sollace/Documents/GitRepos/minecraft_mods/Unicopia/assets/models/cloud_chest.png","name":"cloud_chest.png","folder":"","namespace":"","id":"0","particle":false,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"2a8b98ee-b258-1d91-ab10-ed99b792b5ed","relative_path":"../cloud_chest.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABTZJREFUeF7tWsuOG0UUvWbGscfjeDAzhAkwRApRUCQWkAhFSrJjwxo+gA1/gPgClog/YMOSBVmzYUeQAPFYIEWJAlKYvDMzThyPY489MTrdHHNdqe6ubtqOa+jatKv6VtU9p869XV3ukojIr/e7I1z/bD3GRT44uVoKfsSUj7+9FvSZVfn83ROJPmXxpQTwBH68uTQe4+0Xa7ETgoBavZ5qzm6nE9hf2Gim6vfdZkumRsDXV7fHK7mydEhWqwuy2x/KhVcbzgQsVw49BWi3vye6HfUkAl5rVOSvdl9wZUF9pgRUSyO52x0khgEVQJAAaBbcIxEmAW+u1aS9tz8BFMB7wydypFaWe91BcA/XmRGgASTlAU0AwZsrnkQAQRKwvhL81AlIFYzK2CRAK8EEzroOASgA4ACaYPXKcypvCNBEpiFA9zsQCiAgHftRCrCpj6qYWQ7IMwTMRBiXAyj9uPlh8/tWd7pJME8CbGPFPQV0nNvk7xUBcUTGJUH2M58EaPeGABcV2fYB+imgnwR6vLkPARfwtEnaCUaNNdWNUBoA2vbAvAx99sPmTN/qshIe1a8t4UaqIeHW2SyfnN2IfacpgYATzdq437VWV5LqzcqitPrDwM60tzlBG1x1X9q6zAlbm1+/tELgp5vlp3zBuIkEfPPHzuhwZVEe9YficsVktzr9CZwv1yvjNvzWNvoeO9HGdU7Yodj8047Yxnvv9RfiFXDpRjsIAYCiY0l1M3vb7KPatMNp5mQ/Wx/ci/L9fMJrfWnWySzvHJA0XtJBSuZjpq+u7GRKnj/e2Eny2Xo/CUimQUXkPxFwt/VAHvbC+NRlpbpobT95dE1AQK28IMcaVSefr7d70h3sT+9IzMkLixEUAAJQNAkAz8J2tr3UfD4g4NTqsgwH9seWOdViuSyXt3fnlwANMuo3SaICQIBLAUlzTcDV21sBDtuq20JCE0BwWgkAyzp/e0FAVA4wc0EUAQCpiyZn7gkwQVINCAfzt5kD9CrbVn7uQ4BJ0JYISYBOkHEK8JIA5ACtgKjHH9sPZAgwdm3SpzKiHoM66cF26bmRPH4Sbk28SYJRCrC12xQQ9zj0NgdEgTIJsNlRBd4qQO8Czf3BgdsKu+zmTJu5exny5XU47bcIJP7Ts+vxByIgQH+wgBNYW7HZ6Lbt7l7w0qIL9vyrtX+/HeDYWedzfYegDy4vUcGBiOnQ+28ckcF++N99eWFBLl65N/FVhw0Iz/X6g6FUyuEboXnWp/uBMJCDtqj5tA3GM78saT/qSKUavlb3ez1pHJ78YsXlOH1MgD64PPfKygQB3998OHEAqoEAMMpmZy+wYR0kYMyNeqgA1HW/rPNpheVOAAYHeBStANRBAgpAEsh6vTI+qdWrTRXoNvy+889hKlYS9bTz2b4tAgko5uqjLZUCKNl31u0fPv10pzMGi4ERj6fWlsfEkBxTAVwxEHt5azfIEwQCElzns4WANVmpRmcCsJIocAYxb1MAFAESULCSJIDzMUzMHEBFwY4EcD4z1Mx5qToqh/30/wM2Eqgu9Es6Syx98dvtEVYSAAFeXzG42YY6gKDofpoAxjwcIcioflnm40JEKYALCT8/euto/GMwigA9uElOHAG6XxoCXOejXRxxtHEi4Mufr2c63k6Kv3m5/+GZY/EKmBdHn5Ufmf8XeFYO5z1vQUDejPo2XqEA31Ysb38LBeTNqG/jFQrwbcXy9rdQQN6M+jZeoQDfVixvfwsF5M2ob+MVCvBtxfL2t1BA3oz6Nt7/XgF/A20YIoxeFupUAAAAAElFTkSuQmCC"}],"fabricOptions":{"header":"package com.example.mod;","entity":"Entity","render":"","members":""}} \ No newline at end of file diff --git a/assets/models/cloud_chest.java b/assets/models/cloud_chest.java new file mode 100644 index 00000000..87e684a2 --- /dev/null +++ b/assets/models/cloud_chest.java @@ -0,0 +1,32 @@ +// Made with Blockbench 4.8.3 +// Exported for Minecraft version 1.17+ for Yarn +// Paste this class into your mod and generate all required imports +public class cloud_chest extends EntityModel { + private final ModelPart lid; + private final ModelPart lock_r1; + private final ModelPart bb_main; + public cloud_chest(ModelPart root) { + this.lid = root.getChild("lid"); + this.bb_main = root.getChild("bb_main"); + } + public static TexturedModelData getTexturedModelData() { + ModelData modelData = new ModelData(); + ModelPartData modelPartData = modelData.getRoot(); + ModelPartData lid = modelPartData.addChild("lid", ModelPartBuilder.create().uv(0, 0).cuboid(-1.0F, -2.0F, 13.8F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F)) + .uv(0, 0).cuboid(-1.0F, -1.0F, 14.0F, 2.0F, 2.0F, 1.0F, new Dilation(0.0F)) + .uv(0, 0).cuboid(-7.0F, -5.0F, 0.0F, 14.0F, 5.0F, 14.0F, new Dilation(0.3F)), ModelTransform.of(0.0F, 16.0F, -7.0F, 1.0908F, 0.0F, 0.0F)); + + ModelPartData lock_r1 = lid.addChild("lock_r1", ModelPartBuilder.create().uv(0, 0).cuboid(-2.0F, -4.0F, -0.5F, 2.0F, 4.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(-2.0F, 1.0F, 14.3F, 0.0F, 0.0F, 1.5708F)); + + ModelPartData bb_main = modelPartData.addChild("bb_main", ModelPartBuilder.create().uv(0, 19).cuboid(-7.0F, -10.0F, -7.0F, 14.0F, 10.0F, 14.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + return TexturedModelData.of(modelData, 64, 64); + } + @Override + public void setAngles(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + } + @Override + public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) { + lid.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha); + bb_main.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha); + } +} \ No newline at end of file diff --git a/assets/models/cloud_chest.png b/assets/models/cloud_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..e06ba84ac2f9ad15f6797e5bde8ff31f4a0a3101 GIT binary patch literal 1278 zcmV+t3ui9e5E3BR z3sSXGKHt7&XjRb%1XCa{DsxQ5e{=iFK17t?Na*JS|`A>+} zfvRqSKnV`WyZZln?g2FiBcnDFy58iq$JpSK$I%wu!7V0GQ3D zaHS^0WKQ8x)yW#l%UB(0{iF`~`tez2qyICxp9H^pe3@(U{PB;=T>3V4Bvz#JGxr~i z{p9IUzikTT_ukkB0CX$^2Tof_$LYj}7cR0J=A`gOh&Q(1HWPA^5eH5iQK+`zIdIxI zxtJ9lrj)`CV2vF65ypNbG=A(yxXmiIvbVdcPAWn(yNMj$NY+@s4G$R?g<UbGj_QJ(Rx3@Yp zs(#TSFS_p{5T8BR%{~%iUs#YGSc=-PvI}pXi0aX>i(#jg+D}!VH=W{W*iEw~fl8JM zr@)7A?;u>P9ziX`fXbnX8$@`xKR^&hu&vc)N3OT#0G11H9@okAv26e(t~I%u!fvnD zlEC-jY;jql;DGoxNC$|!g5xWai4GZqFhUSU30Yb_uyRuCOgRcyFFNju{IDY-{0-wr@xc`1W^Q8N3dBS ziZJUGUJsRz_xcIvivAxEp^`m>Ns$Z}3s{B`f3uK`9CUI%OVqKj3nAZz)klzC{x`3W z`iTO;A{wXE0kR6-C{_41KowPemSM!1BXXSXxEo*oeELdkg!1z7dk57%Ue?sq)YR0} o)YR0})YR0})YR0})clwE7l>WbUVM!i@c;k-07*qoM6N<$f;RADW&i*H literal 0 HcmV?d00001 diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java b/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java index cd929491..570be63b 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlockEntities.java @@ -1,16 +1,19 @@ package com.minelittlepony.unicopia.block; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; +import com.minelittlepony.unicopia.block.cloud.CloudChestBlock; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.BlockEntityType.Builder; +import net.minecraft.block.entity.ChestBlockEntity; import net.minecraft.registry.Registry; import net.minecraft.registry.Registries; public interface UBlockEntities { BlockEntityType WEATHER_VANE = create("weather_vane", BlockEntityType.Builder.create(WeatherVaneBlock.WeatherVane::new, UBlocks.WEATHER_VANE)); BlockEntityType FANCY_BED = create("fancy_bed", BlockEntityType.Builder.create(CloudBedBlock.Tile::new, UBlocks.CLOTH_BED, UBlocks.CLOUD_BED)); + BlockEntityType CLOUD_CHEST = create("cloud_chest", BlockEntityType.Builder.create(CloudChestBlock.TileData::new, UBlocks.CLOUD_CHEST)); static BlockEntityType create(String id, Builder builder) { return Registry.register(Registries.BLOCK_ENTITY_TYPE, id, builder.build(null)); diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 078f267d..3ee4872e 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -14,7 +14,8 @@ import com.minelittlepony.unicopia.block.cloud.OrientedCloudBlock; import com.minelittlepony.unicopia.block.cloud.PoreousCloudStairsBlock; import com.minelittlepony.unicopia.block.cloud.ShapingBenchBlock; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; -import com.minelittlepony.unicopia.block.cloud.CloudBlock; +import com.minelittlepony.unicopia.block.cloud.CloudChestBlock; +import com.minelittlepony.unicopia.block.cloud.CloudLike; import com.minelittlepony.unicopia.block.cloud.SoggyCloudBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudSlabBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudStairsBlock; @@ -170,6 +171,13 @@ public interface UBlocks { Block CLOUD_BRICK_SLAB = register("cloud_brick_slab", new CloudSlabBlock(Settings.copy(CLOUD_BRICKS), false, null), ItemGroups.BUILDING_BLOCKS); Block CLOUD_BRICK_STAIRS = register("cloud_brick_stairs", new CloudStairsBlock(CLOUD_BRICKS.getDefaultState(), Settings.copy(CLOUD_PLANKS)), ItemGroups.BUILDING_BLOCKS); + Block ETCHED_CLOUD = register("etched_cloud", new NaturalCloudBlock(Settings.copy(CLOUD_BRICKS), false, + null, + () -> UBlocks.COMPACTED_CLOUD_BRICKS), ItemGroups.BUILDING_BLOCKS); + Block COMPACTED_ETCHED_CLOUD = register("compacted_etched_cloud", new CompactedCloudBlock(ETCHED_CLOUD.getDefaultState())); + Block ETCHED_CLOUD_SLAB = register("etched_cloud_slab", new CloudSlabBlock(Settings.copy(ETCHED_CLOUD), false, null), ItemGroups.BUILDING_BLOCKS); + Block ETCHED_CLOUD_STAIRS = register("etched_cloud_stairs", new CloudStairsBlock(ETCHED_CLOUD.getDefaultState(), Settings.copy(CLOUD_PLANKS)), ItemGroups.BUILDING_BLOCKS); + SoggyCloudBlock SOGGY_CLOUD = register("soggy_cloud", new SoggyCloudBlock(Settings.copy(CLOUD).hardness(0.7F), () -> UBlocks.CLOUD)); SoggyCloudSlabBlock SOGGY_CLOUD_SLAB = register("soggy_cloud_slab", new SoggyCloudSlabBlock(Settings.copy(SOGGY_CLOUD), () -> UBlocks.CLOUD_SLAB)); SoggyCloudStairsBlock SOGGY_CLOUD_STAIRS = register("soggy_cloud_stairs", new SoggyCloudStairsBlock(SOGGY_CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.CLOUD_STAIRS)); @@ -184,6 +192,7 @@ public interface UBlocks { Block CARVED_CLOUD = register("carved_cloud", new OrientedCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool().solid(), false), ItemGroups.BUILDING_BLOCKS); Block UNSTABLE_CLOUD = register("unstable_cloud", new UnstableCloudBlock(Settings.copy(CLOUD)), ItemGroups.NATURAL); Block CLOUD_PILLAR = register("cloud_pillar", new CloudPillarBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL).solid()), ItemGroups.NATURAL); + Block CLOUD_CHEST = register("cloud_chest", new CloudChestBlock(Settings.copy(DENSE_CLOUD).instrument(Instrument.BASS).strength(2.5f), DENSE_CLOUD.getDefaultState()), ItemGroups.FUNCTIONAL); Block CLOTH_BED = register("cloth_bed", new FancyBedBlock("cloth", Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOD))); Block CLOUD_BED = register("cloud_bed", new CloudBedBlock("cloud", CLOUD.getDefaultState(), Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); @@ -200,9 +209,7 @@ public interface UBlocks { } static T register(Identifier id, T block, RegistryKey group) { - ItemGroupRegistry.register(id, - CloudBlock.isCloudBlock(block) ? new CloudBlockItem(block, new Item.Settings()) : new BlockItem(block, new Item.Settings() - ), group); + ItemGroupRegistry.register(id, block instanceof CloudLike ? new CloudBlockItem(block, new Item.Settings()) : new BlockItem(block, new Item.Settings()), group); return register(id, block); } @@ -213,7 +220,7 @@ public interface UBlocks { if (block instanceof SaplingBlock || block instanceof SproutBlock || block instanceof FruitBlock || block instanceof CropBlock || block instanceof DoorBlock || block instanceof TrapdoorBlock) { TRANSLUCENT_BLOCKS.add(block); } - if (CloudBlock.isCloudBlock(block) || block instanceof SlimePustuleBlock || block instanceof PileBlock) { + if (block instanceof CloudLike || block instanceof SlimePustuleBlock || block instanceof PileBlock) { SEMI_TRANSPARENT_BLOCKS.add(block); } return Registry.register(Registries.BLOCK, id, block); diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java index 401e0e46..6ecc1497 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBedBlock.java @@ -19,7 +19,7 @@ import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; -public class CloudBedBlock extends FancyBedBlock { +public class CloudBedBlock extends FancyBedBlock implements CloudLike { private final BlockState baseState; private final CloudBlock baseBlock; diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java index 0ceebaaf..490d7e4d 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java @@ -26,11 +26,7 @@ import net.minecraft.world.EmptyBlockView; import net.minecraft.world.LightType; import net.minecraft.world.World; -public class CloudBlock extends Block { - public static boolean isCloudBlock(Block block) { - return block instanceof CloudBlock || block instanceof CloudStairsBlock || block instanceof CloudBedBlock; - } - +public class CloudBlock extends Block implements CloudLike { protected final boolean meltable; public CloudBlock(Settings settings, boolean meltable) { diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudChestBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudChestBlock.java new file mode 100644 index 00000000..cc6bb636 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudChestBlock.java @@ -0,0 +1,159 @@ +package com.minelittlepony.unicopia.block.cloud; + +import java.util.Optional; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.EquineContext; +import com.minelittlepony.unicopia.block.UBlockEntities; +import net.minecraft.block.BlockState; +import net.minecraft.block.ChestBlock; +import net.minecraft.block.DoubleBlockProperties; +import net.minecraft.block.ShapeContext; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.entity.ChestBlockEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.ai.pathing.NavigationType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.DoubleInventory; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; + +public class CloudChestBlock extends ChestBlock implements CloudLike { + private final BlockState baseState; + private final CloudBlock baseBlock; + + private static final DoubleBlockProperties.PropertyRetriever> NAME_RETRIEVER = new DoubleBlockProperties.PropertyRetriever<>(){ + @Override + public Optional getFromBoth(final ChestBlockEntity first, final ChestBlockEntity second) { + final DoubleInventory inventory = new DoubleInventory(first, second); + return Optional.of(new NamedScreenHandlerFactory(){ + @Override + @Nullable + public ScreenHandler createMenu(int i, PlayerInventory playerInventory, PlayerEntity player) { + if (first.checkUnlocked(player) && second.checkUnlocked(player)) { + first.checkLootInteraction(playerInventory.player); + second.checkLootInteraction(playerInventory.player); + return GenericContainerScreenHandler.createGeneric9x6(i, playerInventory, inventory); + } + return null; + } + + @Override + public Text getDisplayName() { + if (first.hasCustomName()) { + return first.getDisplayName(); + } + if (second.hasCustomName()) { + return second.getDisplayName(); + } + return Text.translatable(first.getCachedState().getBlock().getTranslationKey() + ".double"); + } + }); + } + + @Override + public Optional getFrom(ChestBlockEntity chest) { + return Optional.of(chest); + } + + @Override + public Optional getFallback() { + return Optional.empty(); + } + }; + + public CloudChestBlock(Settings settings, BlockState baseState) { + super(settings, () -> UBlockEntities.CLOUD_CHEST); + this.baseState = baseState; + this.baseBlock = (CloudBlock)baseState.getBlock(); + } + + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new TileData(pos, state); + } + + @Override + @Nullable + public NamedScreenHandlerFactory createScreenHandlerFactory(BlockState state, World world, BlockPos pos) { + return getBlockEntitySource(state, world, pos, false).apply(NAME_RETRIEVER).orElse(null); + } + + @Override + public final VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + if (!baseBlock.canInteract(baseState, world, pos, EquineContext.of(context))) { + return VoxelShapes.empty(); + } + return super.getOutlineShape(state, world, pos, context); + } + + @Override + @Deprecated + public final VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) { + return super.getOutlineShape(state, world, pos, ShapeContext.absent()); + } + + @Override + @Deprecated + public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return this.collidable ? state.getOutlineShape(world, pos, context) : VoxelShapes.empty(); + } + + @Override + @Nullable + public final BlockState getPlacementState(ItemPlacementContext context) { + if (!baseBlock.canInteract(baseState, context.getWorld(), context.getBlockPos(), EquineContext.of(context))) { + return null; + } + return super.getPlacementState(context); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (!baseBlock.canInteract(baseState, world, pos, EquineContext.of(player))) { + return ActionResult.PASS; + } + return super.onUse(state, world, pos, player, hand, hit); + } + + @Deprecated + @Override + public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { + baseState.onEntityCollision(world, pos, entity); + } + + @Override + @Deprecated + public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { + return true; + } + + public static class TileData extends ChestBlockEntity { + protected TileData(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { + super(blockEntityType, blockPos, blockState); + } + + public TileData(BlockPos pos, BlockState state) { + super(UBlockEntities.CLOUD_CHEST, pos, state); + } + + @Override + protected Text getContainerName() { + return getCachedState().getBlock().getName(); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudLike.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudLike.java new file mode 100644 index 00000000..ec9ef4fd --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudLike.java @@ -0,0 +1,5 @@ +package com.minelittlepony.unicopia.block.cloud; + +public interface CloudLike { + +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudStairsBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudStairsBlock.java index 51027fe7..bafd9e21 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudStairsBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudStairsBlock.java @@ -16,7 +16,7 @@ import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; -public class CloudStairsBlock extends StairsBlock { +public class CloudStairsBlock extends StairsBlock implements CloudLike { private final CloudBlock baseBlock; diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index b8f72b61..5bf94a22 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.block.*; +import com.minelittlepony.unicopia.block.cloud.CloudChestBlock; import com.minelittlepony.unicopia.client.particle.ChangelingMagicParticle; import com.minelittlepony.unicopia.client.particle.CloudsEscapingParticle; import com.minelittlepony.unicopia.client.particle.DiskParticle; @@ -59,6 +60,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; public interface URenderers { + BlockEntity CHEST_RENDER_ENTITY = new CloudChestBlock.TileData(BlockPos.ORIGIN, UBlocks.CLOUD_CHEST.getDefaultState()); + static void bootstrap() { ParticleFactoryRegistry.getInstance().register(UParticles.UNICORN_MAGIC, createFactory(MagicParticle::new)); ParticleFactoryRegistry.getInstance().register(UParticles.CHANGELING_MAGIC, createFactory(ChangelingMagicParticle::new)); @@ -97,9 +100,11 @@ public interface URenderers { BlockEntityRendererFactories.register(UBlockEntities.WEATHER_VANE, WeatherVaneBlockEntityRenderer::new); BlockEntityRendererFactories.register(UBlockEntities.FANCY_BED, CloudBedBlockEntityRenderer::new); + BlockEntityRendererFactories.register(UBlockEntities.CLOUD_CHEST, CloudChestBlockEntityRenderer::new); register(URenderers::renderJarItem, UItems.FILLED_JAR); register(URenderers::renderBedItem, UItems.CLOTH_BED, UItems.CLOUD_BED); + register(URenderers::renderChestItem, UBlocks.CLOUD_CHEST.asItem()); PolearmRenderer.register(UItems.WOODEN_POLEARM, UItems.STONE_POLEARM, UItems.IRON_POLEARM, UItems.GOLDEN_POLEARM, UItems.DIAMOND_POLEARM, UItems.NETHERITE_POLEARM); ModelPredicateProviderRegistry.register(UItems.GEMSTONE, new Identifier("affinity"), (stack, world, entity, seed) -> EnchantableItem.isEnchanted(stack) ? EnchantableItem.getSpellKey(stack).getAffinity().getAlignment() : 0); ModelPredicateProviderRegistry.register(UItems.ROCK_CANDY, new Identifier("count"), (stack, world, entity, seed) -> stack.getCount() / (float)stack.getMaxCount()); @@ -133,6 +138,10 @@ public interface URenderers { MinecraftClient.getInstance().getBlockEntityRenderDispatcher().renderEntity(entity, matrices, vertices, light, overlay); } + private static void renderChestItem(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { + MinecraftClient.getInstance().getBlockEntityRenderDispatcher().renderEntity(CHEST_RENDER_ENTITY, matrices, vertices, light, overlay); + } + private static void renderJarItem(ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { ItemRenderer renderer = MinecraftClient.getInstance().getItemRenderer(); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudChestBlockEntityRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudChestBlockEntityRenderer.java new file mode 100644 index 00000000..20662111 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/render/entity/CloudChestBlockEntityRenderer.java @@ -0,0 +1,125 @@ +package com.minelittlepony.unicopia.client.render.entity; + +import com.minelittlepony.unicopia.Unicopia; +import net.minecraft.block.AbstractChestBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChestBlock; +import net.minecraft.block.DoubleBlockProperties; +import net.minecraft.block.entity.ChestBlockEntity; +import net.minecraft.block.enums.ChestType; +import net.minecraft.client.model.Dilation; +import net.minecraft.client.model.ModelData; +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.model.ModelPartBuilder; +import net.minecraft.client.model.ModelPartData; +import net.minecraft.client.model.ModelTransform; +import net.minecraft.client.model.TexturedModelData; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BlockEntityRendererFactory.Context; +import net.minecraft.client.render.block.entity.ChestBlockEntityRenderer; +import net.minecraft.client.render.block.entity.LightmapCoordinatesRetriever; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.RotationAxis; + +public class CloudChestBlockEntityRenderer extends ChestBlockEntityRenderer { + private static final LightmapCoordinatesRetriever LIGHTING = new LightmapCoordinatesRetriever<>(); + private final Model[] models; + + public CloudChestBlockEntityRenderer(Context ctx) { + super(ctx); + models = new Model[] { + new Model(Model.getSingleChestModelData().createModel(), Unicopia.id("textures/entity/chest/cloud.png")), + new Model(Model.getLeftChestModelData().createModel(), Unicopia.id("textures/entity/chest/cloud_left.png")), + new Model(Model.getRightChestModelData().createModel(), Unicopia.id("textures/entity/chest/cloud_right.png")) + }; + } + + @Override + public void render(ChestBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { + BlockState state = entity.getWorld() != null ? entity.getCachedState() : Blocks.CHEST.getDefaultState().with(ChestBlock.FACING, Direction.SOUTH); + + if (!(state.getBlock() instanceof AbstractChestBlock)) { + return; + } + + Model model = models[state.getOrEmpty(ChestBlock.CHEST_TYPE).orElse(ChestType.SINGLE).ordinal()]; + var properties = getProperties(state, entity); + + matrices.push(); + matrices.translate(0.5f, 0.5f, 0.5f); + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-state.get(ChestBlock.FACING).asRotation())); + matrices.translate(-0.5f, -0.5f, -0.5f); + model.setAngles(1 - (float)Math.pow(1 - properties.apply(ChestBlock.getAnimationProgressRetriever(entity)).get(tickDelta), 3)); + model.render(matrices, vertexConsumers.getBuffer(RenderLayer.getEntityTranslucent(model.texture)), properties.apply(LIGHTING).applyAsInt(light), overlay); + matrices.pop(); + } + + private DoubleBlockProperties.PropertySource getProperties(BlockState state, ChestBlockEntity entity) { + return entity.getWorld() != null + ? ((AbstractChestBlock)state.getBlock()).getBlockEntitySource(state, entity.getWorld(), entity.getPos(), true) + : DoubleBlockProperties.PropertyRetriever::getFallback; + } + + static class Model { + private final ModelPart tree; + private final ModelPart lid; + + private final Identifier texture; + + public Model(ModelPart tree, Identifier texture) { + this.tree = tree; + this.lid = tree.getChild("lid"); + this.texture = texture; + } + + public static TexturedModelData getSingleChestModelData() { + ModelData data = new ModelData(); + ModelPartData root = data.getRoot(); + root.addChild("chest", ModelPartBuilder.create().uv(0, 19).cuboid(1, 0, 1, 14, 10, 14, Dilation.NONE), ModelTransform.NONE); + root.addChild("lid", ModelPartBuilder.create() + .uv(0, 0).cuboid(6, -2, 13.8F, 2, 4, 1, Dilation.NONE) + .uv(0, 0).cuboid(6, -1, 14, 2, 2, 1, Dilation.NONE) + .uv(0, 0).cuboid(0, 0, 0, 14, 5, 14, new Dilation(0.3F)), ModelTransform.pivot(1, 9, 1)) + .addChild("lock_r1", ModelPartBuilder.create() + .uv(0, 0).cuboid(-2, -4, -0.5F, 2, 4, 1, Dilation.NONE), ModelTransform.of(5, 1, 14.3F, 0, 0, 1.5708F)); + return TexturedModelData.of(data, 64, 64); + } + + public static TexturedModelData getLeftChestModelData() { + ModelData data = new ModelData(); + ModelPartData root = data.getRoot(); + root.addChild("chest", ModelPartBuilder.create().uv(0, 19).cuboid(0, 0, 1, 15, 10, 14, Dilation.NONE), ModelTransform.NONE); + root.addChild("lid", ModelPartBuilder.create() + .uv(0, 0).cuboid(6, -2, 13.8F, 2, 4, 1, Dilation.NONE) + .uv(0, 0).cuboid(6, -1, 14, 2, 2, 1, Dilation.NONE) + .uv(0, 0).cuboid(0, 0, 0, 15, 5, 14, new Dilation(0.3F)), ModelTransform.pivot(0, 9, 1)) + .addChild("lock_r1", ModelPartBuilder.create().uv(0, 0).cuboid(-2, -4, -0.5F, 2, 4, 1, Dilation.NONE), ModelTransform.of(5, 1, 14.3F, 0, 0, 1.5708F)); + return TexturedModelData.of(data, 64, 64); + } + + public static TexturedModelData getRightChestModelData() { + ModelData data = new ModelData(); + ModelPartData root = data.getRoot(); + root.addChild("chest", ModelPartBuilder.create().uv(0, 19).cuboid(1, 0, 1, 15, 10, 14, Dilation.NONE), ModelTransform.NONE); + root.addChild("lid", ModelPartBuilder.create() + .uv(0, 0).cuboid(7, -2, 13.8F, 2, 4, 1, Dilation.NONE) + .uv(0, 0).cuboid(7, -1, 14, 2, 2, 1, Dilation.NONE) + .uv(0, 0).cuboid(0, 0, 0, 15, 5, 14, new Dilation(0.3F)), ModelTransform.pivot(1, 9, 1)) + .addChild("lock_r1", ModelPartBuilder.create().uv(0, 0).cuboid(-2, -4, -0.5F, 2, 4, 1, Dilation.NONE), ModelTransform.of(6, 1, 14.3F, 0, 0, 1.5708F)); + return TexturedModelData.of(data, 64, 64); + } + + public void setAngles(float animationProgress) { + lid.pitch = -(animationProgress * 1.5707964f); + } + + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay) { + tree.render(matrices, vertices, light, overlay); + } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/cloud_chest.json b/src/main/resources/assets/unicopia/blockstates/cloud_chest.json new file mode 100644 index 00000000..aa6b3edb --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/cloud_chest.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "unicopia:block/cloud_chest" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/compacted_etched_cloud.json b/src/main/resources/assets/unicopia/blockstates/compacted_etched_cloud.json new file mode 100644 index 00000000..7490f4f6 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/compacted_etched_cloud.json @@ -0,0 +1,268 @@ +{ + "multipart": [ + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_full", "uvlock": true }, + "when": { "down": true, "north": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_x", "uvlock": true }, + "when": { "down": true, "north": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_y", "uvlock": true }, + "when": { "down": false, "north": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_z", "uvlock": true }, + "when": { "down": true, "north": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xz", "uvlock": true }, + "when": { "down": true, "north": false, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xy", "uvlock": true }, + "when": { "down": false, "north": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_yz", "uvlock": true }, + "when": { "down": false, "north": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xyz", "uvlock": true }, + "when": { "down": false, "north": false, "east": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_full", "uvlock": true, "y": 90 }, + "when": { "down": true, "south": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_z", "uvlock": true, "y": 90 }, + "when": { "down": true, "south": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_y", "uvlock": true, "y": 90 }, + "when": { "down": false, "south": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_x", "uvlock": true, "y": 90 }, + "when": { "down": true, "south": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xz", "uvlock": true, "y": 90 }, + "when": { "down": true, "south": false, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_yz", "uvlock": true, "y": 90 }, + "when": { "down": false, "south": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xy", "uvlock": true, "y": 90 }, + "when": { "down": false, "south": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xyz", "uvlock": true, "y": 90 }, + "when": { "down": false, "south": false, "east": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_full", "uvlock": true, "y": 180 }, + "when": { "down": true, "south": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_x", "uvlock": true, "y": 180 }, + "when": { "down": true, "south": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_y", "uvlock": true, "y": 180 }, + "when": { "down": false, "south": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_z", "uvlock": true, "y": 180 }, + "when": { "down": true, "south": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xz", "uvlock": true, "y": 180 }, + "when": { "down": true, "south": false, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xy", "uvlock": true, "y": 180 }, + "when": { "down": false, "south": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_yz", "uvlock": true, "y": 180 }, + "when": { "down": false, "south": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xyz", "uvlock": true, "y": 180 }, + "when": { "down": false, "south": false, "west": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_full", "uvlock": true, "y": 270 }, + "when": { "down": true, "north": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_z", "uvlock": true, "y": 270 }, + "when": { "down": true, "north": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_y", "uvlock": true, "y": 270 }, + "when": { "down": false, "north": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_x", "uvlock": true, "y": 270 }, + "when": { "down": true, "north": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xz", "uvlock": true, "y": 270 }, + "when": { "down": true, "north": false, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_yz", "uvlock": true, "y": 270 }, + "when": { "down": false, "north": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xy", "uvlock": true, "y": 270 }, + "when": { "down": false, "north": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xyz", "uvlock": true, "y": 270 }, + "when": { "down": false, "north": false, "west": false } + }, + + + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_full", "uvlock": true, "x": 180 }, + "when": { "up": true, "south": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_x", "uvlock": true, "x": 180 }, + "when": { "up": true, "south": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_y", "uvlock": true, "x": 180 }, + "when": { "up": false, "south": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_z", "uvlock": true, "x": 180 }, + "when": { "up": true, "south": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xz", "uvlock": true, "x": 180 }, + "when": { "up": true, "south": false, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xy", "uvlock": true, "x": 180 }, + "when": { "up": false, "south": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_yz", "uvlock": true, "x": 180 }, + "when": { "up": false, "south": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xyz", "uvlock": true, "x": 180 }, + "when": { "up": false, "south": false, "east": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_full", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": true, "south": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_z", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": true, "south": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_y", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": false, "south": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_x", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": true, "south": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xz", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": true, "south": false, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_yz", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": false, "south": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xy", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": false, "south": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xyz", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": false, "south": false, "west": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_full", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": true, "north": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_x", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": true, "north": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_y", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": false, "north": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_z", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": true, "north": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xz", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": true, "north": false, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xy", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": false, "north": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_yz", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": false, "north": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xyz", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": false, "north": false, "west": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_full", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": true, "north": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_z", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": true, "north": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_y", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": false, "north": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_x", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": true, "north": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xz", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": true, "north": false, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_yz", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": false, "north": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xy", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": false, "north": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_etched_cloud_corner_xyz", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": false, "north": false, "east": false } + } + ] +} diff --git a/src/main/resources/assets/unicopia/blockstates/etched_cloud.json b/src/main/resources/assets/unicopia/blockstates/etched_cloud.json new file mode 100644 index 00000000..89ffa3ff --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/etched_cloud.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "unicopia:block/etched_cloud" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/etched_cloud_slab.json b/src/main/resources/assets/unicopia/blockstates/etched_cloud_slab.json new file mode 100644 index 00000000..faaf5c94 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/etched_cloud_slab.json @@ -0,0 +1,7 @@ +{ + "variants": { + "type=double": { "model": "unicopia:block/etched_cloud" }, + "type=bottom": { "model": "unicopia:block/etched_cloud_slab" }, + "type=top": { "model": "unicopia:block/etched_cloud_slab_top" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/etched_cloud_stairs.json b/src/main/resources/assets/unicopia/blockstates/etched_cloud_stairs.json new file mode 100644 index 00000000..e8a09622 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/etched_cloud_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "unicopia:block/etched_cloud_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "unicopia:block/etched_cloud_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "unicopia:block/etched_cloud_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "unicopia:block/etched_cloud_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "unicopia:block/etched_cloud_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "unicopia:block/etched_cloud_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "unicopia:block/etched_cloud_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "unicopia:block/etched_cloud_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "unicopia:block/etched_cloud_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "unicopia:block/etched_cloud_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "unicopia:block/etched_cloud_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "unicopia:block/etched_cloud_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "unicopia:block/etched_cloud_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "unicopia:block/etched_cloud_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 33c35b1e..d9fdcaa0 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -298,9 +298,15 @@ "block.unicopia.dense_cloud_slab": "Dense Cloud Slab", "block.unicopia.dense_cloud_stairs": "Dense Cloud Stairs", "block.unicopia.compacted_dense_cloud": "Dense Cloud", + "block.unicopia.etched_cloud": "Etched Cloud", + "block.unicopia.etched_cloud_slab": "Etched Cloud Slab", + "block.unicopia.etched_cloud_stairs": "Etched Cloud Stairs", + "block.unicopia.compacted_etched_cloud": "Cloud Etched Cloud", "block.unicopia.cloud_pillar": "Cloud Pillar", "block.unicopia.cloth_bed": "Fancy Cloth Bed", "block.unicopia.cloud_bed": "Cloud Bed", + "block.unicopia.cloud_chest": "Cloudsdale Chest", + "block.unicopia.cloud_chest.double": "Large Cloudsdale Chest", "block.unicopia.oats": "Oats", "block.unicopia.oats_stem": "Oats", diff --git a/src/main/resources/assets/unicopia/models/block/cloud_chest.json b/src/main/resources/assets/unicopia/models/block/cloud_chest.json new file mode 100644 index 00000000..e30e3f72 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/cloud_chest.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "unicopia:block/cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/etched_cloud.json b/src/main/resources/assets/unicopia/models/block/etched_cloud.json new file mode 100644 index 00000000..3bc4dc53 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/etched_cloud.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "unicopia:block/etched_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/etched_cloud_slab.json b/src/main/resources/assets/unicopia/models/block/etched_cloud_slab.json new file mode 100644 index 00000000..3e08552c --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/etched_cloud_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "unicopia:block/etched_cloud", + "side": "unicopia:block/etched_cloud", + "top": "unicopia:block/etched_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/etched_cloud_slab_top.json b/src/main/resources/assets/unicopia/models/block/etched_cloud_slab_top.json new file mode 100644 index 00000000..1e3a94a8 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/etched_cloud_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "unicopia:block/etched_cloud", + "side": "unicopia:block/etched_cloud", + "top": "unicopia:block/etched_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs.json b/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs.json new file mode 100644 index 00000000..13559128 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "unicopia:block/cloud_stairs", + "textures": { + "bottom": "unicopia:block/etched_cloud", + "side": "unicopia:block/etched_cloud", + "top": "unicopia:block/etched_cloud" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs_inner.json b/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs_inner.json new file mode 100644 index 00000000..e54dae19 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "unicopia:block/cloud_stairs_inner", + "textures": { + "bottom": "unicopia:block/etched_cloud", + "side": "unicopia:block/etched_cloud", + "top": "unicopia:block/etched_cloud" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs_outer.json b/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs_outer.json new file mode 100644 index 00000000..8ee25113 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/etched_cloud_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "unicopia:block/cloud_stairs_outer", + "textures": { + "bottom": "unicopia:block/etched_cloud", + "side": "unicopia:block/etched_cloud", + "top": "unicopia:block/etched_cloud" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_full.json b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_full.json new file mode 100644 index 00000000..96ed79e2 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_full.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_full", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_x.json b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_x.json new file mode 100644 index 00000000..a0e2924d --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_x.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_x", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xy.json b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xy.json new file mode 100644 index 00000000..f38b7250 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xy.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_xy", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xyz.json b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xyz.json new file mode 100644 index 00000000..382df9ab --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xyz.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_xyz", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xz.json b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xz.json new file mode 100644 index 00000000..bad87c59 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_xz.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_xz", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_y.json b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_y.json new file mode 100644 index 00000000..2e2572a5 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_y.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_y", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_yz.json b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_yz.json new file mode 100644 index 00000000..b4e0a676 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_yz.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_yz", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_z.json b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_z.json new file mode 100644 index 00000000..fa657f3b --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_etched_cloud_corner_z.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_z", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/cloud_chest.json b/src/main/resources/assets/unicopia/models/item/cloud_chest.json new file mode 100644 index 00000000..74aedb05 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/cloud_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "minecraft:item/white_wool" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/etched_cloud.json b/src/main/resources/assets/unicopia/models/item/etched_cloud.json new file mode 100644 index 00000000..3ed47a0c --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/etched_cloud.json @@ -0,0 +1,3 @@ +{ + "parent": "unicopia:block/etched_cloud" +} diff --git a/src/main/resources/assets/unicopia/models/item/etched_cloud_slab.json b/src/main/resources/assets/unicopia/models/item/etched_cloud_slab.json new file mode 100644 index 00000000..fb4023b6 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/etched_cloud_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "unicopia:block/etched_cloud_slab" +} diff --git a/src/main/resources/assets/unicopia/models/item/etched_cloud_stairs.json b/src/main/resources/assets/unicopia/models/item/etched_cloud_stairs.json new file mode 100644 index 00000000..a8728434 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/etched_cloud_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "unicopia:block/etched_cloud_stairs" +} diff --git a/src/main/resources/assets/unicopia/textures/block/etched_cloud.png b/src/main/resources/assets/unicopia/textures/block/etched_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1fe67e2c3a842fbe089dd7499d29872c79564b GIT binary patch literal 7296 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/chest/cloud_left.png b/src/main/resources/assets/unicopia/textures/entity/chest/cloud_left.png new file mode 100644 index 0000000000000000000000000000000000000000..a240805d3966d6624f20414e1e39615fa07c6daf GIT binary patch literal 6032 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 Ph9Qo#yHmlUwXy#Jt7^aK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/chest/cloud_right.png b/src/main/resources/assets/unicopia/textures/entity/chest/cloud_right.png new file mode 100644 index 0000000000000000000000000000000000000000..5652a775e499cfba3301d5b3bb174eeb827a80d1 GIT binary patch literal 6129 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 NLceLg`QG!B{|*0I@(ln0 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_cutting.json b/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_cutting.json new file mode 100644 index 00000000..9f8b76ff --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_cutting.json @@ -0,0 +1,6 @@ +{ + "type": "unicopia:cloud_shaping", + "ingredient": { "item": "unicopia:dense_cloud" }, + "result": "unicopia:etched_cloud", + "count": 1 +} diff --git a/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_slab_cutting.json b/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_slab_cutting.json new file mode 100644 index 00000000..951b6f70 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_slab_cutting.json @@ -0,0 +1,6 @@ +{ + "type": "unicopia:cloud_shaping", + "ingredient": { "item": "unicopia:etched_cloud" }, + "result": "unicopia:etched_cloud_slab", + "count": 2 +} diff --git a/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_stairs_cutting.json b/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_stairs_cutting.json new file mode 100644 index 00000000..85ddf8e0 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/blocks/carving/etched_cloud_stairs_cutting.json @@ -0,0 +1,6 @@ +{ + "type": "unicopia:cloud_shaping", + "ingredient": { "item": "unicopia:etched_cloud" }, + "result": "unicopia:etched_cloud_stairs", + "count": 1 +} diff --git a/src/main/resources/data/unicopia/recipes/blocks/cloud_chest.json b/src/main/resources/data/unicopia/recipes/blocks/cloud_chest.json new file mode 100644 index 00000000..5373f56c --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/blocks/cloud_chest.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "# #", + "###" + ], + "key": { + "#": [ + { "item": "unicopia:cloud_planks" } + ] + }, + "result": { "item": "unicopia:cloud_chest", "count": 1 } +} diff --git a/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json b/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json index 580865fc..3a2b1dc1 100644 --- a/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json +++ b/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json @@ -4,6 +4,7 @@ "unicopia:cloud_slab", "unicopia:soggy_cloud_slab", "unicopia:dense_cloud_slab", + "unicopia:etched_cloud_slab", "unicopia:cloud_plank_slab", "unicopia:cloud_brick_slab" ] diff --git a/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json b/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json index a8dcd633..7f816bb4 100644 --- a/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json +++ b/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json @@ -4,6 +4,7 @@ "unicopia:cloud_stairs", "unicopia:soggy_cloud_stairs", "unicopia:dense_cloud_stairs", + "unicopia:etched_cloud_stairs", "unicopia:cloud_plank_stairs", "unicopia:cloud_brick_stairs" ] diff --git a/src/main/resources/data/unicopia/tags/blocks/clouds.json b/src/main/resources/data/unicopia/tags/blocks/clouds.json index 8aa7f251..911abcd4 100644 --- a/src/main/resources/data/unicopia/tags/blocks/clouds.json +++ b/src/main/resources/data/unicopia/tags/blocks/clouds.json @@ -5,6 +5,7 @@ "unicopia:cloud_planks", "unicopia:cloud_bricks", "unicopia:dense_cloud", + "unicopia:etched_cloud", "unicopia:carved_cloud", "unicopia:compacted_cloud", "unicopia:compacted_cloud_planks", diff --git a/src/main/resources/data/unicopia/tags/items/cloud_slabs.json b/src/main/resources/data/unicopia/tags/items/cloud_slabs.json index 59d4913d..bbf14745 100644 --- a/src/main/resources/data/unicopia/tags/items/cloud_slabs.json +++ b/src/main/resources/data/unicopia/tags/items/cloud_slabs.json @@ -3,6 +3,7 @@ "values": [ "unicopia:cloud_slab", "unicopia:dense_cloud_slab", + "unicopia:etched_cloud_slab" "unicopia:cloud_plank_slab" ] } diff --git a/src/main/resources/data/unicopia/tags/items/cloud_stairs.json b/src/main/resources/data/unicopia/tags/items/cloud_stairs.json index c53b4404..cbbba0dc 100644 --- a/src/main/resources/data/unicopia/tags/items/cloud_stairs.json +++ b/src/main/resources/data/unicopia/tags/items/cloud_stairs.json @@ -3,6 +3,7 @@ "values": [ "unicopia:cloud_stairs", "unicopia:dense_cloud_stairs", + "unicopia:etched_cloud_stairs", "unicopia:cloud_plank_stairs" ] } diff --git a/src/main/resources/data/unicopia/tags/items/clouds.json b/src/main/resources/data/unicopia/tags/items/clouds.json index 039c3d9f..d77163af 100644 --- a/src/main/resources/data/unicopia/tags/items/clouds.json +++ b/src/main/resources/data/unicopia/tags/items/clouds.json @@ -6,6 +6,7 @@ "unicopia:cloud_planks", "unicopia:cloud_bricks", "unicopia:dense_cloud", + "unicopia:etched_cloud", "unicopia:unstable_cloud" ] } diff --git a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json index d0f069f3..154bfd88 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json +++ b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json @@ -2,6 +2,7 @@ "replace": false, "values": [ "unicopia:shaping_bench", + "unicopia:cloud_chest", "unicopia:cloud_lump", "unicopia:cloud", "unicopia:cloud_slab", @@ -15,6 +16,9 @@ "unicopia:dense_cloud", "unicopia:dense_cloud_slab", "unicopia:dense_cloud_stairs", + "unicopia:etched_cloud", + "unicopia:etched_cloud_slab", + "unicopia:etched_cloud_stairs", "unicopia:unstable_cloud", "unicopia:cloud_pillar", "unicopia:cloud_bed", From a7ff78e141919cecb44bd3e2fa28ae39aef1af15 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 4 Dec 2023 20:46:45 +0000 Subject: [PATCH 88/90] Added the stable doors, crystal door, and cloud door --- .../unicopia/block/CrystalDoorBlock.java | 64 +++++++++ .../unicopia/block/StableDoorBlock.java | 10 +- .../unicopia/block/UBlocks.java | 6 + .../unicopia/block/UWoodTypes.java | 17 ++- .../unicopia/block/cloud/CloudDoorBlock.java | 87 ++++++++++++ .../block/cloud/CompactedCloudBlock.java | 2 +- .../{library_door.json => cloud_door.json} | 128 +++++++++--------- .../unicopia/blockstates/crystal_door.json | 68 ++++++++++ .../blockstates/dark_oak_stable_door.json | 68 ++++++++++ .../{bakery_door.json => stable_door.json} | 128 +++++++++--------- .../models/block/door/bakery_bottom.json | 7 - .../models/block/door/bakery_bottom_rh.json | 7 - .../models/block/door/bakery_top.json | 7 - .../models/block/door/bakery_top_rh.json | 7 - .../models/block/door/cloud_bottom.json | 7 + .../models/block/door/cloud_bottom_rh.json | 7 + .../unicopia/models/block/door/cloud_top.json | 7 + .../models/block/door/cloud_top_rh.json | 7 + .../models/block/door/crystal_bottom.json | 7 + .../models/block/door/crystal_bottom_rh.json | 7 + .../models/block/door/crystal_top.json | 7 + .../models/block/door/crystal_top_rh.json | 7 + .../block/door/dark_oak_stable_bottom.json | 7 + .../block/door/dark_oak_stable_bottom_rh.json | 7 + .../block/door/dark_oak_stable_top.json | 7 + .../block/door/dark_oak_stable_top_rh.json | 7 + .../models/block/door/diamond_bottom.json | 7 - .../models/block/door/diamond_bottom_rh.json | 7 - .../models/block/door/diamond_top.json | 7 - .../models/block/door/diamond_top_rh.json | 7 - .../models/block/door/library_bottom.json | 7 - .../models/block/door/library_bottom_rh.json | 7 - .../models/block/door/library_top.json | 7 - .../models/block/door/library_top_rh.json | 7 - .../models/block/door/mist_bottom.json | 7 - .../models/block/door/mist_bottom_rh.json | 7 - .../unicopia/models/block/door/mist_top.json | 7 - .../models/block/door/mist_top_rh.json | 7 - .../models/block/door/stable_bottom.json | 7 + .../models/block/door/stable_bottom_rh.json | 7 + .../models/block/door/stable_top.json | 7 + .../models/block/door/stable_top_rh.json | 7 + .../unicopia/models/item/cloud_door.json | 6 + .../unicopia/models/item/crystal_door.json | 6 + .../models/item/dark_oak_stable_door.json | 6 + .../unicopia/models/item/stable_door.json | 6 + .../textures/block/cloud_door_lower.png | Bin 0 -> 6616 bytes .../textures/block/cloud_door_upper.png | Bin 0 -> 6743 bytes .../textures/block/crystal_door_lower.png | Bin 0 -> 537 bytes .../textures/block/crystal_door_upper.png | Bin 0 -> 886 bytes .../block/crystal_door_upper.png.mcmeta | 11 ++ .../block/dark_oak_stable_door_lower.png | Bin 0 -> 610 bytes .../block/dark_oak_stable_door_upper.png | Bin 0 -> 631 bytes .../textures/block/stable_door_lower.png | Bin 0 -> 590 bytes .../textures/block/stable_door_upper.png | Bin 0 -> 502 bytes .../unicopia/textures/item/cloud_door.png | Bin 0 -> 245 bytes .../unicopia/textures/item/crystal_door.png | Bin 0 -> 219 bytes .../textures/item/dark_oak_stable_door.png | Bin 0 -> 218 bytes .../unicopia/textures/item/stable_door.png | Bin 0 -> 185 bytes .../loot_tables/blocks/cloud_door.json | 29 ++++ .../blocks/compacted_cloud_planks.json | 20 --- .../loot_tables/blocks/crystal_door.json | 29 ++++ .../blocks/darK_oak_stable_door.json | 29 ++++ ...compacted_cloud.json => etched_cloud.json} | 2 +- .../loot_tables/blocks/etched_cloud_slab.json | 41 ++++++ ...d_bricks.json => etched_cloud_stairs.json} | 9 +- .../loot_tables/blocks/stable_door.json | 29 ++++ .../data/unicopia/recipes/crystal_door.json | 16 +++ .../recipes/dark_oak_stable_door.json | 19 +++ .../data/unicopia/recipes/stable_door.json | 19 +++ .../data/unicopia/tags/items/cloud_slabs.json | 2 +- .../data/unicopia/tags/items/clouds.json | 3 +- .../tags/items/groups/changeling.json | 1 + .../tags/items/groups/earth_pony.json | 2 + .../unicopia/tags/items/groups/pegasus.json | 1 + .../unicopia/tags/items/groups/unicorn.json | 11 +- 76 files changed, 823 insertions(+), 276 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/block/CrystalDoorBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/block/cloud/CloudDoorBlock.java rename src/main/resources/assets/unicopia/blockstates/{library_door.json => cloud_door.json} (50%) create mode 100644 src/main/resources/assets/unicopia/blockstates/crystal_door.json create mode 100644 src/main/resources/assets/unicopia/blockstates/dark_oak_stable_door.json rename src/main/resources/assets/unicopia/blockstates/{bakery_door.json => stable_door.json} (50%) delete mode 100644 src/main/resources/assets/unicopia/models/block/door/bakery_bottom.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/bakery_bottom_rh.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/bakery_top.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/bakery_top_rh.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/cloud_bottom.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/cloud_bottom_rh.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/cloud_top.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/cloud_top_rh.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/crystal_bottom.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/crystal_bottom_rh.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/crystal_top.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/crystal_top_rh.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_bottom.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_bottom_rh.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_top.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_top_rh.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/diamond_bottom.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/diamond_bottom_rh.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/diamond_top.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/diamond_top_rh.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/library_bottom.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/library_bottom_rh.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/library_top.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/library_top_rh.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/mist_bottom.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/mist_bottom_rh.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/mist_top.json delete mode 100644 src/main/resources/assets/unicopia/models/block/door/mist_top_rh.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/stable_bottom.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/stable_bottom_rh.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/stable_top.json create mode 100644 src/main/resources/assets/unicopia/models/block/door/stable_top_rh.json create mode 100644 src/main/resources/assets/unicopia/models/item/cloud_door.json create mode 100644 src/main/resources/assets/unicopia/models/item/crystal_door.json create mode 100644 src/main/resources/assets/unicopia/models/item/dark_oak_stable_door.json create mode 100644 src/main/resources/assets/unicopia/models/item/stable_door.json create mode 100644 src/main/resources/assets/unicopia/textures/block/cloud_door_lower.png create mode 100644 src/main/resources/assets/unicopia/textures/block/cloud_door_upper.png create mode 100644 src/main/resources/assets/unicopia/textures/block/crystal_door_lower.png create mode 100644 src/main/resources/assets/unicopia/textures/block/crystal_door_upper.png create mode 100644 src/main/resources/assets/unicopia/textures/block/crystal_door_upper.png.mcmeta create mode 100644 src/main/resources/assets/unicopia/textures/block/dark_oak_stable_door_lower.png create mode 100644 src/main/resources/assets/unicopia/textures/block/dark_oak_stable_door_upper.png create mode 100644 src/main/resources/assets/unicopia/textures/block/stable_door_lower.png create mode 100644 src/main/resources/assets/unicopia/textures/block/stable_door_upper.png create mode 100644 src/main/resources/assets/unicopia/textures/item/cloud_door.png create mode 100644 src/main/resources/assets/unicopia/textures/item/crystal_door.png create mode 100644 src/main/resources/assets/unicopia/textures/item/dark_oak_stable_door.png create mode 100644 src/main/resources/assets/unicopia/textures/item/stable_door.png create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/cloud_door.json delete mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_planks.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/crystal_door.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/darK_oak_stable_door.json rename src/main/resources/data/unicopia/loot_tables/blocks/{compacted_cloud.json => etched_cloud.json} (94%) create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud_slab.json rename src/main/resources/data/unicopia/loot_tables/blocks/{compacted_cloud_bricks.json => etched_cloud_stairs.json} (58%) create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/stable_door.json create mode 100644 src/main/resources/data/unicopia/recipes/crystal_door.json create mode 100644 src/main/resources/data/unicopia/recipes/dark_oak_stable_door.json create mode 100644 src/main/resources/data/unicopia/recipes/stable_door.json diff --git a/src/main/java/com/minelittlepony/unicopia/block/CrystalDoorBlock.java b/src/main/java/com/minelittlepony/unicopia/block/CrystalDoorBlock.java new file mode 100644 index 00000000..c7690aa1 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/CrystalDoorBlock.java @@ -0,0 +1,64 @@ +package com.minelittlepony.unicopia.block; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.EquineContext; +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.item.UItems; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockSetType; +import net.minecraft.block.BlockState; +import net.minecraft.block.DoorBlock; +import net.minecraft.block.enums.DoubleBlockHalf; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.sound.SoundCategory; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; +import net.minecraft.world.event.GameEvent; + +public class CrystalDoorBlock extends DoorBlock { + + public CrystalDoorBlock(Settings settings, BlockSetType blockSet) { + super(settings, blockSet); + } + + @Override + public void neighborUpdate(BlockState state, World world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) { + boolean powered = world.isReceivingRedstonePower(pos) || world.isReceivingRedstonePower(pos.offset(state.get(HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN)); + if (!getDefaultState().isOf(sourceBlock) && powered != state.get(POWERED)) { + if (powered) { + state = state.cycle(OPEN); + playOpenCloseSound(null, world, pos, state.get(OPEN)); + world.emitGameEvent(null, state.get(OPEN) ? GameEvent.BLOCK_OPEN : GameEvent.BLOCK_CLOSE, pos); + } + + world.setBlockState(pos, state.with(POWERED, powered), Block.NOTIFY_LISTENERS); + } + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (!EquineContext.of(player).getCompositeRace().any(Race::canCast)) { + + if (!player.getStackInHand(hand).isOf(UItems.MEADOWBROOKS_STAFF)) { + playOpenCloseSound(player, world, pos, false); + return ActionResult.FAIL; + } else { + world.playSound(player, pos, USounds.ENTITY_CRYSTAL_SHARDS_AMBIENT, SoundCategory.BLOCKS, 1, world.getRandom().nextFloat() * 0.1F + 0.9F); + } + } + return super.onUse(state, world, pos, player, hand, hit); + } + + private void playOpenCloseSound(@Nullable Entity entity, World world, BlockPos pos, boolean open) { + world.playSound(entity, pos, open ? getBlockSetType().doorOpen() : getBlockSetType().doorClose(), SoundCategory.BLOCKS, 1, world.getRandom().nextFloat() * 0.1f + 0.9f); + } + +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/StableDoorBlock.java b/src/main/java/com/minelittlepony/unicopia/block/StableDoorBlock.java index 20a4363c..f170da30 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/StableDoorBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/StableDoorBlock.java @@ -11,8 +11,8 @@ import net.minecraft.world.WorldAccess; public class StableDoorBlock extends DoorBlock { - public StableDoorBlock(Settings settings) { - super(settings, BlockSetType.OAK); + public StableDoorBlock(Settings settings, BlockSetType blockSet) { + super(settings, blockSet); } @Override @@ -21,6 +21,12 @@ public class StableDoorBlock extends DoorBlock { if (direction.getAxis() == Direction.Axis.Y && half == DoubleBlockHalf.LOWER == (direction == Direction.UP)) { if (neighborState.isOf(this) && neighborState.get(HALF) != half) { + state = state + .with(FACING, neighborState.get(FACING)) + .with(HINGE, neighborState.get(HINGE)); + if (half == DoubleBlockHalf.UPPER && direction == Direction.DOWN && !state.get(POWERED)) { + state = state.with(OPEN, neighborState.get(OPEN)); + } return state; } diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 3ee4872e..b74d0566 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -15,6 +15,7 @@ import com.minelittlepony.unicopia.block.cloud.PoreousCloudStairsBlock; import com.minelittlepony.unicopia.block.cloud.ShapingBenchBlock; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; import com.minelittlepony.unicopia.block.cloud.CloudChestBlock; +import com.minelittlepony.unicopia.block.cloud.CloudDoorBlock; import com.minelittlepony.unicopia.block.cloud.CloudLike; import com.minelittlepony.unicopia.block.cloud.SoggyCloudBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudSlabBlock; @@ -200,6 +201,11 @@ public interface UBlocks { Block SCALLOP_SHELL = register("scallop_shell", new ShellsBlock(Settings.create().mapColor(MapColor.DULL_PINK).breakInstantly().nonOpaque())); Block TURRET_SHELL = register("turret_shell", new ShellsBlock(Settings.create().mapColor(MapColor.DULL_PINK).breakInstantly().nonOpaque())); + Block STABLE_DOOR = register("stable_door", new StableDoorBlock(Settings.copy(Blocks.OAK_DOOR), BlockSetType.OAK), ItemGroups.FUNCTIONAL); + Block DARK_OAK_DOOR = register("dark_oak_stable_door", new StableDoorBlock(Settings.copy(Blocks.OAK_DOOR), BlockSetType.OAK), ItemGroups.FUNCTIONAL); + Block CRYSTAL_DOOR = register("crystal_door", new CrystalDoorBlock(Settings.copy(Blocks.IRON_DOOR), UWoodTypes.CRYSTAL), ItemGroups.FUNCTIONAL); + Block CLOUD_DOOR = register("cloud_door", new CloudDoorBlock(Settings.copy(CLOUD), CLOUD.getDefaultState(), UWoodTypes.CLOUD), ItemGroups.FUNCTIONAL); + private static T register(String name, T item) { return register(Unicopia.id(name), item); } diff --git a/src/main/java/com/minelittlepony/unicopia/block/UWoodTypes.java b/src/main/java/com/minelittlepony/unicopia/block/UWoodTypes.java index 5f090ce9..0a44586e 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UWoodTypes.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UWoodTypes.java @@ -1,25 +1,34 @@ package com.minelittlepony.unicopia.block; +import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.Unicopia; import com.terraformersmc.terraform.boat.api.TerraformBoatType; import com.terraformersmc.terraform.boat.api.TerraformBoatTypeRegistry; import net.fabricmc.fabric.api.object.builder.v1.block.type.BlockSetTypeBuilder; import net.fabricmc.fabric.api.object.builder.v1.block.type.WoodTypeBuilder; +import net.minecraft.block.BlockSetType; import net.minecraft.block.WoodType; import net.minecraft.registry.RegistryKey; +import net.minecraft.sound.BlockSoundGroup; import net.minecraft.util.Identifier; public interface UWoodTypes { WoodType PALM = register("palm"); RegistryKey PALM_BOAT_TYPE = TerraformBoatTypeRegistry.createKey(Unicopia.id("palm")); + BlockSetType CLOUD = new BlockSetTypeBuilder() + .soundGroup(BlockSoundGroup.WOOL) + .doorCloseSound(USounds.Vanilla.BLOCK_WOOL_HIT) + .doorOpenSound(USounds.Vanilla.BLOCK_WOOL_BREAK) + .register(Unicopia.id("cloud")); + BlockSetType CRYSTAL = BlockSetTypeBuilder.copyOf(BlockSetType.IRON) + .soundGroup(BlockSoundGroup.AMETHYST_BLOCK) + .openableByHand(true) + .register(Unicopia.id("crystal")); + static WoodType register(String name) { Identifier id = Unicopia.id(name); return new WoodTypeBuilder().register(id, new BlockSetTypeBuilder().register(id)); } - - - - } diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudDoorBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudDoorBlock.java new file mode 100644 index 00000000..be730174 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudDoorBlock.java @@ -0,0 +1,87 @@ +package com.minelittlepony.unicopia.block.cloud; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.EquineContext; +import com.minelittlepony.unicopia.Race; + +import net.minecraft.block.BlockSetType; +import net.minecraft.block.BlockState; +import net.minecraft.block.DoorBlock; +import net.minecraft.block.ShapeContext; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; + +public class CloudDoorBlock extends DoorBlock implements CloudLike { + private final BlockState baseState; + private final CloudBlock baseBlock; + + public CloudDoorBlock(Settings settings, BlockState baseState, BlockSetType blockSet) { + super(settings, blockSet); + this.baseState = baseState; + this.baseBlock = (CloudBlock)baseState.getBlock(); + } + + + @Override + public final VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + if (canPassThrough(state, world, pos, EquineContext.of(context))) { + return VoxelShapes.empty(); + } + return super.getOutlineShape(state, world, pos, context); + } + + protected boolean canPassThrough(BlockState state, BlockView world, BlockPos pos, EquineContext context) { + return context.getCompositeRace().any(Race::canUseEarth); + } + + @Override + @Deprecated + public final VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) { + return super.getOutlineShape(state, world, pos, ShapeContext.absent()); + } + + @Override + @Deprecated + public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return this.collidable ? state.getOutlineShape(world, pos, context) : VoxelShapes.empty(); + } + + @Override + @Nullable + public final BlockState getPlacementState(ItemPlacementContext context) { + if (!baseBlock.canInteract(baseState, context.getWorld(), context.getBlockPos(), EquineContext.of(context))) { + return null; + } + return super.getPlacementState(context); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (!baseBlock.canInteract(baseState, world, pos, EquineContext.of(player))) { + return ActionResult.PASS; + } + return super.onUse(state, world, pos, player, hand, hit); + } + + @Deprecated + @Override + public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { + baseState.onEntityCollision(world, pos, entity); + + EquineContext context = EquineContext.of(entity); + + if (!baseBlock.canInteract(baseState, world, pos, context)) { + entity.setVelocity(entity.getVelocity().multiply(0.5F, 1, 0.5F)); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java index e27f7ee1..a9e6f727 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java @@ -48,7 +48,7 @@ public class CompactedCloudBlock extends CloudBlock { private final BlockState baseState; public CompactedCloudBlock(BlockState baseState) { - super(Settings.copy(baseState.getBlock()), true); + super(Settings.copy(baseState.getBlock()).dropsLike(baseState.getBlock()), true); this.baseState = baseState; PROPERTIES.forEach(property -> { setDefaultState(getDefaultState().with(property, true)); diff --git a/src/main/resources/assets/unicopia/blockstates/library_door.json b/src/main/resources/assets/unicopia/blockstates/cloud_door.json similarity index 50% rename from src/main/resources/assets/unicopia/blockstates/library_door.json rename to src/main/resources/assets/unicopia/blockstates/cloud_door.json index aec9f468..e837d7f0 100644 --- a/src/main/resources/assets/unicopia/blockstates/library_door.json +++ b/src/main/resources/assets/unicopia/blockstates/cloud_door.json @@ -1,68 +1,68 @@ { "variants": { - "facing=east,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:door/library_bottom" }, - "facing=south,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:door/library_bottom", "y": 90 }, - "facing=west,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:door/library_bottom", "y": 180 }, - "facing=north,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:door/library_bottom", "y": 270 }, - "facing=east,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:door/library_bottom_rh" }, - "facing=south,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:door/library_bottom_rh", "y": 90 }, - "facing=west,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:door/library_bottom_rh", "y": 180 }, - "facing=north,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:door/library_bottom_rh", "y": 270 }, - "facing=east,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:door/library_bottom_rh", "y": 90 }, - "facing=south,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:door/library_bottom_rh", "y": 180 }, - "facing=west,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:door/library_bottom_rh", "y": 270 }, - "facing=north,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:door/library_bottom_rh" }, - "facing=east,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:door/library_bottom", "y": 270 }, - "facing=south,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:door/library_bottom" }, - "facing=west,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:door/library_bottom", "y": 90 }, - "facing=north,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:door/library_bottom", "y": 180 }, - "facing=east,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:door/library_top" }, - "facing=south,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:door/library_top", "y": 90 }, - "facing=west,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:door/library_top", "y": 180 }, - "facing=north,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:door/library_top", "y": 270 }, - "facing=east,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:door/library_top_rh" }, - "facing=south,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:door/library_top_rh", "y": 90 }, - "facing=west,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:door/library_top_rh", "y": 180 }, - "facing=north,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:door/library_top_rh", "y": 270 }, - "facing=east,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:door/library_top_rh", "y": 90 }, - "facing=south,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:door/library_top_rh", "y": 180 }, - "facing=west,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:door/library_top_rh", "y": 270 }, - "facing=north,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:door/library_top_rh" }, - "facing=east,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:door/library_top", "y": 270 }, - "facing=south,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:door/library_top" }, - "facing=west,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:door/library_top", "y": 90 }, - "facing=north,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:door/library_top", "y": 180 }, - "facing=east,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:door/library_bottom" }, - "facing=south,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:door/library_bottom", "y": 90 }, - "facing=west,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:door/library_bottom", "y": 180 }, - "facing=north,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:door/library_bottom", "y": 270 }, - "facing=east,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:door/library_bottom_rh" }, - "facing=south,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:door/library_bottom_rh", "y": 90 }, - "facing=west,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:door/library_bottom_rh", "y": 180 }, - "facing=north,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:door/library_bottom_rh", "y": 270 }, - "facing=east,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:door/library_bottom_rh", "y": 90 }, - "facing=south,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:door/library_bottom_rh", "y": 180 }, - "facing=west,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:door/library_bottom_rh", "y": 270 }, - "facing=north,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:door/library_bottom_rh" }, - "facing=east,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:door/library_bottom", "y": 270 }, - "facing=south,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:door/library_bottom" }, - "facing=west,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:door/library_bottom", "y": 90 }, - "facing=north,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:door/library_bottom", "y": 180 }, - "facing=east,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:door/library_top" }, - "facing=south,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:door/library_top", "y": 90 }, - "facing=west,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:door/library_top", "y": 180 }, - "facing=north,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:door/library_top", "y": 270 }, - "facing=east,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:door/library_top_rh" }, - "facing=south,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:door/library_top_rh", "y": 90 }, - "facing=west,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:door/library_top_rh", "y": 180 }, - "facing=north,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:door/library_top_rh", "y": 270 }, - "facing=east,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:door/library_top_rh", "y": 90 }, - "facing=south,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:door/library_top_rh", "y": 180 }, - "facing=west,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:door/library_top_rh", "y": 270 }, - "facing=north,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:door/library_top_rh" }, - "facing=east,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:door/library_top", "y": 270 }, - "facing=south,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:door/library_top" }, - "facing=west,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:door/library_top", "y": 90 }, - "facing=north,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:door/library_top", "y": 180 } + "facing=east,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/cloud_bottom" }, + "facing=south,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/cloud_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/cloud_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/cloud_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/cloud_bottom_rh" }, + "facing=south,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/cloud_bottom_rh" }, + "facing=east,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/cloud_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/cloud_bottom" }, + "facing=west,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/cloud_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/cloud_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/cloud_top" }, + "facing=south,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/cloud_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/cloud_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/cloud_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/cloud_top_rh" }, + "facing=south,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/cloud_top_rh", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/cloud_top_rh", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/cloud_top_rh", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/cloud_top_rh", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/cloud_top_rh", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/cloud_top_rh", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/cloud_top_rh" }, + "facing=east,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/cloud_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/cloud_top" }, + "facing=west,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/cloud_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/cloud_top", "y": 180 }, + "facing=east,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/cloud_bottom" }, + "facing=south,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/cloud_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/cloud_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/cloud_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/cloud_bottom_rh" }, + "facing=south,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/cloud_bottom_rh", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/cloud_bottom_rh" }, + "facing=east,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/cloud_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/cloud_bottom" }, + "facing=west,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/cloud_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/cloud_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/cloud_top" }, + "facing=south,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/cloud_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/cloud_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/cloud_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/cloud_top_rh" }, + "facing=south,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/cloud_top_rh", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/cloud_top_rh", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/cloud_top_rh", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/cloud_top_rh", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/cloud_top_rh", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/cloud_top_rh", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/cloud_top_rh" }, + "facing=east,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/cloud_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/cloud_top" }, + "facing=west,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/cloud_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/cloud_top", "y": 180 } } } diff --git a/src/main/resources/assets/unicopia/blockstates/crystal_door.json b/src/main/resources/assets/unicopia/blockstates/crystal_door.json new file mode 100644 index 00000000..15184fa7 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/crystal_door.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/crystal_bottom" }, + "facing=south,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/crystal_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/crystal_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/crystal_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/crystal_bottom_rh" }, + "facing=south,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/crystal_bottom_rh" }, + "facing=east,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/crystal_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/crystal_bottom" }, + "facing=west,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/crystal_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/crystal_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/crystal_top" }, + "facing=south,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/crystal_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/crystal_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/crystal_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/crystal_top_rh" }, + "facing=south,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/crystal_top_rh", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/crystal_top_rh", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/crystal_top_rh", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/crystal_top_rh", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/crystal_top_rh", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/crystal_top_rh", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/crystal_top_rh" }, + "facing=east,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/crystal_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/crystal_top" }, + "facing=west,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/crystal_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/crystal_top", "y": 180 }, + "facing=east,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/crystal_bottom" }, + "facing=south,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/crystal_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/crystal_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/crystal_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/crystal_bottom_rh" }, + "facing=south,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/crystal_bottom_rh", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/crystal_bottom_rh" }, + "facing=east,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/crystal_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/crystal_bottom" }, + "facing=west,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/crystal_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/crystal_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/crystal_top" }, + "facing=south,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/crystal_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/crystal_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/crystal_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/crystal_top_rh" }, + "facing=south,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/crystal_top_rh", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/crystal_top_rh", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/crystal_top_rh", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/crystal_top_rh", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/crystal_top_rh", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/crystal_top_rh", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/crystal_top_rh" }, + "facing=east,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/crystal_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/crystal_top" }, + "facing=west,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/crystal_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/crystal_top", "y": 180 } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/dark_oak_stable_door.json b/src/main/resources/assets/unicopia/blockstates/dark_oak_stable_door.json new file mode 100644 index 00000000..7cc92f37 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/dark_oak_stable_door.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom" }, + "facing=south,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh" }, + "facing=south,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh" }, + "facing=east,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom" }, + "facing=west,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top" }, + "facing=south,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top_rh" }, + "facing=south,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top_rh" }, + "facing=east,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top" }, + "facing=west,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 180 }, + "facing=east,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom" }, + "facing=south,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh" }, + "facing=south,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom_rh" }, + "facing=east,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom" }, + "facing=west,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top" }, + "facing=south,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top_rh" }, + "facing=south,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top_rh", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top_rh" }, + "facing=east,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top" }, + "facing=west,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/dark_oak_stable_top", "y": 180 } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/bakery_door.json b/src/main/resources/assets/unicopia/blockstates/stable_door.json similarity index 50% rename from src/main/resources/assets/unicopia/blockstates/bakery_door.json rename to src/main/resources/assets/unicopia/blockstates/stable_door.json index 72faabed..01d4ec97 100644 --- a/src/main/resources/assets/unicopia/blockstates/bakery_door.json +++ b/src/main/resources/assets/unicopia/blockstates/stable_door.json @@ -1,68 +1,68 @@ { "variants": { - "facing=east,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:door/bakery_bottom" }, - "facing=south,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:door/bakery_bottom", "y": 90 }, - "facing=west,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:door/bakery_bottom", "y": 180 }, - "facing=north,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:door/bakery_bottom", "y": 270 }, - "facing=east,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:door/bakery_bottom_rh" }, - "facing=south,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:door/bakery_bottom_rh", "y": 90 }, - "facing=west,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:door/bakery_bottom_rh", "y": 180 }, - "facing=north,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:door/bakery_bottom_rh", "y": 270 }, - "facing=east,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:door/bakery_bottom_rh", "y": 90 }, - "facing=south,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:door/bakery_bottom_rh", "y": 180 }, - "facing=west,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:door/bakery_bottom_rh", "y": 270 }, - "facing=north,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:door/bakery_bottom_rh" }, - "facing=east,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:door/bakery_bottom", "y": 270 }, - "facing=south,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:door/bakery_bottom" }, - "facing=west,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:door/bakery_bottom", "y": 90 }, - "facing=north,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:door/bakery_bottom", "y": 180 }, - "facing=east,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:door/bakery_top" }, - "facing=south,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:door/bakery_top", "y": 90 }, - "facing=west,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:door/bakery_top", "y": 180 }, - "facing=north,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:door/bakery_top", "y": 270 }, - "facing=east,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:door/bakery_top_rh" }, - "facing=south,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:door/bakery_top_rh", "y": 90 }, - "facing=west,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:door/bakery_top_rh", "y": 180 }, - "facing=north,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:door/bakery_top_rh", "y": 270 }, - "facing=east,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:door/bakery_top_rh", "y": 90 }, - "facing=south,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:door/bakery_top_rh", "y": 180 }, - "facing=west,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:door/bakery_top_rh", "y": 270 }, - "facing=north,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:door/bakery_top_rh" }, - "facing=east,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:door/bakery_top", "y": 270 }, - "facing=south,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:door/bakery_top" }, - "facing=west,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:door/bakery_top", "y": 90 }, - "facing=north,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:door/bakery_top", "y": 180 }, - "facing=east,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:door/bakery_bottom" }, - "facing=south,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:door/bakery_bottom", "y": 90 }, - "facing=west,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:door/bakery_bottom", "y": 180 }, - "facing=north,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:door/bakery_bottom", "y": 270 }, - "facing=east,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:door/bakery_bottom_rh" }, - "facing=south,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:door/bakery_bottom_rh", "y": 90 }, - "facing=west,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:door/bakery_bottom_rh", "y": 180 }, - "facing=north,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:door/bakery_bottom_rh", "y": 270 }, - "facing=east,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:door/bakery_bottom_rh", "y": 90 }, - "facing=south,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:door/bakery_bottom_rh", "y": 180 }, - "facing=west,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:door/bakery_bottom_rh", "y": 270 }, - "facing=north,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:door/bakery_bottom_rh" }, - "facing=east,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:door/bakery_bottom", "y": 270 }, - "facing=south,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:door/bakery_bottom" }, - "facing=west,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:door/bakery_bottom", "y": 90 }, - "facing=north,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:door/bakery_bottom", "y": 180 }, - "facing=east,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:door/bakery_top" }, - "facing=south,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:door/bakery_top", "y": 90 }, - "facing=west,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:door/bakery_top", "y": 180 }, - "facing=north,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:door/bakery_top", "y": 270 }, - "facing=east,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:door/bakery_top_rh" }, - "facing=south,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:door/bakery_top_rh", "y": 90 }, - "facing=west,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:door/bakery_top_rh", "y": 180 }, - "facing=north,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:door/bakery_top_rh", "y": 270 }, - "facing=east,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:door/bakery_top_rh", "y": 90 }, - "facing=south,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:door/bakery_top_rh", "y": 180 }, - "facing=west,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:door/bakery_top_rh", "y": 270 }, - "facing=north,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:door/bakery_top_rh" }, - "facing=east,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:door/bakery_top", "y": 270 }, - "facing=south,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:door/bakery_top" }, - "facing=west,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:door/bakery_top", "y": 90 }, - "facing=north,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:door/bakery_top", "y": 180 } + "facing=east,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/stable_bottom" }, + "facing=south,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/stable_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/stable_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/stable_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/stable_bottom_rh" }, + "facing=south,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/stable_bottom_rh", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/stable_bottom_rh", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/stable_bottom_rh", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/stable_bottom_rh", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/stable_bottom_rh", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/stable_bottom_rh", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/stable_bottom_rh" }, + "facing=east,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/stable_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/stable_bottom" }, + "facing=west,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/stable_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/stable_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/stable_top" }, + "facing=south,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/stable_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/stable_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false,powered=false": { "model": "unicopia:block/door/stable_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/stable_top_rh" }, + "facing=south,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/stable_top_rh", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/stable_top_rh", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false,powered=false": { "model": "unicopia:block/door/stable_top_rh", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/stable_top_rh", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/stable_top_rh", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/stable_top_rh", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true,powered=false": { "model": "unicopia:block/door/stable_top_rh" }, + "facing=east,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/stable_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/stable_top" }, + "facing=west,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/stable_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true,powered=false": { "model": "unicopia:block/door/stable_top", "y": 180 }, + "facing=east,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/stable_bottom" }, + "facing=south,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/stable_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/stable_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/stable_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/stable_bottom_rh" }, + "facing=south,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/stable_bottom_rh", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/stable_bottom_rh", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/stable_bottom_rh", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/stable_bottom_rh", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/stable_bottom_rh", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/stable_bottom_rh", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/stable_bottom_rh" }, + "facing=east,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/stable_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/stable_bottom" }, + "facing=west,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/stable_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/stable_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/stable_top" }, + "facing=south,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/stable_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/stable_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false,powered=true": { "model": "unicopia:block/door/stable_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/stable_top_rh" }, + "facing=south,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/stable_top_rh", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/stable_top_rh", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false,powered=true": { "model": "unicopia:block/door/stable_top_rh", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/stable_top_rh", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/stable_top_rh", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/stable_top_rh", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true,powered=true": { "model": "unicopia:block/door/stable_top_rh" }, + "facing=east,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/stable_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/stable_top" }, + "facing=west,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/stable_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true,powered=true": { "model": "unicopia:block/door/stable_top", "y": 180 } } } diff --git a/src/main/resources/assets/unicopia/models/block/door/bakery_bottom.json b/src/main/resources/assets/unicopia/models/block/door/bakery_bottom.json deleted file mode 100644 index 20af668b..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/bakery_bottom.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/bottom", - "textures": { - "bottom": "unicopia:blocks/door_bakery_lower", - "top": "unicopia:blocks/door_bakery_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/bakery_bottom_rh.json b/src/main/resources/assets/unicopia/models/block/door/bakery_bottom_rh.json deleted file mode 100644 index f82e8191..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/bakery_bottom_rh.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/bottom_rh", - "textures": { - "bottom": "unicopia:blocks/door_bakery_lower", - "top": "unicopia:blocks/door_bakery_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/bakery_top.json b/src/main/resources/assets/unicopia/models/block/door/bakery_top.json deleted file mode 100644 index ea3a51b0..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/bakery_top.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/top", - "textures": { - "bottom": "unicopia:blocks/door_bakery_lower", - "top": "unicopia:blocks/door_bakery_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/bakery_top_rh.json b/src/main/resources/assets/unicopia/models/block/door/bakery_top_rh.json deleted file mode 100644 index 38cc28ce..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/bakery_top_rh.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/top_rh", - "textures": { - "bottom": "unicopia:blocks/door_bakery_lower", - "top": "unicopia:blocks/door_bakery_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/cloud_bottom.json b/src/main/resources/assets/unicopia/models/block/door/cloud_bottom.json new file mode 100644 index 00000000..b5afc313 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/cloud_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/bottom", + "textures": { + "bottom": "unicopia:block/cloud_door_lower", + "top": "unicopia:block/cloud_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/cloud_bottom_rh.json b/src/main/resources/assets/unicopia/models/block/door/cloud_bottom_rh.json new file mode 100644 index 00000000..575b5941 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/cloud_bottom_rh.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/bottom_rh", + "textures": { + "bottom": "unicopia:block/cloud_door_lower", + "top": "unicopia:block/cloud_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/cloud_top.json b/src/main/resources/assets/unicopia/models/block/door/cloud_top.json new file mode 100644 index 00000000..41bed4d6 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/cloud_top.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/top", + "textures": { + "bottom": "unicopia:block/cloud_door_lower", + "top": "unicopia:block/cloud_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/cloud_top_rh.json b/src/main/resources/assets/unicopia/models/block/door/cloud_top_rh.json new file mode 100644 index 00000000..fb1c6ad9 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/cloud_top_rh.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/top_rh", + "textures": { + "bottom": "unicopia:block/cloud_door_lower", + "top": "unicopia:block/cloud_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/crystal_bottom.json b/src/main/resources/assets/unicopia/models/block/door/crystal_bottom.json new file mode 100644 index 00000000..ef81dfb9 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/crystal_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/bottom", + "textures": { + "bottom": "unicopia:block/crystal_door_lower", + "top": "unicopia:block/crystal_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/crystal_bottom_rh.json b/src/main/resources/assets/unicopia/models/block/door/crystal_bottom_rh.json new file mode 100644 index 00000000..5919da7d --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/crystal_bottom_rh.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/bottom_rh", + "textures": { + "bottom": "unicopia:block/crystal_door_lower", + "top": "unicopia:block/crystal_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/crystal_top.json b/src/main/resources/assets/unicopia/models/block/door/crystal_top.json new file mode 100644 index 00000000..f7ab0700 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/crystal_top.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/top", + "textures": { + "bottom": "unicopia:block/crystal_door_lower", + "top": "unicopia:block/crystal_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/crystal_top_rh.json b/src/main/resources/assets/unicopia/models/block/door/crystal_top_rh.json new file mode 100644 index 00000000..9e7f150c --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/crystal_top_rh.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/top_rh", + "textures": { + "bottom": "unicopia:block/crystal_door_lower", + "top": "unicopia:block/crystal_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_bottom.json b/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_bottom.json new file mode 100644 index 00000000..80964112 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/bottom", + "textures": { + "bottom": "unicopia:block/door_library_lower", + "top": "unicopia:block/door_library_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_bottom_rh.json b/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_bottom_rh.json new file mode 100644 index 00000000..2304df0e --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_bottom_rh.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/bottom_rh", + "textures": { + "bottom": "unicopia:block/door_library_lower", + "top": "unicopia:block/door_library_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_top.json b/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_top.json new file mode 100644 index 00000000..f4b0fc2f --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_top.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/top", + "textures": { + "bottom": "unicopia:block/door_library_lower", + "top": "unicopia:block/door_library_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_top_rh.json b/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_top_rh.json new file mode 100644 index 00000000..669abb48 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/dark_oak_stable_top_rh.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/top_rh", + "textures": { + "bottom": "unicopia:block/door_library_lower", + "top": "unicopia:block/door_library_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/diamond_bottom.json b/src/main/resources/assets/unicopia/models/block/door/diamond_bottom.json deleted file mode 100644 index 02d76d21..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/diamond_bottom.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/bottom", - "textures": { - "bottom": "unicopia:blocks/door_diamond_lower", - "top": "unicopia:blocks/door_diamond_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/diamond_bottom_rh.json b/src/main/resources/assets/unicopia/models/block/door/diamond_bottom_rh.json deleted file mode 100644 index 8556b6d7..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/diamond_bottom_rh.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/bottom_rh", - "textures": { - "bottom": "unicopia:blocks/door_diamond_lower", - "top": "unicopia:blocks/door_diamond_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/diamond_top.json b/src/main/resources/assets/unicopia/models/block/door/diamond_top.json deleted file mode 100644 index 19212184..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/diamond_top.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/top", - "textures": { - "bottom": "unicopia:blocks/door_diamond_lower", - "top": "unicopia:blocks/door_diamond_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/diamond_top_rh.json b/src/main/resources/assets/unicopia/models/block/door/diamond_top_rh.json deleted file mode 100644 index ad3be532..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/diamond_top_rh.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/top_rh", - "textures": { - "bottom": "unicopia:blocks/door_diamond_lower", - "top": "unicopia:blocks/door_diamond_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/library_bottom.json b/src/main/resources/assets/unicopia/models/block/door/library_bottom.json deleted file mode 100644 index 9696a7f6..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/library_bottom.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/bottom", - "textures": { - "bottom": "unicopia:blocks/door_library_lower", - "top": "unicopia:blocks/door_library_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/library_bottom_rh.json b/src/main/resources/assets/unicopia/models/block/door/library_bottom_rh.json deleted file mode 100644 index b06d234d..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/library_bottom_rh.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/bottom_rh", - "textures": { - "bottom": "unicopia:blocks/door_library_lower", - "top": "unicopia:blocks/door_library_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/library_top.json b/src/main/resources/assets/unicopia/models/block/door/library_top.json deleted file mode 100644 index e230b4df..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/library_top.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/top", - "textures": { - "bottom": "unicopia:blocks/door_library_lower", - "top": "unicopia:blocks/door_library_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/library_top_rh.json b/src/main/resources/assets/unicopia/models/block/door/library_top_rh.json deleted file mode 100644 index 13422e83..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/library_top_rh.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "unicopia:block/door/top_rh", - "textures": { - "bottom": "unicopia:blocks/door_library_lower", - "top": "unicopia:blocks/door_library_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/mist_bottom.json b/src/main/resources/assets/unicopia/models/block/door/mist_bottom.json deleted file mode 100644 index 9d342f67..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/mist_bottom.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom", - "textures": { - "bottom": "unicopia:blocks/door_mist_lower", - "top": "unicopia:blocks/door_mist_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/mist_bottom_rh.json b/src/main/resources/assets/unicopia/models/block/door/mist_bottom_rh.json deleted file mode 100644 index babde1e1..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/mist_bottom_rh.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "block/door_bottom_rh", - "textures": { - "bottom": "unicopia:blocks/door_mist_lower", - "top": "unicopia:blocks/door_mist_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/mist_top.json b/src/main/resources/assets/unicopia/models/block/door/mist_top.json deleted file mode 100644 index cc1bbbb4..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/mist_top.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "block/door_top", - "textures": { - "bottom": "unicopia:blocks/door_mist_lower", - "top": "unicopia:blocks/door_mist_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/mist_top_rh.json b/src/main/resources/assets/unicopia/models/block/door/mist_top_rh.json deleted file mode 100644 index f75c8761..00000000 --- a/src/main/resources/assets/unicopia/models/block/door/mist_top_rh.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "block/door_top_rh", - "textures": { - "bottom": "unicopia:blocks/door_mist_lower", - "top": "unicopia:blocks/door_mist_upper" - } -} diff --git a/src/main/resources/assets/unicopia/models/block/door/stable_bottom.json b/src/main/resources/assets/unicopia/models/block/door/stable_bottom.json new file mode 100644 index 00000000..efbfa9c1 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/stable_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/bottom", + "textures": { + "bottom": "unicopia:block/stable_door_lower", + "top": "unicopia:block/stable_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/stable_bottom_rh.json b/src/main/resources/assets/unicopia/models/block/door/stable_bottom_rh.json new file mode 100644 index 00000000..857535ec --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/stable_bottom_rh.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/bottom_rh", + "textures": { + "bottom": "unicopia:block/stable_door_lower", + "top": "unicopia:block/stable_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/stable_top.json b/src/main/resources/assets/unicopia/models/block/door/stable_top.json new file mode 100644 index 00000000..18822b0b --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/stable_top.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/top", + "textures": { + "bottom": "unicopia:block/stable_door_lower", + "top": "unicopia:block/stable_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/door/stable_top_rh.json b/src/main/resources/assets/unicopia/models/block/door/stable_top_rh.json new file mode 100644 index 00000000..29559c4d --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/door/stable_top_rh.json @@ -0,0 +1,7 @@ +{ + "parent": "unicopia:block/door/top_rh", + "textures": { + "bottom": "unicopia:block/stable_door_lower", + "top": "unicopia:block/stable_door_upper" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/cloud_door.json b/src/main/resources/assets/unicopia/models/item/cloud_door.json new file mode 100644 index 00000000..6c3e3edb --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/cloud_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "unicopia:item/cloud_door" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/crystal_door.json b/src/main/resources/assets/unicopia/models/item/crystal_door.json new file mode 100644 index 00000000..2ff46655 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/crystal_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "unicopia:item/crystal_door" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/dark_oak_stable_door.json b/src/main/resources/assets/unicopia/models/item/dark_oak_stable_door.json new file mode 100644 index 00000000..6e363cb1 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/dark_oak_stable_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "unicopia:item/dark_oak_stable_door" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/stable_door.json b/src/main/resources/assets/unicopia/models/item/stable_door.json new file mode 100644 index 00000000..91dffae0 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/stable_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "unicopia:item/stable_door" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/textures/block/cloud_door_lower.png b/src/main/resources/assets/unicopia/textures/block/cloud_door_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..e6abc40dd15e98507b7f56ed3192b34387a931be GIT binary patch literal 6616 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/cloud_door_upper.png b/src/main/resources/assets/unicopia/textures/block/cloud_door_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..5f399b3fa1385c3671e5b24fc474e625a017cd75 GIT binary patch literal 6743 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/crystal_door_lower.png b/src/main/resources/assets/unicopia/textures/block/crystal_door_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..d249aba7f1bb0dd723975bf4c514986fd15c749a GIT binary patch literal 537 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/stable_door_upper.png b/src/main/resources/assets/unicopia/textures/block/stable_door_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..69ef5b6a468014c0cc5a1ec130cfb96b68c547e7 GIT binary patch literal 502 zcmVPu15XJF-mF=FOL?Ig_wusf7feUaQE(R-3kTbA@utfsFXu>FoKkBjQ#G$?V$=!N> zW!XNy|DbyhhC1g;1df?ug6bj=XW_`e#AZEw`$0aX!R5_wnu1~rJqF2yS*DIV&U{BP zN9uG>6xj^;tBN-T5yox1=RuW9@T;D9P{k~BsJ8&zNgVEvGzF(|H$(g?oMa+dremZx zuK>1=I$g}Mx32*h5`Mi;Kmy=}WdO|b#?5@XM!FV?vPy@k5Q+e!e+qB zPhaSCV9X}#dUi>9dWwFO=z$GSx*>!)eSuLxrJ0mPl!B@NA|R z3Q6l`cE|5MW~If~s=as8lLKR8V7e)g1(MbgE@Pp_1J)`5G!tasxR_4^ED(TLrG^ zR!FdYsf~|+Y;&H~#8;SMfoa&IJk7FOp8&(S?`lJ#(pftguD(t%WE`x$A+BK$bnKp-V*!sKqj^^7+T zJbJJH;gs=2p@jGQ>y>Xc{P!^X-@emj!sOTXyPU+5lGx9({^ykX@bCBb|3|92TO(R4 zoxCELr)DrGaPrvN3gj{ba&lU#E?VmL=n`X)*OAqn`DsdC!ph1q@(e8b`e8aj%l80X O%i!ti=d#Wzp$Pygol{T% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/dark_oak_stable_door.png b/src/main/resources/assets/unicopia/textures/item/dark_oak_stable_door.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bbe2eacf231268b87809e4b679e08b9c2664d5 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3q4&NLo7}wCrD%*=r|KN`N6;S zx`+J(F8?w<|KQh*395N=-;xu6;K!fG{K`DZkCmB4n6KoTPkh5FmeaIHM(6*>kDO8s zZ$jeuru~0WGbgU0mCQYj0)t;ECtHM1!s3g} zlUVOEJjrkg>&cUd(?4LcC|gOQ_Xp3xWs>U|Uq}@$4OpWo7;9|j9AOZoG%e!5hg-2W g8yn8=zrnzuGQ-Ypp<2&8pj#L`UHx3vIVCg!05T>*4FCWD literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_door.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_door.json new file mode 100644 index 00000000..2d948321 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "unicopia:cloud_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "unicopia:cloud_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_planks.json b/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_planks.json deleted file mode 100644 index e0208139..00000000 --- a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_planks.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "rolls": 1.0, - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "name": "unicopia:cloud_planks" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/crystal_door.json b/src/main/resources/data/unicopia/loot_tables/blocks/crystal_door.json new file mode 100644 index 00000000..15fd1392 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/crystal_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "unicopia:crystal_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "unicopia:crystal_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/darK_oak_stable_door.json b/src/main/resources/data/unicopia/loot_tables/blocks/darK_oak_stable_door.json new file mode 100644 index 00000000..f758c3e2 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/darK_oak_stable_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "unicopia:darK_oak_stable_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "unicopia:darK_oak_stable_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud.json b/src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud.json similarity index 94% rename from src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud.json rename to src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud.json index 282d5ec9..163e3667 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud.json @@ -11,7 +11,7 @@ "functions": [ { "add": false, - "count": 4, + "count": 9, "function": "minecraft:set_count" } ] diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud_slab.json b/src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud_slab.json new file mode 100644 index 00000000..4465e094 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud_slab.json @@ -0,0 +1,41 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:cloud_lump", + "functions": [ + { + "add": false, + "count": 4, + "function": "minecraft:set_count" + }, + { + "add": false, + "count": 8, + "function": "minecraft:set_count", + "conditions": [ + { + "block": "unicopia:etched_cloud_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ] + } + ] + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_bricks.json b/src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud_stairs.json similarity index 58% rename from src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_bricks.json rename to src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud_stairs.json index bd4602d9..80ba3be4 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_bricks.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/etched_cloud_stairs.json @@ -7,7 +7,14 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:cloud_bricks" + "name": "unicopia:cloud_lump", + "functions": [ + { + "add": false, + "count": 13, + "function": "minecraft:set_count" + } + ] } ], "conditions": [ diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/stable_door.json b/src/main/resources/data/unicopia/loot_tables/blocks/stable_door.json new file mode 100644 index 00000000..edeff07c --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/stable_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "unicopia:stable_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "unicopia:stable_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/crystal_door.json b/src/main/resources/data/unicopia/recipes/crystal_door.json new file mode 100644 index 00000000..0d952926 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/crystal_door.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "**", + "**", + "**" + ], + "key": { + "*": { + "item": "unicopia:crystal_shard" + } + }, + "result": { + "item": "unicopia:crystal_door" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/dark_oak_stable_door.json b/src/main/resources/data/unicopia/recipes/dark_oak_stable_door.json new file mode 100644 index 00000000..21aef6a2 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/dark_oak_stable_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "*#*", + "*#*", + "*#*" + ], + "key": { + "*": { + "item": "unicopia:rock" + }, + "#": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "unicopia:dark_oak_stable_door" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/stable_door.json b/src/main/resources/data/unicopia/recipes/stable_door.json new file mode 100644 index 00000000..c1acd242 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/stable_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "*#*", + "*#*", + "*#*" + ], + "key": { + "*": { + "item": "unicopia:rock_candy" + }, + "#": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "unicopia:stable_door" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/tags/items/cloud_slabs.json b/src/main/resources/data/unicopia/tags/items/cloud_slabs.json index bbf14745..a7337a0e 100644 --- a/src/main/resources/data/unicopia/tags/items/cloud_slabs.json +++ b/src/main/resources/data/unicopia/tags/items/cloud_slabs.json @@ -3,7 +3,7 @@ "values": [ "unicopia:cloud_slab", "unicopia:dense_cloud_slab", - "unicopia:etched_cloud_slab" + "unicopia:etched_cloud_slab", "unicopia:cloud_plank_slab" ] } diff --git a/src/main/resources/data/unicopia/tags/items/clouds.json b/src/main/resources/data/unicopia/tags/items/clouds.json index d77163af..7fe9a915 100644 --- a/src/main/resources/data/unicopia/tags/items/clouds.json +++ b/src/main/resources/data/unicopia/tags/items/clouds.json @@ -7,6 +7,7 @@ "unicopia:cloud_bricks", "unicopia:dense_cloud", "unicopia:etched_cloud", - "unicopia:unstable_cloud" + "unicopia:unstable_cloud", + "unicopia:cloud_door" ] } diff --git a/src/main/resources/data/unicopia/tags/items/groups/changeling.json b/src/main/resources/data/unicopia/tags/items/groups/changeling.json index cea725a9..3cc31831 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/changeling.json +++ b/src/main/resources/data/unicopia/tags/items/groups/changeling.json @@ -11,6 +11,7 @@ "unicopia:chitin_spikes", "unicopia:mysterious_egg", "unicopia:hive", + "unicopia:dark_oak_stable_door", "#unicopia:food_types/cooked_meat", "#unicopia:food_types/raw_meat", "#unicopia:food_types/raw_insect", diff --git a/src/main/resources/data/unicopia/tags/items/groups/earth_pony.json b/src/main/resources/data/unicopia/tags/items/groups/earth_pony.json index 84d6b64b..54ec96ce 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/earth_pony.json +++ b/src/main/resources/data/unicopia/tags/items/groups/earth_pony.json @@ -10,6 +10,8 @@ "unicopia:stripped_zap_log", "unicopia:stripped_zap_wood", "unicopia:candied_apple", + "unicopia:stable_door", + "unicopia:dark_oak_stable_door", "minecraft:apple", "unicopia:green_apple", "unicopia:sweet_apple", diff --git a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json index 154bfd88..b76a934d 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json +++ b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json @@ -21,6 +21,7 @@ "unicopia:etched_cloud_stairs", "unicopia:unstable_cloud", "unicopia:cloud_pillar", + "unicopia:cloud_door", "unicopia:cloud_bed", "#unicopia:bed_sheets", "#unicopia:food_types/raw_fish", diff --git a/src/main/resources/data/unicopia/tags/items/groups/unicorn.json b/src/main/resources/data/unicopia/tags/items/groups/unicorn.json index bf9762e2..79b0cb95 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/unicorn.json +++ b/src/main/resources/data/unicopia/tags/items/groups/unicorn.json @@ -1,16 +1,17 @@ { "replace": false, "values": [ + "unicopia:spellbook", + "unicopia:gemstone", + "unicopia:botched_gem", "unicopia:friendship_bracelet", "unicopia:crystal_heart", "unicopia:crystal_shard", - "unicopia:gemstone", - "unicopia:botched_gem", - "unicopia:magic_staff", - "unicopia:dragon_breath_scroll", - "unicopia:spellbook", + "unicopia:crystal_door", "unicopia:meadowbrooks_staff", + "unicopia:magic_staff", "unicopia:grogars_bell", + "unicopia:dragon_breath_scroll", "unicopia:pegasus_amulet", "unicopia:alicorn_amulet", "unicopia:broken_alicorn_amulet", From f8fc9467be0da0083d37be7040db6e26eb85de13 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 5 Dec 2023 23:06:52 +0000 Subject: [PATCH 89/90] We don't need this to be a model, just use the part --- .../unicopia/client/render/PolearmRenderer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/PolearmRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/PolearmRenderer.java index 36993336..967c7da0 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/PolearmRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/PolearmRenderer.java @@ -7,8 +7,8 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.item.ClampedModelPredicateProvider; import net.minecraft.client.item.ModelPredicateProviderRegistry; import net.minecraft.client.model.*; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.model.TridentEntityModel; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.json.ModelTransformationMode; @@ -26,7 +26,7 @@ public class PolearmRenderer implements DynamicItemRenderer, ClampedModelPredica private static final PolearmRenderer INSTANCE = new PolearmRenderer(); private static final Identifier THROWING = new Identifier("throwing"); - private final TridentEntityModel model = new TridentEntityModel(getTexturedModelData().createModel()); + private final ModelPart model = getTexturedModelData().createModel(); public static void register(Item...items) { for (Item item : items) { @@ -89,7 +89,7 @@ public class PolearmRenderer implements DynamicItemRenderer, ClampedModelPredica } Identifier id = Registries.ITEM.getId(stack.getItem()); Identifier texture = new Identifier(id.getNamespace(), "textures/entity/polearm/" + id.getPath() + ".png"); - model.render(matrices, ItemRenderer.getDirectItemGlintConsumer(vertexConsumers, model.getLayer(texture), false, stack.hasGlint()), light, overlay, 1, 1, 1, 1); + model.render(matrices, ItemRenderer.getDirectItemGlintConsumer(vertexConsumers, RenderLayer.getEntitySolid(texture), false, stack.hasGlint()), light, overlay, 1, 1, 1, 1); matrices.pop(); } } From ea813c3dcbed485d388eee21dd098f639fdb99f9 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 13 Dec 2023 18:21:06 +0000 Subject: [PATCH 90/90] Add an advancement: A Falling Wizard --- .../ability/UnicornTeleportAbility.java | 16 ++++++---- .../unicopia/advancement/UCriteria.java | 1 + .../resources/assets/unicopia/lang/en_us.json | 2 ++ .../unicopia/unicorn/a_falling_wizard.json | 29 +++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/data/unicopia/advancements/unicopia/unicorn/a_falling_wizard.json diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java index 0e305e88..1f9c411e 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java @@ -8,6 +8,7 @@ import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Pos; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; +import com.minelittlepony.unicopia.advancement.UCriteria; import com.minelittlepony.unicopia.block.state.StatePredicate; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.player.Pony; @@ -163,16 +164,19 @@ public class UnicornTeleportAbility implements Ability { Vec3d dest = destination.vec().add(offset); - participant.teleport( - dest.x, - getTargetYPosition(participant.getEntityWorld(), BlockPos.ofFloored(dest), ShapeContext.of(participant)), - dest.z - ); + dest = new Vec3d(dest.x, getTargetYPosition(participant.getEntityWorld(), BlockPos.ofFloored(dest), ShapeContext.of(participant)), dest.z); + + participant.teleport(dest.x, dest.y, dest.z); teleporter.subtractEnergyCost(distance); participant.fallDistance /= distance; - participant.getWorld().playSound(null, destination.pos(), USounds.ENTITY_PLAYER_UNICORN_TELEPORT, SoundCategory.PLAYERS, 1, 1); + BlockPos blockPos = BlockPos.ofFloored(dest); + + participant.getWorld().playSound(null, blockPos, USounds.ENTITY_PLAYER_UNICORN_TELEPORT, SoundCategory.PLAYERS, 1, 1); + if (!participant.getEntityWorld().isInBuildLimit(blockPos)) { + UCriteria.TELEPORT_ABOVE_WORLD.trigger(teleporter.asEntity()); + } return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java b/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java index 05121bc8..a652354d 100644 --- a/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java +++ b/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java @@ -27,6 +27,7 @@ public interface UCriteria { CustomEventCriterion.Trigger POWER_UP_HEART = CUSTOM_EVENT.createTrigger("power_up_heart"); CustomEventCriterion.Trigger SPLIT_SEA = CUSTOM_EVENT.createTrigger("split_sea"); CustomEventCriterion.Trigger RIDE_BALLOON = CUSTOM_EVENT.createTrigger("ride_balloon"); + CustomEventCriterion.Trigger TELEPORT_ABOVE_WORLD = CUSTOM_EVENT.createTrigger("teleport_above_world"); static void bootstrap() { } } diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index d9fdcaa0..41f63712 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -1180,6 +1180,8 @@ "advancements.unicopia.tempted.description": "Put on the alicorn amulet", "advancements.unicopia.hello_darkness_my_old_friend.title": "Hello Darkness...", "advancements.unicopia.hello_darkness_my_old_friend.description": "Delve further into the powers of the dark side", + "advancements.unicopia.a_falling_wizard.title": "A Falling Wizard", + "advancements.unicopia.a_falling_wizard.description": "A unicorn tried to perform an unsuccessful flying spell", "advancements.unicopia.split_the_sea.title": "Who are you? Moses?", "advancements.unicopia.split_the_sea.description": "Use magic to displace over 100 blocks of water in one go", diff --git a/src/main/resources/data/unicopia/advancements/unicopia/unicorn/a_falling_wizard.json b/src/main/resources/data/unicopia/advancements/unicopia/unicorn/a_falling_wizard.json new file mode 100644 index 00000000..bb6eada4 --- /dev/null +++ b/src/main/resources/data/unicopia/advancements/unicopia/unicorn/a_falling_wizard.json @@ -0,0 +1,29 @@ +{ + "parent": "unicopia:unicopia/unicorn/magical_route", + "display": { + "icon": { + "item": "unicopia:pegasus_amulet" + }, + "title": { + "translate": "advancements.unicopia.a_falling_wizard.title" + }, + "description": { + "translate": "advancements.unicopia.a_falling_wizard.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "criteria": { + "teleport_above_world": { + "trigger": "unicopia:custom", + "conditions": { + "event": "teleport_above_world" + } + } + }, + "requirements": [ + [ "teleport_above_world" ] + ] +}

=iRF8sICg#m;Fcl9*k0ZCg+`Od?btP#;~XdY(=na zn6YY+Aa?6WUb;EIVzK*)lDvJC^lH_imv*S|saDLxP$8XhXt2sEFyyzGu|bviG54fX zdP+GV{e>5@@wkaH?w`61L+2B!T=#4GfsbBP>ZcImZ}-1{Uph#%vYqNXH&%A0j=ON+ zRQH;a(2g93H%23)C?WgVbJzgx+L=1bSmDxGVL- tcBpOLGDgVtZEx4y&slqa?}JHT?y*1jeK4{tgPuqLx|4_Far?kc{{zS)*j)es literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/cloud_bed/white.png b/src/main/resources/assets/unicopia/textures/entity/bed/cloud.png similarity index 100% rename from src/main/resources/assets/unicopia/textures/entity/cloud_bed/white.png rename to src/main/resources/assets/unicopia/textures/entity/bed/cloud.png diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/apple.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..b04c408b66408a232a31e3b55a05f5e1a4a97e35 GIT binary patch literal 5986 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 Dfcn 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/checker.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/checker.png new file mode 100644 index 0000000000000000000000000000000000000000..db0a9f600956af4a20b3f2e2c74336cd966a4bee GIT binary patch literal 6123 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/orange.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/orange.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb93f14d2ea3fed2efe2d64339c34d92627e2e0 GIT binary patch literal 5620 zcmeHKc~nzZ8h;64i!8E;BA_v-VBlqWSzjc`Dntz+i(m!yk-T7pEF=MfTY*|vEQ+`x zGPNCT#Raq!#jT*lg%(7eic1TKRa|b_RVJXo}SXYn=wR z@v$=f@rjTL@um+GOQI+UoyDZHIl!NZu!St9kjrL57m$n?&Jf1KjHt%-a)9BWI3u_%Ui!EuGe$us>=gdH0+} zKh@s7V!vA)T-e_3eayxERl)(`F~P&%+GtjJ<0*&e5$ovD?fr#8>&MuC_OknN%bmv_ zZROi`EYAF%5cf^K9+@E1`2;-~HNj^0Xz7?O+xJ~smrO3b^KhL1>6SXf)}HEVVMh!3 zu5C_h?#$x*wr8|Ikj(5j8R?Eq5>N2=8ppq%_kBU)wxktz67|SDhw|n{gGxix*3+Vn9;Lx`n-~miDBfXKSq;lUb-%ivAci5 zJZQg4-LSmGA9DSTmSN`ZPV@||pa0a56~9#7U#fW4W7fS#d!xXnV;cn7%~QlC=o2Kf zgi^JVj>*)?INhKGCj}nAX$B1@O~v(;WIRQo5>dNOd`G1yWFl%jSHhHNg7HO)@FiM2 zW=TY>bV;fdl~Jepll=@rK%m6+7{#DWQ|W{T5!J*i1h#RQL8X`=`cx4$0VGneT8mRS zbPk;fhZ+=_2-TlV@zcuW!sw9cgB0LRL|vrUYlI9&R#p~0i%nN+Qy451MHx(lfgmtI zz`AUe9y7oyou`pvfFlIgNwo@%UZGY|jGS1qIzum_Qo%gsO?*m?L^4FL(haHr^k5h; z4TD8zGL%Zja1Wh6G!u{v2K1*My4Y+D&WOf!>I|(E56#3?de7k$GU<@NCPSNM+Kx=h zz|(Lgfa<`itap|)Ub!I;qXa1mrN-n1#C`{hWooHHCN!BGE=w-pviLBQ&*H)yoX3QdnJhLez;QO7oGi!L z9BdesSf$frDk*NH0_1cB;NjtXj3q;oVT^~!0Rg2n1}oK*nSvD1R75q*ej4 z5=$E%m61vYs1P1kD&V0Um@gH8XgDYWqXM1)W^!?^07p4|4hJz&$)v*RYON9j$Ei?a zDL6x;N-<3s1s4WJiA7X|&U`x(m4@l%z(GWvrBG!U-cH0Slz5CDGpfnrp#naijj-4( zl!NdGVm9&3!L>S&iAGLS@ie&`k3|SJ1BAtlc?t+j<6tksU@ea6)!JCKI!#11Qkcr_ z(6j_xCmE*4LNGlJNQVk>?3+UD!(+$T19))c;R+pCKif1k zaHC@I^ntg5*EEIcDp4q=OCiLh16$BxnYhdpC*T^Gk}kqjDLAMegX#KaT=6HVz)t3~ zF+M7X5jGovIea+|C-YDy%*9!Jwg8bz@nq?{>^ikvpM`1hz!ab(&7b^( zi_Thv8&3fU2D6wj!i;4Jgj__(;rcLHM!^_={T5LvNJ2Ruh1oKY=o}2;zyg#fh50xx zLpdmm&F2rK=#YT_%NE(Jf6s}*E&4HxW%13S`Z50F*arZ^>L`$AU<}k}Q0^H+^?pz@ z5bt0445r&(xdessVUhRJ_k&y?FN)*S_do4@Rst;d6BmG{VW)2vBj!7%*t57fV7dJILc5 z#&TConj(Q9(m`=ZV65S0=MJ&fjqe=LYT4wpv&iGdA>U=&??zMy^U&zb>b0Zkw?fw! zdmp)B+m_NDI3?_US(`E;$u{rBQ_9z|v@J9CMDL5G^@ow#ZXH#VpFFtg74el5)QFz! zaksP7Hm331lJmbG)BC*JGcq#Ly&z1bRGM#+nW&8`0Ctde5ki2FLB_*zvUYN54zuK!zwHw&UF=`!~H7fU_8Oz-hR!6{gn87+48wAAtZ;uIPnyRJhZWQ znFXce)#Bd$FaH+db+ZaDo*bL;3;Fr$u4$bYr~GjJvS9VOe0Q&f7S_zqCffTGzOs%c zIb1p6P#!d0V;|NuqV00l)Gw?yJiOga;2er4+%+$@(C6^>)zVu) z=pfXtwxAw6l)HjBDr$8lpK}~?2+F%3zYj|B-x)wkOuhDuprvt%PoNE_QVW;QAepz@ z)SfkOI_FHW*3+6ttg%d5+;DKQ|luSYRCHZ9l_ixHvKdE$c}ikN0}SxZ5D>>!H;W1wGHJwn@PD}oj-c( zT+4w5n@Gmq1HQg|&ob4iaT`50Iv(4w;rPX!J}D`WOX^AY3m^DO?!EX(b$Jna6B1fh zC29{ zj2!dWzT$!8Sf`~XEZoh2ZuhghzM*aD(iNwDT%J{&`t~=6(Snx1#yNpiQ};WPUfs4U zPo2N!LbU#N+SSc|&#NY$-&=&{{u=AzK}7O$?tS@b&gN+3lSvKDw5fr2TDST<{Mm}@ zQvSu{&kgf7UyQE5L6qdosoj=V0Hb>poy&Y3?WRj?d)%XC^A9{5Ul1zxc(i1)$F+xqvKGe#yFHuM z*8OffF-4RsbMju=w7I%ROPe3#dw^)uhWwp<0U{NC6LRb$^N?);d!vt(psR!<)*q;H zy;f*jM{rv@n&;Bvqh z<6vz05UgL04bF;q+e@S}IhjF2U>cJJ>|q9zkHCB;LPj`z28SPj0RQ;%cM(~bCZRsQ zAik9vkw`8TiO2?{Uad*NaJbCUWnT)yPX&`|7tE`S@gt@?IiHh{siyh0#qXBq5-VmU zU#Y%*X>^5DRNU6)d)S@yI{sV!VQ%Mx7C%DHB=TNbR6Z@Ht*=;EFmCkPSKW`A+aFDA z*|%}?XX!QgnTHC^3@??*U-)>8mqW!^<+!gm?QFc@H(%SCJB0G*olh7$ruOO-?=Uz@tQNqT=zqBWquQo8f!+Zo1l9zkFc3KtU zKi;p~Ej4aNz}e?XiLHfU0x=VNd$J@DE+@f$>>EHc^IM`*Z2s{7Xi6ZTh zR2#dp75;nf?EBY>&C!<@K~R?6lN8&rO^~eFmX?wIhMLHjEFm^N8B09*YW%X;QTL7v z6YkdO&o3(t!i|66mu5>M*?5PZo!^t0F?)%=uT1moxovl)@mi5X$3`4()I3dGyg6Pr zov+kuX{buCz-XCTgXP3swvtWgOlvjb$X%pk&&HQ`xC zEH*1DPMNhx$x~524I&0+@&SPsGo$28ZHmss&lFIsynHaWOw%c3E5y7=K#2#5B+?r( zGK(=#$MXcqsUU?zQ+|ikv7!Zn}T!_t5p*)O@aA7uk2t~9} z1F{lL85)&^N(HDG>;NT~&0|3vB^N})0#rOMn+w4KSO6E}u{bOi!%C%6^278-EeeiP zqeYW2xeXOzMa?nPAV`J945-) zsUZfF$$(fKH3lizJQxbV5Dt^eP%1Hn@_lxbUTw}mjaWz$&=F__($o4citKAWsHyLx zGm2Jca^fyGpHsSPX;*DR@i-;<6R6 ziU%`Q9OfUmMJDp!IWe%sK)R(YzCF}H`u`kzKVV251=94-f%*)}J$da-KFak$3VaawV|M*vauMIXF=9IKLoWlo51!e! z;S_k69Il9zh;co*R$S|vmoEyyjJ+XzjtPew>1t_sTuJFTFge03m4%MzAWm|gz+9Vn zjEBPwbCZfg;xe!QviX*dbjC4k^qeaKriZliN|Ecyjs9o091U&uE84HG;z*AcyON_8 zUcD54@J(RJeOmGN_cpAPBroi|nTE=7C)(=#jO8&qy z{ggx33UAz)*L-XVHP)5f*H_okux)cg$Fz<0P1zAsr@4=enEGwgqPVZ4w*?)js*;Es z(9~$4()U;{5_C^%LmT|Ia-vUj^aHf*I<-puMKk>dY-F@@M z6URJtYeDpj8&&#q9i~~k$7pXHyrt8W#e<)8sSRTh5z@9X@hIB%W`( zxT2H)^0-9o+)dUtrGmTlXHH#~3pYPq!UX_oB9cPZ=%6vcI$(%V5Su;7DLMnxv-69PyZrHBI|2Qe?nZ0AlrUNexs|sYZ zvni(o86oIh`(ZJkB`ZHKzDKxwto72uQI2ceMtPlsW{5XMwtW#`CPXOie{y(CLZN$7 zK~xNG7@QU?XL#i2=Zvr+{OGVUd~)pE!eA*E?^gPaP~V~oouer?px@_Ro~5)uQ+lU>eUjE)p;C7XJ>oe89lUe)Mm`=XXdZJMP$ zyj9dsR{Q$Cezl-#T=kq6owx7eiTfYg5flk>=LDC{d14>JbjA95=k?`eLYa#n!iwNV zm9q$V=Uo3Y%stURjFr0xKmT>w#L(bn1RvOeT3NV;Ojw!ZalK;sx?oaq=T%;Cg(xn> zZer+!D_hi@-u72KJ=@VKA#tgMkXv){8qGbdIB#DEC)oDM>+bC$`S#hZcdI1xg@H>? zh-miktg%0%H}5}=j?5a<`%26t@4S2`IH2fQsl)azVliyWJ=fTT{SZfB)a+k_`sS5f z>Npu1CMCfMxziZv$ljI=(t5EdEIW7IP4bJYceZPdW6s~JgpU+ zhC}$=TeVXf!(TstoqjMN7|$Y69k=aTJyoX45&O8RD0YWDi*o*|a`)YT1u84O?L-is zKHVxwCugb4d_3OxX4e~*j9d{Jy}D(b5QVd%U4=1{uNG!s#=}*)B{8R+R%OBQl}**7 zLYH1=R##D9J=~CYdgYcLNsgVJWc!jG#AV#3v5SIJ%XmSr@Eggy_rH7$yI-j3zF$1Q z^l{CDc5h)(qoKElw$;72PRuNij)--kML6xdmOc4q+ELfig^}fAhn^t+VN_pk)T(;9 zFw}NCl}VM)KZnd2IXSD*({a*9m*G1mIEUn`-FzI=Zp|}LFBXTle{s>_ldOvF;2CFo zUEs9&j|!x7TVB4lzeYm}PaR5R<<1|uyQizYVQzET!}bSG)#vN#4g~#!boA%YTjce- z3#fSyW^jXUNrdv5Z+coiW4GvrZ@S)TugMOtsF-qkX40mv(Oq_4@Y$f_x%O= z`%;RX(40B4HFp!b5MCF#db90>R1bg$T)!tzeDg*Liyj;Fxf~YsbUQ|0( p#0=iN%f?!-2FjMT`*lg%atZn1-h$zgPe94UNkgN=dxZ;g{sT`081(=E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/rainbow.png new file mode 100644 index 0000000000000000000000000000000000000000..33b0efba6d3aed055008b25ac6a2fdea30c836e8 GIT binary patch literal 5790 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 A6951J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/apple_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/apple_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..8e30e71a8a834eb4c1b2065704f473b2d2b6e8fa GIT binary patch literal 7018 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 GV*Uf9(ZE6g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/orange_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/orange_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff37969c6be86463cf670ab8b55225792be2460 GIT binary patch literal 6885 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 Q6<^KCHk(LAR=!dH0aJ~w_5c6? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/pink_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/pink_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb49484c11f1e0cff58b4724b16028da476bbb7 GIT binary patch literal 6892 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/red_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/red_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..000f493a757df53e00b96b5ecbee262dcad6cd76 GIT binary patch literal 6879 zcmeHMc{tSD|DUlFkx;2LO;?s0vod2cgt121lC7BKGfd2kW`-GsTuYX;NFquoT5ieG zDpFahE0ly(#3f5yOV%s-er8&3J-_es{GR*#e)qq|oH^&b&+EL-`@GKkoab|V5}mf% zC@E+vKp+q$J6o~~n5&4AoDBH8=EDL7%t`~|f=LxDi!h?336&P-QDAxHmvRDF*8PGJ^+7`=AWC3<6igVftOn-UU=n@g#D91R zh}ilyx3P0{f?*8MC<81G?1RE!iD(oNi-w_%i6}!N+7M!uTiXbMC=i*JmQGFq96pB^ zzzK%gSz5w^xf}*F2!KF@r%s;`xVg1z#5Yz5_U6{3)buPzDwJRq_=`c^criRFF3Rt|)=^kawV#@^a~QV7o!{GAk)GbU#y=wPOvN*69kr&r*ZxRyQUPrasyGUfd;;++!C)mUNL5j`rdsR?hm@r= zaJeYFpn3xYf2cgBpFg@_mzj2dSwfRkVq0|mV|wB(r|OF@qZNxItgD-6)X-JB=nq!1 zYQ^OlOP9SIEp3EvI(YJQE$yI3_&dc=P46cpct@soPr~xCWqX`8(o+%L-tZO&^@2TC zAKh1F)lwJ|QSiiJiNzc2ste%j$Eqw|lgrg0tMtY;99~G0KDFxC85j1zire9A>anQ8 zx~8*PFWWKw9jAue4sZ5TtET6pW`oMS_j<{srZ2kJecEh`wU2k%g-0!n8!au??`j#o z>VuW+PmYQE?$}<9Hk($=n~W%)PxIYNf+Tx7vqHm*YeuAVXjsVjbY&Y(Spudv=skCD z$8>IDpSB(BQ4tpXxS_%59oM6_JNi@Z!oVng;>C1w&A=yJb)+WFfSqa+3`JLiFu(P+I*n+(>8tMpInzNP}9qAAc#ActQRzEu!?!s6vaFr=$S2 z%;?DYjw(5a=!->|%Su`I6x*byVyfPz1;fiV8)6o94F{|HD6ffm)wO6eWX8xu!Ytl@ zNtDVG&AbE4*D6*k$&>R^q+*X;woFQ~Kc~esFFU%cXFVp`Vcm$+ay4lyn-#f3&K(ze zbv1Sy?p}RKZTlf&^lqEU9Cn_yGxox^0F0MBE9!>jT+X^@iTy$RC1t8_64;i$7M<2d z&UX5tmTOwe(qhJH$&_R0KvaIle1`jzuqQBvBKBYnRlP{YLpBI@B2nG%V9~zfhedrw zmTh~6yjLwbpM-rF)}6P<#0OfaDo_(>;A6Ay)&G${>LuJ14$D5&Sd-qha&+em^dliM z8|L_QEkWgh+~e3ovHBK^x>UQ?cB!Y>y6Lp5#w7Z5%TU$F2xAI+j?Wza#j;7~b_&(j zqA9eA(iGN2YTAG~dD$^^y-lig&v4KBajS9KxVL;#Y;o)nDQ{{8`4IU|_0j4@cID?z zoIBW~|JdZQ{o~YQlE9(dg8#!z0rtALUrno(R(9*Hsgj40&DOZ0wKt}*o0FNF> zZ+vw4sY<3%ef$ag4QEg1yveOdcRj&N`Qs5QH85r6v8+^I_{he_6yym`S|ws(*RO?d zbC2c~x#n7SrNHf-ebF9h@3E+E?V17YX6>mh9$S*qPkC^C<=vZhC^&na<=bA|#&q|z zdb!2eGVJQORWDOLGpW?R#6IqK&osU5Nte#*@3?L;d1??_w((6|w*A$->8Jk9$D7Mv z#O@B+J-_?IAaStn#iC~K7i*X*xaFGin(CTwG_jeNGNGBXne~~|*GIh+ul#a_6%VRPe?d_oSzw@HFzxKG=InYmiHY^RsHA*mx-zOZ=S|aUYSUp2%L~r z^pgyfEW95XV{UmZ_sZJFqK@FU1bPqkIM5t~+wFjz!W*FeL`72an5wLj=jU2`QZJ@4 zFEL{VB(W>7zNHeS2Bn?#ll7kO4By?{_(&sL<2{0i*yW|^!QH6r(Q!S`L)wE?Jb2@; z02ZzOCc8MhZqmlYNi zhPN8E8sj(Jyw2`>vqXTLrcOsHuQ<}H^+M|i=>=&iDU0M^e!09wczW7;-(1+pgw~Yv z6lE4S`(&nlrf_n2Y~5_!U)$$MW3AJDa{}pm(7Vt(5?Th&y=uK%mdHs&NC>1&6`JI| zR!`7S>j}EI*3U2#JZ&RwIl9_7qltk2EL3YzNs(+_Ncy65LHw2j4`cChjaIj8j@u-Y zGs%UA%C+*B*Bly5uCTYii-K>{QbX%2DUz=#qB! z-2($k_X`*1*e1AG5pn1FKRF#U9dIxnCcJ&_xO>^r)^o za=Bdx9u(K_%E~(UOVW&0mG{uiX0{cpmp$CcC}xe^*j6*t9jINPou<9U-ZQ`TE_$wD zFe`3Y{?%OF<+{Z~_lDjM-zt61>`UPejF*oW?}XlI-_WmKqkdKJ@XxzmOi#}{@kKVb z{LlSfd5L%RUB~KuW^Ov$I}7(*VZJ$kjq~d6?fId3OW9M(*P8WPPc+{(dqfi6Z1}CP zV%MF!<0|i*T5``TbtzSJV(zkby9I4zeiUX1ggv&8QnJ@)6%?Gcx2enQVo*Lb7iZA$ zcXxT{tz)7n23@p@XYb>?)x>0`pn@t79nxprMv&9Kux_MC%_%R^g# zx4yS}ovv?oPVHowX)Xw7uC)(jVoUsgZ%}Q}$lggv7qF+oYi9=*B`&Kiqup8KlUy$R zP3PA6g=3xh8`4Qg-=UBJlAxyR_krI+cWm29^Lc-Z9Z^xyc2dkN;r&3C&70ZI-(qd zEr9^0?Orb6x_7G^ZEqmWm<~5HRWK0}K>`-Qr@(})AU2OEB*DeJM6fI}BjGSHgda$P zdw|cnmK-hs!x`WVPzWm_GZX_iRe+gr=?tO^+4>6wSR=s$`21iZ5-AV}3qHcvImiHy#$^WcnH)Au#7UuYLii*&9BhYu^^X?YB<5So)Ktu(S8!$m0Lo~|R$QS?+0DuD!I5Zlh zz)?_Ol}@Ju1Uia=HvEoa8F00RRq;YR6>Jx zDiucn#}ZS~X+&!dmqh`WlgXm^1IS>uzqmmpIMLk6js(XTe1?iGPC*nt1MEP8J22TH z!oQ(zOcvnEr-;-<8yOSucw;o$&=6yUH8lPkKD#fX zbL7yOjIjR=E!sRV6A%wBxh<0ijvppAecn;7z@E>w&($ENcq_qR;!Q!M&^}LrM+pV! zVn0Ey&rP%d3fmt5PmeF*`qj?-FQI_L(~Qv!Diwjp(Tx!}8Uu$grZDgbBMgN=qX0PY zYxE;KkHg>#C|tnYAJh@l3Jg!NRxn-hLh1d876bsIRR9G;piu}c+6_%0;zZvsf+7F? zDH;N3Dw<(TK^Wq3V4TwEcm$O|0}u>DItE2ELSp~`|D)6Y*C~Ga|G|$_G(n1v#jlHM zg8U!L{u%JyISNYi*#@4^;Bk-qcHV!{OmwpTi=Qvy_AibAQvV#}AL;v3uAg%KBL)5u z_-AzelWajL>3!81yY};L zqcRd2cz#(&3VMJ+ppHv5;B%sruOyg4#vK>FnL%!Q`bA(wNJBkqvforOKZ8q zc|U~9i5$Zlx*7Qw2RFK`Y&ubA9lO5K+5GJjK~~$=o7-4_bUs^FEfFfUJ|#%>3JGFo LwUu0G;TQcMMX|K$ literal 0 HcmV?d00001 From 3e39556af48d1847eca81aaba5a591180ca65bb1 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 14:44:48 +0000 Subject: [PATCH 06/90] Remove redundant trait --- .../traits/items/overworld/refined_rocks_and_rock_derived.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/data/minecraft/traits/items/overworld/refined_rocks_and_rock_derived.json b/src/main/resources/data/minecraft/traits/items/overworld/refined_rocks_and_rock_derived.json index 38704cac..7a3c23ed 100644 --- a/src/main/resources/data/minecraft/traits/items/overworld/refined_rocks_and_rock_derived.json +++ b/src/main/resources/data/minecraft/traits/items/overworld/refined_rocks_and_rock_derived.json @@ -6,7 +6,7 @@ "minecraft:quartz": "earth:-1.3 strength:-1 darkness:1", "minecraft:amethyst_shard": "earth:-0.1 order:9", - "minecraft:lapis_lazuli": "order:2 power:4 order:5", + "minecraft:lapis_lazuli": "power:4 order:5", "minecraft:raw_iron": "focus:2 earth:-0.7 strength:4", "minecraft:raw_copper": "focus:1.5 earth:-0.7 strength:4", From 0f4360a896851195cf106372e55ca4b97259670a Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 15:47:31 +0000 Subject: [PATCH 07/90] Fix loot table and tag loading errors --- src/main/java/com/minelittlepony/unicopia/block/UBlocks.java | 2 +- .../resources/assets/unicopia/models/block/cloth_bed.json | 2 +- .../blocks/{white_cloud_bed.json => cloth_bed.json} | 4 ++-- .../blocks/{orange_cloud_bed.json => cloud_bed.json} | 4 ++-- src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json | 2 +- .../resources/data/unicopia/tags/blocks/cloud_stairs.json | 2 +- src/main/resources/data/unicopia/tags/items/cloud_slabs.json | 2 +- src/main/resources/data/unicopia/tags/items/cloud_stairs.json | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) rename src/main/resources/data/unicopia/loot_tables/blocks/{white_cloud_bed.json => cloth_bed.json} (83%) rename src/main/resources/data/unicopia/loot_tables/blocks/{orange_cloud_bed.json => cloud_bed.json} (82%) diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 7034bfe6..e86c6bfd 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -174,7 +174,7 @@ public interface UBlocks { Block CARVED_CLOUD = register("carved_cloud", new OrientedCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool(), false), ItemGroups.BUILDING_BLOCKS); Block UNSTABLE_CLOUD = register("unstable_cloud", new UnstableCloudBlock(Settings.copy(CLOUD)), ItemGroups.NATURAL); Block CLOUD_PILLAR = register("cloud_pillar", new CloudPillarBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL)), ItemGroups.NATURAL); - Block CLOTH_BED = register("cloth_bed", new FancyBedBlock("cloth", Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); + Block CLOTH_BED = register("cloth_bed", new FancyBedBlock("cloth", Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOD))); Block CLOUD_BED = register("cloud_bed", new CloudBedBlock("cloud", CLOUD.getDefaultState(), Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); private static T register(String name, T item) { diff --git a/src/main/resources/assets/unicopia/models/block/cloth_bed.json b/src/main/resources/assets/unicopia/models/block/cloth_bed.json index d389fff5..91a36d8c 100644 --- a/src/main/resources/assets/unicopia/models/block/cloth_bed.json +++ b/src/main/resources/assets/unicopia/models/block/cloth_bed.json @@ -1,5 +1,5 @@ { "textures": { - "particle": "minecraft:block/white_wool" + "particle": "minecraft:block/spruce_planks" } } \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/white_cloud_bed.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloth_bed.json similarity index 83% rename from src/main/resources/data/unicopia/loot_tables/blocks/white_cloud_bed.json rename to src/main/resources/data/unicopia/loot_tables/blocks/cloth_bed.json index 4076dcad..a962ce67 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/white_cloud_bed.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloth_bed.json @@ -13,14 +13,14 @@ "type": "minecraft:item", "conditions": [ { - "block": "unicopia:white_cloud_bed", + "block": "unicopia:cloth_bed", "condition": "minecraft:block_state_property", "properties": { "part": "head" } } ], - "name": "unicopia:white_cloud_bed" + "name": "unicopia:cloth_bed" } ], "rolls": 1.0 diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/orange_cloud_bed.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_bed.json similarity index 82% rename from src/main/resources/data/unicopia/loot_tables/blocks/orange_cloud_bed.json rename to src/main/resources/data/unicopia/loot_tables/blocks/cloud_bed.json index b2b54b29..29561aae 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/orange_cloud_bed.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_bed.json @@ -13,14 +13,14 @@ "type": "minecraft:item", "conditions": [ { - "block": "unicopia:orange_cloud_bed", + "block": "unicopia:cloud_bed", "condition": "minecraft:block_state_property", "properties": { "part": "head" } } ], - "name": "unicopia:orange_cloud_bed" + "name": "unicopia:cloud_bed" } ], "rolls": 1.0 diff --git a/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json b/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json index 9f8be83c..3ee3944e 100644 --- a/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json +++ b/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json @@ -4,6 +4,6 @@ "unicopia:cloud_slab", "unicopia:soggy_cloud_slab", "unicopia:dense_cloud_slab", - "unicopia:cloud_planks_slab" + "unicopia:cloud_plank_slab" ] } diff --git a/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json b/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json index bd0de50d..afade8ad 100644 --- a/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json +++ b/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json @@ -4,6 +4,6 @@ "unicopia:cloud_stairs", "unicopia:soggy_cloud_stairs", "unicopia:dense_cloud_stairs", - "unicopia:cloud_planks_stairs" + "unicopia:cloud_plank_stairs" ] } diff --git a/src/main/resources/data/unicopia/tags/items/cloud_slabs.json b/src/main/resources/data/unicopia/tags/items/cloud_slabs.json index f928fc55..59d4913d 100644 --- a/src/main/resources/data/unicopia/tags/items/cloud_slabs.json +++ b/src/main/resources/data/unicopia/tags/items/cloud_slabs.json @@ -3,6 +3,6 @@ "values": [ "unicopia:cloud_slab", "unicopia:dense_cloud_slab", - "unicopia:cloud_planks_slab" + "unicopia:cloud_plank_slab" ] } diff --git a/src/main/resources/data/unicopia/tags/items/cloud_stairs.json b/src/main/resources/data/unicopia/tags/items/cloud_stairs.json index 59c6c75c..c53b4404 100644 --- a/src/main/resources/data/unicopia/tags/items/cloud_stairs.json +++ b/src/main/resources/data/unicopia/tags/items/cloud_stairs.json @@ -3,6 +3,6 @@ "values": [ "unicopia:cloud_stairs", "unicopia:dense_cloud_stairs", - "unicopia:cloud_planks_stairs" + "unicopia:cloud_plank_stairs" ] } From 177eb541a792a77e820de430f9e25b8e30236ec6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 15:47:45 +0000 Subject: [PATCH 08/90] Add tag support to the item traits loader --- .../com/minelittlepony/unicopia/Debug.java | 12 ++++ .../magic/spell/trait/SpellTraits.java | 7 +- .../magic/spell/trait/TraitLoader.java | 68 ++++++++++++++----- 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/Debug.java b/src/main/java/com/minelittlepony/unicopia/Debug.java index ff142889..2e5a9982 100644 --- a/src/main/java/com/minelittlepony/unicopia/Debug.java +++ b/src/main/java/com/minelittlepony/unicopia/Debug.java @@ -1,9 +1,11 @@ package com.minelittlepony.unicopia; +import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.entity.mob.AirBalloonEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; import net.minecraft.entity.vehicle.BoatEntity; +import net.minecraft.registry.Registries; import net.minecraft.world.World; public interface Debug { @@ -18,6 +20,16 @@ public interface Debug { } TESTS_COMPLETE[0] = true; + try { + Registries.ITEM.getEntrySet().forEach(entry -> { + if (SpellTraits.of(entry.getValue()).isEmpty()) { + // Unicopia.LOGGER.warn("No traits registered for item {}", entry.getKey()); + } + }); + } catch (Throwable t) { + throw new IllegalStateException("Tests failed", t); + } + try { for (var type : BoatEntity.Type.values()) { var balloon = UEntities.AIR_BALLOON.create(world); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java index 2e38df13..ac082e3c 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java @@ -43,7 +43,7 @@ public final class SpellTraits implements Iterable> { static final Map> ITEMS = new HashMap<>(); public static void load(Map newRegistry) { - REGISTRY = new HashMap<>(newRegistry); + REGISTRY = newRegistry; ITEMS.clear(); REGISTRY.forEach((itemId, traits) -> { Registries.ITEM.getOrEmpty(itemId).ifPresent(item -> { @@ -220,10 +220,7 @@ public final class SpellTraits implements Iterable> { } public static Stream getItems(Trait trait) { - return REGISTRY.entrySet().stream() - .filter(e -> e.getValue().get(trait) > 0) - .map(Map.Entry::getKey) - .flatMap(id -> Registries.ITEM.getOrEmpty(id).stream()); + return ITEMS.getOrDefault(trait, List.of()).stream(); } public static Optional getEmbeddedTraits(ItemStack stack) { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitLoader.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitLoader.java index 44e8560b..28dc19df 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitLoader.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitLoader.java @@ -5,7 +5,9 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -26,7 +28,11 @@ import net.minecraft.resource.SinglePreparationResourceReloader; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; import net.minecraft.util.profiler.Profiler; +import net.minecraft.item.Item; +import net.minecraft.item.ItemConvertible; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.tag.TagKey; public class TraitLoader extends SinglePreparationResourceReloader> implements IdentifiableResourceReloadListener { private static final Identifier ID = Unicopia.id("data/traits"); @@ -77,9 +83,24 @@ public class TraitLoader extends SinglePreparationResourceReloader prepared, ResourceManager manager, Profiler profiler) { profiler.startTick(); - SpellTraits.load(prepared.values().stream() + + Set> newRegistry = prepared.values().stream() .flatMap(TraitStream::entries) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, SpellTraits::union))); + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, SpellTraits::union)) + .entrySet(); + + SpellTraits.load(Registries.ITEM.getEntrySet().stream() + .map(entry -> Map.entry( + entry.getKey().getValue(), + newRegistry.stream() + .filter(p -> p.getKey().test(entry.getValue())) + .map(Map.Entry::getValue) + .reduce(SpellTraits::union) + .orElse(SpellTraits.EMPTY) + )) + .filter(entry -> !entry.getValue().isEmpty()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); + profiler.endTick(); } @@ -88,14 +109,14 @@ public class TraitLoader extends SinglePreparationResourceReloader> entries(); + Stream> entries(); static TraitStream of(Identifier id, String pack, JsonObject json) { if (json.has("items") && json.get("items").isJsonObject()) { return new TraitMap(JsonHelper.getBoolean(json, "replace", false), Resources.GSON.getAdapter(TYPE).fromJsonTree(json.get("items")).entrySet().stream().collect(Collectors.toMap( - a -> Identifier.tryParse(a.getKey()), + a -> Key.of(a.getKey()), a -> SpellTraits.fromString(a.getValue()).orElse(SpellTraits.EMPTY) )) ); @@ -106,23 +127,16 @@ public class TraitLoader extends SinglePreparationResourceReloader { - if (item == null || !Registries.ITEM.containsId(item)) { - Unicopia.LOGGER.warn("Skipping unknown item {} in {}:{}", item, pack, id); - return false; - } - return true; - }) + .map(Key::of) .collect(Collectors.toSet()) ); } record TraitMap ( boolean replace, - Map items) implements TraitStream { + Map items) implements TraitStream { @Override - public Stream> entries() { + public Stream> entries() { return items.entrySet().stream(); } } @@ -130,12 +144,32 @@ public class TraitLoader extends SinglePreparationResourceReloader items) implements TraitStream { + Set items) implements TraitStream { @Override - public Stream> entries() { + public Stream> entries() { return items().stream().map(item -> Map.entry(item, traits())); } } - } + interface Key extends Predicate { + static Key of(String s) { + return s.startsWith("#") ? new Tag(TagKey.of(RegistryKeys.ITEM, Identifier.tryParse(s.substring(1)))) : new Id(Identifier.tryParse(s)); + } + record Tag(TagKey tag) implements Key { + + @SuppressWarnings("deprecation") + @Override + public boolean test(ItemConvertible item) { + return item.asItem().getRegistryEntry().isIn(tag); + } + } + + record Id(Identifier id) implements Key { + @Override + public boolean test(ItemConvertible item) { + return Objects.equals(id, Registries.ITEM.getId(item.asItem())); + } + } + } + } } From 9e93fb130d6617e1628b0c918e999bff49c7da48 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 16:18:32 +0000 Subject: [PATCH 09/90] Add some missing loot tables and tag entries for the clouds --- .../minecraft/tags/blocks/mineable/axe.json | 5 +++-- .../tags/blocks/mineable/pickaxe.json | 7 ++++++- .../data/minecraft/tags/items/beds.json | 7 +++++++ .../loot_tables/blocks/carved_cloud.json | 20 +++++++++++++++++++ .../blocks/compacted_cloud_bricks.json | 20 +++++++++++++++++++ .../blocks/compacted_cloud_planks.json | 20 +++++++++++++++++++ .../unicopia/tags/blocks/cloud_slabs.json | 3 ++- .../unicopia/tags/blocks/cloud_stairs.json | 3 ++- .../data/unicopia/tags/blocks/clouds.json | 2 ++ .../data/unicopia/tags/items/clouds.json | 1 + .../unicopia/tags/items/floats_on_clouds.json | 1 - .../unicopia/tags/items/groups/pegasus.json | 4 ++-- 12 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/data/minecraft/tags/items/beds.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/carved_cloud.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_bricks.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_planks.json diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json index 92d7bbc8..b8bbd23c 100644 --- a/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -2,7 +2,8 @@ "replace": false, "values": [ "unicopia:cloud_planks", - "unicopia:cloud_planks_slab", - "unicopia:cloud_planks_stairs" + "unicopia:cloud_plank_slab", + "unicopia:cloud_plank_stairs", + "unicopia:compacted_cloud_planks" ] } diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 4716ddcc..46d67b80 100644 --- a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -8,6 +8,11 @@ "unicopia:chiselled_chitin", "unicopia:chiselled_chitin_slab", "unicopia:chiselled_chitin_stairs", - "unicopia:chiselled_chitin_hull" + "unicopia:chiselled_chitin_hull", + "unicopia:cloud_bricks", + "unicopia:cloud_brick_slab", + "unicopia:cloud_brick_stairs", + "unicopia:compacted_cloud_bricks", + "unicopia:carved_cloud" ] } diff --git a/src/main/resources/data/minecraft/tags/items/beds.json b/src/main/resources/data/minecraft/tags/items/beds.json new file mode 100644 index 00000000..0ec4b6cd --- /dev/null +++ b/src/main/resources/data/minecraft/tags/items/beds.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#unicopia:cloud_beds", + "unicopia:cloth_bed" + ] +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/carved_cloud.json b/src/main/resources/data/unicopia/loot_tables/blocks/carved_cloud.json new file mode 100644 index 00000000..5457ca18 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/carved_cloud.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:carved_cloud" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_bricks.json b/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_bricks.json new file mode 100644 index 00000000..bd4602d9 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_bricks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:cloud_bricks" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_planks.json b/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_planks.json new file mode 100644 index 00000000..e0208139 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:cloud_planks" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json b/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json index 3ee3944e..580865fc 100644 --- a/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json +++ b/src/main/resources/data/unicopia/tags/blocks/cloud_slabs.json @@ -4,6 +4,7 @@ "unicopia:cloud_slab", "unicopia:soggy_cloud_slab", "unicopia:dense_cloud_slab", - "unicopia:cloud_plank_slab" + "unicopia:cloud_plank_slab", + "unicopia:cloud_brick_slab" ] } diff --git a/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json b/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json index afade8ad..a8dcd633 100644 --- a/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json +++ b/src/main/resources/data/unicopia/tags/blocks/cloud_stairs.json @@ -4,6 +4,7 @@ "unicopia:cloud_stairs", "unicopia:soggy_cloud_stairs", "unicopia:dense_cloud_stairs", - "unicopia:cloud_plank_stairs" + "unicopia:cloud_plank_stairs", + "unicopia:cloud_brick_stairs" ] } diff --git a/src/main/resources/data/unicopia/tags/blocks/clouds.json b/src/main/resources/data/unicopia/tags/blocks/clouds.json index 3539ce34..8aa7f251 100644 --- a/src/main/resources/data/unicopia/tags/blocks/clouds.json +++ b/src/main/resources/data/unicopia/tags/blocks/clouds.json @@ -3,7 +3,9 @@ "values": [ "unicopia:cloud", "unicopia:cloud_planks", + "unicopia:cloud_bricks", "unicopia:dense_cloud", + "unicopia:carved_cloud", "unicopia:compacted_cloud", "unicopia:compacted_cloud_planks", "unicopia:unstable_cloud", diff --git a/src/main/resources/data/unicopia/tags/items/clouds.json b/src/main/resources/data/unicopia/tags/items/clouds.json index f3922795..71b5f333 100644 --- a/src/main/resources/data/unicopia/tags/items/clouds.json +++ b/src/main/resources/data/unicopia/tags/items/clouds.json @@ -3,6 +3,7 @@ "values": [ "unicopia:cloud", "unicopia:cloud_planks", + "unicopia:cloud_bricks", "unicopia:dense_cloud", "unicopia:unstable_cloud" ] diff --git a/src/main/resources/data/unicopia/tags/items/floats_on_clouds.json b/src/main/resources/data/unicopia/tags/items/floats_on_clouds.json index 76585449..189ac69b 100644 --- a/src/main/resources/data/unicopia/tags/items/floats_on_clouds.json +++ b/src/main/resources/data/unicopia/tags/items/floats_on_clouds.json @@ -5,7 +5,6 @@ "#unicopia:cloud_slabs", "#unicopia:cloud_stairs", "#unicopia:cloud_beds", - "unicopia:cloud_planks_slab", "unicopia:cloud_pillar" ] } diff --git a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json index 6353ea9d..ec1deffc 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json +++ b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json @@ -5,8 +5,8 @@ "unicopia:cloud_slab", "unicopia:cloud_stairs", "unicopia:cloud_planks", - "unicopia:cloud_planks_slab", - "unicopia:cloud_planks_stairs", + "unicopia:cloud_plank_slab", + "unicopia:cloud_plank_stairs", "unicopia:dense_cloud", "unicopia:dense_cloud_slab", "unicopia:dense_cloud_stairs", From 16a282078ea87ab251cee20beb8287e0f030bb0a Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 16:18:49 +0000 Subject: [PATCH 10/90] Correct cloud brick blocks' names --- src/main/resources/assets/unicopia/lang/en_us.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 3ad438b6..922f990f 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -251,8 +251,8 @@ "block.unicopia.cloud_plank_slab": "Cloud Plank Slab", "block.unicopia.cloud_plank_stairs": "Cloud Plank Stairs", "block.unicopia.cloud_bricks": "Cloud Bricks", - "block.unicopia.cloud_brick_slab": "Cloud Plank Slab", - "block.unicopia.cloud_brick_stairs": "Cloud Plank Stairs", + "block.unicopia.cloud_brick_slab": "Cloud Brick Slab", + "block.unicopia.cloud_brick_stairs": "Cloud Brick Stairs", "block.unicopia.carved_cloud": "Carved Cloud", "block.unicopia.compacted_cloud_bricks": "Cloud Bricks", "block.unicopia.compacted_cloud_planks": "Cloud Planks", From ccec0eec811806256af1c8bc6077362c67ab6e25 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 17:24:18 +0000 Subject: [PATCH 11/90] Fixed cloud blocks not converting into their soaked forms --- .../unicopia/block/UBlocks.java | 12 ++- .../block/cloud/CloudStairsBlock.java | 19 +--- .../block/cloud/PoreousCloudBlock.java | 22 ++-- .../block/cloud/PoreousCloudStairsBlock.java | 26 +++++ .../unicopia/block/cloud/Soakable.java | 100 +++++++++--------- .../unicopia/block/cloud/SoggyCloudBlock.java | 33 +++--- .../block/cloud/SoggyCloudSlabBlock.java | 32 +++--- .../block/cloud/SoggyCloudStairsBlock.java | 43 ++++++++ 8 files changed, 183 insertions(+), 104 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/block/cloud/PoreousCloudStairsBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudStairsBlock.java diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index e86c6bfd..6f867deb 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -11,10 +11,12 @@ import com.minelittlepony.unicopia.block.cloud.CloudStairsBlock; import com.minelittlepony.unicopia.block.cloud.CompactedCloudBlock; import com.minelittlepony.unicopia.block.cloud.NaturalCloudBlock; import com.minelittlepony.unicopia.block.cloud.OrientedCloudBlock; +import com.minelittlepony.unicopia.block.cloud.PoreousCloudStairsBlock; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; import com.minelittlepony.unicopia.block.cloud.CloudBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudSlabBlock; +import com.minelittlepony.unicopia.block.cloud.SoggyCloudStairsBlock; import com.minelittlepony.unicopia.block.cloud.UnstableCloudBlock; import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.cloud.CloudBlockItem; @@ -147,29 +149,29 @@ public interface UBlocks { () -> UBlocks.COMPACTED_CLOUD), ItemGroups.NATURAL); Block COMPACTED_CLOUD = register("compacted_cloud", new CompactedCloudBlock(Settings.copy(CLOUD))); Block CLOUD_SLAB = register("cloud_slab", new CloudSlabBlock(Settings.copy(CLOUD), true, () -> UBlocks.SOGGY_CLOUD_SLAB), ItemGroups.NATURAL); - Block CLOUD_STAIRS = register("cloud_stairs", new CloudStairsBlock(CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.SOGGY_CLOUD_STAIRS), ItemGroups.NATURAL); + PoreousCloudStairsBlock CLOUD_STAIRS = register("cloud_stairs", new PoreousCloudStairsBlock(CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.SOGGY_CLOUD_STAIRS), ItemGroups.NATURAL); Block CLOUD_PLANKS = register("cloud_planks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool(), false, null, () -> UBlocks.COMPACTED_CLOUD_PLANKS), ItemGroups.BUILDING_BLOCKS); Block COMPACTED_CLOUD_PLANKS = register("compacted_cloud_planks", new CompactedCloudBlock(Settings.copy(CLOUD_PLANKS))); Block CLOUD_PLANK_SLAB = register("cloud_plank_slab", new CloudSlabBlock(Settings.copy(CLOUD_PLANKS), false, null), ItemGroups.BUILDING_BLOCKS); - Block CLOUD_PLANK_STAIRS = register("cloud_plank_stairs", new CloudStairsBlock(CLOUD_PLANKS.getDefaultState(), Settings.copy(CLOUD_PLANKS), null), ItemGroups.BUILDING_BLOCKS); + Block CLOUD_PLANK_STAIRS = register("cloud_plank_stairs", new CloudStairsBlock(CLOUD_PLANKS.getDefaultState(), Settings.copy(CLOUD_PLANKS)), ItemGroups.BUILDING_BLOCKS); Block CLOUD_BRICKS = register("cloud_bricks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.6F).requiresTool(), false, null, () -> UBlocks.COMPACTED_CLOUD_BRICKS), ItemGroups.BUILDING_BLOCKS); Block COMPACTED_CLOUD_BRICKS = register("compacted_cloud_bricks", new CompactedCloudBlock(Settings.copy(CLOUD_BRICKS))); Block CLOUD_BRICK_SLAB = register("cloud_brick_slab", new CloudSlabBlock(Settings.copy(CLOUD_BRICKS), false, null), ItemGroups.BUILDING_BLOCKS); - Block CLOUD_BRICK_STAIRS = register("cloud_brick_stairs", new CloudStairsBlock(CLOUD_BRICKS.getDefaultState(), Settings.copy(CLOUD_PLANKS), null), ItemGroups.BUILDING_BLOCKS); + Block CLOUD_BRICK_STAIRS = register("cloud_brick_stairs", new CloudStairsBlock(CLOUD_BRICKS.getDefaultState(), Settings.copy(CLOUD_PLANKS)), ItemGroups.BUILDING_BLOCKS); SoggyCloudBlock SOGGY_CLOUD = register("soggy_cloud", new SoggyCloudBlock(Settings.copy(CLOUD).hardness(0.7F), () -> UBlocks.CLOUD)); SoggyCloudSlabBlock SOGGY_CLOUD_SLAB = register("soggy_cloud_slab", new SoggyCloudSlabBlock(Settings.copy(SOGGY_CLOUD), () -> UBlocks.CLOUD_SLAB)); - CloudStairsBlock SOGGY_CLOUD_STAIRS = register("soggy_cloud_stairs", new CloudStairsBlock(SOGGY_CLOUD.getDefaultState(), Settings.copy(CLOUD), null)); + SoggyCloudStairsBlock SOGGY_CLOUD_STAIRS = register("soggy_cloud_stairs", new SoggyCloudStairsBlock(SOGGY_CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.CLOUD_STAIRS)); Block DENSE_CLOUD = register("dense_cloud", new CloudBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL), false), ItemGroups.NATURAL); Block DENSE_CLOUD_SLAB = register("dense_cloud_slab", new CloudSlabBlock(Settings.copy(DENSE_CLOUD), false, null), ItemGroups.NATURAL); - Block DENSE_CLOUD_STAIRS = register("dense_cloud_stairs", new CloudStairsBlock(DENSE_CLOUD.getDefaultState(), Settings.copy(DENSE_CLOUD), null), ItemGroups.NATURAL); + Block DENSE_CLOUD_STAIRS = register("dense_cloud_stairs", new CloudStairsBlock(DENSE_CLOUD.getDefaultState(), Settings.copy(DENSE_CLOUD)), ItemGroups.NATURAL); Block CARVED_CLOUD = register("carved_cloud", new OrientedCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool(), false), ItemGroups.BUILDING_BLOCKS); Block UNSTABLE_CLOUD = register("unstable_cloud", new UnstableCloudBlock(Settings.copy(CLOUD)), ItemGroups.NATURAL); diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudStairsBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudStairsBlock.java index c599ba70..51027fe7 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudStairsBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudStairsBlock.java @@ -1,7 +1,5 @@ package com.minelittlepony.unicopia.block.cloud; -import java.util.function.Supplier; - import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.EquineContext; @@ -18,15 +16,13 @@ import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; -public class CloudStairsBlock extends StairsBlock implements Soakable { +public class CloudStairsBlock extends StairsBlock { private final CloudBlock baseBlock; - private final @Nullable Supplier soggyBlock; - public CloudStairsBlock(BlockState baseState, Settings settings, @Nullable Supplier soggyBlock) { + public CloudStairsBlock(BlockState baseState, Settings settings) { super(baseState, settings); this.baseBlock = (CloudBlock)baseState.getBlock(); - this.soggyBlock = soggyBlock; } @Override @@ -92,15 +88,4 @@ public class CloudStairsBlock extends StairsBlock implements Soakable { public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { return true; } - - @Nullable - @Override - public BlockState getSoggyState(int moisture) { - return soggyBlock == null ? (baseBlock instanceof Soakable s ? s.getSoggyState(moisture) : null) : soggyBlock.get().getSoggyState(moisture); - } - - @Override - public int getMoisture(BlockState state) { - return baseBlock instanceof Soakable s ? s.getMoisture(state) : 0; - } } diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/PoreousCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/PoreousCloudBlock.java index 591ea39e..5e17ca06 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/PoreousCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/PoreousCloudBlock.java @@ -20,20 +20,22 @@ public class PoreousCloudBlock extends CloudBlock implements Soakable { @Nullable @Override - public BlockState getSoggyState(int moisture) { - return soggyBlock == null ? null : soggyBlock.get().getSoggyState(moisture); - } - - @Override - public int getMoisture(BlockState state) { - return 0; + public BlockState getStateWithMoisture(BlockState state, int moisture) { + if (moisture <= 0) { + return Soakable.copyProperties(state, getDefaultState()); + } + return soggyBlock == null ? null : soggyBlock.get().getStateWithMoisture(state, moisture); } @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (soggyBlock != null && world.hasRain(pos) && world.isAir(pos.up())) { - world.setBlockState(pos, Soakable.copyProperties(state, soggyBlock.get().getSoggyState(random.nextBetween(1, 5)))); - return; + if (state.getBlock() instanceof Soakable soakable && world.hasRain(pos) && world.isAir(pos.up())) { + @Nullable + BlockState soggyState = soakable.getStateWithMoisture(state, random.nextBetween(1, 5)); + if (soggyState != null) { + world.setBlockState(pos, soggyState); + return; + } } super.randomTick(state, world, pos, random); diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/PoreousCloudStairsBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/PoreousCloudStairsBlock.java new file mode 100644 index 00000000..6733ee2d --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/PoreousCloudStairsBlock.java @@ -0,0 +1,26 @@ +package com.minelittlepony.unicopia.block.cloud; + +import java.util.function.Supplier; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.block.BlockState; + +public class PoreousCloudStairsBlock extends CloudStairsBlock implements Soakable { + + protected final Supplier soggyBlock; + + public PoreousCloudStairsBlock(BlockState baseState, Settings settings, Supplier soggyBlock) { + super(baseState, settings); + this.soggyBlock = soggyBlock; + } + + @Nullable + @Override + public BlockState getStateWithMoisture(BlockState state, int moisture) { + if (moisture <= 0) { + return Soakable.copyProperties(state, getDefaultState()); + } + return soggyBlock.get().getStateWithMoisture(state, moisture); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/Soakable.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/Soakable.java index 4623e92a..e800bbf8 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/Soakable.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/Soakable.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.USounds; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -31,9 +30,12 @@ public interface Soakable { IntProperty MOISTURE = IntProperty.of("moisture", 1, 7); Direction[] DIRECTIONS = Arrays.stream(Direction.values()).filter(d -> d != Direction.UP).toArray(Direction[]::new); - BlockState getSoggyState(int moisture); + @Nullable + BlockState getStateWithMoisture(BlockState state, int moisture); - int getMoisture(BlockState state); + default int getMoisture(BlockState state) { + return state.getOrEmpty(MOISTURE).orElse(0); + } static void addMoistureParticles(BlockState state, World world, BlockPos pos, Random random) { if (random.nextInt(5) == 0) { @@ -46,69 +48,71 @@ public interface Soakable { } } - static ActionResult tryCollectMoisture(Block dryBlock, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ItemStack stack = player.getStackInHand(hand); - if (stack.getItem() == Items.GLASS_BOTTLE) { - if (!player.isCreative()) { - stack.split(1); - } - if (stack.isEmpty()) { - player.setStackInHand(hand, Items.POTION.getDefaultStack()); - } else { - player.giveItemStack(Items.POTION.getDefaultStack()); - } - world.playSound(player, player.getX(), player.getY(), player.getZ(), USounds.Vanilla.ITEM_BOTTLE_FILL, SoundCategory.NEUTRAL, 1, 1); - world.emitGameEvent(player, GameEvent.FLUID_PICKUP, pos); - updateMoisture(dryBlock, state, world, pos, state.get(MOISTURE) - 1); + static ActionResult tryCollectMoisture(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (state.getBlock() instanceof Soakable soakable) { + ItemStack stack = player.getStackInHand(hand); + if (stack.getItem() == Items.GLASS_BOTTLE) { + if (!player.isCreative()) { + stack.split(1); + } + if (stack.isEmpty()) { + player.setStackInHand(hand, Items.POTION.getDefaultStack()); + } else { + player.giveItemStack(Items.POTION.getDefaultStack()); + } + world.playSound(player, player.getX(), player.getY(), player.getZ(), USounds.Vanilla.ITEM_BOTTLE_FILL, SoundCategory.NEUTRAL, 1, 1); + world.emitGameEvent(player, GameEvent.FLUID_PICKUP, pos); + updateMoisture(soakable, state, world, pos, soakable.getMoisture(state) - 1); - return ActionResult.SUCCESS; + return ActionResult.SUCCESS; + } } return ActionResult.PASS; } - static void tickMoisture(Block dryBlock, BlockState state, ServerWorld world, BlockPos pos, Random random) { - int moisture = state.get(MOISTURE); + static void tickMoisture(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (state.getBlock() instanceof Soakable soakable) { + int moisture = soakable.getMoisture(state); - if (world.hasRain(pos) && world.isAir(pos.up())) { - if (moisture < 7) { - world.setBlockState(pos, state.with(MOISTURE, moisture + 1)); - } - } else { - if (moisture > 1) { - BlockPos neighborPos = pos.offset(Util.getRandom(Soakable.DIRECTIONS, random)); - BlockState neighborState = world.getBlockState(neighborPos); + if (world.hasRain(pos) && world.isAir(pos.up())) { + if (moisture < 7) { + world.setBlockState(pos, soakable.getStateWithMoisture(state, moisture + 1)); + } + } else { + if (moisture > 1) { + BlockPos neighborPos = pos.offset(Util.getRandom(Soakable.DIRECTIONS, random)); + BlockState neighborState = world.getBlockState(neighborPos); - if (neighborState.getBlock() instanceof Soakable soakable && soakable.getMoisture(neighborState) < moisture) { - int half = Math.max(1, moisture / 2); - @Nullable - BlockState newNeighborState = soakable.getSoggyState(half); - if (newNeighborState != null) { - updateMoisture(dryBlock, state, world, pos, moisture - half); - world.setBlockState(neighborPos, soakable.getSoggyState(half)); - world.emitGameEvent(null, GameEvent.BLOCK_CHANGE, neighborPos); - return; + if (neighborState.getBlock() instanceof Soakable neighborSoakable && neighborSoakable.getMoisture(neighborState) < moisture) { + int half = Math.max(1, moisture / 2); + @Nullable + BlockState newNeighborState = neighborSoakable.getStateWithMoisture(neighborState, half); + if (newNeighborState != null) { + updateMoisture(soakable, state, world, pos, moisture - half); + world.setBlockState(neighborPos, soakable.getStateWithMoisture(state, half)); + world.emitGameEvent(null, GameEvent.BLOCK_CHANGE, neighborPos); + return; + } } } + updateMoisture(soakable, state, world, pos, moisture - 1); } - updateMoisture(dryBlock, state, world, pos, moisture - 1); } } - private static void updateMoisture(Block dryBlock, BlockState state, World world, BlockPos pos, int newMoisture) { - if (newMoisture <= 0) { - world.setBlockState(pos, copyProperties(state, dryBlock.getDefaultState())); - } else { - world.setBlockState(pos, state.with(MOISTURE, newMoisture)); - } + private static void updateMoisture(Soakable soakable, BlockState state, World world, BlockPos pos, int newMoisture) { + world.setBlockState(pos, soakable.getStateWithMoisture(state, newMoisture)); world.playSound(null, pos, SoundEvents.ENTITY_SALMON_FLOP, SoundCategory.BLOCKS, 1, (float)world.random.nextTriangular(0.5, 0.3F)); } - + @Nullable @SuppressWarnings({ "rawtypes", "unchecked" }) - static BlockState copyProperties(BlockState from, BlockState to) { - for (Property property : from.getProperties()) { - to = to.withIfExists(property, from.get(property)); + static BlockState copyProperties(BlockState from, @Nullable BlockState to) { + if (to != null) { + for (Property property : from.getProperties()) { + to = to.withIfExists(property, from.get(property)); + } } return to; } diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudBlock.java index 36124dbc..e508b96a 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudBlock.java @@ -2,9 +2,12 @@ package com.minelittlepony.unicopia.block.cloud; import java.util.function.Supplier; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; import net.minecraft.util.ActionResult; @@ -12,6 +15,7 @@ import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.random.Random; +import net.minecraft.world.BlockView; import net.minecraft.world.World; public class SoggyCloudBlock extends CloudBlock implements Soakable { @@ -24,25 +28,30 @@ public class SoggyCloudBlock extends CloudBlock implements Soakable { this.dryBlock = dryBlock; } - @Override - public BlockState getSoggyState(int moisture) { - return getDefaultState().with(MOISTURE, moisture); - } - - @Override - public int getMoisture(BlockState state) { - return state.get(MOISTURE); - } - @Override protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); builder.add(MOISTURE); } + @Override + public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + return dryBlock.get().getPickStack(world, pos, state); + } + + @Nullable + @Override + public BlockState getStateWithMoisture(BlockState state, int moisture) { + if (moisture <= 0) { + return Soakable.copyProperties(state, dryBlock.get().getDefaultState()); + } + return Soakable.copyProperties(state, getDefaultState()).with(MOISTURE, moisture); + } + @Override @Deprecated public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - return Soakable.tryCollectMoisture(dryBlock.get(), state, world, pos, player, hand, hit); + return Soakable.tryCollectMoisture(state, world, pos, player, hand, hit); } @Override @@ -53,6 +62,6 @@ public class SoggyCloudBlock extends CloudBlock implements Soakable { @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - Soakable.tickMoisture(dryBlock.get(), state, world, pos, random); + Soakable.tickMoisture(state, world, pos, random); } } diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudSlabBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudSlabBlock.java index d9f604fe..d074b2cb 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudSlabBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudSlabBlock.java @@ -2,9 +2,12 @@ package com.minelittlepony.unicopia.block.cloud; import java.util.function.Supplier; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; import net.minecraft.util.ActionResult; @@ -12,6 +15,7 @@ import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.random.Random; +import net.minecraft.world.BlockView; import net.minecraft.world.World; public class SoggyCloudSlabBlock extends CloudSlabBlock { @@ -24,26 +28,30 @@ public class SoggyCloudSlabBlock extends CloudSlabBlock { this.dryBlock = dryBlock; } - @Override - public BlockState getSoggyState(int moisture) { - return getDefaultState().with(MOISTURE, moisture); - } - - @Override - public int getMoisture(BlockState state) { - return state.get(MOISTURE); - } - @Override protected void appendProperties(StateManager.Builder builder) { super.appendProperties(builder); builder.add(MOISTURE); } + @Override + public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + return dryBlock.get().getPickStack(world, pos, state); + } + + @Nullable + @Override + public BlockState getStateWithMoisture(BlockState state, int moisture) { + if (moisture <= 0) { + return Soakable.copyProperties(state, dryBlock.get().getDefaultState()); + } + return Soakable.copyProperties(state, getDefaultState()).with(MOISTURE, moisture); + } + @Override @Deprecated public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - return Soakable.tryCollectMoisture(dryBlock.get(), state, world, pos, player, hand, hit); + return Soakable.tryCollectMoisture(state, world, pos, player, hand, hit); } @Override @@ -54,6 +62,6 @@ public class SoggyCloudSlabBlock extends CloudSlabBlock { @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - Soakable.tickMoisture(dryBlock.get(), state, world, pos, random); + Soakable.tickMoisture(state, world, pos, random); } } diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudStairsBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudStairsBlock.java new file mode 100644 index 00000000..495c0f37 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudStairsBlock.java @@ -0,0 +1,43 @@ +package com.minelittlepony.unicopia.block.cloud; + +import java.util.function.Supplier; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.state.StateManager; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; + +public class SoggyCloudStairsBlock extends CloudStairsBlock implements Soakable { + + private final Supplier dryBlock; + + public SoggyCloudStairsBlock(BlockState baseState, Settings settings, Supplier dryBlock) { + super(baseState, settings); + setDefaultState(getDefaultState().with(MOISTURE, 7)); + this.dryBlock = dryBlock; + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); + builder.add(MOISTURE); + } + + @Override + public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + return dryBlock.get().getPickStack(world, pos, state); + } + + @Nullable + @Override + public BlockState getStateWithMoisture(BlockState state, int moisture) { + if (moisture <= 0) { + return Soakable.copyProperties(state, dryBlock.get().getDefaultState()); + } + return Soakable.copyProperties(state, getDefaultState()).with(MOISTURE, moisture); + } +} From 33375097fe8ddaaf144a5ab8747fdbf16dcb1c16 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 18:24:35 +0000 Subject: [PATCH 12/90] Added bedsheets for all the remaining colours and added recipes for them --- .../unicopia/block/FancyBedBlock.java | 42 +++++++++++++++---- .../minelittlepony/unicopia/item/UItems.java | 28 ++++++++++--- .../resources/assets/unicopia/lang/en_us.json | 18 ++++++-- .../models/item/black_bed_sheets.json | 6 +++ .../models/item/brown_bed_sheets.json | 6 +++ .../unicopia/models/item/cyan_bed_sheets.json | 6 +++ .../unicopia/models/item/gray_bed_sheets.json | 6 +++ .../models/item/green_bed_sheets.json | 6 +++ .../models/item/light_blue_bed_sheets.json | 6 +++ .../models/item/light_gray_bed_sheets.json | 6 +++ .../unicopia/models/item/lime_bed_sheets.json | 6 +++ .../models/item/magenta_bed_sheets.json | 6 +++ .../models/item/purple_bed_sheets.json | 6 +++ .../models/item/yellow_bed_sheets.json | 6 +++ .../unicopia/recipes/bed_sheets/apple.json | 21 ++++++++++ .../data/unicopia/recipes/bed_sheets/bar.json | 21 ++++++++++ .../unicopia/recipes/bed_sheets/black.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/blue.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/brown.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/checker.json | 21 ++++++++++ .../unicopia/recipes/bed_sheets/cyan.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/gray.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/green.json | 18 ++++++++ .../recipes/bed_sheets/light_blue.json | 18 ++++++++ .../recipes/bed_sheets/light_gray.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/lime.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/magenta.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/orange.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/pink.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/purple.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/rainbow.json | 36 ++++++++++++++++ .../data/unicopia/recipes/bed_sheets/red.json | 18 ++++++++ .../unicopia/recipes/bed_sheets/yellow.json | 18 ++++++++ .../data/unicopia/recipes/cloth_bed.json | 20 +++++++++ .../data/unicopia/recipes/cloud_bed.json | 20 +++++++++ .../data/unicopia/tags/items/bed_sheets.json | 26 ++++++++++++ .../tags/items/groups/earth_pony.json | 4 +- .../unicopia/tags/items/groups/pegasus.json | 2 + 38 files changed, 578 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/assets/unicopia/models/item/black_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/brown_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/cyan_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/gray_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/green_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/light_blue_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/light_gray_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/lime_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/magenta_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/purple_bed_sheets.json create mode 100644 src/main/resources/assets/unicopia/models/item/yellow_bed_sheets.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/apple.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/bar.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/black.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/blue.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/brown.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/checker.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/cyan.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/gray.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/green.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/light_blue.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/light_gray.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/lime.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/magenta.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/orange.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/pink.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/purple.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/rainbow.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/red.json create mode 100644 src/main/resources/data/unicopia/recipes/bed_sheets/yellow.json create mode 100644 src/main/resources/data/unicopia/recipes/cloth_bed.json create mode 100644 src/main/resources/data/unicopia/recipes/cloud_bed.json create mode 100644 src/main/resources/data/unicopia/tags/items/bed_sheets.json diff --git a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java index 1ff86b42..160290aa 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/FancyBedBlock.java @@ -2,6 +2,8 @@ package com.minelittlepony.unicopia.block; import java.util.Locale; +import org.jetbrains.annotations.Nullable; + import com.minelittlepony.unicopia.item.BedsheetsItem; import net.minecraft.block.BedBlock; @@ -94,19 +96,43 @@ public class FancyBedBlock extends BedBlock { } public enum SheetPattern implements StringIdentifiable { - NONE, - APPLE, - BARS, - BLUE, - CHECKER, - ORANGE, - PINK, - RAINBOW; + NONE(DyeColor.WHITE), + LIGHT_GRAY(DyeColor.LIGHT_GRAY), + GRAY(DyeColor.GRAY), + BLACK(DyeColor.BLACK), + BROWN(DyeColor.BROWN), + RED(DyeColor.RED), + ORANGE(DyeColor.ORANGE),// + YELLOW(DyeColor.YELLOW), + LIME(DyeColor.LIME), + GREEN(DyeColor.GREEN), + CYAN(DyeColor.CYAN), + LIGHT_BLUE(DyeColor.LIGHT_BLUE), + BLUE(DyeColor.BLUE),// + PURPLE(DyeColor.PURPLE), + MAGENTA(DyeColor.MAGENTA), + PINK(DyeColor.PINK), // + + APPLE(null), + BARS(null), + CHECKER(null), + RAINBOW(null); @SuppressWarnings("deprecation") public static final Codec CODEC = StringIdentifiable.createCodec(SheetPattern::values); private final String name = name().toLowerCase(Locale.ROOT); + @Nullable + private final DyeColor color; + + SheetPattern(@Nullable DyeColor color) { + this.color = color; + } + + @Nullable + public DyeColor getColor() { + return color; + } @Override public String asString() { diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 35caa19d..e6500884 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -2,6 +2,7 @@ package com.minelittlepony.unicopia.item; import com.google.common.collect.ImmutableMultimap; import com.minelittlepony.unicopia.*; +import com.minelittlepony.unicopia.block.FancyBedBlock.SheetPattern; import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.block.UWoodTypes; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; @@ -161,13 +162,26 @@ public interface UItems { Item GIANT_BALLOON = register("giant_balloon", new HotAirBalloonItem(new Item.Settings().maxCount(1)), ItemGroups.TOOLS); - Item APPLE_BED_SHEETS = register("apple_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.APPLE, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item LIGHT_GRAY_BED_SHEETS = register(CloudBedBlock.SheetPattern.LIGHT_GRAY); + Item GRAY_BED_SHEETS = register(CloudBedBlock.SheetPattern.GRAY); + Item BLACK_BED_SHEETS = register(CloudBedBlock.SheetPattern.BLACK); + Item BROWN_BED_SHEETS = register(CloudBedBlock.SheetPattern.BROWN); + Item RED_BED_SHEETS = register(CloudBedBlock.SheetPattern.RED); + Item ORANGE_BED_SHEETS = register(CloudBedBlock.SheetPattern.ORANGE); + Item YELLOW_BED_SHEETS = register(CloudBedBlock.SheetPattern.YELLOW); + Item LIME_BED_SHEETS = register(CloudBedBlock.SheetPattern.LIME); + Item GREEN_BED_SHEETS = register(CloudBedBlock.SheetPattern.GREEN); + Item CYAN_BED_SHEETS = register(CloudBedBlock.SheetPattern.CYAN); + Item LIGHT_BLUE_BED_SHEETS = register(CloudBedBlock.SheetPattern.LIGHT_BLUE); + Item BLUE_SHEETS = register(CloudBedBlock.SheetPattern.BLUE); + Item PURPLE_BED_SHEETS = register(CloudBedBlock.SheetPattern.PURPLE); + Item MAGENTA_BED_SHEETS = register(CloudBedBlock.SheetPattern.MAGENTA); + Item PINK_BED_SHEETS = register(CloudBedBlock.SheetPattern.PINK); + + Item APPLE_BED_SHEETS = register(CloudBedBlock.SheetPattern.APPLE); Item BARRED_BED_SHEETS = register("barred_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.BARS, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); - Item BLUE_BED_SHEETS = register("blue_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.BLUE, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); Item CHECKERED_BED_SHEETS = register("checkered_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.CHECKER, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); - Item ORANGE_BED_SHEETS = register("orange_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.ORANGE, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); - Item PINK_BED_SHEETS = register("pink_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.PINK, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); - Item RAINBOW_BED_SHEETS = register("rainbow_bed_sheets", new BedsheetsItem(CloudBedBlock.SheetPattern.RAINBOW, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item RAINBOW_BED_SHEETS = register(CloudBedBlock.SheetPattern.RAINBOW); AmuletItem PEGASUS_AMULET = register("pegasus_amulet", new PegasusAmuletItem(new FabricItemSettings() .maxCount(1) @@ -217,6 +231,10 @@ public interface UItems { return Registry.register(Registries.ITEM, race.getId().withPath(p -> p + "_badge"), new Item(new Settings())); } + static Item register(SheetPattern pattern) { + return register(pattern.asString() + "_bed_sheets", new BedsheetsItem(pattern, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + } + static void bootstrap() { AppleItem.registerTickCallback(Items.APPLE); FuelRegistry.INSTANCE.add(WOODEN_POLEARM, 200); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 922f990f..984bf240 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -176,12 +176,24 @@ "item.unicopia.music_disc_funk": "Music Disc", "item.unicopia.music_disc_funk.desc": "funk, just funk", + "item.unicopia.light_gray_bed_sheets": "Light Gray Bed Sheets", + "item.unicopia.gray_bed_sheets": "Gray Bed Sheets", + "item.unicopia.black_bed_sheets": "Black Bed Sheets", + "item.unicopia.brown_bed_sheets": "Brown Bed Sheets", + "item.unicopia.red_bed_sheets": "Red Bed Sheets", + "item.unicopia.orange_bed_sheets": "Orange Bed Sheets", + "item.unicopia.yellow_bed_sheets": "Yellow Bed Sheets", + "item.unicopia.lime_bed_sheets": "Lime Bed Sheets", + "item.unicopia.green_bed_sheets": "Green Bed Sheets", + "item.unicopia.cyan_bed_sheets": "Cyan Bed Sheets", + "item.unicopia.light_blue_bed_sheets": "Light Blue Bed Sheets", + "item.unicopia.blue_bed_sheets": "Blue Bed Sheets", + "item.unicopia.purple_bed_sheets": "Purple Bed Sheets", + "item.unicopia.magenta_bed_sheets": "Magenta Bed Sheets", + "item.unicopia.pink_bed_sheets": "Pink Bed Sheets", "item.unicopia.apple_bed_sheets": "Apple Patterned Bed Sheets", "item.unicopia.barred_bed_sheets": "Bar Patterned Bed Sheets", - "item.unicopia.blue_bed_sheets": "Blue Bed Sheets", "item.unicopia.checkered_bed_sheets": "Checker Patterned Bed Sheets", - "item.unicopia.orange_bed_sheets": "Orange Bed Sheets", - "item.unicopia.pink_bed_sheets": "Pink Bed Sheets", "item.unicopia.rainbow_bed_sheets": "Rainbow Patterned Bed Sheets", "block.unicopia.rocks": "Rocks", diff --git a/src/main/resources/assets/unicopia/models/item/black_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/black_bed_sheets.json new file mode 100644 index 00000000..3744c6d5 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/black_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/orange_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/brown_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/brown_bed_sheets.json new file mode 100644 index 00000000..e731713b --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/brown_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/brown_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/cyan_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/cyan_bed_sheets.json new file mode 100644 index 00000000..21cbb8fd --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/cyan_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/cyan_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/gray_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/gray_bed_sheets.json new file mode 100644 index 00000000..d14789b7 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/gray_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/gray_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/green_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/green_bed_sheets.json new file mode 100644 index 00000000..6675e779 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/green_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/green_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/light_blue_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/light_blue_bed_sheets.json new file mode 100644 index 00000000..362dbebd --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/light_blue_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/light_blue_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/light_gray_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/light_gray_bed_sheets.json new file mode 100644 index 00000000..e5aa977e --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/light_gray_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/light_gray_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/lime_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/lime_bed_sheets.json new file mode 100644 index 00000000..0b5188f0 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/lime_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/lime_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/magenta_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/magenta_bed_sheets.json new file mode 100644 index 00000000..3af7061c --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/magenta_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/magenta_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/purple_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/purple_bed_sheets.json new file mode 100644 index 00000000..19c466aa --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/purple_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/purple_bed_sheets" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/yellow_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/yellow_bed_sheets.json new file mode 100644 index 00000000..28d94756 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/yellow_bed_sheets.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/yellow_bed_sheets" + } +} diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/apple.json b/src/main/resources/data/unicopia/recipes/bed_sheets/apple.json new file mode 100644 index 00000000..59c07b8a --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/apple.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "#%#", + "% %", + " %#" + ], + "key": { + "#": { + "item": "minecraft:green_wool" + }, + "%": { + "item": "minecraft:lime_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:apple_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/bar.json b/src/main/resources/data/unicopia/recipes/bed_sheets/bar.json new file mode 100644 index 00000000..c851297e --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/bar.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "#%#", + "% %", + " %#" + ], + "key": { + "#": { + "item": "minecraft:light_blue_wool" + }, + "%": { + "item": "minecraft:white_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:barred_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/black.json b/src/main/resources/data/unicopia/recipes/bed_sheets/black.json new file mode 100644 index 00000000..9bc645a0 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/black.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:black_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:black_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/blue.json b/src/main/resources/data/unicopia/recipes/bed_sheets/blue.json new file mode 100644 index 00000000..a327c38e --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/blue.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:blue_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:blue_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/brown.json b/src/main/resources/data/unicopia/recipes/bed_sheets/brown.json new file mode 100644 index 00000000..873eee0a --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/brown.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:brown_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:brown_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/checker.json b/src/main/resources/data/unicopia/recipes/bed_sheets/checker.json new file mode 100644 index 00000000..eb41d549 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/checker.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "#%#", + "% %", + " %#" + ], + "key": { + "#": { + "item": "minecraft:green_wool" + }, + "%": { + "item": "minecraft:brown_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:checkered_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/cyan.json b/src/main/resources/data/unicopia/recipes/bed_sheets/cyan.json new file mode 100644 index 00000000..55d27f39 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/cyan.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:cyan_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:cyan_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/gray.json b/src/main/resources/data/unicopia/recipes/bed_sheets/gray.json new file mode 100644 index 00000000..c22908d1 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/gray.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:gray_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:gray_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/green.json b/src/main/resources/data/unicopia/recipes/bed_sheets/green.json new file mode 100644 index 00000000..44cefb48 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/green.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:green_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:green_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/light_blue.json b/src/main/resources/data/unicopia/recipes/bed_sheets/light_blue.json new file mode 100644 index 00000000..7da12483 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/light_blue.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:light_blue_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:light_blue_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/light_gray.json b/src/main/resources/data/unicopia/recipes/bed_sheets/light_gray.json new file mode 100644 index 00000000..2762e0a7 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/light_gray.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:light_gray_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:light_gray_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/lime.json b/src/main/resources/data/unicopia/recipes/bed_sheets/lime.json new file mode 100644 index 00000000..88734f2c --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/lime.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:lime_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:lime_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/magenta.json b/src/main/resources/data/unicopia/recipes/bed_sheets/magenta.json new file mode 100644 index 00000000..eb70f444 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/magenta.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:magenta_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:magenta_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/orange.json b/src/main/resources/data/unicopia/recipes/bed_sheets/orange.json new file mode 100644 index 00000000..3fa98370 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/orange.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:orange_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:orange_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/pink.json b/src/main/resources/data/unicopia/recipes/bed_sheets/pink.json new file mode 100644 index 00000000..2d93ece3 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/pink.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:pink_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:pink_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/purple.json b/src/main/resources/data/unicopia/recipes/bed_sheets/purple.json new file mode 100644 index 00000000..ab41e3ad --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/purple.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:purple_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:purple_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow.json b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow.json new file mode 100644 index 00000000..16b2493b --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/rainbow.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "ROY", + "L B", + " PG" + ], + "key": { + "Y": { + "item": "minecraft:yellow_wool" + }, + "O": { + "item": "minecraft:orange_wool" + }, + "R": { + "item": "minecraft:red_wool" + }, + "G": { + "item": "minecraft:green_wool" + }, + "B": { + "item": "minecraft:blue_wool" + }, + "P": { + "item": "minecraft:purple_wool" + }, + "L": { + "item": "minecraft:light_blue_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:rainbow_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/red.json b/src/main/resources/data/unicopia/recipes/bed_sheets/red.json new file mode 100644 index 00000000..ef489f95 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/red.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:red_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:red_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/bed_sheets/yellow.json b/src/main/resources/data/unicopia/recipes/bed_sheets/yellow.json new file mode 100644 index 00000000..84bdbe03 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/bed_sheets/yellow.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed_sheets", + "pattern": [ + "###", + "# #", + " ##" + ], + "key": { + "#": { + "item": "minecraft:yellow_wool" + } + }, + "result": { + "count": 1, + "item": "unicopia:yellow_bed_sheets" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/cloth_bed.json b/src/main/resources/data/unicopia/recipes/cloth_bed.json new file mode 100644 index 00000000..54ba7a7f --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/cloth_bed.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "^^^", + "###" + ], + "key": { + "^": { + "tag": "minecraft:wool" + }, + "#": { + "tag": "minecraft:logs" + } + }, + "result": { + "count": 1, + "item": "unicopia:cloth_bed" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/cloud_bed.json b/src/main/resources/data/unicopia/recipes/cloud_bed.json new file mode 100644 index 00000000..93b131a8 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/cloud_bed.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "^^^", + "###" + ], + "key": { + "^": { + "item": "unicopia:cloud" + }, + "#": { + "item": "unicopia:cloud_planks" + } + }, + "result": { + "count": 1, + "item": "unicopia:cloud_bed" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/tags/items/bed_sheets.json b/src/main/resources/data/unicopia/tags/items/bed_sheets.json new file mode 100644 index 00000000..99f4c7d3 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/bed_sheets.json @@ -0,0 +1,26 @@ +{ + "replace": false, + "values": [ + "unicopia:light_gray_bed_sheets", + "unicopia:gray_bed_sheets", + "unicopia:black_bed_sheets", + "unicopia:brown_bed_sheets", + "unicopia:red_bed_sheets", + "unicopia:orange_bed_sheets", + "unicopia:yellow_bed_sheets", + "unicopia:lime_bed_sheets", + "unicopia:green_bed_sheets", + "unicopia:cyan_bed_sheets", + "unicopia:light_blue_bed_sheets", + "unicopia:blue_bed_sheets", + "unicopia:purple_bed_sheets", + "unicopia:magenta_bed_sheets", + "unicopia:pink_bed_sheets", + + + "unicopia:apple_bed_sheets", + "unicopia:barred_bed_sheets", + "unicopia:checkered_bed_sheets", + "unicopia:rainbow_bed_sheets" + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/groups/earth_pony.json b/src/main/resources/data/unicopia/tags/items/groups/earth_pony.json index be47a5df..84d6b64b 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/earth_pony.json +++ b/src/main/resources/data/unicopia/tags/items/groups/earth_pony.json @@ -61,6 +61,8 @@ "unicopia:apple_pie_slice", "unicopia:weather_vane", "#unicopia:baskets", - "unicopia:giant_balloon" + "unicopia:giant_balloon", + "unicopia:cloth_bed", + "#unicopia:bed_sheets" ] } diff --git a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json index ec1deffc..2d058cba 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json +++ b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json @@ -12,6 +12,8 @@ "unicopia:dense_cloud_stairs", "unicopia:unstable_cloud", "unicopia:cloud_pillar", + "unicopia:cloud_bed", + "#unicopia:bed_sheets", "#unicopia:food_types/raw_fish", "#unicopia:food_types/cooked_fish", "unicopia:rain_cloud_jar", From bd05c21f3610138429cb4bbf6d71ad24fb91f9ef Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 21:41:56 +0000 Subject: [PATCH 13/90] Added cloud lumps --- .../minelittlepony/unicopia/item/UItems.java | 1 + .../resources/assets/unicopia/lang/en_us.json | 1 + .../unicopia/models/item/black_bed_sheets.json | 2 +- .../unicopia/models/item/cloud_lump.json | 6 ++++++ .../unicopia/loot_tables/blocks/cloud.json | 9 ++++++++- .../loot_tables/blocks/cloud_slab.json | 18 ++++++++++++++++-- .../loot_tables/blocks/cloud_stairs.json | 2 +- .../loot_tables/blocks/compacted_cloud.json | 9 ++++++++- .../loot_tables/blocks/dense_cloud.json | 9 ++++++++- .../loot_tables/blocks/dense_cloud_slab.json | 18 ++++++++++++++++-- .../loot_tables/blocks/dense_cloud_stairs.json | 4 ++-- .../unicopia/recipes/blocks/cloud_block.json | 13 +++++++++++++ .../data/unicopia/tags/items/clouds.json | 1 + .../unicopia/tags/items/groups/pegasus.json | 13 +------------ 14 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 src/main/resources/assets/unicopia/models/item/cloud_lump.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/cloud_block.json diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index e6500884..9d52bd7a 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -203,6 +203,7 @@ public interface UItems { Item CARAPACE = register("carapace", new Item(new Item.Settings()), ItemGroups.INGREDIENTS); Item CLOTH_BED = register("cloth_bed", new FancyBedItem(UBlocks.CLOTH_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); Item CLOUD_BED = register("cloud_bed", new CloudBedItem(UBlocks.CLOUD_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL); + Item CLOUD_LUMP = register("cloud_lump", new Item(new Item.Settings()), ItemGroups.NATURAL); Item ALICORN_BADGE = register(Race.ALICORN); Item PEGASUS_BADGE = register(Race.PEGASUS); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 984bf240..59c29785 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -176,6 +176,7 @@ "item.unicopia.music_disc_funk": "Music Disc", "item.unicopia.music_disc_funk.desc": "funk, just funk", + "item.unicopia.cloud_lump": "Cloud Lump", "item.unicopia.light_gray_bed_sheets": "Light Gray Bed Sheets", "item.unicopia.gray_bed_sheets": "Gray Bed Sheets", "item.unicopia.black_bed_sheets": "Black Bed Sheets", diff --git a/src/main/resources/assets/unicopia/models/item/black_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/black_bed_sheets.json index 3744c6d5..bc7f7ba1 100644 --- a/src/main/resources/assets/unicopia/models/item/black_bed_sheets.json +++ b/src/main/resources/assets/unicopia/models/item/black_bed_sheets.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "unicopia:item/orange_bed_sheets" + "layer0": "unicopia:item/black_bed_sheets" } } diff --git a/src/main/resources/assets/unicopia/models/item/cloud_lump.json b/src/main/resources/assets/unicopia/models/item/cloud_lump.json new file mode 100644 index 00000000..c8ca05f3 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/cloud_lump.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/cloud_lump" + } +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud.json index a63862dc..282d5ec9 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/cloud.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud.json @@ -7,7 +7,14 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:cloud" + "name": "unicopia:cloud_lump", + "functions": [ + { + "add": false, + "count": 4, + "function": "minecraft:set_count" + } + ] } ], "conditions": [ diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_slab.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_slab.json index b805f097..6926e7fe 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_slab.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_slab.json @@ -7,12 +7,26 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:cloud", + "name": "unicopia:cloud_lump", "functions": [ { "add": false, - "count": 3, + "count": 2, "function": "minecraft:set_count" + }, + { + "add": false, + "count": 4, + "function": "minecraft:set_count", + "conditions": [ + { + "block": "unicopia:cloud_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ] } ] } diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_stairs.json b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_stairs.json index 25c27a93..2259e860 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/cloud_stairs.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/cloud_stairs.json @@ -7,7 +7,7 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:cloud", + "name": "unicopia:cloud_lump", "functions": [ { "add": false, diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud.json b/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud.json index a63862dc..282d5ec9 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/compacted_cloud.json @@ -7,7 +7,14 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:cloud" + "name": "unicopia:cloud_lump", + "functions": [ + { + "add": false, + "count": 4, + "function": "minecraft:set_count" + } + ] } ], "conditions": [ diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud.json b/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud.json index a63862dc..163e3667 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud.json @@ -7,7 +7,14 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:cloud" + "name": "unicopia:cloud_lump", + "functions": [ + { + "add": false, + "count": 9, + "function": "minecraft:set_count" + } + ] } ], "conditions": [ diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud_slab.json b/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud_slab.json index dcd9199d..e9d1f0e2 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud_slab.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud_slab.json @@ -7,12 +7,26 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:dense_cloud", + "name": "unicopia:cloud_lump", "functions": [ { "add": false, - "count": 3, + "count": 4, "function": "minecraft:set_count" + }, + { + "add": false, + "count": 8, + "function": "minecraft:set_count", + "conditions": [ + { + "block": "unicopia:dense_cloud_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ] } ] } diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud_stairs.json b/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud_stairs.json index 15b99d8c..80ba3be4 100644 --- a/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud_stairs.json +++ b/src/main/resources/data/unicopia/loot_tables/blocks/dense_cloud_stairs.json @@ -7,11 +7,11 @@ "entries": [ { "type": "minecraft:item", - "name": "unicopia:dense_cloud", + "name": "unicopia:cloud_lump", "functions": [ { "add": false, - "count": 6, + "count": 13, "function": "minecraft:set_count" } ] diff --git a/src/main/resources/data/unicopia/recipes/blocks/cloud_block.json b/src/main/resources/data/unicopia/recipes/blocks/cloud_block.json new file mode 100644 index 00000000..949938df --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/blocks/cloud_block.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": [ + { "item": "unicopia:cloud_lump" } + ] + }, + "result": { "item": "unicopia:cloud", "count": 1 } +} diff --git a/src/main/resources/data/unicopia/tags/items/clouds.json b/src/main/resources/data/unicopia/tags/items/clouds.json index 71b5f333..039c3d9f 100644 --- a/src/main/resources/data/unicopia/tags/items/clouds.json +++ b/src/main/resources/data/unicopia/tags/items/clouds.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ + "unicopia:cloud_lump", "unicopia:cloud", "unicopia:cloud_planks", "unicopia:cloud_bricks", diff --git a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json index 2d058cba..1d26b745 100644 --- a/src/main/resources/data/unicopia/tags/items/groups/pegasus.json +++ b/src/main/resources/data/unicopia/tags/items/groups/pegasus.json @@ -1,18 +1,7 @@ { "replace": false, "values": [ - "unicopia:cloud", - "unicopia:cloud_slab", - "unicopia:cloud_stairs", - "unicopia:cloud_planks", - "unicopia:cloud_plank_slab", - "unicopia:cloud_plank_stairs", - "unicopia:dense_cloud", - "unicopia:dense_cloud_slab", - "unicopia:dense_cloud_stairs", - "unicopia:unstable_cloud", - "unicopia:cloud_pillar", - "unicopia:cloud_bed", + "#unicopia:clouds", "#unicopia:bed_sheets", "#unicopia:food_types/raw_fish", "#unicopia:food_types/cooked_fish", From 9b38adb816db3e36a20d8fe2f82e1b71189e6434 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 2 Nov 2023 21:42:09 +0000 Subject: [PATCH 14/90] Added item textures for all of the bed sheets --- .../unicopia/models/item/red_bed_sheets.json | 2 +- .../textures/item/black_bed_sheets.png | Bin 0 -> 7313 bytes .../textures/item/blue_bed_sheets.png | Bin 7034 -> 7236 bytes .../textures/item/brown_bed_sheets.png | Bin 0 -> 7118 bytes .../unicopia/textures/item/cloud_lump.png | Bin 0 -> 6526 bytes .../textures/item/cyan_bed_sheets.png | Bin 0 -> 7312 bytes .../textures/item/gray_bed_sheets.png | Bin 0 -> 7126 bytes .../textures/item/green_bed_sheets.png | Bin 0 -> 7374 bytes .../textures/item/light_blue_bed_sheets.png | Bin 0 -> 7034 bytes .../textures/item/light_gray_bed_sheets.png | Bin 0 -> 7097 bytes .../textures/item/lime_bed_sheets.png | Bin 0 -> 7441 bytes .../textures/item/magenta_bed_sheets.png | Bin 0 -> 7473 bytes .../textures/item/pink_bed_sheets.png | Bin 6892 -> 7169 bytes .../textures/item/purple_bed_sheets.png | Bin 0 -> 7293 bytes .../textures/item/yellow_bed_sheets.png | Bin 0 -> 7501 bytes 15 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/main/resources/assets/unicopia/textures/item/black_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/brown_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/cloud_lump.png create mode 100644 src/main/resources/assets/unicopia/textures/item/cyan_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/gray_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/green_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/light_blue_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/light_gray_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/lime_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/magenta_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/purple_bed_sheets.png create mode 100644 src/main/resources/assets/unicopia/textures/item/yellow_bed_sheets.png diff --git a/src/main/resources/assets/unicopia/models/item/red_bed_sheets.json b/src/main/resources/assets/unicopia/models/item/red_bed_sheets.json index bc1ac46a..7594a935 100644 --- a/src/main/resources/assets/unicopia/models/item/red_bed_sheets.json +++ b/src/main/resources/assets/unicopia/models/item/red_bed_sheets.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "unicopia:item/apple_bed_sheets" + "layer0": "unicopia:item/red_bed_sheets" } } diff --git a/src/main/resources/assets/unicopia/textures/item/black_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/black_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..743613472e69e37dbe91f826c52dd9681ccd26be GIT binary patch literal 7313 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/blue_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/blue_bed_sheets.png index 85ce04d7c20663085130f2644dd19497d478d7c7..3c0ed9cc8ebf11b1f373642b472dbd6f09172e86 100644 GIT binary patch delta 647 zcmexmcEn=BSs_C!10w|^Ln~t-!;*pNrfcrT`yO0O{C1l)xx1KDEX-2Ol8sDFbNmQP5i~9P7 z3=E9To-U3d7N@UHKJ6tFDA2awZhGEr!Tc9FF*`-(BwTa+sK}=DB6>wdq_*=1!$(SK zGu=<5g(oTLnZnQ`xaUZTc1P}Wi3R(4{yyd8FxdUeb;_=XZ*Q%3pTJb$x7aj; zRqJ1C7;Ce#zJ^L--qXc4j1r<5^WXow`0?~HMcYhH>F+_YYfdXCY&H`VY&mw4Z*Bdv z&&So><$9GZ`a32_+zw=T@W*uNLoV@~;eGty3M_a0Nt|{#H=BPppTmcS<2%!iA9+<1 z>*f4-$Dzqz`X)tX)ckMTRvYkS#y+EiTQz5;cd$fl_uXc;Y>~R<3cV|-3vBwrHBV(s z;l delta 613 zcmV-r0-F8AIQlk_%@Qy=Gch1BI65^sIyEr>e^b{xvEN7v0uEcVDGQ1MBsOJYHZUW89_^ zMWI+F_<5cNW?y_u62!BVQARip~mR%4*mq_kOg z_Z<&`)L{KM>fDBzdHC_08TjwR{FvOn|3r($5=pW_?lUGYoG^cX4QM==)v@skfeUdi zMAh^1`3&3Q5w4s)W_}B}Gd-hY;}u*O5k&=}$YP}5u-57EZebo{h1$8}KY;=OBZ7z} zumM4^ISde&3QSb1s6yl6oc5A+u3kJj07+klLBt>;i2a3B1C@hEF(TZ$_gIGj0IiQ7 z{^(*8nu=WbAssuCAV!wNdxRrc;X zKx=uCH?LlkrjVxnTAIS=_7cVIF+R`n-qT(Cx@qFg#v|QdIYOSLly~jHxsXpw?+L>K z>9>^8a+zLl13ct;PN%!djoKMAbO-gRrXD&xLEs!>ErE4FV4$_Ui1#^Jp0UzyVXScd z@@cc>CDx~!D%SS5VPsHMuXyjdcIlM)_nzrHCIOI;#p+&M00000NkvXXu0mjfb9D)L diff --git a/src/main/resources/assets/unicopia/textures/item/brown_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/brown_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..10b61d7ddc0494250a88688b7c0ea532289203d4 GIT binary patch literal 7118 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/cyan_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/cyan_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2d1c9e9316b0b15d8f3aa44986b2838d3bcf81 GIT binary patch literal 7312 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/green_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/green_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..cb6e2fe255c4a435b677bff97734cf39a0c9b1db GIT binary patch literal 7374 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/light_blue_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/light_blue_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..85ce04d7c20663085130f2644dd19497d478d7c7 GIT binary patch literal 7034 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 rtU6}-t5LLg8X2vn>C7U)lHDX26= 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 MHs46iGxLo27tr@%PXGV_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/magenta_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/magenta_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8e7161b50ad106f3fa3ed84c8635cd9b36cd84 GIT binary patch literal 7473 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 delta 470 zcmZp)cw;)@tdN0~v7v&YrImq+m5~7h`-i2;8}EB?G4Vxj*5vMDQZX_!NlG&^N!3j< zN;T3oNlQ%8O-eO4&^0tPHMX=&Hb_oMOP+k4cLk5Rxut=bfvG7FTTJfe%i{$Z90D_V zG8?}ls>o&&{x6K1xrGuq#Ow|#Dl#xIuqAoByD;Q2#4{{w7m;P2+$beq&m}L+BJ#BJ z(jo>1Mm|p$#}JFtS10ZDV{#N}-M@Pmi%=aGlj1^!tmLFr)oE(ieyQzY*cK4^Q9~;J zfK%^WH4`^qo`sD%XIDv=ACBpsS~`I@Yx(loXXfNTo3r!7d)04Bx9r2bEI-6OFg>!@ zZjwCnqUL$0!u}Ska~Li+_psbAqEf#yEjn3#?~e8wGtn)-a!+_MTHfi4-+3u?SsLGy zKdUy(-70bA%?l=n--n;(EuOJCdWGo1C?5sBhU!Z~40~%D6nxlu)J{~TmdS>2$1C;J zq?9w)$}E0fZkWNw?eyiObC&9x&z_xun-_1|F8Tb=58k)@inANHb7W3Q%nEofDbqO7 zu)q51w4at66t+#u>p7Ibw9_XkZjQ_9yCye}?O$Aew=yH((4izQVAwHuy85}Sb4q9e E03n35VE_OC diff --git a/src/main/resources/assets/unicopia/textures/item/purple_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/purple_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..23f6224c0169113b6e79884913b1d854abaa7b2d GIT binary patch literal 7293 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/yellow_bed_sheets.png b/src/main/resources/assets/unicopia/textures/item/yellow_bed_sheets.png new file mode 100644 index 0000000000000000000000000000000000000000..744a1fdf551a35747d07743cc1a822dcda7e4c9d GIT binary patch literal 7501 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 Xl+P^AP`Duv`VnGhwb`=3+&AW5z7Ksw literal 0 HcmV?d00001 From be3cac4a0b97722d15602ab8c91500b2d6ec55f7 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 3 Nov 2023 10:29:56 +0000 Subject: [PATCH 15/90] Added textures for all the bed sheets --- .../textures/entity/bed/sheets/black.png | Bin 0 -> 5784 bytes .../textures/entity/bed/sheets/blue.png | Bin 5671 -> 5946 bytes .../textures/entity/bed/sheets/brown.png | Bin 0 -> 5533 bytes .../textures/entity/bed/sheets/cyan.png | Bin 0 -> 5774 bytes .../textures/entity/bed/sheets/gray.png | Bin 0 -> 5823 bytes .../textures/entity/bed/sheets/green.png | Bin 0 -> 5829 bytes .../textures/entity/bed/sheets/light_blue.png | Bin 0 -> 5671 bytes .../textures/entity/bed/sheets/light_gray.png | Bin 0 -> 5800 bytes .../textures/entity/bed/sheets/lime.png | Bin 0 -> 5968 bytes .../textures/entity/bed/sheets/magenta.png | Bin 0 -> 6541 bytes .../textures/entity/bed/sheets/pink.png | Bin 5723 -> 5616 bytes .../textures/entity/bed/sheets/purple.png | Bin 0 -> 6172 bytes .../textures/entity/bed/sheets/red.png | Bin 0 -> 5549 bytes .../textures/entity/bed/sheets/yellow.png | Bin 0 -> 5572 bytes 14 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/black.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/brown.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/cyan.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/gray.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/green.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/light_blue.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/light_gray.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/lime.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/magenta.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/purple.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/red.png create mode 100644 src/main/resources/assets/unicopia/textures/entity/bed/sheets/yellow.png diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/black.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/black.png new file mode 100644 index 0000000000000000000000000000000000000000..b055496df01ece41762aa710e4e8814d92cdf825 GIT binary patch literal 5784 zcmeHLdsq`!7N3Ah#GtgOOVMf!wgq*PnM@utDNzv+g2Wg};dD@*3*-U%0??#jJQDOf zL1R~TuXPBFxfkF0r*wgwh~7R_qm2|w#V8`iWI!L0Vk#6>A(#-sRdTrsk%9GjA3e5+ zW4ap?UJUHZW`lwvH9VUFkbIVVp`uTJ#$xO6KyA4+J~1)Se+r2_#cUSBqB zzt5W6@7%S~#=46?C4TL@AaTrr18s@5<17bV^8#Mj=U)-EwkUFn zOS|EYHf_QE(LW{JPG8u5`3~A{&-&rK8hl$581DDMBxrHq|}Ap#lU(+D-}`#w3$X9yecr}#1fIv39&C! zi()|<1(~h1P$rg%5je!brbtCo-Gu>GJ)?>Wp4meIp46g5yWOIaNK#W%#i^LsY&A$w zf*>S_R3eqa00G<5Om@-%n{2)uMK?z5iU~&`GorKy6@Ebik5a!S!iyAuzB;i&F~(djQhTGLM5bz&38i=}vz`fO;SA z0CcbKPB1`ewW?q(N5 zRu*I>nbhAZj!F-xqzXBOD+n2^q;O!3jF7?vuE1eLPRntckSS#{sgp`isb-q3MiOi% zYa|V{#9}fyC%AyC0wXnQkyMO4mP96zb_OV@MG>qi+3|QHhBeaBc9M%GsvrmiL6wM1 z4mw=+7&Mo*+CV09oX(@uIm2y>3OEA-OLBP%2%K`@iz>)UlXkN;#%xYfi~0`TzG*Ee zCp~E=gGoCLNc)cAnBHS}GJ>d(Zu2=hty#}9Y5xt)6^}3g;K7!Mu{N-Nnp4zWQPK3G z?x*g@B-U9-DYO&sic(-G=MmQSb_9(UQj|m=SKMtM5iXw+%ABC z!6*Vtkr))*TT+!wJ{bYm7$TB9eHRG|Bq5_DU`#L9!7@@RgKxSYW#1|z^pAeVuH1{+A?3=Yc~9LGrp)ydF*%aQ-x zMHEIbXWC;bIq~PYNaA`-%7Ehq!AWpZ=}6!#qg23zoRO0lsY4Y^_p$c}>|&pb+y|_I zE(S=r%dNLG10?@Zyxo9)w;@RIZW*{`!KE$fyR~~VAK3deUpO4C$ae zsAJ}aBTIo~s3k1U20_ETxW#jb;EcR-^yWJfkdT>UxWW@en1Vg&Ndy;okZxBDDBb?@8D zE~~crIsZFWdqa+ljNOnWGc*780|B(R;V`lC?6r5J+)JC_sPHiVmbSLx2?+`JA3ZwW z+6p9_etdy2M4TN2?I_X3jlP-kYTo4>fbYyOr+ZbGnTM}*En*Lw%Dl3p!oN*Y0R1IX zkHoL8sR=!Q{`^M`tGs>18;9xgMD+n@yjSop0Z?AP z#cx-C`Ro0TjzQ3sf;r*ONvf)c`oCy<;=g@Hr@|L1QO6FcEXzAQqeQ>@Q%8FX$C~V1`x)l|;?rxm?cJT%G z1yFNK%in4TQ_Tfll&uc9zc@c0@SY$(ZkU#^sO}%}74hagU{%T7cRi6a*xSX9^z`et z5g(DCj6C^zyV_c3smq=BVA^|ERHn_JjEoE7h5K8(#(g0mDZ#FiU$(8JTe=!qz5fpq zbXUo~!e6hfzA-9f&d88C>kI2#9(Equ*R{1sGkkhSQ)y`(G3Au#!#DYXs+#rd>`N~$ zz9vZXRE-^e;qH-dDoTqbO}cS;@#kzoO^@D>+TQ-@ruj{!C*E|gcH7?gMxeFMdYzIT z_3nCp#j;!bPyAY(c%jbKk@Q1#_J{yMc0re9a~r!Pam`_T;wPc3tPyR@9QSc% z6IDKI>H2j6%`$BcdU$b_54GI0xgdy7Ccm@!P-ErWpJ)I+h&#f&gd$6(a zHUE=EC+xZC?v#fOkwvri9N!a_b+9(Te99;FZbM|llJ?Hp>FJe~^WM+`d)h8G#QQJW zB^a4Kq{bUvb9vI2*V5W6gU)*#pk0qsMZt;$;FO9cvaT%LgT(TI=`|b}32~F6VZBonECKv%B@Xho7sP4LiCbj=-&;T3Rpi$t=;8&=skkF;O>q9ks|lGMynDuiW&Z-#DG+i1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/blue.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/blue.png index 340a7f5431f289ce44b7176c3e643c1b3502e129..ed8facde39e0b40a532b7496b716549aa514c11d 100644 GIT binary patch delta 1969 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/cyan.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..ec48566a916b5fbdb46c9992a94ed2174fb34264 GIT binary patch literal 5774 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/gray.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..b3777282f7058a239c056e4c61ff732cb54b8b5f GIT binary patch literal 5823 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/green.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/green.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb4c94415c846ac4c6c1c9d84c5a6a26c7612c6 GIT binary patch literal 5829 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/light_gray.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..34741a57e8ac5855266e6075677123d0a24715c2 GIT binary patch literal 5800 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 EA2LupumAu6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/lime.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/lime.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d780049ad3fc2a10a1495c84a1289694034a28 GIT binary patch literal 5968 zcmeHLc~leE8lT7_t6~+4qBVprpiD9|nIw~xs0b)g0u)lgtuUEPLWC?P0fGqP4vNw$ zP}e8Vwrbs;R@_mrND;LKrApnvT9o2ODOQx{^6msgJg?`x<2$y0nVg&Z&As3E`}TX2 zP7cq z*+F(-Z7~>c0h-}q#!!}nZO#L{; zyqs)rQ6I?0@qC^jlSi>JE{bsZIFLs$z63=j2%n9JC5S+R3xIxB@e7L>q~-Vh%7A?f zw86nqvfyC0(PU6-lW7RDuFw2T8dfoOSY>=n?QEy4?1P61|HEOq&nCIR%0S{?)sc++BWc;S zJFxF>$)L6Rb!!ySXKut+9*cEj=XhMtsXl|g0o_=;^BNYY5xjE&W za8|DtwmHt4Qzs-^2Tq8aGC8*<_XGK1cAIa#XMQ8``Sih7^@%g;o4LLxlwU6^x`%qPV|EGP+j_g}n7xPIp;e7uX@k13+d%(41=!*8tJH*a` z?1ygCTZYfw>3k+@Wy7zDXMGbAy$>F|mw4(O;~~4ez#-rGABp~Sb5uZ|R?U5RdcwoO zzs9%EPHO$-KI>$3Y>W4`YaXlpK6-Gt=1B0>qfat6Uv2DP%`;WMcPmQ)K^{I@MVuv0 z9xkB_IxeX)C~2-$XJqmP1&*;ANh*o9u$8n%tCwq za=9eLK&3F|$wH(YM!!U5ptLH9jl>10nh>BO7!jcY7^j5@tVB>gOwcr+Rw~srA18Z3 z$@FFmsi$ZL3V?I90EeRZDjY>nSSTWK7{|p*n4m-$j1m+j09$Ilkm>~yY0`qKB$Inv z#XzY56ebi8x{ zZ7>0s1VzcD9E^*+Scys|EovYj<%DbXDb^Po3ayTgv5-tOQK49jfFltXh{Px&CSEX2 zrcGv0i43Og=(O!HX^{YDKwwFxP62>z9rz*%HqoTTU{V+i$x=?wq1&@92koRHEo2C3 zp#f;mF|2rg439z(3DRXg11C4AwCeQ##mzJiI}q@Ll!s}}K!3VzsjH)6=viG)U609H zTPv~Iwx*DfRF?~8GL=@@>;za{TT~*c*U;ef=q}gi>)Jml1-??mCq-g4jPdyxjEmGX ztQ3k7SU{s9K7mmbt?Vj=9(1!oZAl|dbdUzb5yT3Vr|p7b``HrZ|FSJBv&4f9%D z^DkYDZX#Q^(I`e6oFS_ zep6j^?jH1D(R+eejlSXGT{x?ujej z2K3~i!}=|0aZK2Ik@Qwe#|Kf0yG>%oll~_U?g|{Wm$q>!zb) zZ`}!)PuJQ7Ey1#zZU@htjW->SQwZXvjWM}XCSyxo7o0wRz9n@*?1Q33El~x!INvV^ zKfKhic}>;tKiAtk1{5V_l?GzMqdelz^ zb@uc7X%lbF%c;g9#3Oj>r#}wwydtbxKdz;8plF7J-_ik}_w_V;C+#`+<@f#0E-Oke zIQmb2UiA5ZKbHMeR37@R#qKxXWT#7Zn@+|%Ghy-GZ&w#p6};1QctA}SJKb~Ex$p~p53cfgn4Wtf+KrVw zWu#zBF5EmX=IFt#o_3B)>d8y2U+)axS#t4lY2mG-CH-@}HaU)d+=1Pm(crZ2y0v5b zuwCWLGu};%{Bd>NyADci>j%^9!q*;EnW7zX7_+gi#npuNHRWG58U{D z_{xrRqYIYoCpTQkbgvxL68X)D4Ay{(nbtKAMqXQXzxtiA+<=x{)kNd`Rv4v z_uRJ>5d3hgWl;HB=AUo>VHC!0$>#<6^+T?X;EpU6Z|~poY(6?;b7xHy)92mo-Zedr be%wDfGI(08erhZ@V<1^*M98jj3G@F0AtG2! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/magenta.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d664084ca18198f7c3395d904b71a57008120f GIT binary patch literal 6541 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 I^_`vdZ`;5#sQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/pink.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/pink.png index f8951ac589463f59ced4e6a0892d7cde8cefa21e..c706cb90cbf281804fc14a6554fd3a49033b007f 100644 GIT binary patch delta 1636 zcmV-q2AlcYEbuFk*(fnOFf$-9IXW{iIx;W-0RRD@0{{U40003100000005J69|-^e z0fUnP0UUo*#iA7lJBT=Bs7`iKDUP)YMW_&Jg;pI*F8zWg4M~cNqu^R_@ME#+;Nq;S zgR3A2et@{TI4QbFiT_IqEn+-4?#H`(kGpq((5y1e>PY~aZkw4@Qq1L7#lBYzAczp+ zh{?<{<|HW%-|=;i0AKH7Jj?&wpJPxhSPTe=#0h_9m^SeSaeUJ@IPVijSXowy&xt2Z zx*+i**AT9lRyQh4LL9{GdMCZG%z_ZFgTO+1#S&7IxsU-FgZFiFgh|Y zlWztg4KX?}GgL4+Ix{djGBC592J``wt_NHsG&W%|V>CH8EjKk~GA%SWG&wCfV_`5Y zF=AvhHe)h1IAUWmlP(BI4KXb+GgL4+Ix{djGBC4)2yO@#)0tJ~00006VoOIv051UX z06)00H*k{&5g&gG0|_1!W4g~s000BXNkl!6o$W3)t6}xwijbdNM^Od z+JK7?S{?u-B;X}T2$3K{;t3!@;tdGNNJxl?2?&;z5g@^G^GcR4V~sECol8$u9fI~u z&#Y(d$!J7+9>Bot<%he$Lw38qPU}!y(>#TCElUs>*0IqTOzj=Q-VOm(9&h zX_^4Z^q<|`U0SUc?RI-8|ku(Pwn^71mON?Dfl`+dr?oCq`=4#~2N zJkL2gI>LW@PnKnkjDQ4Se}A7eP4V87=Q*8Dha^czl7!RKQvkg8gb*fg`S|#lR;xv) z(;>?;hQlFgnsRV(fQV2O1*%F>6c}R|3 zaQgi|03n3Qn;(aNuh%2XG6sVIs@iM;Zh!PMH!K+6R)CUv= z1rk$DBr4dTAP^L=Le)WV&hgMUSb)?Rj2JSLAjYDV%P67lX)0l=wptjh0i^ncFo^)Q zrtYmCL7FRoqLjgrOM)Gzh6|_ad|{@}W#U|IANSR&UCf0|F$P+i#GD(6L?V$$B+|I` zfO~(he5zYZ&+?SXF*d2IJRcq_d0D`IQ6)~Qo z>QZ=4yEOAtpb{V@#mKn!*EtT&I(_$pzZVc;R<5Rg3>g4x4PtE-wm#H{HTB^=_`u!w z|KiuJL%#Xsr)&C;?TWFMG)bE)fDyUojn03PIg1T;!QP4yLvE7h3LrY|{vfY=kHSdmQ?oVUc59+<_!l4 z+FSvy&XR(@@H+bRP4w2QfYMo6t?bX=fno*Se0i~a``-{iFQ2CwjOsPLVKP-Km;`^U zT|j^a4*_o>%*@_8I~)#wNBU>TpZCBAUi;%dSc5#+1~)`HJJmIFvp{tpu?-f$X@Kbk z(8u%m(F3;M`U+46?SiF;y-C~lJ72^3@!Wc0dP23*;6+hHQI)A@zg!S){&E9=)}z72 zlJ}D`hF)0|H8KLiD4=t*KwZqN-fwX8=p|RRUD!YS;#;=9U$3tj51mW*(duYw1bD*i z9>BcfXWx?T&rWt9zxU>3Ux3N3fy{mDjm`qq7KmQ)n0ife(*?c0RRD@0{{U400031000000019hCMW;^ z0fmzR0UUo@rBW&ib`TNFP!+*0D&knHP=pGhR%q41fkB}f*&BRE>4OrQsV!TLW>v=j{EWM-sA2a;IEgNYIei{RkMtAG9hGhD?;!UAq=4x zV;Gf~sn3dH3ZCQZ9zMR_#dwzYxj#p@k~bOP6NrD~OgAjzb>itwOXs{#9APC%AwDM_ zH|T=Ik6f2se&bwp*v~T~MkYN+93d8pZ7jDjD;X;B6me8hHOlvAT~;`6aaPM!*1RWw zVK}cXFL9mbAd*v%OftgRzYb`B$1oUhJ7uPLK z-UBXofc__4G9*U|(DWAy!220}Qx5361wyNCZ_Rz2J^&f&Ds=-K90DUn%3kw$cUOCF z|DI{~_XF{za@mgz=a&Eg4qItdSaeuTOggie0)hf0IWuNrVKZbgEiyJYIW06cIWjF_ zF=03@HZ){mIb}96I50LglRgEf4LCP9Gcq?ZHZnLlI5v~=1#S&6Ix{g;F*iCgH##*j zlWhhe4KO-0F;p=(Ix;spH8HcB2J`{5atUAv7RjHM!vFvP24YJ`L;&*u;Q--@`uU5K z=n)@(3Lg<0Gmc%oIRF3!6iGxuRCwC$ncZ$2$qhyiS=Bu=8cFNbj}yR`E6JO@Mcyip zuy40FNxYI1AWmS|(nzxYJeuh)lDX)XkVj}>>)dr=PyoN;$0~B5QmIrbl}e>jsr()h zfG=OZ1i`Z?#|B64y6=-N+}#29r5t+z|+$c2L}g~QrK>{m>Ki= z9DsZzH-EL``hRe%KM1;j+K}4`vEKpT8o6U3uxVyVU zL|y}Vq3b&OzDGn55h4OJBj+J;o}ZrqaQD}fe@XxKdQIE5Y&IJrV%h?n{pDAJAR+Ai zJSU4%BDg*Oj)aj&?EiTW!H7uQeR#xwBuFA0oGlR)OK|zy1Bd~_A5QiO4Vsv-`f!Jf zO;>;-#ym1XVde=1Qfg>pgOcb7=Dp$4U=9t56b>QGEm1_6OX7_+bO=gf={vX;T#OcH zi%wDi1u%6$P%;{dih>6M2*M17NF-BQj6g{^0Ti61LT}(?Kv5j`4h)1I! zp+i(b1RX^i)thEF_~ZLIZ#E4OTwQ!e2!zDZ*)A4Fl7_G6H$VgQ{PCwlP^VYn=C?;) zLOguGLoNw0Ru|u4-0AR7OL`Uf`$RJ!sng{^HIKcV45#l3k}z|G%+S|=Wx7-dGQ_Zn zVJL>0(&xZMMoAnnT!bt#VGH=+cN~;NLq>pvklY~o*yX1oZ6XmEjmM~gB4kt&YJr9z zq|p*W3UKr3THx}ZkCbto_4edPO5PH#TwUDZKt?!tza+Q^7{a2z3VeD(txK`+kr z#XZI_K{`0y#U;>4{P+BScCs}<0W=&Z4WFurDNSU8L?#ntA_TJ@kAk9P7AUaQEuNg@ z5C}rX#^FbHAbMt=CK~=IfXi@u3xP{dh~OAPVK9166GBo)lVE_;0Wi0Ono`CPhk7tr zrPsj@MSR*b!M7*-?3RYcg`4w7f&>Idr+cUheK^+_Yd~?HIX?S;0hb`Fu=?;Y7S6=+ z>5^WY@WkrlBSMeRaQO2sofi1VL^GgIN>dUpN)WHvfF#^?yc3*YOQ1vy^FAvDCnz{h zhs#hxMFXcNGbd19%rRLDBzn*u4Ih^h2B;emL5gM+CJlAnTW}}Ql1Sr?(F{9!q47Xb z%J>p6bzbg^Nm}54`uqvmE-{S5vt2ZVUJI-9@8i!}-k$8^>JY)r$H%cgv>d$OMcp8j ztBWUw>QOj8-A6)DRsQqg9#flc2AJCG32A^xp`j(lRcDy*5AOsaFv{5U;EwCd|9&y1 zd?Exwba)HlXiWGPkWh@_wYSbrgrF8Uf)E5fu8JqYBSuF*Co(N2GWvh08$DwRs5QmIrbl}e@Zd*XjbAhNED221n+0000GMP*uHJeF*fC>~**%Y-} z_kBST1Z|Z~#GQvb)t1@{qCgcyPyw|n@NNPkp4W5U@twAR8P4T?bMN>4?zi7b(gFi! z*jbOXh9JmJ=0YkR3_pDQZHhe6N ze>@Y&$nkcbAru8tnRFDPv)Di$VX_1$DnM9NgfCz*1#AqQPucZOBLk9?$rzvnWtq&! zCs63)Lse^3Qkk5DApN$bYd!tXd5yZTAo#)_CyUQgG0DMzm@nK{AGh{9=*lGS5J#Kq?&ls}c9?3JkW^HHxtI8-^~|z{#U5B|Md{+K(%7UMxy-B0 zLTHO}>*kQ4D~(|nPKDW0QyuQ7R$gKLKF;0l?$hWjXhECU<8sfPokSoUZflu(-b%WO z`_z2VlABztZRm{fxuI#-(Ys83z1owDv?8|ORgrRT3me@}BgFFus9fi5M3U3ZLK zowFt2k7?J44eid6dGjJ4FMc*`h0Uu=%xc-{vCI7?dna3(MTZ0~Uo|{W;O@-)VQ0tF ztdfMZ`PRh~BO1cJ>_$qe2X|YPmmW{Q8T?fcX4P>DyHPy@C zO`{X@tga-it9=+%=4C8ymWrJpgn$J zTYU%R-$7wbpVrkmY;ybJdCB!spPI6+#RqEc4z6TqD*x4-5CTCCV`U-Xx^U5K0ijaR zafwPy()9|pAzqNjRJ|G}7Lq!un2eMuJ!x&F$7{&o_<#^1 zej&k^(56nY_RtFefP&QFRJ}s3)C%;TG$XD6(1v9OjcR1kE%c;?gEaC{X-F!Y&ZZ-< zpI#Qjq)oA=dT1n4L6GnCJ_zvSNsH3y)B*-0Ha3To@*)VdlVdNF)SEuoRAbuyKbYQV(Bs%V`jjRy9qZ}n5CMWTLqrMAxtz#j}fu4bTg zgrQI{21;mkelY-~PoY1R(1ygRNk$NRbmxNQi!Ub+krqG)F=(NI9th ztXgm?`reU-g6o$sxFAxdP#dLyv)|*?$)xX`^`35q9iuq|6#?S?xbJblwcW@JxI`j> zuZoB^s3-LGq#4c^NK}MOA~2F{4l2bsC=W(>C4 z3{VmP#pH4bjLT=kJOTsSu=z}wk8v>=;gB4RSA7GVNF|X;oq{OHv!0O#1qHtv-3A#sLy1reP{YfgY#5@+x<4a*Ci^T+~ zASGcjmyf_466LWlCP9$m-c;yE*Q%ttSX@JTM*=?rUxD;AUQkpwW1!sM*CjTJG(-V7 z3`P-{iG-k-fCKI=&Ljj}V+f7$_nXM&OGqg~k}%4XqA(l52^eFuK-GxZVhm+-`8=Yx zVEz&lS!f8#6EN8V4%U|w|A2|4n2YjB428KY9uHXJZmR_x-s1 z|4~F?gk?y3@EU?5|D1_TlF#E}1O_uf$paHHHY_HjVwi<;*f_9~10wlXn`nH&df!A3 zhT(F1Tbdq>|0>>Ih5@%BNbue@aLa;Ao6&!3_hmlFy1(<&*EIglBdFAmhkTHKKf3Fq zyFSPRAH@7IyFR+>gFNs-%pbGsFLRgmyYKy^61=X*f^YQ^&twYli-5U!)(l^W0X>DL z79HamekHI{`_I)vkj+rTpg>!;4F`)BI-$tV;(?8+6%}z=f;2#onWNCxJ4FBMp0wFLp8NXW!hNGcmr*B|AI&6F=`SKJiHG9+i}nlZtXn-*hwuzv`L-c66m*I%k+|4_Nu_ zw?oIF!)?{E=F2G3i;a!sVl(~omJ#c=EYAhUJ802-e7%4+0@0Kk3Ri$+M#u(C)11kyONrltG(=f@A+OaVft8RbY{#vq}iwJ zsc|PR4DNo`_48HJAiGCLyAO6d#SO}I$@Hr0?An)=Z8o#z6sw_`PVL%w{?^st*GN)M z_oDrwF*SD}+cCDc;}&nNy1r6|+w-z5uG(bQ#<6M=k&<~Q^Di87dU7%3v3$iAsfBlA zRM}SV%&9x-u==h=U&r5Z4`mgMyCF$TcDUK)&g9TI<(RXH+lgw5%cMOOKeQj8yZ7YW za}D+Gmfy9T<##nizq)=+-&K+C7}oS~_LMEVHtqN=yyj-&D$g`EjFM|V z|Ak9!Z9CTpY7HUo&Rkrak%6UqY=M(vzIbnumub&pEqiQ2|fL@*1kCzu%Skq+!)-$m4dm zdB)uyr<`cKA@jxfPRE%Cf^yC5PO_&j+zuVuVk+@JJ1#jTFJHK!c4Og*xX$ba6-i-< zF zKN>MA0Xq^r!JXySX?99;aNgw80>#!`S;Dw;P7Ca#j@OhgX?J;6GUQEE`rJCT>c>H4 z`%Yi>{ASOulf0<69(cm>H4XD8DV{8hIdQy(#ID_|z4z1od(DfJ1ureklAVfQTzlJ( h`q~n6a}TG7Qt%l)!EI*gQqV6Up{Xakt;MpWkQqFO%=)p1Jp& z-#zEt-?=waoDd)5>ov{`f*@acY*Z5H!cg z+HYY|%ImYZ{mUo$%HJ>fYv)|UO>%En=aoIXSL|kc7ti-PJSFXFYPjz>b=$~??hW+^-@lOjZj!|F&QZx%&62Z+ybp|9 zb9?EplG@Si`#$r3e!Za9^K||Pmw(DQ7nGJU{30;lY4^wcwBUALX3r0ISSOO^{5-z1({EF7;y>$J>m$EA(!Y4;cO4^7@{A`ZcI7J} zXyi0nnQBf|%)&{%mP@GhDvE2>8kqfp!lqjd1er;h*(xfX*2y?M^$i?0t(I}-2o;FJ z5J_dwv3W)+IWJyG=4FynHD~%XuP`eP0JM~uU|Y3WIumY{aU8ffkeOi~hwV@?XUaIK zfJTveBgGbQ1zZGP;rwY;GgCUbN)02y%TcP&iHTm!{RqD*>=k))!tDV;fJD1@3Ev^Q9c zS&nejB#+9Xv_RDaRz;s$k}0@B3nm5WwASFT0?B?#(@blgBEYnLmdI;gSby= zKaSm@473yqJW5Ym8298+G7hsouGW*Z8h3~SA*zuGQ8A2&Q6Vg#L2NnaqTaq!=gw&ZPkkK?yZ{lmv#PKm-eW!_ z16C4QL%m|4)Bp+-2}y}aDuBhL1b73mV5vkTfe|4klu%NESRlY0P-+sNsW)l~u${D) zNT+xPUAkj}NjM&nAeV74F7jj~A&W3;fPsuNi`H4JPbQSKmP$4gOg2%GREi)ND&!*~ zlrI!LQA(kVCcs1n({Xe zPtM0I+EGeuwxcL;f^>#pBC;v9!%u+aoFX#_T{;C$j{&+q9;bhY3VfBAPl%-&7~}IX zSRmF=uu3FFU?GKy`4WsIDV387gXku`#+*YKsfcutN02K(Psatt4t8u*$kV>$WKhg5 zfP}#)0%M30mEb}Q7YIWUaE&1x-X9;LlmsNyh@~)JEmXk*06y=M> zPKrL45c#MQ6@#+Ch5P|d{2xNpNGXz{L?W0F3n*Bi){wANB_v=Gh6p7BH6m3>om77g zA)+wC|4-Tvgc!zSPX5Qd4deY6vz-bl2x!i!WHcwHW@ zdMhRhQbDCq-^}u+Wnje95c{?Xg1kpFjRjTM{K25RS+0n7zwYho=@NJ$KScyVu0`^w z2&MI#?#=BBgJS$vHcU7pPq7v5{hQC0W52xiE*UVXXT5v7Z^?eoQ6+m!& zzRWu^>B|%6&W*af`15k?iee6~1j%s98qLUvWqS?|3wC*Zl4Pq^`VXH~y?Y2EyHuNA=e zB1$)S3B!vx$tTM_@x%K9r=VYdf4}UazL4m>awKm~%~fA#viAhs46Q0s>ozt9U;3{6 z)QAqdydXCF)#&NFS_)1sbve2*cZ8K!*RVv+Ziy>0JNIrj9VZIE;a(+w zFfVjY_Nne)PX>csISvT-df@(}(^a zT)$`!UB9|4PSiNQGc>Sf{FaT|k?QIR%L0_&-mm^PxN=-wM3+@-8?oa$>#mx*-L&n? z#McY>f#n}o?P;sdz1z@z@VrmwBs9E-?0z_xH)Y>%ZXR(HW>?HN&+Fsg3=YT*447_z zW7h{60kik5_chj(8h4Z$YL@@_-g4grbkXg&VdC!JB7S_3I5w!a)hiv3e>ruS;!t?m z7uhfMC#o%pRRz;;#@$eUT0MGOTKOSojSQ3u)AilEKfdD4j8U=`^;%G)kUTm*>f;${ G%l{22amGFX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/entity/bed/sheets/yellow.png b/src/main/resources/assets/unicopia/textures/entity/bed/sheets/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..5cdd2a85f0c0ad1409cb42e0c2e7df87b7b7bbf9 GIT binary patch literal 5572 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 VT1fQdF#7jXNEsfbsGhYb_aB4Q&Pf0O literal 0 HcmV?d00001 From 53244df5aa4b493a141d230603719e32837b1afc Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 3 Nov 2023 10:30:45 +0000 Subject: [PATCH 16/90] Make pony-made cloud blocks solid so they block rain and can be used in construction --- .../com/minelittlepony/unicopia/block/UBlocks.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 6f867deb..468856b2 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -151,14 +151,14 @@ public interface UBlocks { Block CLOUD_SLAB = register("cloud_slab", new CloudSlabBlock(Settings.copy(CLOUD), true, () -> UBlocks.SOGGY_CLOUD_SLAB), ItemGroups.NATURAL); PoreousCloudStairsBlock CLOUD_STAIRS = register("cloud_stairs", new PoreousCloudStairsBlock(CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.SOGGY_CLOUD_STAIRS), ItemGroups.NATURAL); - Block CLOUD_PLANKS = register("cloud_planks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool(), false, + Block CLOUD_PLANKS = register("cloud_planks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool().solid(), false, null, () -> UBlocks.COMPACTED_CLOUD_PLANKS), ItemGroups.BUILDING_BLOCKS); Block COMPACTED_CLOUD_PLANKS = register("compacted_cloud_planks", new CompactedCloudBlock(Settings.copy(CLOUD_PLANKS))); Block CLOUD_PLANK_SLAB = register("cloud_plank_slab", new CloudSlabBlock(Settings.copy(CLOUD_PLANKS), false, null), ItemGroups.BUILDING_BLOCKS); Block CLOUD_PLANK_STAIRS = register("cloud_plank_stairs", new CloudStairsBlock(CLOUD_PLANKS.getDefaultState(), Settings.copy(CLOUD_PLANKS)), ItemGroups.BUILDING_BLOCKS); - Block CLOUD_BRICKS = register("cloud_bricks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.6F).requiresTool(), false, + Block CLOUD_BRICKS = register("cloud_bricks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.6F).requiresTool().solid(), false, null, () -> UBlocks.COMPACTED_CLOUD_BRICKS), ItemGroups.BUILDING_BLOCKS); Block COMPACTED_CLOUD_BRICKS = register("compacted_cloud_bricks", new CompactedCloudBlock(Settings.copy(CLOUD_BRICKS))); @@ -169,13 +169,13 @@ public interface UBlocks { SoggyCloudSlabBlock SOGGY_CLOUD_SLAB = register("soggy_cloud_slab", new SoggyCloudSlabBlock(Settings.copy(SOGGY_CLOUD), () -> UBlocks.CLOUD_SLAB)); SoggyCloudStairsBlock SOGGY_CLOUD_STAIRS = register("soggy_cloud_stairs", new SoggyCloudStairsBlock(SOGGY_CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.CLOUD_STAIRS)); - Block DENSE_CLOUD = register("dense_cloud", new CloudBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL), false), ItemGroups.NATURAL); + Block DENSE_CLOUD = register("dense_cloud", new CloudBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL).solid(), false), ItemGroups.NATURAL); Block DENSE_CLOUD_SLAB = register("dense_cloud_slab", new CloudSlabBlock(Settings.copy(DENSE_CLOUD), false, null), ItemGroups.NATURAL); Block DENSE_CLOUD_STAIRS = register("dense_cloud_stairs", new CloudStairsBlock(DENSE_CLOUD.getDefaultState(), Settings.copy(DENSE_CLOUD)), ItemGroups.NATURAL); - Block CARVED_CLOUD = register("carved_cloud", new OrientedCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool(), false), ItemGroups.BUILDING_BLOCKS); + Block CARVED_CLOUD = register("carved_cloud", new OrientedCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool().solid(), false), ItemGroups.BUILDING_BLOCKS); Block UNSTABLE_CLOUD = register("unstable_cloud", new UnstableCloudBlock(Settings.copy(CLOUD)), ItemGroups.NATURAL); - Block CLOUD_PILLAR = register("cloud_pillar", new CloudPillarBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL)), ItemGroups.NATURAL); + Block CLOUD_PILLAR = register("cloud_pillar", new CloudPillarBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL).solid()), ItemGroups.NATURAL); Block CLOTH_BED = register("cloth_bed", new FancyBedBlock("cloth", Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOD))); Block CLOUD_BED = register("cloud_bed", new CloudBedBlock("cloud", CLOUD.getDefaultState(), Settings.copy(Blocks.WHITE_BED).sounds(BlockSoundGroup.WOOL))); From 26c535a3e216241f8a56998521007d5c37432e52 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 3 Nov 2023 12:00:40 +0000 Subject: [PATCH 17/90] Tweak carved cloud textures --- .../unicopia/textures/block/carved_cloud.png | Bin 5784 -> 6358 bytes .../textures/block/carved_cloud_bottom.png | Bin 5629 -> 6094 bytes .../textures/block/carved_cloud_top.png | Bin 7618 -> 8107 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/unicopia/textures/block/carved_cloud.png b/src/main/resources/assets/unicopia/textures/block/carved_cloud.png index 405459123759870abda3300d74bdaed1d4e1730a..4c194433c497cc173e2fc1d2a872bad153051e6f 100644 GIT binary patch delta 1316 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 delta 1193 zcmV;a1XlabFa0Z!g8>7PgfU1r0ssIM0000t0ssIM0000-Nlj27GA=PNE;BR$05UK# zGdeLaIx{gKF*G_dGCD9Y00962paTE_000010000000006@iWqq{TzQl9K~N#MQN)J zb`TNFP@U|eB965RMW_&Jg;pI*F8zWg4M~cNqu^R_@ME#+;Nq;SgR3A2et@{TI4QbF ziT_IqEn+=5?#H`(kGpq(P%ksh>WTrHZkwq@T+C!w#hzCLFp7Qz5tNx_%t=xb9mm%_ ze0;r&@~qD1{v3U3&SHOnPb7{p!?cMvh-Wr!gY!Odm=$G}_?&pcqze*1a$WKGjdQ_e zfoF!zbZVYBOe_}KSZQNcG&SOB;)ts0lrLmFRyl8R*2-1ZyeEHQD5tM1bDic05?I6% zB#2N@MG0lth|;Q)Vj)HQ@eclB*DsMvAy)~E91EyGgY5dj|KNXjw^n{?(n|`(f$kT_ z`4|Iwc7aCCalVfor*Q)KpMfjA<*(F%*-z4IEiG~c3~U1z*DX!i11@)fp(jH&Wmodk z6!LlC{fxdT3k==@fiN0)+x3H)Sz6G&wLhEoL}1Vl6Z|G-NGeH#ayfVrDilVq<1zH8VA2 zlRpKg3^+G7GBGkRFgGzVIFs@PZw)XyGci;#G&(XeIxsMkZU!L@Fgi0aR53I@|OIc<@oyf7ahttee@v-7CU>Q$_-iBo=n`bg|K96|Elr zsV=Rxlc`PKe32reXb}^DDKo2xG?F4Fh{z?*2nX~_Q=aiAJ2qGc?4txjd9pr)Jyl(5D znK_8cOy``MxosObRYV?hO9%kI<1FuIwAL;Nvxu~h4iZ5!@;D5`VZE+(x7*?2PahqW zQcfg~Bz5asN<{p+V;+DPcmMIx0q~q8W;XTStEzr~b`V>fWRM4v3J3x?Ej17A+LrO# z2yn>E*SnAwEe0KQ!l`->%?rYG4@qLo=~>HIhCBI^nG>A`po2aTygJVR9F$T{eeJ!B z!uIuMa#tby%pzFx0q@#ZHnnIxoQ_*Vy+`CLkwqQ#P=V*L2zz}-&-h{+@(%YAqT zF3|&Map^Kj0`s${D`cg&nVOSXRS6^kBq+~0y85#*zfkwDLF+%H8K7L%|(C?px=XN00000NkvXX Hu0mjfz|8i9 diff --git a/src/main/resources/assets/unicopia/textures/block/carved_cloud_top.png b/src/main/resources/assets/unicopia/textures/block/carved_cloud_top.png index 9e2240e9442cba44edab9e8dc4d3fa767cc53484..90855c4e6cc6ff11cd1d44c704557e6917512d09 100644 GIT binary patch delta 925 zcmX?Pz1n`lSs_C!17ih4Ln~7=D`N|W)_-EP8}EB?F$q53tjXQQq-W;1HO> zliBzcQAIYJ@b6-t%qO>_%)r1c z48n{Iv*t(u1=&kHeO=j~b2D>WsAZdG)`FA zUR`aZ|9MmXZ?pT)x=v_5%W&vZ40DiJbK7f6hmYinuYszanKKS7_!`#8GhtglZ@K!C zh9$a7COoS&D?i`Bc;@pPhyOo*tY|ILIi2)+SCY}1?R6~@41J$1&QB34QtT{^)^uJd zKlkPJDR*TTObg;NP~4Dv_n!h!V*O(at_OSkmZe6i>{M~$xbyz|@wa7*uiXmrdRQ~Z z(Kll6tNP=W8_t|oy8boCzpXH$;p=Ut3ys@LW48x!T`xU4=hMuhQ;HEM4Bd1h?)3RC zox*y9!MVntbr25r+7r*G7# z7nt~XQ-xd?7#N4HFkfi!vyZhik!yG zjtWkvPO4P;&HS4juez79@k6B8fxESK?~eaA@o$k>6@LA3O~UV8|4Yj&zbBjw@w&Kk z{@btLU%!_Zd+@KWUVi#S3FY6l{+A85ib;iK+b*hi)w%Jt!seXFB;f~@w#IzEy>m9l zJ@OXj64QA$$v1ZK>5aet{wuGLEU-Lm@ndUz*fJrNvl26Ax2RnId~=?b^Tx2~+u!$c zPn?$OxNe;u`#qWX^RK_$`@Q?-e#QyW*;5wkT>pHl?(aX*z1Ern1;tmU3LM;hyijJM t$k{cuM;Nk|ey4j6H||K-lx^`ODlYBNxtHr4I|E9)(Ps0URU9BM*T4^n8rX&dBAS zZgth#*WQ544Rd4N7VEZFz9f?5a(<36%+Ab(Ag6}N;J6*kH6H|j+12Lm%Vfqto;g+3 zRkgMC6&}V9OrtLh)cU&i^^kiVsLL2AENGyKHqj%s_qtANOJ8%bZ_grhO zp5E77xTIxfxO>QdrJ1?Yd>CfB#L7k9GHBj_duHP9FY8#C+4h+!l}sb{b2r8SJfBZ| zxz#SCpu5-13?Mh>$YTNNo~}~K)BSuo&CPv!%G0+bS(p{|Z4Laot^$}Djy%jMmPX&5 zG=afrKI0(|haJkLQFfcvuzWkMc;nUN-cW=2yrhn#|H-!+| zbB##M)cOsms@%in;i_j<9{KP8&mxI^?YElZJWsTh(^Ex}GTjkm<`d(wpL;Msd}u_g z2@lm(oVU}%B3RhuyxJJn-M_zc2bBiLVujDl-{uC5gw)j+jxfxy>h6|A&J5Gj7_-jx zIyLXW)Kzao=zBc55;tF#hMC>F`vW5kBg29`5{=R@clYROW+q}qX=J@S@=OpI#*byf ag8u-|(TueLsLg`_0000 Date: Fri, 3 Nov 2023 12:11:31 +0000 Subject: [PATCH 18/90] Make dense cloud compactable --- .../unicopia/block/UBlocks.java | 9 +- .../blockstates/compacted_dense_cloud.json | 268 ++++++++++++++++++ .../resources/assets/unicopia/lang/en_us.json | 1 + .../flattened_dense_cloud_corner_full.json | 6 + .../block/flattened_dense_cloud_corner_x.json | 6 + .../flattened_dense_cloud_corner_xy.json | 6 + .../flattened_dense_cloud_corner_xyz.json | 6 + .../flattened_dense_cloud_corner_xz.json | 6 + .../block/flattened_dense_cloud_corner_y.json | 6 + .../flattened_dense_cloud_corner_yz.json | 6 + .../block/flattened_dense_cloud_corner_z.json | 6 + 11 files changed, 323 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/unicopia/blockstates/compacted_dense_cloud.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_full.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_x.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xy.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xyz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_y.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_yz.json create mode 100644 src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_z.json diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 468856b2..c947d3ee 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -169,9 +169,12 @@ public interface UBlocks { SoggyCloudSlabBlock SOGGY_CLOUD_SLAB = register("soggy_cloud_slab", new SoggyCloudSlabBlock(Settings.copy(SOGGY_CLOUD), () -> UBlocks.CLOUD_SLAB)); SoggyCloudStairsBlock SOGGY_CLOUD_STAIRS = register("soggy_cloud_stairs", new SoggyCloudStairsBlock(SOGGY_CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.CLOUD_STAIRS)); - Block DENSE_CLOUD = register("dense_cloud", new CloudBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL).solid(), false), ItemGroups.NATURAL); - Block DENSE_CLOUD_SLAB = register("dense_cloud_slab", new CloudSlabBlock(Settings.copy(DENSE_CLOUD), false, null), ItemGroups.NATURAL); - Block DENSE_CLOUD_STAIRS = register("dense_cloud_stairs", new CloudStairsBlock(DENSE_CLOUD.getDefaultState(), Settings.copy(DENSE_CLOUD)), ItemGroups.NATURAL); + Block DENSE_CLOUD = register("dense_cloud", new NaturalCloudBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL).solid(), false, + null, + () -> UBlocks.COMPACTED_DENSE_CLOUD), ItemGroups.BUILDING_BLOCKS); + Block COMPACTED_DENSE_CLOUD = register("compacted_dense_cloud", new CompactedCloudBlock(Settings.copy(DENSE_CLOUD))); + Block DENSE_CLOUD_SLAB = register("dense_cloud_slab", new CloudSlabBlock(Settings.copy(DENSE_CLOUD), false, null), ItemGroups.BUILDING_BLOCKS); + Block DENSE_CLOUD_STAIRS = register("dense_cloud_stairs", new CloudStairsBlock(DENSE_CLOUD.getDefaultState(), Settings.copy(DENSE_CLOUD)), ItemGroups.BUILDING_BLOCKS); Block CARVED_CLOUD = register("carved_cloud", new OrientedCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool().solid(), false), ItemGroups.BUILDING_BLOCKS); Block UNSTABLE_CLOUD = register("unstable_cloud", new UnstableCloudBlock(Settings.copy(CLOUD)), ItemGroups.NATURAL); diff --git a/src/main/resources/assets/unicopia/blockstates/compacted_dense_cloud.json b/src/main/resources/assets/unicopia/blockstates/compacted_dense_cloud.json new file mode 100644 index 00000000..087d05e7 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/compacted_dense_cloud.json @@ -0,0 +1,268 @@ +{ + "multipart": [ + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_full", "uvlock": true }, + "when": { "down": true, "north": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_x", "uvlock": true }, + "when": { "down": true, "north": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_y", "uvlock": true }, + "when": { "down": false, "north": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_z", "uvlock": true }, + "when": { "down": true, "north": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xz", "uvlock": true }, + "when": { "down": true, "north": false, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xy", "uvlock": true }, + "when": { "down": false, "north": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_yz", "uvlock": true }, + "when": { "down": false, "north": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xyz", "uvlock": true }, + "when": { "down": false, "north": false, "east": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_full", "uvlock": true, "y": 90 }, + "when": { "down": true, "south": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_z", "uvlock": true, "y": 90 }, + "when": { "down": true, "south": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_y", "uvlock": true, "y": 90 }, + "when": { "down": false, "south": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_x", "uvlock": true, "y": 90 }, + "when": { "down": true, "south": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xz", "uvlock": true, "y": 90 }, + "when": { "down": true, "south": false, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_yz", "uvlock": true, "y": 90 }, + "when": { "down": false, "south": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xy", "uvlock": true, "y": 90 }, + "when": { "down": false, "south": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xyz", "uvlock": true, "y": 90 }, + "when": { "down": false, "south": false, "east": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_full", "uvlock": true, "y": 180 }, + "when": { "down": true, "south": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_x", "uvlock": true, "y": 180 }, + "when": { "down": true, "south": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_y", "uvlock": true, "y": 180 }, + "when": { "down": false, "south": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_z", "uvlock": true, "y": 180 }, + "when": { "down": true, "south": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xz", "uvlock": true, "y": 180 }, + "when": { "down": true, "south": false, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xy", "uvlock": true, "y": 180 }, + "when": { "down": false, "south": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_yz", "uvlock": true, "y": 180 }, + "when": { "down": false, "south": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xyz", "uvlock": true, "y": 180 }, + "when": { "down": false, "south": false, "west": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_full", "uvlock": true, "y": 270 }, + "when": { "down": true, "north": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_z", "uvlock": true, "y": 270 }, + "when": { "down": true, "north": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_y", "uvlock": true, "y": 270 }, + "when": { "down": false, "north": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_x", "uvlock": true, "y": 270 }, + "when": { "down": true, "north": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xz", "uvlock": true, "y": 270 }, + "when": { "down": true, "north": false, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_yz", "uvlock": true, "y": 270 }, + "when": { "down": false, "north": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xy", "uvlock": true, "y": 270 }, + "when": { "down": false, "north": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xyz", "uvlock": true, "y": 270 }, + "when": { "down": false, "north": false, "west": false } + }, + + + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_full", "uvlock": true, "x": 180 }, + "when": { "up": true, "south": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_x", "uvlock": true, "x": 180 }, + "when": { "up": true, "south": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_y", "uvlock": true, "x": 180 }, + "when": { "up": false, "south": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_z", "uvlock": true, "x": 180 }, + "when": { "up": true, "south": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xz", "uvlock": true, "x": 180 }, + "when": { "up": true, "south": false, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xy", "uvlock": true, "x": 180 }, + "when": { "up": false, "south": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_yz", "uvlock": true, "x": 180 }, + "when": { "up": false, "south": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xyz", "uvlock": true, "x": 180 }, + "when": { "up": false, "south": false, "east": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_full", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": true, "south": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_z", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": true, "south": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_y", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": false, "south": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_x", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": true, "south": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xz", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": true, "south": false, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_yz", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": false, "south": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xy", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": false, "south": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xyz", "uvlock": true, "x": 180, "y": 90 }, + "when": { "up": false, "south": false, "west": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_full", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": true, "north": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_x", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": true, "north": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_y", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": false, "north": true, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_z", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": true, "north": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xz", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": true, "north": false, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xy", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": false, "north": true, "west": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_yz", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": false, "north": false, "west": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xyz", "uvlock": true, "x": 180, "y": 180 }, + "when": { "up": false, "north": false, "west": false } + }, + + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_full", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": true, "north": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_z", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": true, "north": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_y", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": false, "north": true, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_x", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": true, "north": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xz", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": true, "north": false, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_yz", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": false, "north": true, "east": false } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xy", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": false, "north": false, "east": true } + }, + { + "apply": { "model": "unicopia:block/flattened_dense_cloud_corner_xyz", "uvlock": true, "x": 180, "y": 270 }, + "when": { "up": false, "north": false, "east": false } + } + ] +} diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 59c29785..9cf54e20 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -273,6 +273,7 @@ "block.unicopia.dense_cloud": "Dense Cloud", "block.unicopia.dense_cloud_slab": "Dense Cloud Slab", "block.unicopia.dense_cloud_stairs": "Dense Cloud Stairs", + "block.unicopia.compacted_dense_cloud": "Dense Cloud", "block.unicopia.cloud_pillar": "Cloud Pillar", "block.unicopia.cloth_bed": "Fancy Cloth Bed", "block.unicopia.cloud_bed": "Cloud Bed", diff --git a/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_full.json b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_full.json new file mode 100644 index 00000000..96ed79e2 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_full.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_full", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_x.json b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_x.json new file mode 100644 index 00000000..a0e2924d --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_x.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_x", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xy.json b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xy.json new file mode 100644 index 00000000..f38b7250 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xy.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_xy", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xyz.json b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xyz.json new file mode 100644 index 00000000..382df9ab --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xyz.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_xyz", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xz.json b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xz.json new file mode 100644 index 00000000..bad87c59 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_xz.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_xz", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_y.json b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_y.json new file mode 100644 index 00000000..2e2572a5 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_y.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_y", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_yz.json b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_yz.json new file mode 100644 index 00000000..b4e0a676 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_yz.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_yz", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_z.json b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_z.json new file mode 100644 index 00000000..fa657f3b --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/flattened_dense_cloud_corner_z.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/flattened_cloud_corner_z", + "textures": { + "all": "unicopia:block/dense_cloud" + } +} \ No newline at end of file From c4d245c84eaebae288b12d48e01434d1c868dc01 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 3 Nov 2023 12:17:26 +0000 Subject: [PATCH 19/90] Fixed pick-block on compacted cloud blocks --- .../com/minelittlepony/unicopia/block/UBlocks.java | 8 ++++---- .../unicopia/block/cloud/CompactedCloudBlock.java | 12 ++++++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index c947d3ee..ff33019b 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -147,21 +147,21 @@ public interface UBlocks { Block CLOUD = register("cloud", new NaturalCloudBlock(Settings.create().mapColor(MapColor.OFF_WHITE).hardness(0.3F).resistance(0).sounds(BlockSoundGroup.WOOL), true, () -> UBlocks.SOGGY_CLOUD, () -> UBlocks.COMPACTED_CLOUD), ItemGroups.NATURAL); - Block COMPACTED_CLOUD = register("compacted_cloud", new CompactedCloudBlock(Settings.copy(CLOUD))); + Block COMPACTED_CLOUD = register("compacted_cloud", new CompactedCloudBlock(CLOUD.getDefaultState())); Block CLOUD_SLAB = register("cloud_slab", new CloudSlabBlock(Settings.copy(CLOUD), true, () -> UBlocks.SOGGY_CLOUD_SLAB), ItemGroups.NATURAL); PoreousCloudStairsBlock CLOUD_STAIRS = register("cloud_stairs", new PoreousCloudStairsBlock(CLOUD.getDefaultState(), Settings.copy(CLOUD), () -> UBlocks.SOGGY_CLOUD_STAIRS), ItemGroups.NATURAL); Block CLOUD_PLANKS = register("cloud_planks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.4F).requiresTool().solid(), false, null, () -> UBlocks.COMPACTED_CLOUD_PLANKS), ItemGroups.BUILDING_BLOCKS); - Block COMPACTED_CLOUD_PLANKS = register("compacted_cloud_planks", new CompactedCloudBlock(Settings.copy(CLOUD_PLANKS))); + Block COMPACTED_CLOUD_PLANKS = register("compacted_cloud_planks", new CompactedCloudBlock(CLOUD_PLANKS.getDefaultState())); Block CLOUD_PLANK_SLAB = register("cloud_plank_slab", new CloudSlabBlock(Settings.copy(CLOUD_PLANKS), false, null), ItemGroups.BUILDING_BLOCKS); Block CLOUD_PLANK_STAIRS = register("cloud_plank_stairs", new CloudStairsBlock(CLOUD_PLANKS.getDefaultState(), Settings.copy(CLOUD_PLANKS)), ItemGroups.BUILDING_BLOCKS); Block CLOUD_BRICKS = register("cloud_bricks", new NaturalCloudBlock(Settings.copy(CLOUD).hardness(0.6F).requiresTool().solid(), false, null, () -> UBlocks.COMPACTED_CLOUD_BRICKS), ItemGroups.BUILDING_BLOCKS); - Block COMPACTED_CLOUD_BRICKS = register("compacted_cloud_bricks", new CompactedCloudBlock(Settings.copy(CLOUD_BRICKS))); + Block COMPACTED_CLOUD_BRICKS = register("compacted_cloud_bricks", new CompactedCloudBlock(CLOUD_BRICKS.getDefaultState())); Block CLOUD_BRICK_SLAB = register("cloud_brick_slab", new CloudSlabBlock(Settings.copy(CLOUD_BRICKS), false, null), ItemGroups.BUILDING_BLOCKS); Block CLOUD_BRICK_STAIRS = register("cloud_brick_stairs", new CloudStairsBlock(CLOUD_BRICKS.getDefaultState(), Settings.copy(CLOUD_PLANKS)), ItemGroups.BUILDING_BLOCKS); @@ -172,7 +172,7 @@ public interface UBlocks { Block DENSE_CLOUD = register("dense_cloud", new NaturalCloudBlock(Settings.create().mapColor(MapColor.GRAY).hardness(0.5F).resistance(0).sounds(BlockSoundGroup.WOOL).solid(), false, null, () -> UBlocks.COMPACTED_DENSE_CLOUD), ItemGroups.BUILDING_BLOCKS); - Block COMPACTED_DENSE_CLOUD = register("compacted_dense_cloud", new CompactedCloudBlock(Settings.copy(DENSE_CLOUD))); + Block COMPACTED_DENSE_CLOUD = register("compacted_dense_cloud", new CompactedCloudBlock(DENSE_CLOUD.getDefaultState())); Block DENSE_CLOUD_SLAB = register("dense_cloud_slab", new CloudSlabBlock(Settings.copy(DENSE_CLOUD), false, null), ItemGroups.BUILDING_BLOCKS); Block DENSE_CLOUD_STAIRS = register("dense_cloud_stairs", new CloudStairsBlock(DENSE_CLOUD.getDefaultState(), Settings.copy(DENSE_CLOUD)), ItemGroups.BUILDING_BLOCKS); diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java index 1d869d47..ef938bb0 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java @@ -43,13 +43,21 @@ public class CompactedCloudBlock extends CloudBlock { ); }); - public CompactedCloudBlock(Settings settings) { - super(settings, true); + private final BlockState baseState; + + public CompactedCloudBlock(BlockState baseState) { + super(Settings.copy(baseState.getBlock()), true); + this.baseState = baseState; PROPERTIES.forEach(property -> { setDefaultState(getDefaultState().with(property, true)); }); } + @Override + public ItemStack getPickStack(BlockView world, BlockPos pos, BlockState state) { + return baseState.getBlock().getPickStack(world, pos, baseState); + } + @Override protected VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, EquineContext equineContext) { return SHAPE_CACHE.apply(state); From f9c4234cbe46d38718d3f051f2ed998904331c4d Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 3 Nov 2023 13:13:03 +0000 Subject: [PATCH 20/90] Add clouds to world generation --- .../unicopia/structures/clouds/junction_1.nbt | Bin 0 -> 577 bytes .../unicopia/structures/clouds/large_1.nbt | Bin 0 -> 774 bytes .../unicopia/structures/clouds/large_2.nbt | Bin 0 -> 1157 bytes .../unicopia/structures/clouds/large_3.nbt | Bin 0 -> 1373 bytes .../unicopia/structures/clouds/medium_1.nbt | Bin 0 -> 526 bytes .../unicopia/structures/clouds/medium_2.nbt | Bin 0 -> 701 bytes .../structures/clouds/pillar_boat.nbt | Bin 0 -> 613 bytes .../structures/clouds/pillars/pillar_1.nbt | Bin 0 -> 263 bytes .../structures/clouds/pillars/pillar_2.nbt | Bin 0 -> 281 bytes .../structures/clouds/pillars/pillar_3.nbt | Bin 0 -> 290 bytes .../structures/clouds/pillars/pillar_4.nbt | Bin 0 -> 294 bytes .../structures/clouds/pillars/well.nbt | Bin 0 -> 481 bytes .../unicopia/structures/clouds/small_1.nbt | Bin 0 -> 284 bytes .../unicopia/structures/clouds/small_2.nbt | Bin 0 -> 452 bytes .../unicopia/structures/clouds/small_3.nbt | Bin 0 -> 359 bytes .../structures/clouds/village/house_1.nbt | Bin 0 -> 1567 bytes .../worldgen/processor_list/cloud_decay.json | 37 +++++++ .../unicopia/worldgen/structure/clouds.json | 15 +++ .../template_pool/clouds/decorations.json | 60 +++++++++++ .../worldgen/template_pool/clouds/houses.json | 16 +++ .../template_pool/clouds/natural.json | 95 ++++++++++++++++++ .../template_pool/clouds/pillars.json | 49 +++++++++ .../worldgen/template_pool/clouds/start.json | 93 +++++++++++++++++ 23 files changed, 365 insertions(+) create mode 100644 src/main/resources/data/unicopia/structures/clouds/junction_1.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/large_1.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/large_2.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/large_3.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/medium_1.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/medium_2.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/pillar_boat.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/pillars/pillar_1.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/pillars/pillar_2.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/pillars/pillar_3.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/pillars/pillar_4.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/pillars/well.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/small_1.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/small_2.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/small_3.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/village/house_1.nbt create mode 100644 src/main/resources/data/unicopia/worldgen/processor_list/cloud_decay.json create mode 100644 src/main/resources/data/unicopia/worldgen/structure/clouds.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/clouds/decorations.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/clouds/natural.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/clouds/pillars.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/clouds/start.json diff --git a/src/main/resources/data/unicopia/structures/clouds/junction_1.nbt b/src/main/resources/data/unicopia/structures/clouds/junction_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..68165f68c3146023bd917c470288e7acfda9af4d GIT binary patch literal 577 zcmb2|=3oGW|5vA<&AaR%(z?F>(f%y~2?vumyq{&7bd=9^a!J&(Qrl^^VXF5UwjUF- z(^&d;rgYg>5!Z?Pt-sHC?3uSraHXpJUH{pgCq7l}-xt0$WE;1hh4rbTt3hv~>vu@c z{(1O&)TVp=8o#PjH%T^gmaVPm^Az=Qn~{<##Co_YwX1ZK@U_HQ#jfjPE^6B^4ELMS z>%=dyjGgB)v)khI#R*)j!9vRfI{J)tp%1tRl7AW#6xUGPUa9|8~g-9E22Bfm^yI+x{t)%}b;A3A2(3NSDL02h`QC;$Ke literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/large_1.nbt b/src/main/resources/data/unicopia/structures/clouds/large_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8cce28fa95bc7b1c960d3f0f2606842029e112fd GIT binary patch literal 774 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/medium_2.nbt b/src/main/resources/data/unicopia/structures/clouds/medium_2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..67319641d603fd056b4be790383b246ddd2c4216 GIT binary patch literal 701 zcmb2|=3oGW|5IaAXGw1~i@urTvp+dC?fCnvKhyVavf5_(RK$JrW#R7J%Ww0J zfBka${?yP~^GB{fW`&x`7oYg}r)&C|IWr#Rc(t#TdG^ufsP-}A^G!28<#4qp?o7}! zGUhqWYFsYizfRS#B0jQg#-uaMhc_MG@Ww#L`plukh;K6!Gjb#B4c5p@T;u0?&EEEv z`S7pC#J^``{~i!|5{DtKBlGvbhW)6D)46$Gr@uVGclcbW#5Vne8~>UTe>1hEu9r1F zykTbIm2-Wp9Jmx{pIJe z#4B~-Knv;;U{30}^?sGS#Mb+v$WAmaPiarQnHW(fF-^8D6~wf;dG%e`-vcY|t_3+B zYCu-`>bhxtZw!Dmf&e<`-M2S8f?}2**?zcU-Qsiig7z$*nmq56q5s#m$}4&rN2{%h zpEL!g?>NP}_*}tMZnwF~TH-xc^MOt+wObuy@aj(>&>K5f6&+kr9Qw2=ap$x?pqZ6F zYMyNkeQS2zZ2!xk*=yx?E#thccFipNaO{@;cC)v;>{?I9UY7kfTW#z1%f+?VO~3to zS^Rjq*^|Qpvu^3F3zD97_HXVz`_!#dGxO!&1xc4X?>IHx{ACr-{;cRH1~JF~JkpK- zx#m;F^(m7hzb)*vJpOpU((24J`Nui_-@X6g$MW{$-#5xWe)jL?*0uZjW98c)+gmJG zxjP}r`mR#x+N;UsC+yAJ|2>pCpXBp6wuaa8Psibkn$Eqylm9cs9Ts2hE6TtC0N;;q AcK`qY literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/pillar_boat.nbt b/src/main/resources/data/unicopia/structures/clouds/pillar_boat.nbt new file mode 100644 index 0000000000000000000000000000000000000000..84e32d3fafad14a25b1aa776d10eaa647f8bce55 GIT binary patch literal 613 zcmV-r0-F6FiwFP!00000|J~Tlj?*v{1>oEKv}r1SBtSd{`&qL_tk|K-Z9OxdN$n_h zgy0Q$YZBU1+6+B5Vg;45n9S$I_gu^FOf9mM!kce87m@Lr4_7u^tEE)h1`~|-GJcja z-!yLf=4OUTIO2DvNHArBnJ1Vk9hGhtInPDxt-GoZY2WM=Ms&h@FHjS>NuxhX6 z#ok!G?bL0!(fc-h9qzZzHS)H%X6ss`Znll#hJl^0WOZw-YSxEWJila>WM(HX ze?9ZT+P^N?uJK-5C3bYMxg4S5-_O zcV#C(KQZ&cELzp*5cK#5dofJy!#M59y9M`OpYHFp^?H5yZ7uc3&b7K5{|zuy;X0%3 z@CxIsRDHX)t_%04XFMr^kN2(*_v^kT<8xWPS3!N!ogatDv+wc)L!6QZvk(9P!6Y-1 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/pillars/pillar_1.nbt b/src/main/resources/data/unicopia/structures/clouds/pillars/pillar_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..c5af13339e022198bd274055f72def2290a53ed9 GIT binary patch literal 263 zcmV+i0r>tOiwFP!00000|8PK3jVG_9ECq|hbTZQo(Kqm| zodwYdagt`zY5%|TwFMeXvV3p_V2DwP@o+bA9863&V>k__E3e&KZikKrRn&YI;agae zIvW`uUs_aQWe)XDB^X>%?`h@PVG?N1c<6(48if{}*M7Z>QtGKxqpHXKUIKTCHn!k> zw0DQuMgsZeX~5lIvBOx_nEz^avdwgGm>Q)m+m#)z32;F$Dm^!mJe%Ejc@W|D N6JKQ}23pPm006q?cS!&M literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/pillars/pillar_2.nbt b/src/main/resources/data/unicopia/structures/clouds/pillars/pillar_2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..65839c623a994db4c65835a8fd969e6a3bf89d24 GIT binary patch literal 281 zcmV+!0p|W6iwFP!00000|CN!;P6IIvMQr)(bIQF5*B|%<#o5uWI|2Xzn8$|> literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/pillars/pillar_3.nbt b/src/main/resources/data/unicopia/structures/clouds/pillars/pillar_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ea48d9ef67bc3bb1852e2d847f1f7fe40dec0be5 GIT binary patch literal 290 zcmV+-0p0!|iwFP!00000|E*HXPQx$|oHj{uQUSg2Gd*)goVZrobX#0puVrsk!5{F~ zIDH6_mID%&R@Q1~W<4V}K#ell4=w=oHOf`?cMZc{ty)g#PmRgaN&A+X9#NwRlFlTY zh`FhflJbc$#Eb`+(G^TFz>LwL@JltQwqm`)L~)LmjtxprJH|ujZ7adjymiv87QyCu z%+ny^aKE#j+emAj^DgMS!E|jsxy5n8-A}T?*sd`9=4|aI(cWO96gR9Fa#tK+;GoEu zn?R0L`4C=%<~d5>*oT{aCF%4P)tX$&rYbKnx2498kzG9f?h)6O4%Gh_IzI4^N>hn8 o|07Z>9?eSjesNSg%Uoog^O`=A(hJAblW_ZqFLlRrH>d&t01l>)L;wH) literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/pillars/pillar_4.nbt b/src/main/resources/data/unicopia/structures/clouds/pillars/pillar_4.nbt new file mode 100644 index 0000000000000000000000000000000000000000..a8d21958310500854b0d81f5ae8bc13e63d38ccc GIT binary patch literal 294 zcmV+>0onc^iwFP!00000|E*F%PQx$|oHj{uQUSg2nVvZ#PFyQD-4qwsYuOuB@B@C0 zOX|KW_r_5hbSF#NdwErucgAVE8Va>l?ROL9Nwv^Bll8c9*J>s&`C-wh@h70~t sY0klkR|syv zt#K$R#W>AiDT*w=dEdOrB5nYtPGn1 z#9%=`>jMoAXbxF4prIo^m|>+p$Y5cHm1>BQix@0o2ugR_cQpR&G9H zEX=TS*~fAbgGG#7-6|7SIiMMvVVST}AIz|F^BH4dhLy`cmWvoHV&v*pm9VM-4Kg%z zM1u?#GFZr95rahx7G+rt6lM`>sGhAd0cvNp77HzFD2>=ixY`=Ew5<|1OKrESd8^{N zi>Ix%8qPP$$fXnOa3eQuc&lNyRz~Rg4siCnxCT-yxcI4gR*zo1)-VaeJ<9OMZr~4m zm~s*|C#}#j1le68PGW0!UE>Km25s)0ZKdljA2F}D+wcU{T4*1`R>r!xErZ)i=q>Wu z_s6F{-3sLf0AG&(^XC}t`sQ|exj$Y>L1r XTM@*AbiONs(+~Ir6>e?e{Rsd7@0r+_ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/small_1.nbt b/src/main/resources/data/unicopia/structures/clouds/small_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7dc60a7d9992977bd459ebd97af645b0a564920f GIT binary patch literal 284 zcmb2|=3oGW|5K;#_B&!A;<7&e=2@j5Vp&;PURA;|5iJ%`)zbeO_Nz^tu{NRR`lN1; z0gCg*ZqvBc9E)22oHg?=+U^}%fV%f<7ywI2_>6Qw1VD51V^ z+l@=_yY@@0PLN6LQR3z~ZDgKOdFaOKlKF|}5@r}nJmYbDEW=S;E6>&TmFaL*W8&Te z8{!fo^w+;&MG;uPpn&c0oP!4G24^IBiseM?5~{vmDfz~DdAIel;k6u1EuUCEjlH|E%ucIzaoAHD9&o!rQ z?%Phv?e)5(b0NO+|9!97(->F_*6&kgZrFEr*R*f@S)W{D5uNhoLOko4uv^!xT>p7IC8~NGLeF;8gaHekF-h+>#*F?f&GUU}c5NJe@^hW>KqI(!vzm zbF!y$POx6RH6n8+vw4#K!+oZ!w)F~~j=EhIo0(b`8=t(k?f7TA|0ymRb1zuxn4RK? zl|6N5Ub5wqEZ*|!)RebJ)O5DLI^4ZpCe3jNzoeUY+|BL&``f?F-}Rub)JlI%^0VFx zMl3hw!z;u;Zw=qEg8#>##EN~>j-7sWA=>HZvmE8vdX85%!9x literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/small_3.nbt b/src/main/resources/data/unicopia/structures/clouds/small_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..4823a4bd3e29a7ecfb7aefe74839977f9e3e8cf3 GIT binary patch literal 359 zcmb2|=3oGW|5L9y`ZqfWus%pk+-^EVNN!+qGN@Hf? zmb;6d7Pi@(n{fQEa{ssJYet7Ney7jh`2$F~pN^3Pa;u$Z8~1E8|2Fgc-Mxza=1)Gh z+5GdGclAoKMAEs!zptN4t(ZS)aZdf<-`{WlY4&OE`&Soz>TK|d YhpKhU>ZDxr_CIA8+R<9`my>}305K-9Q2+n{ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/village/house_1.nbt b/src/main/resources/data/unicopia/structures/clouds/village/house_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..b2366c712c7aa5b2ded6c4dabe8f1cc2325bc701 GIT binary patch literal 1567 zcmaJ=e>l^59QUIlcC-A*oUT1OkBgG8_SA4{cdeFc${I&K*bj0SAt}F>iTsF$5*;U7 zwPZ~tIcXw4RwT1|P9qQF64NGInpN!Aed&4b+;dO&`Ro0DJ@5DH$Md{Di1Vffi%dCJEtaj>ct znLh}s#ASt#kVOwey&8_w26TPn0xmCX`!z2)s<%+s@z5ujF~Ru^Hvdp{W_%S%M>6bO2d}rf#R{ z9Jy!l%pTrw_p*39rFUBp<*pB(>mV71#mAiUL_K-?6{Fc9BKF*%J>`Sjxw7O<>)ZoZ zVnw0#ZmsuH4Y8tt5~^LUC%>7_x2bkb1_bNciZjbz5%Fp5T*?*)3vV|o9GT>=?aG>j zKz-z3wKBd?!~`Tk+S-obi>2|Hzr_aay{Q=f2&@hiCBl%(;GL8L5#qB>_Ov;`(XofS zefVVgk?^}g(KD1aAd*xyb-*L=wo}q8J30#BV6&1d$M9sW;*`HTH%t!y>p8q=C3r@Ej?8)+_M zCR3r!g$HSZ)BymhG{%ZQ`hzovtNJbA0n8EvAY)yWS%UH6vBsZ2 zyBWoUN{?BZGx*fq3-`y8r)5FIn2$;@fUGJ1geg|#GywzGS!*)5C*f3KO}_(N)KZKA zIBCu~B!B%uXd7Es*-s|FGsadlERZR;KDU6M8o|yvf1CVNZkUzayayO*wO)a(m?<@x zxdA^V373CTXAb6aXO&yQWt)ym6o371CbagX`&LLKz)`T97A(CtV$BP@gM{SJxm>ae z27XPf%6h_tE^`L?MTFb57iDG(t?feVR*V2R#P#T1j$l4n({pn=M;Y1j>%}C>mS7QY zv!#&l8ZsiLmu%Rsibgd?zCo4GNA&p%5>=_MY2w6b&gcVGj_BrSO%3{kIwW3v^0i-L zwQ>ElI-i<2n$Q!;j_tJQ(I#kuxz$4ts!;=-xg#`BpNabk(k9&!lOs7F1(L-H-!V1RAQ&4M($!k{&3s@9OeJ{?DaYXIv z(IQ7QlHL;;P6|bXD)LzW46Z=QwAwSN3NikqTk*Kb2-hm@irO#yBdtVAysEbsA}VI4 zP?o;q0R!&%k3IX^_00~%cy#bKTo(1^Y+_>1{84E>vmt*&?0no?g)mG9e>3d+jco9^ yws(KXt+hjs Date: Fri, 3 Nov 2023 13:28:43 +0000 Subject: [PATCH 21/90] Implement rotating and mirroring for compacted clouds --- .../block/cloud/CompactedCloudBlock.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java index ef938bb0..c7bc4507 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java @@ -19,6 +19,8 @@ import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.Property; import net.minecraft.util.ActionResult; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; import net.minecraft.util.Hand; import net.minecraft.util.Util; import net.minecraft.util.hit.BlockHitResult; @@ -84,4 +86,27 @@ public class CompactedCloudBlock extends CloudBlock { return ActionResult.PASS; } + + @Override + public BlockState rotate(BlockState state, BlockRotation rotation) { + BlockState result = state; + for (var property : FACING_PROPERTIES.entrySet()) { + if (property.getKey().getAxis() != Direction.Axis.Y) { + result = result.with(FACING_PROPERTIES.get(rotation.rotate(property.getKey())), state.get(property.getValue())); + } + } + return result; + } + + @Override + public BlockState mirror(BlockState state, BlockMirror mirror) { + BlockState result = state; + for (var property : FACING_PROPERTIES.entrySet()) { + if (property.getKey().getAxis() != Direction.Axis.Y) { + result = result.with(FACING_PROPERTIES.get(mirror.apply(property.getKey())), state.get(property.getValue())); + } + } + return result; + } + } From e9897bfb55f9f8fc986d1ef73fb9bd668e735ffe Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 3 Nov 2023 19:56:28 +0000 Subject: [PATCH 22/90] Adjust cloud generation and add a little more variety --- .../block/cloud/CompactedCloudBlock.java | 15 ++-- .../unicopia/structures/clouds/junction_2.nbt | Bin 0 -> 702 bytes .../unicopia/structures/clouds/junction_3.nbt | Bin 0 -> 707 bytes .../unicopia/structures/clouds/junction_4.nbt | Bin 0 -> 552 bytes .../unicopia/structures/clouds/junction_5.nbt | Bin 0 -> 738 bytes .../unicopia/structures/clouds/large_3.nbt | Bin 1373 -> 1372 bytes .../structures/clouds/village/house_2.nbt | Bin 0 -> 965 bytes .../structures/clouds/village/house_3.nbt | Bin 0 -> 4346 bytes .../worldgen/structure/cloud_village.json | 15 ++++ .../{clouds.json => floating_island.json} | 2 +- .../worldgen/structure_set/clouds.json | 18 +++++ .../worldgen/template_pool/clouds/houses.json | 66 ++++++++++++++++++ .../template_pool/clouds/natural.json | 36 ++++++++++ 13 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 src/main/resources/data/unicopia/structures/clouds/junction_2.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/junction_3.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/junction_4.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/junction_5.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/village/house_2.nbt create mode 100644 src/main/resources/data/unicopia/structures/clouds/village/house_3.nbt create mode 100644 src/main/resources/data/unicopia/worldgen/structure/cloud_village.json rename src/main/resources/data/unicopia/worldgen/structure/{clouds.json => floating_island.json} (89%) create mode 100644 src/main/resources/data/unicopia/worldgen/structure_set/clouds.json diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java index c7bc4507..e27f7ee1 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CompactedCloudBlock.java @@ -89,24 +89,21 @@ public class CompactedCloudBlock extends CloudBlock { @Override public BlockState rotate(BlockState state, BlockRotation rotation) { - BlockState result = state; - for (var property : FACING_PROPERTIES.entrySet()) { - if (property.getKey().getAxis() != Direction.Axis.Y) { - result = result.with(FACING_PROPERTIES.get(rotation.rotate(property.getKey())), state.get(property.getValue())); - } - } - return result; + return transform(state, rotation::rotate); } @Override public BlockState mirror(BlockState state, BlockMirror mirror) { + return transform(state, mirror::apply); + } + + private BlockState transform(BlockState state, Function transformation) { BlockState result = state; for (var property : FACING_PROPERTIES.entrySet()) { if (property.getKey().getAxis() != Direction.Axis.Y) { - result = result.with(FACING_PROPERTIES.get(mirror.apply(property.getKey())), state.get(property.getValue())); + result = result.with(FACING_PROPERTIES.get(transformation.apply(property.getKey())), state.get(property.getValue())); } } return result; } - } diff --git a/src/main/resources/data/unicopia/structures/clouds/junction_2.nbt b/src/main/resources/data/unicopia/structures/clouds/junction_2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..0a20fb6c473eaa43da4e6099b6be7ab65dd1002e GIT binary patch literal 702 zcmb2|=3oGW|5I<=&ARO%!1`dLYP9{f$y@fmNd97XeXri$S8F4!XK(0SBzkF<)BOcs zmaaZ(ci~S#S{8@mkI89a#U1LIu2P!IKb#gDE=9i`D<*u-4m^?NrT6o+==+&V4~iU_(iXLJVc1XktzOMHg*F>~;W=E@mS}r; z!@R^Ww#{ZUP9>PJC0DjtCtYh|Um|VBErEe%+)9vY&g5-7D+@%&jJ|6pX&pRJa(ELX zF(~=uF;l~@M>qUAKngMuKm3UqJ9@@<7=i9dJ!3tLKwAwFzT4gw745us?nArlZFPA( zYVQ|uFBR+Awpzbu>y}ts>D>NHRc#l`qSmHMUGdhLhcb3gGYgi;y?!Z;Yw=tATRI6_ z{<_a*?fGW8!q!+Mb}-|om!W$W&iAHr*3LH>q_X_=fA(~bx}S@clB|J zUn*ZEcAt~Aiub;`J6(UiU#-P4#T~bk#r?~F>wWS6Tb$ z|C7&cQ!Tgu)Rli2`uFFFx8Du<>dySHnp54I{NZoSWP$3HduCtyXTqUZclmit{pYKy X-w*c(?{g~K|5V>MQH%eX2m=EEnRjxQ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/junction_3.nbt b/src/main/resources/data/unicopia/structures/clouds/junction_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..075dab3a2afcba00591193ca2776bd7d610f8f76 GIT binary patch literal 707 zcmb2|=3oGW|5Ili%)9I$(AKWi*N-lJ&21=~VuIHpcV!&I`QM!E)2*XLwZiiA{EAS4W<6ta;_7XX(31#_?6{ZTWf2 zpT3%}@Ot6=g2}V5XT{a&UJXg|TyA|Ysi`rO=S*1Qo`rJxD~?OQ`q)<0q!@1SgsUxP z_2r+Ox7m@sMo(6)J8|^a=R+H29?D`noW`|UlIQhm?!(VmKQlpz)~nrL zeSj98W;)Gpfi z{oJDp=Q#--!aRkqg73bGwK%-HpzZnLB1>nza#y`?dJ!`DAh{+*zuHsB@2usiw!8PC z1|ryFUHE*bRAl+@M@y?-6^9?`uf2V&cJ`i}T|Xv0`MmLTd)PG9uwIfm zJV4{Uol>uoYWkmdCpF9qwJ&*WJ))net@L`A&g$6t(uIj<43BR(@hc;xTqfxMhBfcy zq;C3U9$Z!%IeXKcuveb zJ>Nl3(_g_8rZ2Z>tNUjDQ)|w$KRfr>Ej2mu`m@Au6W98y{4ZOMYYvhSX0;rsO}<@3e=pFFAe`=?n-<>wjpHTz#Iyz}jB-J8Sq{~Z3-Jvh&` zdHx@PBEHw{n=~u$ua~P=(Y*Jz-O@KP?!CJAE0g0!$DYq{D}4UaV43B8&a(faJ9*yS a`}xMctuk`^iKF2^*$l+LuiwMRzyJW1`wzkZ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/junction_5.nbt b/src/main/resources/data/unicopia/structures/clouds/junction_5.nbt new file mode 100644 index 0000000000000000000000000000000000000000..76a970880204fb9058319199e0a30b2313902694 GIT binary patch literal 738 zcmb2|=3oGW|9fXR=3jOYXkA`-Y0X;^0gnQQKWy)8i{0kzaJyaNy}fkrw7r5&%I5z} z%T5UAW<2-pc2Us|`n)!M-}aAvm%Nrt`6;l!-N|Ly>!%f=m#a1Pwpc!sV4E4YRA#yFm?WF}}a2W$5je|gOF*TUKU+y(#46`@jD zQ`@47H?X;_W<3^^z0`pF&FsdD-?)38vATU`T3p$9aZev_T!M+d!7Oo!vk>8^CR2l1 z))HlE24KztL-%75o4n3Nm5`IGpYuWhcqj=VvXUBZ@{Q-6QoIglaQba7vD!j?G) zGc21E)AdhF@>oBQJO>oec0LEv1vKoeY|k@3w_^6iJFl}r?c$kTSRBO7GuyiO(N=>i zQ8tUjX0r+(ekT4}l4o}OnskFVbLLCD&0z$J6thE!v^iJj&V2~6`$kXl&xS zXDz1r?@Yh(CrPp?@pE@7N84HbX^IkN`y<*CZb+UpVp*KZ;dWY}2PDQG2^5n_k-S#D z%)lV3Eny4KL6GbBgtgTzd!Fq$qv(9byQL59uFjh&DX})}Ye$q$`ZfRD6`|5uYk9UF z$atsiY%gql_U>Y9A63`tX>)bf1?6nsVQ1QFpWQUM@^yZb&Hm2Z8(;n@&2O8nS1J^Sl>uJiAL{L((g#QoX%H1vTT6-YvW|6 zWF%GdZZ>aETYLWYJ@fw=rST`(_Z1bLUMev&_4(`x#W!R(CeM~vZ*BgyxajLj|JWDH z|9kcAU1rxe@vWK5oo&(ESDv5VbhX}e)w=k;*Uj>ugs1P0efxD=@HO$E`VTkj`TiQ{ SPMkdd6Zdi1W&0XM85jUR&}EYV literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/large_3.nbt b/src/main/resources/data/unicopia/structures/clouds/large_3.nbt index 52ed4ea278adc2c7006b15e881c0c6d9e7065e79..4fd2200a79b7692e87642ed8e50930c553e53408 100644 GIT binary patch literal 1372 zcmZ`%3rtgI7)7v**e;!^j7t|?gq+6Ww@Z-gieA`8d!N$g_@ugDs9DLDJD`U zcS8dV5TskG@+heq1}!a*B3Y>*WezKkwnJ$^Xn711=MZ#A3lag%$#lk=VL{K@zK zzQrCc&Tm~;-Jhk;fDRTc?v9#&_v97n3eLzdvL8|^JWo~~uGHM{JL)kOI{h^jVaNZR zlhGL>f!=c+`C{iYlKWk+-K^c8PPZjDi!N)Y2b?_tf)>V(mCW+p}~* z1Ey3|bx07)Pb>3B@soCh`r@;wkWoiUdDhXy-9g*(|*B!sZMX(rvDjB zao={&UkLZ@Kv*8)zbPT7{x=C*^$*o)kf>S`3Nr_Mv87m2hjzk|&Cpz&aaCW(8^e42 zBjBsFMl7_%*J{a|U^5Sk5bavAs$zPp0^(D zjes6k%}G`rRLDPKd^zle5GBgaG()0s31iZlr9lukfqTAN-mI`-NlO&>l?yoxKI*cf zuBvg=bWf-L>~Yq zWpOkxQwL_^Q`tWRK{}uxMD=e_ozModcC$cM^2|ySX5~UGdJM3_jZUi>L`9)dcci!3 zs$k?fPQ1Uze-Q2iG@qcsh*{n8u8RBQKuD$xF2$-(cRV;D%prybkJ1fVHVWTnaEV;L z{5mnh(8{U}y6u@}C}P*r--cpv&$96AjLOWx;utuK8YX-Nn}vW6!dbyiP}qYJJpwi= z^G@~xq9U;I0H}EMDz@h)tK{L+3PBF<7qIw0E?RLWPR+l7usF-9vAC*FhYVv7{Yf=Va^w*S9NTc{sJv9^z3s7BY+v9)*W?fi0vq&mBdLH5^r#Qop8>XvY z?pr-OtDL*DaLr3^%x>4uD%R#^GGEe1Zi+s0jJ=2+C-+7+ONIverA$t>us`3vBcZNI z869EZo>zv41l4&l71ZNa=@H$dZ7D57r4{)T9rm^H#nklsr@miUS7z|KL~A>Ht-YV7 z;Ct`-biwMul4I=!55LmK2yczIiac^xNt&)-SuY|hEI+2^-%Nz^hP&?e5t^3&QXJge_-N*cd5C{t=@Z9ZTpRmG4g=#9KA+#wR3gPD)xcxMBb^r HE-rrpO?R+n literal 1373 zcmZ`&4KSN`97Y$6__(uPUe^xgrjCvGMpY}ut~419Mi$0Vrf6pn=9AU-(~7J>?PR#JI;QW^ z*&^sD>p_T(V=PPjC2{7}Dm~+jL-GxybEb?CIChGa@-#ryoL?5Xjl48%ve{m~^ z#YgDb=Il4nj?_HSLKgmm-4)aeyL?MBK5+E7X&KxrU0A(L7^;~!8DQF|0z__s@OSYX zOGsZN^*mz%FXUU&{ntIg-Q$@&&Kn^ctEIh&C8WU67fPj3xXNBrD0hI8Amn;KTm%vA z2{>3wU+$q@&mny-twOw@+?d?Ler{*aqU8WnguXqj?V*wK2g#A9;GCt7VCeobJ_x5y z=rL-k4z;j=rCGoUN`i?vt{{2b^D>A?nA$8Q@r8N}8=PAbeV6qbM(ukI zOXy8s#j^1tHyJDju)uBz!_MyKPV!P+f#PZ1BaE67pVlGbTGiJr!9-CHT7opdrc{(Bf_n zRldW(a>$$K1YGnjz}tf^61~xRq~(Cd56^)<9{QD9Mv9aDt6a~c#L2+WC_jMdEc>BZ zBs5zckApcCVPHL!G19-6Y_8Qt2}yY*V)JKXw)D`bMurzQXMEvEYIPUh$LNMkp&AdH zY4HKxY7nyRlC3aKb7447p*v0@T$tV4bx6~M-FUtB`~QH}WDe~Vq_GV?@lB+4O7$Kb zDOrNu{pn(Bc893>HB2AlJ$KW-rwEA>&J{QYgVM1DJ|pfMJrM(kXyA*2tMn%opAYrl>&C`oadXYZb%9s*Io@B+ ze?v8qqcrFI6b{#x`t<#>ZGi&Z4VDjH)LZg09RK~M#Jo5oR=)O2Ud!WLzRjuPVf>Gi zsy?LiRmrdCu1T44 zz-Q*NM+Bi!;qyea`ww>aJ)O?LRf+vXxe{ zpRHFym}IdgP(Wx_oM;se0I;X31H0CcV1 z)rbG?KLA;=lHKq6vA4V_U^5jir=KbSY7BmM>5iC@*My5rK4;e$J=@ZE3g`%svt}Aa ze9VBEx>*bs6reCMYpPu4lRMA%Sj?#_AcJ>)UzvCY6c&kKqa}{r;Q&X<;ab0kAaS;I zpmH;f;Mu&O&@crWhCP%GX7>QSXt%uJv(L=>v)mW{8f{B>*Zf|2i}MSs-EU&JZ`^ig zkLTMP-@14E_SJea*UEPnNZg(K`fs!mk(k}8vi{GDe+Q(8wcBa35c=hd_5_dm(FF5M*yKGOx z?CVk2_%DCe+sB{yzU^_jdvIF%Zr(G~6pwwdSUG=Lmb3V_=Rxlnw6$e)jYzTEnH`NLilJUSjC$T6Gmf2iL(AuP5?hJgV9t0&-* literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/clouds/village/house_3.nbt b/src/main/resources/data/unicopia/structures/clouds/village/house_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..eb14b5081fdd9f2ce8ae47a78e75eb09d9d74312 GIT binary patch literal 4346 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 X>ywYCtCGga<7SkShL^O;B}@JbGdIs; literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/worldgen/structure/cloud_village.json b/src/main/resources/data/unicopia/worldgen/structure/cloud_village.json new file mode 100644 index 00000000..06894644 --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/structure/cloud_village.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:jigsaw", + "biomes": "#minecraft:is_overworld", + "max_distance_from_center": 80, + "project_start_to_heightmap": "WORLD_SURFACE_WG", + "size": 6, + "spawn_overrides": {}, + "start_height": { + "absolute": 180 + }, + "start_pool": "unicopia:clouds/start", + "step": "surface_structures", + "terrain_adaptation": "none", + "use_expansion_hack": true +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/structure/clouds.json b/src/main/resources/data/unicopia/worldgen/structure/floating_island.json similarity index 89% rename from src/main/resources/data/unicopia/worldgen/structure/clouds.json rename to src/main/resources/data/unicopia/worldgen/structure/floating_island.json index d49da3ae..4a2d3351 100644 --- a/src/main/resources/data/unicopia/worldgen/structure/clouds.json +++ b/src/main/resources/data/unicopia/worldgen/structure/floating_island.json @@ -1,6 +1,6 @@ { "type": "minecraft:jigsaw", - "biomes": "#minecraft:is_forest", + "biomes": "#minecraft:is_overworld", "max_distance_from_center": 80, "project_start_to_heightmap": "WORLD_SURFACE_WG", "size": 6, diff --git a/src/main/resources/data/unicopia/worldgen/structure_set/clouds.json b/src/main/resources/data/unicopia/worldgen/structure_set/clouds.json new file mode 100644 index 00000000..a610968c --- /dev/null +++ b/src/main/resources/data/unicopia/worldgen/structure_set/clouds.json @@ -0,0 +1,18 @@ +{ + "placement": { + "type": "minecraft:random_spread", + "salt": 54138171, + "separation": 2, + "spacing": 10 + }, + "structures": [ + { + "structure": "unicopia:cloud_village", + "weight": 90 + }, + { + "structure": "unicopia:floating_island", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json b/src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json index 5accd349..9dbe3814 100644 --- a/src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json +++ b/src/main/resources/data/unicopia/worldgen/template_pool/clouds/houses.json @@ -9,6 +9,72 @@ }, "projection": "rigid" }, + "weight": 4 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/village/house_2", + "processors": { + "processors": [] + }, + "projection": "rigid" + }, + "weight": 6 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/village/house_3", + "processors": { + "processors": [] + }, + "projection": "rigid" + }, + "weight": 1 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/pillars/pillar_1", + "processors": { + "processors": [] + }, + "projection": "rigid" + }, + "weight": 1 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/pillars/pillar_2", + "processors": { + "processors": [] + }, + "projection": "rigid" + }, + "weight": 2 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/pillars/pillar_3", + "processors": { + "processors": [] + }, + "projection": "rigid" + }, + "weight": 4 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/pillars/pillar_4", + "processors": { + "processors": [] + }, + "projection": "rigid" + }, "weight": 1 } ], diff --git a/src/main/resources/data/unicopia/worldgen/template_pool/clouds/natural.json b/src/main/resources/data/unicopia/worldgen/template_pool/clouds/natural.json index dc7a9b20..d401792e 100644 --- a/src/main/resources/data/unicopia/worldgen/template_pool/clouds/natural.json +++ b/src/main/resources/data/unicopia/worldgen/template_pool/clouds/natural.json @@ -81,6 +81,42 @@ }, "weight": 1 }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/junction_2", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/junction_3", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/junction_4", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + }, + { + "element": { + "element_type": "minecraft:single_pool_element", + "location": "unicopia:clouds/junction_5", + "processors": "unicopia:cloud_decay", + "projection": "rigid" + }, + "weight": 1 + }, { "element": { "element_type": "minecraft:single_pool_element", From 57783f9c2c58de381a1b6173bc6bc92fffb0a062 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 4 Nov 2023 00:15:07 +0000 Subject: [PATCH 23/90] More cloud generation --- .../structures/cloud_islands/blobs/blob_1.nbt | Bin 0 -> 1847 bytes .../structures/cloud_islands/continent/a.nbt | Bin 0 -> 32766 bytes .../structures/cloud_islands/continent/b.nbt | Bin 0 -> 59960 bytes .../structures/cloud_islands/continent/c.nbt | Bin 0 -> 25649 bytes .../structures/cloud_islands/continent/d.nbt | Bin 0 -> 9078 bytes .../structures/cloud_islands/continent/e.nbt | Bin 0 -> 24230 bytes .../structures/cloud_islands/continent/f.nbt | Bin 0 -> 16045 bytes .../structures/cloud_islands/continent/g.nbt | Bin 0 -> 3091 bytes .../cloud_islands/surfaces/surface_1.nbt | Bin 0 -> 827 bytes .../cloud_islands/surfaces/surface_2.nbt | Bin 0 -> 864 bytes .../cloud_islands/surfaces/surface_3.nbt | Bin 0 -> 1088 bytes .../worldgen/structure/cloud_continent.json | 15 ++++++ .../worldgen/structure_set/clouds.json | 4 ++ .../template_pool/cloud_island/large/a.json | 14 ++++++ .../template_pool/cloud_island/large/b.json | 14 ++++++ .../template_pool/cloud_island/large/c.json | 14 ++++++ .../template_pool/cloud_island/large/d.json | 14 ++++++ .../template_pool/cloud_island/large/e.json | 14 ++++++ .../template_pool/cloud_island/large/f.json | 14 ++++++ .../template_pool/cloud_island/large/g.json | 14 ++++++ .../template_pool/cloud_islands/blobs.json | 14 ++++++ .../template_pool/cloud_islands/surfaces.json | 32 +++++++++++++ .../worldgen/template_pool/clouds/houses.json | 44 ------------------ 23 files changed, 163 insertions(+), 44 deletions(-) create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/blobs/blob_1.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/continent/a.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/continent/b.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/continent/c.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/continent/d.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/continent/e.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/continent/f.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/continent/g.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/surfaces/surface_1.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/surfaces/surface_2.nbt create mode 100644 src/main/resources/data/unicopia/structures/cloud_islands/surfaces/surface_3.nbt create mode 100644 src/main/resources/data/unicopia/worldgen/structure/cloud_continent.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/a.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/b.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/c.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/d.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/e.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/f.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_island/large/g.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_islands/blobs.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/cloud_islands/surfaces.json diff --git a/src/main/resources/data/unicopia/structures/cloud_islands/blobs/blob_1.nbt b/src/main/resources/data/unicopia/structures/cloud_islands/blobs/blob_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..dcd83aa1f197301d52f185a5d20ecd5ce11555ad GIT binary patch literal 1847 zcmb7^4^Wb49LH_tnWs@pmuOnEKf2Zoio^vNYkF-fZ8!VJnxRBV4X17#Fe+)erss)y zQ7G6Ld@K+;tOtt*%fn|PYU7?!+r^sJ5w1Jt16zkHl&Y}Z&#~r zOZaEbhaM5sgk9I+M}OoB9+%S#J}qj!My7UiVhR$83-+$3U*A=Ipy12W*e-kW@&uOf zEhNt~q|hsbv@`~xC{N>(k|c>&)QSBy3{G7%+V*FwpZt-2oKx3)svT)vXY%%u`Rm&q zyd-gN1GkIvwC!Hy8S=$q7zrT}M6M!J!y0sc^SA-YP}o1@mG#yvcu;TFOrKTQ#V>Z* zv->=$cwXez7rP6^u}64VO<8L{o_AQ;!sw?bmRqu07+2snAf;RvjkbuV$sp}~ThWtu zKOX;b+ugi~Ihi62(hu5*WYKu0(e%SQEZfb&5j?%9G3&*m)oeG;Vx}w+!zl4-2o`ZO zww+V#sVBAFbv>l$XsKcr*1p8y&8%U_86^=7gqTNy{9$h&L8hW&vl-t+MEv!wdJtO0 zQR4bwQTRoezH>_!zUh7B<_A+}vuAJ9*pk&)c9>%!v-FryE({Ik)X~_b$2MWvrOF0( zW~uVh5QIYuvx-2)H!%^9knYf`ijw7!s09**OTjXU0G7!gXWdUvlMQ<_53?YRy@4R& z${8RM?BH1j>eR-uQD2xPAcm=@di2(Db_`ivw<@R%c zoCa1wDPW}oD{iGA1udY?2uoTC1;j)^s!k+LDh|?<+F)bq+w0kNw5-%e6ns<7O2OQ1 zn%NqUZ*ma*Vv;u5r*o^%Tw>`@wgZA$8ilnBpd^v07{(S%X%G01S3^{Jg!#Kuj12S& z6A=NrGLfl};6(*G;txhZYzAVx0Al`c(G!*)U>UCl7CFk|0G8o}Ok=7rv7bMLc<3iG z4w<}}ny4^Vrowjl5&>rt4Pc0V^IeNNnJ@OYw@VbZy1+ZlgRtR~`S>h+1sQg(D9RcH zyJ-LeQF$JaQ1dnL+3F}d5Xw=Z85Ody^D_0Wx6dhRZi5jWHNv4ren*2^>8Kiqs{K&4 z7i#JbrW3C~{ftn*l4+m_*8&Binw-Bwd1hh96m|rr_y`k0vlKMb=;?_T-fg)s;GPR7 z<e z=g`*wr9RKG|D`$!C@&7>^+S2R9Bpu%nuQFgjux#>0=UC?C$STj$_u^*&TrtzySnyL z4<1u$WrcAyD`#B$3cGJwl`2iy279`*c4G&1(5dNcR9RG-&Iu%&I&1@( z2B%cmrgS<-dL)6;QRH%mN+a#D%uGa8Y`FKh_Vi?J2cK`4U{nb$+90d8@Rp>t+nO@d zZx<$g-?vtfb3^dDkU2H_rh2x}qwC-r9PYi1LA`xi%hB`2wRnTWARQT*YHa7;ko9JH z&2?H_?-td}o{cXS&omBJo#;d6UM(ldW-S77o+&Nhai6L?t@pfRE?+3Rbtj*?jXgD%6u9atl|C}-N;_?I*bO=(WykQ?et}~*S*hh4J{RtsMv6yq N(Ft@)+&(wAKLC`Q(fa@Z literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/cloud_islands/continent/a.nbt b/src/main/resources/data/unicopia/structures/cloud_islands/continent/a.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7dfe8f15e1bc2f0d500c63590cf04d99fafa6efe GIT binary patch literal 32766 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