From d28d4b7461917bab5a16ec5e66847730cb56a4d0 Mon Sep 17 00:00:00 2001 From: FatherToast Date: Tue, 16 Aug 2022 17:40:13 -0500 Subject: [PATCH 01/10] frozen/tropical drowned + more polish --- .../common/bestiary/BestiaryInfo.java | 28 ++- .../common/bestiary/MobFamily.java | 43 ++++- .../common/config/field/DoubleField.java | 5 +- .../common/core/SpecialMobReplacer.java | 41 ++++- .../specialmobs/common/core/SpecialMobs.java | 39 ++-- .../specialmobs/common/entity/MobHelper.java | 44 ++++- .../cavespider/FireCaveSpiderEntity.java | 3 +- .../cavespider/WebCaveSpiderEntity.java | 5 +- .../entity/creeper/DirtCreeperEntity.java | 3 +- .../entity/creeper/DrowningCreeperEntity.java | 9 +- .../entity/creeper/SnowCreeperEntity.java | 4 +- .../entity/drowned/BruteDrownedEntity.java | 2 +- .../entity/drowned/FishingDrownedEntity.java | 2 +- .../entity/drowned/FrozenDrownedEntity.java | 166 ++++++++++++++++++ .../entity/drowned/GiantDrownedEntity.java | 2 +- .../entity/drowned/HungryDrownedEntity.java | 2 +- .../entity/drowned/PlagueDrownedEntity.java | 4 +- .../entity/drowned/TropicalDrownedEntity.java | 76 ++++++++ .../entity/enderman/FlameEndermanEntity.java | 6 +- .../entity/spider/FireSpiderEntity.java | 3 +- .../common/entity/spider/WebSpiderEntity.java | 5 +- .../entity/zombie/HuskZombieEntity.java | 4 +- .../textures/entity/drowned/frozen.png | Bin 0 -> 665 bytes .../entity/drowned/frozen_overlay.png | Bin 0 -> 1334 bytes .../textures/entity/drowned/tropical.png | Bin 0 -> 665 bytes .../entity/drowned/tropical_overlay.png | Bin 0 -> 1334 bytes 26 files changed, 446 insertions(+), 50 deletions(-) create mode 100644 src/main/java/fathertoast/specialmobs/common/entity/drowned/FrozenDrownedEntity.java create mode 100644 src/main/java/fathertoast/specialmobs/common/entity/drowned/TropicalDrownedEntity.java create mode 100644 src/main/resources/assets/specialmobs/textures/entity/drowned/frozen.png create mode 100644 src/main/resources/assets/specialmobs/textures/entity/drowned/frozen_overlay.png create mode 100644 src/main/resources/assets/specialmobs/textures/entity/drowned/tropical.png create mode 100644 src/main/resources/assets/specialmobs/textures/entity/drowned/tropical_overlay.png diff --git a/src/main/java/fathertoast/specialmobs/common/bestiary/BestiaryInfo.java b/src/main/java/fathertoast/specialmobs/common/bestiary/BestiaryInfo.java index b0764f3..b93e98e 100644 --- a/src/main/java/fathertoast/specialmobs/common/bestiary/BestiaryInfo.java +++ b/src/main/java/fathertoast/specialmobs/common/bestiary/BestiaryInfo.java @@ -43,16 +43,31 @@ public class BestiaryInfo { NONE( new EnvironmentList() ), FIRE( new EnvironmentList( EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).inUltraWarmDimension().build(), - EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).isRaining().canSeeSky().notInDryBiome().build(), EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).isHot().build(), EnvironmentEntry.builder( DefaultWeight.HIGH.value ).isWarm().build(), - EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).isFreezing().build() + EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).isFreezing().build(), + // Regular frozen ocean is actually freezing, so already covered + EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).inBiome( Biomes.WARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).inBiome( Biomes.DEEP_WARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.HIGH.value ).inBiome( Biomes.LUKEWARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.HIGH.value ).inBiome( Biomes.DEEP_LUKEWARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.LOW.value ).inBiome( Biomes.COLD_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.LOW.value ).inBiome( Biomes.DEEP_COLD_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).inBiome( Biomes.DEEP_FROZEN_OCEAN ).build() ) ), ICE( new EnvironmentList( EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).inUltraWarmDimension().build(), EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).isFreezing().build(), EnvironmentEntry.builder( DefaultWeight.LOW.value ).isWarm().build(), - EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).isHot().build() + EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).isHot().build(), + // Regular frozen ocean is actually freezing, so already covered + EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).inBiome( Biomes.DEEP_FROZEN_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.HIGH.value ).inBiome( Biomes.COLD_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.HIGH.value ).inBiome( Biomes.DEEP_COLD_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.LOW.value ).inBiome( Biomes.LUKEWARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.LOW.value ).inBiome( Biomes.DEEP_LUKEWARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).inBiome( Biomes.WARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.LOWEST.value ).inBiome( Biomes.DEEP_WARM_OCEAN ).build() ) ), DESERT( new EnvironmentList( EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).inUltraWarmDimension().build(), @@ -89,6 +104,13 @@ public class BestiaryInfo { EnvironmentEntry.builder( DefaultWeight.HIGH.value ).isRaining().build(), EnvironmentEntry.builder( DefaultWeight.LOW.value ).cannotSeeSky().build() ) ), + TROPICAL( new EnvironmentList( + // All ocean biomes (except regular frozen ocean) have the same temp of 0.5, so we must call out specific biomes + EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).inBiome( Biomes.WARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).inBiome( Biomes.DEEP_WARM_OCEAN ).build(), + EnvironmentEntry.builder( DefaultWeight.DISABLED.value ).isFreezing().build(), + EnvironmentEntry.builder( DefaultWeight.DISABLED.value ).inBiome( Biomes.DEEP_FROZEN_OCEAN ).build() + ) ), FISHING( new EnvironmentList( EnvironmentEntry.builder( DefaultWeight.HIGHEST.value ).inWaterBiome().build(), EnvironmentEntry.builder( DefaultWeight.HIGH.value ).atMaxMoonLight().build(), diff --git a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java index d4db547..7579c65 100644 --- a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java +++ b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java @@ -13,6 +13,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.monster.*; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.ForgeSpawnEggItem; import net.minecraftforge.fml.RegistryObject; @@ -20,6 +21,7 @@ import net.minecraftforge.fml.RegistryObject; import javax.annotation.Nullable; import java.util.*; import java.util.function.Function; +import java.util.function.Predicate; /** * Special mobs are broken up into distinct 'families', each of which correspond to a type of vanilla mob that can be @@ -50,7 +52,7 @@ public class MobFamily { ); public static final MobFamily DROWNED = new MobFamily<>( FamilyConfig::new, "Drowned", "drowned", 0x8FF1D7, new EntityType[] { EntityType.DROWNED }, - "Abyssal", "Brute", "Fishing", /*"Frozen",*/ "Giant", "Hungry", "Knight", "Plague"//, "Tropical" + "Abyssal", "Brute", "Fishing", "Frozen", "Giant", "Hungry", "Knight", "Plague", "Tropical" ); //TODO Textures! - brute, hungry, plague, frozen, tropical public static final MobFamily ZOMBIFIED_PIGLIN = new MobFamily<>( FamilyConfig::new, "ZombifiedPiglin", "zombified piglins", 0xEA9393, new EntityType[] { EntityType.ZOMBIFIED_PIGLIN }, @@ -169,6 +171,9 @@ public class MobFamily { /** This family's config. */ public final V config; + /** True if this family has any giant species. */ + private Boolean hasAnyGiants; + private MobFamily( Function, V> configSupplier, String familyName, String readableName, int eggColor, EntityType[] replaceable, String... variantNames ) { @@ -196,17 +201,34 @@ public class MobFamily { } /** Pick a new species from this family, based on the location. */ - public Species nextVariant( World world, @Nullable BlockPos pos ) { - return nextVariant( world, pos, null, vanillaReplacement ); + public Species nextVariant( World world, @Nullable BlockPos pos, @Nullable Predicate> selector ) { + return nextVariant( world, pos, selector, vanillaReplacement ); } /** Pick a new species from this family, based on the location. */ - public Species nextVariant( World world, @Nullable BlockPos pos, @Nullable Function, Boolean> selector, Species fallback ) { + public Species nextVariant( World world, @Nullable BlockPos pos, @Nullable Predicate> selector, Species fallback ) { final Species species = config.GENERAL.specialVariantList.next( world.random, world, pos, selector ); //noinspection unchecked return species == null ? fallback : (Species) species; } + /** + * @return True if this species is NOT taller (in block height) than the base vanilla entity. + * Used to reduce likelihood of suffocation due to Mob Replacement. + */ + public boolean hasAnyGiants() { + if( hasAnyGiants == null ) { + hasAnyGiants = false; + for( Species species : variants ) { + if( !species.isNotGiant() ) { + hasAnyGiants = true; + break; + } + } + } + return hasAnyGiants; + } + //--------------- Species Instance Implementations ---------------- @@ -250,6 +272,8 @@ public class MobFamily { /** This species's config. */ public final SpeciesConfig config; + /** True if this mob is NOT taller (in block height) than the base vanilla entity. */ + private Boolean isNotGiant; /** The scale of this species's height in relation to the base vanilla entity's height. */ private float heightScale = -1.0F; @@ -331,6 +355,17 @@ public class MobFamily { ConfigUtil.camelCaseToLowerSpace( specialVariantName ) + " ") + ConfigUtil.camelCaseToLowerSpace( family.name ); } + /** + * @return True if this species is NOT taller (in block height) than the base vanilla entity. + * Used to reduce likelihood of suffocation due to Mob Replacement. + */ + public boolean isNotGiant() { + if( isNotGiant == null ) { + isNotGiant = MathHelper.ceil( entityType.get().getHeight() ) <= MathHelper.ceil( family.replaceableTypes[0].getHeight() ); + } + return isNotGiant; + } + /** @return The height scale. Used to calculate eye height for families that are not auto-scaled. */ public float getHeightScale() { if( heightScale < 0.0F ) { diff --git a/src/main/java/fathertoast/specialmobs/common/config/field/DoubleField.java b/src/main/java/fathertoast/specialmobs/common/config/field/DoubleField.java index 70e16fd..8d254b3 100644 --- a/src/main/java/fathertoast/specialmobs/common/config/field/DoubleField.java +++ b/src/main/java/fathertoast/specialmobs/common/config/field/DoubleField.java @@ -11,6 +11,7 @@ import java.util.Collections; import java.util.List; import java.util.Random; import java.util.function.Function; +import java.util.function.Predicate; /** * Represents a config field with a double value. @@ -219,13 +220,13 @@ public class DoubleField extends AbstractConfigField { /** @return Returns a random item from this weighted list. Null if none of the items have a positive weight. */ @Nullable - public T next( Random random, World world, @Nullable BlockPos pos, @Nullable Function selector ) { + public T next( Random random, World world, @Nullable BlockPos pos, @Nullable Predicate selector ) { // Due to the 'nebulous' nature of environment-based weights, we must recalculate weights for EVERY call final double[] weights = new double[UNDERLYING_LIST.size()]; double targetWeight = 0.0; for( int i = 0; i < weights.length; i++ ) { final Entry entry = UNDERLYING_LIST.get( i ); - if( selector == null || selector.apply( entry.VALUE ) ) { + if( selector == null || selector.test( entry.VALUE ) ) { targetWeight += weights[i] = entry.WEIGHT.get( world, pos ); } } diff --git a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobReplacer.java b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobReplacer.java index d0e75b8..7f19c1a 100644 --- a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobReplacer.java +++ b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobReplacer.java @@ -7,7 +7,10 @@ import fathertoast.specialmobs.common.util.References; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.world.IServerWorld; import net.minecraft.world.World; import net.minecraftforge.event.TickEvent; @@ -19,12 +22,20 @@ import net.minecraftforge.fml.common.Mod; import javax.annotation.Nullable; import java.util.ArrayDeque; import java.util.Deque; +import java.util.function.Predicate; @Mod.EventBusSubscriber( modid = SpecialMobs.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE ) public final class SpecialMobReplacer { /** List of data for mobs needing replacement. */ private static final Deque TO_REPLACE = new ArrayDeque<>(); + /** Returns true if the species is not damaged by water. */ + private static final Predicate> WATER_INSENSITIVE_SELECTOR = + ( species ) -> !species.config.GENERAL.isDamagedByWater.get(); + /** Returns true if the species's block height is less than or equal to the base vanilla entity's. */ + private static final Predicate> NO_GIANTS_SELECTOR = MobFamily.Species::isNotGiant; + + /** * Called when any entity is spawned into the world by any means (such as natural/spawner spawns or chunk loading). *

