diff --git a/build.gradle b/build.gradle index 3e7b71083..1a9d56e00 100644 --- a/build.gradle +++ b/build.gradle @@ -99,6 +99,7 @@ minecraft { } } } +apply plugin: 'org.spongepowered.mixin' // Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } @@ -114,8 +115,10 @@ dependencies { mixin { - add sourceSets.main, "citadel.refmap.json" - config 'citadel.mixins.json' + + add sourceSets.main, "alexsmobs.refmap.json" + + config "alexsmobs.mixins.json" } // Example for how to get properties into the manifest for reading by the runtime.. diff --git a/src/main/java/com/github/alexthe666/alexsmobs/entity/EntityRattlesnake.java b/src/main/java/com/github/alexthe666/alexsmobs/entity/EntityRattlesnake.java index 681cce10f..76c917781 100644 --- a/src/main/java/com/github/alexthe666/alexsmobs/entity/EntityRattlesnake.java +++ b/src/main/java/com/github/alexthe666/alexsmobs/entity/EntityRattlesnake.java @@ -238,7 +238,7 @@ public Animation[] getAnimations() { public static boolean canRattlesnakeSpawn(EntityType animal, LevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource random) { boolean spawnBlock = worldIn.getBlockState(pos.below()).is(AMTagRegistry.RATTLESNAKE_SPAWNS); return spawnBlock && worldIn.getRawBrightness(pos, 0) > 8; -} + } class WarnPredatorsGoal extends Goal { int executionChance = 20; @@ -308,4 +308,4 @@ protected double getFollowDistance() { } } -} +} \ No newline at end of file diff --git a/src/main/java/com/github/alexthe666/alexsmobs/event/ServerEvents.java b/src/main/java/com/github/alexthe666/alexsmobs/event/ServerEvents.java index a3043870a..ad1662319 100644 --- a/src/main/java/com/github/alexthe666/alexsmobs/event/ServerEvents.java +++ b/src/main/java/com/github/alexthe666/alexsmobs/event/ServerEvents.java @@ -503,41 +503,10 @@ public void onEntityFinalizeSpawn(MobSpawnEvent.FinalizeSpawn event) { } elephant.addElephantLoot(null, RAND.nextInt()); } + } } } - try { - if (AMConfig.spidersAttackFlies && entity instanceof final Spider spider) { - spider.targetSelector.addGoal(4, - new NearestAttackableTargetGoal<>(spider, EntityFly.class, 1, true, false, null)); - } - else if (AMConfig.wolvesAttackMoose && entity instanceof final Wolf wolf) { - wolf.targetSelector.addGoal(6, new NonTameRandomTargetGoal<>(wolf, EntityMoose.class, false, null)); - } - else if (AMConfig.polarBearsAttackSeals && entity instanceof final PolarBear bear) { - bear.targetSelector.addGoal(6, - new NearestAttackableTargetGoal<>(bear, EntitySeal.class, 15, true, true, null)); - } - else if (entity instanceof final Creeper creeper) { - creeper.targetSelector.addGoal(3, new AvoidEntityGoal<>(creeper, EntitySnowLeopard.class, 6.0F, 1.0D, 1.2D)); - creeper.targetSelector.addGoal(3, new AvoidEntityGoal<>(creeper, EntityTiger.class, 6.0F, 1.0D, 1.2D)); - } - else if (AMConfig.catsAndFoxesAttackJerboas - && (entity instanceof Fox || entity instanceof Cat || entity instanceof Ocelot)) { - Mob mb = (Mob) entity; - mb.targetSelector.addGoal(6, - new NearestAttackableTargetGoal<>(mb, EntityJerboa.class, 45, true, true, null)); - } - else if (AMConfig.bunfungusTransformation && entity instanceof final Rabbit rabbit) { - rabbit.goalSelector.addGoal(3, new TemptGoal(rabbit, 1.0D, Ingredient.of(AMItemRegistry.MUNGAL_SPORES.get()), false)); - } - else if (AMConfig.dolphinsAttackFlyingFish && entity instanceof final Dolphin dolphin) { - dolphin.targetSelector.addGoal(2, - new NearestAttackableTargetGoal<>(dolphin, EntityFlyingFish.class, 70, true, true, null)); - } - } catch (Exception e) { - AlexsMobs.LOGGER.warn("Tried to add unique behaviors to vanilla mobs and encountered an error"); - } } @SubscribeEvent diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/CatMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/CatMixin.java new file mode 100644 index 000000000..06721a514 --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/CatMixin.java @@ -0,0 +1,40 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.config.AMConfig; +import com.github.alexthe666.alexsmobs.entity.EntityJerboa; +import com.github.alexthe666.alexsmobs.entity.EntitySnowLeopard; +import com.github.alexthe666.alexsmobs.entity.EntityTiger; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.Cat; +import net.minecraft.world.entity.animal.Fox; +import net.minecraft.world.entity.animal.Ocelot; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(Cat.class) +public abstract class CatMixin extends TamableAnimal { + + + protected CatMixin(EntityType p_21803_, Level p_21804_) { + super(p_21803_, p_21804_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + if (AMConfig.catsAndFoxesAttackJerboas) { + this.targetSelector.addGoal(6, new NearestAttackableTargetGoal<>(this, EntityJerboa.class, 45, true, true, null)); + } + } + +} diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/CreeperMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/CreeperMixin.java new file mode 100644 index 000000000..27f8e585d --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/CreeperMixin.java @@ -0,0 +1,39 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.entity.*; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(Creeper.class) +public abstract class CreeperMixin extends Monster { + + + protected CreeperMixin(EntityType p_33002_, Level p_33003_) { + super(p_33002_, p_33003_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + this.targetSelector.addGoal(3, new AvoidEntityGoal<>(this, EntitySnowLeopard.class, 6.0F, 1.0D, 1.2D)); + this.targetSelector.addGoal(3, new AvoidEntityGoal<>(this, EntityTiger.class, 6.0F, 1.0D, 1.2D)); + } + +} diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/DolphinMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/DolphinMixin.java new file mode 100644 index 000000000..2e3a904a8 --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/DolphinMixin.java @@ -0,0 +1,35 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.config.AMConfig; +import com.github.alexthe666.alexsmobs.entity.EntityFlyingFish; +import com.github.alexthe666.alexsmobs.entity.EntityJerboa; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.Cat; +import net.minecraft.world.entity.animal.Dolphin; +import net.minecraft.world.entity.animal.WaterAnimal; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(Dolphin.class) +public abstract class DolphinMixin extends WaterAnimal { + + + protected DolphinMixin(EntityType p_30341_, Level p_30342_) { + super(p_30341_, p_30342_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + if (AMConfig.dolphinsAttackFlyingFish) { + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, EntityFlyingFish.class, 70, true, true, null)); + } + } + +} diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/FoxMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/FoxMixin.java new file mode 100644 index 000000000..d38102655 --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/FoxMixin.java @@ -0,0 +1,34 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.config.AMConfig; +import com.github.alexthe666.alexsmobs.entity.EntityJerboa; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Cat; +import net.minecraft.world.entity.animal.Fox; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(Fox.class) +public abstract class FoxMixin extends Animal { + + + protected FoxMixin(EntityType p_21803_, Level p_21804_) { + super(p_21803_, p_21804_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + if (AMConfig.catsAndFoxesAttackJerboas) { + this.targetSelector.addGoal(6, new NearestAttackableTargetGoal<>(this, EntityJerboa.class, 45, true, true, null)); + } + } + +} diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/OcelotMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/OcelotMixin.java new file mode 100644 index 000000000..622e68a0d --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/OcelotMixin.java @@ -0,0 +1,34 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.config.AMConfig; +import com.github.alexthe666.alexsmobs.entity.EntityJerboa; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Fox; +import net.minecraft.world.entity.animal.Ocelot; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(Ocelot.class) +public abstract class OcelotMixin extends Animal { + + + protected OcelotMixin(EntityType p_21803_, Level p_21804_) { + super(p_21803_, p_21804_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + if (AMConfig.catsAndFoxesAttackJerboas) { + this.targetSelector.addGoal(6, new NearestAttackableTargetGoal<>(this, EntityJerboa.class, 45, true, true, null)); + } + } + +} diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/PolarBearMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/PolarBearMixin.java new file mode 100644 index 000000000..abc6b9825 --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/PolarBearMixin.java @@ -0,0 +1,37 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.config.AMConfig; +import com.github.alexthe666.alexsmobs.entity.EntitySeal; +import com.github.alexthe666.alexsmobs.entity.EntitySnowLeopard; +import com.github.alexthe666.alexsmobs.entity.EntityTiger; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.PolarBear; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(PolarBear.class) +public abstract class PolarBearMixin extends Animal { + + + protected PolarBearMixin(EntityType p_27557_, Level p_27558_) { + super(p_27557_, p_27558_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + if (AMConfig.polarBearsAttackSeals) { + this.targetSelector.addGoal(6, new NearestAttackableTargetGoal<>(this, EntitySeal.class, 15, true, true, null)); + } + } + +} diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/RabbitMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/RabbitMixin.java new file mode 100644 index 000000000..331b685e1 --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/RabbitMixin.java @@ -0,0 +1,36 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.config.AMConfig; +import com.github.alexthe666.alexsmobs.entity.EntityJerboa; +import com.github.alexthe666.alexsmobs.item.AMItemRegistry; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.ai.goal.TemptGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Rabbit; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(Rabbit.class) +public abstract class RabbitMixin extends Animal { + + + protected RabbitMixin(EntityType p_21803_, Level p_21804_) { + super(p_21803_, p_21804_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + if (AMConfig.bunfungusTransformation) { + this.goalSelector.addGoal(3, new TemptGoal(this, 1.0D, Ingredient.of(AMItemRegistry.MUNGAL_SPORES.get()), false)); + } + } + +} diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/SpiderMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/SpiderMixin.java new file mode 100644 index 000000000..c20c153f4 --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/SpiderMixin.java @@ -0,0 +1,36 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.config.AMConfig; +import com.github.alexthe666.alexsmobs.entity.EntityFly; +import com.github.alexthe666.alexsmobs.entity.EntitySnowLeopard; +import com.github.alexthe666.alexsmobs.entity.EntityTiger; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(Spider.class) +public abstract class SpiderMixin extends Monster { + + + protected SpiderMixin(EntityType p_33002_, Level p_33003_) { + super(p_33002_, p_33003_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + if (AMConfig.spidersAttackFlies) { + this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, EntityFly.class, 1, true, false, null)); + } + } + +} diff --git a/src/main/java/com/github/alexthe666/alexsmobs/mixins/WolfMixin.java b/src/main/java/com/github/alexthe666/alexsmobs/mixins/WolfMixin.java new file mode 100644 index 000000000..34862ede0 --- /dev/null +++ b/src/main/java/com/github/alexthe666/alexsmobs/mixins/WolfMixin.java @@ -0,0 +1,36 @@ +package com.github.alexthe666.alexsmobs.mixins; + + +import com.github.alexthe666.alexsmobs.config.AMConfig; +import com.github.alexthe666.alexsmobs.entity.EntityFly; +import com.github.alexthe666.alexsmobs.entity.EntityMoose; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NonTameRandomTargetGoal; +import net.minecraft.world.entity.animal.Wolf; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(Wolf.class) +public abstract class WolfMixin extends TamableAnimal { + + + protected WolfMixin(EntityType p_21803_, Level p_21804_) { + super(p_21803_, p_21804_); + } + + @Inject(method = "registerGoals", at = @At("TAIL"), remap = false) + protected void registerGoals(CallbackInfo ci) { + if (AMConfig.wolvesAttackMoose) { + this.targetSelector.addGoal(6, new NonTameRandomTargetGoal<>(this, EntityMoose.class, false, null)); + } + } + +} diff --git a/src/main/resources/alexsmobs.mixins.json b/src/main/resources/alexsmobs.mixins.json new file mode 100644 index 000000000..bf618c437 --- /dev/null +++ b/src/main/resources/alexsmobs.mixins.json @@ -0,0 +1,23 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.github.alexthe666.alexsmobs.mixins", + "compatibilityLevel": "JAVA_8", + "refmap": "alexsmobs.refmap.json", + "mixins": [ + "CatMixin", + "CreeperMixin", + "DolphinMixin", + "FoxMixin", + "OcelotMixin", + "PolarBearMixin", + "RabbitMixin", + "SpiderMixin", + "WolfMixin" + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/data/alexsmobs/tags/items/komodo_dragon_tameables.json b/src/main/resources/data/alexsmobs/tags/items/komodo_dragon_tameables.json index 5e8aecc98..d73d41ac6 100644 --- a/src/main/resources/data/alexsmobs/tags/items/komodo_dragon_tameables.json +++ b/src/main/resources/data/alexsmobs/tags/items/komodo_dragon_tameables.json @@ -1,4 +1,6 @@ { "replace": false, - "values": [] + "values": [ + "minecraft:rotten_flesh" + ] } \ No newline at end of file