mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 07:20:24 +01:00
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.
This commit is contained in:
parent
3f0e24eaf3
commit
53abbfdc4c
1 changed files with 99 additions and 0 deletions
|
@ -0,0 +1,99 @@
|
|||
From bdd0f358b6e4a313c664157ba9c4853e64027cff 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 3a40897..0a4de90 100644
|
||||
--- a/src/main/java/net/minecraft/server/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/server/Entity.java
|
||||
@@ -51,6 +51,7 @@ public abstract class Entity implements ICommandListener {
|
||||
|
||||
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 a012d20..a79e97e 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;
|
||||
@@ -440,17 +441,55 @@ 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.tracker != null && entity.tracker.trackedPlayers.contains(entityplayer);
|
||||
+ }
|
||||
+ private void updatePassengers(EntityPlayer player) {
|
||||
+ if (tracker.isVehicle()) {
|
||||
+ tracker.passengers.forEach((e) -> 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, this.f);
|
||||
@@ -590,6 +629,7 @@ public class EntityTrackerEntry {
|
||||
this.trackedPlayers.remove(entityplayer);
|
||||
this.tracker.c(entityplayer);
|
||||
entityplayer.c(this.tracker);
|
||||
+ updatePassengers(entityplayer); // Paper
|
||||
}
|
||||
|
||||
}
|
||||
--
|
||||
2.8.2
|
||||
|
Loading…
Reference in a new issue