From c3541ee834aa20b5d431bf33dd49bd5f163690e9 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Fri, 10 May 2024 16:47:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0BEAST=E5=AD=90=E5=BC=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../target/entity/ProjectileEntity.java | 154 ++++++++++++------ .../target/event/GunEventHandler.java | 9 +- .../net/mcreator/target/item/gun/GunItem.java | 5 + .../procedures/BulletFireNormalProcedure.java | 20 ++- .../resources/assets/target/lang/en_us.json | 1 + .../resources/assets/target/lang/zh_cn.json | 1 + 6 files changed, 133 insertions(+), 57 deletions(-) diff --git a/src/main/java/net/mcreator/target/entity/ProjectileEntity.java b/src/main/java/net/mcreator/target/entity/ProjectileEntity.java index 88ea7567b..4e647d30e 100644 --- a/src/main/java/net/mcreator/target/entity/ProjectileEntity.java +++ b/src/main/java/net/mcreator/target/entity/ProjectileEntity.java @@ -12,6 +12,7 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -28,12 +29,14 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.entity.IEntityAdditionalSpawnData; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.function.BiFunction; @@ -48,27 +51,34 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa protected int shooterId; private float damage = 1f; private float headShot = 1f; + private boolean beast = false; public ProjectileEntity(EntityType p_i50159_1_, Level p_i50159_2_) { super(p_i50159_1_, p_i50159_2_); } - public ProjectileEntity(Level world, LivingEntity entity) { - super(TargetCustomModEntities.PROJECTILE.get(), world); - this.shooter = entity; + public ProjectileEntity(Level level) { + super(TargetCustomModEntities.PROJECTILE.get(), level); } - public ProjectileEntity(Level world, LivingEntity entity, float damage) { - super(TargetCustomModEntities.PROJECTILE.get(), world); - this.shooter = entity; - this.damage = damage; + public ProjectileEntity shooter(LivingEntity shooter) { + this.shooter = shooter; + return this; } - public ProjectileEntity(Level world, LivingEntity entity, float damage, float headShot) { - super(TargetCustomModEntities.PROJECTILE.get(), world); - this.shooter = entity; + public ProjectileEntity damage(float damage) { this.damage = damage; + return this; + } + + public ProjectileEntity headShot(float headShot) { this.headShot = headShot; + return this; + } + + public ProjectileEntity beast() { + this.beast = true; + return this; } @Nullable @@ -76,43 +86,52 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa Vec3 hitVec = null; Entity hitEntity = null; boolean headshot = false; - List entities = this.level().getEntities(this, this.getBoundingBox().expandTowards(this.getDeltaMovement()).inflate(1.0), PROJECTILE_TARGETS); + List entities = this.level() + .getEntities(this, + this.getBoundingBox() + .expandTowards(this.getDeltaMovement()) + .inflate(this.beast ? 3 : 1), + PROJECTILE_TARGETS + ); double closestDistance = Double.MAX_VALUE; for (Entity entity : entities) { - if (!entity.equals(this.shooter)) { - EntityResult result = this.getHitResult(entity, startVec, endVec); - if (result == null) { - continue; - } + if (entity.equals(this.shooter)) continue; - Vec3 hitPos = result.getHitPos(); - double distanceToHit = startVec.distanceTo(hitPos); - if (distanceToHit < closestDistance) { - hitVec = hitPos; - hitEntity = entity; - closestDistance = distanceToHit; - headshot = result.isHeadshot(); - } + EntityResult result = this.getHitResult(entity, startVec, endVec); + if (result == null) continue; + + Vec3 hitPos = result.getHitPos(); + double distanceToHit = startVec.distanceTo(hitPos); + if (distanceToHit < closestDistance) { + hitVec = hitPos; + hitEntity = entity; + closestDistance = distanceToHit; + headshot = result.isHeadshot(); } } return hitEntity != null ? new EntityResult(hitEntity, hitVec, headshot) : null; } -// @Nullable -// protected List findEntitiesOnPath(Vec3 startVec, Vec3 endVec) { -// List hitEntities = new ArrayList<>(); -// List entities = this.level().getEntities(this, this.getBoundingBox().expandTowards(this.getDeltaMovement()).inflate(1.0), PROJECTILE_TARGETS); -// for (Entity entity : entities) { -// if (!entity.equals(this.shooter)) { -// EntityResult result = this.getHitResult(entity, startVec, endVec); -// if (result == null) -// continue; -// hitEntities.add(result); -// } -// } -// return hitEntities; -// } + @Nullable + protected List findEntitiesOnPath(Vec3 startVec, Vec3 endVec) { + List hitEntities = new ArrayList<>(); + List entities = this.level().getEntities( + this, + this.getBoundingBox() + .expandTowards(this.getDeltaMovement()) + .inflate(this.beast ? 3 : 1), + PROJECTILE_TARGETS + ); + for (Entity entity : entities) { + if (!entity.equals(this.shooter)) { + EntityResult result = this.getHitResult(entity, startVec, endVec); + if (result == null) continue; + hitEntities.add(result); + } + } + return hitEntities; + } @Nullable @SuppressWarnings("unchecked") @@ -120,6 +139,10 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa double expandHeight = entity instanceof Player && !entity.isCrouching() ? 0.0625 : 0.0; AABB boundingBox = entity.getBoundingBox(); + if (this.beast) { + boundingBox = boundingBox.inflate(3); + } + // 延迟补偿 if (entity instanceof ServerPlayer && this.shooter != null) { int ping = (int) Math.floor((((ServerPlayer) this.shooter).latency / 1000.0) * 20.0 + 4.0); @@ -186,9 +209,17 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa endVec = result.getLocation(); } - EntityResult entityResult = this.findEntityOnPath(startVec, endVec); + List entityResults = new ArrayList<>(); - if (entityResult != null) { + if (this.beast) { + var temp = findEntitiesOnPath(startVec, endVec); + if (temp != null) entityResults.addAll(temp); + } else { + var temp = this.findEntityOnPath(startVec, endVec); + if (temp != null) entityResults.add(temp); + } + + for (var entityResult : entityResults) { result = new ExtendedEntityRayTraceResult(entityResult); if (((EntityHitResult) result).getEntity() instanceof Player player) { if (this.shooter instanceof Player && !((Player) this.shooter).canHarmPlayer(player)) { @@ -198,7 +229,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa if (result != null) { this.onHit(result); } - } else { + } + if (entityResults.isEmpty()) { this.onHit(result); } @@ -268,41 +300,57 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } protected void onHitEntity(Entity entity, boolean headshot) { - if (headshot) { - if (entity == null) - return; + if (entity == null) return; + if (beast && entity instanceof LivingEntity living) { + if (living.isDeadOrDying()) return; + if (living instanceof ServerPlayer victim) { + living.setHealth(0); + living.level().players().forEach( + p -> p.sendSystemMessage( + Component.translatable("death.attack.beast_gun", + victim.getDisplayName(), + shooter.getDisplayName() + ) + ) + ); + } else { + living.setHealth(0); + living.level().broadcastEntityEvent(living, (byte) 60); + living.remove(Entity.RemovalReason.KILLED); + living.gameEvent(GameEvent.ENTITY_DIE); + } + ((ServerLevel) this.level()).sendParticles(ParticleTypes.DAMAGE_INDICATOR, living.getX(), living.getY() + .5, living.getZ(), 1000, .4, .7, .4, 0); + this.discard(); + return; + } + + if (headshot) { if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer player) { var holder = Holder.direct(TargetModSounds.HEADSHOT.get()); player.connection.send(new ClientboundSoundPacket(holder, SoundSource.PLAYERS, player.getX(), player.getY(), player.getZ(), 1f, 1f, player.level().random.nextLong())); } - double i = 25; shooter.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { - capability.headind = i; + capability.headind = 25; capability.syncPlayerVariables(shooter); }); entity.hurt(TargetModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this.shooter), this.damage * this.headShot); - this.discard(); } else { - if (entity == null) - return; - if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer player) { var holder = Holder.direct(TargetModSounds.INDICATION.get()); player.connection.send(new ClientboundSoundPacket(holder, SoundSource.PLAYERS, player.getX(), player.getY(), player.getZ(), 1f, 1f, player.level().random.nextLong())); } - double i = 25; shooter.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { - capability.hitind = i; + capability.hitind = 25; capability.syncPlayerVariables(shooter); }); entity.hurt(TargetModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this.shooter), this.damage); - this.discard(); } + this.discard(); } public void setDamage(float damage) { diff --git a/src/main/java/net/mcreator/target/event/GunEventHandler.java b/src/main/java/net/mcreator/target/event/GunEventHandler.java index 1ba636efa..ca0ca4211 100644 --- a/src/main/java/net/mcreator/target/event/GunEventHandler.java +++ b/src/main/java/net/mcreator/target/event/GunEventHandler.java @@ -236,7 +236,14 @@ public class GunEventHandler { float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("adddamage")) * (float) heldItem.getOrCreateTag().getDouble("damageadd"); - ProjectileEntity projectile = new ProjectileEntity(player.level(), player, damage, headshot); + ProjectileEntity projectile = new ProjectileEntity(player.level()) + .shooter(player) + .damage(damage) + .headShot(headshot); + + if (heldItem.getOrCreateTag().getBoolean("beast")) { + projectile.beast(); + } projectile.setPos((player.getX() + (-0.5) * player.getLookAngle().x), (player.getEyeY() - 0.1 + (-0.5) * player.getLookAngle().y), (player.getZ() + (-0.5) * player.getLookAngle().z)); projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, 1 * (float) heldItem.getOrCreateTag().getDouble("velocity"), diff --git a/src/main/java/net/mcreator/target/item/gun/GunItem.java b/src/main/java/net/mcreator/target/item/gun/GunItem.java index c5e2f6292..7011824a7 100644 --- a/src/main/java/net/mcreator/target/item/gun/GunItem.java +++ b/src/main/java/net/mcreator/target/item/gun/GunItem.java @@ -29,4 +29,9 @@ public class GunItem extends Item { } GunsTool.pvpModeCheck(itemstack, level); } + + @Override + public boolean isFoil(ItemStack stack) { + return stack.getOrCreateTag().getBoolean("beast"); + } } diff --git a/src/main/java/net/mcreator/target/procedures/BulletFireNormalProcedure.java b/src/main/java/net/mcreator/target/procedures/BulletFireNormalProcedure.java index e8b44a0c8..02132b796 100644 --- a/src/main/java/net/mcreator/target/procedures/BulletFireNormalProcedure.java +++ b/src/main/java/net/mcreator/target/procedures/BulletFireNormalProcedure.java @@ -24,9 +24,16 @@ public class BulletFireNormalProcedure { if (heldItem.getItem() == TargetModItems.BOCEK.get()) { - damage = 0.008333333f * (float) heldItem.getOrCreateTag().getDouble("damage") * (float) heldItem.getOrCreateTag().getDouble("speed") * (float) heldItem.getOrCreateTag().getDouble("damageadd"); + damage = 0.008333333f * (float) heldItem.getOrCreateTag().getDouble("damage") * (float) heldItem.getOrCreateTag().getDouble("speed") * (float) heldItem.getOrCreateTag().getDouble("damageadd"); - ProjectileEntity projectile = new ProjectileEntity(player.level(), player, damage, headshot); + ProjectileEntity projectile = new ProjectileEntity(player.level()) + .shooter(player) + .damage(damage) + .headShot(headshot); + + if (heldItem.getOrCreateTag().getBoolean("beast")) { + projectile.beast(); + } projectile.setPos((player.getX() + (-0.5) * player.getLookAngle().x), (player.getEyeY() - 0.1 + (-0.5) * player.getLookAngle().y), (player.getZ() + (-0.5) * player.getLookAngle().z)); projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, 1 * velocity, 2.5f); @@ -36,7 +43,14 @@ public class BulletFireNormalProcedure { damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("adddamage")) * (float) heldItem.getOrCreateTag().getDouble("damageadd"); - ProjectileEntity projectile = new ProjectileEntity(player.level(), player, damage, headshot); + ProjectileEntity projectile = new ProjectileEntity(player.level()) + .shooter(player) + .damage(damage) + .headShot(headshot); + + if (heldItem.getOrCreateTag().getBoolean("beast")) { + projectile.beast(); + } projectile.setPos((player.getX() + (-0.5) * player.getLookAngle().x), (player.getEyeY() - 0.1 + (-0.5) * player.getLookAngle().y), (player.getZ() + (-0.5) * player.getLookAngle().z)); projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, 1 * (float) heldItem.getOrCreateTag().getDouble("velocity"), diff --git a/src/main/resources/assets/target/lang/en_us.json b/src/main/resources/assets/target/lang/en_us.json index 89f5e284b..20807bbb9 100644 --- a/src/main/resources/assets/target/lang/en_us.json +++ b/src/main/resources/assets/target/lang/en_us.json @@ -150,6 +150,7 @@ "death.attack.arrow_in_brain": "%2$s's arrow shot into %1$s's brain", "death.attack.arrow_in_brain.item": "An arrow shot into %1$s's brain,murderer is %2$s used %3$s", "death.attack.arrow_in_brain.player": "An arrow shot into %1$s's brain whilst trying to escape %2$s", + "death.attack.beast_gun": "%1$s was killed by %2$s using BEAST guns", "Shell Estimated Range": "Estimated Range:", "gui.target.mortar_gui.label_proc_range": "Estimated Range:", diff --git a/src/main/resources/assets/target/lang/zh_cn.json b/src/main/resources/assets/target/lang/zh_cn.json index 1a15ac64f..669e88349 100644 --- a/src/main/resources/assets/target/lang/zh_cn.json +++ b/src/main/resources/assets/target/lang/zh_cn.json @@ -150,6 +150,7 @@ "death.attack.arrow_in_brain": "%1$s的脑子进矢了,凶手是%2$s", "death.attack.arrow_in_brain.item": "%1$s的脑子进矢了,凶手%2$s使用了%3$s", "death.attack.arrow_in_brain.player": "%1$s在逃离%2$s的时候脑子进矢了", + "death.attack.beast_gun": "%1$s被%2$s用BEAST枪械臭炸了", "Shell Estimated Range": "炮弹预估射程:", "gui.target.mortar_gui.label_proc_range": "预估射程:",