diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 4527dc15..c9a5617f 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -511,7 +511,13 @@ public class CarpetSettings @Rule( desc = "Edge cases are as frequent as common cases, for testing only!!", - extra = "Dispensers and Droppers will use extreme random velocity values", + extra = {"Velocities of items from dispensers, blaze projectiles, fireworks ", + "Directions of fireballs, wither skulls, fishing bobbers, ", + "items dropped from blocks and inventories, llamas spit, triggered trap horses", + "Damage dealt with projectiles", + "Blaze aggro sensitivity", + "Mobs spawned follow range" + }, category = CREATIVE ) public static boolean extremeBehaviours = false; diff --git a/src/main/java/carpet/mixins/BlazeEntityShootFireballGoal_extremeMixin.java b/src/main/java/carpet/mixins/BlazeEntityShootFireballGoal_extremeMixin.java new file mode 100644 index 00000000..8ec6217d --- /dev/null +++ b/src/main/java/carpet/mixins/BlazeEntityShootFireballGoal_extremeMixin.java @@ -0,0 +1,22 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.mob.BlazeEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(targets = "net.minecraft.entity.mob.BlazeEntity$ShootFireballGoal") +public class BlazeEntityShootFireballGoal_extremeMixin +{ + @Redirect(method = "tick", expect = 2, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/mixins/BlazeEntity_extremeMixin.java b/src/main/java/carpet/mixins/BlazeEntity_extremeMixin.java new file mode 100644 index 00000000..ce30387c --- /dev/null +++ b/src/main/java/carpet/mixins/BlazeEntity_extremeMixin.java @@ -0,0 +1,23 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.mob.BlazeEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(BlazeEntity.class) +public class BlazeEntity_extremeMixin +{ + // unused actually + @Redirect(method = "mobTick", expect = 1, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/mixins/ExplosiveProjectileEntity_extremeMixin.java b/src/main/java/carpet/mixins/ExplosiveProjectileEntity_extremeMixin.java new file mode 100644 index 00000000..6a03d9f1 --- /dev/null +++ b/src/main/java/carpet/mixins/ExplosiveProjectileEntity_extremeMixin.java @@ -0,0 +1,23 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.projectile.ExplosiveProjectileEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(ExplosiveProjectileEntity.class) +public class ExplosiveProjectileEntity_extremeMixin +{ + @Redirect(method = "(Lnet/minecraft/entity/EntityType;Lnet/minecraft/entity/LivingEntity;DDDLnet/minecraft/world/World;)V", + expect = 3, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/mixins/FireworkEntity_extremeMixin.java b/src/main/java/carpet/mixins/FireworkEntity_extremeMixin.java new file mode 100644 index 00000000..80f0d869 --- /dev/null +++ b/src/main/java/carpet/mixins/FireworkEntity_extremeMixin.java @@ -0,0 +1,32 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.FireworkEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(FireworkEntity.class) +public class FireworkEntity_extremeMixin +{ + @Redirect(method = "(Lnet/minecraft/world/World;DDDLnet/minecraft/item/ItemStack;)V", expect = 2, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } + + @Redirect(method = "setVelocity", expect = 3, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian2(Random random) + { + return RandomTools.nextGauBian(random); + } + +} diff --git a/src/main/java/carpet/mixins/FishingBobberEntity_extremeMixin.java b/src/main/java/carpet/mixins/FishingBobberEntity_extremeMixin.java new file mode 100644 index 00000000..0fafca63 --- /dev/null +++ b/src/main/java/carpet/mixins/FishingBobberEntity_extremeMixin.java @@ -0,0 +1,22 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.projectile.FishingBobberEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(FishingBobberEntity.class) +public class FishingBobberEntity_extremeMixin +{ + @Redirect(method = "(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/world/World;II)V", expect =3, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/mixins/ItemDispenserBehaviour_extremeBehavioursMixin.java b/src/main/java/carpet/mixins/ItemDispenserBehaviour_extremeBehavioursMixin.java index 6b723470..9ee1a237 100644 --- a/src/main/java/carpet/mixins/ItemDispenserBehaviour_extremeBehavioursMixin.java +++ b/src/main/java/carpet/mixins/ItemDispenserBehaviour_extremeBehavioursMixin.java @@ -1,40 +1,23 @@ package carpet.mixins; -import carpet.CarpetServer; -import carpet.CarpetSettings; +import carpet.utils.RandomTools; import net.minecraft.block.dispenser.ItemDispenserBehavior; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Position; -import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +import java.util.Random; + @Mixin(ItemDispenserBehavior.class) public class ItemDispenserBehaviour_extremeBehavioursMixin { - @Redirect(method = "spawnItem", at = @At( + @Redirect(method = "spawnItem", expect = 3, at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/ItemEntity;setVelocity(DDD)V" + target = "Ljava/util/Random;nextGaussian()D" )) - private static void setExtremeVelocity(ItemEntity itemEntity, double x, double y, double z, - World world, ItemStack stack, int offset, Direction side, Position pos) + private static double nextGauBian(Random random) { - if (CarpetSettings.extremeBehaviours) - { - double g = CarpetServer.rand.nextDouble() * 0.1D + 0.2D; - itemEntity.setVelocity( - (16*world.random.nextDouble()-8) * 0.007499999832361937D * (double) offset + (double) side.getOffsetX() * g, - (16*world.random.nextDouble()-8) * 0.007499999832361937D * (double) offset + 0.20000000298023224D, - (16*world.random.nextDouble()-8) * 0.007499999832361937D * (double) offset + (double) side.getOffsetZ() * g - ); - } - else - { - itemEntity.setVelocity(x, y, z); - } + return RandomTools.nextGauBian(random); } } diff --git a/src/main/java/carpet/mixins/ItemScatterer_extremeMixin.java b/src/main/java/carpet/mixins/ItemScatterer_extremeMixin.java new file mode 100644 index 00000000..df45575d --- /dev/null +++ b/src/main/java/carpet/mixins/ItemScatterer_extremeMixin.java @@ -0,0 +1,22 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.util.ItemScatterer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(ItemScatterer.class) +public class ItemScatterer_extremeMixin +{ + @Redirect(method = "spawn(Lnet/minecraft/world/World;DDDLnet/minecraft/item/ItemStack;)V", expect = 3, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private static double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/mixins/LlamaSpitEntity_extremeMixin.java b/src/main/java/carpet/mixins/LlamaSpitEntity_extremeMixin.java new file mode 100644 index 00000000..289dea6e --- /dev/null +++ b/src/main/java/carpet/mixins/LlamaSpitEntity_extremeMixin.java @@ -0,0 +1,22 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.projectile.LlamaSpitEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(LlamaSpitEntity.class) +public class LlamaSpitEntity_extremeMixin +{ + @Redirect(method = "setVelocity", expect = 3, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/mixins/MobEntity_extremeMixin.java b/src/main/java/carpet/mixins/MobEntity_extremeMixin.java new file mode 100644 index 00000000..9c528136 --- /dev/null +++ b/src/main/java/carpet/mixins/MobEntity_extremeMixin.java @@ -0,0 +1,22 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.mob.MobEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(MobEntity.class) +public class MobEntity_extremeMixin +{ + @Redirect(method = "initialize", expect = 1, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/mixins/ProjectileEntity_extremeMixin.java b/src/main/java/carpet/mixins/ProjectileEntity_extremeMixin.java new file mode 100644 index 00000000..60f9789d --- /dev/null +++ b/src/main/java/carpet/mixins/ProjectileEntity_extremeMixin.java @@ -0,0 +1,33 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.projectile.ProjectileEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(ProjectileEntity.class) +public class ProjectileEntity_extremeMixin +{ + @Redirect(method = "setVelocity", expect = 3, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } + + // calculates damage + @Redirect(method = "method_7435", expect = 1, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian2(Random random) + { + return RandomTools.nextGauBian(random); + } + +} diff --git a/src/main/java/carpet/mixins/SkeletonHorseTrapTriggerGoal_extremeMixin.java b/src/main/java/carpet/mixins/SkeletonHorseTrapTriggerGoal_extremeMixin.java new file mode 100644 index 00000000..9461756c --- /dev/null +++ b/src/main/java/carpet/mixins/SkeletonHorseTrapTriggerGoal_extremeMixin.java @@ -0,0 +1,22 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.ai.goal.SkeletonHorseTrapTriggerGoal; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(SkeletonHorseTrapTriggerGoal.class) +public class SkeletonHorseTrapTriggerGoal_extremeMixin +{ + @Redirect(method = "tick", expect = 2, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/mixins/ThrownEntity_extremeMixin.java b/src/main/java/carpet/mixins/ThrownEntity_extremeMixin.java new file mode 100644 index 00000000..4cb933fc --- /dev/null +++ b/src/main/java/carpet/mixins/ThrownEntity_extremeMixin.java @@ -0,0 +1,22 @@ +package carpet.mixins; + +import carpet.utils.RandomTools; +import net.minecraft.entity.thrown.ThrownEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(ThrownEntity.class) +public class ThrownEntity_extremeMixin +{ + @Redirect(method = "setVelocity", expect = 3, at = @At( + value = "INVOKE", + target = "Ljava/util/Random;nextGaussian()D" + )) + private double nextGauBian(Random random) + { + return RandomTools.nextGauBian(random); + } +} diff --git a/src/main/java/carpet/utils/RandomTools.java b/src/main/java/carpet/utils/RandomTools.java new file mode 100644 index 00000000..0cfb442c --- /dev/null +++ b/src/main/java/carpet/utils/RandomTools.java @@ -0,0 +1,18 @@ +package carpet.utils; + +import carpet.CarpetSettings; + +import java.util.Random; + +public class RandomTools +{ + public static double nextGauBian(Random random) + { + if (CarpetSettings.extremeBehaviours) + { + random.nextDouble(); + return 16.0D * random.nextDouble() - 8.0D; + } + return random.nextGaussian(); + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index aef2ba6b..5ce2fe8d 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -124,6 +124,16 @@ "ShearsItem_missingToolsMixin", "ItemDispenserBehaviour_extremeBehavioursMixin", + "ItemScatterer_extremeMixin", + "FishingBobberEntity_extremeMixin", + "SkeletonHorseTrapTriggerGoal_extremeMixin", + "FireworkEntity_extremeMixin", + "BlazeEntity_extremeMixin", + "BlazeEntityShootFireballGoal_extremeMixin", + "MobEntity_extremeMixin", + "ExplosiveProjectileEntity_extremeMixin", + "LlamaSpitEntity_extremeMixin", + "ProjectileEntity_extremeMixin", "ArmorStandEntity_scarpetMarkerMixin", "Entity_scarpetEventsMixin",