@@ -123,7 +134,9 @@ public final class SpecialMobReplacer { // Don't copy UUID tag.remove( "UUID" ); - final MobFamily.Species species = isSpecial ? mobFamily.nextVariant( world, entityPos ) : mobFamily.vanillaReplacement; + final MobFamily.Species species = isSpecial ? + mobFamily.nextVariant( world, entityPos, getVariantFilter( mobFamily, entityToReplace, world, entityPos ) ) : + mobFamily.vanillaReplacement; final LivingEntity replacement = species.entityType.get().create( world ); if( replacement == null ) { @@ -149,6 +162,32 @@ public final class SpecialMobReplacer { entityToReplace.remove(); } + /** @return A selector that filters out variants that are likely to die a stupid death if chosen. */ + @Nullable + private static Predicate> getVariantFilter( MobFamily mobFamily, Entity entityToReplace, + World world, BlockPos entityPos ) { + Predicate> selector = null; + + // Note that we do not check for any fluids (water/lava) since that is handled by spawn logic + if( !mobFamily.vanillaReplacement.bestiaryInfo.isDamagedByWater && // Skip this check if the base vanilla mob dies in water + world.isRainingAt( entityPos ) ) { + selector = WATER_INSENSITIVE_SELECTOR; + } + + // Does not consider overly wide mobs or extra-tall (>1 block taller) mobs + if( mobFamily.hasAnyGiants() ) { + final AxisAlignedBB bb = entityToReplace.getBoundingBox(); + final int y = MathHelper.ceil( bb.maxY ); + // Only check the FULL block above current collision - not a perfect representation, but keeps things simple + if( !world.isUnobstructed( entityToReplace, VoxelShapes.create( + new AxisAlignedBB( bb.minX, y, bb.minZ, bb.maxX, y + 1, bb.maxZ ) ) ) ) { + selector = selector == null ? NO_GIANTS_SELECTOR : selector.and( NO_GIANTS_SELECTOR ); + } + } + + return selector; + } + /** All data needed for a single mob we want to replace. */ private static class MobReplacementEntry { final MobFamily mobFamily; diff --git a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java index 1a186fe..98ef479 100644 --- a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java +++ b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java @@ -37,45 +37,55 @@ public class SpecialMobs { * (KEY: - = complete in current version, o = incomplete feature from previous version, * + = incomplete new feature, ? = feature to consider adding) * - general - * - entity replacer + * - mob replacer * - environment-sensitive configs * - natural spawning * - copied spawns - * - spiders -> cave spiders - * - endermen -> ender creepers + * - vanilla spiders -> vanilla cave spiders + * - vanilla endermen -> ender creepers * - ocean/river spawns * - drowning creepers * - blueberry slimes * - nether spawns - * - wither skeletons (outside of fortresses) - * - blazes (outside of fortresses) + * - vanilla wither skeletons (outside of fortresses) + * - vanilla blazes (outside of fortresses) * - fire creepers/zombies/spiders * ? warped/crimson mobs * - potions * - vulnerability (opposite of resistance) * - weight (opposite of levitation) + * + blocks + * + infested coral (spawns puffer silverfish) + * + melting ice + * - has variant that turns to air when melted + * - melts if not below melting ice or if above air (regardless of light/temp) + * - melts faster in brighter light + * - melts faster when next to non-solid blocks * - entities - * - nbt-driven capabilities (special mob data) - * - fish hook - * - bug spit * + bestiary - * - configurable stats + * - configurable, nbt-driven stats (bestiary info + special mob data) + * - configurable weapon type chance + * - bone shrapnel + * - bug spit + * - fish hook * - monster families (see doc for specifics) * - creepers * - chance to spawn charged during thunderstorms + * - chance to become supercharged when charged + * - explosion stats (while wet, while burning, when shot) * + scope - perhaps delay this until 1.18 where spyglasses will be in the game * - zombies * - transformations (husk -> any other non-water-sensitive zombie -> analogous drowned) * - ranged attack AI (using bow) * - use shields * - drowned - * - AI functions in shallow water * - use shields + * - bug fixes (can move in shallow water, alert regular zombies) * - zombified piglins * - ranged attack AI (using bow) * + ranged attack AI (using crossbow) * - use shields - * ? warped/crimson mobs + * ? warped/crimson * - skeletons * - use shields * - melee chance @@ -84,7 +94,7 @@ public class SpecialMobs { * - use shields * - bow chance * - babies - * ? warped/crimson mobs + * ? warped/crimson * - slimes * - smallest size can deal damage * - magma cubes @@ -94,14 +104,17 @@ public class SpecialMobs { * - ranged attack AI (spitter) * - silverfish * - ranged attack AI (spitter) + * - chance to spawn already calling for reinforcements * - endermen * - witches * - ability to equip held items (wonky) - * - uses splash speed instead of regular + * - use splash speed instead of regular * - ghasts * - melee attack AI + * - remove vertical targeting restriction * - blazes * - melee attack AI + * - configurable fireball attack * ? hoglins * ? zoglins * + guardians diff --git a/src/main/java/fathertoast/specialmobs/common/entity/MobHelper.java b/src/main/java/fathertoast/specialmobs/common/entity/MobHelper.java index ea18dcb..f6b90de 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/MobHelper.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/MobHelper.java @@ -26,10 +26,7 @@ import net.minecraft.potion.Effects; import net.minecraft.tags.FluidTags; import net.minecraft.tags.ITag; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.DamageSource; -import net.minecraft.util.Hand; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; +import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.shapes.ISelectionContext; @@ -38,6 +35,8 @@ import net.minecraft.world.Difficulty; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.IServerWorld; import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.entity.living.LivingKnockBackEvent; import javax.annotation.Nullable; @@ -552,4 +551,41 @@ public final class MobHelper { } } } + + /** @return Attempts to place a block, firing the appropriate Forge event. Returns true if successful. */ + public static boolean placeBlock( Entity entity, BlockPos pos, BlockState block ) { + return placeBlock( entity, pos, block, References.SetBlockFlags.DEFAULTS ); + } + + /** @return Attempts to place a block, firing the appropriate Forge event. Returns true if successful. */ + public static boolean placeBlock( Entity entity, BlockPos pos, Direction direction, BlockState block ) { + return placeBlock( entity, pos, direction, block, References.SetBlockFlags.DEFAULTS ); + } + + /** @return Attempts to place a block, firing the appropriate Forge event. Returns true if successful. */ + public static boolean placeBlock( Entity entity, BlockPos pos, BlockState block, int updateFlags ) { + return placeBlock( entity, pos, Direction.UP, block, updateFlags ); + } + + /** @return Attempts to place a block, firing the appropriate Forge event. Returns true if successful. */ + public static boolean placeBlock( Entity entity, BlockPos pos, Direction direction, BlockState block, int updateFlags ) { + if( canPlaceBlock( entity, pos, direction ) ) { + entity.level.setBlock( pos, block, updateFlags ); + return true; + } + return false; + } + + // Note to future self - I should probably also make 'destroy block' methods for whatever Forge event those should have, + // generally I do fire mob griefing events already for everything, though + + /** @return Fires the Forge event to check if a block can be placed and returns the result. */ + public static boolean canPlaceBlock( Entity entity, BlockPos pos ) { + return canPlaceBlock( entity, pos, Direction.UP ); + } + + /** @return Fires the Forge event to check if a block can be placed and returns the result. */ + public static boolean canPlaceBlock( Entity entity, BlockPos pos, Direction direction ) { + return !ForgeEventFactory.onBlockPlace( entity, BlockSnapshot.create( entity.level.dimension(), entity.level, pos ), direction ); + } } \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/entity/cavespider/FireCaveSpiderEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/cavespider/FireCaveSpiderEntity.java index b87aede..fdbe18b 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/cavespider/FireCaveSpiderEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/cavespider/FireCaveSpiderEntity.java @@ -3,6 +3,7 @@ package fathertoast.specialmobs.common.entity.cavespider; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.util.References; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; import net.minecraft.block.Blocks; @@ -63,7 +64,7 @@ public class FireCaveSpiderEntity extends _SpecialCaveSpiderEntity { if( !level.isClientSide() ) { final BlockPos pos = target.blockPosition(); if( level.getBlockState( pos ).getMaterial().isReplaceable() ) { - level.setBlock( pos, Blocks.FIRE.defaultBlockState(), References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, pos, Blocks.FIRE.defaultBlockState() ); } } target.setSecondsOnFire( 5 ); diff --git a/src/main/java/fathertoast/specialmobs/common/entity/cavespider/WebCaveSpiderEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/cavespider/WebCaveSpiderEntity.java index 59872c3..030b439 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/cavespider/WebCaveSpiderEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/cavespider/WebCaveSpiderEntity.java @@ -5,6 +5,7 @@ import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; import fathertoast.specialmobs.common.config.species.SpeciesConfig; import fathertoast.specialmobs.common.config.species.WebSpiderSpeciesConfig; +import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.util.References; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; import net.minecraft.block.Blocks; @@ -99,8 +100,8 @@ public class WebCaveSpiderEntity extends _SpecialCaveSpiderEntity { /** @return Attempts to place a cobweb at the given position and returns true if successful. */ private boolean tryPlaceWeb( BlockPos pos ) { - if( level.getBlockState( pos ).getMaterial().isReplaceable() ) { - level.setBlock( pos, Blocks.COBWEB.defaultBlockState(), References.SetBlockFlags.DEFAULTS ); + if( level.getBlockState( pos ).getMaterial().isReplaceable() && + MobHelper.placeBlock( this, pos, Blocks.COBWEB.defaultBlockState() ) ) { webCount--; return true; } diff --git a/src/main/java/fathertoast/specialmobs/common/entity/creeper/DirtCreeperEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/creeper/DirtCreeperEntity.java index 0f3d291..291c41a 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/creeper/DirtCreeperEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/creeper/DirtCreeperEntity.java @@ -3,6 +3,7 @@ package fathertoast.specialmobs.common.entity.creeper; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.util.ExplosionHelper; import fathertoast.specialmobs.common.util.References; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; @@ -78,7 +79,7 @@ public class DirtCreeperEntity extends _SpecialCreeperEntity { if( x * x + y * y + z * z <= radius * radius ) { final BlockPos pos = center.offset( x, y, z ); if( level.getBlockState( pos ).getMaterial().isReplaceable() ) { - level.setBlock( pos, dirt, References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, pos, dirt ); } } } diff --git a/src/main/java/fathertoast/specialmobs/common/entity/creeper/DrowningCreeperEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/creeper/DrowningCreeperEntity.java index 3fb757d..a6c7a7e 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/creeper/DrowningCreeperEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/creeper/DrowningCreeperEntity.java @@ -7,6 +7,7 @@ import fathertoast.specialmobs.common.config.species.SpeciesConfig; import fathertoast.specialmobs.common.config.util.EnvironmentEntry; import fathertoast.specialmobs.common.config.util.EnvironmentList; import fathertoast.specialmobs.common.config.util.environment.biome.BiomeCategory; +import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.entity.ai.AIHelper; import fathertoast.specialmobs.common.entity.ai.AmphibiousMovementController; import fathertoast.specialmobs.common.entity.ai.IAmphibiousMob; @@ -172,20 +173,20 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp if( stateAtPos.getMaterial().isReplaceable() || stateAtPos.is( BlockTags.LEAVES ) ) { if( distSq > rMinusOneSq ) { // "Coral" casing - level.setBlock( pos, random.nextFloat() < 0.25F ? brainCoral : hornCoral, References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, pos, random.nextFloat() < 0.25F ? brainCoral : hornCoral ); } else { final float fillChoice = random.nextFloat(); if( fillChoice < 0.1F && seaPickle.canSurvive( level, pos ) ) { - level.setBlock( pos, seaPickle, References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, pos, seaPickle ); } else if( fillChoice < 0.3F && seaGrass.canSurvive( level, pos ) ) { - level.setBlock( pos, seaGrass, References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, pos, seaGrass ); } else { // Water fill - level.setBlock( pos, water, References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, pos, water ); if( random.nextFloat() < 0.0075F && pufferCount < 5 ) { spawnPufferfish( pos ); diff --git a/src/main/java/fathertoast/specialmobs/common/entity/creeper/SnowCreeperEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/creeper/SnowCreeperEntity.java index 276ad37..41ec6ee 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/creeper/SnowCreeperEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/creeper/SnowCreeperEntity.java @@ -139,7 +139,7 @@ public class SnowCreeperEntity extends _SpecialCreeperEntity { if( block.is( Blocks.FROSTED_ICE ) || block.getFluidState().is( FluidTags.WATER ) ) { final BlockState blockAbove = level.getBlockState( pos.above() ); if( !blockAbove.getMaterial().blocksMotion() && !blockAbove.getFluidState().is( FluidTags.WATER ) ) - level.setBlock( pos, ice, References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, pos, ice ); } // Attempt to place pillars along circumference only @@ -170,7 +170,7 @@ public class SnowCreeperEntity extends _SpecialCreeperEntity { if( pos.getY() > currentPos.getY() ) height -= (pos.getY() - currentPos.getY()) / 2; while( currentPos.getY() < maxY && shouldReplace( currentPos ) ) { - level.setBlock( currentPos, ice, References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, currentPos, ice ); currentPos.move( 0, 1, 0 ); if( ++height >= 0 && random.nextBoolean() ) break; diff --git a/src/main/java/fathertoast/specialmobs/common/entity/drowned/BruteDrownedEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/drowned/BruteDrownedEntity.java index 9bdee72..00f09fe 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/drowned/BruteDrownedEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/drowned/BruteDrownedEntity.java @@ -23,7 +23,7 @@ public class BruteDrownedEntity extends _SpecialDrownedEntity { @SpecialMob.BestiaryInfoSupplier public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { bestiaryInfo.color( 0xFFF87E ) - .uniqueTextureBaseOnly() + .uniqueTextureWithOverlay() .size( 1.2F, 0.7F, 2.35F ) .addExperience( 2 ) .addToAttribute( Attributes.MAX_HEALTH, 10.0 ).addToAttribute( Attributes.ARMOR, 10.0 ); diff --git a/src/main/java/fathertoast/specialmobs/common/entity/drowned/FishingDrownedEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/drowned/FishingDrownedEntity.java index 59ada19..384c09f 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/drowned/FishingDrownedEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/drowned/FishingDrownedEntity.java @@ -40,7 +40,7 @@ public class FishingDrownedEntity extends _SpecialDrownedEntity implements IAngl @SpecialMob.BestiaryInfoSupplier public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { - bestiaryInfo.color( 0x2D41F4 ).weight( BestiaryInfo.DefaultWeight.LOW ).theme( BestiaryInfo.Theme.FISHING ) + bestiaryInfo.color( 0x2D41F4 ).weight( BestiaryInfo.DefaultWeight.LOW ) .addExperience( 2 ).drownImmune().fluidPushImmune() .convertThrowToFishing().fishingAttack( 1.0, 40, 15.0 ) .multiplyAttribute( Attributes.MOVEMENT_SPEED, 0.8 ); diff --git a/src/main/java/fathertoast/specialmobs/common/entity/drowned/FrozenDrownedEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/drowned/FrozenDrownedEntity.java new file mode 100644 index 0000000..93a418e --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/entity/drowned/FrozenDrownedEntity.java @@ -0,0 +1,166 @@ +package fathertoast.specialmobs.common.entity.drowned; + +import fathertoast.specialmobs.common.bestiary.BestiaryInfo; +import fathertoast.specialmobs.common.bestiary.MobFamily; +import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.entity.MobHelper; +import fathertoast.specialmobs.common.util.ExplosionHelper; +import fathertoast.specialmobs.common.util.References; +import fathertoast.specialmobs.datagen.loot.LootTableBuilder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.potion.Effects; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.world.Explosion; +import net.minecraft.world.World; + +import javax.annotation.Nullable; + +@SpecialMob +public class FrozenDrownedEntity extends _SpecialDrownedEntity { + + //--------------- Static Special Mob Hooks ---------------- + + @SpecialMob.SpeciesReference + public static MobFamily.Species SPECIES; + + @SpecialMob.BestiaryInfoSupplier + public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { + bestiaryInfo.color( 0xDDEAEA ).weight( BestiaryInfo.DefaultWeight.LOW ).theme( BestiaryInfo.Theme.ICE ) + .uniqueTextureWithOverlay() + .addExperience( 2 ).effectImmune( Effects.MOVEMENT_SLOWDOWN ) + .addToAttribute( Attributes.ARMOR, 10.0 ) + .multiplyAttribute( Attributes.MOVEMENT_SPEED, 0.8 ); + } + + @SpecialMob.LanguageProvider + public static String[] getTranslations( String langKey ) { + return References.translations( langKey, "Frozen Drowned", + "", "", "", "", "", "" );//TODO + } + + @SpecialMob.LootTableProvider + public static void buildLootTable( LootTableBuilder loot ) { + addBaseLoot( loot ); + loot.addCommonDrop( "common", Blocks.ICE ); + loot.addRareDrop( "rare", Blocks.BLUE_ICE ); + } + + @SpecialMob.Factory + public static EntityType.IFactory getVariantFactory() { return FrozenDrownedEntity::new; } + + /** @return This entity's mob species. */ + @SpecialMob.SpeciesSupplier + @Override + public MobFamily.Species getSpecies() { return SPECIES; } + + + //--------------- Variant-Specific Implementations ---------------- + + private static final int ICE_SEAL_TICKS = 4; + + private int iceSealTimer; + private BlockPos iceSealPos; + + public FrozenDrownedEntity( EntityType entityType, World world ) { super( entityType, world ); } + + /** Override to apply effects when this entity hits a target with a melee attack. */ + @Override + protected void onVariantAttack( LivingEntity target ) { + MobHelper.applyEffect( target, Effects.MOVEMENT_SLOWDOWN, 2 ); + } + + /** Called each tick to update this entity's movement. */ + @Override + public void aiStep() { + if( !level.isClientSide() ) { + if( iceSealPos != null ) { + // Currently creating ice seal + if( iceSealTimer++ % ICE_SEAL_TICKS == 0 ) { + final int radius = iceSealTimer / ICE_SEAL_TICKS; + makeIceSeal( iceSealPos, radius ); + + if( radius >= 7 ) { + iceSealTimer = 100 + random.nextInt( 100 ); + iceSealPos = null; + } + } + } + else if( iceSealTimer-- <= 0 ) { + // Check if a new ice seal should be created + final LivingEntity target = getTarget(); + if( target != null && target.isUnderWater() && distanceToSqr( target ) < 144.0 && random.nextInt( 20 ) == 0 ) { + final BlockPos pos = findIceSealPos( target.blockPosition(), MathHelper.ceil( target.getBbHeight() ) ); + if( pos != null && ExplosionHelper.getMode( this ) != Explosion.Mode.NONE ) { + iceSealTimer = 0; + iceSealPos = pos; + } + } + } + } + super.aiStep(); + } + + /** @return The position to create an ice seal at, or null if the target is invalid. */ + @Nullable + private BlockPos findIceSealPos( BlockPos targetPos, int targetHeight ) { + // Find the water surface + final int maxRange = 6 + targetHeight; + final BlockPos.Mutable pos = targetPos.mutable(); + for( int y = 0; y <= maxRange; y++ ) { + pos.setY( targetPos.getY() + y ); + if( pos.getY() >= level.getMaxBuildHeight() ) break; // Can't build here + + final BlockState block = level.getBlockState( pos ); + if( block.getBlock() != Blocks.WATER || block.getValue( FlowingFluidBlock.LEVEL ) != 0 ) { + if( y - 1 <= targetHeight ) break; // Don't build inside the target entity + return pos.below(); + } + } + return null; + } + + /** Creates an ice seal centered at the position with a certain size. */ + private void makeIceSeal( BlockPos center, int radius ) { + if( !isSilent() ) { + level.playSound( null, center.getX() + 0.5, center.getY() + 0.5, center.getZ() + 0.5, + SoundEvents.GLASS_BREAK, getSoundSource(), 0.4F, 1.0F / (random.nextFloat() * 0.4F + 0.8F) ); + } + + final BlockState block = Blocks.FROSTED_ICE.defaultBlockState(); + if( radius <= 0 ) { + placeSealBlock( center, block ); + return; + } + + for( int x = -radius; x <= radius; x++ ) { + for( int z = -radius; z <= radius; z++ ) { + final int distSq = x * x + z * z; + + // Fill circle + if( distSq <= radius * radius ) { + placeSealBlock( center.offset( x, 0, z ), block ); + } + } + } + } + + /** Attempts to place a single seal block. */ + private void placeSealBlock( BlockPos pos, BlockState block ) { + final BlockState currentBlock = level.getBlockState( pos ); + if( currentBlock.getBlock() == Blocks.WATER && currentBlock.getValue( FlowingFluidBlock.LEVEL ) == 0 && + block.canSurvive( level, pos ) && level.isUnobstructed( block, pos, ISelectionContext.empty() ) ) { + if( MobHelper.placeBlock( this, pos, block ) ) { + level.getBlockTicks().scheduleTick( pos, Blocks.FROSTED_ICE, + MathHelper.nextInt( random, 60, 120 ) ); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/entity/drowned/GiantDrownedEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/drowned/GiantDrownedEntity.java index 85fbded..9f750bd 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/drowned/GiantDrownedEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/drowned/GiantDrownedEntity.java @@ -22,7 +22,7 @@ public class GiantDrownedEntity extends _SpecialDrownedEntity { @SpecialMob.BestiaryInfoSupplier public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { - bestiaryInfo.color( 0x799C65 ).theme( BestiaryInfo.Theme.MOUNTAIN ) + bestiaryInfo.color( 0x799C65 ) .size( 1.5F, 0.9F, 2.95F ) .addExperience( 1 ) .addToAttribute( Attributes.MAX_HEALTH, 20.0 ) diff --git a/src/main/java/fathertoast/specialmobs/common/entity/drowned/HungryDrownedEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/drowned/HungryDrownedEntity.java index 1a561ef..e80fe79 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/drowned/HungryDrownedEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/drowned/HungryDrownedEntity.java @@ -34,7 +34,7 @@ public class HungryDrownedEntity extends _SpecialDrownedEntity { @SpecialMob.BestiaryInfoSupplier public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { bestiaryInfo.color( 0xAB1518 ) - .uniqueTextureBaseOnly() + .uniqueTextureWithOverlay() .addExperience( 2 ).regen( 30 ).disableRangedAttack() .addToAttribute( Attributes.MAX_HEALTH, 10.0 ) .multiplyAttribute( Attributes.MOVEMENT_SPEED, 1.3 ); diff --git a/src/main/java/fathertoast/specialmobs/common/entity/drowned/PlagueDrownedEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/drowned/PlagueDrownedEntity.java index 4ad094c..b0d1021 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/drowned/PlagueDrownedEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/drowned/PlagueDrownedEntity.java @@ -23,8 +23,8 @@ public class PlagueDrownedEntity extends _SpecialDrownedEntity { @SpecialMob.BestiaryInfoSupplier public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { - bestiaryInfo.color( 0x8AA838 ).theme( BestiaryInfo.Theme.FOREST ) - .uniqueTextureBaseOnly() + bestiaryInfo.color( 0x8AA838 ) + .uniqueTextureWithOverlay() .addExperience( 1 ) .multiplyAttribute( Attributes.MOVEMENT_SPEED, 1.1 ); } diff --git a/src/main/java/fathertoast/specialmobs/common/entity/drowned/TropicalDrownedEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/drowned/TropicalDrownedEntity.java new file mode 100644 index 0000000..cd4df08 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/entity/drowned/TropicalDrownedEntity.java @@ -0,0 +1,76 @@ +package fathertoast.specialmobs.common.entity.drowned; + +import fathertoast.specialmobs.common.bestiary.BestiaryInfo; +import fathertoast.specialmobs.common.bestiary.MobFamily; +import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.config.species.DrownedSpeciesConfig; +import fathertoast.specialmobs.common.config.species.SpeciesConfig; +import fathertoast.specialmobs.common.entity.MobHelper; +import fathertoast.specialmobs.common.util.References; +import fathertoast.specialmobs.datagen.loot.LootTableBuilder; +import net.minecraft.block.Blocks; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.potion.Effects; +import net.minecraft.world.World; + +@SpecialMob +public class TropicalDrownedEntity extends _SpecialDrownedEntity { + + //--------------- Static Special Mob Hooks ---------------- + + @SpecialMob.SpeciesReference + public static MobFamily.Species SPECIES; + + @SpecialMob.BestiaryInfoSupplier + public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { + bestiaryInfo.color( 0xD962A3 ).weight( BestiaryInfo.DefaultWeight.LOWEST ).theme( BestiaryInfo.Theme.TROPICAL ) + .uniqueTextureWithOverlay() + .addExperience( 1 ) + .multiplyRangedCooldown( 0.75F ).rangedMaxRange( 15.0 ) + .multiplyAttribute( Attributes.MOVEMENT_SPEED, 1.2 ); + } + + @SpecialMob.ConfigSupplier + public static SpeciesConfig createConfig( MobFamily.Species species ) { + return new DrownedSpeciesConfig( species, 1.0, DEFAULT_SHIELD_CHANCE ); + } + + @SpecialMob.LanguageProvider + public static String[] getTranslations( String langKey ) { + return References.translations( langKey, "Tropical Drowned", + "", "", "", "", "", "" );//TODO + } + + @SpecialMob.LootTableProvider + public static void buildLootTable( LootTableBuilder loot ) { + addBaseLoot( loot ); + loot.addCommonDrop( "common", Blocks.SEA_PICKLE ); + loot.addUncommonDrop( "uncommon", + Blocks.TUBE_CORAL, Blocks.TUBE_CORAL_FAN, Blocks.TUBE_CORAL_BLOCK, + Blocks.BRAIN_CORAL, Blocks.BRAIN_CORAL_FAN, Blocks.BRAIN_CORAL_BLOCK, + Blocks.BUBBLE_CORAL, Blocks.BUBBLE_CORAL_FAN, Blocks.BUBBLE_CORAL_BLOCK, + Blocks.FIRE_CORAL, Blocks.FIRE_CORAL_FAN, Blocks.FIRE_CORAL_BLOCK, + Blocks.HORN_CORAL, Blocks.HORN_CORAL_FAN, Blocks.HORN_CORAL_BLOCK ); + } + + @SpecialMob.Factory + public static EntityType.IFactory getVariantFactory() { return TropicalDrownedEntity::new; } + + /** @return This entity's mob species. */ + @SpecialMob.SpeciesSupplier + @Override + public MobFamily.Species getSpecies() { return SPECIES; } + + + //--------------- Variant-Specific Implementations ---------------- + + public TropicalDrownedEntity( EntityType entityType, World world ) { super( entityType, world ); } + + /** Override to apply effects when this entity hits a target with a melee attack. */ + @Override + protected void onVariantAttack( LivingEntity target ) { + MobHelper.applyEffect( target, Effects.POISON ); + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/entity/enderman/FlameEndermanEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/enderman/FlameEndermanEntity.java index bb47972..acdede0 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/enderman/FlameEndermanEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/enderman/FlameEndermanEntity.java @@ -3,6 +3,7 @@ package fathertoast.specialmobs.common.entity.enderman; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.util.ExplosionHelper; import fathertoast.specialmobs.common.util.References; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; @@ -120,8 +121,9 @@ public class FlameEndermanEntity extends _SpecialEndermanEntity { while( currentPos.getY() < maxY ) { currentPos.move( 0, 1, 0 ); - if( shouldSetFire( currentPos ) ) - level.setBlock( currentPos, AbstractFireBlock.getState( level, currentPos ), References.SetBlockFlags.DEFAULTS ); + if( shouldSetFire( currentPos ) ) { + MobHelper.placeBlock( this, currentPos, AbstractFireBlock.getState( level, currentPos ) ); + } } } diff --git a/src/main/java/fathertoast/specialmobs/common/entity/spider/FireSpiderEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/spider/FireSpiderEntity.java index 389ff07..965b7ee 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/spider/FireSpiderEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/spider/FireSpiderEntity.java @@ -3,6 +3,7 @@ package fathertoast.specialmobs.common.entity.spider; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.util.References; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; import net.minecraft.block.Blocks; @@ -63,7 +64,7 @@ public class FireSpiderEntity extends _SpecialSpiderEntity { if( !level.isClientSide() ) { final BlockPos pos = target.blockPosition(); if( level.getBlockState( pos ).getMaterial().isReplaceable() ) { - level.setBlock( pos, Blocks.FIRE.defaultBlockState(), References.SetBlockFlags.DEFAULTS ); + MobHelper.placeBlock( this, pos, Blocks.FIRE.defaultBlockState() ); } } target.setSecondsOnFire( 5 ); diff --git a/src/main/java/fathertoast/specialmobs/common/entity/spider/WebSpiderEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/spider/WebSpiderEntity.java index 13d170e..5262588 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/spider/WebSpiderEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/spider/WebSpiderEntity.java @@ -5,6 +5,7 @@ import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; import fathertoast.specialmobs.common.config.species.SpeciesConfig; import fathertoast.specialmobs.common.config.species.WebSpiderSpeciesConfig; +import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.util.References; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; import net.minecraft.block.Blocks; @@ -99,8 +100,8 @@ public class WebSpiderEntity extends _SpecialSpiderEntity { /** @return Attempts to place a cobweb at the given position and returns true if successful. */ private boolean tryPlaceWeb( BlockPos pos ) { - if( level.getBlockState( pos ).getMaterial().isReplaceable() ) { - level.setBlock( pos, Blocks.COBWEB.defaultBlockState(), References.SetBlockFlags.DEFAULTS ); + if( level.getBlockState( pos ).getMaterial().isReplaceable() && + MobHelper.placeBlock( this, pos, Blocks.COBWEB.defaultBlockState() ) ) { webCount--; return true; } diff --git a/src/main/java/fathertoast/specialmobs/common/entity/zombie/HuskZombieEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/zombie/HuskZombieEntity.java index 1b9d7be..bc70a20 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/zombie/HuskZombieEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/zombie/HuskZombieEntity.java @@ -26,7 +26,7 @@ import net.minecraft.world.IServerWorld; import net.minecraft.world.World; import java.util.Random; -import java.util.function.Function; +import java.util.function.Predicate; @SpecialMob public class HuskZombieEntity extends _SpecialZombieEntity { @@ -109,7 +109,7 @@ public class HuskZombieEntity extends _SpecialZombieEntity { } /** Returns true if the species is not a husk and not damaged by water. */ - private static final Function, Boolean> HUSK_CONVERSION_SELECTOR = + private static final Predicate> HUSK_CONVERSION_SELECTOR = ( species ) -> species != SPECIES && !species.config.GENERAL.isDamagedByWater.get(); /** Performs this zombie's drowning conversion. */ diff --git a/src/main/resources/assets/specialmobs/textures/entity/drowned/frozen.png b/src/main/resources/assets/specialmobs/textures/entity/drowned/frozen.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fff3f8876285443252b2e1c50436ffe52ea2a6 GIT binary patch literal 665 zcmV;K0%rY*P)?L|X4wu=YgJ_6zIeG`FL?lh2=HQA zFpkH*>;WKzSpdXx8n9TuLii})Vp&84ut$C9+ZY|B_dbWY-{%Wu_5d*Hqt$ZlVVH@x z?y)WReYh7_1KJ834AH=;;R~ft0S~FGrOqk>Q0y>quKGS27!GO!1o;$5@r3G60Ajv~ zD>sAzh@}HVVUKePwAGVM5s*a+n8>yi;EvA#z>|In>^p#OH2Z?P6qP*000000NkvXXu0mjfvriOx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/specialmobs/textures/entity/drowned/frozen_overlay.png b/src/main/resources/assets/specialmobs/textures/entity/drowned/frozen_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..d124f2e6a48ff54a012eb4d52a407a5f768c04a3 GIT binary patch literal 1334 zcmV-61M3JM}RXh)7jL>xJ48gT{U8r*}c zi&VoWAEzrXd2Kf@c4tuB{O6uir|wVcW;i)H8FtyTU*E>E+uw%q_4nh`?dLyE#^cXN zr^g<=JKAY;&mYI}pf)Te0N}5FfBCy#+XeF0%cref2?ELtx=64pt_1;BLP@_!D65dT z@&uHZ)B9Gzl_%id&tWWshzy5oK|p~=_6C3B^KktXfC>tH9slpUK|D*mSET`L@KxgZ zvKOB|wAXaTxgrfU)pnH!Cjd{;qE`tKRJ_1eg&7D{St_U!P+X5PxYyw88lHo#f`IaV zfy69fDqP3u`cMqlavqQnQu`28rLV91Yy02?0J{2jlR#w+9Pr-mh%;FBO_a~Ah5(FE z06g9*1Gx9O#)M4~Y2fUyf`F`)!vaq~`SS5E@Y*h`bDeUKcSl5?J2(N3N8;FCO|RSg z4uMYI8Cu-y>sLX5E1!m^@w&a=NqkNP5WE@%q-Wnex--6ie0Qv}3~w^Jn;Y0Xy?=Au zWlJYtQ}*@k!_)fZWGq#-)LH^e0z=xRL)$5!7fFCgDA3exN&RLCs0UjCIlf;)zNddOmxS!#8}J?^bl_7J zt~?dx83~SeB)J`-ZinzHK(hgKLv1B235mfk!b=W;DFU$0W4<5xx`E|dKikiD379H9 zW~tdIU!;*Gp-p)27W85)oLLD9s3ws&h*$4v$5*Pzy7YGR+jm{DP__~qG zINkuu!`V)Go4k$yhlL3+*d(L2bF#&-+!MEsgr&X0U~u&N?*4Kx zW3Mk6T-n3arFwvD8_wMeB)B9Y&*e*~aP|o2nJwmUnGo=p-`^)tssU%WxF`e?oE4F6 zz`nD?xjDhya5%py5r*PlAr&)K;kk8aB?F*rOy$NxrMoJe5)iN7g+3*sBmhn zY;FO>Y8BumHv25F$lT)G5}1P%kRH#ZNG3hI&*56yhcF3@&4UPn;&nH2vAi$EOQn`S!%h}oU zCM(w{n}k%#DjLDe-RJ)W?!WVAj9lsEKS{^{J7Jp*;Hn7d{xNWp)x+9u{ju-&kC~YU z&;0+v3CN6W{%?>==(`miPJw3#?L|X4wu=YgJ_6zIeG`FL?lh2=HQA zFpkH*>;WKzSpdXx8n9TuLii})Vp&84ut$C9+ZY|B_dbWY-{%Wu_5d*Hqt$ZlVVH@x z?y)WReYh7_1KJ834AH=;;R~ft0S~FGrOqk>Q0y>quKGS27!GO!1o;$5@r3G60Ajv~ zD>sAzh@}HVVUKePwAGVM5s*a+n8>yi;EvA#z>|In>^p#OH2Z?P6qP*000000NkvXXu0mjfvriOx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/specialmobs/textures/entity/drowned/tropical_overlay.png b/src/main/resources/assets/specialmobs/textures/entity/drowned/tropical_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..d124f2e6a48ff54a012eb4d52a407a5f768c04a3 GIT binary patch literal 1334 zcmV-61M3JM}RXh)7jL>xJ48gT{U8r*}c zi&VoWAEzrXd2Kf@c4tuB{O6uir|wVcW;i)H8FtyTU*E>E+uw%q_4nh`?dLyE#^cXN zr^g<=JKAY;&mYI}pf)Te0N}5FfBCy#+XeF0%cref2?ELtx=64pt_1;BLP@_!D65dT z@&uHZ)B9Gzl_%id&tWWshzy5oK|p~=_6C3B^KktXfC>tH9slpUK|D*mSET`L@KxgZ zvKOB|wAXaTxgrfU)pnH!Cjd{;qE`tKRJ_1eg&7D{St_U!P+X5PxYyw88lHo#f`IaV zfy69fDqP3u`cMqlavqQnQu`28rLV91Yy02?0J{2jlR#w+9Pr-mh%;FBO_a~Ah5(FE z06g9*1Gx9O#)M4~Y2fUyf`F`)!vaq~`SS5E@Y*h`bDeUKcSl5?J2(N3N8;FCO|RSg z4uMYI8Cu-y>sLX5E1!m^@w&a=NqkNP5WE@%q-Wnex--6ie0Qv}3~w^Jn;Y0Xy?=Au zWlJYtQ}*@k!_)fZWGq#-)LH^e0z=xRL)$5!7fFCgDA3exN&RLCs0UjCIlf;)zNddOmxS!#8}J?^bl_7J zt~?dx83~SeB)J`-ZinzHK(hgKLv1B235mfk!b=W;DFU$0W4<5xx`E|dKikiD379H9 zW~tdIU!;*Gp-p)27W85)oLLD9s3ws&h*$4v$5*Pzy7YGR+jm{DP__~qG zINkuu!`V)Go4k$yhlL3+*d(L2bF#&-+!MEsgr&X0U~u&N?*4Kx zW3Mk6T-n3arFwvD8_wMeB)B9Y&*e*~aP|o2nJwmUnGo=p-`^)tssU%WxF`e?oE4F6 zz`nD?xjDhya5%py5r*PlAr&)K;kk8aB?F*rOy$NxrMoJe5)iN7g+3*sBmhn zY;FO>Y8BumHv25F$lT)G5}1P%kRH#ZNG3hI&*56yhcF3@&4UPn;&nH2vAi$EOQn`S!%h}oU zCM(w{n}k%#DjLDe-RJ)W?!WVAj9lsEKS{^{J7Jp*;Hn7d{xNWp)x+9u{ju-&kC~YU z&;0+v3CN6W{%?>==(`miPJw3# Date: Tue, 16 Aug 2022 19:54:44 -0500 Subject: [PATCH 02/10] whups --- .../common/entity/zombie/FrozenZombieEntity.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/fathertoast/specialmobs/common/entity/zombie/FrozenZombieEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/zombie/FrozenZombieEntity.java index 03192d5..9036508 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/zombie/FrozenZombieEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/zombie/FrozenZombieEntity.java @@ -5,6 +5,7 @@ import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.entity.ai.AIHelper; +import fathertoast.specialmobs.common.entity.drowned.FrozenDrownedEntity; import fathertoast.specialmobs.common.util.References; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; import net.minecraft.block.Blocks; @@ -16,6 +17,7 @@ import net.minecraft.entity.ai.attributes.ModifiableAttributeInstance; import net.minecraft.entity.ai.goal.LookAtGoal; import net.minecraft.entity.ai.goal.LookRandomlyGoal; import net.minecraft.entity.ai.goal.WaterAvoidingRandomWalkingGoal; +import net.minecraft.entity.monster.ZombieEntity; import net.minecraft.entity.projectile.AbstractArrowEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -92,6 +94,10 @@ public class FrozenZombieEntity extends _SpecialZombieEntity { return MobHelper.tipArrow( arrow, Effects.MOVEMENT_SLOWDOWN ); } + /** Override to change the entity this converts to when drowned. */ + @Override + protected EntityType getVariantConversionType() { return FrozenDrownedEntity.SPECIES.entityType.get(); } + /** Called each tick to update this entity's movement. */ @Override public void aiStep() { From 885a6ce636fb9c24fd39b41ad5a7952e2035c489 Mon Sep 17 00:00:00 2001 From: FatherToast Date: Mon, 22 Aug 2022 22:39:46 -0500 Subject: [PATCH 03/10] new drowned textures! + blocks! --- .../specialmobs/client/ClientRegister.java | 5 + .../common/bestiary/MobFamily.java | 2 +- .../common/block/MeltingIceBlock.java | 178 ++++++++++++++++++ .../block/UnderwaterSilverfishBlock.java | 99 ++++++++++ .../common/block/package-info.java | 7 + .../species/DrowningCreeperSpeciesConfig.java | 47 +++++ .../species/SnowCreeperSpeciesConfig.java | 35 ++++ .../specialmobs/common/core/SpecialMobs.java | 12 +- .../common/core/register/SMBlocks.java | 49 +++++ .../entity/creeper/DrowningCreeperEntity.java | 78 ++++++-- .../entity/creeper/SnowCreeperEntity.java | 50 ++++- .../entity/drowned/FrozenDrownedEntity.java | 19 +- .../common/util/AnnotationHelper.java | 18 +- .../specialmobs/common/util/References.java | 2 +- .../datagen/DataGatherListener.java | 1 + .../datagen/SMBlockStateAndModelProvider.java | 45 +++++ .../datagen/SMItemModelProvider.java | 15 +- .../datagen/SMLanguageProvider.java | 12 +- .../resources/META-INF/accesstransformer.cfg | 3 + .../textures/entity/drowned/brute.png | Bin 1349 -> 1115 bytes .../textures/entity/drowned/brute_overlay.png | Bin 1349 -> 2727 bytes .../textures/entity/drowned/frozen.png | Bin 665 -> 1270 bytes .../entity/drowned/frozen_overlay.png | Bin 1334 -> 2902 bytes .../textures/entity/drowned/hungry.png | Bin 1428 -> 1338 bytes .../entity/drowned/hungry_overlay.png | Bin 1428 -> 2532 bytes .../textures/entity/drowned/plague.png | Bin 1351 -> 1267 bytes .../entity/drowned/plague_overlay.png | Bin 1351 -> 2938 bytes .../textures/entity/zombie/frozen.png | Bin 1569 -> 2444 bytes .../textures/entity/zombie/frozen_old.png | Bin 0 -> 1569 bytes 29 files changed, 622 insertions(+), 55 deletions(-) create mode 100644 src/main/java/fathertoast/specialmobs/common/block/MeltingIceBlock.java create mode 100644 src/main/java/fathertoast/specialmobs/common/block/UnderwaterSilverfishBlock.java create mode 100644 src/main/java/fathertoast/specialmobs/common/block/package-info.java create mode 100644 src/main/java/fathertoast/specialmobs/common/config/species/DrowningCreeperSpeciesConfig.java create mode 100644 src/main/java/fathertoast/specialmobs/common/config/species/SnowCreeperSpeciesConfig.java create mode 100644 src/main/java/fathertoast/specialmobs/common/core/register/SMBlocks.java create mode 100644 src/main/java/fathertoast/specialmobs/datagen/SMBlockStateAndModelProvider.java create mode 100644 src/main/resources/assets/specialmobs/textures/entity/zombie/frozen_old.png diff --git a/src/main/java/fathertoast/specialmobs/client/ClientRegister.java b/src/main/java/fathertoast/specialmobs/client/ClientRegister.java index f56667f..79cee7e 100644 --- a/src/main/java/fathertoast/specialmobs/client/ClientRegister.java +++ b/src/main/java/fathertoast/specialmobs/client/ClientRegister.java @@ -8,6 +8,7 @@ import fathertoast.specialmobs.client.renderer.entity.species.*; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.config.Config; import fathertoast.specialmobs.common.core.SpecialMobs; +import fathertoast.specialmobs.common.core.register.SMBlocks; import fathertoast.specialmobs.common.core.register.SMEntities; import fathertoast.specialmobs.common.entity.creeper.EnderCreeperEntity; import fathertoast.specialmobs.common.entity.ghast.CorporealShiftGhastEntity; @@ -19,6 +20,8 @@ import fathertoast.specialmobs.common.entity.zombie.MadScientistZombieEntity; import fathertoast.specialmobs.common.entity.zombifiedpiglin.VampireZombifiedPiglinEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.entity.SpriteRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -42,6 +45,8 @@ public class ClientRegister { @SubscribeEvent public static void onClientSetup( FMLClientSetupEvent event ) { + RenderTypeLookup.setRenderLayer( SMBlocks.MELTING_ICE.get(), RenderType.translucent() ); + if( Config.MAIN.GENERAL.fancyFishingMobs.get() ) { ItemModelsProperties.register( Items.FISHING_ROD, new ResourceLocation( "cast" ), new FishingRodItemPropertyGetter() ); } diff --git a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java index 7579c65..f0c9b18 100644 --- a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java +++ b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java @@ -53,7 +53,7 @@ public class MobFamily { public static final MobFamily DROWNED = new MobFamily<>( FamilyConfig::new, "Drowned", "drowned", 0x8FF1D7, new EntityType[] { EntityType.DROWNED }, "Abyssal", "Brute", "Fishing", "Frozen", "Giant", "Hungry", "Knight", "Plague", "Tropical" - ); //TODO Textures! - brute, hungry, plague, frozen, tropical + ); //TODO Textures! - tropical public static final MobFamily ZOMBIFIED_PIGLIN = new MobFamily<>( FamilyConfig::new, "ZombifiedPiglin", "zombified piglins", 0xEA9393, new EntityType[] { EntityType.ZOMBIFIED_PIGLIN }, "Brute", "Fishing", "Giant", "Hungry", "Knight", "Plague", "Vampire"//TODO figure out crossbows diff --git a/src/main/java/fathertoast/specialmobs/common/block/MeltingIceBlock.java b/src/main/java/fathertoast/specialmobs/common/block/MeltingIceBlock.java new file mode 100644 index 0000000..94a8d71 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/block/MeltingIceBlock.java @@ -0,0 +1,178 @@ +package fathertoast.specialmobs.common.block; + +import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.core.register.SMBlocks; +import fathertoast.specialmobs.common.util.References; +import net.minecraft.block.*; +import net.minecraft.block.material.Material; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.IntegerProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.stats.Stats; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.LightType; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; + +import javax.annotation.Nullable; +import java.util.Random; + +public class MeltingIceBlock extends IceBlock { + + @SpecialMob.LanguageProvider + public static String[] getTranslations( String langKey ) { + return References.translations( langKey, "Melting Ice", + "", "", "", "", "", "" );//TODO + } + + /** @return The state that should be placed. */ + public static BlockState getState( World world, BlockPos pos ) { + final BlockState currentBlock = world.getBlockState( pos ); + return SMBlocks.MELTING_ICE.get().defaultBlockState().setValue( HAS_WATER, + currentBlock.is( Blocks.FROSTED_ICE ) || + currentBlock.getBlock() == Blocks.WATER && currentBlock.getValue( FlowingFluidBlock.LEVEL ) == 0 ); + } + + /** Call this after placing a melting ice block to trigger its melting logic. */ + public static void scheduleFirstTick( World world, BlockPos pos, Random random ) { + world.getBlockTicks().scheduleTick( pos, SMBlocks.MELTING_ICE.get(), MathHelper.nextInt( random, 60, 120 ) ); + } + + /** Called after each melt logic tick to schedule the next tick. */ + private void scheduleTick( World world, BlockPos pos, Random random ) { + final int darkness = 15 - getLight( world, pos ); + + int solidNeighbors = 0; + final BlockPos.Mutable neighborPos = new BlockPos.Mutable(); + for( Direction direction : Direction.Plane.HORIZONTAL ) { + if( world.getBlockState( neighborPos.setWithOffset( pos, direction ) ).getMaterial().isSolid() ) { + solidNeighbors++; + } + } + + // The 'neutral' state is 0 block light and 0 solid neighbors - this gives the same tick rate as frosted ice (1-2s) + // Max delay is same as the default 'first tick' delay (3-6s) + final int delay = 5 + darkness + 10 * solidNeighbors; + world.getBlockTicks().scheduleTick( pos, this, MathHelper.nextInt( random, delay, delay << 1 ) ); + } + + /** @return The light level touching this block (0-15). We use this method because the block is solid. */ + private static int getLight( World world, BlockPos pos ) { + int highestLight = 0; + final BlockPos.Mutable neighborPos = new BlockPos.Mutable(); + for( Direction direction : Direction.values() ) { + final int neighborLight = world.getBrightness( LightType.BLOCK, neighborPos.setWithOffset( pos, direction ) ); + if( neighborLight > 14 ) return 15; + if( neighborLight > highestLight ) highestLight = neighborLight; + } + return highestLight; + } + + public static final IntegerProperty AGE = BlockStateProperties.AGE_3; + public static final BooleanProperty HAS_WATER = BooleanProperty.create( "has_water" ); + + public MeltingIceBlock() { + super( AbstractBlock.Properties.of( Material.ICE ).sound( SoundType.GLASS ).noOcclusion() + .randomTicks().friction( 0.98F ).strength( 0.5F ) ); + registerDefaultState( stateDefinition.any().setValue( AGE, 0 ).setValue( HAS_WATER, true ) ); + } + + @Override + protected void createBlockStateDefinition( StateContainer.Builder builder ) { + builder.add( AGE ).add( HAS_WATER ); + } + + @SuppressWarnings( "deprecation" ) + @Override + public ItemStack getCloneItemStack( IBlockReader world, BlockPos pos, BlockState state ) { return ItemStack.EMPTY; } + + @Override + public void playerDestroy( World world, PlayerEntity player, BlockPos pos, BlockState state, + @Nullable TileEntity tileEntity, ItemStack tool ) { + player.awardStat( Stats.BLOCK_MINED.get( this ) ); + player.causeFoodExhaustion( 0.005F ); + dropResources( state, world, pos, tileEntity, player, tool ); + + if( EnchantmentHelper.getItemEnchantmentLevel( Enchantments.SILK_TOUCH, tool ) == 0 ) { + melt( state, world, pos ); + } + } + + @Override + public void randomTick( BlockState state, ServerWorld world, BlockPos pos, Random random ) { tick( state, world, pos, random ); } + + @SuppressWarnings( "deprecation" ) + @Override + public void tick( BlockState state, ServerWorld world, BlockPos pos, Random random ) { + if( canMelt( world, pos ) ) { + if( slightlyMelt( state, world, pos, random ) ) { + final BlockPos.Mutable neighborPos = new BlockPos.Mutable(); + trySlightlyMelt( world, neighborPos.setWithOffset( pos, Direction.DOWN ), random ); + for( Direction direction : Direction.Plane.HORIZONTAL ) { + trySlightlyMelt( world, neighborPos.setWithOffset( pos, direction ), random ); + } + } + } + else scheduleTick( world, pos, random ); + } + + /** @return True if the conditions allow melting. */ + private boolean canMelt( World world, BlockPos pos ) { + // If a bright-ish (torch or higher) light source is nearby, always allow melting + if( getLight( world, pos ) > 13 ) return true; + + // Otherwise, we want to prevent melting in two specific cases to get our desired melting pattern: + // * surrounded by other melting ice blocks horizontally (outside-in for ice floors/ceilings) + // * block below is non-air and block above is another melting ice block (top-down for ice walls) + final BlockPos.Mutable neighborPos = new BlockPos.Mutable(); + for( Direction direction : Direction.Plane.HORIZONTAL ) { + if( !world.getBlockState( neighborPos.setWithOffset( pos, direction ) ).is( this ) ) { + //noinspection deprecation + return !world.getBlockState( neighborPos.setWithOffset( pos, Direction.UP ) ).is( this ) || + world.getBlockState( neighborPos.setWithOffset( pos, Direction.DOWN ) ).isAir(); + } + } + return false; + } + + /** Attempts to slightly melt a target block. */ + private void trySlightlyMelt( World world, BlockPos pos, Random random ) { + final BlockState state = world.getBlockState( pos ); + if( state.is( this ) && canMelt( world, pos ) ) slightlyMelt( state, world, pos, random ); + } + + /** @return Increments the block's melting and returns true if the block was completely melted. */ + private boolean slightlyMelt( BlockState state, World world, BlockPos pos, Random random ) { + int age = state.getValue( AGE ); + if( age < 3 ) { + world.setBlock( pos, state.setValue( AGE, age + 1 ), References.SetBlockFlags.UPDATE_CLIENT ); + scheduleTick( world, pos, random ); + return false; + } + else { + melt( state, world, pos ); + return true; + } + } + + /** Melts the ice block. */ + @Override + protected void melt( BlockState state, World world, BlockPos pos ) { + if( world.dimensionType().ultraWarm() || !state.getValue( HAS_WATER ) ) { + world.removeBlock( pos, false ); + } + else { + world.setBlockAndUpdate( pos, Blocks.WATER.defaultBlockState() ); + world.neighborChanged( pos, Blocks.WATER, pos ); + } + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/block/UnderwaterSilverfishBlock.java b/src/main/java/fathertoast/specialmobs/common/block/UnderwaterSilverfishBlock.java new file mode 100644 index 0000000..0b38161 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/block/UnderwaterSilverfishBlock.java @@ -0,0 +1,99 @@ +package fathertoast.specialmobs.common.block; + +import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.core.register.SMBlocks; +import fathertoast.specialmobs.common.entity.silverfish.PufferSilverfishEntity; +import fathertoast.specialmobs.common.util.References; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.block.SilverfishBlock; +import net.minecraft.block.material.Material; +import net.minecraft.entity.monster.SilverfishEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; + +import java.util.Random; +import java.util.function.Function; + +/** + * A variation of the regular silverfish block intended for placement under water. + * Contains a puffer silverfish instead of a vanilla one. + */ +public class UnderwaterSilverfishBlock extends SilverfishBlock { + + public enum Type { + TUBE( "tube", Blocks.TUBE_CORAL_BLOCK, + ( langKey ) -> References.translations( langKey, "Infested Tube Coral Block", + "", "", "", "", "", "" ) ),//TODO + + BRAIN( "brain", Blocks.BRAIN_CORAL_BLOCK, + ( langKey ) -> References.translations( langKey, "Infested Brain Coral Block", + "", "", "", "", "", "" ) ),//TODO + + BUBBLE( "bubble", Blocks.BUBBLE_CORAL_BLOCK, + ( langKey ) -> References.translations( langKey, "Infested Bubble Coral Block", + "", "", "", "", "", "" ) ),//TODO + + FIRE( "fire", Blocks.FIRE_CORAL_BLOCK, + ( langKey ) -> References.translations( langKey, "Infested Fire Coral Block", + "", "", "", "", "", "" ) ),//TODO + + HORN( "horn", Blocks.HORN_CORAL_BLOCK, + ( langKey ) -> References.translations( langKey, "Infested Horn Coral Block", + "", "", "", "", "", "" ) );//TODO + + private final String ID; + private final Block HOST_BLOCK; + private final Function TRANSLATIONS; + + Type( String id, Block hostBlock, Function translations ) { + ID = id; + HOST_BLOCK = hostBlock; + TRANSLATIONS = translations; + } + + /** @return The block id for this underwater silverfish block type. */ + public String blockId() { return "infested_" + ID + "_coral_block"; } + + /** @return A new underwater silverfish block for this type. */ + public Block blockSupplier() { return new UnderwaterSilverfishBlock( HOST_BLOCK ); } + + /** @return The 'host block' of this type; that is, the block this type imitates. */ + public Block hostBlock() { return HOST_BLOCK; } + + /** @return The 'infested block' of this type; that is, the actual silverfish block. */ + public Block block() { return SMBlocks.INFESTED_CORAL.get( ordinal() ).get(); } + + /** @return The translations of this type. */ + private String[] getTranslations( String langKey ) { return TRANSLATIONS.apply( langKey ); } + + /** @return Looks up and returns the translations for the type lang key. */ + private static String[] getTranslationsFor( String langKey ) { + for( Type type : values() ) { + if( langKey.contains( type.ID ) ) return type.getTranslations( langKey ); + } + // This will cause the lang provider to throw an exception for us + return References.translations( langKey, "", "", "", "", "", "", "" ); + } + + /** @return A random underwater silverfish block type. */ + public static Type next( Random random ) { return values()[random.nextInt( values().length )]; } + } + + @SpecialMob.LanguageProvider + public static String[] getTranslations( String langKey ) { return Type.getTranslationsFor( langKey ); } + + public UnderwaterSilverfishBlock( Block block ) { + super( block, Properties.of( Material.CLAY ).strength( 0.0F, 0.75F ) ); + } + + @Override + protected void spawnInfestation( ServerWorld world, BlockPos pos ) { + final SilverfishEntity silverfish = PufferSilverfishEntity.SPECIES.entityType.get().create( world ); + if( silverfish == null ) return; + + silverfish.moveTo( pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, 0.0F, 0.0F ); + world.addFreshEntity( silverfish ); + silverfish.spawnAnim(); + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/block/package-info.java b/src/main/java/fathertoast/specialmobs/common/block/package-info.java new file mode 100644 index 0000000..2135102 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/block/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package fathertoast.specialmobs.common.block; + +import mcp.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/config/species/DrowningCreeperSpeciesConfig.java b/src/main/java/fathertoast/specialmobs/common/config/species/DrowningCreeperSpeciesConfig.java new file mode 100644 index 0000000..220305d --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/config/species/DrowningCreeperSpeciesConfig.java @@ -0,0 +1,47 @@ +package fathertoast.specialmobs.common.config.species; + +import fathertoast.specialmobs.common.bestiary.MobFamily; +import fathertoast.specialmobs.common.config.Config; +import fathertoast.specialmobs.common.config.field.DoubleField; +import fathertoast.specialmobs.common.config.field.IntField; +import fathertoast.specialmobs.common.config.file.ToastConfigSpec; +import fathertoast.specialmobs.common.config.util.ConfigUtil; + +public class DrowningCreeperSpeciesConfig extends CreeperSpeciesConfig { + + public final Drowning DROWNING; + + /** Builds the config spec that should be used for this config. */ + public DrowningCreeperSpeciesConfig( MobFamily.Species species, + boolean cannotExplodeWhileWet, boolean explodeWhileBurning, boolean explodeWhenShot, + double infestedChance, int minPuffPuffs, int maxPuffPuffs ) { + super( species, cannotExplodeWhileWet, explodeWhileBurning, explodeWhenShot ); + + DROWNING = new Drowning( SPEC, species, species.getConfigName(), infestedChance, minPuffPuffs, maxPuffPuffs ); + } + + public static class Drowning extends Config.AbstractCategory { + + public final DoubleField infestedBlockChance; + + public final IntField.RandomRange puffPuffs; + + Drowning( ToastConfigSpec parent, MobFamily.Species species, String speciesName, + double infestedChance, int minPuffPuffs, int maxPuffPuffs ) { + super( parent, ConfigUtil.camelCaseToLowerUnderscore( species.specialVariantName ), + "Options specific to " + speciesName + "." ); + + infestedBlockChance = SPEC.define( new DoubleField( "infested_chance", infestedChance, DoubleField.Range.PERCENT, + "Chance for explosion's coral shell blocks to be infested with aquatic silverfish.", + "Rolled for each coral block generated." ) ); + + SPEC.newLine(); + + puffPuffs = new IntField.RandomRange( + SPEC.define( new IntField( "pufferfish.min", minPuffPuffs, IntField.Range.NON_NEGATIVE, + "The minimum and maximum (inclusive) limit on the number of pufferfish that " + speciesName + " spawn with their explosion." ) ), + SPEC.define( new IntField( "pufferfish.max", maxPuffPuffs, IntField.Range.NON_NEGATIVE ) ) + ); + } + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/config/species/SnowCreeperSpeciesConfig.java b/src/main/java/fathertoast/specialmobs/common/config/species/SnowCreeperSpeciesConfig.java new file mode 100644 index 0000000..8bb4e7d --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/config/species/SnowCreeperSpeciesConfig.java @@ -0,0 +1,35 @@ +package fathertoast.specialmobs.common.config.species; + +import fathertoast.specialmobs.common.bestiary.MobFamily; +import fathertoast.specialmobs.common.config.Config; +import fathertoast.specialmobs.common.config.field.DoubleField; +import fathertoast.specialmobs.common.config.file.ToastConfigSpec; +import fathertoast.specialmobs.common.config.util.ConfigUtil; + +public class SnowCreeperSpeciesConfig extends CreeperSpeciesConfig { + + public final Snow SNOW; + + /** Builds the config spec that should be used for this config. */ + public SnowCreeperSpeciesConfig( MobFamily.Species species, + boolean cannotExplodeWhileWet, boolean explodeWhileBurning, boolean explodeWhenShot, + double globeChance ) { + super( species, cannotExplodeWhileWet, explodeWhileBurning, explodeWhenShot ); + + SNOW = new Snow( SPEC, species, species.getConfigName(), globeChance ); + } + + public static class Snow extends Config.AbstractCategory { + + public final DoubleField snowGlobeChance; + + Snow( ToastConfigSpec parent, MobFamily.Species species, String speciesName, double globeChance ) { + super( parent, ConfigUtil.camelCaseToLowerUnderscore( species.specialVariantName ), + "Options specific to " + speciesName + "." ); + + snowGlobeChance = SPEC.define( new DoubleField( "snow_globe_chance", globeChance, DoubleField.Range.PERCENT, + "Chance for " + speciesName + " to create a snow globe instead of regular walls when exploding.", + "The globe is always chosen if the " + species.getConfigNameSingular() + " is underwater for some reason." ) ); + } + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java index 98ef479..49cc522 100644 --- a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java +++ b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java @@ -2,6 +2,7 @@ package fathertoast.specialmobs.common.core; import fathertoast.specialmobs.common.compat.top.SMTheOneProbe; import fathertoast.specialmobs.common.config.Config; +import fathertoast.specialmobs.common.core.register.SMBlocks; import fathertoast.specialmobs.common.core.register.SMEffects; import fathertoast.specialmobs.common.core.register.SMEntities; import fathertoast.specialmobs.common.core.register.SMItems; @@ -56,11 +57,7 @@ public class SpecialMobs { * - weight (opposite of levitation) * + blocks * + infested coral (spawns puffer silverfish) - * + melting ice - * - has variant that turns to air when melted - * - melts if not below melting ice or if above air (regardless of light/temp) - * - melts faster in brighter light - * - melts faster when next to non-solid blocks + * + melting ice (similar to frosted ice) * - entities * + bestiary * - configurable, nbt-driven stats (bestiary info + special mob data) @@ -143,9 +140,10 @@ public class SpecialMobs { final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - SMEffects.REGISTRY.register( modEventBus ); - SMEntities.REGISTRY.register( modEventBus ); + SMBlocks.REGISTRY.register( modEventBus ); SMItems.REGISTRY.register( modEventBus ); + SMEntities.REGISTRY.register( modEventBus ); + SMEffects.REGISTRY.register( modEventBus ); modEventBus.addListener( SMEntities::createAttributes ); modEventBus.addListener( this::setup ); diff --git a/src/main/java/fathertoast/specialmobs/common/core/register/SMBlocks.java b/src/main/java/fathertoast/specialmobs/common/core/register/SMBlocks.java new file mode 100644 index 0000000..f9612e1 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/core/register/SMBlocks.java @@ -0,0 +1,49 @@ +package fathertoast.specialmobs.common.core.register; + +import fathertoast.specialmobs.common.block.MeltingIceBlock; +import fathertoast.specialmobs.common.block.UnderwaterSilverfishBlock; +import fathertoast.specialmobs.common.core.SpecialMobs; +import net.minecraft.block.Block; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Supplier; + +public class SMBlocks { + /** The deferred register for this mod's blocks. */ + public static final DeferredRegister REGISTRY = DeferredRegister.create( ForgeRegistries.BLOCKS, SpecialMobs.MOD_ID ); + + public static final RegistryObject MELTING_ICE = registerTechnicalBlock( "melting_ice", MeltingIceBlock::new ); + + public static final List> INFESTED_CORAL; + + static { + final ArrayList> infestedCoral = new ArrayList<>(); + for( UnderwaterSilverfishBlock.Type type : UnderwaterSilverfishBlock.Type.values() ) { + infestedCoral.add( registerBlock( type.blockId(), type::blockSupplier, ItemGroup.TAB_DECORATIONS ) ); + } + infestedCoral.trimToSize(); + INFESTED_CORAL = Collections.unmodifiableList( infestedCoral ); + } + + /** Registers a block and a simple BlockItem for it. */ + private static RegistryObject registerBlock( String name, Supplier blockSupplier, ItemGroup itemGroup ) { + final RegistryObject blockRegObject = REGISTRY.register( name, blockSupplier ); + SMItems.REGISTRY.register( name, () -> new BlockItem( blockRegObject.get(), new Item.Properties().tab( itemGroup ) ) ); + return blockRegObject; + } + + /** Registers a technical block (not visible in the creative menu) and a simple BlockItem for it. */ + private static RegistryObject registerTechnicalBlock( String name, Supplier blockSupplier ) { + final RegistryObject blockRegObject = REGISTRY.register( name, blockSupplier ); + SMItems.REGISTRY.register( name, () -> new BlockItem( blockRegObject.get(), new Item.Properties() ) ); + return blockRegObject; + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/entity/creeper/DrowningCreeperEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/creeper/DrowningCreeperEntity.java index a6c7a7e..092652d 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/creeper/DrowningCreeperEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/creeper/DrowningCreeperEntity.java @@ -3,6 +3,8 @@ package fathertoast.specialmobs.common.entity.creeper; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.block.UnderwaterSilverfishBlock; +import fathertoast.specialmobs.common.config.species.DrowningCreeperSpeciesConfig; import fathertoast.specialmobs.common.config.species.SpeciesConfig; import fathertoast.specialmobs.common.config.util.EnvironmentEntry; import fathertoast.specialmobs.common.config.util.EnvironmentList; @@ -39,6 +41,7 @@ import net.minecraft.world.IServerWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.Biomes; import java.util.Random; @@ -61,12 +64,19 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp @SpecialMob.ConfigSupplier public static SpeciesConfig createConfig( MobFamily.Species species ) { SpeciesConfig.NEXT_NATURAL_SPAWN_CHANCE_EXCEPTIONS = new EnvironmentList( + EnvironmentEntry.builder( 0.06F ).inBiome( Biomes.WARM_OCEAN ).build(), + EnvironmentEntry.builder( 0.06F ).inBiome( Biomes.DEEP_WARM_OCEAN ).build(), EnvironmentEntry.builder( 0.06F ).inBiomeCategory( BiomeCategory.RIVER ).build(), EnvironmentEntry.builder( 0.02F ).inBiomeCategory( BiomeCategory.OCEAN ).belowSeaDepths().build(), EnvironmentEntry.builder( 0.0F ).inBiomeCategory( BiomeCategory.OCEAN ).build() ); - return _SpecialCreeperEntity.createConfig( species ); + return new DrowningCreeperSpeciesConfig( species, false, false, false, + 0.25, 2, 4 ); } + /** @return This entity's species config. */ + @Override + public DrowningCreeperSpeciesConfig getConfig() { return (DrowningCreeperSpeciesConfig) getSpecies().config; } + @SpecialMob.SpawnPlacementRegistrar public static void registerSpeciesSpawnPlacement( MobFamily.Species species ) { NaturalSpawnManager.registerSpawnPlacement( species, EntitySpawnPlacementRegistry.PlacementType.IN_WATER, @@ -115,6 +125,9 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp //--------------- Variant-Specific Implementations ---------------- + /** The maximum number of pufferfish spawned on explosion. */ + private int pufferfish; + public DrowningCreeperEntity( EntityType entityType, World world ) { super( entityType, world ); moveControl = new AmphibiousMovementController<>( this ); @@ -122,6 +135,8 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp groundNavigation = new GroundPathNavigator( this, world ); maxUpStep = 1.0F; setPathfindingMalus( PathNodeType.WATER, PathNodeType.WALKABLE.getMalus() ); + + pufferfish = getConfig().DROWNING.puffPuffs.next( random ); } /** Override to change this entity's AI goals. */ @@ -148,17 +163,23 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp if( explosionMode == Explosion.Mode.NONE ) return; - final BlockState brainCoral = Blocks.BRAIN_CORAL_BLOCK.defaultBlockState(); - final BlockState hornCoral = Blocks.HORN_CORAL_BLOCK.defaultBlockState(); + final UnderwaterSilverfishBlock.Type mainType = UnderwaterSilverfishBlock.Type.next( random ); + final UnderwaterSilverfishBlock.Type rareType = UnderwaterSilverfishBlock.Type.next( random ); + final BlockState mainCoral = mainType.hostBlock().defaultBlockState(); + final BlockState rareCoral = rareType.hostBlock().defaultBlockState(); + final BlockState mainInfestedCoral = mainType.block().defaultBlockState(); + final BlockState rareInfestedCoral = rareType.block().defaultBlockState(); + final BlockState water = Blocks.WATER.defaultBlockState(); final BlockState seaPickle = Blocks.SEA_PICKLE.defaultBlockState().setValue( BlockStateProperties.WATERLOGGED, true ); final BlockState seaGrass = Blocks.SEAGRASS.defaultBlockState(); final int radius = (int) Math.floor( explosionPower ); + final int radiusSq = radius * radius; final int rMinusOneSq = (radius - 1) * (radius - 1); final BlockPos center = new BlockPos( explosion.getPos() ); // Track how many pufferfish have been spawned so we don't spawn a bunch of them - spawnPufferfish( center.above( 1 ) ); + if( pufferfish > 0 ) spawnPufferfish( center.above( 1 ) ); int pufferCount = 1; for( int y = -radius; y <= radius; y++ ) { @@ -166,16 +187,13 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp for( int z = -radius; z <= radius; z++ ) { final int distSq = x * x + y * y + z * z; - if( distSq <= radius * radius ) { + if( distSq <= radiusSq ) { final BlockPos pos = center.offset( x, y, z ); final BlockState stateAtPos = level.getBlockState( pos ); if( stateAtPos.getMaterial().isReplaceable() || stateAtPos.is( BlockTags.LEAVES ) ) { - if( distSq > rMinusOneSq ) { - // "Coral" casing - MobHelper.placeBlock( this, pos, random.nextFloat() < 0.25F ? brainCoral : hornCoral ); - } - else { + if( distSq <= rMinusOneSq ) { + // Water fill final float fillChoice = random.nextFloat(); if( fillChoice < 0.1F && seaPickle.canSurvive( level, pos ) ) { @@ -188,12 +206,19 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp // Water fill MobHelper.placeBlock( this, pos, water ); - if( random.nextFloat() < 0.0075F && pufferCount < 5 ) { + if( random.nextFloat() < 0.0075F && pufferCount < pufferfish ) { spawnPufferfish( pos ); pufferCount++; } } } + else if( isCoralSafe( rMinusOneSq, x, y, z ) ) { + // Coral casing + final boolean infested = getConfig().DROWNING.infestedBlockChance.rollChance( random ); + MobHelper.placeBlock( this, pos, random.nextFloat() < 0.8F ? + infested ? mainInfestedCoral : mainCoral : + infested ? rareInfestedCoral : rareCoral ); + } } } } @@ -211,6 +236,28 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp } } + /** @return Checks the inner three-ish block distances and returns true if at least one is inside the main radius. */ + @SuppressWarnings( "RedundantIfStatement" ) // The symmetry makes it look better + private boolean isCoralSafe( int rMinusOneSq, int x, int y, int z ) { + int distSq; + if( y != 0 ) { + final int innerY = y < 0 ? y + 1 : y - 1; + distSq = x * x + innerY * innerY + z * z; + if( distSq <= rMinusOneSq ) return true; + } + if( x != 0 ) { + final int innerX = x < 0 ? x + 1 : x - 1; + distSq = innerX * innerX + y * y + z * z; + if( distSq <= rMinusOneSq ) return true; + } + if( z != 0 ) { + final int innerZ = z < 0 ? z + 1 : z - 1; + distSq = x * x + y * y + innerZ * innerZ; + if( distSq <= rMinusOneSq ) return true; + } + return false; + } + // The below two methods are here to effectively override the private Entity#isInRain to always return true (always wet) @Override public boolean isInWaterOrRain() { return true; } @@ -218,9 +265,18 @@ public class DrowningCreeperEntity extends _SpecialCreeperEntity implements IAmp @Override public boolean isInWaterRainOrBubble() { return true; } + /** Override to save data to this entity's NBT data. */ + @Override + public void addVariantSaveData( CompoundNBT saveTag ) { + saveTag.putByte( References.TAG_SUMMONS, (byte) pufferfish ); + } + /** Override to load data from this entity's NBT data. */ @Override public void readVariantSaveData( CompoundNBT saveTag ) { + if( saveTag.contains( References.TAG_SUMMONS, References.NBT_TYPE_NUMERICAL ) ) + pufferfish = saveTag.getByte( References.TAG_SUMMONS ); + setPathfindingMalus( PathNodeType.WATER, PathNodeType.WALKABLE.getMalus() ); } diff --git a/src/main/java/fathertoast/specialmobs/common/entity/creeper/SnowCreeperEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/creeper/SnowCreeperEntity.java index 41ec6ee..ea1f8f9 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/creeper/SnowCreeperEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/creeper/SnowCreeperEntity.java @@ -3,6 +3,9 @@ package fathertoast.specialmobs.common.entity.creeper; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.block.MeltingIceBlock; +import fathertoast.specialmobs.common.config.species.SnowCreeperSpeciesConfig; +import fathertoast.specialmobs.common.config.species.SpeciesConfig; import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.entity.ai.AIHelper; import fathertoast.specialmobs.common.entity.ai.FluidPathNavigator; @@ -12,6 +15,7 @@ import fathertoast.specialmobs.common.util.References; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.FlowingFluidBlock; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnReason; import net.minecraft.entity.ai.attributes.Attributes; @@ -45,6 +49,16 @@ public class SnowCreeperEntity extends _SpecialCreeperEntity { .addToAttribute( Attributes.MAX_HEALTH, 10.0 ); } + @SpecialMob.ConfigSupplier + public static SpeciesConfig createConfig( MobFamily.Species species ) { + return new SnowCreeperSpeciesConfig( species, false, false, false, + 0.33 ); + } + + /** @return This entity's species config. */ + @Override + public SnowCreeperSpeciesConfig getConfig() { return (SnowCreeperSpeciesConfig) getSpecies().config; } + @SpecialMob.LanguageProvider public static String[] getTranslations( String langKey ) { return References.translations( langKey, "Snow Creeper", @@ -123,7 +137,9 @@ public class SnowCreeperEntity extends _SpecialCreeperEntity { final BlockPos center = new BlockPos( explosion.getPos() ); if( explosionMode != Explosion.Mode.NONE ) { - final BlockState ice = Blocks.ICE.defaultBlockState(); + final boolean snowGlobe = isUnderWater() || random.nextDouble() < getConfig().SNOW.snowGlobeChance.get(); + + final int radiusSq = radius * radius; final int rMinusOneSq = (radius - 1) * (radius - 1); for( int y = -radius; y <= radius; y++ ) { @@ -131,19 +147,32 @@ public class SnowCreeperEntity extends _SpecialCreeperEntity { for( int z = -radius; z <= radius; z++ ) { final int distSq = x * x + y * y + z * z; - if( distSq <= radius * radius ) { + if( distSq <= radiusSq ) { final BlockPos pos = center.offset( x, y, z ); - // Freeze top layer of water and temporary ice within affected volume + // Freeze top layer of water sources and frosted ice within affected volume final BlockState block = level.getBlockState( pos ); - if( block.is( Blocks.FROSTED_ICE ) || block.getFluidState().is( FluidTags.WATER ) ) { + if( block.is( Blocks.FROSTED_ICE ) || block.getBlock() == Blocks.WATER && block.getValue( FlowingFluidBlock.LEVEL ) == 0 ) { final BlockState blockAbove = level.getBlockState( pos.above() ); - if( !blockAbove.getMaterial().blocksMotion() && !blockAbove.getFluidState().is( FluidTags.WATER ) ) - MobHelper.placeBlock( this, pos, ice ); + if( !blockAbove.getMaterial().blocksMotion() && !blockAbove.getFluidState().is( FluidTags.WATER ) && + MobHelper.placeBlock( this, pos, MeltingIceBlock.getState( level, pos ) ) ) { + MeltingIceBlock.scheduleFirstTick( level, pos, random ); + } } - // Attempt to place pillars along circumference only - if( y == 0 && distSq > rMinusOneSq ) placePillar( pos, radius ); + if( distSq > rMinusOneSq ) { + if( snowGlobe ) { + // Create spherical shell of ice + if( level.getBlockState( pos ).getMaterial().isReplaceable() && + MobHelper.placeBlock( this, pos, MeltingIceBlock.getState( level, pos ) ) ) { + MeltingIceBlock.scheduleFirstTick( level, pos, random ); + } + } + else if( y == 0 ) { + // Create ice wall + placePillar( pos, radius ); + } + } } } } @@ -164,13 +193,14 @@ public class SnowCreeperEntity extends _SpecialCreeperEntity { if( shouldReplace( currentPos ) ) findGroundBelow( currentPos, radius ); else if( findGroundAbove( currentPos, radius ) ) return; - final BlockState ice = Blocks.PACKED_ICE.defaultBlockState(); final int maxY = Math.min( currentPos.getY() + 4, level.getMaxBuildHeight() - 2 ); int height = -2; // This is minimum pillar height if( pos.getY() > currentPos.getY() ) height -= (pos.getY() - currentPos.getY()) / 2; while( currentPos.getY() < maxY && shouldReplace( currentPos ) ) { - MobHelper.placeBlock( this, currentPos, ice ); + if( MobHelper.placeBlock( this, currentPos, MeltingIceBlock.getState( level, currentPos ) ) ) { + MeltingIceBlock.scheduleFirstTick( level, currentPos, random ); + } currentPos.move( 0, 1, 0 ); if( ++height >= 0 && random.nextBoolean() ) break; diff --git a/src/main/java/fathertoast/specialmobs/common/entity/drowned/FrozenDrownedEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/drowned/FrozenDrownedEntity.java index 93a418e..35f6699 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/drowned/FrozenDrownedEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/drowned/FrozenDrownedEntity.java @@ -3,6 +3,7 @@ package fathertoast.specialmobs.common.entity.drowned; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.block.MeltingIceBlock; import fathertoast.specialmobs.common.entity.MobHelper; import fathertoast.specialmobs.common.util.ExplosionHelper; import fathertoast.specialmobs.common.util.References; @@ -134,9 +135,8 @@ public class FrozenDrownedEntity extends _SpecialDrownedEntity { SoundEvents.GLASS_BREAK, getSoundSource(), 0.4F, 1.0F / (random.nextFloat() * 0.4F + 0.8F) ); } - final BlockState block = Blocks.FROSTED_ICE.defaultBlockState(); if( radius <= 0 ) { - placeSealBlock( center, block ); + placeSealBlock( center ); return; } @@ -146,21 +146,18 @@ public class FrozenDrownedEntity extends _SpecialDrownedEntity { // Fill circle if( distSq <= radius * radius ) { - placeSealBlock( center.offset( x, 0, z ), block ); + placeSealBlock( center.offset( x, 0, z ) ); } } } } /** Attempts to place a single seal block. */ - private void placeSealBlock( BlockPos pos, BlockState block ) { - final BlockState currentBlock = level.getBlockState( pos ); - if( currentBlock.getBlock() == Blocks.WATER && currentBlock.getValue( FlowingFluidBlock.LEVEL ) == 0 && - block.canSurvive( level, pos ) && level.isUnobstructed( block, pos, ISelectionContext.empty() ) ) { - if( MobHelper.placeBlock( this, pos, block ) ) { - level.getBlockTicks().scheduleTick( pos, Blocks.FROSTED_ICE, - MathHelper.nextInt( random, 60, 120 ) ); - } + private void placeSealBlock( BlockPos pos ) { + final BlockState block = MeltingIceBlock.getState( level, pos ); + if( level.getBlockState( pos ).getMaterial().isReplaceable() && level.isUnobstructed( block, pos, ISelectionContext.empty() ) && + MobHelper.placeBlock( this, pos, block ) ) { + MeltingIceBlock.scheduleFirstTick( level, pos, random ); } } } \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/util/AnnotationHelper.java b/src/main/java/fathertoast/specialmobs/common/util/AnnotationHelper.java index eb77e94..f5a32ff 100644 --- a/src/main/java/fathertoast/specialmobs/common/util/AnnotationHelper.java +++ b/src/main/java/fathertoast/specialmobs/common/util/AnnotationHelper.java @@ -5,10 +5,12 @@ import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; import fathertoast.specialmobs.common.config.species.SpeciesConfig; import fathertoast.specialmobs.datagen.loot.LootTableBuilder; +import net.minecraft.block.Block; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.attributes.AttributeModifierMap; import net.minecraft.item.Item; +import net.minecraftforge.registries.ForgeRegistryEntry; import javax.annotation.Nullable; import java.lang.annotation.Annotation; @@ -103,14 +105,20 @@ public final class AnnotationHelper { } } - /** Gets the translations from a mod item. Throws an exception if anything goes wrong. */ - public static String[] getTranslations( Item item ) { + /** Gets the translations from a block. Throws an exception if anything goes wrong. */ + public static String[] getTranslations( Block block ) { return getTranslations( block, block.getDescriptionId() ); } + + /** Gets the translations from an item. Throws an exception if anything goes wrong. */ + public static String[] getTranslations( Item item ) { return getTranslations( item, item.getDescriptionId() ); } + + /** Gets the translations from a registry entry. Throws an exception if anything goes wrong. */ + public static String[] getTranslations( ForgeRegistryEntry entry, String key ) { try { - return (String[]) getMethod( item.getClass(), SpecialMob.LanguageProvider.class ) - .invoke( null, item.getDescriptionId() ); + return (String[]) getMethod( entry.getClass(), SpecialMob.LanguageProvider.class ) + .invoke( null, key ); } catch( NoSuchMethodException | InvocationTargetException | IllegalAccessException ex ) { - throw new RuntimeException( "Item class for " + item.getRegistryName() + " has invalid language provider method", ex ); + throw new RuntimeException( "Class for " + entry.getRegistryName() + " has invalid language provider method", ex ); } } diff --git a/src/main/java/fathertoast/specialmobs/common/util/References.java b/src/main/java/fathertoast/specialmobs/common/util/References.java index 9f43b76..8440da1 100644 --- a/src/main/java/fathertoast/specialmobs/common/util/References.java +++ b/src/main/java/fathertoast/specialmobs/common/util/References.java @@ -256,7 +256,7 @@ public final class References { // Spawner mobs public static final String TAG_BABIES = "Babies"; // Mother (Cave) Spider, Wilds Witch, Queen Ghast, Wildfire Blaze public static final String TAG_EXTRA_BABIES = "ExtraBabies"; // Splitting Creeper, Mother (Cave) Spider, Wilds Witch - public static final String TAG_SUMMONS = "Summons"; // Undead Witch, Wilds Witch, Queen Ghast, Wildfire Blaze + public static final String TAG_SUMMONS = "Summons"; // Drowning Creeper, Undead Witch, Wilds Witch, Queen Ghast, Wildfire Blaze // Growing mobs public static final String TAG_GROWTH_LEVEL = "GrowthLevel"; // Hungry Spider, Conflagration Blaze diff --git a/src/main/java/fathertoast/specialmobs/datagen/DataGatherListener.java b/src/main/java/fathertoast/specialmobs/datagen/DataGatherListener.java index 16a49eb..587851b 100644 --- a/src/main/java/fathertoast/specialmobs/datagen/DataGatherListener.java +++ b/src/main/java/fathertoast/specialmobs/datagen/DataGatherListener.java @@ -16,6 +16,7 @@ public class DataGatherListener { DataGenerator generator = event.getGenerator(); if( event.includeClient() ) { + generator.addProvider( new SMBlockStateAndModelProvider( generator, event.getExistingFileHelper() ) ); generator.addProvider( new SMItemModelProvider( generator, event.getExistingFileHelper() ) ); for( Map.Entry entry : SMLanguageProvider.LANG_CODE_MAP.entrySet() ) { generator.addProvider( new SMLanguageProvider( generator, entry.getKey(), entry.getValue() ) ); diff --git a/src/main/java/fathertoast/specialmobs/datagen/SMBlockStateAndModelProvider.java b/src/main/java/fathertoast/specialmobs/datagen/SMBlockStateAndModelProvider.java new file mode 100644 index 0000000..8adfb72 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/datagen/SMBlockStateAndModelProvider.java @@ -0,0 +1,45 @@ +package fathertoast.specialmobs.datagen; + +import fathertoast.specialmobs.common.block.MeltingIceBlock; +import fathertoast.specialmobs.common.block.UnderwaterSilverfishBlock; +import fathertoast.specialmobs.common.core.SpecialMobs; +import fathertoast.specialmobs.common.core.register.SMBlocks; +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; +import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ModelProvider; +import net.minecraftforge.client.model.generators.VariantBlockStateBuilder; +import net.minecraftforge.common.data.ExistingFileHelper; + +import java.util.Objects; + +public class SMBlockStateAndModelProvider extends BlockStateProvider { + + public SMBlockStateAndModelProvider( DataGenerator gen, ExistingFileHelper existingFileHelper ) { + super( gen, SpecialMobs.MOD_ID, existingFileHelper ); + } + + @Override + protected void registerStatesAndModels() { + String name; + + // Melting ice + final VariantBlockStateBuilder builder = getVariantBuilder( SMBlocks.MELTING_ICE.get() ); + name = Objects.requireNonNull( Blocks.FROSTED_ICE.getRegistryName() ).getPath(); + for( int age = 0; age <= 3; age++ ) { + builder.partialState().with( MeltingIceBlock.AGE, age ).modelForState().modelFile( models().getExistingFile( + mcLoc( ModelProvider.BLOCK_FOLDER + "/" + name + "_" + age ) ) ).addModel(); + } + itemModels().withExistingParent( SMBlocks.MELTING_ICE.getId().getPath(), + mcLoc( ModelProvider.BLOCK_FOLDER + "/" + name + "_0" ) ); + + // Infested coral + for( UnderwaterSilverfishBlock.Type type : UnderwaterSilverfishBlock.Type.values() ) { + name = Objects.requireNonNull( type.hostBlock().getRegistryName() ).getPath(); + + getVariantBuilder( type.block() ).partialState().modelForState().modelFile( models().getExistingFile( + mcLoc( ModelProvider.BLOCK_FOLDER + "/" + name ) ) ).addModel(); + itemModels().withExistingParent( type.blockId(), mcLoc( ModelProvider.BLOCK_FOLDER + "/" + name ) ); + } + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/datagen/SMItemModelProvider.java b/src/main/java/fathertoast/specialmobs/datagen/SMItemModelProvider.java index 9828350..33fe00c 100644 --- a/src/main/java/fathertoast/specialmobs/datagen/SMItemModelProvider.java +++ b/src/main/java/fathertoast/specialmobs/datagen/SMItemModelProvider.java @@ -22,15 +22,16 @@ public class SMItemModelProvider extends ItemModelProvider { protected void registerModels() { // Bestiary-generated spawn egg models final ResourceLocation spawnEggParent = modLoc( ITEM_FOLDER + "/template_sm_spawn_egg" ); - for( MobFamily.Species species : MobFamily.getAllSpecies() ) + for( MobFamily.Species species : MobFamily.getAllSpecies() ) { withExistingParent( species.spawnEgg.getId().getPath(), spawnEggParent ); - + } + // Simple items - for(RegistryObject regObject : SMItems.SIMPLE_ITEMS) { - String name = Objects.requireNonNull(regObject.getId()).getPath(); - - withExistingParent(name, mcLoc("item/generated")) - .texture("layer0", modLoc(ITEM_FOLDER + "/" + name)); + for( RegistryObject regObject : SMItems.SIMPLE_ITEMS ) { + final String name = Objects.requireNonNull( regObject.getId() ).getPath(); + + withExistingParent( name, mcLoc( ITEM_FOLDER + "/generated" ) ) + .texture( "layer0", modLoc( ITEM_FOLDER + "/" + name ) ); } } } \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java b/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java index 3e6ab25..125555f 100644 --- a/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java +++ b/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java @@ -2,12 +2,15 @@ package fathertoast.specialmobs.datagen; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.core.SpecialMobs; +import fathertoast.specialmobs.common.core.register.SMBlocks; import fathertoast.specialmobs.common.core.register.SMEffects; import fathertoast.specialmobs.common.core.register.SMEntities; import fathertoast.specialmobs.common.core.register.SMItems; import fathertoast.specialmobs.common.util.AnnotationHelper; import fathertoast.specialmobs.common.util.References; +import net.minecraft.block.Block; import net.minecraft.data.DataGenerator; +import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraftforge.common.ForgeSpawnEggItem; import net.minecraftforge.common.data.LanguageProvider; @@ -71,13 +74,18 @@ public class SMLanguageProvider extends LanguageProvider { translationList.add( References.translations( SMEntities.FISHING_BOBBER.get().getDescriptionId(), "Fishing Bobber", "", "", "", "", "", "" ) ); //TODO + // Blocks + for( RegistryObject regObject : SMBlocks.REGISTRY.getEntries() ) { + translationList.add( AnnotationHelper.getTranslations( regObject.get() ) ); + } + // Items for( RegistryObject regObject : SMItems.REGISTRY.getEntries() ) { // Lazy method of avoiding duplicate entries for now if( regObject.get() instanceof ForgeSpawnEggItem ) continue; + if( regObject.get() instanceof BlockItem ) continue; - final String[] itemTranslations = AnnotationHelper.getTranslations( regObject.get() ); - translationList.add( itemTranslations ); + translationList.add( AnnotationHelper.getTranslations( regObject.get() ) ); } // Misc diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 71af7c8..d95e0bf 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -9,6 +9,9 @@ public net.minecraft.client.renderer.RenderState field_228528_t_ # LIGHTMAP public net.minecraft.client.renderer.RenderState field_228530_v_ # OVERLAY public net.minecraft.client.renderer.RenderState field_228515_g_ # TRANSLUCENT_TRANSPARENCY +# Blocks +protected net.minecraft.block.SilverfishBlock func_235505_a_(Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;)V # spawnInfestation(ServerWorld, BlockPos) + # Entity registration public net.minecraft.entity.EntityType field_233593_bg_ # immuneTo public net.minecraft.entity.ai.attributes.AttributeModifierMap$MutableAttribute field_233811_a_ # builder diff --git a/src/main/resources/assets/specialmobs/textures/entity/drowned/brute.png b/src/main/resources/assets/specialmobs/textures/entity/drowned/brute.png index f1bfe2a22c8f9727a44f2a6481c3e02647aef6a5..9eda24e14dea861daa14be1d6f1738d9fba8db4e 100644 GIT binary patch delta 1105 zcmV-X1g`tV3fl;f8Gi-<0063Kaozv`010qNS#tmY3labT3lag+-G2N400a$5L_t(| zob8*>YujcR$3O9gp#gPjkVL>Osv&qJmmV4zJ!HM~R+?;wQ3y?T9E?%A_P%BP2L@yR zKtt$t6tmkdu1^E!kV{L|70+~LU<>0`;0{CD9qjjws*xMlO~t70a+6&z)gE04LdR;RDi$l>@aVyrD01Zd>A(2 z@wd0rup={64anMnteJTM=0u;Lx7T3p61}~jQ#By#eS$24y+#!p)hunvgqcr)&^GAb z1N4RwGH&d&5`QWH!1fOt0PKE0`ufqtA9&KlJC*>uzx@fo>YXo!ubrtrOcYuGss~e@ zBW^-#fLNvNYZqBL*JtHipY3ZG1MeN1wM(pCE=_lALL4gss2;F8W^7`r2h^rLHX+{Y z!C}|`VSW3v+h4!STLu9AmP@!yhJSW+wds1D(DO&NZT#qm;L0-8=eu;O{kp#MjUX4j)oDq?g!IX6qk z1+hnfa9%_KAR|HWUyh6MG?|Nf&u{sHJ$77(An4Ry00e{pWQ`F23&hydmyIaqh1P^v zBB0&%q<`^w%aA$0xW2_-g-__zUQj3%DU^zGp8pu}*VHw78=HZ#q=_tmSRt`u&zG;T zxV}ZddAb6%jV+3P=5Kuy)oe**0Zd)P zynBzv)f;l`eDinAyY~P%GfV@!Ql{T><(xvP2n?L;ZEW)NWh3CQ7#~NRcdc>|T~QJC zFn?Ip#q}*}`wrcIJn8h|k|iUc-SucXb@`rf$iMQYuE}#INzQM;Bz*egPr$%fyHb|M zH=R1K_8v&%+g*>w)f=37{ZWIr}dX*@k&L2 z_!9IfBQ^oT9i~1 X=M%!R8WQ&(00000NkvXXu0mjfj2#;I literal 1349 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1o3GfMVwae7CPSW=*H1(@Cvj|d~pBItY9+o~KtTVy4a!zXD)ad-FF;;PU zQPmz&Qc`cfJu>o8x^QPtnCBS{4Go5Q^UR`D4K#`v)~{zcbH>WB)6HtBnqo9VeLX{T zG{cG&3^QjkWMqVwx*K~b+uPe`XJ`BP`1JSpSCyA1CMHJMYNxmvst0;o$Hi7e+63ff zc^j+vPHG5isSDXz1a#n&AI}qjlu1dDU+{m@0fTqAQYuhCXMsm#F#`kN0T5=)y4K0b zz`*>;)5S3)!u{>k-10|e0!GUAne6$)HQvWBU)@h=2dlI*W1 z;~iG={?5#a9k*CD)|$lI$yw>dAN6#QT+3VXwlHRY+hhlp+X@Ta9qJD`iYO)+eDGw< zRchuA`oJXbf3UrON!NT4g<7u#6~ClrZKx4-XT0y|E0p5so+rMb{7U?;|GrM$jena= zTxM##sTMCvOOW35U+nlL&y~vBUyjrt+E=c~*qX5D$@cq~?S<~2C|IU6C&st6U`DTx zNd5FX`;V6dWu0{2a^-4Xg<19DH}CX%-@h~3vZ1-vW6R>`pb4{zSsq2awrG=Gb>P60 zDTn$WKjwK<{iM0~_~MThI_nlsoFXP)VQu;2^AC$=kw7NHM~tfS(|Eqgt-H?|zhwV` z`v=xH?D=p)oiVX8{r&s3Ke*P*<#V4XmFU%Dd3W&jwYmt0bLkade-v;9E&T9mVT!Zm zTtD^AH+vGJLa*-8I^u9}%c@UzB45YE+1i9C6-Y4u_eprf`f68Mn>_2M2Z9_ z-%RBBv$sKjpQ%8L-CV0DHO^X_Z%y;^+_bf6i_Wp0+UwBi5b5{4)OP#S-k#8N=VSA9 z<72bG3hef|S~X9zTxZFwDeR3xD?KC6KcA2@@%Aahxwm6jin^AE@T8n^cl6HT|4uTx|9Joxn7$)A3k zOpIeLKQZ)U`oEOHIKVd0WxnaueKM(nglhz>uBBHJP!2_L}KaN~g%a&z!ZSD0=dA zzIoyT|9|dGsSs;C$-}-VBFOWcTcp^rjR#b_PAEJ)uID8eZ&AT^dj9F9J^!0d=G1TS z(Bl7Wr0!Ywa*(+17XFNFl!2j@stx=}A*S9__z5d%U`~|ihJfglx0^c=(@qoQ*-2C*42dqajpvv9?0cWv6?pf>aNK3 z*KJg7BzEQPeK*@K$NG^I!>_o+-eX*R!FGE;NT(&<7M#wMGik+&3q0=^yp1@>=V^L; z3tz=yM}0Pz1KL}1@0;-oWoMpF)z)W?s;KSmT_)PdS9O_Br~Fcfv`hy}-0o$sIrb}= z?Kyiu!|6Kf2FoqdO}s8gwzk~kyRFOh=xLSULf*q{hc+xOmUX-Jw(K|e&b3!Qh&A@@ z-JNS*P<3)=s)U)e&xiKtAPK9&{nBhV{lBgFDYETM#=)<84@7fP_J_oZw8h^}yj(it xmBvNwJ*o}?I?hL$kEE)(PI~uV~NN6AdHz5i?${MOgkd^i& zRb>$E3xZ1KDKCqvXvGr`$g(1|;t8RsN?-a^q=ML$Usdi zjHi|z$HWUW`!JmAJL3>L*lAeFpA^}dxpRHL@0|O4&Il-jBi{^J05Gk^ut$txamPjo zx{2PIY5YaG3`L8s`23x(FAL>MzrHWXZY-aby|9NrkTJ|fUtN;M;*N-kTH}0L8hM=1e zbQ62T*xI%1S3=n?&^-ieXJ`ljAm}E3{O|(^x(Q1av8al`)S9<(O;OeZyb3U9#4xSJ zV5uTD`_r&g`!PW`*Svvijf%QJ-T*>!9D;7*MM?%>lOLanvoe#{N8jnu{!OSz0IvdQ z={U3eW`7#vGjYfv`#z2Ks-!sn{vRM59gbT7aC0y&bPvH&v?%f)UPj)qiRTTl`M>Sf z9X$TsK>)x8Es05W1m4#?sr+)Fdua`5P;74+pNXSqM;tc?TZ|}{ z48WT)v0shBn_2%cLBS|O<;AWJADbtqaCs-(aii=dFy(V|b|$<#vtK;z6yCmmpj_Hza&~ z=5y~`rJ!z03>Q&G!({k}MYy|23nm8%h#w?fH}pXlqcn!Fw?8;*iE#YFsp&;_W`&5hUZ6)As|c8vj+GvXEi8U3O9K@;5`5+TK`Q4 zA8ssXv62>--Y%4*^`HvCpG`$rakR) zv&?ECoapPZ03f@#1gWtB?eD+GZtAHV7V-slkIE6G#s*wXj0BdkAGq0fl}fGBF~fH zt;Cm8{k|3JaD$BV^W$G|_T*vf`itMNdlOrBLr>+{|GcLX`Gl|a4YZ38o4g+OPj+#M zRoedkdnKf^i%TU!0Y&msV*^_J67*EgK`IgsS#*8$o+j|*>A6TaWS!{iu_ED+6$yu| zf&N}bzRBxh?IPmJ{+-Zw9duY<&l*VhS}~@!Gf~P4Kwqfu^Hy4pEZ=CJJOErxj0@y) zEq;lKK=r789|rn+t*eRg61QAV;OycOBa`s8VqZ9nt(_gvcO67SR|c;_L8y{~?zZhr z2=au4ueG88g6omMF6E6AO zScMmX`YU;mp2~p+ybD)u3*^%7L69ddH8wZ|UdR^^kR|L3hixHWle{??7ibg4?@H6sIKJr&7zE6|U*r+X@1R6cYnYUx=6Qey*ac#B_x>i6NomD>V8*wOuePd!5<9I}>MT=As&XS&`agZT zPk09Ud#!TIPkwwT2ltr*4Sw`VB#AuVMqvHV9P6l~jyme7qmDZ2sH2WL>ZqfRcMml` zETHo~04zMkpV^noFQBj*i%;yb^AhP`rq%}>6=jO97VZ#xrDya&kvIiY`23}{NUT~D z0r(I*fj_2N34Cbo?8(Cxo%U85=~*o*eq&@c;H}R`ZdT(7fb9+Qo7Oh1uIm0oeV#}+ zc|DHs7{wl2{E{Oq#s@=rtGn@2U@x=0Jbo7du%~ki%MYOA_P0gVU4W16vAiO#AG>3J z^hw9xJb8Cu7C;Gk3bRv^M75~N7{FVd|4!f|%)AJIlWfA*io~W4$8~x9E+emP>$1!E zTA`!aT6xNWsti{wM&a;I%-_R)YLW&6_cC?c9(6IHSwU zMVb@7R+eki~3jnt3Qv(CCgrmc8%M(=D%NTr0tGnTp zmk^L8mk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1o3GfMVwae7CPSW=*H1(@Cvj|d~pBItY9+o~KtTVy4a!zXD)ad-FF;;PU zQPmz&Qc`cfJu>o8x^QPtnCBS{4Go5Q^UR`D4K#`v)~{zcbH>WB)6HtBnqo9VeLX{T zG{cG&3^QjkWMqVwx*K~b+uPe`XJ`BP`1JSpSCyA1CMHJMYNxmvst0;o$Hi7e+63ff zc^j+vPHG5isSDXz1a#n&AI}qjlu1dDU+{m@0fTqAQYuhCXMsm#F#`kN0T5=)y4K0b zz`*>;)5S3)!u{>k-10|e0!GUAne6$)HQvWBU)@h=2dlI*W1 z;~iG={?5#a9k*CD)|$lI$yw>dAN6#QT+3VXwlHRY+hhlp+X@Ta9qJD`iYO)+eDGw< zRchuA`oJXbf3UrON!NT4g<7u#6~ClrZKx4-XT0y|E0p5so+rMb{7U?;|GrM$jena= zTxM##sTMCvOOW35U+nlL&y~vBUyjrt+E=c~*qX5D$@cq~?S<~2C|IU6C&st6U`DTx zNd5FX`;V6dWu0{2a^-4Xg<19DH}CX%-@h~3vZ1-vW6R>`pb4{zSsq2awrG=Gb>P60 zDTn$WKjwK<{iM0~_~MThI_nlsoFXP)VQu;2^AC$=kw7NHM~tfS(|Eqgt-H?|zhwV` z`v=xH?D=p)oiVX8{r&s3Ke*P*<#V4XmFU%Dd3W&jwYmt0bLkade-v;9E&T9mVT!Zm zTtD^AH+vGJLa*-8I^u9}%c@UzB45YE+1i9C6-Y4u_eprf`f68Mn>_2M2Z9_ z-%RBBv$sKjpQ%8L-CV0DHO^X_Z%y;^+_bf6i_Wp0+UwBi5b5{4)OP#S-k#8N=VSA9 z<72bG3hef|S~X9zTxZFwDeR3xD?KC6KcA2@@%Aahxwm6jin^AE@T8n^cl6HT|4uTx|9Joxn7$)A3k zOpIeLKQZ)U`oEOHIKVd0WxnaueKM(nglhz>uBBHJP!2_L}KaN~g%a&z!ZSD0=dA zzIoyT|9|dGsSs;C$-}-VBFOWcTcp^rjR#b_PAEJ)uID8eZ&AT^dj9F9J^!0d=G1TS z(Bl7Wr0!Ywa*(+17XFNFl!2j@stx=}A*S9__z5d%U`~|ihJfglx0^c=(@qoQ*-2C*42dqajpvv9?0cWv6?pf>aNK3 z*KJg7BzEQPeK*@K$NG^I!>_o+-eX*R!FGE;NT(&<7M#wMGik+&3q0=^yp1@>=V^L; z3tz=yM}0Pz1KL}1@0;-oWoMpF)z)W?s;KSmT_)PdS9O_Br~Fcfv`hy}-0o$sIrb}= z?Kyiu!|6Kf2FoqdO}s8gwzk~kyRFOh=xLSULf*q{hc+xOmUX-Jw(K|e&b3!Qh&A@@ z-JNS*P<3)=s)U)e&xiKtAPK9&{nBhV{lBgFDYETM#=)<84@7fP_J_oZw8h^}yj(it xmBvNwJ*o}?I?hL$kEE)(PIOm+9 z$w66CFqcgk7a9_qp}VkCc7-JdOG1Vo`W%G*_C(3K$EG9X~#J`qJNmS+ddCzImSmavR^mQ3sy8* z4YD5_Yjh`yq&Y|9SOR?wHdnCDs(e93^aS(nDg6@^i4jMJ$n$!V9^dir@v zg=N&dikeqtKl?S}Z#tPEJ2UHO>olHgKtW$7Gk=hh5qmH=$`f}>Y;XR{?Z&V40cu{A z)gO@cK}6r~?And%q>~BHkv}Y+1rSp}IHBGxIZ{8ixr6%pWgZNUO6P^--vDQu(4WUW3@t~T4ia)V0T`52x5#TwrO%kf|?dT^%%a%;ETcbzpMtidVBGo&`uJ6KLH=6!W@lz8=*td=MSDAr^5Dh|c{AjNr4@s<8`l9V zsyXcv*_m0)jlZSS{lh6o@zaaCJSQBoM}Iz@Ovo`iNz87*QTY6uZvo5Lt;Gdtyk6AN zf4M1*FPnAxCMJn(?l@Kgdp*$9F*J2-Ps(?74Om(+036F$*{oyKtiqR0CV2VXPXHJn z$;kTvyOVK6k;i=#lVoRR9ZO>ndx6ImKxB>GV53$cGhn5#Xr8?Sq*A5fKp)5fKp) z5fKp)5fKq56W_nl^ZNeY@Av<1ocJ$ABLTuTAZ$F(C$HZZc*Sc?IPn>9>;%}|e#kSK zmwX%VSP8JZ{Sf8cD?Iz^i@uHN`&(CHog{X;m;1&o?i;uK8`H0Wj_WVWd=ubtesj9kd76>R)^g(BrJhCCP1shZW(ga&*%LTEZPbBWyo>mKZW4~lEz1m9RL6T M07*qoM6N<$g7R%wY5)KL delta 640 zcmV-`0)PGX37G|uB!2{FK}|sb0I`n?{9y$E00K}+L_t(|+U=V?PQySDg>wcjK|z(8 zBM_v}qyjn`3d9MJg(&EdI0PLvN1;OE3Y=hJEWhY6vSXZG!1F0Dl6on*cCTD|GYMw-76M zsAU6SDieU*0o19{*rt6u4dChPy*7yE@le4YUKtVaQyk5#E37-iW;_%CU#l1ZJ_@3| z-$3NmrWgQg&u!`bU)P~?vulK68=K|Lbyz*z)n?nrmluKe+1L!%!x;Nw8?(Oiy(Rww z6M6bv)dmQ>?SDl>IJS!i;62Wfz!A_D1;qn^c#Z-<000*4xBneLY$IdByusUmUrzU%=YgjoQ@avHE$ze4yZ;9^-s1h7Ya z=-U__r1w6Dx!>mtW%d9t>7&(h?O~XSx9+hm_kFk*SAPTA3L6a3z^UO2rB4A5sjH>V zDgsdKFmbN>J{lMfY6ArM6iD%e>Q4Y-zKAO~gaL@914Chta|*Q8lT8tjMGBb6wiMuw z&j7%aehKUfdH;E~01!2P;^+oBG7MH*kz**h%k;&um?Fr1ya|J#F3AjO;GWdoSt-zG(+z*rHIEdVdLFG98jlrMmhQzF&>4YUgE aJAiLA`+~a^l{~}%0000}70aXS`(_TS8Hmu`An%ETPxZkbRIWQ?IB{D$8dqWgUAT zl6^_Ck7Q|*b(n;)^F96f{qb9_=Q-E;-RC;@ea=b7nP25(7iI?lfYZd-&+{aFZB zaDVF)I0GJR0me6i0pJwRp9LA7jy?o02opnnoBOZU90UDC#)M8@Pn$d*q?A%ab*-nW zbxKubuau3Vvdq>f;JIxV0 zEy~co+ylR1YUOzr0?++}Ew@Kp9+f|&&*CZ|!`JYGEw6)TVw&Dvm)Q~NXLD?16)h6tKB^a1XEP!4eX6@0@*B+M_DUZkQ_VGim`h8*`h>S; zp1rLzSKh^NkHmj{IS(tD7aR4xj;&K>xecS@&}}%i)T-}p0KPjm)m&k%r$y`;-=$_& z?GsWa=Gj1dA>U-6-+jT7`8ffVu5(5=AO+705rgyywyO7v2ssz2eI9_Q{_k-}FT7z? zMvDzPB4L;>4k!v@!+})ov5%thZnBjf?M~QI4K=)AR8e%I!!$o=QT+bw_8WGLfeRc3wkfuse zV+JC{Kqv+2@q&E|FAk1_4xT~*df3_%w~=!9le#r1zD3$ea4B|*kwb{$wrOezpui0# zwLv01;^ex(1!i%@PkTLOMOp<*YHW>o!2l}rTlGV!0|2Ox z3{ObDy0o%{s;jFN8b#0Q#gye$!OB97G6_5=rfB#i^@IO^Z{q~a%^eBl`XM=H!YH*S zfnN_+?aftU-(#^bzXHy%)hFWs3 z%shK>M3azOSrTFAQ1B4@BSOVZ|7h?%&#N!e`VumCr9Zp=oiiyi{$OD`P4 zsr04hojnBj&t#e=<2C06ZDJ``)-BLGs-AaJ<#9q=P<|~rIc%7$e*ECeO5z4z5tnFZ zsPz%sj(M1D4{H{hybB9S( z?bl`fjA(H#bJFrclf`~`SlNI1I_%*zT2bw5{XHBN1Y>F{z^IP0X%;EvjSYVRcE2{t zmw8PmFM04O#c1G#Dhn+xW$2XZ#P)0!+(mrs&Gy_ogxC<^ZU45S5=1wg^z@l0=^RIK122r|X@T)G615Kvm?xDSpdR zJ-neQr%A26`%-Z!0*;IrZa}bi5q*$`QPbwApG~bqRXU)7&r-Tsp)PG*Po?t{oFHzp z#F7A=B`m>w@!numHUpESt*7qigjTnk<*zoiIn+d+r$})On4oxSBnLiR3(Ya3gt7%~ zS|Qu4@X_MAMiRznBCM$(@KU;g1N&TFb0X4Jz$*^tg>v;#bw|dQ8jD)?@F`RcCjO=8 z)fBNG6>BK}I11{Y|Ai!kUpF(?T=Vw!bDP~bNVi~wBLM~8`9*f_3}~)^goJSN!zWAE zb4wb}X48BX3#~lHmI!AeYYDuU<8Kz+1V6vQJVAiruUt@ zULDR=fX(#38?hX(S`c7~ZnFZ+2G;!i%w0WP#^Hd-$>-ya_4q$ePuZt=BX)F|!Tomp zVfs6hQX-K`>V4lDpUBUB>wJLg;iFQX3&fq*3#TJJvu#wPprD_CeF?B;<*kH7>g<{s z-$K^UPIWQmk}uwH;UQ@}-6cl7u_iw3;`j8oYMgQGkhCCFPCExxgI@~9I9|S-Qc)XD zt$7)1eGgNw3o?{@XwnWpt<&7rwH+A0Bm73=#+%PR+UX94*1=j}Ul`50ev=tUv7=>FGw9}WYfSrfCvbjtHnHsr0cMvPB@%j9hd7x@W_e{F}Ja+PpbXIDC+brH^g z)3wzr^`_%Xj=nu#`-)q#E9{H5@=ds3Z1$A>fl+=`P=ZKU4Ejp7q`EC&d77`Aw^KVU zBuVvCN@P^5LWIH|R9C3au^FX0G)2vbJU$cxJQrS2sE6YR1GzNrx!?#XD7u^6sD~Y9 zs#~;NR5^ub4ZFc4DyJ8tNIX!F?aSr(4FH-0$nwSZ0G^ja`tn*Iw%vpEaMFk`GCit| z%P|$uq#%c9CQoS1H39jkCUu|?VKM}3`Q4te4#zk{E^8X->St>(3!k8zNxx&*NfN;A zXR$uW`&NdLY9wUxireF5 znV_~Lv!6$mb^*i$joRQ&=$|4%7j=A(wm;qoHQWxgW2q7>b^s`Hwt-Sc0;2v$5G^>- zHgtxw^^+3sMkVT!9rI(xy4M;=;0;3HMb-NDLbJ??r%9tqZ&NR*$QgA)ACQ5sSS{-B zQ0quVyGG$T=0Vl=G5iI2$<=%Bj?!@!$~l9jEMkDYW2G(^YKGF4JE1Da%LASfdG@a>f4ZvDsKCwD)f!2!xt zyGZ%gM&&ges4=Z4b{8`Cp{*!d@-!Th#Vde0is>@kUv^e*TPBIMD4n)df2RwwIABgo zp*?%)dh0R?!=yjzgs5F)F=Hmpdu@$Ro}5MMt+yLr{<(c`UZCMbf^ ryZz~Z>}ccw@-{5pp(AMFE}97PbnIB!2{FK}|sb0I`n?{9y$E00iwxL_t(|+U=W7iq%jMg|ikBL>#F@ zbt;Go3L-jaM~*~9964$laRuTU+=Hu&RKq79rzp+G%soAII^aHh(N70N}5FfBCy#+XeF0 z%cref2?ELtx=64pt_1;BLP@_!D65dT@&uHZ)B9Gzl_%id&tWWshzy5oK|p~=_6C3B z^KktXfC>tH9slpUK|D*mSET`L@KxgZvKOB|wAXaTxgrfU)pnH!Cjd{;qE`tKRJ_1e zg&7D{St_U!P=8#HGPu{^>l&Vet%88^eu2a+VJck5>H1I%*K!_^5K{XPRHd)4`)m8) z1OU4FcauP64IJ>^?uav3_Dz(}t%d-MPyjsMDg(IpxyFP|5ozG;uY!QAl*0l~Kl$?U zFYwwft8<-lkatH!o;x@Jjz{9yUQMst`woFl-Wgil>woK4L4YfthNtnmz28ZEP6ZIW z8U>_h-#ofAzJGjotg;MmGP;`^*gU;|bKGT1Ctp+c_3gvc`sHLSRkqYx0!#u!+NDF= zDWDfgfJrFO)NM)qW(lYVTLC$~UqZln&Ygz@_gJXlLKFZ2Rr&=>6>ymZ03H<}{iXFg zLjazx%70avFYr0GvD)wAzV7Q@R>${k7pRNl-(}85t>CG8v;=SyFPsA0m4K*{$|W$) z<+FB?Kz%3y2yhhYHo)MQgzVrO@E#;|;8PW@JQd{`366IpxgDWyhwv&uvjKENZ6z!T ziNP*Gp-p)27W85)o zLLD9s3ws&h*$4v$5*Pzy7YGR+jm{DP__~qGINkuu!`V)Go4k$yhlL3+*d(L2bF#&- z+!MEsgr&X0U~u&N?*4KxP>K?OgvG=R=TmyM~B9`E7i+TZnsPG4noE|6JOm^I0xvO(1xP5TrIn}lL zoTuhE$Fop7$c|xumH@|6C$A*IjSB>1F9G0gP-Cwz8C==J)TMfWY#Ywq3naKCA={Bp?@9?31W)YOQQ;0mNz*;3YQuEU?Jj;@lFLgMSl{ z9?zsmCOx~)=;`%T0N!`*f%^_lfPqhuFqKyCveB7YO7Ogg>sCQP=Ks1?CYe_66yW@S zt}$?u#3}RDD1fxrE&@6d0OX7`vG0Ux_9X1Df&iz|onE&pxGo6*R9;uH?`KbCrdB}! z{kNs*ig)RD$grmkjs&RBCqb(qz<-jYQn`S!%h}oUCM(w{n}k%#DjLDe-RJ)W?!WVA zj9lsEKS{^{J7Jp*;Hn7d{xNWp)x+9u{ju-&kC~YU&;0+v3CN6W{%?>==(`miPJw3# z$?$3NN;_1IbEk|4%l7*)A|+k@_9ZWXtOvOUNK8#7qiJ-NY{&<(*oY!AK+ zHt4`o7(NP;!YHG{kiJYTn}tr1P1d04LrQ8VCfPEtoGz<$4}a&KMy+RZmz>4>K)B2Q ze|P+T-~aFb`(6HbslbG`cg{UAJLWK!ez;j-<@{1p>9he(V=BP=P5yG&;TWa@{Q21s zLR(KcY;lC=%nrD9X{a1_IEI@8oHoE|PP_mWdYu>AdZ4=$1Qq}Rt07jxpB6eaQzlv_+BvD3Pn$}bhj6LZmBq$0Nw3ee;fzk`r|kkUTG}O ziSBkfgWC8a!a%Q9UV#TKUEH5pEK8}hEP%%^k$+Am@J1*2r!~Y+wNSI3f6VPG-vh9* z-6t$3NGlnGOSr>$i;2SLZbc^}G;ECQv*2wVNclj|VMXq{l{)gQ4Ru0Bq0cWoQ9b+EeW2D2(q3Dy-2j|?LW z43btdq?HW9z#wX*pOxhVxwQ<BvvvM$GM3TPM`+rJJ z(K%o)rY(y2>O{PYcK{5hgy;mfE)5x(-uLOp#5=kSL4@c8smoXK_;(WB{Wp72BmH<6 z?-`n>heBUw)P9Uw>wyp=oD?lQAA`=18`@gq(~K z3(Cg%Vl;{pi2$(l<<~S%O_uyl(0{T3y2H;`djO36-CJN^zrL^YwEl&LCM)JSzU=Pe z;^N}s;^N}s;^N}s;&S}3eX+pm^Lx9W|C@2*-xPHPaM}Q;u{@uwE~;9=j(l+9Bfu5F zX#~q*8LYxw)bV+cJ!z*SHQs_H@ ob_rH80ZRSvGrL}*Jn?1le|NP2QOo~~cK`qY07*qoM6N<$g4v9YEdT%j literal 1428 zcmbu9{WsGK9LK+yr-{tdjYde>t;|CdHuiAGw%9P{(3nl0u8lJDP?<~-iisF%Qb$8>5TkF~fB)g2w`l!_YZ}0Yzg-7yxJ%Xl*l96~5coJHP`S;^-Q1oD_|w zay;y@hZ3(wCl$u>gb8_fdFeuqVk$$(S=^A0PWJ4#)+e!0uEr*T#6cJg1`G~5oU*oq zae$^K=9Mrq8}DkL>*-p1*n$RJy5vlPJCosva9g0Vl6i$u*(C(Z%NN!scXxMzm>A%} z0~Zn;pwXDgR1-EkQ1D^j_k9@O(uK=1$A^R)B|4#wE7n^a4EX{L-;6wn>>G>h0wi~QP z#qA(O93~(LzgWV$C_SN@#Vfug?G=;0e`fgqlBw-DR7*=!Dc#*|+Ay`i#v2p~c%0wP z^kZiR%Z+n`Xet9@_ReO^A5s5U=_r?;8Q0;`rV``^I?8aiy5_jbhB~wjuB@Zx4r3r1 zFKbaol$U)lS5s>94j7p8PBFfJbm9)K5|Q9pozGSnBkpvX(gnP{cB`Ei&S*8)ZibF6 zAiyLm%TI_?MC;muh7oC$^?59w9F( zZyFs)MLf#U%W1Alr`mnX-;-=c{;C;T^R;^!-IOtaa)fWGMV;SIr)NtCI$}F)%*T3U zbj^@V;bUHF#%&*2{daNq*lY}#Vj-(%_GhQs?OVIrXVGU){N2&C_Qra&(P8s}*OGqN z+oDI0aG;IqNtFI9i%$sksq-(1VwO#xr{g4ZPZ4i%$3R=}S5lO*U$m}&;3AD>-i|1N zXFbBNdKLweiqO~5(7pEplA1H-KCvrjWDy@byOs*DC98XtYdZA{l>x$OrcsuvtVZLSWzCY9g-GxA zQ6o#ezu;=-<8_ z-+Arj<-}o6Xy353%xk)c|4ty9|B6gl0hYQXlKxFwG`h8mSkvyE+> zC8`~n&lZIB*RWf>4~_FC{!WK3@LNF|d67A(g>8d1ITVp_hVeqKWNoAE4*N?tL-8>H Mq6Zn*h-GB{2jbnLQ2+n{ diff --git a/src/main/resources/assets/specialmobs/textures/entity/drowned/hungry_overlay.png b/src/main/resources/assets/specialmobs/textures/entity/drowned/hungry_overlay.png index faa740495103d47bfb03124c081c532b2ad8b420..e84d3ccd6ed307bbfd321990ebb2c2c3c34b517f 100644 GIT binary patch literal 2532 zcmV2jW0wMNc zSx5+3LkuCLI^+}xdog=7qNfr>&c1|zPg!tF2{@27A%Ud_C5O${73or3r$eemn5^v? z*|lORHce&^FW=LfksQg9Y`37_MWfN1r}z8*y+7YK5-Q*?({Tp?mdpftd~xJ^0m%Xe zf6U;1@b8e#*gKzpe0y4|^dI|)rfM4=iNsN`fEH~PuW%UO>LL7I`zv0UKf}t|WuMU% zt!@L|E%+)m_(v=uwP>pV07nNl7Y_5^{`;?+yEn2uLPY@pz@4)C)qrIZ#*HL_#BRG#?W+f8u=_E4uD@P?Qw4Q2TU7_`mK^SDQJ?_Y63|)O;R?m>|@AK#vqE{tDuy86N>v;lWL!D@6e?)cY%KP+YN z-7@&|03&t!O3b0}BKgO+r=?$u_5r{r8=7m!X8LX+s4BR0JY+*(gqh zBEgTHJikx>Lss)^fDZsJU5|5ZMc!NkQ1t7qWxMQP$?O59S-J)o!N<3!rIocD7Z3nk z7{BKH@o#X%{`VUt{&)FQzth?xBUt{TpV_0UKgLA4@F_w8~nRysYE`h8t>xH1klUW-CQV@z-IySeNjuD?FwFG%lj3PPy)?p^~)}EzwreNR9DXo zy0i`y-Q#6}{a-G>S>gip{qjh^lhV5}vbKz*YT)?L5F@H8Xg;=zO=!^HF0HKPn37ukMawJa0_TS!PA3y)W zmg9R3@^b(vw6RaG?~B)B`|aS<6^-xwM5!%4OCzW%e2oo&FFOIYv#S(kMRTt>l5Jq+ zY`%-s6%DT=8VYUh9V(4mT(MTWD)fn~DB7m_*Wv0wJQxw@+r2Z{N zZ%KtV_xOk~DX%IQ5IYceRdg&y_e3k8`+H#t;(;v@qd-X0ptv0d81cQf)CL-8pn(P& zXrO@x8fc(_1{!GKw}ZOZ=TNQ@08dYeXZDrq3n=-?4^#(E0w^AG)cgH|s!C;d3U7*i zCr4*QT-Od_>g$w5r@{c*6%=7_*AWq9Lgoye2_5G`u;n>MFrs|MNKj zZh_YWbz2FFD>eT*_)8Yz>aAR+IjI`F)?o2j8e7XY3T^BSRk8r81|i{z)>bQO764_9 z#ehVaWwC^XO6Vz@3lyz^-b(t;|CdHuiAGw%9P{(3nl0u8lJDP?<~-iisF%Qb$8>5TkF~fB)g2w`l!_YZ}0Yzg-7yxJ%Xl*l96~5coJHP`S;^-Q1oD_|w zay;y@hZ3(wCl$u>gb8_fdFeuqVk$$(S=^A0PWJ4#)+e!0uEr*T#6cJg1`G~5oU*oq zae$^K=9Mrq8}DkL>*-p1*n$RJy5vlPJCosva9g0Vl6i$u*(C(Z%NN!scXxMzm>A%} z0~Zn;pwXDgR1-EkQ1D^j_k9@O(uK=1$A^R)B|4#wE7n^a4EX{L-;6wn>>G>h0wi~QP z#qA(O93~(LzgWV$C_SN@#Vfug?G=;0e`fgqlBw-DR7*=!Dc#*|+Ay`i#v2p~c%0wP z^kZiR%Z+n`Xet9@_ReO^A5s5U=_r?;8Q0;`rV``^I?8aiy5_jbhB~wjuB@Zx4r3r1 zFKbaol$U)lS5s>94j7p8PBFfJbm9)K5|Q9pozGSnBkpvX(gnP{cB`Ei&S*8)ZibF6 zAiyLm%TI_?MC;muh7oC$^?59w9F( zZyFs)MLf#U%W1Alr`mnX-;-=c{;C;T^R;^!-IOtaa)fWGMV;SIr)NtCI$}F)%*T3U zbj^@V;bUHF#%&*2{daNq*lY}#Vj-(%_GhQs?OVIrXVGU){N2&C_Qra&(P8s}*OGqN z+oDI0aG;IqNtFI9i%$sksq-(1VwO#xr{g4ZPZ4i%$3R=}S5lO*U$m}&;3AD>-i|1N zXFbBNdKLweiqO~5(7pEplA1H-KCvrjWDy@byOs*DC98XtYdZA{l>x$OrcsuvtVZLSWzCY9g-GxA zQ6o#ezu;=-<8_ z-+Arj<-}o6Xy353%xk)c|4ty9|B6gl0hYQXlKxFwG`h8mSkvyE+> zC8`~n&lZIB*RWf>4~_FC{!WK3@LNF|d67A(g>8d1ITVp_hVeqKWNoAE4*N?tL-8>H Mq6Zn*h-GB{2jbnLQ2+n{ diff --git a/src/main/resources/assets/specialmobs/textures/entity/drowned/plague.png b/src/main/resources/assets/specialmobs/textures/entity/drowned/plague.png index 0140656cfcd98f9708086cc7262d29e31089f9f5..a88500d188d6085573f0c29d844038375bf6a820 100644 GIT binary patch delta 1258 zcmVOCx6($3MwP#Z@#haTQu&bRdE4VG(tq2hroUSQgo%VtXy!Ev3DdZuihjkK6tM z+pz6T7U@ElBFl=0g|3pdutEaa49&q^O-!^&+dvX~n7;3hKY!YZnMp=*J{OZW?~Kp$ zeV+Gu-+5=ohXrHrzq@bM=l@v!>1UsvDZFawTCN>T_3Ehv$~c%HPHt+GJgkKUH@Cn+p{-6-tX!Q0Z`n| zF*s5o6K_Mb>B$rTx!oNALOs3m*xc@p<@xQ}cNoW)!d-nKs-10AI}N8Z@iscte!vjK z?6`3LI5ApbX?$g1_yRE-hWDbcK7_E>hO^^5p5v=Kqj65I3R@RE84QA>=11U{e>O#ENg-z88Fmdlg4-T zg%})(;(zM`zU#BBspDkg3Dk&&8qs9GY`$>dGZ;>9&CDHWYc{rPKtg{(wx?G{?AN#7 z;mY$T)Jhfh7k*$AP$HVF{^JAPYcX)i7!C#) zAL!<{XU|Yd75>s+kuLiwZs%BCOENYZk9U_}zCh^T49e~9FgQ{nn=gX zTYzvdz=h90V`FMswsoleWb*~|WD2EJ0pQZ(2U3`!_8MwL0}Lm(X6B4qVscotABU5> zR(`OrXz0;5T)ck|FrwOy~9biP$oVI#0g+KN^iIU-LHeX<4Y8s_f;pxjgdAzwEMAczg z56tA==x)HJlhN=HSY1m3956haFOb{ap}3tR91QUH>_-5MjYi~kfZ0h=@BlWZrhnO* znUm2suM?U{!vct`F&muQ-67P|OIKe=)&w=8@%tBF0?2AF`o|v?i`|-V?lZs>z-oIO4EHhPWkA^NQdhhpjT?q>s-#C0Nr0X!hG@PQ7n%?x(?j0PxfH U;YToTYybcN07*qoM6N<$f_!Fj4FCWD literal 1351 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 literal 1351 zcmb7^{WlYO9LK*l!`2aFU5`bgmZz)2)$AHFvoN!mr*!Rxd6vgU!zL70C?iiT^N@0D zjE-*9(9J0Fcq8tev~oKRi@ID76Le2Ok^j78-_Ukh~bF zlu!p;4m;os+3swRJraq;=;)T+Nab?V8yndC`-P2l?8f@++{@t{+WFB}_n7GvDsc#n zMuVXtD|8}gX~7)Jcf~XwJ{SbDvOrJ};Bvv;yP&cXL_}m}{EWllqNAfdJUohvi_pKbnQQ9y{XgZhtPA5r8GfMY*3a_PoKO=4ARjPLv<$Hqh!NhjlWAbY}Pe4{-N0 z3X}KY7u*7p0NC66O$xtVkCp-eT_w6W`S=s0WztlMt$Loxpuv4{C#eHg&DyU#Zm|Pt zS>B!9Dnz!ziJo8DkDMwpF{`4_R$g~ho#arfa1Qm6UD!x1*7=8%mi+o#Q%y^dl|rg8 zPjY@s6M@B%MTT>wK#FlN)lX4mVqwxw*EC9>7X%W^fulwQc_K@%8J*hX+A=+cXrn#; z?T{2aP+e=1?JcX%{s`06uoJb*W^EdoTD^Hop4wI3+2fXL9A`z-R(TrbDybrm#dr5- zxrpps)a=yRi?yN0_mK_=pwiqI!TKZNye24#!_@bSq_^oYE(se-hQbpnjPo1j+>uz? zrBY?YCL$|Q?RQxv;%QHAk7;ZQG|636UwWzFyUcZZyKFhRbW7kC;9uiFM*L(%N!#V_ z$d3D3lQ}x|;z-z+4Nch|J-^m8s~INkm8IGOlN&XXw6quz5B-4I*x46S^fXR-MWLot zD`oQnf*JYO^wbz9W}tj8$mQ#OHeWzYu%gCU`Lz|=grnDSicR-&E3x%y0Q7Us9fbN&sU2qE6XDqb(O!c)%)rkr71OcwE~Qpt zoik6TKD(0!J8A5DYXUQ^hX_O(vaXY-VuO7R{~a%1q@IIDZO`cH_*$@()|)^1$2A~- zK&vYTRyRkgbRV+Kyi(-tH~~Ua*VrNZk=_|ZeXSjDr~SMSBe5qZ%rUq@5gZZGk!9bFxY=uOrdE!ZF0?Gvmb9ueAG ytJdkBUVS+WQAfS7t8n9@iYg?OhN1`%Z2^%e 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 Date: Thu, 25 Aug 2022 08:06:38 -0500 Subject: [PATCH 04/10] cleaning! --- .../common/bestiary/MobFamily.java | 14 +-- .../specialmobs/common/core/SpecialMobs.java | 28 ++---- .../common/entity/witch/IceWitchEntity.java | 89 ++++++++++++++++++ .../common/entity/witch/WindWitchEntity.java | 1 - .../textures/entity/drowned/tropical.png | Bin 665 -> 625 bytes .../textures/entity/drowned/vanilla.png | Bin 665 -> 0 bytes .../entity/drowned/vanilla_overlay.png | Bin 1334 -> 0 bytes .../entityNEW/blaze/conflagration.png | Bin 1047 -> 0 bytes .../textures/entityNEW/blaze/ember.png | Bin 858 -> 0 bytes .../textures/entityNEW/blaze/hellfire.png | Bin 1155 -> 0 bytes .../textures/entityNEW/blaze/inferno.png | Bin 1091 -> 0 bytes .../textures/entityNEW/blaze/jolt.png | Bin 1017 -> 0 bytes .../textures/entityNEW/blaze/wildfire.png | Bin 1111 -> 0 bytes .../textures/entityNEW/cave_spider/flying.png | Bin 2108 -> 0 bytes .../entityNEW/cave_spider/flying_eyes.png | Bin 229 -> 0 bytes .../textures/entityNEW/cave_spider/mother.png | Bin 2137 -> 0 bytes .../entityNEW/cave_spider/mother_eyes.png | Bin 212 -> 0 bytes .../textures/entityNEW/cave_spider/web.png | Bin 2401 -> 0 bytes .../entityNEW/cave_spider/web_eyes.png | Bin 506 -> 0 bytes .../textures/entityNEW/cave_spider/witch.png | Bin 2022 -> 0 bytes .../entityNEW/cave_spider/witch_eyes.png | Bin 474 -> 0 bytes .../textures/entityNEW/creeper/dark.png | Bin 2508 -> 0 bytes .../textures/entityNEW/creeper/dark_eyes.png | Bin 261 -> 0 bytes .../textures/entityNEW/creeper/death.png | Bin 3011 -> 0 bytes .../textures/entityNEW/creeper/death_eyes.png | Bin 117 -> 0 bytes .../textures/entityNEW/creeper/dirt.png | Bin 2473 -> 0 bytes .../textures/entityNEW/creeper/doom.png | Bin 2680 -> 0 bytes .../entityNEW/creeper/doom_overlay.png | Bin 438 -> 0 bytes .../textures/entityNEW/creeper/drowning.png | Bin 1902 -> 0 bytes .../entityNEW/creeper/drowning_eyes.png | Bin 118 -> 0 bytes .../textures/entityNEW/creeper/skeleton.png | Bin 1687 -> 0 bytes .../entityNEW/magma_cube/bouncing.png | Bin 1724 -> 0 bytes .../entityNEW/magma_cube/hardened.png | Bin 2020 -> 0 bytes .../textures/entityNEW/magma_cube/sticky.png | Bin 1597 -> 0 bytes .../entityNEW/magma_cube/volatile.png | Bin 1584 -> 0 bytes .../textures/entityNEW/silverfish/fishy.png | Bin 578 -> 0 bytes .../textures/entityNEW/skeleton/brute.png | Bin 1822 -> 0 bytes .../entityNEW/skeleton/brute_overlay.png | Bin 129 -> 0 bytes .../textures/entityNEW/skeleton/fire.png | Bin 1408 -> 0 bytes .../entityNEW/skeleton/gatling_overlay.png | Bin 422 -> 0 bytes .../entityNEW/skeleton/ninja_overlay.png | Bin 235 -> 0 bytes .../textures/entityNEW/skeleton/poison.png | Bin 1274 -> 0 bytes .../entityNEW/skeleton/poison_overlay.png | Bin 674 -> 0 bytes .../textures/entityNEW/skeleton/sniper.png | Bin 1336 -> 0 bytes .../entityNEW/skeleton/sniper_overlay.png | Bin 655 -> 0 bytes .../textures/entityNEW/spider/desert.png | Bin 2251 -> 0 bytes .../textures/entityNEW/spider/desert_eyes.png | Bin 184 -> 0 bytes .../textures/entityNEW/spider/flying.png | Bin 2060 -> 0 bytes .../textures/entityNEW/spider/flying_eyes.png | Bin 227 -> 0 bytes .../textures/entityNEW/spider/hungry.png | Bin 1785 -> 0 bytes .../textures/entityNEW/spider/hungry_eyes.png | Bin 197 -> 0 bytes .../textures/entityNEW/spider/mother.png | Bin 2161 -> 0 bytes .../textures/entityNEW/spider/mother_eyes.png | Bin 212 -> 0 bytes .../textures/entityNEW/spider/pale.png | Bin 2143 -> 0 bytes .../textures/entityNEW/spider/pale_eyes.png | Bin 224 -> 0 bytes .../textures/entityNEW/spider/web.png | Bin 2417 -> 0 bytes .../textures/entityNEW/spider/web_eyes.png | Bin 400 -> 0 bytes .../textures/entityNEW/spider/witch.png | Bin 1702 -> 0 bytes .../textures/entityNEW/spider/witch_eyes.png | Bin 404 -> 0 bytes .../entityNEW/wither_skeleton/brute.png | Bin 1671 -> 0 bytes .../wither_skeleton/brute_overlay.png | Bin 129 -> 0 bytes .../entityNEW/wither_skeleton/fire.png | Bin 1421 -> 0 bytes .../wither_skeleton/gatling_overlay.png | Bin 416 -> 0 bytes .../wither_skeleton/ninja_overlay.png | Bin 255 -> 0 bytes .../entityNEW/wither_skeleton/sniper.png | Bin 1379 -> 0 bytes .../wither_skeleton/sniper_overlay.png | Bin 658 -> 0 bytes .../textures/entityNEW/zombie/brute.png | Bin 1014 -> 0 bytes .../textures/entityNEW/zombie/fire.png | Bin 2072 -> 0 bytes .../textures/entityNEW/zombie/fire_eyes.png | Bin 216 -> 0 bytes .../textures/entityNEW/zombie/hungry.png | Bin 2113 -> 0 bytes .../entityNEW/zombie/mad_scientist.png | Bin 2460 -> 0 bytes .../textures/entityNEW/zombie/plague.png | Bin 2029 -> 0 bytes .../blaze/conflagration.png | Bin .../{entityOLD => entity_old}/blaze/ember.png | Bin .../blaze/hellfire.png | Bin .../blaze/inferno.png | Bin .../{entityOLD => entity_old}/blaze/jolt.png | Bin .../blaze/wildfire.png | Bin .../cave_spider/flying.png | Bin .../cave_spider/flying_eyes.png | Bin .../cave_spider/mother.png | Bin .../cave_spider/mother_eyes.png | Bin .../cave_spider/web.png | Bin .../cave_spider/web_eyes.png | Bin .../cave_spider/witch.png | Bin .../cave_spider/witch_eyes.png | Bin .../creeper/dark.png | Bin .../creeper/dark_eyes.png | Bin .../creeper/death.png | Bin .../creeper/death_eyes.png | Bin .../creeper/dirt.png | Bin .../creeper/doom.png | Bin .../creeper/doom_overlay.png | Bin .../creeper/drowning.png | Bin .../creeper/drowning_eyes.png | Bin .../creeper/ender.png | Bin .../creeper/ender_eyes.png | Bin .../creeper/fire.png | Bin .../creeper/gravel.png | Bin .../creeper/jumping.png | Bin .../creeper/lightning.png | Bin .../creeper/splitting.png | Bin .../creeper/splitting_eyes.png | Bin .../enderman/blinding.png | Bin .../enderman/blinding_eyes.png | Bin .../enderman/icy.png | Bin .../enderman/icy_eyes.png | Bin .../enderman/lightning.png | Bin .../enderman/lightning_eyes.png | Bin .../enderman/mirage.png | Bin .../enderman/mirage_eyes.png | Bin .../enderman/thief.png | Bin .../enderman/thief_eyes.png | Bin .../ghast/fighter.png | Bin .../ghast/fighter_shooting.png | Bin .../{entityOLD => entity_old}/ghast/king.png | Bin .../ghast/king_shooting.png | Bin .../{entityOLD => entity_old}/ghast/queen.png | Bin .../ghast/queen_shooting.png | Bin .../ghast/unholy.png | Bin .../ghast/unholy_shooting.png | Bin .../magma_cube/bouncing.png | Bin .../magma_cube/hardened.png | Bin .../magma_cube/sticky.png | Bin .../magma_cube/volatile.png | Bin .../silverfish/blinding.png | Bin .../silverfish/fishing.png | Bin .../silverfish/flying.png | Bin .../silverfish/poison.png | Bin .../silverfish/tough.png | Bin .../skeleton/brute.png | Bin .../skeleton/brute_overlay.png | Bin .../skeleton/fire.png | Bin .../skeleton/gatling_overlay.png | Bin .../skeleton/ninja_overlay.png | Bin .../skeleton/poison.png | Bin .../skeleton/poison_overlay.png | Bin .../skeleton/sniper.png | Bin .../skeleton/sniper_overlay.png | Bin .../slime/blackberry.png | Bin .../slime/blueberry.png | Bin .../slime/caramel.png | Bin .../{entityOLD => entity_old}/slime/grape.png | Bin .../{entityOLD => entity_old}/slime/lemon.png | Bin .../slime/strawberry.png | Bin .../slime/watermelon.png | Bin .../spider/desert.png | Bin .../spider/desert_eyes.png | Bin .../spider/flying.png | Bin .../spider/flying_eyes.png | Bin .../spider/hungry.png | Bin .../spider/hungry_eyes.png | Bin .../spider/mother.png | Bin .../spider/mother_eyes.png | Bin .../{entityOLD => entity_old}/spider/pale.png | Bin .../spider/pale_eyes.png | Bin .../{entityOLD => entity_old}/spider/web.png | Bin .../spider/web_eyes.png | Bin .../spider/witch.png | Bin .../spider/witch_eyes.png | Bin .../witch/domination.png | Bin .../witch/shadows.png | Bin .../witch/undead.png | Bin .../{entityOLD => entity_old}/witch/wilds.png | Bin .../{entityOLD => entity_old}/witch/wind.png | Bin .../wither_skeleton/brute.png | Bin .../wither_skeleton/brute_overlay.png | Bin .../wither_skeleton/fire.png | Bin .../wither_skeleton/gatling_overlay.png | Bin .../wither_skeleton/ninja_overlay.png | Bin .../wither_skeleton/sniper.png | Bin .../wither_skeleton/sniper_overlay.png | Bin .../zombie/brute.png | Bin .../zombie/brute_overlay.png | Bin .../{entityOLD => entity_old}/zombie/fire.png | Bin .../zombie/hungry.png | Bin .../{entityOLD => entity_old}/zombie/husk.png | Bin .../zombie/plague.png | Bin .../zombified_piglin/brute.png | Bin .../zombified_piglin/brute_overlay.png | Bin .../zombified_piglin/hungry.png | Bin .../zombified_piglin/plague.png | Bin .../zombified_piglin/vampire.png | Bin .../zombified_piglin/vampire_overlay.png | Bin src/main/resources/changelog.txt | 2 +- 185 files changed, 106 insertions(+), 28 deletions(-) create mode 100644 src/main/java/fathertoast/specialmobs/common/entity/witch/IceWitchEntity.java delete mode 100644 src/main/resources/assets/specialmobs/textures/entity/drowned/vanilla.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entity/drowned/vanilla_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/blaze/conflagration.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/blaze/ember.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/blaze/hellfire.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/blaze/inferno.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/blaze/jolt.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/blaze/wildfire.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/flying.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/flying_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/mother.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/mother_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/web.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/web_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/witch.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/witch_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/dark.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/dark_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/death.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/death_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/dirt.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/doom.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/doom_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/drowning.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/drowning_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/creeper/skeleton.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/magma_cube/bouncing.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/magma_cube/hardened.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/magma_cube/sticky.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/magma_cube/volatile.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/silverfish/fishy.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/brute.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/brute_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/fire.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/gatling_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/ninja_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/poison.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/poison_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/sniper.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/sniper_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/desert.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/desert_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/flying.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/flying_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/hungry.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/hungry_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/mother.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/mother_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/pale.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/pale_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/web.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/web_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/witch.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/spider/witch_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/brute.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/brute_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/fire.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/gatling_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/ninja_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/sniper.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/sniper_overlay.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/zombie/brute.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/zombie/fire.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/zombie/fire_eyes.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/zombie/hungry.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/zombie/mad_scientist.png delete mode 100644 src/main/resources/assets/specialmobs/textures/entityNEW/zombie/plague.png rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/blaze/conflagration.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/blaze/ember.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/blaze/hellfire.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/blaze/inferno.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/blaze/jolt.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/blaze/wildfire.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/cave_spider/flying.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/cave_spider/flying_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/cave_spider/mother.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/cave_spider/mother_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/cave_spider/web.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/cave_spider/web_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/cave_spider/witch.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/cave_spider/witch_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/dark.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/dark_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/death.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/death_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/dirt.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/doom.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/doom_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/drowning.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/drowning_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/ender.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/ender_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/fire.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/gravel.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/jumping.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/lightning.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/splitting.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/creeper/splitting_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/blinding.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/blinding_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/icy.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/icy_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/lightning.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/lightning_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/mirage.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/mirage_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/thief.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/enderman/thief_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/ghast/fighter.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/ghast/fighter_shooting.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/ghast/king.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/ghast/king_shooting.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/ghast/queen.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/ghast/queen_shooting.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/ghast/unholy.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/ghast/unholy_shooting.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/magma_cube/bouncing.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/magma_cube/hardened.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/magma_cube/sticky.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/magma_cube/volatile.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/silverfish/blinding.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/silverfish/fishing.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/silverfish/flying.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/silverfish/poison.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/silverfish/tough.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/brute.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/brute_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/fire.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/gatling_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/ninja_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/poison.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/poison_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/sniper.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/skeleton/sniper_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/slime/blackberry.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/slime/blueberry.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/slime/caramel.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/slime/grape.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/slime/lemon.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/slime/strawberry.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/slime/watermelon.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/desert.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/desert_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/flying.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/flying_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/hungry.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/hungry_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/mother.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/mother_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/pale.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/pale_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/web.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/web_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/witch.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/spider/witch_eyes.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/witch/domination.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/witch/shadows.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/witch/undead.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/witch/wilds.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/witch/wind.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/wither_skeleton/brute.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/wither_skeleton/brute_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/wither_skeleton/fire.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/wither_skeleton/gatling_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/wither_skeleton/ninja_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/wither_skeleton/sniper.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/wither_skeleton/sniper_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombie/brute.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombie/brute_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombie/fire.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombie/hungry.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombie/husk.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombie/plague.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombified_piglin/brute.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombified_piglin/brute_overlay.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombified_piglin/hungry.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombified_piglin/plague.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombified_piglin/vampire.png (100%) rename src/main/resources/assets/specialmobs/textures/{entityOLD => entity_old}/zombified_piglin/vampire_overlay.png (100%) diff --git a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java index f0c9b18..23e26ac 100644 --- a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java +++ b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java @@ -44,7 +44,7 @@ public class MobFamily { "Creeper", "creepers", 0x0DA70B, new EntityType[] { EntityType.CREEPER }, "Dark", "Death", "Dirt", "Doom", "Drowning", "Ender", "Fire", "Gravel", "Jumping", "Lightning", "Mini", "Sand", /*"Scope",*/ "Snow", "Skeleton", "Splitting" - );//TODO scope + );//TODO scope - maybe in 1.18 when spyglasses exist public static final MobFamily ZOMBIE = new MobFamily<>( FamilyConfig::newLessSpecial, "Zombie", "zombies", 0x00AFAF, new EntityType[] { EntityType.ZOMBIE, EntityType.HUSK }, @@ -52,12 +52,12 @@ public class MobFamily { ); public static final MobFamily DROWNED = new MobFamily<>( FamilyConfig::new, "Drowned", "drowned", 0x8FF1D7, new EntityType[] { EntityType.DROWNED }, - "Abyssal", "Brute", "Fishing", "Frozen", "Giant", "Hungry", "Knight", "Plague", "Tropical" - ); //TODO Textures! - tropical + "Abyssal", "Brute", "Fishing", "Frozen", "Giant", "Hungry", "Knight", "Plague"//, "Tropical" + ); public static final MobFamily ZOMBIFIED_PIGLIN = new MobFamily<>( FamilyConfig::new, "ZombifiedPiglin", "zombified piglins", 0xEA9393, new EntityType[] { EntityType.ZOMBIFIED_PIGLIN }, "Brute", "Fishing", "Giant", "Hungry", "Knight", "Plague", "Vampire"//TODO figure out crossbows - ); + );//TODO crimson/warped public static final MobFamily SKELETON = new MobFamily<>( SkeletonFamilyConfig::new, "Skeleton", "skeletons", 0xC1C1C1, new EntityType[] { EntityType.SKELETON, EntityType.STRAY }, @@ -66,7 +66,7 @@ public class MobFamily { public static final MobFamily WITHER_SKELETON = new MobFamily<>( SkeletonFamilyConfig::new, "WitherSkeleton", "wither skeletons", 0x141414, new EntityType[] { EntityType.WITHER_SKELETON }, "Brute", "Gatling", "Giant", "Knight", "Ninja", "Sniper", "Spitfire" - ); + );//TODO crimson/warped public static final MobFamily SLIME = new MobFamily<>( SlimeFamilyConfig::new, "Slime", "slimes", 0x51A03E, new EntityType[] { EntityType.SLIME }, @@ -98,8 +98,8 @@ public class MobFamily { public static final MobFamily WITCH = new MobFamily<>( WitchFamilyConfig::new, "Witch", "witches", 0x340000, new EntityType[] { EntityType.WITCH }, - "Domination", "Shadows", "Undead", "Wilds", "Wind" - ); + "Domination", /*"Ice",*/ "Shadows", "Undead", "Wilds", "Wind" + );//TODO ice (slowness 2, ice wall), fire-theme (fireball instead of poison), desert-theme (plague potion), water-theme? (water "potion") public static final MobFamily GHAST = new MobFamily<>( GhastFamilyConfig::new, "Ghast", "ghasts", 0xF9F9F9, new EntityType[] { EntityType.GHAST }, diff --git a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java index 49cc522..1c0ef81 100644 --- a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java +++ b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java @@ -27,14 +27,7 @@ import javax.annotation.Nullable; @Mod( SpecialMobs.MOD_ID ) public class SpecialMobs { - - /* TODO List: - * Reimplement all old features (see list below) - * Utility features: - * - Bestiary - */ - - /* Feature List: //TODO; list may not be complete + /* Feature List: * (KEY: - = complete in current version, o = incomplete feature from previous version, * + = incomplete new feature, ? = feature to consider adding) * - general @@ -52,14 +45,15 @@ public class SpecialMobs { * - vanilla blazes (outside of fortresses) * - fire creepers/zombies/spiders * ? warped/crimson mobs + * + phantom spawns * - potions * - vulnerability (opposite of resistance) * - weight (opposite of levitation) - * + blocks - * + infested coral (spawns puffer silverfish) - * + melting ice (similar to frosted ice) + * - blocks + * - infested coral (spawns puffer silverfish) + * - melting ice (similar to frosted ice) * - entities - * + bestiary + * + TODO bestiary * - configurable, nbt-driven stats (bestiary info + special mob data) * - configurable weapon type chance * - bone shrapnel @@ -70,7 +64,6 @@ public class SpecialMobs { * - chance to spawn charged during thunderstorms * - chance to become supercharged when charged * - explosion stats (while wet, while burning, when shot) - * + scope - perhaps delay this until 1.18 where spyglasses will be in the game * - zombies * - transformations (husk -> any other non-water-sensitive zombie -> analogous drowned) * - ranged attack AI (using bow) @@ -82,7 +75,6 @@ public class SpecialMobs { * - ranged attack AI (using bow) * + ranged attack AI (using crossbow) * - use shields - * ? warped/crimson * - skeletons * - use shields * - melee chance @@ -91,7 +83,6 @@ public class SpecialMobs { * - use shields * - bow chance * - babies - * ? warped/crimson * - slimes * - smallest size can deal damage * - magma cubes @@ -112,14 +103,13 @@ public class SpecialMobs { * - blazes * - melee attack AI * - configurable fireball attack - * ? hoglins - * ? zoglins * + guardians * + vortex - * ? shulkers * + phantoms - * + natural spawning * + the goat + * ? hoglins + * ? zoglins + * ? shulkers */ /** Our mod ID. */ diff --git a/src/main/java/fathertoast/specialmobs/common/entity/witch/IceWitchEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/witch/IceWitchEntity.java new file mode 100644 index 0000000..2464aa3 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/entity/witch/IceWitchEntity.java @@ -0,0 +1,89 @@ +package fathertoast.specialmobs.common.entity.witch; + +import fathertoast.specialmobs.common.bestiary.BestiaryInfo; +import fathertoast.specialmobs.common.bestiary.MobFamily; +import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.util.References; +import fathertoast.specialmobs.datagen.loot.LootTableBuilder; +import net.minecraft.block.Blocks; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.potion.Effects; +import net.minecraft.potion.Potions; +import net.minecraft.world.World; + +@SpecialMob +public class IceWitchEntity extends _SpecialWitchEntity { + + //--------------- Static Special Mob Hooks ---------------- + + @SpecialMob.SpeciesReference + public static MobFamily.Species SPECIES; + + @SpecialMob.BestiaryInfoSupplier + public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { + bestiaryInfo.color( 0xDDEAEA ).weight( BestiaryInfo.DefaultWeight.LOW ).theme( BestiaryInfo.Theme.ICE ) + .uniqueTextureBaseOnly() + .addExperience( 2 ).effectImmune( Effects.MOVEMENT_SLOWDOWN ) + .addToAttribute( Attributes.ARMOR, 10.0 ) + .multiplyAttribute( Attributes.MOVEMENT_SPEED, 0.8 ); + } + + @SpecialMob.LanguageProvider + public static String[] getTranslations( String langKey ) { + return References.translations( langKey, "Ice Witch", + "", "", "", "", "", "" );//TODO + } + + @SpecialMob.LootTableProvider + public static void buildLootTable( LootTableBuilder loot ) { + addBaseLoot( loot ); + loot.addClusterDrop( "common", Items.SNOWBALL ); + loot.addUncommonDrop( "uncommon", Blocks.BLUE_ICE ); + } + + @SpecialMob.Factory + public static EntityType.IFactory getVariantFactory() { return IceWitchEntity::new; } + + /** @return This entity's mob species. */ + @SpecialMob.SpeciesSupplier + @Override + public MobFamily.Species getSpecies() { return SPECIES; } + + + //--------------- Variant-Specific Implementations ---------------- + + /** Ticks before this witch can use its ice wall ability. */ + private int wallDelay; + + public IceWitchEntity( EntityType entityType, World world ) { super( entityType, world ); } + + /** Override to modify potion attacks. Return an empty item stack to cancel the potion throw. */ + @Override + protected ItemStack pickVariantThrownPotion( ItemStack originalPotion, LivingEntity target, float damageMulti, float distance ) { + if( !target.hasEffect( Effects.MOVEMENT_SLOWDOWN ) ) { + return makeSplashPotion( Potions.STRONG_SLOWNESS ); + } + return originalPotion; + } + + /** Called each tick to update this entity's movement. */ + @Override + public void aiStep() { + final LivingEntity target = getTarget(); + if( !level.isClientSide() && isAlive() && wallDelay-- <= 0 && target != null && random.nextInt( 20 ) == 0 ) { + + // Create an ice wall behind the target if they are vulnerable + final double distanceSq = target.distanceToSqr( this ); + if( distanceSq > 100.0 && distanceSq < 196.0 && target.hasEffect( Effects.MOVEMENT_SLOWDOWN ) && canSee( target ) ) { + wallDelay = 200; + + //TODO + } + } + super.aiStep(); + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/entity/witch/WindWitchEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/witch/WindWitchEntity.java index d73ec6f..6f6fde7 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/witch/WindWitchEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/witch/WindWitchEntity.java @@ -43,7 +43,6 @@ public class WindWitchEntity extends _SpecialWitchEntity { bestiaryInfo.color( 0x6388B2 ).theme( BestiaryInfo.Theme.MOUNTAIN ) .uniqueTextureWithEyes() .addExperience( 2 ).fallImmune() - .addToAttribute( Attributes.ATTACK_DAMAGE, 2.0 ) .multiplyAttribute( Attributes.MOVEMENT_SPEED, 1.2 ); } diff --git a/src/main/resources/assets/specialmobs/textures/entity/drowned/tropical.png b/src/main/resources/assets/specialmobs/textures/entity/drowned/tropical.png index f7fff3f8876285443252b2e1c50436ffe52ea2a6..84f9f74da851f4b7c3101b7b91aa55d13d21e3ab 100644 GIT binary patch delta 611 zcmV-p0-XJs1@Q!s8Gi!+005o0f$RVP00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z0016POjJcKFcMc>9kk=Ii?4~;|JKFy!b?vXKSLI5aw-4-0M7-HjsO4v3UpFVQ~&?} z|NsC0|Nj88%q-6U000SaNLh0L01m?d01m?e$8V@)0005TNqb)Vuw`5bkh z@(BScEq1rekuF5C80kVJi;*rwGE8K_LFmmM=|Uuf_jX(Or?(yENf#n1m(ohH-FZaU z8v!g~D8LH#M}N8yX#vLD7l0nTl`flKxi&PdrPR=<`=BG!fV{4`;-b5uQTOWs z933^Ff_n+-em$VFgj_R6=cVp>z(^$x32STpB`&_wV@Li;0MxJ-Ygj~jVKy{+?8tu% zNHk>50bXtfOTcpKsU!bv3h-e9xfB+F+Szb5_sBn8gMXGX+H&hF!0LO>fc(b*Xh~i% z5d?4&6Psl%3Q2G>b z22(TcVlSiLC2-^)128h=8@Il2@vxcIP}3W`K>wCa#5Twwg0y-KB#0ijvDCm$l1RXU;p+e#coM2%rzvwZtW1L;%-Q*P` zc^%u?_s!3a9cNZm)oha;o}Gjk>$`pkVN#n3K+gmh=Lh=@;D74#Bg}6fl>!1F00OX^ z05DN2bo1A@5G#17WdmR;6M)VP9L=mNtUJSI zJQM(5s~7-23ZlHYlLDOo8`@QSUud;X4}V?7lHTL*bLXh z82e%yv%d4aC4c_{6M6bv)dmQ>?L|X4wu=YgJ_6zIeG`FL?lh2=HQAFpkH*>;WKzSpdXx8n9Tu zLii})Vp&84ut$C9+ZY|B_dbWY-{%Wu_5d*Hqt$ZlVSkv3x9+hm_kFk*R|DD#8w}CF zso@KyPXQ09tEJ8=0#NKQajyD48W;|00|faLNb!W~PXJ=Rh$}aQ0f?moLt&3|3bfUe zO%aeq3Yf^Y6yT1}0Kk)e3G51a|9Q3m5H)_{=mt453|3o_V<@=G^u@85BFKHb34@?6 z&-*3_&wmPdT+AwfN&B0kHtVVZll1{pKad#P1V8`;KmY_l00ck)1V8`;KmY_l00baC zfYd);4n05m1qlHV00D@y(%&={009sH0Z0NM#hc@01DN37CPk&dSP_yf057;NLbe5z mFMyF#BGvy5v?L|X4wu=YgJ_6zIeG`FL?lh2=HQA zFpkH*>;WKzSpdXx8n9TuLii})Vp&84ut$C9+ZY|B_dbWY-{%Wu_5d*Hqt$ZlVVH@x z?y)WReYh7_1KJ834AH=;;R~ft0S~FGrOqk>Q0y>quKGS27!GO!1o;$5@r3G60Ajv~ zD>sAzh@}HVVUKePwAGVM5s*a+n8>yi;EvA#z>|In>^p#OH2Z?P6qP*000000NkvXXu0mjfvriOx diff --git a/src/main/resources/assets/specialmobs/textures/entity/drowned/vanilla_overlay.png b/src/main/resources/assets/specialmobs/textures/entity/drowned/vanilla_overlay.png deleted file mode 100644 index d124f2e6a48ff54a012eb4d52a407a5f768c04a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1334 zcmV-61M3JM}RXh)7jL>xJ48gT{U8r*}c zi&VoWAEzrXd2Kf@c4tuB{O6uir|wVcW;i)H8FtyTU*E>E+uw%q_4nh`?dLyE#^cXN zr^g<=JKAY;&mYI}pf)Te0N}5FfBCy#+XeF0%cref2?ELtx=64pt_1;BLP@_!D65dT z@&uHZ)B9Gzl_%id&tWWshzy5oK|p~=_6C3B^KktXfC>tH9slpUK|D*mSET`L@KxgZ zvKOB|wAXaTxgrfU)pnH!Cjd{;qE`tKRJ_1eg&7D{St_U!P+X5PxYyw88lHo#f`IaV zfy69fDqP3u`cMqlavqQnQu`28rLV91Yy02?0J{2jlR#w+9Pr-mh%;FBO_a~Ah5(FE z06g9*1Gx9O#)M4~Y2fUyf`F`)!vaq~`SS5E@Y*h`bDeUKcSl5?J2(N3N8;FCO|RSg z4uMYI8Cu-y>sLX5E1!m^@w&a=NqkNP5WE@%q-Wnex--6ie0Qv}3~w^Jn;Y0Xy?=Au zWlJYtQ}*@k!_)fZWGq#-)LH^e0z=xRL)$5!7fFCgDA3exN&RLCs0UjCIlf;)zNddOmxS!#8}J?^bl_7J zt~?dx83~SeB)J`-ZinzHK(hgKLv1B235mfk!b=W;DFU$0W4<5xx`E|dKikiD379H9 zW~tdIU!;*Gp-p)27W85)oLLD9s3ws&h*$4v$5*Pzy7YGR+jm{DP__~qG zINkuu!`V)Go4k$yhlL3+*d(L2bF#&-+!MEsgr&X0U~u&N?*4Kx zW3Mk6T-n3arFwvD8_wMeB)B9Y&*e*~aP|o2nJwmUnGo=p-`^)tssU%WxF`e?oE4F6 zz`nD?xjDhya5%py5r*PlAr&)K;kk8aB?F*rOy$NxrMoJe5)iN7g+3*sBmhn zY;FO>Y8BumHv25F$lT)G5}1P%kRH#ZNG3hI&*56yhcF3@&4UPn;&nH2vAi$EOQn`S!%h}oU zCM(w{n}k%#DjLDe-RJ)W?!WVAj9lsEKS{^{J7Jp*;Hn7d{xNWp)x+9u{ju-&kC~YU z&;0+v3CN6W{%?>==(`miPJw3#pI$w@>(RA_=$abxfy=qSbAKoIe1GTMbIvb5>QK3Jp$Z_P5m&uTr2)8daYENwQW6#d zOG@&&HUPffSoYO>MH@yJXQc? zDh(S6+vqY8(TJV_0Qp=Sq3#`Bs=EIJbps%x5rlc(C73P~VV*}sBZP&}qQMrf#9OjS zW`G`jRo3pkv%rZnC`XyP0Z<}ci(pN>h(`2+=M|jKwGkHLV0-%n@Yi$D3n17tU?Wjm z2khX4g@8wV|Mq3wGapo0Lm_%kOZmfYJBjxxUL`sFI%9%b*n^V@f#p6%Dx z>F31Z=kvYR&~t(zQ|Z0^J@Ex}nRclbIn`O`1=>&fxZ0}cskD0w1!muVXYXD61@;i} zC*nzBp6`5Xa-Pm;ghV{a`1Ax>dBfG{lrYH38=Mjbg99DJMk2b6W+Oo&o}@1vWFel! z97?k_IZt0W$n5Ya=FnL-ua6y~)JNlAl4TekB{l+ycoK667OWy>DvddGme@#y+2_CK z{o>zz_3cXly#C4*mx9j{n}1o4vTCCOIy*edk}QK&q%Ry~YjU1zHGM346t|!D;CQq*j5F2^Jwdkq)PcMB2pncEvgjleO04&Ke zi!&tvEn4LYiot;n`afK1=o;V$Sez-bNQu+^?Tp`C24F!1YytgXrqX==@eI8p3E1M^ zd8P zdg;AJ2EeZb=W}i3K_@keyDI{#HiGKFL-!6JeEAUYBtN?C-nl?Ob8wUrCH?)Wy#LC@ z39@pRPySdt(s}$r;mQRvb49Xpw^4m*2)@dl3)Nr0$kn4&+Rcvf-K}2$`29~?tk-UKjLxS6B$8PGRv&`bZgz~{<_i4u*S~D8 zl>zYD&5mCkPakCM)0@|BcKqr913F0KEn2i_(V|7O@*gVTD(B$l Rk!t_|002ovPDHLkV1gy;^^yPp diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/blaze/ember.png b/src/main/resources/assets/specialmobs/textures/entityNEW/blaze/ember.png deleted file mode 100644 index b706d6069c88ec011693c5c71c8322592464abb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)Cd2W$)M|)+$P#AJA#H=(JnF%y|`%iO86U44IAq z^jNbTT)%l0Hm{YH0wB_a!7v7(({ADUfzAMc;(SWYa`dQVH-V)A@ce*ow_9?!({9o2 zcJcgxy4TQ7!_0Bz{6u6|VDfrdDFf8*t5H2yv%tg*%5`RG0F;wv5me55exM6p)#2iN zO5JO$+1&NB(oeuFfP-ONssrjLpn{+RaZ@s2sg)v42#u-_otga$J$_#Cggcua{BeN1Kj8xSvu2kqj$W1cA!5u z*QkI-y<=RjL7wN>w#_*1lg{;|6buK^Cj4EX*1daBG+Vcj^CD*3HnvkIpH8ryIsj5+ zxLyM(GNcsTzH^T(jkR3q=F8kbStQ}2BQ6>mHQ#m|V4-`v kN&o8Z*s){BjvfEcAB4P5O_RBELI3~&07*qoM6N<$g4lGZ)Bpeg diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/blaze/hellfire.png b/src/main/resources/assets/specialmobs/textures/entityNEW/blaze/hellfire.png deleted file mode 100644 index 854b661bbc89f0bded81a09f7a9461869e0fe07a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155 zcmV-}1bq96P)k>IGY%U znC)S`!j_rlbWo1_Z z(2_~US5g2(8^c5tMPvZL#%7+{8lSkjvV%a$07Mjpp@IG)hog;Qh6ehHC<=1GFPsL) zao2e(n=8A)t3U*au<(Kal&^`adWcP%;2oGKogXpZk3ktrH|EK4A|H^aC(5ImOUG zf6)e4v;+#c4vb7r37Ol^)#2*fsbl2EO(K17iwyduxv8Q7s3yI(JtKv-mP~@KLvypU z1m@?E)CBKe{fhCG6u*A>0a|AloPOQWqU&e?iUR31ppXISHL#wbrPt8vjypO5ZDtzk zj-$onmGRm`6^4N}Gwm2`7>=}HDCsrOb);M0L28we$tfo|sZ~d&>%w6%#xR^9&P+S{ z=GCT!Du&=LohE`S^)_Ql8aXe!b-H;@B<&RqUv`#BZF z*V5c{;r`R-ykERL&-smQF`BUCnm?e2iK~fX+-n`1)lPySNqeu()SP3`Kd+|I= z&ulo+%$aY$;{rafy?ACdu>`|}a@ zeDb482B4}wBr|9(0#5ZNsR;ngjD@5oc;}Bo;z3ysjt1omIHq3Lo#N@67{<)`%Pb_A#{w}uNI&4gXSV; z#(Lp6ugooscHZ0A%vbz%Sv-6=m$w1#cD4dAGkb4ezsHx0qIZGul@upm2_J|WzHAKV z@^+iPY)kP8yG>uVhjV$+cE1K4W~7}?7Jcl`lAka-ND zmnv!7e?k?R$4<+w>_6|P- zc4wE69d@cEH6a|Yt?`Mr2u6hs+-s!1_7)oue`t7-1AgL(xkG&l9C5@EM;!5g<{vH^ VCLNPv^pI^+`lQRA_7+TDiF}$)>S&xmBtamW03<5eoCwH{VX$KuY#myCooBaXFz7oEm(P|{ zx#+BRAetZ$9kbik#rs`Tp<6P<(`kDXI57j%(Kw+y_e2l?0?{!-ckZE%#_3nwLU&C? zh~F`cGj{jvIn^hi=QH+m+11t<6z_^Vnb7K-7ywJ8}W+! ztO4q1TzvO>ei=QVv5TQq2fS6^T?<-20H?};QYvYG1}5O7|GLNuXQjPa;Oq#kj8yyU zI};GADpuG8UCR)NB+#|Yv4aEAgw;Qi0Ew4=i+*++CP)43IVAamrk)ezN;YRX2$WJu zOK?6zX*NkEo3nxtO*EVXEFAHbY>v`wQiw0jCaw381eI)#N_O29z@I<-T+H>Vz+NQs z%JhQeh?U*wnkA~7S_G_5Ag125gqcUeV(Lw?3p`IPieNeDT85SB1rxtnq^cfq)J?6EF7}sp1yP=RdGStPuzEuy0 z!kwhcHEvxAk}lU6*q15z>#S~8S*q;=@KMl@Gp69LbL&cwU!K?av@gg;aSwokzs}lb z6@bqoD)U-}ZNuQ2T`)~xBBC;x{ky3(zz49pS!ER%8S3K6(`Nt-L}XUADqQap;$Ivd z0I*a8HWBXzA~I`Ql{Ko2T<>D_kE&~uAO8H$-Wn}?+ukgXMp4A*5T1X#=+Xl6?%Ogggg8I z6c6?r`dj^W&Bgc^J8$Db9hli;>d zr}%rmS-vy{=|*qJ^rn5I-Rl47ye_^*vEDy3-jplt>mUOR`fycouYH-3`xS+Wh{|}p zM{Hk>_GL$&h^Rc#DhwRRjK_O$>@i=E@pwKCQv}tpB`5#U630Wla9D)D<002ov JPDHLkV1nVz4&49% diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/blaze/jolt.png b/src/main/resources/assets/specialmobs/textures/entityNEW/blaze/jolt.png deleted file mode 100644 index bdc007d90c7e17a82a580f88ccfaf584d3bb4142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1017 zcmVPx&vq?ljRA_Cep$z|6$7LtklB0Z4!Uqtunn66ZqaDVrslW($Cq|Go6} z`wcJgAE(pI#59rc6p`>0&~;u+NZBk=HcJ$?3jne`8yY9J5IYTDCu`)nJ zU$jDYXMr7&3Byj`2@p=&H$mb2%*3?Z@Z1hJ&DQ_2V;DL15`eDbx=}lF3Aoq)hmrw( zC!o@(I(B_**;F5C%8R zmcuwfVY}eaxm)+;=cvfKb;A;U2hU!&I?rCWI?CMD&g_}lj@R}K3ddbQH)_Kfom0ej z?|Hlv^v}t%Hg9b)A6$|}%@1EL5A{Df?~8v`S;J}pJ2}wjjRA_;=(VuWJ+!j4g6+~%+f%75Y!IYKL6&M4io0aDhtc9lXd|(vDGBZ-LK0y} z=9$^UWX2>~B2=6B=X-hoXWsYse($~S?>T6Io!FQG;PU%w>Whga0AJi(uw?Uh2Eb1{JB~*GXeOM8>E!bJa7rPZQV1}~TLww%g0wDBR|)`j>K$+syy`iQIUgww zWq@KLNm;C#1Edfxzt8pnfXtePcff6@R^3T})To2C`dWM*_Z8CvoKgt)l@MjIO0O(I zg*4O>PwV0srhK$Glm}R=Z>3hg-V3VXtujh0qoDyTlGTTxMc(E2k=6y-D%S_>?a(VX zbg-u5&|3gZ;$^W~IR{MRSX-dl12T06X=OAtfaw9rfAs)>URfdoY`A0q-YDt-tW|D= zR)#|_-Zp@mRj$vQX|QHsS*TTQ2amO2)$NVl>(|!yK~r^tvzSQQlhNYyHYqSFt8Z|B zVwS<4ao+E|$zabogFWNipO~#W2o0N*7N0jiEQKg0k~LQ-z~eg;_P?s@n+2y5Rt`Mf z%R(g|iBc9Sqhr@lGuyoB^>V}0iJIAFbnF^{-KU;tS*)Uj74nfNk;yr<_&i(prU>}m zL?-6|cpm=w|7Cjsq(n);=m6aV%*I;1R5my^8wr^H+;&F6Q&WMs6P;edz5 z^#ZS@l5FP$$;W@NSrV*2%CYg6#w%SiGe2&TDhZzdT?DY}fB5y;XU#N#9AFsOTA_Qu&EP!_0(@-|#D8!mZYWNH0;B+8`^KW6LR6dgnT)a(D#3THkN zMF}f(4E5XOm9PS|hEh9jNb41)ri2xyA8avJS3d2K79VDrE(tETOJvqG7UV3`mDk;q z@~-z^-~=&;~eKW d$2rbAUH~9xTIhD|kCy-d002ovPDHLkV1gm!6@CB! diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/flying.png b/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/flying.png deleted file mode 100644 index 0276493f29be72fbd7cc6c944875d92f69abbe85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2108 zcmV-C2*dY@P)uf5F>JdX`UWW8zo!5c zW=?rYUBjw2(Gnv>%K$Cg!P$E(>nf!xx<1y|ZW<{7tZGx14;sI9YeN}iQ=E(pY7mAU zRA<}mzPgs};JL0e2nZRM)HT`OvYk-7D0{9e`v>O@wnxVV`yN&XIshP>Gh{hxeAMvl z)Qo55r@f@Eg%lIch%;1(qN=jJQmSHAn`CnaE!)Ai+j949yDj^P_DZQL^>p?gQwusH6_1Mq&vm6CE!&Z0F)r#9MO8!f;#*Nwx%)|7ll`I&6mtii7hUHt zGB97v{Ir+N8B|JDpyzQRA_AfqaMU8OD2fqceW6!U*Km{`PH0|}mhBv<*S--D&A({a z$3?<%h%jClnAA17_8{YfzxNYWcv$3-m{1rj&|WAa>VnY$KKk!>Ivj=ZStE&6Ecqaq z%Ar#Nz)@1tXw7R5HUEfMM93gC4LU)DqOOk(jDon+;Yq|SOwqC(-$1Jza)y`6$#tU9 zdRRvs2!c^V;*Pfc`hQlbR9m6k*USmBMv_XkCHn|t#dk1*4-)BsI3(RK$K#^pI5DAR zJD7zj0BL;INXoXLlMZVE9IH&nu8}#B=k({E;y=43TvcPV_$lLB z0y}krt>q=A%`t3LTIF5nxHKviG}R+xW~jGENYF-2_)M{0YvQ^c`N`1HSqC zw=d>So7|lq6hMCH+hCl$uy|gUUwiAjfWMnTk`gpN zn=|@2hPcuSna-xT@XC4au5SQH2d}>WE~!S5-7D`=d2lz>c6WV)3$L7)ju4R)HC`AV zjLe}iAai2sqSNZ2?AhGE{V8-@+?K=I^2dNrU2$r3To>2vgvKg(z1-`5*K1AL2C%1U zT)lh=0Qd1@>g^HUdE-^CUcSUc{)8VDJNNnC+i!CD?`z=HV6V-!Ys=V)6s>yQ9~%HW z0LSiaiok)St__a?-@5P((wQ{Z{&EF?ufDuUqtW2zKbHO9=N2h$Z*%?1hX8#SsbE?J zQ$X}fT4ew#jt5Q^sB)*_J4d7hz@3JN^Qef}%dDp0Sml8)R8cM?WM~J}sut-?n#q%S z9zEOzkU%(jGEbx4=o=Ho0pWy}?O^S0hj7T+-R>Lz>x)103;%x5Unj;5&^KWoQr#UNvpIEg4|YKrfY(<)p6l zodV)L;r~H~c0ly?1-j>WSA>ItNE^Ky#Jv;#uSA{y%2^NK?72k%{?-LIQJ2o7x%9yY z@_dCZ@9*|;loXmC05Qo8%95kM_V%kZ>W#j+YgG%)obUh%ZV5RsUfo0A>Q!jx3fSE$-^M&P#)&745&?_~ZYllic7ckbUKlbw(TYV>%; z+Kn4P_hQq%U;!-s>5oTgI{>PM}0Y2+}>u~Fy+-$1DpWB zLH`3v^uZ*lYm6HvwW@_x+>xOTz7vAi-i?(Tp{uRtHL;2%mamkb=wF{hIY2B#;MfvM z3dIHL`~1244Bed|?$Q%H62a#V~s$jG&n={ZR3#_c(qFyQErE)k*Ds)K+-p- mf7m&rb4TYD5~a?cRsIXfjtRt2g@b|s0000$;7$O_NC3dDpYkQSbTV^LO|_MmnUg XQ+aC<^CL+935e_I>gTe~DWM4fNBUaT diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/mother.png b/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/mother.png deleted file mode 100644 index 496e2e8586b10c3e042ee6e65284e36ee1b33132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2137 zcmV-f2&VUmP)bgpQagI9nvNDqZfT~p^@kCi{D?ms{MP%Pk!x()wYP$Z?{-=X%WBb9w(Tquz3|h1*NnPbR<*6Cyv9 zKm`d!BBZ3L1QHJ-*%pA$k)ml6?`6NHN$VT+svK7&P_C_zSKQ|^GW)y~Vt~_Z5c#3( z7Q_@|z_p8_hcJR_7@=3ys?n`Ea+(u%^KlpG^}!H7H&sJA90ocRrWy{N6hQaw9om7r(hI_fd5g z{g)B#q5(x9YA~Ee)^!0F^4>ec8hNETm!H^SINEoliW7E;M!%|Fm(fMW02Rozv{#gA zUh*kpg4l1()MfkTh!8bZM}Bx|@Gv4k9Xt&fFcEa%VwSIq3<1&)6W)7gJbM?N+tUvd zx}Cn%=PF(}aRe>`4>|B|r+=`5a$_X zl(vM$MZl|uUH*7@gTFiPCV>8_dyDVZ2Qmc~=Q&}QZl{m4aaWQ&&A?YqQQE!rY;(0m z&=ZZ%h_60mn5WTS)SKBhZ8}yYSm=gqrIP# zbAL4lx$_Eu-~M`o-5_Cje0=_B7S=3!he-Pu7D7d_VvnE~0IMAq=Wn}pnQq^EXL(i_J^%TiWq$w6p8&6}Q3NlJrg}sxS0!M0bLp$# z^aR)Qx!JPOt2#j(bJTu|uj%y9G>l(-X%*7p8Jbo>uU9Fb zo}d{T<-{Q>s9JGe(3szJD37+JI$}GhRGK<=1HQ2J=bS_(Ppoo z^6+zq8x?5BCGh%$Q9>!p@RhSC?(I<+V>V36x`t+GQd#@n9o9^p+e=NhBbS5E;L$Jc z^7i=&FS8SlQ+S!3u==|-{-vGpu9otfhif=`g=k@(=S9WyqdHVPX3(KNP1rwbxznzRS;1VG^dwW>}SB{B<$?4T+IP(40I z2M#k$M*lb(lQSIk$5ANz57AgIr3{acr`7_IAD*jagj_idF5F(qblYZq(Uz%jrEXx( zn*_apA36cHIj#j%z^aHNFgWghn(qjgl#f0FA{B}{K#;My+QNTx1ms>IfEJ}l$j>EL zW?y{u1<-Aq#C7qFIc!tI4N|O8MX1Jso;z-)|gm7`w6vY;KUUx!PhkNH{qQC6+XlvDigh-=ybX*?YsiVdZjULuK`OzD^DC5tJTKd(hPAXf0a{pCxI9c+ zRJU!Jm)#(h$7FN0#rmR+e%g`11^EDXmu~Us(R~08HC?VfE4BVq(L^l|c_1_DRW_O? zVDjR~l>ls0!#Cz~#f>?66s*{raCxI%l^I}rWYq^tw}3od2E71t-jo(@4`OT}iF0B_ zA@xHi53;tYvA$>nEw;9HuAPALp_W@|YiozSH~E!QC?UK7kY_wuXv)dOvtInCN9{A` zP5d`Uv_)`YS5sQZig zS>LBUh^0pg`4qK7snlp>6D6rJZmR*#ioJ9BT!0pessHDRXLY_B%~kIa>xy)#enhdB z7U}H0mepj|?_X;cD3uxw`N>Enq9`hOb?mhF>bt9~3FAA1N`@-eO~C&EMO;C?R3>CC P00000NkvXXu0mjf|8fg1 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/mother_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/mother_eyes.png deleted file mode 100644 index 9c73c1de016b4c733ae6a72de7d6963c85f223ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Q+`=Ht$S`Y;1W>Te z)5S3)qw(#fjl4{TJgpDYJKIV&FomX_;F@y0PO`zMI^fcTd0LvmvznwhUp^>V@PD?}R=M;b5@xO6K^53@EmdKI;Vst E03?}DvH$=8 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/web.png b/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/web.png deleted file mode 100644 index 22455d26fc55d0a9e2a0672235ad673d4f41ff07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2401 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 K4<%1UFx*~2jv0_sT9Yx6c-o%nDrsp4$>na z@PzZOpwsq9EtvSe&&tXjww`YCx6eMqTv#MIH%GB}oBeW{oAv|F+N*e8nqu)by`l9E zD`kH3>yN3`j%YUD;`{!kyhf(&vRxYH%GY5XZYx;Pd-q2%RKCmT9fhc5E1b$Unhq~s zd z>l=G)Zly!LHFjP;q|^4MCQkA_>WGpGb;LOxaSlMWUI$=d(Ng`@dL6GdQaEMKspEH& z!V>!X%*Wu$T4|8Eu}f+(MhwUgOINjF;iBCh&^v#mgqf5Nyze@~RWY*%NOal*>eT|( zN}$NuFkyk<);8^?2$S9Oe~p<9AcTOE5&$={!FkLexVAPML3U^)N8|MXB){eJx^Ip@ z1~Ugiz53E=dl+%>dqE_Z*`IvsbHX&D+W#Mjt#3RUz$k~7IW+{CShMzoM$=Jl9fn?o zk#3zD2CLQ8WwQA%*?IX8*Y(C|%hMvY7_@cTEh!R02ySL`!*)*@-0!`+#y2bCuIsVB zu}wN{@%V#1o_(@Ur|t2!*`Qf_q6SKVq|$PQ^$U@1AgNfh_C$HdvrqO}-`ED=@dtZK zLA|(p_B(rHV1-&Lx-GaF!Ktu*lasGF0->gqDDUcJUh25nN&@QQ>Bq2cPx zg9rC1mn-U9_axA-y=TMt5>p0{u|yA;*S-a$GIDh!qjI^TR$40SI8NXJiRinvgsjk* zrb)S6QH4yY{QAbW%Hs4o9s~;^Jxy-FxV2xC4Gs?~W0NMG@lh38fID}W z$BHES_|dgFGklLJ9#M2#r_S|m0sS8!VB#MPvce*v-|E8u(&*peiVC;$Ke07*qoM6N<$ Eg5WOYpa1{> diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/witch_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/cave_spider/witch_eyes.png deleted file mode 100644 index f3515462763b1206f13b42bed16d3d0c5f14d3e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 474 zcmV<00VV#4P)CG zKhYnU^)wfURlwWYPG4Jo7=~dOhUqqOA}Aeu+OoHf#)Obf`~U<1 zVdO$)`CeOV0o4U?tlb7xnX4mtk0Er7h9g1!L6H#x@LXmkj9ffD=6HP}Ex(7viJ;ra z#r@rTt-tiaBRR`4o#=m0YYC_U5{elNBNqT5Gkb#vfYp+|CN~{>r1k(+0dkgOwKOY+ zUr&I#dvDge%q!Go#N>WnWif|P*_Bx_SoH*e>4d~$u2;nhBV#`RIZokXyCs+g(*{PT z!1ax&eeV(%x`uHgNUi-HIhkxoZJ-sbAAl|$0RiBu{2jF^*MHZRf_4Rb)C{y$al$b6 zu^~Ba%GSnEK{j#Qs!~;P=Q1%p0DD?m9;iE;RDE~txcvY8Wl5e(`7;cIPkEE63K39G Q4*&oF07*qoM6N<$f(%c~V*mgE diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/dark.png b/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/dark.png deleted file mode 100644 index dedf54965b953382e223e206df535a98cf706c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2508 zcmV;-2{ZPIP)rxq787P1+`HO(TVLdkCdmmZLyuMNp7k z#aY*5U5~|ebX|9KXLcOdUEG~@oWVhyMHxnS6>nV@FTi7|ltTm&Xlv;aQcBa%(7a7Z z(K#cFa^B!rc`^nXXfKfxhT9<&iI)uAR{I1QDVa|)-?uy}d zCSrF*@wYm83mu$t<7o9`v->a_)Yz@jiyQwQU{nVHQVBFT<lOB^MwPy!)xC0PKIa8Gt9Y6e2X**zqQk^M>z>+j5IV15>{tn_9Vf@gUkfne+?{B|wiSgxi^jMTh`M>j!uD<9@SE+@qT?&Lbd)A*pWLrx=zH z!6HN@@=t6j1jKgtwe3YxGh`9Oz1ln(T3wKB`^5G)Zqp(}&nsuh*6{H}L+S(Kl8pEH z!(-GUi1IzSaXoHlBCBo_3B_AoZJrEkUBY=n(QlRaaKdp%Of)X2!8dLBacpH}6+w9z zXSj#0kG{rq^(^|MefZ`59D4uji`MPielj%%U^J+uIh)-ljaRJu1ONK+Jsw#``lPXU`2zbVx;V8Jk z0Z+dEBy+2ZX$jQxqvWfQX$R31CShsoKyeA3v(4_4h!0(%#j(xq1GkJjul*Tc$@ei> z>f?C0nUFk$rQ6D%i=G-|dZXh4M!&n`K{orJA>E~6Ks7*;Dv7i8ZU)>DQgc+7Wb|-N zJ0Pmza7{Z#gIWrM^q87-#U%RNemcF~tjJx)lFUkigI?M~tz$^-(xBYm{CR9^;CcKE zP?2C}=KcyMr(VIlrb;xr99BM3#cA(p7Ua)EO**^Q?ugAVSjrdnT4IB+Fnb(8p8&w} zOC>KhKOfuk*ak6_9=wwWN`61CIYC|%{FLsPz}a?z=zw_15dv=HS#mTg4bD10Qzw}y zO`pYc$N$0H{G}Y-ThIKQg@l7a>OZI_<@m`F7+8kCl%7aKWYC_mYY`a z-rkRylQoCbloW})&F(|^te0p1`gbXZbO(j;%=-D#& z1zPit(A0mNwR0Xolcr_>Q2_I<3X7|zS4U>QMjeK7JIfY9KnXVDv zIPce==HyGZC&$wPa??B=dAWL~Bo#4Z(Uq)PR>?bix04aeKsA^|a$g$TU9Xb6B$@2C zY^JJ>$dR+!T!lg*BducSy`QTtNU60G5R+a-bpfT;PL54ELch6~!!_;FYqi5Q?UFK# z1~q459TYyQN4YQ{?bie}HtahD46CxS?-01faxcnm z6(N6&dzaqo$|)T8c<6Kafh25pA1%AAg1K3Zx9}c5Di7ReyJIMR~SdYE@l4QA|0-}Am!h9fuSa7 z;jRc}Hx$#K5g>PY7CBXVe(~6?WY5-6lP@P4jo_*qp!_4Rq>^9VzINOlaM>Al{&RC< z%a>GfthSNV+7@7_3$)pNtX}sxn|5xZ(h)&(-)i<8I7D92BvxhLL}TO_|M}tzetON# zxPk(fb=#zp8Bc@{KeT&%tH9+N@Vm}&thSMAMUaZ>0zf1lC-G+Ozo~RYu-SdQzwJZP zOmb#u%6XyoC5}XoVye=U9n?zX-TGPF^6b-612x{bq?e)>L-E{V-tq3B+I zQpPM`_ZZOpc3idtPR7L8e_17UhHHTjM3}0ank(4NbfdIWWFLLAMo^Etpc6?2GH7(Yw=;NNrw{qlo z9jT!d)Ke2kY1abqP}Q$_<;z#;3wVhXo?}V=3hE*Uadx>FY*Ue$oW-Jr3-AU7zCO@` zPvK)QuaA4DuEia3@$jt2zu!5a(lmn?XKkb)Z7R1eUc+*;8F{jd+std|_^OjV$?uc2 zD2PlY6h diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/dark_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/dark_eyes.png deleted file mode 100644 index 58b737728bf7ee6e8919d7b420f942ce0a32a3e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Q+`=Ht$S`Y;1W<6h zr;B4qM&sLS8+i{a2(Vu8FDvj;`@rzV;r-R1bPgkDwhv6pTFy-H7Ck*}5r=g;r}h8P zfDfvE>U<6VW?$s;I_P;hioxNX^0|NOrtMuiIc-J+|He4uqT(#pj3{p5!#nPAZ)JL7 z$HXAF{qznsB`X$5tBDIIzqDgjzkjag)0Edb%h_Cm6}}gm-9P#(bn&?(8+O+>trCeT zmEGXctNUm5qy7uOA0^rLg|#SMcF#Y{?BN0dA>HET%3kuHBr3XqUSRNa^>bP0l+XkK DN-<%< diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/death.png b/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/death.png deleted file mode 100644 index a9138565c199a86e0341bfd2f95a1f2bf1d4e8ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3011 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 FV1i`IsIdS5 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/death_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/death_eyes.png deleted file mode 100644 index f2c37bf6cc4bf3b390584e2502c68682caca61e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 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 nkXM*lPILS7+^-&+hr{_Lvd&cAO7;C*Gn-x3| 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 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/drowning_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/drowning_eyes.png deleted file mode 100644 index 74f18956745b91cafb48b813ff2f9eca379aa49b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Q+`=Ht$S`Y;1W-`J z)5S3)qw(#rjl2vDEDQ$kfBqM>=I@BT_ZP9EAV? diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/skeleton.png b/src/main/resources/assets/specialmobs/textures/entityNEW/creeper/skeleton.png deleted file mode 100644 index 09863cc7e90a8a9e5b09d1de515b6ba424aa021b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1687 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 vk7RA_*k;ev{|fw%%E zgv1$fL6x|`{{eSy6*mqX00CES(5k2v9H5l+M;el*X`49SdcA9}&B31a>^8}6vuSBj zztYO(R*ZN{ti+mpn9pI;2&gnYYgZtH6AIALLgbaOsB+ER#KF7>+mW zzW3j_9gbu-F2t|_RWiq1GKW_4wnehVDChqrXJEIr3eF;%;BnHw@MKnqvH1FBO2@jdaJuI zzyP_^Gh~aPdznM46uX<$vN54o*vb4L+48jKfT0XnBXb^#MNysCy@DaC^O7x3J9?{p zBxk^2EXyP)lULpw%Ij zF%1vL`A+vL#>$y~b(z$W%Ws;RT zLRFfQRjc`US%rM1ZCq$|rT*^}%M#yxa+KE6CLet5KT<9jgqjP~viUfa<}mcCfTSw) zt3N+)m(DkDhMarP?e&jpPkt>A^gl_ZxgB&lc^O{;h47J7l`m@E3;}SC)%#+76noX- z&?~}4_lk0XX_JpHMgW|9VY6@SDE6{X_xkVG zfSD1L=5`^oAJG2(_aZqGbcz|9oo0<^5Duk!Agjz7>J6%uyjPNgyEQU zTM_0|g`^$RUfJTMue?3Q;t@z6r_vk-p_c?^-KN`)i8fk<*Vc&cH8EV9vvw@clRNFZ_vr{wmgNjp78M zAFn_f<`b`P)4vG(^mdu@QJ2@g$e!`dM>7PseBS&aU=9fLarOMy0$Sc^&%ZH*Ap#&; z_ldkV-A+OhCFq7m>41&ZaIvPlG_TwvZY7u#0^wRXrw-#^yh0jxk@h>`k}`qqyYOUgNXf*)=Cq@$||C6>WGTKIe8E<;Sk+#;vBA$ zCMoT^EzmXMjV9r>HH--dX}?zto-dTW{@On%wbf7W{eVcq2u%mg)Y0PvG!5rS4Kd-6 zgc0G=1|%uv(}%ET0-ArUv-R^;NK!;6M%wQc<4WyuA=0ReZW#!-gkcMG$D({{7BS`G zpTA0Q>j4v|r?8Jr6W&-OX?M|tj;J}r8v)Y(ud|Ibjk@TLMdhW#J^T63mUfN7ouslV ziRYEmD48g$><>f|XNfJ^3`ygJN~4B-qCpxbhzSRDjo^j{+F!JmecBr_`mztpKDy8_ zD(3F?kAQ%J@^TTN__~yR@}PEK7+_A8DIK09yuMC&yUEsXx6v$tQ7O^6*F@7HdeFuD z{XV4wCQhS7`)&u*H4v2&!|aE_r~l*``YA8*kklTt{Ph;VYSc2?zI=ovx=FCq#J~Ix zV#1<*r$w~Y%|z0)#i0*hCkZ>OeEACi&haS>*V)y67}UBioeRB(>8?ucvLdy|JxJ0u z(;#U_n2kw{N(tT6=!RYVt3Ite5xS`%Dh8$L5@ur(^ep40Q9{y=8D>8U)DIg~D$h{F zx*W5e)E)=gZ|}OPs0cKnLy}TiXkboHaOd0KX{~jz>H@DdWV-Gn9hE`~WHqasn!g}y3!h-z- zg6uAPP`^MAUIniUMh~7up|@SAs1z%E@nBJqm93r$;(BfavcB=9*Uv(c8{w|ckgOX_}>K~2lTabaS(EVrzB|Ciqw4LPF)`VE^>e%2!im2 zwZbW_6;A23dN+BR2HW-X_7PKq{cio?v5w<^PrV4G^K?z2m&!sD-*l3$Db&a@(lv$b zTG8FwX>&iDpqI+N)W|WS(f~Db%w6m-&o?_Bv~M~onodw7$0(Xk(8bOy@uL;G*qQbB zQ)^R*N&{3mlQF%)001|Ib;M>C0RV>!7LpSt4t|Xw9<{&?hR>^4f%@T*DrYjd!LXN2 zB9hAB%hzxCv%QRJIS>A~;-1J2*26G6C)E6oSIc>@;YnEcCy1mn2oJ>o0GGdiAd9~Xju|-^1-cM>Qy{l7jnM5 zxWS-K&jSGT!!5+47M%S60+;sfT2toio1BayLuv3wN QHUIzs07*qoM6N<$g4E;v{{R30 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/brute.png b/src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/brute.png deleted file mode 100644 index c270c27b219335be0b596b84a55ba02a8a075fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1822 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 Qu>b%707*qoM6N<$f|`l1&Hw-a diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/ninja_overlay.png b/src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/ninja_overlay.png deleted file mode 100644 index 9c71a2abde419af9ef266fdcea8593f1da78b46b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Qe1|}oQB=dL0Vp`v z)5S3)qw(z}L%wDMp4Nx#*=*}~GJd!3%Rlg{aVFmhlde@=OBV|LHy2bds_;}{U}$Kc zH7)g~s-{v(n$}W}N!xO*#kX$#^KYA4_0nzS_V3?aUVkXo(EIrL?+=xoEToS|j7DQQrlB#~D6hSn_@H|LM#5 ef$joYw7iP(w60rTLhJW=Aik%opUXO@geCxuGG0dj diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/poison.png b/src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/poison.png deleted file mode 100644 index 366b712ec4707eb66ee0389b492e538410df5419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmVttViurM)%f^(52f>n@4G3*Wq zX(8K#G~?OvZdQpT+sSts?e6UOy*KZ@d2by<1S`3$7d7WqEZ)n<`gwoYXuV7tPiNpV z8@fSoR4(D#wa-wkQyi5`0K%2**LY{arKkzx=?nm1VlsoHa!Fjv&)#Mt4Ip#eu#rky zC>D3&GJ9AuohdzqfXi$Y_V)3~r&m!d?urn27mN^T0GHXAn9N{eGK0!t3CE2SrFDY< zlnzzEVG|hwxK z4Zd!()fUfPX8V+vpPd)N15{yBNei=cGXQ|!e|wCbohM+70RYTw4!?Z$Jpf>KZU(8O z<$G6MOEyN3Va^lHaZYw55g)<9vl2e~FavazV$1;m{P+A=oc(_=hU&|gV9bGGm;gGv z%iopP1OU_YhZIMhcOLjo0o@?@;?8aSx$(De(#+jk&3GgG8;8Y zvA&u2_-~bA%ctoEf!QreOp`#pjzW#iuvk`=l$Es`RP65R+Ok)pRP1!W@zjFx8)1Dj?;Vv(k?y*>w(K=qZQnee7v5C9D72$;38qOfG1+N#i^W}- zCJA)MAY>2VyUztIY;AbFdK^z@LS0?nZNSD#F6;4oK*!y=!h>$4G&vDf>r^Br$LVc> zpj};ETlRE=pmNwLig>3O)%q5;HoPi;MQI*itJ!LI4MLQ$KZFPHo#(L#ym<~-m|u#m z&Av6lPa>^&}Wr4&a$JXpADv0~Y3&VmyAi@=+eJ zy0+Z$0BOyKkCr@MafXfkpsBn4I=deRKibqJ*b8cm^GygF`$Ypz`uDK$by2+{th`m> z$KP3^U9?tJm8V9f_Bw3r18vN*P@@!K<9Q?hUovRym%i)#!q&#A2BvaYLXA=p3cU2? zwMG!tI)&Y!NW@2=8$^6&oBn)ms9%ly?glG|CFzXr9D`g@enj$n+%P~V$tL0>XtvrS kq4BKlG8>idht*;8KQQYIS(!=K>;M1&07*qoM6N<$g26Uq4FCWD diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/poison_overlay.png b/src/main/resources/assets/specialmobs/textures/entityNEW/skeleton/poison_overlay.png deleted file mode 100644 index 1fb05dd46db5345baf46b3cbcd91ddf82917c298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674 zcmV;T0$u%yP)wO!h^0u`qZb>>1Wi0()%pZ>3+TUeec}~z+f;K z3Pxb98kOz%J$K*$vsvMLnKSOdf#Jz?~SJy697M;^^pH0#pe4 zdrJlJXTJ12PogurE9r3`PbXFRA_L^h z8CMm3sesdV1o8EH9j0lD_g5XU65zBQlqO3km&bei~inGe)#X+7U+Xs0){(XL7 z@j~N-Gd4g)JimRCPQx@!(GNrACgpWi{fma?b-ke14u}X7Pts}VsTAr5bzHxD9mk=G zdMX7ym4fHGa86Ew@&C=`UPFu>)5ZHR!ecH9!UlL<4+N*g%ldwNd<+#hBf^GJChRg0 z8U>9pCLZ)L9gSuKg?vFUV6#@kpMTY{`(y{7e)1Ur;Je4)0s!87w~Tvpa{z+d<#WSp z0)Sx{%FX3*7XdAt?|myuv<2O(|b)L`wp!xD8Cd`~jZUCUsY>58ulbxPP`}+YSX5Rmx=RKtq zmSv&icJPWGVZzLbZPYI}jQ zgoz)exE6~=K_oA>aAt39)*|Z%;j;}h%G9cl9{P+iVX1k`-w#_7!m$7^w5YyugwMwq zgPAkI7#rI8G<{45Ly+My#vnfr8+OYUYT&dT*ex4dn>C;JWsLfK8p#k5s2GL;`8f`} z?8U`0N|$9KxtB?%lAx4=9#NP%6C2faztL=nn;!Ihu?*lHS^WBq*Hy--vb^MPZPt9w zgssh*Uq7hF8m^7%y6<(po^jkRyzTkopw$oRFmonKlO=eri>JT*3NvRa#ZiT@1n}GE z2YmYTj?Z0Y`DVFC3b>(7rjkOxNrnLJz&P@EKoFL5f`^?*Y2}+irH3aq{F%D_6+Kk9 zx=~&CNrs3hk!Ol=sqgMjKl(s#ipJ)&?}4}BhiMzw=Lll{Nkz6~1922@6{AILh+FCnTO z6dG`vuSd0S3Rxtg1^k49QG?)$$$6q?O{gqs2aH<-`g0C4Ie3;6=_`5QQV uaVVt9FbwEpI=rqY3|jb?n_O5O75)W$ffFXjDd*4t0000 z`us9Uy}JKslWr3uxszHjcLY%-au|i`#QmL}P7|ZI*Y|=zxsw23b;h;P$N}+Wtbl`H za>!6qLBlHFDk_ztMT7n|3Cu=*y=u>jMZO=KF}}&2of!P0pOpU0aYUDAiQ?G z$ESxvtD<%%cM`%EB?s7M0&ZJX8n-tAlGVCoH=E8|JtsQ6rSV=be4(REo84?P%%*cM zS*`VVQ#`!~C}xT27@95GrUMi=YB~V`KGP2^7RcKmKM!m}5_c?#t;>=&=m5EhWVO~C zGb6W5Qja1{m?JRH7D{y!?jYNG8*~BaG(MKH`%D%l!ex?r{cxbTEiVaM`Ped~ZMwiA zjVV3%S=k}Bp@!ClFZ46f{atB&pUKj5WZyPA19*K8qfp6R9&s9jtKc@X>AYlba{_(- z4O!6LXA-?2j|6RuN85}Zht_y$nD6Ta0=*#55dJQ*aX1`~HaU3?=chg$dgcuhL04q_ z0OakKw?%4|=e|>DbSGE`o$kFrK==ajWUNdl45Lu>!+{n?_U43XuAiHey=z{4j^a^a zisaGd;y5JqDl@>cK{bj;CA(vShEb>}8;DDY2Y#poIQ?*d#oI!c18@-E4+mH#Y3Z43 pxI6q7w(+@cq;@zQ4u|9Nd;u2^sPI3&-G%@F002ovPDHLkV1l={AUgm6 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/desert.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/desert.png deleted file mode 100644 index 1ac3eab849536083f08830757c5a921de32edb8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2251 zcmV;+2sHPJP)QlCKaJcBSq?_UaadyRS9v^i)q?LJEU!5o3x^qX$(~>v&Ke4LSj3{ zPVhIcKWM`m@4`99=XLB5vt)nC^83Eed7tzApXWKxIqx|JTHuvaN2>tcojwwGQ}VgE zSN{RdzW1R4;Kb3fs>^0(CYHqGa?p4UkSkWmupEi<5*GX$DugV8973%wMv=lq>Yk?)pdY6W>sY>8s!i3 z@@6^1ZnZMJyN~2zMn^p0_mEu7AnaG`Pdm^Jfo4&KwKXDq^Y;IRJix_ES4b{q2>3nN ztyUfRi%>w8^iqjW(23hDxGkD`2hnx9!w?!CX)f5+fF)P z=Kk^nc64l~XIB?JJzl17-N67j9X2A-Bn$C0hyU{{e)Gxa95_6|`FGyr#Nh5&=MorzE}xriCIib~e1*l_K{~538;w&em*p?i>&Ig5 zXx{|dWT4yU!)~=uESK57Z96+U z9wT3@@b!^C%;pZ6iiJW^4zEA|eSv7sz<0kh$d*j6)YXzu|6eh)vr@F$`<19qpI zZAO!h*ph537B|A!$>S45B6j+ZPY{VDNiJrv{_{=Fz5_ox2Inus z4_^B*&%W?|`uhV!B1!uD16;gxMXpnt6>{~t7!Di$7*a7d+zY^bG)bt(OQ^@od^8C_ zDCm<;a@sA@peKfc0C+q*<+Z30sz|Gt5ejuN@c3SFz_fWA6Fm?J2uf048Kyop|8*lwWUaM1Je}912&s|{Zt)CI_ z*U76hf|$7g!Z&a0W~oQYfWCkir`*EW$#F&|sv^XWL#(|5Rb zeTGCTC8OWClua&Xm^yt1fJiinRx05bJjm*p@u7(9qpDiK-Dys6V?q*G+y zcT+7_t0FVo&VYQOgw3*p7f(I|z}xSB0Mu##z}0IvYE$B>gPd6Cc-)9@b(%}0QhfQv z3bXMgxsjndA`-2&>+N>SsC~0*0H{rIV!B&git^Ew>#}VuktGsMHeCxeZsw>?X?q>; z((&&_OSfXZxm^x2I$0Dk+I z@RsZ&Y!q#0K(1JUM4IA9pOP<>`1Yw|0Q~yH%goN*AzvuTMNqb&@$A$4@OkW{G8(Cj zhR7g5pmhfGWz*KS+{MykVxyk z2F1PV#IfOCf}Jkehj63_hMJMBvTrkB6cPB{C;wO@3{S@p8M2T_lP{DB1-(+P5*OrE zM>NX9(=na?_}!e;ohw$>L^)q5OY&P)FioN(^}seUh|^FpQ55Q~?f+hI9q1k+=%=AX9~ik~qQ=P#w{D zLL}OXqb`9pCrPV%uilv7+#)DC&lk$Nf+UKM(_!JzXh^qg%@j0gRIXTICceZ>d})nS z_5`~)G#Zk+LP4*tfQmCd&^uW@S5%#}6_6Pq3~q(SENEu9c&*>OI;;4lHcqM Z_%F{l?TR!4PN@I@002ovPDHLkV1ivxPFDZ` diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/desert_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/desert_eyes.png deleted file mode 100644 index bcaa2f07fb396fbedb2697af0e36fefc21e78ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Q+`=Ht$S`Y;1W+)` z)5S3)qw(#qT1u8l ziOc0KxhqlZfqJ9e)lwD}x%mKrqn+6|^S$}z&6`<`E|?gbY9~F<83ql{i~IsSTv^fp zUY@$x&gcf4TV+hsAYKOW0}t2r)U#@}OwKr1KRh%7z~)w2m7n+i-Q@+X8>b}nb*m6! z&wJMJyaUhtz@tw?5dtFQGPch|Fcejn2{fus?c5$VMZRsazoJT=dFHMY1wF`w2s?{=p z^0*+b42c0J4T(kZ7$N=3xH7syHj`8DHT?#D;5~O-hbkbx{^GJvQo@UXkQag(-B5jZ zBOm_%Fr>u8vW~=HH^LJ6!|H%e^gnEOI4;8Ebv=XaRLJNCR=%j(WHUKMy6HE1vfn42 z2)aenu;fLGIm76xf~4KyI2bKX;0GQ}zd_BZMx0^gi;-X}koHHxp-UhM-2$WFq=*ZG zz>lo`!F&N-&kzK@Y9nOjx0`~Kpd64CNe^4&Nh*1fF~JW!MvD^wioC98R9)CfMaLB9KOBF0L1YOWC6kh5<^Mq*;K}L( z>aNXzX`$Bx`sQ?<8OqQBc#ck9WE{rlZ`VBTJCH!5J{@P=7Jxg_Wh|=;L6V@P_rmmPsz2Sk1Fp^f;`&f=lzviNx_E_epL>O~ zXU;KNJWah`XX>T%OpKr9$$!59V8FBhs5>_4bef&*ZPMv94bMaC>nI_WN+V+QgQjxa zOF#NO(?9$*wY&eoemsw^X92Ju&r?WiTzc~lc&XE@e*Sl5OKiA}+JQKgGYodNx5*g> zss40l;(B#}mG2PRs+6hKZA{YypjPh$q(O5CD{m#rzuOv>@f!epYk42xSuYeu4&)eq;6+mE0n_60uh zyEZr8dl!J3QzZy|UZ0(1;m$3U3oP8Z#p|=P1c6V@sRD50y?0e!AZU2WIgR8D8QthT z23+~>4=_xVkLPa!aCPPyuIr-h`SP`yYpku8_-yHRgrFoT;e;i;MM=Aw-XUZf=Kid0 zcItw_SKD26(_{VVs%qs6j49$I5Rn=8jcnx)F6*?|0a7hz{v0^7>+vkKkJXk zn?n(Tm-h0CmB-6KC+f=q3t;}v+=-A5BPH9)mtWpz<#H&Cf|Sg_;_|`)iLb4fu=18V zngWr_NJ0EQE_`9qxxlor9h+yBl9F~Cs8lv0$KI7k_ajH!rr*GJD$1cR!~xP#c-xXe z%D{zu{2LxXRySzI1{eQgV>>oh-cojfh*M!dAlgm^D_>Lxq!%41Q?f;kk4^4*zMuwY zJ2sBH71_q(`*}0)$m-EVN6PY^<96g552Q&SIAH&D7;cx;_er2nI+tr_S$o+`4#(YM zZEcnDvB|`=RS;G{{O~hAHp$xBDvrB_l`oRbUF0000^V~xyl>=i z>-_Y;w7lT>!CEDteufL0$<0>tzl2%Ozj9;2`LwvLSsR~RekCIRYSQOL-={yDKRPn(l!-4|3e?Q)|17LP+8-c7uplykw#H8Q^}Xt~Dp&mYtC*g+;PFb@B= V!+h3rt@qv_uBWS?%Q~loCIG7?Tyy{c diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/hungry.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/hungry.png deleted file mode 100644 index 9421864e982581114249cc6c989b4782bf86c9a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1785 zcmV;G?l@x6hvr+?9jgr#NnRigCNgI0L6;LMj82j6q0bgQjss`Ye=` zQs1X`@i}jgBEI?sOXvMmrf}IO<0Q><8l+ljtx<`{vLXuz!~iu0EE-}gl48Wk_{4;Q zrNgwc{5_wI&}ZS9^E#CQs{g69Pm2qS1}RSpQe2{WB`GidKMgurIBB)X=P25Xk-zE` zV}Cut%^UUTwCu15<#S60I$a+HOGm{q(dov0Oe@Qk_StAA`5797kQPlv$`ci5%?|Tm zwN^r(h49%3uIow0s5s*kt+I7mL!21|RYj6g+iCs(D+a?r^8Io-kKB@h!7$)`NLjkd z3_cy)07;SbG#^i5$$7?vJ`1s0D**skKDT7>Hql7aDi5600iw@}!bGU;XIXhs#>g!h zc(+fB%MWzbfII zA1+Gokj#6x4sdsSAN|YMr1yY09*}H8(p=t|)d02kobLd@wsQc03?dkYj-%ihrj-R_ zM=%USa*?vVj8X6gK)gzZVPF)zLDtA1f)3lxq0{w|L4@VyEL_*a>)r@Q=4EU@F~FFQ z4|9KFsZzu8auzGz@A$(r@MEihBl9v|_eMAlLv;84K?V_ug=J_N4M6~8jSTuM#Ot1i zAUNW`vb~I~k(s^}CKN0ktF;oRBdr|eU@<-byWP#Lr)WVx=#>jlwO$u&h6o!J1UmBnBfz;!)|ZbU(`T2qnc zqn++Jm$$ozSgn;%b&6>Hb&R{)`zTmCzW>}sWzgc+f~Di`_C8vB$EZ3*tkz0AHl>YE znv&7)5>zolTrk+kV@JpUB7k(wr!%%LcFi1wl}#tNEJ08$GUkrC9-b>k`J^Cp)W1VaFEilbN)1Vgl5 z?D4*y=ficq)DtSTmLbes2Yj}<7M06+J{ekpt5+SqLP<42+E)6!&Jm`?Tnrct1GHZ3 zNmhN_dQu=#a(7yii;|Q4CV$w7Ezq7k9O_)}dloQYB%H=#<*W(8lsx12Nvk?!X z6iWbk>q~NgxL{gz%+OWENzpzFadSN`EP6d3tF;oJq?qT^s7#6hac&1pDNRwSDk@0t zQGOo`1Ku|4QP;H4NpagY@%(vLqNkcyY4>MZSt+s?ES;w}U|i3u^*yaB5Fd4kdwM$4 zBc_N8qq1+2$WXEIxcO?Lac6fQgJHl64xf!samGOmm@IC@T3l`0+1;1qQ`#g0sjKX> zk;KUJfKCI63eifLmK@~7Z*YAU@-ulr4s>dH+h-vvjw!i?8bE3M_d*-PLY%(xk)>j~1mw@}z$BX% b&47Oa*x$ek>{zl|00000NkvXXu0mjf4}eQF diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/hungry_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/hungry_eyes.png deleted file mode 100644 index 88d96bb1ed33be641baa21ff60c2ccad810f0532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Q+`=Ht$S`Y;1W>Tt z)5S3)qw(#fjl2y8JPeM?>jeTYZFEeSsdFU9M6#jJ$l7HY)5Qx6P7eQ~%o;mkK4jG@Pv;A`yYYo^Q~2zl oY1_hP22CscckUfXKf|6gOrNLgd}N!xXg!GQ>FVdQ&MBb@0J1_umjD0& diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/mother.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/mother.png deleted file mode 100644 index 2557e302c647f68d81512dcee1a77fea160714ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2161 zcmV-%2#)uOP)Q%nUbX?+z7*X6-SsA$*ohs{VnmVRMY7lj>WoQQcI?n(@blr9iVCXtYnyPj~*D(zZ+p-9w2-~vgANV}q>(>AteE&{v znL7LZ18m!7@f{$FQ^GJj>h}iNmUXOuqq`2ke*Zwdzv=rw{rz9HlQ=EI%1IrDu4Cvr zx>i^3%g{gYkF`Z{3bmRd1XRdbrmp&FDi_pqea(higSxQ)i>I zcGTZlEBeDwdEi++;Y1HurVK%M-Bs^#k}=Ek!eVnGQJhvt$)W|)Uv5|ZB1_ul;}$(d z$)3+6SgPPtaH5vFZaa5c7C^-dL;+%r#TanexU+R5mw75NVm`lkf@SJ7n}+&sJWhz> zlz;yFKc}wiR1Xls@-D$p_PvmQ*AVhT&@y#wt1!+<o~3EyiC>rNYV^L*VOir zY_i$w=F8-W2bqS(MrTc>Eg_ktsmkT|ziabo!^3rKpzwx=`yIZ$cc@Ze`8z1$!M-=( z$3OakntxfTd}=AY3{I;_$8Dn<27S*bn@mX3jN4l`0oZ=Jqm&|B#C2LKZ--GtoMcKt zwq>dGRo=Uj{w!1H(Z=4fbv)Ye*fM)Wink1DmvYlL~#YShXvH;W2NYa!vn_`)|B3~|W!YHEmk13yi)y6b5OhdyT zhWNu!{r>c;HXl50RLEORljpm8jK|5bY#_4b`Bn-rbdBw&JM6xE1)zurVO+7kYz5J@ zkOGbcv1ZetyY8qlcRzZcILY`X_xUUy5GNVGe6>a64+s48FFE(WYZE6KpTz^VbDucL zxckxjDm!#L?$Sz74pE|*C{DR@UIkoTU;S0nH0W(~sMqWGuSc|PlTj4Y>$%1UvH9TEb)x1W(e)J? z^(*vWW^Cs^-W0ZTAL~||>^&Xry2TIge^1>}cz!?)cpXG&jXIO*A)2P)I<4Z~U|vu7 z!vIaw&hG&Nv3xd}5QH&Wqfu!W$fXIOv=2qFOS6LXzBf?gUB~9Z#}E1Zi!WJo9inlJ z)in9`?u6PsTRp9&smkNezxa{|A3sz zR-u$qZEf9l+oyK1jW9+qSaW z;GlR)y4!wQv^{zDLX8c>kbys3S_?#RS_ypRJA-qd)IPj*EpOWvZQHD*LP?FgFJFNVQCx<@!G-YN!UlZi@&*<^y&Xt1;A(f52hZo5)ZmNhSsH1_|1b8COI z*UiPf+qOjzMi{z=)@Z1rNFXKiGO|+JpSKddY@FKz%6mHqi~TknjS0f2QUImd6sKjW zYENKW7PHw5U8`4O!2b%h2lqbAfr=#sZQCRWi|E-O440n&4PC43d0nd?^NdAVfby2M zT_{16DRR1Nj%t_UYB(BSddyfU@_59}UWbm`rau@Ggc1G0P%Ru#3lh>|X*mQz)jQg@ zrN}$BNsU5@qq*#k+vaAkLl8zPo5**!Zxyw?v}=tRO|r78-=HvLJxx2NjPn zbdBL?tWJGm{j%%pTAd(_ls6P|ql#4tBZ4r-u}w9XC{h$ImY0mvwoSI59X}LZ6f2_T z?Pq(+4P_C-(O4A}vd5iPQ+-?}F60+4Ov-)z!BEK_g%RJ(31ySX{N$M7`2n6EC=U`( z^!(t`$ph5If?}Ow3&doTi8}fM?Cg0AM^WY0cv(z0_qX-zfMi9m%b8l$P z6(I_OLg~6zuXx_hp7&131Js8jv3lW(POGT`RGLlcxNU+kM#jm7gDklGJcIw;8&Q nF_)8^!J>Te z)5S3)qw(#fjl4{TJgpDYJKIV&FomX_;F@y0PO`zMI^fcTd0LvmvznwhUp^>V@PD?}R=M;b5@xO6K^53@EmdKI;Vst E03?}DvH$=8 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/pale.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/pale.png deleted file mode 100644 index 6797fbdc91c7530292ec25983ae9eccad460196e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2143 zcmV-l2%z_gP)d4V`@F893SN78uvF=LsHK(UT*~$z z;Fs_Iu?FDHv)?J1elMeUVuV_E<9r6l<_jcK_aDn+6NFk?*T|#Y5dcQ-#MJZC=KuIt z@6=S|R0*zXf>2AVB3J2Mkeo}c`IgNWpvI*L0XA}`->c-=e8DDH&o!>cYw7E1a_1a< z?0QjGO^}>R5sh@&2s|-QZip4a{arKmsXVbO}|%- zb4H3y~74cKZ(Em~6}R`(aZOurYu(WK_(a|>kig{SIO zH3E`zsWtiM4Eu_auniFMLQs#!YUK6zC!tO(EO{ggRwFERAR6gX(E;U%dD7{yS?J_F zZa0&6r!oCrIuEp~F@B>-k1A>-A?Nu%*CyIw?6C{~zQ5E)QKLlbI(N4B&CQZR9TxUA2wfO!{rOLSOj7 z8zs~5*(xuvrV3|sie|(#0q)V+MVQm$Q>MXCjKE}z5 zXO+i;!2rMh;mm93+Kn3Ed*6Qft%naDGX0+!8g|t2XnC23 z4<6Fi9OU-x3EZAW{6-V5RU^zM66_D}=JSV-fU=i74UIflTBfmK7cN}1wY4yLcN!NZ zd_FIU#4I!S(>&YN!QtKro&zQNN zUQ?$+Ev;BZi%?4|jScm{6D~v5AYtxl-(zcrqLD7V0Rvb4PV%`0Ov6Vyl?8W$nycsN z%JLWLS(+PB_VnNYeRMPQyZ5;{pC+1_r}Z!YW+;A-!Mz=f#_th5cZSjUJ#NmYdHviO zpjHs_1qbn60-z@0ftt|0^FQWb21p9>BX<{dbmxEKRr0W@F#Z^LH#(F z;;n9utEa}M3~=kl2z`gUZ3Pct<?MHp4hkso8S2vYE_0gD3g{NF-*libV!qd6n}QE~#GN{Dn&l zyz(kmu}C5@3&7xsesxL+l5?r5-Ks>zrXs)_FjW3KJ?z?5E-t3wV`XXCR)Cxh%aJ3! zHl+Z}L|NgZhkBIPo;yAWl#e($?q;Xs{NtZD)Yy@+aT1Bys=rVmAG_W{4Tc)k>F z--BgYcsw44N5%kn;nWGz=`5CIsR&4?vQ;~@P)jSWojdr&Z{ORN-x1b}O{IWkSxipF zu`G*ZDruADa|@~_==XLfw))bvS!_536gk7k64hAQO1{fvX^C9 zw#(LbpiWov*3A(`!ZduO(^=bK>G1qU6Z(zNR`?7biRl>?4MI})DwGY{+-#~n#E{|) zJtC_`-&VjS9{AwOwKc-wkufAf64Nu}a|^1_iPAz`$m@o1%H+rt$gwE~a(X$RTTtZn zwYCyod@?a zITgn=eB0)ELCqWA`eq5>c>gh5!EzGUAx3bb(&+%$457~xL&+Ft#8g`My+8eRYm1<4 zp3g1V3X&8bztP0;{$q-SC?ZN_bBm0Q#~2-ttuacpC&KamV`{C=gL`cS)HHl*UERoH zlx%L%W~A*voxZskLWjINqd>^&%8ic4i1tL(H+griC3Br?CR0g5ts!7-G;Nm={s+N+ V>L3O!2MhoJ002ovPDHLkV1j@L9J~Mk diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/pale_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/pale_eyes.png deleted file mode 100644 index f88e6444b122f95e957a83c477aa4116fb4e6781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Q+`=Ht$S`Y;1W<62 zr;B4qM&sKHhFpgn1X>@8e_&(WDA2OyWmEWu3%6b``4k{_duiO89C0z7l*IEJG;^A| zx}-WE{y$~Tb4HpIXaED-D!tVubJwPSo}F`LSL=J*lqs{$n%Qdo&iU7MQvGzT@x7DB z6kY~ht5|+@(S(nFyB{mQK6ig=?c)paD^6?Ol-P1+`6k1Rdb_`8-+~Nd;PK)9^+z|# S#qpOUi0kR<=d#Wzp$PzlLs-)Q diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/web.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/web.png deleted file mode 100644 index e07ec593fd413e4a9d4a1308c55b985d748d0e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2417 zcmV-%36A!OP)0!ft0jOwZ}P!?aMgxc@Kr&Uwy#&iOxY=Q-nI8mwM^OBz5`RdiiPyaVXE zF2}{#Uk-oa0=R$OnzZ8g(%aXMTC|YtcL2j2MNbY*$-@y;RlP)BT~z@!yJV?mm~x@$SHoWlpE%#LoVO*TvNL2dTsLTZ|rlg z6!T^h3Z-HpJK1dFtC!WK?VA#EVGNx)QG{9gPEeDXVU#KJH~FT1Z9 zBfuVB_C*D9M#43KATJ2oqj5U&_TMvMp0Kc;sPML~>+&gzqIj>a3^`Kd{&j28Go21| zLEhu>5E+c2_`QV6f^v?3flrb)N32=t&l8IXOjk|qAumEv7$p~Soeo!ny4orXa};yL zBBsS1#t4-KoyB$%V*Zt2#uR`{iR3!kW}5%MB9%%xaz9v7jK||4l}gDuf~fV2FCP49x_Reb-h8zMLm#H)mAB~b?BMO!_W40+;((=l|O!f+v_1%G8IW1@4lHLRiQ&K>Cnq)JNhk2-Qf7qj~LOTtX_3Hb+uKp5ZaC5*!$!qN*Km4N6DY90SDI|2H>PlyUH{M;Otg=<)N6=uy_MS%!PU z;;xm8<@|*URfcqfg8A2Dn4=WTzn<|67je7Ylol7!8;)>;l1bb1S`4?_J$nOq{-Zzt zv!8FHwD?Bee|Mj(1BO1#y8AZr!TxvH@k%QP+xBBw7M3;Dku9xXjMrTNKwkcJc-;kr z&&N2g#kfH!Wcj$yKgF;fCo-rpe&HgzuH(v|Cp|CP_J0kJ;L4xJ*w`3uw|n*}08m_3LdUVg zG;G|&V^22m*pp2>)3k$d&uJdt@-$6bAIA0= zwC*RV8>CVx-e}#=z4vV(l}ZuQ;s7*m-AYow^jMs(TNN$+tc#$4X_-XAr|39#n3Z>| zqvP0N05(3{=pZQazNDlSO^eE6sA*AIAnk^TX_*Zd1p?A*%a(ivAe$h7-ZNiu@>I8+ zn@l8#Y4K_Qp~~)M1ZLd_{Pvfd(xHlSOv}XY^Rw~cM%v!lL$EkNES|u$ObmS(KpumF zupQz=_|yK6uF3xhSBk4j0n;)$_e~hnGI{gW7KhA!1O`;aarD_S-HGr+W7a8PC+GM1 ziS!RhnQ56)CJ;~+PJP`ie+z@m)Fu9qm~{l$$qDl3z6lfQA8>fzPA)qNvKy%XCtQF0 zLsJ?u-uul9yXo%i;K-qN#F*db2cYvrSI!M9YM~?N1FAx(qMS&7rX?2N+jXs7-@w84 zRt$ZZP(?YAF{b?OO~eN^UViBXBK-q& zp6H^cx|(2d0D#+;-|8T3Z+k^AU^h^xqFfRV76+)Qu9mVRhuYcDu!(1yb`a?wkf|fS z6Kfr8Ze=Q`?*A?(AS;Ftbj$=QNddOK5v%4^M4x=Edip#_#j9c6|eHzrKf-SKh+qa?Nc7 z>}uK0;@ej8@h5+$xU9q>>^#whh!BzE_S>L6=LLDYA+lwiC%P`#z`^!bcC~Eh*=``E!n`_)YHXEHVb!QO0 jL$=rdeB{`i7Qz1lGDRSd4ME6600000NkvXXu0mjfRE)O8 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/spider/web_eyes.png b/src/main/resources/assets/specialmobs/textures/entityNEW/spider/web_eyes.png deleted file mode 100644 index 485c344cf58b8d1b67527bb478ee26822609331a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 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 RwQ2wW002ovPDHLkV1l{LIb;9; diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/brute_overlay.png b/src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/brute_overlay.png deleted file mode 100644 index 428890c489d87d162a98be2a1060a2c27884311c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Qe1|}oQB=dL0Vrtf z>EalY(fIb%MotC=9)^Pt-Z`oDCcj`3%VaKp`dJXD;?LVNw=;#;o-0`u#S7#%Fv?k| WaZRjs%PR%)7(8A5T-G@yGywp@F(Zrs diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/fire.png b/src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/fire.png deleted file mode 100644 index 49968041973d996d66347a97ca3029b5cc12ce74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmV;81# zFBL>6(lmN|)gZ>456QQrAAO)X_``k*|RIF=Rv<(XBCf#HSnOgc2Z-$zQvtkLj>(W(7bI z@vJt_lx%HQquFY!@V}XV%cD*LYsaG5-u6@qLAPgN^#_N( z3`R<(X}jw=3~Rc3Qr(`lXOixF0HekMr&Rt}pYe>-?OCi=s|QL@#NX&h*~{rE^64Z1 zD=%y0^%PHER5^Rv1fbsP0C3@yL4B)Bqt(IMu>#5Pj}54251asZ1o%T)o7KqcDFAZm zB#o`El7jl~#03)i?(t;Oepovezy7&;paev%{(x*|4q%Vx0X12fyc@Z6(xY=n0zk99 zt?o$|DN-Wkpb^#Lv7y)6+uS{~!tLeb9?#vs{V#L#m-yr`~C>%_8bD_7t~99YlL+76~KVZJYn_WgN_u7fN=?H0@+U8)ofz4AD>QOS^EF zziejCGnt^$xODlVT{2BumZ(V4k8972l&BNM95CGA$n~UQ^#_;*!!DVoElIOvns#}i zw5KJ9;f_-pGQS)b(Y&5gA4w*h&d+@v27fD^)idPv6hHj@izlRSUB7DAcS|a;r&|>7 zi&sT=qL|~KHw}+HemM@*iBR2@!Go?xAs`vq%~qRR*RR?_!maC9?WZrQ!2WgLEEu*w z!JR$r5b~k+g&`vA|3oo|c*yOMu;k>90P(&Uc;S>mW2;NO)$!_rfvi)ZSav~*m2FY;{9hF(f$*}t+!7xlB zv%e3bFs!ws}k~j+c9lK2nQTGlmNPbKNeXrXa9=rz0aWR!8@SzAIecJYo zy`z#2Pf8u2>bxXK*#Tzt41lL6koVljWO9lW)KN|vV-H?lD0wy{?lLv1+3~|YasTzS b4^96E)UrgKn9DN600000NkvXXu0mjfEs3<3 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/gatling_overlay.png b/src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/gatling_overlay.png deleted file mode 100644 index ac3082ee00fc48aee052e550c618782bea84ba43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmV;R0bl-!P)ET8!4UMO$XL>_%&>`>3d}>bnd@GYrpy0LBi+|kNn*bd6Z+!hO(5`s^{JcD4n?|&E{JhZkdEt71tJlv=lMx$y zckfsMlgs=D{rfu*sxjU;(XU0_3 zJ^fnsv-kh?Qe|LhXkL|f{j`#2-K?t-i$9i-55UQ+qvhv>sHi> z=5#pAv^$DZAS&;uH#B6&^;9h;jvJ(X|){| zinh9c*OAHq7_wlYXwy9v1i=8{f5U*(07O?=2#<1UQ8}N+fUIFmZs83hH3g)jG6kad zB$k)TVR9?H3(f=RwQ6PLR%M!b^?7>AR0R-74M=ouqrMu-IZ?>@n_Dk#RVOG0NQbAV zObWRih5IuY#+LxRX*&=pfO0D=M4@GOn=TtnkC2H6G{9P%wq>a~=I!X#hoxe%C zmP?ClZoSZ=0_fndsig^`sBPD&GWA-u5(dElUC)pOHOl+f&4j23l6?gR7+jlu_hg}yvNm~r-Edu(<)w1isIP|IQ-SNcY^<+^jrwXh>Tul3#a%nM~#J)6W#iAXWd6OrP z8+6{C@YlcFD*8Zbjzt+Dt2+#}gA_)swiD|IT-Q~FHftCvzhzBuT{m`5IxKsV=s0OF zp|4acbWerS@$xz;YsVqZfF_OlYA9Rf?VVi!b(ChB`AZq_Xr&fHyhXMwE0nYs-f-2E z<0R0Qm&&1x_NXx}!pRz->lsWlkL$X8|KuB`4lT<<2v0F9$pGOAR;m>Wx!eU7PGVmg zbU+zAYD~i@K~k$$!h^%6CiC~;u&LFmnJ~@Rd3zYlXbq@UD`E67HaR9G`iDZ7m2}+r zF%X^@Sp=_wWO0*=Fm9X_I&h(HpR|u}w;iqBKCdC;t&9c3-t5_wsOCdbW lvlHa#UvAqwyPxDN@jo>WUF-RdkT3uM002ovPDHLkV1gCsltBOh diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/sniper_overlay.png b/src/main/resources/assets/specialmobs/textures/entityNEW/wither_skeleton/sniper_overlay.png deleted file mode 100644 index e97827420f4a2ef6e1a314d5cdb1a4dca4f777a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 658 zcmV;D0&V??P)`oj5Lov4e^EYE8K*X0%foX+@dbaKFSG}6FPFgawi z+h1*Bx1y5+(l}`qduosW^!*QXaDZ#yPe&vD7gitW7y$%{PU8f?f06^*L{cLB?TFXM zr&_6^aKR>+YiHMgpUhC61F{@0I-R$;w|NIbh zrOdT0p56o0qr`R$^%lN~fcivjCjh`=wKQUZLmA}xz||yi$CB7{QR0ILIEa`lWhQ2? zoGJ=ID^1ufFpm}rbsO#=*SHUQ08AL43fZ!%Y8{~}3NaoGHMiwk!nJ)|5#pO3a13J# z&$6l-4skU#G@izZdFEf1HO9-TYCK2wzA+KN_je|xUYA?U@?20G+{P@=#T3xMA*0*& zE+^3MpAZF+YhtP>1ckf3dK?;?<+-2;alJ3@_sz9^FAxX>d~$Ig&a-}5Rfzlj#t9NZ zM`Sz!@^Z_|B9+Q(pDA=Y6Fdjc>}i}}3TWF2nUs1w7#d+@Z+DpXxGIY8m|`mzd)Ger ze4b2dT_j&!E{;PH;UfaR{pFdI`gt-j*ZljUO;9GKw)=uxhzG9VfY-+-y;v>Hb^wmz s$Ah8w@Bf?NYM;-w)PX=C5D46!FQ6!@1>zejmH+?%07*qoM6N<$f*^-6lmGw# diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/zombie/brute.png b/src/main/resources/assets/specialmobs/textures/entityNEW/zombie/brute.png deleted file mode 100644 index 05e9e3681353bc362d1817047d962358d944e5ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1w1^9%x+GXlmC+T|@n)+3nSp=!g&x^=x4@;jA)|ud2IVZJnYIOe87^^tF zsA>->DXF*L9vOKkUAVI+%=3(fh6cmDd1g_n1{y^S>(?`!Ib&tm>1MT5O);9GzMdgE znqkEXhM6-NGBUzT-HpAJ?d|Qev$K7CeER$QtIEq06BB_>aENMo2&A-1g8YL26AKuO zR(yy7>f$W$h%9Dc;5!Jyj5{V~zhz)xI_>G=7!u+BcIw-rTLuEIUmcfR>($K7)n-~a z!(rB^fBH8zZ)&(;=6vWp-}N5V>^<(~;gbS?Yb~An?0D#s*B@NxGMviD<+$#8{G+!O zqs~RPmU)V`t<2es5|f?O$w)O{JJ-LlCAR=#oyM?Q&gAs^=wdky6XL2&6xpAJzwYB zna9^ep4hcq$4_tBp^_O}kL{{H`S;$&NkQIvi7UHT2QI3-zU_16<7c16#L6}#wC3KQ z+;nA*?t?kk&I!h@c5r?^<=ikN(bwdIepJ##&~G=wic zVhox&jYo}t`gs@4OXXjfrwU&A>UuXIwEg?Thl(BRe?@%BZ;)xf`9}W$^RMDed!7k@ zBjvm8<}`(@uoKg)RMeY(I&o{%MV(-;*H^k5=jD0DPIo@B)4RXllc9avvH6T`OcKWp zrR}()SaoY3DV8uzzPE7gM_~sheuktVwQJwhF31-Puqz5Lcb0Biw)h-lA(IP(q2Be! zJNPssghTZH-f2DH-ydbW>&~jc_0d!NTSJ^}7?f5h_PsWBT=?GURLS*)!Vc~qrxbbI z61)0iZ4* zXg<+Pzj=ROZq#AJuhP%6|70`RPMN2XbaK|I;3EQ6VumS}_wJdmecECD+@ImnJcb~K zDZkX;1T!fJ`y?)7U(lN`WoO|gT)i+tQ ztk*Rt_U-XLm7kYxZY$K?YLNHX%=F)v<3(%p8l)XcnC~zwl77G@aF^jfW5WLbymi|} VW$kzSe*>m<22WQ%mvv4FO#t+c%F+M; diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/zombie/fire.png b/src/main/resources/assets/specialmobs/textures/entityNEW/zombie/fire.png deleted file mode 100644 index 136907eaa2cf64fec244629db9e0332edd3ffa1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2072 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 C$3;v4 diff --git a/src/main/resources/assets/specialmobs/textures/entityNEW/zombie/hungry.png b/src/main/resources/assets/specialmobs/textures/entityNEW/zombie/hungry.png deleted file mode 100644 index abcfcc7ba9f736bebe7c63dd26eab5b010ad6a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2113 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 LNkvXXu0mjfHIC`N diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/blaze/conflagration.png b/src/main/resources/assets/specialmobs/textures/entity_old/blaze/conflagration.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/blaze/conflagration.png rename to src/main/resources/assets/specialmobs/textures/entity_old/blaze/conflagration.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/blaze/ember.png b/src/main/resources/assets/specialmobs/textures/entity_old/blaze/ember.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/blaze/ember.png rename to src/main/resources/assets/specialmobs/textures/entity_old/blaze/ember.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/blaze/hellfire.png b/src/main/resources/assets/specialmobs/textures/entity_old/blaze/hellfire.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/blaze/hellfire.png rename to src/main/resources/assets/specialmobs/textures/entity_old/blaze/hellfire.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/blaze/inferno.png b/src/main/resources/assets/specialmobs/textures/entity_old/blaze/inferno.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/blaze/inferno.png rename to src/main/resources/assets/specialmobs/textures/entity_old/blaze/inferno.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/blaze/jolt.png b/src/main/resources/assets/specialmobs/textures/entity_old/blaze/jolt.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/blaze/jolt.png rename to src/main/resources/assets/specialmobs/textures/entity_old/blaze/jolt.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/blaze/wildfire.png b/src/main/resources/assets/specialmobs/textures/entity_old/blaze/wildfire.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/blaze/wildfire.png rename to src/main/resources/assets/specialmobs/textures/entity_old/blaze/wildfire.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/flying.png b/src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/flying.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/flying.png rename to src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/flying.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/flying_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/flying_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/flying_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/flying_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/mother.png b/src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/mother.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/mother.png rename to src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/mother.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/mother_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/mother_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/mother_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/mother_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/web.png b/src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/web.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/web.png rename to src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/web.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/web_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/web_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/web_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/web_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/witch.png b/src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/witch.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/witch.png rename to src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/witch.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/witch_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/witch_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/cave_spider/witch_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/cave_spider/witch_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/dark.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/dark.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/dark.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/dark.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/dark_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/dark_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/dark_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/dark_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/death.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/death.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/death.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/death.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/death_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/death_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/death_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/death_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/dirt.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/dirt.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/dirt.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/dirt.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/doom.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/doom.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/doom.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/doom.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/doom_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/doom_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/doom_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/doom_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/drowning.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/drowning.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/drowning.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/drowning.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/drowning_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/drowning_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/drowning_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/drowning_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/ender.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/ender.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/ender.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/ender.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/ender_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/ender_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/ender_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/ender_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/fire.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/fire.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/fire.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/fire.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/gravel.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/gravel.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/gravel.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/gravel.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/jumping.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/jumping.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/jumping.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/jumping.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/lightning.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/lightning.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/lightning.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/lightning.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/splitting.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/splitting.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/splitting.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/splitting.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/creeper/splitting_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/creeper/splitting_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/creeper/splitting_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/creeper/splitting_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/blinding.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/blinding.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/blinding.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/blinding.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/blinding_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/blinding_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/blinding_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/blinding_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/icy.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/icy.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/icy.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/icy.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/icy_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/icy_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/icy_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/icy_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/lightning.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/lightning.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/lightning.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/lightning.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/lightning_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/lightning_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/lightning_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/lightning_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/mirage.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/mirage.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/mirage.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/mirage.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/mirage_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/mirage_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/mirage_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/mirage_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/thief.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/thief.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/thief.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/thief.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/enderman/thief_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/enderman/thief_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/enderman/thief_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/enderman/thief_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/ghast/fighter.png b/src/main/resources/assets/specialmobs/textures/entity_old/ghast/fighter.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/ghast/fighter.png rename to src/main/resources/assets/specialmobs/textures/entity_old/ghast/fighter.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/ghast/fighter_shooting.png b/src/main/resources/assets/specialmobs/textures/entity_old/ghast/fighter_shooting.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/ghast/fighter_shooting.png rename to src/main/resources/assets/specialmobs/textures/entity_old/ghast/fighter_shooting.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/ghast/king.png b/src/main/resources/assets/specialmobs/textures/entity_old/ghast/king.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/ghast/king.png rename to src/main/resources/assets/specialmobs/textures/entity_old/ghast/king.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/ghast/king_shooting.png b/src/main/resources/assets/specialmobs/textures/entity_old/ghast/king_shooting.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/ghast/king_shooting.png rename to src/main/resources/assets/specialmobs/textures/entity_old/ghast/king_shooting.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/ghast/queen.png b/src/main/resources/assets/specialmobs/textures/entity_old/ghast/queen.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/ghast/queen.png rename to src/main/resources/assets/specialmobs/textures/entity_old/ghast/queen.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/ghast/queen_shooting.png b/src/main/resources/assets/specialmobs/textures/entity_old/ghast/queen_shooting.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/ghast/queen_shooting.png rename to src/main/resources/assets/specialmobs/textures/entity_old/ghast/queen_shooting.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/ghast/unholy.png b/src/main/resources/assets/specialmobs/textures/entity_old/ghast/unholy.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/ghast/unholy.png rename to src/main/resources/assets/specialmobs/textures/entity_old/ghast/unholy.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/ghast/unholy_shooting.png b/src/main/resources/assets/specialmobs/textures/entity_old/ghast/unholy_shooting.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/ghast/unholy_shooting.png rename to src/main/resources/assets/specialmobs/textures/entity_old/ghast/unholy_shooting.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/magma_cube/bouncing.png b/src/main/resources/assets/specialmobs/textures/entity_old/magma_cube/bouncing.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/magma_cube/bouncing.png rename to src/main/resources/assets/specialmobs/textures/entity_old/magma_cube/bouncing.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/magma_cube/hardened.png b/src/main/resources/assets/specialmobs/textures/entity_old/magma_cube/hardened.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/magma_cube/hardened.png rename to src/main/resources/assets/specialmobs/textures/entity_old/magma_cube/hardened.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/magma_cube/sticky.png b/src/main/resources/assets/specialmobs/textures/entity_old/magma_cube/sticky.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/magma_cube/sticky.png rename to src/main/resources/assets/specialmobs/textures/entity_old/magma_cube/sticky.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/magma_cube/volatile.png b/src/main/resources/assets/specialmobs/textures/entity_old/magma_cube/volatile.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/magma_cube/volatile.png rename to src/main/resources/assets/specialmobs/textures/entity_old/magma_cube/volatile.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/blinding.png b/src/main/resources/assets/specialmobs/textures/entity_old/silverfish/blinding.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/blinding.png rename to src/main/resources/assets/specialmobs/textures/entity_old/silverfish/blinding.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/fishing.png b/src/main/resources/assets/specialmobs/textures/entity_old/silverfish/fishing.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/fishing.png rename to src/main/resources/assets/specialmobs/textures/entity_old/silverfish/fishing.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/flying.png b/src/main/resources/assets/specialmobs/textures/entity_old/silverfish/flying.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/flying.png rename to src/main/resources/assets/specialmobs/textures/entity_old/silverfish/flying.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/poison.png b/src/main/resources/assets/specialmobs/textures/entity_old/silverfish/poison.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/poison.png rename to src/main/resources/assets/specialmobs/textures/entity_old/silverfish/poison.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/tough.png b/src/main/resources/assets/specialmobs/textures/entity_old/silverfish/tough.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/silverfish/tough.png rename to src/main/resources/assets/specialmobs/textures/entity_old/silverfish/tough.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/brute.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/brute.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/brute.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/brute.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/brute_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/brute_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/brute_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/brute_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/fire.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/fire.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/fire.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/fire.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/gatling_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/gatling_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/gatling_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/gatling_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/ninja_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/ninja_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/ninja_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/ninja_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/poison.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/poison.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/poison.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/poison.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/poison_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/poison_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/poison_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/poison_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/sniper.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/sniper.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/sniper.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/sniper.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/sniper_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/skeleton/sniper_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/skeleton/sniper_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/skeleton/sniper_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/slime/blackberry.png b/src/main/resources/assets/specialmobs/textures/entity_old/slime/blackberry.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/slime/blackberry.png rename to src/main/resources/assets/specialmobs/textures/entity_old/slime/blackberry.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/slime/blueberry.png b/src/main/resources/assets/specialmobs/textures/entity_old/slime/blueberry.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/slime/blueberry.png rename to src/main/resources/assets/specialmobs/textures/entity_old/slime/blueberry.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/slime/caramel.png b/src/main/resources/assets/specialmobs/textures/entity_old/slime/caramel.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/slime/caramel.png rename to src/main/resources/assets/specialmobs/textures/entity_old/slime/caramel.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/slime/grape.png b/src/main/resources/assets/specialmobs/textures/entity_old/slime/grape.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/slime/grape.png rename to src/main/resources/assets/specialmobs/textures/entity_old/slime/grape.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/slime/lemon.png b/src/main/resources/assets/specialmobs/textures/entity_old/slime/lemon.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/slime/lemon.png rename to src/main/resources/assets/specialmobs/textures/entity_old/slime/lemon.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/slime/strawberry.png b/src/main/resources/assets/specialmobs/textures/entity_old/slime/strawberry.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/slime/strawberry.png rename to src/main/resources/assets/specialmobs/textures/entity_old/slime/strawberry.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/slime/watermelon.png b/src/main/resources/assets/specialmobs/textures/entity_old/slime/watermelon.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/slime/watermelon.png rename to src/main/resources/assets/specialmobs/textures/entity_old/slime/watermelon.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/desert.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/desert.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/desert.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/desert.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/desert_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/desert_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/desert_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/desert_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/flying.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/flying.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/flying.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/flying.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/flying_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/flying_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/flying_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/flying_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/hungry.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/hungry.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/hungry.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/hungry.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/hungry_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/hungry_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/hungry_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/hungry_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/mother.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/mother.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/mother.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/mother.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/mother_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/mother_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/mother_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/mother_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/pale.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/pale.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/pale.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/pale.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/pale_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/pale_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/pale_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/pale_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/web.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/web.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/web.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/web.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/web_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/web_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/web_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/web_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/witch.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/witch.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/witch.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/witch.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/spider/witch_eyes.png b/src/main/resources/assets/specialmobs/textures/entity_old/spider/witch_eyes.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/spider/witch_eyes.png rename to src/main/resources/assets/specialmobs/textures/entity_old/spider/witch_eyes.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/witch/domination.png b/src/main/resources/assets/specialmobs/textures/entity_old/witch/domination.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/witch/domination.png rename to src/main/resources/assets/specialmobs/textures/entity_old/witch/domination.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/witch/shadows.png b/src/main/resources/assets/specialmobs/textures/entity_old/witch/shadows.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/witch/shadows.png rename to src/main/resources/assets/specialmobs/textures/entity_old/witch/shadows.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/witch/undead.png b/src/main/resources/assets/specialmobs/textures/entity_old/witch/undead.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/witch/undead.png rename to src/main/resources/assets/specialmobs/textures/entity_old/witch/undead.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/witch/wilds.png b/src/main/resources/assets/specialmobs/textures/entity_old/witch/wilds.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/witch/wilds.png rename to src/main/resources/assets/specialmobs/textures/entity_old/witch/wilds.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/witch/wind.png b/src/main/resources/assets/specialmobs/textures/entity_old/witch/wind.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/witch/wind.png rename to src/main/resources/assets/specialmobs/textures/entity_old/witch/wind.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/brute.png b/src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/brute.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/brute.png rename to src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/brute.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/brute_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/brute_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/brute_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/brute_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/fire.png b/src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/fire.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/fire.png rename to src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/fire.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/gatling_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/gatling_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/gatling_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/gatling_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/ninja_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/ninja_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/ninja_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/ninja_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/sniper.png b/src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/sniper.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/sniper.png rename to src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/sniper.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/sniper_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/sniper_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/wither_skeleton/sniper_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/wither_skeleton/sniper_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombie/brute.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombie/brute.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombie/brute.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombie/brute.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombie/brute_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombie/brute_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombie/brute_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombie/brute_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombie/fire.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombie/fire.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombie/fire.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombie/fire.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombie/hungry.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombie/hungry.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombie/hungry.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombie/hungry.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombie/husk.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombie/husk.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombie/husk.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombie/husk.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombie/plague.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombie/plague.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombie/plague.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombie/plague.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/brute.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/brute.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/brute.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/brute.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/brute_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/brute_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/brute_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/brute_overlay.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/hungry.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/hungry.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/hungry.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/hungry.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/plague.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/plague.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/plague.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/plague.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/vampire.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/vampire.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/vampire.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/vampire.png diff --git a/src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/vampire_overlay.png b/src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/vampire_overlay.png similarity index 100% rename from src/main/resources/assets/specialmobs/textures/entityOLD/zombified_piglin/vampire_overlay.png rename to src/main/resources/assets/specialmobs/textures/entity_old/zombified_piglin/vampire_overlay.png diff --git a/src/main/resources/changelog.txt b/src/main/resources/changelog.txt index 129efa9..898f3ce 100644 --- a/src/main/resources/changelog.txt +++ b/src/main/resources/changelog.txt @@ -6,7 +6,7 @@ - Fixed issue preventing all attribute modifications during mob replacement. Fixes the superspeed ghasts. - Life loss and life steal effects can no longer reduce life below 1 (half a heart). Prevents inventory loss bug. - Witches of the Wilds now spawn 3 baby spiders with their summon spell by default instead of 0. - - No longer copies UUID when replcing mobs. Might mess up some things, but also should prevent odd glitches. + - No longer copies UUID when replacing mobs. Might mess up some things, but also should prevent odd glitches. 1.0.2 - Fixed server crash caused by mirage enderman teleport. 1.0.1 From ca6cc063fa735ebca0c4151c0edae0dbfbd3b2d6 Mon Sep 17 00:00:00 2001 From: FatherToast Date: Thu, 25 Aug 2022 11:33:54 -0500 Subject: [PATCH 05/10] le config --- .../species/CorporealGhastSpeciesConfig.java | 38 +++++++++++++++++++ .../ghast/CorporealShiftGhastEntity.java | 23 ++++++++--- 2 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 src/main/java/fathertoast/specialmobs/common/config/species/CorporealGhastSpeciesConfig.java diff --git a/src/main/java/fathertoast/specialmobs/common/config/species/CorporealGhastSpeciesConfig.java b/src/main/java/fathertoast/specialmobs/common/config/species/CorporealGhastSpeciesConfig.java new file mode 100644 index 0000000..e02d419 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/config/species/CorporealGhastSpeciesConfig.java @@ -0,0 +1,38 @@ +package fathertoast.specialmobs.common.config.species; + +import fathertoast.specialmobs.common.bestiary.MobFamily; +import fathertoast.specialmobs.common.config.Config; +import fathertoast.specialmobs.common.config.field.IntField; +import fathertoast.specialmobs.common.config.file.ToastConfigSpec; +import fathertoast.specialmobs.common.config.util.ConfigUtil; + +public class CorporealGhastSpeciesConfig extends SpeciesConfig { + + public final CorporealShift CORPOREAL_SHIFT; + + /** Builds the config spec that should be used for this config. */ + public CorporealGhastSpeciesConfig( MobFamily.Species species, int corporealTime, int incorporealTime ) { + super( species ); + + CORPOREAL_SHIFT = new CorporealShift( SPEC, species, species.getConfigName(), corporealTime, incorporealTime ); + } + + public static class CorporealShift extends Config.AbstractCategory { + + public final IntField corporealTicks; + public final IntField incorporealTicks; + + CorporealShift( ToastConfigSpec parent, MobFamily.Species species, String speciesName, + int corporealTime, int incorporealTime ) { + super( parent, ConfigUtil.camelCaseToLowerUnderscore( species.specialVariantName ), + "Options specific to " + speciesName + "." ); + + corporealTicks = SPEC.define( new IntField( "ticks.corporeal", corporealTime, IntField.Range.NON_NEGATIVE, + "The number of ticks " + speciesName + " stay in 'corporeal' mode before shifting (20 ticks = 1 second).", + "In corporeal mode, " + speciesName + " can be damaged and shoot like normal " + species.family.configName + "." ) ); + incorporealTicks = SPEC.define( new IntField( "ticks.incorporeal", incorporealTime, IntField.Range.NON_NEGATIVE, + "The number of ticks " + speciesName + " stay in 'incorporeal' mode before shifting (20 ticks = 1 second).", + "In incorporeal mode, " + speciesName + " are immune to damage and shoot unique fireballs that punish movement." ) ); + } + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/entity/ghast/CorporealShiftGhastEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/ghast/CorporealShiftGhastEntity.java index ef00d75..4456893 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/ghast/CorporealShiftGhastEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/ghast/CorporealShiftGhastEntity.java @@ -3,6 +3,8 @@ package fathertoast.specialmobs.common.entity.ghast; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; +import fathertoast.specialmobs.common.config.species.CorporealGhastSpeciesConfig; +import fathertoast.specialmobs.common.config.species.SpeciesConfig; import fathertoast.specialmobs.common.core.register.SMItems; import fathertoast.specialmobs.common.entity.projectile.IncorporealFireballEntity; import fathertoast.specialmobs.common.util.References; @@ -39,6 +41,14 @@ public class CorporealShiftGhastEntity extends _SpecialGhastEntity { .multiplyAttribute( Attributes.MOVEMENT_SPEED, 0.8 ); } + @SpecialMob.ConfigSupplier + public static SpeciesConfig createConfig( MobFamily.Species species ) { + return new CorporealGhastSpeciesConfig( species, 300, 200 ); + } + + /** @return This entity's species config. */ + public CorporealGhastSpeciesConfig getConfig() { return (CorporealGhastSpeciesConfig) getSpecies().config; } + @SpecialMob.LanguageProvider public static String[] getTranslations( String langKey ) { return References.translations( langKey, "Corporeal Shift Ghast", @@ -64,8 +74,7 @@ public class CorporealShiftGhastEntity extends _SpecialGhastEntity { public static final DataParameter CORPOREAL = EntityDataManager.defineId( CorporealShiftGhastEntity.class, DataSerializers.BOOLEAN ); - private final int maxShiftTime = 150; - private int shiftTime = maxShiftTime; + private int shiftTime; public CorporealShiftGhastEntity( EntityType entityType, World world ) { super( entityType, world ); } @@ -73,7 +82,7 @@ public class CorporealShiftGhastEntity extends _SpecialGhastEntity { protected void defineSynchedData() { super.defineSynchedData(); entityData.define( CORPOREAL, false ); - if( !level.isClientSide() && random.nextBoolean() ) setCorporeal( true ); + if( !level.isClientSide() ) setCorporeal( random.nextBoolean() ); } @Override @@ -81,8 +90,7 @@ public class CorporealShiftGhastEntity extends _SpecialGhastEntity { super.tick(); if( --shiftTime <= 0 ) { - if( !level.isClientSide ) { - shiftTime = maxShiftTime + random.nextInt( maxShiftTime ); + if( !level.isClientSide() ) { setCorporeal( !isCorporeal() ); spawnShiftSmoke( (ServerWorld) level ); } @@ -106,7 +114,10 @@ public class CorporealShiftGhastEntity extends _SpecialGhastEntity { public boolean isCorporeal() { return entityData.get( CORPOREAL ); } - private void setCorporeal( boolean value ) { entityData.set( CORPOREAL, value ); } + private void setCorporeal( boolean value ) { + entityData.set( CORPOREAL, value ); + shiftTime = value ? getConfig().CORPOREAL_SHIFT.corporealTicks.get() : getConfig().CORPOREAL_SHIFT.incorporealTicks.get(); + } /** Called to attack the target with a ranged attack. */ @Override From b5b57b050605d37d8f6de21ee82203b5971e8a48 Mon Sep 17 00:00:00 2001 From: FatherToast Date: Thu, 25 Aug 2022 11:34:51 -0500 Subject: [PATCH 06/10] le config, but named right --- ...iesConfig.java => CorporealShiftGhastSpeciesConfig.java} | 4 ++-- .../common/entity/ghast/CorporealShiftGhastEntity.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/fathertoast/specialmobs/common/config/species/{CorporealGhastSpeciesConfig.java => CorporealShiftGhastSpeciesConfig.java} (91%) diff --git a/src/main/java/fathertoast/specialmobs/common/config/species/CorporealGhastSpeciesConfig.java b/src/main/java/fathertoast/specialmobs/common/config/species/CorporealShiftGhastSpeciesConfig.java similarity index 91% rename from src/main/java/fathertoast/specialmobs/common/config/species/CorporealGhastSpeciesConfig.java rename to src/main/java/fathertoast/specialmobs/common/config/species/CorporealShiftGhastSpeciesConfig.java index e02d419..dcb3dce 100644 --- a/src/main/java/fathertoast/specialmobs/common/config/species/CorporealGhastSpeciesConfig.java +++ b/src/main/java/fathertoast/specialmobs/common/config/species/CorporealShiftGhastSpeciesConfig.java @@ -6,12 +6,12 @@ import fathertoast.specialmobs.common.config.field.IntField; import fathertoast.specialmobs.common.config.file.ToastConfigSpec; import fathertoast.specialmobs.common.config.util.ConfigUtil; -public class CorporealGhastSpeciesConfig extends SpeciesConfig { +public class CorporealShiftGhastSpeciesConfig extends SpeciesConfig { public final CorporealShift CORPOREAL_SHIFT; /** Builds the config spec that should be used for this config. */ - public CorporealGhastSpeciesConfig( MobFamily.Species species, int corporealTime, int incorporealTime ) { + public CorporealShiftGhastSpeciesConfig( MobFamily.Species species, int corporealTime, int incorporealTime ) { super( species ); CORPOREAL_SHIFT = new CorporealShift( SPEC, species, species.getConfigName(), corporealTime, incorporealTime ); diff --git a/src/main/java/fathertoast/specialmobs/common/entity/ghast/CorporealShiftGhastEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/ghast/CorporealShiftGhastEntity.java index 4456893..b3275c1 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/ghast/CorporealShiftGhastEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/ghast/CorporealShiftGhastEntity.java @@ -3,7 +3,7 @@ package fathertoast.specialmobs.common.entity.ghast; import fathertoast.specialmobs.common.bestiary.BestiaryInfo; import fathertoast.specialmobs.common.bestiary.MobFamily; import fathertoast.specialmobs.common.bestiary.SpecialMob; -import fathertoast.specialmobs.common.config.species.CorporealGhastSpeciesConfig; +import fathertoast.specialmobs.common.config.species.CorporealShiftGhastSpeciesConfig; import fathertoast.specialmobs.common.config.species.SpeciesConfig; import fathertoast.specialmobs.common.core.register.SMItems; import fathertoast.specialmobs.common.entity.projectile.IncorporealFireballEntity; @@ -43,11 +43,11 @@ public class CorporealShiftGhastEntity extends _SpecialGhastEntity { @SpecialMob.ConfigSupplier public static SpeciesConfig createConfig( MobFamily.Species species ) { - return new CorporealGhastSpeciesConfig( species, 300, 200 ); + return new CorporealShiftGhastSpeciesConfig( species, 300, 200 ); } /** @return This entity's species config. */ - public CorporealGhastSpeciesConfig getConfig() { return (CorporealGhastSpeciesConfig) getSpecies().config; } + public CorporealShiftGhastSpeciesConfig getConfig() { return (CorporealShiftGhastSpeciesConfig) getSpecies().config; } @SpecialMob.LanguageProvider public static String[] getTranslations( String langKey ) { From ae4260fb0786eb5ae9836dced006edfbf04d009f Mon Sep 17 00:00:00 2001 From: FatherToast Date: Thu, 25 Aug 2022 13:20:50 -0500 Subject: [PATCH 07/10] Incorporeal fireball now handled on server --- .../item/IncorporealFireChargeItem.java | 62 +++++++++++++------ .../common/network/NetworkHelper.java | 15 ++--- .../common/network/PacketHandler.java | 3 +- .../message/C2SSpawnIncorporealFireball.java | 60 ++++++++---------- .../common/network/work/ServerWork.java | 55 +++++++--------- .../specialmobs/common/util/EntityUtil.java | 31 ---------- 6 files changed, 96 insertions(+), 130 deletions(-) delete mode 100644 src/main/java/fathertoast/specialmobs/common/util/EntityUtil.java diff --git a/src/main/java/fathertoast/specialmobs/common/item/IncorporealFireChargeItem.java b/src/main/java/fathertoast/specialmobs/common/item/IncorporealFireChargeItem.java index 20b5ac2..d45b90b 100644 --- a/src/main/java/fathertoast/specialmobs/common/item/IncorporealFireChargeItem.java +++ b/src/main/java/fathertoast/specialmobs/common/item/IncorporealFireChargeItem.java @@ -1,45 +1,69 @@ package fathertoast.specialmobs.common.item; import fathertoast.specialmobs.common.bestiary.SpecialMob; -import fathertoast.specialmobs.common.network.NetworkHelper; -import fathertoast.specialmobs.common.util.EntityUtil; +import fathertoast.specialmobs.common.entity.projectile.IncorporealFireballEntity; import fathertoast.specialmobs.common.util.References; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.ProjectileHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; -import net.minecraft.item.Rarity; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.EntityRayTraceResult; +import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.World; +import javax.annotation.Nullable; + public class IncorporealFireChargeItem extends Item { - - public IncorporealFireChargeItem() { - super(new Item.Properties().stacksTo(1).tab(ItemGroup.TAB_MISC).rarity(Rarity.UNCOMMON)); - } - + @SpecialMob.LanguageProvider public static String[] getTranslations( String langKey ) { return References.translations( langKey, "Incorporeal Fire Charge", "", "", "", "", "", "" );//TODO } - + + public IncorporealFireChargeItem() { super( new Item.Properties().tab( ItemGroup.TAB_MISC ) ); } + @Override - public ActionResult use(World world, PlayerEntity player, Hand hand) { - if (world.isClientSide) { - Entity entity = EntityUtil.getClientPickEntity(player, 340.0D); - - if (entity instanceof LivingEntity) { - NetworkHelper.spawnIncorporealFireball(player, (LivingEntity) entity); - world.playSound(player, player.blockPosition(), SoundEvents.FIRECHARGE_USE, SoundCategory.BLOCKS, 1.0F, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F); - return ActionResult.consume(player.getItemInHand(hand)); + public ActionResult use( World world, PlayerEntity player, Hand hand ) { + final ItemStack item = player.getItemInHand( hand ); + if( player.getCooldowns().isOnCooldown( item.getItem() ) ) return ActionResult.pass( item ); + + final Entity target = pickEntity( player, 127.0 ); + if( target instanceof LivingEntity ) { + if( !world.isClientSide() ) { + world.addFreshEntity( new IncorporealFireballEntity( world, player, (LivingEntity) target, + player.getX(), player.getEyeY(), player.getZ() ) ); + world.playSound( null, player.blockPosition(), SoundEvents.FIRECHARGE_USE, SoundCategory.BLOCKS, 1.0F, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F ); + + if( !player.abilities.instabuild ) { + item.shrink( 1 ); + } + player.getCooldowns().addCooldown( item.getItem(), 10 ); + return ActionResult.consume( item ); } + return ActionResult.pass( item ); } - return ActionResult.pass(player.getItemInHand(hand)); + + return ActionResult.fail( item ); } -} + + @Nullable + private static Entity pickEntity( PlayerEntity player, double range ) { + final Vector3d eyePos = player.getEyePosition( 1.0F ); + final Vector3d viewVec = player.getViewVector( 1.0F ).scale( range ); + + final AxisAlignedBB bb = player.getBoundingBox().expandTowards( viewVec ).inflate( 1.0 ); + final EntityRayTraceResult result = ProjectileHelper.getEntityHitResult( player.level, player, eyePos, eyePos.add( viewVec ), bb, + ( entity ) -> !entity.isSpectator() && entity.isAlive() && entity.isPickable() && !player.isPassengerOfSameVehicle( entity ) ); + + return result == null ? null : result.getEntity(); + } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/network/NetworkHelper.java b/src/main/java/fathertoast/specialmobs/common/network/NetworkHelper.java index 9c3dfcd..07ac081 100644 --- a/src/main/java/fathertoast/specialmobs/common/network/NetworkHelper.java +++ b/src/main/java/fathertoast/specialmobs/common/network/NetworkHelper.java @@ -1,14 +1,7 @@ package fathertoast.specialmobs.common.network; -import fathertoast.specialmobs.common.network.message.C2SSpawnIncorporealFireball; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; - -import javax.annotation.Nonnull; - public class NetworkHelper { - - public static void spawnIncorporealFireball(@Nonnull PlayerEntity player, @Nonnull LivingEntity livingEntity) { - PacketHandler.CHANNEL.sendToServer(new C2SSpawnIncorporealFireball(player.getUUID(), livingEntity.getId())); - } -} + // public static void spawnIncorporealFireball( @Nonnull PlayerEntity player, @Nonnull LivingEntity livingEntity ) { + // PacketHandler.CHANNEL.sendToServer( new C2SSpawnIncorporealFireball( player.getUUID(), livingEntity.getId() ) ); + // } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/network/PacketHandler.java b/src/main/java/fathertoast/specialmobs/common/network/PacketHandler.java index 69c02db..ca2f705 100644 --- a/src/main/java/fathertoast/specialmobs/common/network/PacketHandler.java +++ b/src/main/java/fathertoast/specialmobs/common/network/PacketHandler.java @@ -1,7 +1,6 @@ package fathertoast.specialmobs.common.network; import fathertoast.specialmobs.common.core.SpecialMobs; -import fathertoast.specialmobs.common.network.message.C2SSpawnIncorporealFireball; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; @@ -33,7 +32,7 @@ public class PacketHandler { } public final void registerMessages() { - registerMessage( C2SSpawnIncorporealFireball.class, C2SSpawnIncorporealFireball::encode, C2SSpawnIncorporealFireball::decode, C2SSpawnIncorporealFireball::handle ); + //registerMessage( C2SSpawnIncorporealFireball.class, C2SSpawnIncorporealFireball::encode, C2SSpawnIncorporealFireball::decode, C2SSpawnIncorporealFireball::handle ); } public void registerMessage( Class messageType, BiConsumer encoder, Function decoder, BiConsumer> handler ) { diff --git a/src/main/java/fathertoast/specialmobs/common/network/message/C2SSpawnIncorporealFireball.java b/src/main/java/fathertoast/specialmobs/common/network/message/C2SSpawnIncorporealFireball.java index c4046a3..7fa95ab 100644 --- a/src/main/java/fathertoast/specialmobs/common/network/message/C2SSpawnIncorporealFireball.java +++ b/src/main/java/fathertoast/specialmobs/common/network/message/C2SSpawnIncorporealFireball.java @@ -1,37 +1,29 @@ package fathertoast.specialmobs.common.network.message; -import fathertoast.specialmobs.common.network.work.ServerWork; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fml.network.NetworkEvent; - -import java.util.UUID; -import java.util.function.Supplier; - public class C2SSpawnIncorporealFireball { - - public final UUID playerUUID; - public final int targetEntityID; - - public C2SSpawnIncorporealFireball(UUID playerUUID, int targetEntityId) { - this.playerUUID = playerUUID; - this.targetEntityID = targetEntityId; - } - - public static void handle(C2SSpawnIncorporealFireball message, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - - if (context.getDirection().getReceptionSide().isServer()) { - context.enqueueWork(() -> ServerWork.handleSpawnIncorporealFireball(message)); - } - context.setPacketHandled(true); - } - - public static C2SSpawnIncorporealFireball decode(PacketBuffer buffer) { - return new C2SSpawnIncorporealFireball(buffer.readUUID(), buffer.readInt()); - } - - public static void encode(C2SSpawnIncorporealFireball message, PacketBuffer buffer) { - buffer.writeUUID(message.playerUUID); - buffer.writeInt(message.targetEntityID); - } -} + // public final UUID playerUUID; + // public final int targetEntityID; + // + // public C2SSpawnIncorporealFireball(UUID playerUUID, int targetEntityId) { + // this.playerUUID = playerUUID; + // this.targetEntityID = targetEntityId; + // } + // + // public static void handle(C2SSpawnIncorporealFireball message, Supplier contextSupplier) { + // NetworkEvent.Context context = contextSupplier.get(); + // + // if (context.getDirection().getReceptionSide().isServer()) { + // context.enqueueWork(() -> ServerWork.handleSpawnIncorporealFireball(message)); + // } + // context.setPacketHandled(true); + // } + // + // public static C2SSpawnIncorporealFireball decode(PacketBuffer buffer) { + // return new C2SSpawnIncorporealFireball(buffer.readUUID(), buffer.readInt()); + // } + // + // public static void encode(C2SSpawnIncorporealFireball message, PacketBuffer buffer) { + // buffer.writeUUID(message.playerUUID); + // buffer.writeInt(message.targetEntityID); + // } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/network/work/ServerWork.java b/src/main/java/fathertoast/specialmobs/common/network/work/ServerWork.java index cca5778..a3cfaf0 100644 --- a/src/main/java/fathertoast/specialmobs/common/network/work/ServerWork.java +++ b/src/main/java/fathertoast/specialmobs/common/network/work/ServerWork.java @@ -1,36 +1,25 @@ package fathertoast.specialmobs.common.network.work; -import fathertoast.specialmobs.common.entity.projectile.IncorporealFireballEntity; -import fathertoast.specialmobs.common.network.message.C2SSpawnIncorporealFireball; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.server.ServerWorld; -import net.minecraftforge.fml.LogicalSide; -import net.minecraftforge.fml.LogicalSidedProvider; - public class ServerWork { - - public static void handleSpawnIncorporealFireball(C2SSpawnIncorporealFireball message) { - MinecraftServer server = LogicalSidedProvider.INSTANCE.get(LogicalSide.SERVER); - - if (server == null) - return; - - ServerPlayerEntity player = server.getPlayerList().getPlayer(message.playerUUID); - - if (player == null) - return; - - ServerWorld world = (ServerWorld) player.level; - Entity entity = world.getEntity(message.targetEntityID); - - if (!(entity instanceof LivingEntity)) - return; - - LivingEntity livingEntity = (LivingEntity) entity; - IncorporealFireballEntity fireballEntity = new IncorporealFireballEntity(world, player, livingEntity, player.getX(), player.getEyeY(), player.getZ()); - world.addFreshEntity(fireballEntity); - } - } + // public static void handleSpawnIncorporealFireball(C2SSpawnIncorporealFireball message) { + // MinecraftServer server = LogicalSidedProvider.INSTANCE.get(LogicalSide.SERVER); + // + // if (server == null) + // return; + // + // ServerPlayerEntity player = server.getPlayerList().getPlayer(message.playerUUID); + // + // if (player == null) + // return; + // + // ServerWorld world = (ServerWorld) player.level; + // Entity entity = world.getEntity(message.targetEntityID); + // + // if (!(entity instanceof LivingEntity)) + // return; + // + // LivingEntity livingEntity = (LivingEntity) entity; + // IncorporealFireballEntity fireballEntity = new IncorporealFireballEntity(world, player, livingEntity, player.getX(), player.getEyeY(), player.getZ()); + // world.addFreshEntity(fireballEntity); + // } +} \ No newline at end of file diff --git a/src/main/java/fathertoast/specialmobs/common/util/EntityUtil.java b/src/main/java/fathertoast/specialmobs/common/util/EntityUtil.java deleted file mode 100644 index 621de83..0000000 --- a/src/main/java/fathertoast/specialmobs/common/util/EntityUtil.java +++ /dev/null @@ -1,31 +0,0 @@ -package fathertoast.specialmobs.common.util; - -import fathertoast.specialmobs.common.core.SpecialMobs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.ProjectileHelper; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.EntityRayTraceResult; -import net.minecraft.util.math.vector.Vector3d; - -import javax.annotation.Nullable; - -public class EntityUtil { - - @Nullable - public static Entity getClientPickEntity( PlayerEntity player, double pickRange ) { - if( !player.level.isClientSide ) { - SpecialMobs.LOG.error( "Tried to fetch player \"mouse-over\" entity from server side. This can't be right?" ); - return null; - } - Vector3d eyePos = player.getEyePosition( 1.0F ); - Vector3d viewVec = player.getViewVector( 1.0F ); - Vector3d targetVec = eyePos.add( viewVec.x * pickRange, viewVec.y * pickRange, viewVec.z * pickRange ); - - AxisAlignedBB AABB = player.getBoundingBox().expandTowards( viewVec.scale( pickRange ) ).inflate( 1.0D, 1.0D, 1.0D ); - EntityRayTraceResult result = ProjectileHelper.getEntityHitResult( player, eyePos, targetVec, AABB, - ( entity ) -> !entity.isSpectator() && entity.isPickable(), pickRange ); - - return result != null ? result.getEntity() : null; - } -} \ No newline at end of file From 02a6efc0075a535121150caa97bce3ae898d321f Mon Sep 17 00:00:00 2001 From: FatherToast Date: Thu, 25 Aug 2022 15:08:33 -0500 Subject: [PATCH 08/10] nothing --- .../fathertoast/specialmobs/common/bestiary/MobFamily.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java index 23e26ac..be5c9bf 100644 --- a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java +++ b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java @@ -98,8 +98,8 @@ public class MobFamily { public static final MobFamily WITCH = new MobFamily<>( WitchFamilyConfig::new, "Witch", "witches", 0x340000, new EntityType[] { EntityType.WITCH }, - "Domination", /*"Ice",*/ "Shadows", "Undead", "Wilds", "Wind" - );//TODO ice (slowness 2, ice wall), fire-theme (fireball instead of poison), desert-theme (plague potion), water-theme? (water "potion") + /*"Burned",*/ "Domination", /*"Drowned", "Ice", "Sands",*/ "Shadows", "Undead", "Wilds", "Wind" + );//TODO burned, drowned, ice, sands public static final MobFamily GHAST = new MobFamily<>( GhastFamilyConfig::new, "Ghast", "ghasts", 0xF9F9F9, new EntityType[] { EntityType.GHAST }, From dd0b90bad99f6428ea051ec4630989cc6d633945 Mon Sep 17 00:00:00 2001 From: FatherToast Date: Thu, 25 Aug 2022 15:10:17 -0500 Subject: [PATCH 09/10] typo tyme --- .../specialmobs/client/ClientRegister.java | 2 +- .../common/core/register/SMEntities.java | 2 +- .../projectile/IncorporealFireballEntity.java | 28 +++++++++---------- .../datagen/SMLanguageProvider.java | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/fathertoast/specialmobs/client/ClientRegister.java b/src/main/java/fathertoast/specialmobs/client/ClientRegister.java index 79cee7e..e37e710 100644 --- a/src/main/java/fathertoast/specialmobs/client/ClientRegister.java +++ b/src/main/java/fathertoast/specialmobs/client/ClientRegister.java @@ -91,7 +91,7 @@ public class ClientRegister { // Other registerRenderer( SMEntities.BONE_SHRAPNEL, BoneShrapnelRenderer::new ); registerRenderer( SMEntities.BUG_SPIT, BugSpitRenderer::new ); - registerSpriteRenderer( SMEntities.CORPOREAL_FIREBALL, game, 3.0F, true ); + registerSpriteRenderer( SMEntities.INCORPOREAL_FIREBALL, game, 3.0F, true ); registerRenderer( SMEntities.FISHING_BOBBER, SpecialFishingBobberRenderer::new ); } diff --git a/src/main/java/fathertoast/specialmobs/common/core/register/SMEntities.java b/src/main/java/fathertoast/specialmobs/common/core/register/SMEntities.java index 2a34d7f..1991c9a 100644 --- a/src/main/java/fathertoast/specialmobs/common/core/register/SMEntities.java +++ b/src/main/java/fathertoast/specialmobs/common/core/register/SMEntities.java @@ -29,7 +29,7 @@ public class SMEntities { EntityType.Builder.of( BugSpitEntity::new, EntityClassification.MISC ) .sized( 0.25F, 0.25F ).clientTrackingRange( 4 ).updateInterval( 10 ) ); - public static final RegistryObject> CORPOREAL_FIREBALL = register( "incorporeal_fireball", + public static final RegistryObject> INCORPOREAL_FIREBALL = register( "incorporeal_fireball", EntityType.Builder.of( IncorporealFireballEntity::new, EntityClassification.MISC ) .sized( 1.0F, 1.0F ).clientTrackingRange( 4 ).updateInterval( 3 ) ); diff --git a/src/main/java/fathertoast/specialmobs/common/entity/projectile/IncorporealFireballEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/projectile/IncorporealFireballEntity.java index 4175588..9c31d96 100644 --- a/src/main/java/fathertoast/specialmobs/common/entity/projectile/IncorporealFireballEntity.java +++ b/src/main/java/fathertoast/specialmobs/common/entity/projectile/IncorporealFireballEntity.java @@ -29,7 +29,7 @@ import net.minecraftforge.fml.network.NetworkHooks; import javax.annotation.Nullable; public class IncorporealFireballEntity extends AbstractFireballEntity { - + public int explosionPower = 1; private boolean shouldExplode = false; @@ -37,17 +37,17 @@ public class IncorporealFireballEntity extends AbstractFireballEntity { private LivingEntity target; - public IncorporealFireballEntity(EntityType entityType, World world ) { + public IncorporealFireballEntity( EntityType entityType, World world ) { super( entityType, world ); } - public IncorporealFireballEntity(World world, CorporealShiftGhastEntity ghast, double x, double y, double z ) { - super( SMEntities.CORPOREAL_FIREBALL.get(), ghast, x, y, z, world ); + public IncorporealFireballEntity( World world, CorporealShiftGhastEntity ghast, double x, double y, double z ) { + super( SMEntities.INCORPOREAL_FIREBALL.get(), ghast, x, y, z, world ); target = ghast.getTarget(); } - public IncorporealFireballEntity(World world, @Nullable PlayerEntity owner, LivingEntity target, double x, double y, double z ) { - super( SMEntities.CORPOREAL_FIREBALL.get(), owner, x, y, z, world ); + public IncorporealFireballEntity( World world, @Nullable PlayerEntity owner, LivingEntity target, double x, double y, double z ) { + super( SMEntities.INCORPOREAL_FIREBALL.get(), owner, x, y, z, world ); this.target = target; } @@ -103,21 +103,21 @@ public class IncorporealFireballEntity extends AbstractFireballEntity { if( !this.level.isClientSide ) { Entity target = traceResult.getEntity(); - + boolean fizzle; - - if ( target instanceof PlayerEntity ) { + + if( target instanceof PlayerEntity ) { // TODO - Implement player-specific checks fizzle = true; } else { - if (target.getX() != target.xo || target.getY() != target.yo || target.getZ() != target.zo) { + if( target.getX() != target.xo || target.getY() != target.yo || target.getZ() != target.zo ) { explode(); return; } fizzle = true; } - if (fizzle) { + if( fizzle ) { playSound( SoundEvents.FIRE_EXTINGUISH, 1.0F, 1.0F ); remove(); } @@ -132,10 +132,10 @@ public class IncorporealFireballEntity extends AbstractFireballEntity { shouldExplode = true; return true; } - - @OnlyIn(Dist.CLIENT) + + @OnlyIn( Dist.CLIENT ) public ItemStack getItem() { - return new ItemStack(SMItems.INCORPOREAL_FIREBALL.get()); + return new ItemStack( SMItems.INCORPOREAL_FIREBALL.get() ); } @Override diff --git a/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java b/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java index 125555f..941b4bf 100644 --- a/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java +++ b/src/main/java/fathertoast/specialmobs/datagen/SMLanguageProvider.java @@ -69,7 +69,7 @@ public class SMLanguageProvider extends LanguageProvider { "", "", "", "", "", "" ) ); //TODO translationList.add( References.translations( SMEntities.BUG_SPIT.get().getDescriptionId(), "Bug Spit", "", "", "", "", "", "" ) ); //TODO - translationList.add( References.translations( SMEntities.CORPOREAL_FIREBALL.get().getDescriptionId(), "Bug Spit", + translationList.add( References.translations( SMEntities.INCORPOREAL_FIREBALL.get().getDescriptionId(), "Incorporeal Fireball", "", "", "", "", "", "" ) ); //TODO translationList.add( References.translations( SMEntities.FISHING_BOBBER.get().getDescriptionId(), "Fishing Bobber", "", "", "", "", "", "" ) ); //TODO From ae71aa1b03a3de6a6bd0ed5039ed6426098cfad4 Mon Sep 17 00:00:00 2001 From: FatherToast Date: Fri, 26 Aug 2022 08:46:20 -0500 Subject: [PATCH 10/10] test --- .../java/fathertoast/specialmobs/common/core/SpecialMobs.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java index 1c0ef81..2eda36c 100644 --- a/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java +++ b/src/main/java/fathertoast/specialmobs/common/core/SpecialMobs.java @@ -151,6 +151,7 @@ public class SpecialMobs { NaturalSpawnManager.registerSpawnPlacements(); } + @SuppressWarnings( "SpellCheckingInspection" ) public void sendIMCMessages( InterModEnqueueEvent event ) { if( ModList.get().isLoaded( "theoneprobe" ) ) { InterModComms.sendTo( "theoneprobe", "getTheOneProbe", SMTheOneProbe::new );