From 750a4590ce40a8e33bf7ca96b68daa1ab446c374 Mon Sep 17 00:00:00 2001 From: TwoLeggedCat <80929284+TwoLeggedCat@users.noreply.github.com> Date: Sat, 29 May 2021 14:33:25 -0500 Subject: [PATCH] Line Of Sight Changes --- .../world/entity/LivingEntity.java.patch | 96 +++++++++++-------- .../craftbukkit/CraftRegionAccessor.java | 16 ++++ .../craftbukkit/entity/CraftLivingEntity.java | 17 ++++ 3 files changed, 89 insertions(+), 40 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch index a8772a66c8..71db951715 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch @@ -17,10 +17,11 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.item.AxeItem; -@@ -136,6 +137,30 @@ +@@ -135,6 +136,30 @@ + import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Scoreboard; import org.slf4j.Logger; - ++ +// CraftBukkit start +import java.util.ArrayList; +import java.util.HashSet; @@ -44,10 +45,9 @@ +import org.bukkit.event.entity.EntityTeleportEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; +// CraftBukkit end -+ + public abstract class LivingEntity extends Entity implements Attackable { - private static final Logger LOGGER = LogUtils.getLogger(); @@ -174,7 +199,7 @@ public static final float DEFAULT_BABY_SCALE = 0.5F; public static final String ATTRIBUTES_FIELD = "attributes"; @@ -265,10 +265,14 @@ boolean flag = scoreboardteam != null && scoreboard.addPlayerToTeam(this.getStringUUID(), scoreboardteam); if (!flag) { -@@ -819,9 +906,32 @@ - - } +@@ -815,13 +902,36 @@ + if (nbt.contains("Brain", 10)) { + this.brain = this.makeBrain(new Dynamic(NbtOps.INSTANCE, nbt.get("Brain"))); ++ } ++ ++ } ++ + // CraftBukkit start + private boolean isTickingEffects = false; + private List effectsToProcess = Lists.newArrayList(); @@ -282,15 +286,15 @@ + private ProcessableEffect(MobEffectInstance effect, EntityPotionEffectEvent.Cause cause) { + this.effect = effect; + this.cause = cause; -+ } -+ + } + + private ProcessableEffect(Holder type, EntityPotionEffectEvent.Cause cause) { + this.type = type; + this.cause = cause; + } -+ } + } + // CraftBukkit end -+ + protected void tickEffects() { Iterator> iterator = this.activeEffects.keySet().iterator(); @@ -443,7 +447,7 @@ return flag; } } -@@ -1031,13 +1208,39 @@ +@@ -1031,14 +1208,40 @@ return this.getType().is(EntityTypeTags.INVERTED_HEALING_AND_HARM); } @@ -478,13 +482,14 @@ - MobEffectInstance mobeffect = this.removeEffectNoUpdate(effect); + return this.removeEffect(effect, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN); + } -+ + + public boolean removeEffect(Holder holder, EntityPotionEffectEvent.Cause cause) { + MobEffectInstance mobeffect = this.removeEffectNoUpdate(holder, cause); + // CraftBukkit end - ++ if (mobeffect != null) { this.onEffectsRemoved(List.of(mobeffect)); + return true; @@ -1142,20 +1345,65 @@ } @@ -575,7 +580,7 @@ this.hurtCurrentlyUsedShield(amount); f2 = amount; amount = 0.0F; -@@ -1202,14 +1451,25 @@ +@@ -1202,15 +1451,26 @@ flag = true; } @@ -591,7 +596,7 @@ this.hurtHelmet(source, amount); amount *= 0.75F; } -+ + + // CraftBukkit start + EntityDamageEvent event = this.handleEntityDamage(source, amount); + amount = 0; @@ -600,9 +605,10 @@ + amount += (float) event.getDamage(DamageModifier.FREEZING); + amount += (float) event.getDamage(DamageModifier.HARD_HAT); + // CraftBukkit end - ++ this.walkAnimation.setSpeed(1.5F); if (Float.isNaN(amount) || Float.isInfinite(amount)) { + amount = Float.MAX_VALUE; @@ -1218,18 +1478,27 @@ boolean flag1 = true; @@ -1046,7 +1052,7 @@ + }; + float freezingModifier = freezing.apply((double) f).floatValue(); + f += freezingModifier; - ++ + com.google.common.base.Function hardHat = new com.google.common.base.Function() { + @Override + public Double apply(Double f) { @@ -1144,7 +1150,7 @@ + } + } + } -+ + + // Apply damage to helmet + if (damagesource.is(DamageTypeTags.DAMAGES_HELMET) && !this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { + this.hurtHelmet(damagesource, f); @@ -1346,9 +1352,10 @@ } - ItemStack itemstack2 = itemstack1; -+ ItemStack itemstack2 = itemstack1; final ItemStack oldEquipment = itemstack2; // Paper - PlayerArmorChangeEvent - obfhelper - +- - itemstack = this.getItemBySlot(enumitemslot); ++ ItemStack itemstack2 = itemstack1; final ItemStack oldEquipment = itemstack2; // Paper - PlayerArmorChangeEvent - obfhelper ++ + itemstack = this.getItemBySlot(enumitemslot); final ItemStack newEquipment = itemstack;// Paper - PlayerArmorChangeEvent - obfhelper if (this.equipmentHasChanged(itemstack2, itemstack)) { + // Paper start - PlayerArmorChangeEvent @@ -1474,7 +1481,17 @@ this.dismountVehicle(entity); } -@@ -3305,15 +3934,29 @@ +@@ -3284,7 +3913,8 @@ + Vec3 vec3d = new Vec3(this.getX(), this.getEyeY(), this.getZ()); + Vec3 vec3d1 = new Vec3(entity.getX(), entityY, entity.getZ()); + +- return vec3d1.distanceTo(vec3d) > 128.0D ? false : this.level().clip(new ClipContext(vec3d, vec3d1, shapeType, fluidHandling, this)).getType() == HitResult.Type.MISS; ++ // Paper - diff on change - used in CraftLivingEntity#hasLineOfSight(Location) and CraftWorld#lineOfSightExists ++ return vec3d1.distanceToSqr(vec3d) > 128.0D * 128.0D ? false : this.level().clip(new ClipContext(vec3d, vec3d1, shapeType, fluidHandling, this)).getType() == HitResult.Type.MISS; // Paper - Perf: Use distance squared + } + } + +@@ -3305,15 +3935,29 @@ @Override public boolean isPickable() { @@ -1506,7 +1523,7 @@ public float getYHeadRot() { return this.yHeadRot; } -@@ -3342,7 +3985,7 @@ +@@ -3342,7 +3986,7 @@ } public final void setAbsorptionAmount(float absorptionAmount) { @@ -1515,7 +1532,7 @@ } protected void internalSetAbsorptionAmount(float absorptionAmount) { -@@ -3410,9 +4053,14 @@ +@@ -3410,9 +4054,14 @@ } public void startUsingItem(InteractionHand hand) { @@ -1531,7 +1548,7 @@ this.useItem = itemstack; this.useItemRemaining = itemstack.getUseDuration(this); if (!this.level().isClientSide) { -@@ -3483,13 +4131,50 @@ +@@ -3483,13 +4132,50 @@ this.releaseUsingItem(); } else { if (!this.useItem.isEmpty() && this.isUsingItem()) { @@ -1545,7 +1562,7 @@ + org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(enumhand); + event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem, hand); // Paper + this.level().getCraftServer().getPluginManager().callEvent(event); -+ + + if (event.isCancelled()) { + // Update client + Consumable consumable = this.useItem.get(DataComponents.CONSUMABLE); @@ -1569,7 +1586,7 @@ + } + // Paper end + // CraftBukkit end - ++ if (itemstack != this.useItem) { this.setItemInHand(enumhand, itemstack); } @@ -1583,7 +1600,7 @@ } } -@@ -3544,12 +4229,69 @@ +@@ -3544,11 +4230,68 @@ if (this.isUsingItem() && !this.useItem.isEmpty()) { Item item = this.useItem.getItem(); @@ -1592,8 +1609,8 @@ } else { return null; } - } - ++ } ++ + // Paper start - Make shield blocking delay configurable + public HitResult getRayTrace(int maxDistance, ClipContext.Fluid fluidCollisionOption) { + if (maxDistance < 1 || maxDistance > 120) { @@ -1648,13 +1665,12 @@ + + public void setShieldBlockingDelay(int shieldBlockingDelay) { + this.shieldBlockingDelay = shieldBlockingDelay; -+ } + } + // Paper end - Make shield blocking delay configurable -+ + public boolean isSuppressingSlidingDownLadder() { return this.isShiftKeyDown(); - } -@@ -3568,12 +4310,18 @@ +@@ -3568,12 +4311,18 @@ } public boolean randomTeleport(double x, double y, double z, boolean particleEffects) { @@ -1675,7 +1691,7 @@ Level world = this.level(); if (world.hasChunkAt(blockposition)) { -@@ -3592,18 +4340,43 @@ +@@ -3592,18 +4341,43 @@ } if (flag2) { @@ -1723,7 +1739,7 @@ world.broadcastEntityEvent(this, (byte) 46); } -@@ -3613,7 +4386,7 @@ +@@ -3613,7 +4387,7 @@ entitycreature.getNavigation().stop(); } @@ -1732,7 +1748,7 @@ } } -@@ -3706,7 +4479,7 @@ +@@ -3706,7 +4480,7 @@ } public void stopSleeping() { @@ -1741,7 +1757,7 @@ Level world = this.level(); java.util.Objects.requireNonNull(world); -@@ -3718,9 +4491,9 @@ +@@ -3718,9 +4492,9 @@ this.level().setBlock(blockposition, (BlockState) iblockdata.setValue(BedBlock.OCCUPIED, false), 3); Vec3 vec3d = (Vec3) BedBlock.findStandUpPosition(this.getType(), this.level(), blockposition, enumdirection, this.getYRot()).orElseGet(() -> { @@ -1753,7 +1769,7 @@ }); Vec3 vec3d1 = Vec3.atBottomCenterOf(blockposition).subtract(vec3d).normalize(); float f = (float) Mth.wrapDegrees(Mth.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D); -@@ -3740,7 +4513,7 @@ +@@ -3740,7 +4514,7 @@ @Nullable public Direction getBedOrientation() { @@ -1762,7 +1778,7 @@ return blockposition != null ? BedBlock.getBedOrientation(this.level(), blockposition) : null; } -@@ -3905,7 +4678,7 @@ +@@ -3905,7 +4679,7 @@ public float maxUpStep() { float f = (float) this.getAttributeValue(Attributes.STEP_HEIGHT); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java index a070b2a83e..ca35e93239 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java @@ -526,5 +526,21 @@ public abstract class CraftRegionAccessor implements RegionAccessor { public org.bukkit.NamespacedKey getKey() { return org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(this.getHandle().getLevel().dimension().location()); } + + public boolean lineOfSightExists(Location from, Location to) { + Preconditions.checkArgument(from != null, "from parameter in lineOfSightExists cannot be null"); + Preconditions.checkArgument(to != null, "to parameter in lineOfSightExists cannot be null"); + if (from.getWorld() != to.getWorld()) { + return false; + } + + net.minecraft.world.phys.Vec3 start = new net.minecraft.world.phys.Vec3(from.getX(), from.getY(), from.getZ()); + net.minecraft.world.phys.Vec3 end = new net.minecraft.world.phys.Vec3(to.getX(), to.getY(), to.getZ()); + if (end.distanceToSqr(start) > 128D * 128D) { + return false; // Return early if the distance is greater than 128 blocks + } + + return this.getHandle().clip(new net.minecraft.world.level.ClipContext(start, end, net.minecraft.world.level.ClipContext.Block.COLLIDER, net.minecraft.world.level.ClipContext.Fluid.NONE, net.minecraft.world.phys.shapes.CollisionContext.empty())).getType() == net.minecraft.world.phys.HitResult.Type.MISS; + } // Paper end } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index a4be1eea35..a4a30f52f4 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -643,6 +643,23 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { return this.getHandle().hasLineOfSight(((CraftEntity) other).getHandle()); } + // Paper start + @Override + public boolean hasLineOfSight(Location loc) { + if (this.getHandle().level() != ((CraftWorld) loc.getWorld()).getHandle()) { + return false; + } + + net.minecraft.world.phys.Vec3 start = new net.minecraft.world.phys.Vec3(this.getHandle().getX(), this.getHandle().getEyeY(), this.getHandle().getZ()); + net.minecraft.world.phys.Vec3 end = new net.minecraft.world.phys.Vec3(loc.getX(), loc.getY(), loc.getZ()); + if (end.distanceToSqr(start) > 128D * 128D) { + return false; // Return early if the distance is greater than 128 blocks + } + + return this.getHandle().level().clipDirect(start, end, net.minecraft.world.phys.shapes.CollisionContext.of(this.getHandle())) == net.minecraft.world.phys.HitResult.Type.MISS; + } + // Paper end + @Override public boolean getRemoveWhenFarAway() { return this.getHandle() instanceof Mob && !((Mob) this.getHandle()).isPersistenceRequired();