diff --git a/src/main/java/io/gitlab/jfronny/combit/CombitConfig.java b/src/main/java/io/gitlab/jfronny/combit/CombitConfig.java index d2897ce..950d4ad 100644 --- a/src/main/java/io/gitlab/jfronny/combit/CombitConfig.java +++ b/src/main/java/io/gitlab/jfronny/combit/CombitConfig.java @@ -1,6 +1,9 @@ package io.gitlab.jfronny.combit; -import io.gitlab.jfronny.libjf.config.api.*; +import io.gitlab.jfronny.libjf.config.api.Entry; +import io.gitlab.jfronny.libjf.config.api.JfConfig; +import io.gitlab.jfronny.libjf.config.api.Preset; +import io.gitlab.jfronny.libjf.config.api.Verifier; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.damage.DamageSource; @@ -8,28 +11,33 @@ import java.util.HashSet; public class CombitConfig implements JfConfig { // Invulnerability - @Entry public static Integer iFrameInterval = 0; - @Entry(min=Double.MIN_VALUE, max = 1) public static Double attackCancelThreshold = 0.1; - @Entry(min=Double.MIN_VALUE, max = 1) public static Double knockbackCancelThreshold = 0.75; + @Entry public static Integer iFrameInterval = -1; + @Entry(min=-1, max = 1) public static Double attackCancelThreshold = -1d; + @Entry(min=-1, max = 1) public static Double knockbackCancelThreshold = -1d; @Entry public static HashSet attackerWhitelist = null; @Entry public static HashSet damageSourceWhitelist = null; @Entry public static HashSet targetEntityWhitelist = null; @Entry public static Boolean excludeAllMobs = false; @Entry public static Boolean excludePlayers = false; + // Entity Modification + @Entry public static Boolean skeletonsBurn = true; + @Entry public static Boolean zombiesBurn = true; + @Entry public static Boolean creepersBurn = false; + @Entry public static Boolean creepersExplodeWhenBurning = false; // Health @Entry public static Double entityHealthFactor = 1.5; @Entry public static HashSet entityHealthBlacklist = null; // Weapons - @Entry public static Double cooldownProgressOverride = 0.8; - @Entry public static Double cooldownProgressPerTickOverride = Double.MIN_VALUE; - @Entry public static Double weaponAttackDamageFactor = 0.6; - @Entry public static Double axeAttackDamageFactor = 0.5; + @Entry public static Double cooldownProgressOverride = -1d; + @Entry public static Double cooldownProgressPerTickOverride = -1d; + @Entry public static Double weaponAttackDamageFactor = 1d; + @Entry public static Double axeAttackDamageFactor = 1d; // Knockback - @Entry public static Double snowballKnockbackFactor = -1.0; - @Entry public static Float snowballDamage = 1.0f; - @Entry public static Double eggKnockbackFactor = -1.0; - @Entry public static Float eggDamage = 1.0f; - @Entry public static Double fishingBobberPullFactor = 2.0; + @Entry public static Double snowballKnockbackFactor = 0d; + @Entry public static Float snowballDamage = 0f; + @Entry public static Double eggKnockbackFactor = 0d; + @Entry public static Float eggDamage = 0f; + @Entry public static Double fishingBobberPullFactor = 1d; // Debug @Entry public static Boolean debug = FabricLoader.getInstance().isDevelopmentEnvironment(); @@ -70,36 +78,50 @@ public class CombitConfig implements JfConfig { targetEntityWhitelist = null; excludeAllMobs = false; excludePlayers = false; + skeletonsBurn = true; + zombiesBurn = true; + creepersBurn = false; + creepersExplodeWhenBurning = false; entityHealthFactor = 1.0; entityHealthBlacklist = null; cooldownProgressOverride = 0.8; cooldownProgressPerTickOverride = Double.MIN_VALUE; - weaponAttackDamageFactor = 1.0; + weaponAttackDamageFactor = 1d; axeAttackDamageFactor = 0.5; - snowballKnockbackFactor = 1.0; - snowballDamage = 0.0f; - eggKnockbackFactor = 1.0; - eggDamage = 0.0f; - fishingBobberPullFactor = 1.0; + snowballKnockbackFactor = 1d; + snowballDamage = 0f; + eggKnockbackFactor = 1d; + eggDamage = 0f; + fishingBobberPullFactor = 1d; + } + + @Preset public static void madness() { + iFrameInterval = 0; + attackCancelThreshold = 0d; + knockbackCancelThreshold = 0d; + attackerWhitelist = new HashSet<>(); + damageSourceWhitelist = new HashSet<>(); + targetEntityWhitelist = new HashSet<>(); + excludeAllMobs = false; + excludePlayers = false; + skeletonsBurn = false; + zombiesBurn = false; + creepersBurn = true; + creepersExplodeWhenBurning = true; + entityHealthFactor = 10d; + entityHealthBlacklist = null; + cooldownProgressOverride = 1d; + cooldownProgressPerTickOverride = Double.MAX_VALUE; + weaponAttackDamageFactor = 0.5; + axeAttackDamageFactor = 5d; + snowballKnockbackFactor = -1d; + snowballDamage = 0f; + eggKnockbackFactor = -5d; + eggDamage = 1f; + fishingBobberPullFactor = 2d; } @Preset public static void noInvulnerability() { iFrameInterval = 0; } - - @Preset public static void disable() { - iFrameInterval = -1; - excludeAllMobs = true; - excludePlayers = true; - entityHealthFactor = 1.0; - cooldownProgressOverride = -1.0; - cooldownProgressPerTickOverride = -1.0; - weaponAttackDamageFactor = 1.0; - axeAttackDamageFactor = 1.0; - snowballKnockbackFactor = 0.0; - snowballDamage = 0f; - eggKnockbackFactor = 0.0; - eggDamage = 0.0f; - fishingBobberPullFactor = 1.0; - } } diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/AbstractSkeletonEntityMixin.java b/src/main/java/io/gitlab/jfronny/combit/mixin/AbstractSkeletonEntityMixin.java new file mode 100644 index 0000000..ad83311 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/AbstractSkeletonEntityMixin.java @@ -0,0 +1,22 @@ +package io.gitlab.jfronny.combit.mixin; + +import io.gitlab.jfronny.combit.CombitConfig; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.mob.AbstractSkeletonEntity; +import net.minecraft.entity.mob.HostileEntity; +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; + +@Mixin(AbstractSkeletonEntity.class) +public class AbstractSkeletonEntityMixin extends HostileEntity { + protected AbstractSkeletonEntityMixin(EntityType entityType, World world) { + super(entityType, world); + } + + @Redirect(method = "tickMovement()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/mob/AbstractSkeletonEntity;isAffectedByDaylight()Z")) + private boolean redirectAffectedByDaylight(AbstractSkeletonEntity instance) { + return CombitConfig.skeletonsBurn && isAffectedByDaylight(); + } +} diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/HostileEntityMixin.java b/src/main/java/io/gitlab/jfronny/combit/mixin/HostileEntityMixin.java new file mode 100644 index 0000000..3d3f041 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/HostileEntityMixin.java @@ -0,0 +1,50 @@ +package io.gitlab.jfronny.combit.mixin; + +import io.gitlab.jfronny.combit.CombitConfig; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.mob.CreeperEntity; +import net.minecraft.entity.mob.HostileEntity; +import net.minecraft.entity.mob.PathAwareEntity; +import net.minecraft.item.ItemStack; +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; + +@Mixin(HostileEntity.class) +public class HostileEntityMixin extends PathAwareEntity { + protected HostileEntityMixin(EntityType entityType, World world) { + super(entityType, world); + } + + @Inject(method = "tickMovement()V", at = @At("HEAD")) + private void creeperFireTick(CallbackInfo ci) { + if ((Object)this instanceof CreeperEntity ce) { + boolean shouldBurn = CombitConfig.creepersBurn && isAffectedByDaylight(); + if (shouldBurn) { + ItemStack itemStack = getEquippedStack(EquipmentSlot.HEAD); + if (!itemStack.isEmpty()) { + if (itemStack.isDamageable()) { + itemStack.setDamage(itemStack.getDamage() + this.random.nextInt(2)); + if (itemStack.getDamage() >= itemStack.getMaxDamage()) { + sendEquipmentBreakStatus(EquipmentSlot.HEAD); + equipStack(EquipmentSlot.HEAD, ItemStack.EMPTY); + } + } + + shouldBurn = false; + } + + if (shouldBurn) { + this.setOnFireFor(8); + } + } + + if (CombitConfig.creepersExplodeWhenBurning && isOnFire()) { + ce.ignite(); + } + } + } +} diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/ZombieEntityMixin.java b/src/main/java/io/gitlab/jfronny/combit/mixin/ZombieEntityMixin.java new file mode 100644 index 0000000..0304f33 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/ZombieEntityMixin.java @@ -0,0 +1,22 @@ +package io.gitlab.jfronny.combit.mixin; + +import io.gitlab.jfronny.combit.CombitConfig; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.mob.HostileEntity; +import net.minecraft.entity.mob.ZombieEntity; +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; + +@Mixin(ZombieEntity.class) +public class ZombieEntityMixin extends HostileEntity { + protected ZombieEntityMixin(EntityType entityType, World world) { + super(entityType, world); + } + + @Redirect(method = "tickMovement()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/mob/ZombieEntity;isAffectedByDaylight()Z")) + private boolean redirectAffectedByDaylight(ZombieEntity instance) { + return CombitConfig.skeletonsBurn && isAffectedByDaylight(); + } +} diff --git a/src/main/resources/assets/combit/lang/en_us.json b/src/main/resources/assets/combit/lang/en_us.json index 311e365..e52d018 100644 --- a/src/main/resources/assets/combit/lang/en_us.json +++ b/src/main/resources/assets/combit/lang/en_us.json @@ -18,6 +18,15 @@ "combit.jfconfig.excludePlayers": "Exclude Players", "combit.jfconfig.excludePlayers.tooltip": "Still apply I-Frames to players", + "combit.jfconfig.skeletonsBurn": "Skeletons Burn", + "combit.jfconfig.skeletonsBurn.tooltip": "Causes Skeletons to burn in sunlight", + "combit.jfconfig.zombiesBurn": "Zombies Burn", + "combit.jfconfig.zombiesBurn.tooltip": "Causes Zombies to burn in sunlight", + "combit.jfconfig.creepersBurn": "Creepers Burn", + "combit.jfconfig.creepersBurn.tooltip": "Causes Creepers to burn in sunlight", + "combit.jfconfig.creepersExplodeWhenBurning": "Creepers explode when burning", + "combit.jfconfig.creepersExplodeWhenBurning.tooltip": "Causes creepers to explode when on fire. Do not combine with creepersBurn!", + "combit.jfconfig.entityHealthFactor": "Entity Health Factor", "combit.jfconfig.entityHealthFactor.tooltip": "Factor to apply to the maximum health of entities", "combit.jfconfig.entityHealthBlacklist": "Entity Health Blacklist", @@ -47,6 +56,6 @@ "combit.jfconfig.debug.tooltip": "Enable Debug Logging", "combit.jfconfig.v189": "Minecraft 1.8.9", - "combit.jfconfig.noInvulnerability": "No Invulnerability", - "combit.jfconfig.disable": "Disable" + "combit.jfconfig.madness": "Pure Madness", + "combit.jfconfig.noInvulnerability": "No Invulnerability" } \ No newline at end of file diff --git a/src/main/resources/combit.mixins.json b/src/main/resources/combit.mixins.json index da6b255..5d785a2 100644 --- a/src/main/resources/combit.mixins.json +++ b/src/main/resources/combit.mixins.json @@ -4,12 +4,15 @@ "package": "io.gitlab.jfronny.combit.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "AbstractSkeletonEntityMixin", "EggEntityMixin", "FishingBobberEntityMixin", + "HostileEntityMixin", "LivingEntityMixin", "MiningToolItemMixin", "PlayerEntityMixin", - "SnowballEntityMixin" + "SnowballEntityMixin", + "ZombieEntityMixin" ], "client": [ "InGameHudMixin"