From e80c146727bce55e03b0dd3d4a34921d50874812 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 15 Jan 2021 18:07:55 +0300 Subject: [PATCH] Silk moth nest generation --- .../ru/betterend/blocks/BlockProperties.java | 1 + .../betterend/blocks/SilkMothNestBlock.java | 6 +- .../ru/betterend/entity/SilkMothEntity.java | 27 +++++++-- .../ru/betterend/registry/EndEntities.java | 1 + .../ru/betterend/registry/EndFeatures.java | 4 ++ .../world/biome/BiomeBlossomingSpires.java | 5 +- .../world/features/SilkMothNestFeature.java | 55 ++++++++++++++++++ .../betterend/blockstates/silk_moth_nest.json | 20 +++++-- .../block/silk_moth_nest_bottom_silk.json | 37 ++++++++++++ .../textures/minimap/entities/cubozoa.png | Bin 0 -> 1814 bytes .../textures/minimap/entities/dragonfly.png | Bin 0 -> 1860 bytes .../textures/minimap/entities/end_fish.png | Bin 0 -> 2040 bytes .../textures/minimap/entities/end_slime.png | Bin 0 -> 2048 bytes .../minimap/entities/shadow_walker.png | Bin 0 -> 1619 bytes .../textures/minimap/entities/silk_moth.png | Bin 0 -> 1648 bytes 15 files changed, 145 insertions(+), 11 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/SilkMothNestFeature.java create mode 100644 src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png create mode 100644 src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index f1c2f10a..27e13d36 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -15,6 +15,7 @@ public class BlockProperties { public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); public static final BooleanProperty NATURAL = BooleanProperty.of("natural"); + public static final IntProperty FULLNESS = IntProperty.of("fullness", 0, 3); public static enum TripleShape implements StringIdentifiable { TOP("top"), diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 6f502ded..f7e8cd62 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -21,6 +21,7 @@ import net.minecraft.sound.SoundEvents; 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.tag.BlockTags; import net.minecraft.util.BlockMirror; @@ -43,17 +44,18 @@ import ru.betterend.util.BlocksHelper; public class SilkMothNestBlock extends BaseBlock implements IRenderTypeable { public static final BooleanProperty ACTIVE = BlockProperties.ACTIVE; public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final IntProperty FULLNESS = BlockProperties.FULLNESS; private static final VoxelShape TOP = createCuboidShape(6, 0, 6, 10, 16, 10); private static final VoxelShape BOTTOM = createCuboidShape(0, 0, 0, 16, 16, 16); public SilkMothNestBlock() { super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sounds(BlockSoundGroup.WOOL).nonOpaque().ticksRandomly()); - this.setDefaultState(getDefaultState().with(ACTIVE, true)); + this.setDefaultState(getDefaultState().with(ACTIVE, true).with(FULLNESS, 0)); } @Override protected void appendProperties(StateManager.Builder stateManager) { - stateManager.add(ACTIVE, FACING); + stateManager.add(ACTIVE, FACING, FULLNESS); } @Override diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index dc1169de..75085238 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -1,6 +1,7 @@ package ru.betterend.entity; import java.util.EnumSet; +import java.util.Random; import org.jetbrains.annotations.Nullable; @@ -8,6 +9,7 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.EntityType; import net.minecraft.entity.Flutterer; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.SpawnReason; import net.minecraft.entity.ai.TargetFinder; import net.minecraft.entity.ai.control.FlightMoveControl; import net.minecraft.entity.ai.control.LookControl; @@ -33,11 +35,15 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.World; +import net.minecraft.world.Heightmap.Type; import ru.betterend.BetterEnd; +import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.SilkMothNestBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; +import ru.betterend.util.BlocksHelper; public class SilkMothEntity extends AnimalEntity implements Flutterer { private BlockPos hivePos; @@ -146,6 +152,11 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { return EndEntities.SILK_MOTH.create(world); } + public static boolean canSpawn(EntityType type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { + int y = world.getChunk(pos).sampleHeightmap(Type.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); + return y > 0 && pos.getY() >= y; + } + class MothLookControl extends LookControl { MothLookControl(MobEntity entity) { super(entity); @@ -206,7 +217,7 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { @Override public boolean shouldContinue() { - return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir(); + return SilkMothEntity.this.navigation.isFollowingPath() && world.getBlockState(entrance).isAir() && world.getBlockState(hivePos).isOf(EndBlocks.SILK_MOTH_NEST); } @Override @@ -216,7 +227,7 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { SilkMothEntity.this.hivePos = null; } try { - entrance = SilkMothEntity.this.hivePos.offset(state.get(SilkMothNestBlock.FACING)); + SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.offset(state.get(SilkMothNestBlock.FACING)); SilkMothEntity.this.navigation.startMovingAlong(SilkMothEntity.this.navigation.findPathTo(entrance, 1), 1.0D); } catch (Exception e) {} @@ -229,8 +240,16 @@ public class SilkMothEntity extends AnimalEntity implements Flutterer { double dy = Math.abs(SilkMothEntity.this.entrance.getY() - SilkMothEntity.this.getY()); double dz = Math.abs(SilkMothEntity.this.entrance.getZ() - SilkMothEntity.this.getZ()); if (dx + dy + dz < 1) { - SilkMothEntity.this.world.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BLOCK_BEEHIVE_ENTER, SoundCategory.BLOCKS, 1, 1); - SilkMothEntity.this.remove(); + BlockState state = SilkMothEntity.this.world.getBlockState(hivePos); + if (state.isOf(EndBlocks.SILK_MOTH_NEST)) { + int fullness = state.get(BlockProperties.FULLNESS); + if (fullness < 3 && SilkMothEntity.this.random.nextBoolean()) { + fullness ++; + BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state); + } + SilkMothEntity.this.world.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BLOCK_BEEHIVE_ENTER, SoundCategory.BLOCKS, 1, 1); + SilkMothEntity.this.remove(); + } } } } diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 3da97dc8..d89d2d46 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -36,6 +36,7 @@ public class EndEntities { SpawnHelper.restrictionWater(END_FISH, EndFishEntity::canSpawn); SpawnHelper.restrictionLand(SHADOW_WALKER, ShadowWalkerEntity::canSpawn); SpawnHelper.restrictionWater(CUBOZOA, CubozoaEntity::canSpawn); + SpawnHelper.restrictionAir(SILK_MOTH, SilkMothEntity::canSpawn); } protected static EntityType register(String name, SpawnGroup group, float width, float height, EntityFactory entity) { diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index f1fa80a4..da3e61c1 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -24,6 +24,7 @@ import ru.betterend.world.features.HydraluxFeature; import ru.betterend.world.features.LanceleafFeature; import ru.betterend.world.features.MengerSpongeFeature; import ru.betterend.world.features.OverworldIslandFeature; +import ru.betterend.world.features.SilkMothNestFeature; import ru.betterend.world.features.SingleInvertedScatterFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.UnderwaterPlantFeature; @@ -155,6 +156,9 @@ public class EndFeatures { // Buildings public static final EndFeature CRASHED_SHIP = EndFeature.makeChansedFeature("crashed_ship", new CrashedShipFeature(), 500); + // Mobs + public static final EndFeature SILK_MOTH_NEST = EndFeature.makeChansedFeature("silk_moth_nest", new SilkMothNestFeature(), 2); + public static void registerBiomeFeatures(Identifier id, Biome biome, List>>> features) { if (GeneratorOptions.removeChorusFromVanillaBiomes()) { if (id.getNamespace().equals("minecraft")) { diff --git a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java b/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java index 69aed399..08630fbf 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/BiomeBlossomingSpires.java @@ -2,6 +2,7 @@ package ru.betterend.world.biome; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; @@ -25,6 +26,8 @@ public class BiomeBlossomingSpires extends EndBiome { .addFeature(EndFeatures.BLOSSOM_BERRY) .addFeature(EndFeatures.TWISTED_MOSS) .addFeature(EndFeatures.TWISTED_MOSS_WOOD) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + .addFeature(EndFeatures.SILK_MOTH_NEST) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) + .addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); } } diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java new file mode 100644 index 00000000..a66d8862 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -0,0 +1,55 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; +import net.minecraft.tag.BlockTags; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.world.Heightmap; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.registry.EndBlocks; +import ru.betterend.util.BlocksHelper; + +public class SilkMothNestFeature extends DefaultFeature { + private static final Mutable POS = new Mutable(); + + private boolean canGenerate(StructureWorldAccess world, BlockPos pos) { + BlockState state = world.getBlockState(pos.up()); + if (state.isIn(BlockTags.LEAVES) || state.isIn(BlockTags.LOGS)) { + state = world.getBlockState(pos); + if ((state.isAir() || state.isOf(EndBlocks.TENANEA_OUTER_LEAVES)) && world.isAir(pos.down())) { + for (Direction dir: BlocksHelper.HORIZONTAL) { + if (world.getBlockState(pos.down().offset(dir)).getMaterial().blocksMovement()) { + return false; + } + return true; + } + } + } + return false; + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + int maxY = world.getTopY(Heightmap.Type.WORLD_SURFACE, center.getX(), center.getZ()); + int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); + POS.set(center); + for (int y = maxY; y > minY; y--) { + POS.setY(y); + if (canGenerate(world, POS)) { + Direction dir = BlocksHelper.randomHorizontal(random); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.getDefaultState().with(Properties.HORIZONTAL_FACING, dir).with(BlockProperties.ACTIVE, false)); + POS.setY(y - 1); + BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.getDefaultState().with(Properties.HORIZONTAL_FACING, dir)); + return true; + } + } + return false; + } +} diff --git a/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json b/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json index 332f6ffc..41975436 100644 --- a/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json +++ b/src/main/resources/assets/betterend/blockstates/silk_moth_nest.json @@ -1,9 +1,21 @@ { "variants": { "active=false": { "model": "betterend:block/silk_moth_nest_top" }, - "active=true,facing=north": { "model": "betterend:block/silk_moth_nest_bottom" }, - "active=true,facing=south": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, - "active=true,facing=east": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, - "active=true,facing=west": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 } + "active=true,facing=north,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=0": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=1": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom" }, + "active=true,facing=south,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 180 }, + "active=true,facing=east,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 90 }, + "active=true,facing=west,fullness=2": { "model": "betterend:block/silk_moth_nest_bottom", "y": 270 }, + "active=true,facing=north,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk" }, + "active=true,facing=south,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 180 }, + "active=true,facing=east,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 90 }, + "active=true,facing=west,fullness=3": { "model": "betterend:block/silk_moth_nest_bottom_silk", "y": 270 } } } diff --git a/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json b/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json new file mode 100644 index 00000000..7635ef7e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/silk_moth_nest_bottom_silk.json @@ -0,0 +1,37 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/silk_moth_nest_side", + "texture": "betterend:block/silk_moth_nest_side", + "top": "betterend:block/silk_moth_nest_top", + "front": "betterend:block/silk_moth_nest_front_silk" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 0, 0 ], + "to": [ 16, 13, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 3, 16, 16 ], "texture": "#front", "cullface": "north" }, + "south": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "south" }, + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "west" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture", "cullface": "east" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 12, 3 ], + "to": [ 13, 16, 13 ], + "faces": { + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "south": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "west": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" }, + "east": { "uv": [ 3, 0, 13, 4 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png b/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png new file mode 100644 index 0000000000000000000000000000000000000000..68b94dcc98e173be5fe7418983365af5786a9dc8 GIT binary patch literal 1814 zcmbVNZEO=|9KUVavEdvtKTHGeyv+r~>%H{#&UK?}$GS-O+GJZywq2il+FjP(op-mj zTjJ(evdsitG-43c1oAx(>pge< z{eS=e@Bh|UJKI|;%AYL9Fs!02;O|Cv+`Kke(6>G@@jJSeseyhS!!}l#R}psL-D(Vb zct#5K8GXUsJW%3RK~%!fnvAOmjbRNK7*oToOG*uOmnYRUaId z0uvhSnP?Azi4nkwL{lT)kmM0T92x?ijK^f1PkM+9FOSaVYl^@#5M#tccuj|RU$7JR zDH_BbRwoGPsB@zj1!e&*pD8+CbN6{?BvLr%~`nYTeNmABp^9+8d15Hv5Ns)1rQ3xxehKE3r zW+lYc0?Y3aM_WE2A2KEn~=It*J)keHs)DMGGlP zEMKV3ygc0JGYjL!xAjW0s3i35ci2F`U_cMS(kz2YMly~NZ9Gk9p+VFN zqF@O32UbKWGX9^?LVkIl5>vFGBBD5K1TF$TqG)je z`8@=ZZIvXEx7it%35yIV0w*A8&JIW}!U`lOiZ&+f0AV)(d3(PCM$J0q?Zy9T-=Rrp zxP;gP^PnO4OLv~dixlaodU|d|nuTcY6q6cFnP!-Fr^6m`3vMLS;Ut}QyA#P|93*62 zg3IRQ95fIbD03c=5uQC|iKu&f%ycOqkjx0ibAEf^ON9vVOk?r_FbB><0JGDeNaS8i z4_uKfZDJTA(tEUD7N#o^BOz$e8%5Q-pAM(;Imk+({;4vPsXI1F9*)+Nc`WQj^ibHW zP)6%iLwmDyuH`z06>)8TZ>TQ?)^Fc#O6@GJpDnT+ezbaY@kmMEhVApr!3t`dv6Mcy z(mU`&bJyGp@~MwPUme<7{7qx}@pC(Wd*m1qQ%}`Pi*NR9-aWIPB9|?Z zsh6*Bv{qi@0#|-K_2DM(z<}k6{;r>PO@F=^o$WZ|rngv1R$t%4jjgs$PjfZc*s=P8aK>at`N+!I!SmtEo7Yoy<&$6DnBRBvLhaJUEyZV5&N%+`W5s)y zPL#bUPZsYu+I11s&2@}(i{G{%_$<)bWPkQ>V(^_`*EYSjaOnN+(oc@tRzAhvTR1kk v+UlJvx79Y*d~of%?<;R=LnrzhKi-OAbxEn^p)@;U{&TgpwEK@W5AFFArtf0~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png b/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png new file mode 100644 index 0000000000000000000000000000000000000000..c26c6f9ecdcc8a63073eb73c1960f75a3e1898cd GIT binary patch literal 1860 zcmbVN3v3f*9KX6j$LL@JhB6j*+$3nAy}Pz+>9JC_7HPveCX_Hxpx3)^>#??X+}&u` zjchn0AQ%Wf647K^ltd-IB2f%cK;~S838)DnWIU3Q4Frd>jPY>icU{{UgNj`8y?@{D z|NQ>9qpEUgUT#4yf*^Tbk9!3iQMKiahrN_Y48dW7;8`Of$i%5?(;)la)+0#vEzVyp zSNkd`hL0F&mJb4BJR(3ef|NSr0?pI`84ZG3F6zJr4KHqVITxX&aS9SdfJ~$DNH{7{aR-*F%B+CMY zQxyX(N#g zT9TJ+h8m@8dmvi!HwXY<0VKX&WWbWmP-1afF(JguycFX9!H&#v#u|ZgiGY@Q(a-bY zbfBuzEU3$+24(^J)M_ru@-gXYRZ!{vmvJRU^l-6kq{i zrfoq(4O>GP2#bX=1g(tSV71cffr$<-u%z$1d8S?sV){P&KkqLWIrxa^@T2o&f<(Fa zFfaOe7JAvNrf@QqC=VyWcr~OR#Y(U#H4AfSGJ7bRQ4`#OF=}K1i>0=?NA}DZZ7c*J z>A!?~3?}h4a*P&1SuOP9!(zWWmbKC1K^H(2d?kkG(_~OU9p4IN6TBc|#0)Y`_lE6Z79}~=;={T?kmlA%~Aq~)^?oqtkT9WH2&Upc^sbA+F3hZSMc88 z@UIt@tkV6*Hrk4sj!#>yLW1@MyJfVpfryTPHug2>cp(scdzDEezJ&rWl-07jc%IVog*Vx zxTF0)Z&M1UJRcaoVRP!O1;3ra^GetD9PK`FVx(==n_0o`TNicwhEe*piTlyK_UF1g zlo_)=9vIra)ALd*@_u4ZVfN;h{!e!+W&3t`7Y|r+_I#jqw-z4keYx%N>&T5C=IVwU z=DX)E%HQ(gAM>(Ad;1$FDi5yD-y-~2)OFyBsc&w1RbA-pndO1c-zq6`X^YIo>z0*Q zH45L3+n$B#M)bMe;puyCAiZ;V<+EJ#)^kTLjxvV|i%)uPe;+!yfw+cjM38rWIdHo1 Sn}L}6pYtxMbbnMHc;Qbun3enh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png b/src/main/resources/assets/betterend/textures/minimap/entities/end_fish.png new file mode 100644 index 0000000000000000000000000000000000000000..6884a71d5b15014583e6dc1f9bd941d46ab0712c GIT binary patch literal 2040 zcmbVN4Qvx-7{2{NH_-*fYy)qG(+}b;OH`? zpZ9&2f2F?uIy~v*(!~mbdQTReKpSrScwCj8f76t5U3m)4c3GdHfqNbyewR6w+ReQK-6kGHeCydR=O)t zrxXUL*{7AwnCZu%Dn9h9O8JVKm|pfh%<(m5bsbrFewF1r$Ck%Bm=ZP>qrEO0}vT zgGz@}2+AqikdiDDEEo~xWP&n~T1p9^z^8C>ZMY^8T;K^%1A-u=DiBMhuyR0BB_$x; zhdTB6jsUQKBP2L5e8P-?j(1I2G72BWa|dWjIB9C>wN*r7e?5nkC6$ zs9O?5U)^0$vxl;>W-CjZ?|{Ot5jd6mPq4tVJ}DgJV9sKY^8-Q-`7tzAN!BUVNMRTl zs-qJs+-|lkq^Mko2W2ih2Gcf(qQEkYS@7{D68BQP4>tn1VmO$J&1bflDGHc4pJ`;j zOX6!abG7}$eJ)5m0SiHE^N?CB4G?{RYvzc&#F;g_n2*7JivCR#O@Kxh# zZfDh036Rmt(>|Iq^04B61&|h#*3gL_VM|2?x>uKcMHYY+ z$yJSrCfb7Kc&**-7_a#Z1T1-5yhlAADspmvBmf}k1I!%y7x^&c#mrGI1B=HtDmuiUKqx&=9T{HgRU7kj#1dGguJTZ6u7x=q`@ zEOK=2yM$buWPYjX*Vbc&Bwo~>5kI=1Vcv}1&Yn}wDPtPyt`_tv1KoQ%$=?MU}~3)89w zy0@Lx4>XDC_A`&%$g4Wh(*J$W>s3GK_l}wv8T=#jq@iSa+uH5LZynJWS+2kMsWi7_ zcR%OghB9@9L0;V6(AL*g_S)dqwyFWypZ)5r$pstBN4FzWnx9$Lm@`M&)W3Vr`bo2k zChk1knjKpm_3C23RG15T51qSq;b{BKg~yNOebqegQf9pKlXYLr?c0?R&#FX=uKsy` z{1eUm-tiljFi4iva(Ugrgt6&;j>fF+K55sw)8mY99^^v0_|h%E9XP$Yw6-Hpd<>~3 zTHAkG)mgM+vOYJyI14>=-un6PmFEkyyUu2iP5YLT`fg;;#Ez?vP8hq~;oMfTXGc4# zukINA(YOOQ0^U_`)82jNjpc>;mt$MlrXLZ6-MT-`=q&wE`!<)&EO)ics9O6sVoAR+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png b/src/main/resources/assets/betterend/textures/minimap/entities/end_slime.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9ab7e8566c4c344187eb41420f2998bbfc8556 GIT binary patch literal 2048 zcmbVNdr%a09A7|4QIbJ4hf3FFsPnP6xA%fwIRx*NLpf3&0r{w9_jj;yw|nd^+yNmf zPGT{o4MSstMIud(h&tLZh7(LaQX3yMj+$Bik=lb44IOn%?6=3=WsRA6Gkg2nz0dda z{eHf$Tem1DGbTDA8bOelEW0fi-cj`$9RKvbkVatJnmVi=Tuwa8dy%@@K7Oc?Z&^bI-P{!M9 zB#>8=lh4+avlNHTNkdb8G$e2Xg+YC8mmt$V3+Csg;aPo6V5lFWlv}V2)gfBsScFFy#}o)l@cUHQG`xU==C^6;BvK~Fg{$66N3ykAhQzhQFu{6RYs;ntW+!* zjC4eT+Y_P{5yyteJ(ZHnA2G)gzy;hu zP-KWDLk?hS9gYzEp|QB#A+)T_tAa8D33(`5&ad_WA{WSFrNn}HRnTLis>VZGCBP`6 zlrM^|V4)TT<)K!qT9_16Q^*UP=#{5GU;}K70xXzbrzc^_aMF}dCetP}Z8FW&8EBnu z1nPjTz%dH*cwmv^oz?#d4ds`%iY`%dh#ZW=fT0{qJ4MOOz+CWdrW6n!q0}FR!$D^W zvcd=~$g){5C|k?(99=>>*%Bwk;UonZTu&JpoFdK1xY-C;lOfq?HXHRpdz;8ss&xw5 zbN|!+C5eZ_#kiiB2M)nsx`QkkP>~F)CkIAkE>jvfx%f0yrWz&#ND}~53a)1XiF3(D zfK!~4!+{fuHv-0-!Z4|XIuFnY9XX8<5s&uh?^4>%s}WQO{N{m*Pz0#IF=>WX2hM`A zYNr7X3%ur^xFRF8-ZB75AJKjzFj;geUPb~LrLcOB)8Rxg2P0C5f2#Cn>VZuXgv0fu z9z%N(K7=+a5a2qM;NGlz@7x{)2~W(jW#kv_ztYnC&IB^{kXsyXZ&Q@!Rt?slk=dY0 z`C--NSh3G~ZQQ=7W2Sv!jnQw}Plm-sE^fX*U>bTh^~L7P*uihI%JAYJZ_-0`L&tpP zw2q5{G|IcbJ?Ugz*%+m3wr*p#cGtko&ktR#>WNxXP;m70rMh>Y9~YI7zwFGfwY?YS zSk|Rio%RjpC0aYB~0}3sqJV#I4 z+`r@HnSG1XFYKE1*?E___RQcd>xKkW!X~bbMt0h_^$#^&xmmMdb=~PdI_)us8#Rst z^$adU(*yH-S%|%s@>;D4UErh?z_GzHodQLQe5_yH{)|7 zj?eyNgJv_**HU;o<*E4EpYFNqZr!^s7OWaxnY+HBx$;O{v=8Y#vc7y_OvIhAh_hWU zICeLNhrd!0gGaV_SEhY`zoYPY=3vX$9dT=x3d@(j-Zn!Td!RTycT4x?h|!)8w`;DP zW5AS-uHLI%(PxvUqSP~Tt^4;CH2RCdcX(@3P2)$yrUP5ES7xofWCmFM-O8rnwyvX^ llfy~nWA=<1t_`n8PVBW+zdE&|QT>n3nwMkin)}-7KLHQ~)Y1R| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png b/src/main/resources/assets/betterend/textures/minimap/entities/shadow_walker.png new file mode 100644 index 0000000000000000000000000000000000000000..56de0661ad600c71033acc6a25bed0e191a2c9a6 GIT binary patch literal 1619 zcmbVNTWl0n7@mqW7APX9k>bN-+6S=Ao|)O}j2&RvZS5MSwq;|Nm;kdgXLl#vnKRDJ zvKLW_l4u_^czHmhybvGSG&R*KF(Ps)m}t=_^##RZ2ogn8U890T&+KJl3@S3onRCvZ z?|lFLpRvJ#``VXuEFlP@J<%T@#xv=TTUznku2iacYBT${*#xn4l{;F9mtVPyAa4Fi zOQxKZv_(*m?vquNhQ5++Vl+YYY%H0wG723s4YQgdQa`-=K1FJ(NR0#~MlxeCr}bAX zxV18nR4StiuTmQ~kUb><6X?*9$&#KoY@sAlHC_R)-Oqp`YY=Btq@u1sG9?X?F=Rn9 z=nK&b8{o(=?_)y@&jr?#9K(hI69%lGW>|p<34WezJQS8@sTpB7-q(3faQ4}FdX1G8Y5`CY&dd>HtfzOLmb+QrJ0U~4ANzk)2QHx6xOtEf^K@W zhTU)zb{HthCSZMxYf=rUDjv=(SoxZ8RRJ&$b!a#?#?=GxS z!?tUp?PS@6U>Mq{U@5S77na!BRLsmF2iZCF4|aIRo;9Wrv!LuCD~V9P8K}V~3mJ>K zfr*f7M>Io4MSGnqsBs6zWe18B$8anT8O;WhY*+{~0>^bTet}`?Pzk4kDm(J^fsv|Z z%Kr&f6(NHxUB-^mbU6!wX=H2CBuPjZwj&z~OvFVBtLoDh;4A3b}5T(-AoPxZMkuKocgE2;67bo;HZ&+ea!{G3{R465l~zoP7mcWrp5bz%O~ zHs_{Sk5+y2Gml+}-nRQgc4#g)vw5z}rq5p4w=gPZ4{rz7+2ymuc{cje?JKHhcAuYR zKKcE<$nzZ+Td1|GyJob-udVs~^8DNP?6@;=EPQU$_`>6b=@%!yu1@g3JZ(P{`Rc%$ z?l)GCEIgSycG{19M z*O!;XgKr(WoHS35p{GvHT`@NudE}1nN4v=G`)9?W@AnQ)9@qBw9a#EJ%Z14^hZbE; fe1`2fz3SIRGvjI`v%P}<4g`_t9f(hD-uc9z-pU?9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png b/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png new file mode 100644 index 0000000000000000000000000000000000000000..5dacaa25b900b7f919ea204387abf57075a2c281 GIT binary patch literal 1648 zcmbVNe`p(39KW_(*VeUA26h(5o|m#!>gC=gO_RLt8f(%nfu+_ovaUkin&-eHDo*5k2-`LRFz%Wc>Bpiy-8Q7z)mcGsD=`}jl>)}Ht!`!jM9#zasuk2)) zEx)SqVQV;g0LdidloXP{&Rj;PXolGr$mxytLGP4peiDJ&=ZAGJ&03k zc-p{2(*tpNdR+D^Y@i41%OOgT!IlJanY3o2oX8e<5nbD#c@`8P*0{*_+5*9FbPxoI zfq}=_#mPda3wZrbp$qz5o%aD36udn2@`9U#0)k!0?FXfYrP2%~iDIGtk}SFt*_37J zi08A}tTXF&5@U=P{C+$_Z^`U9c9Jz6tRezBL84V<+x&vj)Df3EMmk7NtXjP zSY`pipdA<=Xg{cG3dx%H+JZ`Va7ePS$hx3QpdsS~Ph9Y#P9O4gbwD?Qun3LPR8S;K zx-~FS)a2BELKPV$iII`0qtuKvhIw5ZD@cn*QA9H>Nt1CTB(hXhr>ZJQ@%rQ>Ovqd^ z30<7a(}_8s7t$P5+=84?e4a#?uY5m5}917(M_e3VU4yggZ8Ok9zEq{ zm?}pk)EghZC~s_T1}@%Tz2{g}?QGM|$)$XEe(P&je_r`;X=?4p%U{BK`XkMw$HZTIqfKLkGi z7Kq^E@ay|W>mJ|uy+s3c`R$jMk8ck8&yAcOeRjw4$sux~^XV61?+4HW#phAJ`Odl3 zrk>>Wjg@URZ@t?-a0&QlT4zS)+U2(HmZiI^wvXsDn?38T>H50B`Ri+ek5-`Po%!k? z8~Pu6q2`35Oq^YV&&77luD7<#e0^%qcNg0H;2YGuaPI8eO??Zq^Yvf6`lQw4c=+;D zUtLZubvUeR*S>f7)_*&B#kbNwo1gn6@&2KnpYjiFJAn?L*~Kv3M~y}OjZf$8e?p{h LAhhtn;iG>7PG2G` literal 0 HcmV?d00001