From 7a6b71b40faae06b4848b48fe42aabe7829e948b Mon Sep 17 00:00:00 2001 From: FatherToast Date: Tue, 26 Jul 2022 21:03:16 -0500 Subject: [PATCH] cold zomb --- .../common/bestiary/MobFamily.java | 2 +- .../entity/zombie/FrozenZombieEntity.java | 109 ++++++++++++++++++ .../textures/entity/zombie/frozen.png | Bin 0 -> 1569 bytes .../textures/entity/zombie/frozen_overlay.png | Bin 0 -> 480 bytes 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 src/main/java/fathertoast/specialmobs/common/entity/zombie/FrozenZombieEntity.java create mode 100644 src/main/resources/assets/specialmobs/textures/entity/zombie/frozen.png create mode 100644 src/main/resources/assets/specialmobs/textures/entity/zombie/frozen_overlay.png diff --git a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java index cf5bfb3..12ae5b5 100644 --- a/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java +++ b/src/main/java/fathertoast/specialmobs/common/bestiary/MobFamily.java @@ -45,7 +45,7 @@ public class MobFamily { public static final MobFamily ZOMBIE = new MobFamily<>( FamilyConfig::newLessSpecial, "Zombie", "zombies", 0x00AFAF, new EntityType[] { EntityType.ZOMBIE, EntityType.HUSK }, - "Brute", "Fire", "Fishing", "Giant", "Hungry", "Husk", "MadScientist", "Plague" + "Brute", "Fire", "Fishing", "Frozen", "Giant", "Hungry", "Husk", "MadScientist", "Plague" );//TODO fishing // TODO Drowned family and zombie transform mechanic // public static final MobFamily DROWNED = new MobFamily<>( FamilyConfig::new, diff --git a/src/main/java/fathertoast/specialmobs/common/entity/zombie/FrozenZombieEntity.java b/src/main/java/fathertoast/specialmobs/common/entity/zombie/FrozenZombieEntity.java new file mode 100644 index 0000000..03192d5 --- /dev/null +++ b/src/main/java/fathertoast/specialmobs/common/entity/zombie/FrozenZombieEntity.java @@ -0,0 +1,109 @@ +package fathertoast.specialmobs.common.entity.zombie; + +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.entity.ai.AIHelper; +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.AttributeModifier; +import net.minecraft.entity.ai.attributes.Attributes; +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.projectile.AbstractArrowEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.potion.Effects; +import net.minecraft.world.World; + +import java.util.UUID; + +@SpecialMob +public class FrozenZombieEntity extends _SpecialZombieEntity { + + //--------------- Static Special Mob Hooks ---------------- + + @SpecialMob.SpeciesReference + public static MobFamily.Species SPECIES; + + @SpecialMob.BestiaryInfoSupplier + public static void getBestiaryInfo( BestiaryInfo.Builder bestiaryInfo ) { + bestiaryInfo.color( 0xDDEAEA ).theme( BestiaryInfo.Theme.ICE ) + .uniqueTextureBaseOnly() + .addExperience( 1 ) + .addToAttribute( Attributes.ARMOR, 10.0 ) + .multiplyAttribute( Attributes.MOVEMENT_SPEED, 0.8 ); + } + + @SpecialMob.LanguageProvider + public static String[] getTranslations( String langKey ) { + return References.translations( langKey, "Frozen Zombie", + "", "", "", "", "", "" );//TODO + } + + @SpecialMob.LootTableProvider + public static void buildLootTable( LootTableBuilder loot ) { + addBaseLoot( loot ); + loot.addClusterDrop( "common", Items.SNOWBALL ); + loot.addUncommonDrop( "uncommon", Blocks.ICE ); + } + + @SpecialMob.Factory + public static EntityType.IFactory getVariantFactory() { return FrozenZombieEntity::new; } + + /** @return This entity's mob species. */ + @SpecialMob.SpeciesSupplier + @Override + public MobFamily.Species getSpecies() { return SPECIES; } + + + //--------------- Variant-Specific Implementations ---------------- + + private static final AttributeModifier BURNING_SPEED_BOOST = new AttributeModifier( UUID.fromString( "B4704571-9566-4402-BC1F-2EE2A276D836" ), + "AHHHHHHHHHHHHHHH", 0.75, AttributeModifier.Operation.MULTIPLY_BASE ); + + private boolean wasBurning; + + public FrozenZombieEntity( EntityType entityType, World world ) { super( entityType, world ); } + + /** Override to change this entity's AI goals. */ + protected void registerVariantGoals() { + // Make it look more creepy by removing all idle behaviors + AIHelper.removeGoals( goalSelector, WaterAvoidingRandomWalkingGoal.class ); + AIHelper.removeGoals( goalSelector, LookAtGoal.class ); + AIHelper.removeGoals( goalSelector, LookRandomlyGoal.class ); + } + + /** 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 ); + } + + /** Override to modify this entity's ranged attack projectile. */ + @Override + protected AbstractArrowEntity getVariantArrow( AbstractArrowEntity arrow, ItemStack arrowItem, float damageMulti ) { + return MobHelper.tipArrow( arrow, Effects.MOVEMENT_SLOWDOWN ); + } + + /** Called each tick to update this entity's movement. */ + @Override + public void aiStep() { + if( !level.isClientSide() && wasBurning != (getRemainingFireTicks() > 0) ) { + wasBurning = !wasBurning; + final ModifiableAttributeInstance attributeInstance = getAttribute( Attributes.MOVEMENT_SPEED ); + //noinspection ConstantConditions + attributeInstance.removeModifier( BURNING_SPEED_BOOST ); + if( wasBurning ) { + attributeInstance.addTransientModifier( BURNING_SPEED_BOOST ); + } + } + super.aiStep(); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/specialmobs/textures/entity/zombie/frozen.png b/src/main/resources/assets/specialmobs/textures/entity/zombie/frozen.png new file mode 100644 index 0000000000000000000000000000000000000000..b67b295732c157348bd5554a84a6952ad26d6867 GIT binary patch literal 1569 zcmchWjW^Q^7{`CcB2mJPx+5I75GD6^RZRBFGSd7~^R|k4e{Ew(NUT!cW0guxwY-d( z%}bVf8+pHMTBaydLQ*GriHy6u{)zjX^L;+&d7g8=&pFRIPdbEkR9D@h3IKq*6UM9?>0Km!Jv_^o-XYP>8Y4r87rxe=5g6B0) zdfUP%Ndq$zLrdQ!GU2&@#55}0TC zVlabU)%}8)LJLWx5n>B3WO9=8YW?C0A0U_%S)6W8AQ(WdC;nNyB}gmR#MH;I^(^3KI?YFvb#)H96W5(DY~b| z+G&H>e`EbA`3G;W+b)Bi{H!f|H+$Xn@G~_qt!Ad|C7&7fAecU)RN8|B3iEol5KhH} zG@b*iequHUGbE+T^kI^7fnJStpv_U$IB5Z4*4C&w3~QuVQS7zLy1&99n~z1fqJrE* zq(EPIo;I#=8A~#Xb6CtM;W$^@wo&fS9hbM*>f2E#mzKw@?SvN%(XNcSfIySin-eQC z$|u#^h4VYidZN=aL!I_i@ZZFH^b;d=M>>z`dy|y+mbu`YPN=u}u{)e*83YX2})!~v}ShVhrKtw-x4!yom1vg8q8)-S- z2UnHy3Uf0$jOu~gds30Y?J|yKaGiH$@9HV@Lo0rlTOboVPt{i}Fr{_#O0gbcpu7%A z4aArqGVUuM%}$&6yU6p->_JzgApEDmGx6D|p7{vMH;v${kBA>zNKvwkZMzBa1y5bK z%-)%3$PRi}{Xk$ejjo@DPm#UOYkgRfHVI4(uihU*RZZv3v-@dU&PVwIW2uG>kL8at z$T(A+BKhj30y!&gflV3~>;3ycQ|>yYH5y0n=FEysqThDL3nK^Lvma_$ zCB2!=X}5el6`&iF&_wsRYG>kmEs6ZE#WSo=7{VT z)&8ruI6)Q_3SVf-N=K+zuP?5p-TYztOixdbb&c1)oY0}&5^Tf7_i^6AU8sn(yVh@n zYI>s5PYtY%$-A=058DzwCHVfdQIfRA>qyDtoogB^SH$C81dRfx57(J3OO1IRmL;qA zN;cW`9^BzIZbNTSR~SZ3H5se%t=1I-ZmI27Si02Ki672x%-A~o*CkWHZnZVmg7?N@ z=RwDH{m(8`;G98}{ydsfQf;>9a1P=@gVjo(#uRyUgQTu~go|Nn;iNn{1`)dPG&T)n)!9334EG>X&|qeDYO6GC1^MMPK`c3N9oo0^)2d7g2zS_)LV zdd}l(K#I2{$S?Rm5@4`>q0|PH;4JWnEM{QfI}E~%$MaXD04>+_ba4#v@O~Tou&7Oe z$C>L=(Eb0F(;1H6xv+Eh-`g{dgMQvJaou0=M{xZCZHGNf|GgD*ZZD4L33RhC><;?T z>Ts^GMR;?D|I0v!qMhOarm_!pStK4Fxg?tGl~Zf*(bDb6a<`Z}s$q>W$xl`snwnyj zH{<`2YQ~d&e{`CXj(MyzwPtZ>pODNi^HQ8|&dIBR$5ObizFI1}^}bcTfX3OXk6lyG zyz8^oEV#zmcz*lFz5^;>T<&YU=~-~p!fuY6{lU+QvmUZe+EXB0w)$>kNXJEnU44I8 z9lyu&9?42slk0ZHd^OX?uH~6Ot(%rDSWsxXK~g8~!uH=w8GB4WiL>0ElzHQdQ_zvW z*&Je1O!vH!Su1M@9+!|Pk3@9+DSv7Yh0jWct_<>UVkhszvi&)5<2RP!_EF