修改弓箭伤害和事不过四附魔的逻辑

This commit is contained in:
17146 2024-08-04 00:03:48 +08:00
parent ba4d1835dc
commit bc64d6ed78
5 changed files with 41 additions and 15 deletions

View file

@ -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);
}
}

View file

@ -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<? extends BocekArrowEntity> 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<ClientGamePacketListener> 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);
if (entity instanceof Monster) {
hurt = performHurt(entity, i * damageMultiplier, headshot);
} else {
hurt = entity.hurt(ModDamageTypes.causeArrowInBrainDamage(this.level().registryAccess(), this, this.getOwner()), (float) i * 2);
}
} 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);
}
}
}

View file

@ -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)));

View file

@ -286,8 +286,15 @@ public class LivingEventHandler {
handleKillingTallyDamage(stack, event);
}
if (DamageTypeTool.isGunHeadshotDamage(source)) {
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);
}
}
}
}

View file

@ -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);