From baa4e216cdfc221065ae676ef28d2b9a282ed611 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Mon, 3 Jun 2024 16:20:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=AF=BC=E8=87=B4=E5=B4=A9=E6=BA=83=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../target/api/entity/ITargetEntity.java | 21 ------------ .../target/entity/ProjectileEntity.java | 33 ++++++++----------- .../target/network/TargetModVariables.java | 13 +------- .../mcreator/target/tools/HitboxHelper.java | 6 ++-- 4 files changed, 19 insertions(+), 54 deletions(-) delete mode 100644 src/main/java/net/mcreator/target/api/entity/ITargetEntity.java diff --git a/src/main/java/net/mcreator/target/api/entity/ITargetEntity.java b/src/main/java/net/mcreator/target/api/entity/ITargetEntity.java deleted file mode 100644 index 94781e7bd..000000000 --- a/src/main/java/net/mcreator/target/api/entity/ITargetEntity.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.mcreator.target.api.entity; - -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.phys.EntityHitResult; - -//from TACZ - -/** - * 用于进行一些并非 {@link LivingEntity} 但是可被子弹击中的特殊实体的处理 - */ -public interface ITargetEntity { - /** - * @param projectile 弹射物实体 - * @param result 击中实体的位置 - * @param source 伤害源类型 - * @param damage 伤害值 - */ - void onProjectileHit(Entity projectile, EntityHitResult result, DamageSource source, float damage); -} diff --git a/src/main/java/net/mcreator/target/entity/ProjectileEntity.java b/src/main/java/net/mcreator/target/entity/ProjectileEntity.java index accaa49b1..77055849c 100644 --- a/src/main/java/net/mcreator/target/entity/ProjectileEntity.java +++ b/src/main/java/net/mcreator/target/entity/ProjectileEntity.java @@ -1,10 +1,6 @@ package net.mcreator.target.entity; import net.mcreator.target.TargetMod; -import net.mcreator.target.api.entity.ITargetEntity; -import net.mcreator.target.tools.HitboxHelper; -import net.mcreator.target.headshot.BoundingBoxManager; -import net.mcreator.target.headshot.IHeadshotBox; import net.mcreator.target.init.TargetModDamageTypes; import net.mcreator.target.init.TargetModEntities; import net.mcreator.target.init.TargetModParticleTypes; @@ -12,6 +8,7 @@ import net.mcreator.target.init.TargetModSounds; import net.mcreator.target.network.message.ClientIndicatorMessage; import net.mcreator.target.network.message.PlayerGunKillMessage; import net.mcreator.target.tools.ExtendedEntityRayTraceResult; +import net.mcreator.target.tools.HitboxHelper; import net.mcreator.target.tools.ParticleTool; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -21,7 +18,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSoundPacket; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; @@ -42,12 +38,10 @@ import net.minecraftforge.entity.IEntityAdditionalSpawnData; import net.minecraftforge.entity.PartEntity; import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.PlayMessages; -import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; @@ -115,6 +109,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa if (result == null) continue; Vec3 hitPos = result.getHitPos(); + + if (hitPos == null) continue; + double distanceToHit = startVec.distanceTo(hitPos); if (distanceToHit < closestDistance) { hitVec = hitPos; @@ -146,23 +143,24 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa return hitEntities; } + /** + * From TaC-Z + */ @Nullable - @SuppressWarnings("unchecked") private EntityResult getHitResult(Entity entity, Vec3 startVec, Vec3 endVec) { double expandHeight = entity instanceof Player && !entity.isCrouching() ? 0.0625 : 0.0; AABB boundingBox = entity.getBoundingBox(); Vec3 velocity = new Vec3(entity.getX() - entity.xOld, entity.getY() - entity.yOld, entity.getZ() - entity.zOld); - // hitbox 延迟补偿。只有射击者是玩家(且被击中者也是玩家)才进行此类延迟补偿计算 + if (entity instanceof ServerPlayer player && this.shooter instanceof ServerPlayer serverPlayerOwner) { int ping = Mth.floor((serverPlayerOwner.latency / 1000.0) * 20.0 + 0.5); boundingBox = HitboxHelper.getBoundingBox(player, ping); velocity = HitboxHelper.getVelocity(player, ping); } - // 应用蹲伏导致的 hitbox 变形 boundingBox = boundingBox.expandTowards(0, expandHeight, 0); - // 根据速度一定程度地扩展 hitbox + boundingBox = boundingBox.expandTowards(velocity.x, velocity.y, velocity.z); - // 玩家 hitbox 修正,可以通过 Config 调整 + double playerHitboxOffset = 3; if (entity instanceof ServerPlayer) { if (entity.getVehicle() != null) { @@ -170,16 +168,13 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } boundingBox = boundingBox.move(velocity.multiply(playerHitboxOffset, playerHitboxOffset, playerHitboxOffset)); } - // 给所有实体统一应用的 Hitbox 偏移,其数值为实验得出的定值。 - if (entity.getVehicle() != null || entity instanceof ITargetEntity) { + + if (entity.getVehicle() != null) { boundingBox = boundingBox.move(velocity.multiply(-2.5, -2.5, -2.5)); } boundingBox = boundingBox.move(velocity.multiply(-5, -5, -5)); - // 计算射线与实体 boundingBox 的交点 Vec3 hitPos = boundingBox.clip(startVec, endVec).orElse(null); - /* Check for headshot */ - if (hitPos == null) { return null; } @@ -244,9 +239,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa this.setPosRaw(this.getX() + vec.x, this.getY() + vec.y, this.getZ() + vec.z); } - Vec3 vecp = this.getDeltaMovement(); + Vec3 movement = this.getDeltaMovement(); - this.setDeltaMovement(vecp.x, vecp.y - 0.1, vecp.z); + this.setDeltaMovement(movement.x, movement.y - 0.1, movement.z); this.tickCount++; if (this.tickCount > 30) { diff --git a/src/main/java/net/mcreator/target/network/TargetModVariables.java b/src/main/java/net/mcreator/target/network/TargetModVariables.java index 0bcd31f08..f276d56a2 100644 --- a/src/main/java/net/mcreator/target/network/TargetModVariables.java +++ b/src/main/java/net/mcreator/target/network/TargetModVariables.java @@ -90,9 +90,6 @@ public class TargetModVariables { clone.bowPullHold = original.bowPullHold; clone.bowPull = original.bowPull; clone.playerDoubleJump = original.playerDoubleJump; -// clone.hitIndicator = original.hitIndicator; -// clone.headIndicator = original.headIndicator; -// clone.killIndicator = original.killIndicator; if (event.getEntity().level().isClientSide()) return; @@ -305,9 +302,7 @@ public class TargetModVariables { nbt.putBoolean("bow_pull_hold", bowPullHold); nbt.putBoolean("bow_pull", bowPull); nbt.putBoolean("player_double_jump", playerDoubleJump); -// nbt.putInt("hit_indicator", hitIndicator); -// nbt.putInt("head_indicator", headIndicator); -// nbt.putInt("kill_indicator", killIndicator); + return nbt; } @@ -327,9 +322,6 @@ public class TargetModVariables { bowPullHold = nbt.getBoolean("bow_pull_hold"); bowPull = nbt.getBoolean("bow_pull"); playerDoubleJump = nbt.getBoolean("player_double_jump"); -// hitIndicator = nbt.getInt("hit_indicator"); -// headIndicator = nbt.getInt("head_indicator"); -// killIndicator = nbt.getInt("kill_indicator"); } } @@ -386,9 +378,6 @@ public class TargetModVariables { variables.bowPullHold = message.data.bowPullHold; variables.bowPull = message.data.bowPull; variables.playerDoubleJump = message.data.playerDoubleJump; -// variables.hitIndicator = message.data.hitIndicator; -// variables.headIndicator = message.data.headIndicator; -// variables.killIndicator = message.data.killIndicator; }); } } diff --git a/src/main/java/net/mcreator/target/tools/HitboxHelper.java b/src/main/java/net/mcreator/target/tools/HitboxHelper.java index 80cd85f1a..3ae41e1e7 100644 --- a/src/main/java/net/mcreator/target/tools/HitboxHelper.java +++ b/src/main/java/net/mcreator/target/tools/HitboxHelper.java @@ -8,7 +8,9 @@ import net.minecraft.world.phys.Vec3; import java.util.LinkedList; import java.util.WeakHashMap; -//from TACZ +/** + * From TAC-Z + */ public final class HitboxHelper { // 玩家位置缓存表 private static final WeakHashMap> PLAYER_POSITION = new WeakHashMap<>(); @@ -17,7 +19,7 @@ public final class HitboxHelper { // 玩家速度缓存表 private static final WeakHashMap> PLAYER_VELOCITY = new WeakHashMap<>(); // 命中箱缓存 Tick 上限 - private static final int SAVE_TICK = Mth.floor(1000 / 1000 * 20 + 0.5); + private static final int SAVE_TICK = Mth.floor(20 + 0.5); public static void onPlayerTick(Player player) { if (player.isSpectator()) {