mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-15 07:01:36 +08:00
b62dfa0bf9
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 39ce5d3a SPIGOT-4399: ItemMeta.equals broken with AttributeModifiers CraftBukkit Changes:1cf8b5dc
SPIGOT-4400: Populators running on existing chunks116cb9a1
SPIGOT-4399: Add attribute modifier equality test5ee1c18a
SPIGOT-4398: Set ASM7_EXPERIMENTAL flag
104 lines
4.2 KiB
Diff
104 lines
4.2 KiB
Diff
From 72a1b85a6474a83316095da0c2cfe30cb1b365f5 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Mon, 17 Jun 2013 01:24:00 -0400
|
|
Subject: [PATCH] Entity Tracking Improvements
|
|
|
|
If any part of a Vehicle/Passenger relationship is visible to a player,
|
|
send all passenger/vehicles to the player in the chain.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 1474209a1e..5e5c241669 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -72,6 +72,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
public com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData; // Paper
|
|
protected CraftEntity bukkitEntity;
|
|
|
|
+ EntityTrackerEntry tracker; // Paper
|
|
public CraftEntity getBukkitEntity() {
|
|
if (bukkitEntity == null) {
|
|
bukkitEntity = CraftEntity.getEntity(world.getServer(), this);
|
|
diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
|
|
index 6120c63a38..a9d51641c1 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
|
|
@@ -49,6 +49,7 @@ public class EntityTrackerEntry {
|
|
// Paper end
|
|
|
|
public EntityTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
|
|
+ entity.tracker = this; // Paper
|
|
this.tracker = entity;
|
|
this.e = i;
|
|
this.f = j;
|
|
@@ -446,17 +447,59 @@ public class EntityTrackerEntry {
|
|
|
|
this.tracker.b(entityplayer);
|
|
entityplayer.d(this.tracker);
|
|
+ updatePassengers(entityplayer); // Paper
|
|
}
|
|
} else if (this.trackedPlayers.contains(entityplayer)) {
|
|
this.trackedPlayers.remove(entityplayer);
|
|
this.tracker.c(entityplayer);
|
|
entityplayer.c(this.tracker);
|
|
+ updatePassengers(entityplayer); // Paper
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
public boolean c(EntityPlayer entityplayer) {
|
|
+ // Paper start
|
|
+ if (tracker.isPassenger()) {
|
|
+ return isTrackedBy(tracker.getVehicle(), entityplayer);
|
|
+ } else if (hasPassengerInRange(tracker, entityplayer)) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ return isInRangeOfPlayer(entityplayer);
|
|
+ }
|
|
+ private static boolean hasPassengerInRange(Entity entity, EntityPlayer entityplayer) {
|
|
+ if (!entity.isVehicle()) {
|
|
+ return false;
|
|
+ }
|
|
+ for (Entity passenger : entity.passengers) {
|
|
+ if (passenger.tracker != null && passenger.tracker.isInRangeOfPlayer(entityplayer)) {
|
|
+ return true;
|
|
+ }
|
|
+ if (passenger.isVehicle()) {
|
|
+ if (hasPassengerInRange(passenger, entityplayer)) {
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return false;
|
|
+ }
|
|
+ private static boolean isTrackedBy(Entity entity, EntityPlayer entityplayer) {
|
|
+ return entity == entityplayer || entity.tracker != null && entity.tracker.trackedPlayers.contains(entityplayer);
|
|
+ }
|
|
+ private void updatePassengers(EntityPlayer player) {
|
|
+ if (tracker.isVehicle()) {
|
|
+ tracker.passengers.forEach((e) -> {
|
|
+ if (e.tracker != null) {
|
|
+ e.tracker.updatePlayer(player);
|
|
+ }
|
|
+ });
|
|
+ player.playerConnection.sendPacket(new PacketPlayOutMount(this.tracker));
|
|
+ }
|
|
+ }
|
|
+ private boolean isInRangeOfPlayer(EntityPlayer entityplayer) {
|
|
+ // Paper end
|
|
double d0 = entityplayer.locX - (double) this.xLoc / 4096.0D;
|
|
double d1 = entityplayer.locZ - (double) this.zLoc / 4096.0D;
|
|
int i = Math.min(this.e, (entityplayer.getViewDistance() - 1) * 16); // Paper - Use player view distance API
|
|
@@ -597,6 +640,7 @@ public class EntityTrackerEntry {
|
|
this.trackedPlayers.remove(entityplayer);
|
|
this.tracker.c(entityplayer);
|
|
entityplayer.c(this.tracker);
|
|
+ updatePassengers(entityplayer); // Paper
|
|
}
|
|
|
|
}
|
|
--
|
|
2.19.0
|
|
|