修改弓箭伤害和事不过四附魔的逻辑
This commit is contained in:
parent
ba4d1835dc
commit
bc64d6ed78
5 changed files with 41 additions and 15 deletions
|
@ -35,6 +35,6 @@ public class FourthTimesCharm extends Enchantment {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canApplyAtEnchantingTable(ItemStack itemstack) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier {
|
||||||
public static final ItemStack PROJECTILE_ITEM = new ItemStack(Items.ARROW);
|
public static final ItemStack PROJECTILE_ITEM = new ItemStack(Items.ARROW);
|
||||||
|
|
||||||
private int monsterMultiplier = 0;
|
private int monsterMultiplier = 0;
|
||||||
|
private float bypassArmorRate = 0.0f;
|
||||||
|
|
||||||
public BocekArrowEntity(EntityType<? extends BocekArrowEntity> type, Level world) {
|
public BocekArrowEntity(EntityType<? extends BocekArrowEntity> type, Level world) {
|
||||||
super(type, world);
|
super(type, world);
|
||||||
|
@ -55,6 +56,11 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier {
|
||||||
super(ModEntities.BOCEK_ARROW.get(), world);
|
super(ModEntities.BOCEK_ARROW.get(), world);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BocekArrowEntity bypassArmorRate(float bypassArmorRate) {
|
||||||
|
this.bypassArmorRate = bypassArmorRate;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Packet<ClientGamePacketListener> getAddEntityPacket() {
|
public Packet<ClientGamePacketListener> getAddEntityPacket() {
|
||||||
return NetworkHooks.getEntitySpawningPacket(this);
|
return NetworkHooks.getEntitySpawningPacket(this);
|
||||||
|
@ -141,18 +147,10 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier {
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hurt;
|
boolean hurt;
|
||||||
if (headshot) {
|
if (entity instanceof Monster) {
|
||||||
if (entity instanceof Monster monster) {
|
hurt = performHurt(entity, i * damageMultiplier, headshot);
|
||||||
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);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (entity instanceof Monster monster) {
|
hurt = performHurt(entity, i, headshot);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hurt) {
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -558,6 +558,10 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
||||||
return this.shooterId;
|
return this.shooterId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float getBypassArmorRate() {
|
||||||
|
return this.bypassArmorRate;
|
||||||
|
}
|
||||||
|
|
||||||
public void updateHeading() {
|
public void updateHeading() {
|
||||||
double horizontalDistance = this.getDeltaMovement().horizontalDistance();
|
double horizontalDistance = this.getDeltaMovement().horizontalDistance();
|
||||||
this.setYRot((float) (Mth.atan2(this.getDeltaMovement().x(), this.getDeltaMovement().z()) * (180D / Math.PI)));
|
this.setYRot((float) (Mth.atan2(this.getDeltaMovement().x(), this.getDeltaMovement().z()) * (180D / Math.PI)));
|
||||||
|
|
|
@ -286,8 +286,15 @@ public class LivingEventHandler {
|
||||||
handleKillingTallyDamage(stack, event);
|
handleKillingTallyDamage(stack, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DamageTypeTool.isGunHeadshotDamage(source)) {
|
if (source.getDirectEntity() instanceof ProjectileEntity projectile) {
|
||||||
handleFourthTimesCharm(stack);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,8 +154,9 @@ public class FireMessage {
|
||||||
if (!level.isClientSide()) {
|
if (!level.isClientSide()) {
|
||||||
int monsterMultiple = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.MONSTER_HUNTER.get(), stack);
|
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 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.setBaseDamage(damage);
|
||||||
arrow.setKnockback(0);
|
arrow.setKnockback(0);
|
||||||
arrow.setSilent(true);
|
arrow.setSilent(true);
|
||||||
|
|
Loading…
Add table
Reference in a new issue