波塞克添加曳光弹尾迹,适配银弹

This commit is contained in:
Atsuihsio 2024-08-09 17:21:27 +08:00
parent 08912da043
commit b5893e1f86
6 changed files with 54 additions and 10 deletions

View file

@ -15,6 +15,7 @@ import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.MobType;
import net.minecraft.world.entity.monster.Monster;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.ItemSupplier;
@ -41,6 +42,7 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier {
private int monsterMultiplier = 0;
private float bypassArmorRate = 0.0f;
private float undeadMultiple = 1.0f;
public BocekArrowEntity(EntityType<? extends BocekArrowEntity> type, Level world) {
super(type, world);
@ -64,6 +66,11 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier {
return this;
}
public BocekArrowEntity undeadMultiple(float undeadMultiple) {
this.undeadMultiple = undeadMultiple;
return this;
}
@Override
public Packet<ClientGamePacketListener> getAddEntityPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
@ -156,9 +163,9 @@ public class BocekArrowEntity extends AbstractArrow implements ItemSupplier {
boolean hurt;
if (entity instanceof Monster) {
hurt = performHurt(entity, i * damageMultiplier, headshot);
hurt = performHurt(entity, i * damageMultiplier * (entity instanceof LivingEntity living && living.getMobType() == MobType.UNDEAD? this.undeadMultiple : 1), headshot);
} else {
hurt = performHurt(entity, i, headshot);
hurt = performHurt(entity, i * (entity instanceof LivingEntity living && living.getMobType() == MobType.UNDEAD? this.undeadMultiple : 1), headshot);
}
if (!hurt) {

View file

@ -280,7 +280,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
double y = vec.y;
double z = vec.z;
this.setDeltaMovement(x - 0.02 * x, y - 0.02 * y - 0.05, z - 0.02 * z);
this.setDeltaMovement(vec.x, vec.y - 0.05000000074505806, vec.z);
this.tickCount++;
if (this.tickCount > 40) {

View file

@ -22,7 +22,8 @@ public class ProjectileEntityModel extends GeoModel<ProjectileEntity> {
Player player = Minecraft.getInstance().player;
if ((player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables())).zooming
|| player.getMainHandItem().is(ModItems.GLOCK_17.get())
|| player.getMainHandItem().is(ModItems.GLOCK_18.get())) {
|| player.getMainHandItem().is(ModItems.GLOCK_18.get())
|| player.getMainHandItem().is(ModItems.BOCEK.get())) {
return new ResourceLocation(ModUtils.MODID, "geo/projectile_entity.geo.json");
} else {
return new ResourceLocation(ModUtils.MODID, "geo/projectile_entity2.geo.json");

View file

@ -155,10 +155,45 @@ public class FireMessage {
Level level = player.level();
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 damage = (float) (0.04 * 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).bypassArmorRate(bypassArmorRate);
ProjectileEntity projectile = new ProjectileEntity(player.level())
.shooter(player)
.headShot(1)
.zoom(true)
.monsterMultiple(1);
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
int pLevel = PerkHelper.getItemPerkLevel(perk, stack);
bypassArmorRate = bypassArmorRate + ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get()? 0.05f * (pLevel - 1) : 0);
projectile.setRGB(ammoPerk.rgb);
if (ammoPerk.mobEffect.get() != null) {
projectile.effect(() -> new MobEffectInstance(ammoPerk.mobEffect.get(), 100, pLevel - 1));
}
}
float undeadMultiple = 1;
if (perk == ModPerks.SILVER_BULLET.get()) {
int level_ = PerkHelper.getItemPerkLevel(perk, stack);
undeadMultiple = 1.0f + 0.5f * level_;
} else if (perk == ModPerks.BEAST_BULLET.get()) {
projectile.beast();
}
projectile.bypassArmorRate(0);
projectile.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) (2 * power), 0);
projectile.damage(0);
player.level().addFreshEntity(projectile);
bypassArmorRate = Mth.clamp(bypassArmorRate, 0, 1);
BocekArrowEntity arrow = new BocekArrowEntity(player, level, monsterMultiple).bypassArmorRate(bypassArmorRate).undeadMultiple(undeadMultiple);
arrow.setBaseDamage(damage);
arrow.setKnockback(0);
arrow.setSilent(true);
@ -166,7 +201,7 @@ public class FireMessage {
arrow.pickup = AbstractArrow.Pickup.ALLOWED;
arrow.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ());
arrow.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) (4 * power), (float) 0.02);
arrow.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) (2 * power), 0);
level.addFreshEntity(arrow);
}
@ -212,7 +247,7 @@ public class FireMessage {
CompoundTag tag = heldItem.getOrCreateTag();
double damage;
float headshot = (float) tag.getDouble("headshot");
float velocity = 4 * (float) tag.getDouble("speed");
float velocity = 2 * (float) tag.getDouble("speed");
int monsterMultiple = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.MONSTER_HUNTER.get(), heldItem);
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
@ -248,7 +283,7 @@ public class FireMessage {
projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
damage = 0.008333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple");
damage = 2 * 0.008333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple");
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 2.5f);
projectile.damage((float) damage);
player.level().addFreshEntity(projectile);

View file

@ -83,7 +83,6 @@ public class TooltipTool {
double perkbypassArmorRate = 0;
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk == null) return;
if (perk instanceof AmmoPerk ammoPerk) {
int level = PerkHelper.getItemPerkLevel(perk, stack);

View file

@ -1,6 +1,8 @@
{
"zoom_speed": 1,
"zoom": 2,
"spread": 3,
"zoomSpread": 0,
"recoil_x": 0.005,
"recoil_y": 0.003,
"headshot": 1.5,