diff --git a/gradle.properties b/gradle.properties index d8a4d92..33b5a92 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,4 +8,4 @@ maven_group=io.gitlab.jfronny archives_base_name=combit fabric_version=0.45.0+1.18 -jfapi_version=2.2.0 \ No newline at end of file +jfapi_version=2.2.1 \ No newline at end of file diff --git a/src/main/java/io/gitlab/jfronny/combit/Combit.java b/src/main/java/io/gitlab/jfronny/combit/Combit.java index 82fe13a..bd44eb0 100644 --- a/src/main/java/io/gitlab/jfronny/combit/Combit.java +++ b/src/main/java/io/gitlab/jfronny/combit/Combit.java @@ -64,10 +64,13 @@ public class Combit implements ModInitializer { if (player.getEntityWorld().isClient) return ActionResult.PASS; - if (CombitConfig.debug) + if (CombitConfig.debug) { player.sendMessage(new LiteralText( - String.format("Entity attacked: %s", EntityType.getId(target.getType())) + target instanceof LivingEntity le + ? String.format("LivingEntity attacked: %s (%s/%s)", EntityType.getId(target.getType()), le.getHealth(), le.getMaxHealth()) + : String.format("Entity attacked: %s", EntityType.getId(target.getType())) ), false); + } float str = player.getAttackCooldownProgress(0); if (str <= CombitConfig.attackCancelThreshold) @@ -79,11 +82,10 @@ public class Combit implements ModInitializer { }); } - private String getId(Entity entity) { + public static String getId(Entity entity) { return EntityType.getId(entity.getType()).toString(); } - - private boolean idMatches(String entityId, Set matches) { + public static boolean idMatches(String entityId, Set matches) { for (String id : matches) { int starIndex = id.indexOf('*'); if (starIndex != -1) { diff --git a/src/main/java/io/gitlab/jfronny/combit/CombitConfig.java b/src/main/java/io/gitlab/jfronny/combit/CombitConfig.java index 14817d8..c008351 100644 --- a/src/main/java/io/gitlab/jfronny/combit/CombitConfig.java +++ b/src/main/java/io/gitlab/jfronny/combit/CombitConfig.java @@ -16,10 +16,14 @@ public class CombitConfig implements JfConfig { @Entry public static HashSet targetEntityWhitelist = null; @Entry public static Boolean excludeAllMobs = false; @Entry public static Boolean excludePlayers = false; - // Fluff + // 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; + // Debug @Entry public static Boolean debug = FabricLoader.getInstance().isDevelopmentEnvironment(); } diff --git a/src/main/java/io/gitlab/jfronny/combit/CombitConfigValidator.java b/src/main/java/io/gitlab/jfronny/combit/CombitConfigValidator.java index f9b9bd1..cdde54e 100644 --- a/src/main/java/io/gitlab/jfronny/combit/CombitConfigValidator.java +++ b/src/main/java/io/gitlab/jfronny/combit/CombitConfigValidator.java @@ -33,6 +33,11 @@ public class CombitConfigValidator implements UltraEarlyInit { CombitConfig.damageSourceWhitelist.add(DamageSource.OUT_OF_WORLD.getName()); CombitConfig.damageSourceWhitelist.add(DamageSource.SWEET_BERRY_BUSH.getName()); } + if (CombitConfig.entityHealthBlacklist == null) { + changed = true; + CombitConfig.entityHealthBlacklist = new HashSet<>(); + CombitConfig.entityHealthBlacklist.add("minecraft:player"); + } if (changed) { ConfigHolder.getInstance().getRegistered().get("combit").write(); } diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/LivingEntityMixin.java b/src/main/java/io/gitlab/jfronny/combit/mixin/LivingEntityMixin.java index 2b11e68..f639ee3 100644 --- a/src/main/java/io/gitlab/jfronny/combit/mixin/LivingEntityMixin.java +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/LivingEntityMixin.java @@ -1,17 +1,30 @@ package io.gitlab.jfronny.combit.mixin; +import io.gitlab.jfronny.combit.Combit; +import io.gitlab.jfronny.combit.CombitConfig; import io.gitlab.jfronny.combit.events.EntityHurtEvent; import io.gitlab.jfronny.combit.events.EntityKnockbackEvent; +import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeInstance; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.damage.DamageSource; import net.minecraft.util.ActionResult; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LivingEntity.class) -public class LivingEntityMixin { +public abstract class LivingEntityMixin { + @Shadow public abstract float getMaxHealth(); + @Shadow public abstract void setHealth(float health); + @Shadow @Nullable public abstract EntityAttributeInstance getAttributeInstance(EntityAttribute attribute); + @Inject(at = @At("TAIL"), method = "applyDamage", cancellable = true) private void onEntityHurt(final DamageSource source, final float amount, CallbackInfo ci) { ActionResult result = EntityHurtEvent.EVENT.invoker().hurtEntity((LivingEntity) (Object) this, source, amount); @@ -27,4 +40,14 @@ public class LivingEntityMixin { ci.cancel(); } } + + @Inject(at = @At("RETURN"), method = "(Lnet/minecraft/entity/EntityType;Lnet/minecraft/world/World;)V") + private void injectMaxHealth(EntityType entityType, World world, CallbackInfo ci) { + if (!Combit.idMatches(EntityType.getId(entityType).toString(), CombitConfig.entityHealthBlacklist)) { + EntityAttributeInstance att = getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH); + att.setBaseValue(att.getBaseValue() * CombitConfig.entityHealthFactor); + setHealth(getMaxHealth()); + } + else System.out.println("Skipping " + EntityType.getId(entityType).toString()); + } } diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java b/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java index 7c4ff33..a4c80c8 100644 --- a/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java @@ -18,18 +18,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MiningToolItem.class) public abstract class MiningToolItemMixin extends ToolItem { - @Mutable - @Shadow @Final private Multimap attributeModifiers; - - @Mutable - @Shadow @Final private float attackDamage; + @Shadow @Final @Mutable private Multimap attributeModifiers; + @Shadow @Final @Mutable private float attackDamage; public MiningToolItemMixin(ToolMaterial material, Settings settings) { super(material, settings); } @Inject(at = @At("RETURN"), method = "(FFLnet/minecraft/item/ToolMaterial;Lnet/minecraft/tag/Tag;Lnet/minecraft/item/Item$Settings;)V") - private void modifyAttackDamage(float attackDamage, float attackSpeed, ToolMaterial material, Tag effectiveBlocks, Settings settings, CallbackInfo ci) { + private void modifyAttackDamage(float attackDamage, float attackSpeed, ToolMaterial material, Tag effectiveBlocks, Settings settings, CallbackInfo ci) { double factor = ((MiningToolItem)(Object)this) instanceof AxeItem ? CombitConfig.axeAttackDamageFactor : CombitConfig.weaponAttackDamageFactor; if (factor >= 0) { this.attackDamage *= factor; diff --git a/src/main/resources/assets/combit/icon.png b/src/main/resources/assets/combit/icon.png new file mode 100644 index 0000000..f0ddd0b Binary files /dev/null and b/src/main/resources/assets/combit/icon.png differ diff --git a/src/main/resources/assets/combit/lang/en_us.json b/src/main/resources/assets/combit/lang/en_us.json index fe9c658..bc57965 100644 --- a/src/main/resources/assets/combit/lang/en_us.json +++ b/src/main/resources/assets/combit/lang/en_us.json @@ -18,6 +18,11 @@ "combit.jfconfig.excludePlayers": "Exclude Players", "combit.jfconfig.excludePlayers.tooltip": "Still apply I-Frames to players", + "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", + "combit.jfconfig.entityHealthBlacklist.tooltip": "Entities which should retain their original health (configure in JSON)", + "combit.jfconfig.cooldownProgressOverride": "Cooldown Progress Override", "combit.jfconfig.cooldownProgressOverride.tooltip": "Always set the cooldown of items to this value (negative to disable override)", "combit.jfconfig.cooldownProgressPerTickOverride": "Cooldown Progress/Tick Override", @@ -26,6 +31,7 @@ "combit.jfconfig.weaponAttackDamageFactor.tooltip": "Factor to multiply to the attack damage of weapons except axes", "combit.jfconfig.axeAttackDamageFactor": "Axe Attack Damage Factor", "combit.jfconfig.axeAttackDamageFactor.tooltip": "Factor to multiply to the attack damage of axes", + "combit.jfconfig.debug": "Debug", "combit.jfconfig.debug.tooltip": "Enable Debug Logging" } \ No newline at end of file diff --git a/src/main/resources/combit.mixins.json b/src/main/resources/combit.mixins.json index 66bcc56..6f8e6cd 100644 --- a/src/main/resources/combit.mixins.json +++ b/src/main/resources/combit.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "io.gitlab.jfronny.combit.mixin", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_17", "mixins": [ "LivingEntityMixin", "MiningToolItemMixin",