diff --git a/src/main/java/net/mcreator/superbwarfare/enchantment/FourthTimesCharm.java b/src/main/java/net/mcreator/superbwarfare/enchantment/FourthTimesCharm.java index 2a4c31309..09ef39f9b 100644 --- a/src/main/java/net/mcreator/superbwarfare/enchantment/FourthTimesCharm.java +++ b/src/main/java/net/mcreator/superbwarfare/enchantment/FourthTimesCharm.java @@ -35,6 +35,6 @@ public class FourthTimesCharm extends Enchantment { @Override public boolean canApplyAtEnchantingTable(ItemStack itemstack) { - return itemstack.is(ModTags.Items.CAN_SHOOT_BULLET) && !itemstack.is(ModItems.MINIGUN.get()); + return itemstack.is(ModTags.Items.CAN_SHOOT_BULLET) && !itemstack.is(ModItems.MINIGUN.get()) && !itemstack.is(ModTags.Items.SHOTGUN); } } diff --git a/src/main/java/net/mcreator/superbwarfare/entity/BocekArrowEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/BocekArrowEntity.java index 0a5f39e30..aff07da8b 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/BocekArrowEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/BocekArrowEntity.java @@ -37,6 +37,7 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier { public static final ItemStack PROJECTILE_ITEM = new ItemStack(Items.ARROW); private int monsterMultiplier = 0; + private float bypassArmorRate = 0.0f; public BocekArrowEntity(EntityType type, Level world) { super(type, world); @@ -55,6 +56,11 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier { super(ModEntities.BOCEK_ARROW.get(), world); } + public BocekArrowEntity bypassArmorRate(float bypassArmorRate) { + this.bypassArmorRate = bypassArmorRate; + return this; + } + @Override public Packet getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); @@ -141,18 +147,10 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier { } boolean hurt; - if (headshot) { - if (entity instanceof Monster monster) { - hurt = monster.hurt(ModDamageTypes.causeArrowInBrainDamage(this.level().registryAccess(), this, this.getOwner()), (float) i * 2 * damageMultiplier); - } else { - hurt = entity.hurt(ModDamageTypes.causeArrowInBrainDamage(this.level().registryAccess(), this, this.getOwner()), (float) i * 2); - } + if (entity instanceof Monster) { + hurt = performHurt(entity, i * damageMultiplier, headshot); } else { - if (entity instanceof Monster monster) { - hurt = monster.hurt(ModDamageTypes.causeArrowInKneeDamage(this.level().registryAccess(), this, this.getOwner()), (float) i * damageMultiplier); - } else { - hurt = entity.hurt(ModDamageTypes.causeArrowInKneeDamage(this.level().registryAccess(), this, this.getOwner()), (float) i); - } + hurt = performHurt(entity, i, headshot); } if (!hurt) { @@ -181,4 +179,20 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier { } } + private boolean performHurt(Entity entity, float damage, boolean headshot) { + float normalDamage = damage * Mth.clamp(1 - bypassArmorRate, 0, 1); + float absoluteDamage = damage * Mth.clamp(bypassArmorRate, 0, 1); + + entity.invulnerableTime = 0; + if (headshot) { + entity.hurt(ModDamageTypes.causeArrowInBrainDamage(this.level().registryAccess(), this, this.getOwner()), normalDamage * 2); + entity.invulnerableTime = 0; + return entity.hurt(ModDamageTypes.causeArrowInBrainAbsoluteDamage(this.level().registryAccess(), this, this.getOwner()), absoluteDamage * 2); + } else { + entity.hurt(ModDamageTypes.causeArrowInKneeDamage(this.level().registryAccess(), this, this.getOwner()), normalDamage); + entity.invulnerableTime = 0; + return entity.hurt(ModDamageTypes.causeArrowInKneeAbsoluteDamage(this.level().registryAccess(), this, this.getOwner()), absoluteDamage); + } + } + } diff --git a/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java index 778f28450..d1007e8c3 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/ProjectileEntity.java @@ -558,6 +558,10 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa return this.shooterId; } + public float getBypassArmorRate() { + return this.bypassArmorRate; + } + public void updateHeading() { double horizontalDistance = this.getDeltaMovement().horizontalDistance(); this.setYRot((float) (Mth.atan2(this.getDeltaMovement().x(), this.getDeltaMovement().z()) * (180D / Math.PI))); diff --git a/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java index 5c3243494..03660d1e4 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/LivingEventHandler.java @@ -286,8 +286,15 @@ public class LivingEventHandler { handleKillingTallyDamage(stack, event); } - if (DamageTypeTool.isGunHeadshotDamage(source)) { - handleFourthTimesCharm(stack); + if (source.getDirectEntity() instanceof ProjectileEntity projectile) { + if (EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.FOURTH_TIMES_CHARM.get(), stack) > 0) { + float bypassArmorRate = projectile.getBypassArmorRate(); + if (bypassArmorRate >= 1.0f && source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE)) { + handleFourthTimesCharm(stack); + } else if (source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) { + handleFourthTimesCharm(stack); + } + } } } diff --git a/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java b/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java index 9542b0bee..0311bb4aa 100644 --- a/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java +++ b/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java @@ -154,8 +154,9 @@ public class FireMessage { if (!level.isClientSide()) { int monsterMultiple = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.MONSTER_HUNTER.get(), stack); float damage = (float) (0.02 * stack.getOrCreateTag().getDouble("damage") * (1 + 0.05 * stack.getOrCreateTag().getInt("level"))); + float bypassArmorRate = (float) stack.getOrCreateTag().getDouble("BypassArmor"); - BocekArrowEntity arrow = new BocekArrowEntity(player, level, monsterMultiple); + BocekArrowEntity arrow = new BocekArrowEntity(player, level, monsterMultiple).bypassArmorRate(bypassArmorRate); arrow.setBaseDamage(damage); arrow.setKnockback(0); arrow.setSilent(true);