diff --git a/gradle.properties b/gradle.properties index 2ced3cd..7e71b1d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,12 @@ # Done to increase the memory available to gradle. org.gradle.jvmargs=-Xmx1G -minecraft_version=1.21.8 -yarn_mappings=1.21.8+build.1 +minecraft_version=1.21.3 +yarn_mappings=1.21.3+build.2 loader_version=0.16.14 # Fabric API -fabric_version=0.129.0+1.21.8 +fabric_version=0.107.3+1.21.3 # Mod Properties -mod_version=1.2.5 +mod_version=1.3 maven_group=systems.brn archives_base_name=tweaks diff --git a/src/main/java/systems/brn/tweaks/Tweaks.java b/src/main/java/systems/brn/tweaks/Tweaks.java index 1382cad..7b66dd8 100644 --- a/src/main/java/systems/brn/tweaks/Tweaks.java +++ b/src/main/java/systems/brn/tweaks/Tweaks.java @@ -6,10 +6,36 @@ import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry; import net.minecraft.world.GameRules; public class Tweaks implements ModInitializer { - public static final GameRules.Key Entity_Portal_Cooldown = - GameRuleRegistry.register("entityPortalCooldown", GameRules.Category.MOBS, GameRuleFactory.createIntRule(300)); - public static final GameRules.Key Enderpearl_Damage = - GameRuleRegistry.register("enderpearlDamage", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(5)); + public static final GameRules.Key ENTITY_PORTAL_COOLDOWN = + GameRuleRegistry.register("entityPortalCooldown", GameRules.Category.MOBS, GameRuleFactory.createIntRule(300, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key ENDER_PEARL_DAMAGE = + GameRuleRegistry.register("enderPearlDamage", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(5, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key SHIELD_AXE_COOLDOWN = + GameRuleRegistry.register("shieldAxeCooldown", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(100, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key CRITICAL_MULTIPLIER = + GameRuleRegistry.register("criticalHitMultiplier", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(150, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key CREEPER_FUSE_TIME = + GameRuleRegistry.register("creeperDefaultFuseTime", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(30, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key ENDER_PEARL_POWER = + GameRuleRegistry.register("enderPearlPower", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(150, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key ENDER_PEARL_DIVERGENCE = + GameRuleRegistry.register("enderPearlDivergence", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(100, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key ENDER_EYE_POP_CHANCE = + GameRuleRegistry.register("enderEyePopChance", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(20, 0, 100)); + + public static final GameRules.Key LEASH_BREAK_DISTANCE = + GameRuleRegistry.register("leashBreakDistance", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(10, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key LEASH_ELASTIC_DISTANCE = + GameRuleRegistry.register("leashElasticDistance", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(6, 0, Integer.MAX_VALUE)); + @Override public void onInitialize() { } diff --git a/src/main/java/systems/brn/tweaks/mixin/CreeperEntityMixin.java b/src/main/java/systems/brn/tweaks/mixin/CreeperEntityMixin.java new file mode 100644 index 0000000..e52d5af --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/CreeperEntityMixin.java @@ -0,0 +1,29 @@ +package systems.brn.tweaks.mixin; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.mob.CreeperEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.GameRules; +import net.minecraft.world.World; +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; +import systems.brn.tweaks.Tweaks; +import systems.brn.tweaks.mixin.accessors.CreeperEntityAccessor; + +@Mixin(CreeperEntity.class) +public abstract class CreeperEntityMixin { + @Inject( + method = "", + at = @At("TAIL") + ) + private void onConstructor(EntityType entityType, World world, CallbackInfo ci) { + CreeperEntity creeper = (CreeperEntity)(Object)this; + if (!world.isClient) { + ServerWorld serverWorld = (ServerWorld) world; + GameRules.IntRule rule = serverWorld.getGameRules().get(Tweaks.CREEPER_FUSE_TIME); + ((CreeperEntityAccessor) creeper).setFuseTime(rule.get()); + } + } +} \ No newline at end of file diff --git a/src/main/java/systems/brn/tweaks/mixin/DontHurtMePearlMixin.java b/src/main/java/systems/brn/tweaks/mixin/DontHurtMePearlMixin.java index 310916f..48a8b92 100644 --- a/src/main/java/systems/brn/tweaks/mixin/DontHurtMePearlMixin.java +++ b/src/main/java/systems/brn/tweaks/mixin/DontHurtMePearlMixin.java @@ -1,15 +1,13 @@ package systems.brn.tweaks.mixin; -import net.minecraft.entity.Entity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; -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 static systems.brn.tweaks.Tweaks.Enderpearl_Damage; +import static systems.brn.tweaks.Tweaks.ENDER_PEARL_DAMAGE; @Mixin(net.minecraft.entity.projectile.thrown.EnderPearlEntity.class) public class DontHurtMePearlMixin { @@ -17,7 +15,7 @@ public class DontHurtMePearlMixin { @Redirect(method = "onCollision(Lnet/minecraft/util/hit/HitResult;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;damage(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/entity/damage/DamageSource;F)Z")) private boolean redirectDamage(ServerPlayerEntity entity, ServerWorld world, DamageSource source, float amount) { - entity.damage(world, source, world.getGameRules().getInt(Enderpearl_Damage)); + entity.damage(world, source, world.getGameRules().getInt(ENDER_PEARL_DAMAGE)); return false; } } diff --git a/src/main/java/systems/brn/tweaks/mixin/EnderPearlItemMixin.java b/src/main/java/systems/brn/tweaks/mixin/EnderPearlItemMixin.java new file mode 100644 index 0000000..1f5844e --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/EnderPearlItemMixin.java @@ -0,0 +1,57 @@ +package systems.brn.tweaks.mixin; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.thrown.EnderPearlEntity; +import net.minecraft.item.EnderPearlItem; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.world.World; +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.CallbackInfoReturnable; +import systems.brn.tweaks.Tweaks; + +@Mixin(EnderPearlItem.class) +public class EnderPearlItemMixin { + + @Inject(method = "use", at = @At("HEAD"), cancellable = true) + private void injectCustomVelocity(World world, PlayerEntity user, Hand hand, + CallbackInfoReturnable cir) { + + if (!(world instanceof ServerWorld serverWorld)) return; + + ItemStack stack = user.getStackInHand(hand); + + float power = serverWorld.getGameRules().getInt(Tweaks.ENDER_PEARL_POWER) / 100f; + float divergence = serverWorld.getGameRules().getInt(Tweaks.ENDER_PEARL_DIVERGENCE) / 100f; + + world.playSound( + null, + user.getX(), + user.getY(), + user.getZ(), + net.minecraft.sound.SoundEvents.ENTITY_ENDER_PEARL_THROW, + net.minecraft.sound.SoundCategory.NEUTRAL, + 0.5F, + 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F) + ); + + net.minecraft.entity.projectile.ProjectileEntity.spawnWithVelocity( + EnderPearlEntity::new, + serverWorld, + stack, + user, + 0f, + power, + divergence + ); + + user.incrementStat(net.minecraft.stat.Stats.USED.getOrCreateStat((EnderPearlItem)(Object)this)); + stack.decrementUnlessCreative(1, user); + + cir.setReturnValue(ActionResult.SUCCESS); + } +} diff --git a/src/main/java/systems/brn/tweaks/mixin/EyeOfEnderMixin.java b/src/main/java/systems/brn/tweaks/mixin/EyeOfEnderMixin.java new file mode 100644 index 0000000..5343a02 --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/EyeOfEnderMixin.java @@ -0,0 +1,39 @@ +package systems.brn.tweaks.mixin; + +import net.minecraft.entity.EyeOfEnderEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.World; +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; +import systems.brn.tweaks.Tweaks; +import systems.brn.tweaks.mixin.accessors.EyeOfEnderEntityAccessor; + +@Mixin(EyeOfEnderEntity.class) +public class EyeOfEnderMixin { + + @Inject( + method = "initTargetPos", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/entity/EyeOfEnderEntity;dropsItem:Z", + ordinal = 0, + shift = At.Shift.AFTER + ) + ) + private void applyCustomBreakChance(CallbackInfo ci) { + EyeOfEnderEntity self = (EyeOfEnderEntity)(Object)this; + World world = self.getWorld(); + + if (!(world instanceof ServerWorld serverWorld)) + return; + + int popChance = serverWorld.getGameRules().getInt(Tweaks.ENDER_EYE_POP_CHANCE); + int roll = self.getRandom().nextInt(100); + + boolean dropsItem = roll >= popChance; + + ((EyeOfEnderEntityAccessor) self).setDropsItem(dropsItem); + } +} \ No newline at end of file diff --git a/src/main/java/systems/brn/tweaks/mixin/JustTeleportAlreadyMixin.java b/src/main/java/systems/brn/tweaks/mixin/JustTeleportAlreadyMixin.java index 91ab814..8472553 100644 --- a/src/main/java/systems/brn/tweaks/mixin/JustTeleportAlreadyMixin.java +++ b/src/main/java/systems/brn/tweaks/mixin/JustTeleportAlreadyMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import static systems.brn.tweaks.Tweaks.Entity_Portal_Cooldown; +import static systems.brn.tweaks.Tweaks.ENTITY_PORTAL_COOLDOWN; @Mixin(net.minecraft.entity.Entity.class) public class JustTeleportAlreadyMixin { @@ -21,7 +21,7 @@ public class JustTeleportAlreadyMixin { cancellable = true) private void getDefaultPortalCooldown(CallbackInfoReturnable cir) { if (world instanceof ServerWorld sWorld) { - cir.setReturnValue(sWorld.getGameRules().getInt(Entity_Portal_Cooldown)); + cir.setReturnValue(sWorld.getGameRules().getInt(ENTITY_PORTAL_COOLDOWN)); } } @@ -31,7 +31,7 @@ public class JustTeleportAlreadyMixin { @Inject(method = "tickPortalCooldown", at = @At(value = "RETURN")) private void tickPortalCooldown(CallbackInfo ci) { if (world instanceof ServerWorld sWorld) { - int maxCooldown = sWorld.getGameRules().getInt(Entity_Portal_Cooldown); + int maxCooldown = sWorld.getGameRules().getInt(ENTITY_PORTAL_COOLDOWN); if (portalCooldown > maxCooldown) { portalCooldown = maxCooldown; } diff --git a/src/main/java/systems/brn/tweaks/mixin/LeashableMixin.java b/src/main/java/systems/brn/tweaks/mixin/LeashableMixin.java new file mode 100644 index 0000000..54ba67c --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/LeashableMixin.java @@ -0,0 +1,32 @@ +package systems.brn.tweaks.mixin; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.Leashable; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.GameRules; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; +import systems.brn.tweaks.Tweaks; + +@Mixin(Leashable.class) +public interface LeashableMixin { + + @ModifyConstant( + method = "tickLeash", + constant = @Constant(doubleValue = 10.0) + ) + private static double modifyLeashBreakDistance(double original, ServerWorld world, Entity entity) { + GameRules.IntRule rule = world.getGameRules().get(Tweaks.LEASH_BREAK_DISTANCE); + return rule.get(); + } + + @ModifyConstant( + method = "tickLeash", + constant = @Constant(doubleValue = 6.0) + ) + private static double modifyLeashElasticDistance(double original, ServerWorld world, Entity entity) { + GameRules.IntRule rule = world.getGameRules().get(Tweaks.LEASH_ELASTIC_DISTANCE); + return rule.get(); + } +} \ No newline at end of file diff --git a/src/main/java/systems/brn/tweaks/mixin/PlayerEntityMixin.java b/src/main/java/systems/brn/tweaks/mixin/PlayerEntityMixin.java new file mode 100644 index 0000000..ed3c23c --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/PlayerEntityMixin.java @@ -0,0 +1,39 @@ +package systems.brn.tweaks.mixin; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.GameRules; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; +import systems.brn.tweaks.Tweaks; + +@Mixin(PlayerEntity.class) +public abstract class PlayerEntityMixin { + + @ModifyConstant( + method = "disableShield(Lnet/minecraft/item/ItemStack;)V", + constant = @Constant(intValue = 100) + ) + private int modifyShieldCooldownConstant(int original) { + PlayerEntity player = (PlayerEntity)(Object)this; + if (player.getWorld() != null && player.getWorld() instanceof ServerWorld sWorld) { + GameRules.IntRule rule = sWorld.getGameRules().get(Tweaks.SHIELD_AXE_COOLDOWN); + return rule.get(); + } + return original; + } + + @ModifyConstant( + method = "attack", + constant = @Constant(floatValue = 1.5F) + ) + private float modifyCriticalMultiplier(float original) { + PlayerEntity player = (PlayerEntity)(Object)this; + if (player.getWorld() != null && player.getWorld() instanceof ServerWorld serverWorld) { + GameRules.IntRule rule = serverWorld.getGameRules().get(Tweaks.CRITICAL_MULTIPLIER); + return rule.get() / 100.0F; + } + return original; + } +} \ No newline at end of file diff --git a/src/main/java/systems/brn/tweaks/mixin/accessors/CreeperEntityAccessor.java b/src/main/java/systems/brn/tweaks/mixin/accessors/CreeperEntityAccessor.java new file mode 100644 index 0000000..17d3462 --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/accessors/CreeperEntityAccessor.java @@ -0,0 +1,14 @@ +package systems.brn.tweaks.mixin.accessors; + +import net.minecraft.entity.mob.CreeperEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(CreeperEntity.class) +public interface CreeperEntityAccessor { + @Accessor("fuseTime") + void setFuseTime(int fuseTime); + + @Accessor("fuseTime") + int getFuseTime(); +} \ No newline at end of file diff --git a/src/main/java/systems/brn/tweaks/mixin/accessors/EyeOfEnderEntityAccessor.java b/src/main/java/systems/brn/tweaks/mixin/accessors/EyeOfEnderEntityAccessor.java new file mode 100644 index 0000000..b2e72e6 --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/accessors/EyeOfEnderEntityAccessor.java @@ -0,0 +1,11 @@ +package systems.brn.tweaks.mixin.accessors; + +import net.minecraft.entity.EyeOfEnderEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(EyeOfEnderEntity.class) +public interface EyeOfEnderEntityAccessor { + @Accessor("dropsItem") + void setDropsItem(boolean value); +} diff --git a/src/main/resources/assets/icon.png b/src/main/resources/assets/icon.png index c2ae943..99bcf5c 100644 Binary files a/src/main/resources/assets/icon.png and b/src/main/resources/assets/icon.png differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 408c3ed..ab7538d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -2,11 +2,11 @@ "schemaVersion": 1, "id": "tweaks", "version": "${version}", - "name": "tweaks", - "description": "", - "authors": [], + "name": "Tweaks", + "description": "Change some values in Minecraft using gamerules", + "authors": ["BRNSystems", "Akis"], "contact": { - "repo": "https://git.brn.systems/BRNSystems/tweaks" + "sources": "https://git.brn.systems/BRNSystems/tweaks" }, "license": "MIT", "icon": "assets/icon.png", @@ -22,6 +22,6 @@ "depends": { "fabricloader": ">=${loader_version}", "fabric": "*", - "minecraft": "${minecraft_version}" + "minecraft": ">=${minecraft_version}" } } diff --git a/src/main/resources/tweaks.mixins.json b/src/main/resources/tweaks.mixins.json index c017c57..834f5c4 100644 --- a/src/main/resources/tweaks.mixins.json +++ b/src/main/resources/tweaks.mixins.json @@ -4,8 +4,15 @@ "package": "systems.brn.tweaks.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "CreeperEntityMixin", "DontHurtMePearlMixin", - "JustTeleportAlreadyMixin" + "EnderPearlItemMixin", + "EyeOfEnderMixin", + "JustTeleportAlreadyMixin", + "LeashableMixin", + "PlayerEntityMixin", + "accessors.CreeperEntityAccessor", + "accessors.EyeOfEnderEntityAccessor" ], "injectors": { "defaultRequire": 1