Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-11-15 12:30:06 +01:00
fe18b38aea
I misread the code and thought the code kept looping until the mob spawn cap was hit. Upon furthur review, this is not true, so this patch doesn't do anything sane.
104 Zeilen
4.0 KiB
Diff
104 Zeilen
4.0 KiB
Diff
From 918008d4358443f08f3da80724ad524c25c1f4eb 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 2374a35..02a1c25 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 38e88d8..a783ecb 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,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.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, this.f);
|
|
@@ -583,6 +626,7 @@ public class EntityTrackerEntry {
|
|
this.trackedPlayers.remove(entityplayer);
|
|
this.tracker.c(entityplayer);
|
|
entityplayer.c(this.tracker);
|
|
+ updatePassengers(entityplayer); // Paper
|
|
}
|
|
|
|
}
|
|
--
|
|
2.7.4 (Apple Git-66)
|
|
|