Skip to content

Commit 17dbf74

Browse files
committed
Improve CraftEntity and CraftPlayer equals
1 parent 6483ecb commit 17dbf74

File tree

44 files changed

+221
-164
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+221
-164
lines changed

patches/server/0195-Fix-CraftEntity-hashCode.patch

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Nassim Jahnke <nassim@njahnke.dev>
3+
Date: Sat, 9 Nov 2024 21:10:45 +0100
4+
Subject: [PATCH] Improve CraftEntity and CraftPlayer equals and hashCode
5+
6+
Make sure the hash code does not change and also remove outdated
7+
equals logic from CraftPlayer. Long-term, the override there should
8+
be entirely removed, but this is good enough for now.
9+
10+
Replacing some getHandle method calls with direct field access will
11+
also reduce overhead from casts that the overridden methods come with,
12+
at least until those are changed later on as well.
13+
14+
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
15+
index 0480fbeffd19011d3cd63021225f376c464b480c..d6241e2db362de034ae610694c49c1883ffabd07 100644
16+
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
17+
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
18+
@@ -437,7 +437,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
19+
20+
@Override
21+
public UUID getUniqueId() {
22+
- return this.getHandle().getUUID();
23+
+ return this.entity.getUUID();
24+
}
25+
26+
@Override
27+
@@ -496,21 +496,17 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
28+
29+
@Override
30+
public boolean equals(Object obj) {
31+
- if (obj == null) {
32+
- return false;
33+
- }
34+
- if (this.getClass() != obj.getClass()) {
35+
- return false;
36+
- }
37+
+ if (this == obj) return true;
38+
+ if (obj == null || getClass() != obj.getClass()) return false;
39+
+
40+
final CraftEntity other = (CraftEntity) obj;
41+
- return (this.getEntityId() == other.getEntityId());
42+
+ return this.entity == other.entity; // There should never be duplicate entities with differing references
43+
}
44+
45+
@Override
46+
public int hashCode() {
47+
- int hash = 7;
48+
- hash = 29 * hash + this.getEntityId();
49+
- return hash;
50+
+ // The UUID and thus hash code should never change (unlike the entity id)
51+
+ return this.getUniqueId().hashCode();
52+
}
53+
54+
@Override
55+
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
56+
index a4333eae8aa2ae3fefdc8a765a4434c36e123b12..b3f01ea79ecbce0130bbf3315a4076661affd1ae 100644
57+
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
58+
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
59+
@@ -626,22 +626,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
60+
61+
@Override
62+
public boolean equals(Object obj) {
63+
- if (!(obj instanceof OfflinePlayer)) {
64+
- return false;
65+
- }
66+
- OfflinePlayer other = (OfflinePlayer) obj;
67+
- if ((this.getUniqueId() == null) || (other.getUniqueId() == null)) {
68+
- return false;
69+
- }
70+
-
71+
- boolean uuidEquals = this.getUniqueId().equals(other.getUniqueId());
72+
- boolean idEquals = true;
73+
-
74+
- if (other instanceof CraftPlayer) {
75+
- idEquals = this.getEntityId() == ((CraftPlayer) other).getEntityId();
76+
- }
77+
-
78+
- return uuidEquals && idEquals;
79+
+ // Long-term, this should just use the super equals... for now, check the UUID
80+
+ if (obj == this) return true;
81+
+ if (!(obj instanceof OfflinePlayer other)) return false;
82+
+ return this.getUniqueId().equals(other.getUniqueId());
83+
}
84+
85+
@Override
86+
@@ -2012,7 +2000,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
87+
88+
@Override
89+
public boolean canSee(org.bukkit.entity.Entity entity) {
90+
- return this.equals(entity) || entity.isVisibleByDefault() ^ this.invertedVisibilityEntities.containsKey(entity.getUniqueId()); // SPIGOT-7312: Can always see self
91+
+ return this.getUniqueId().equals(entity.getUniqueId()) || entity.isVisibleByDefault() ^ this.invertedVisibilityEntities.containsKey(entity.getUniqueId()); // SPIGOT-7312: Can always see self
92+
}
93+
94+
public boolean canSeePlayer(UUID uuid) {
95+
@@ -2052,7 +2040,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
96+
@Override
97+
public int hashCode() {
98+
if (this.hash == 0 || this.hash == 485) {
99+
- this.hash = 97 * 5 + (this.getUniqueId() != null ? this.getUniqueId().hashCode() : 0);
100+
+ this.hash = 97 * 5 + this.getUniqueId().hashCode();
101+
}
102+
return this.hash;
103+
}

patches/server/0207-InventoryCloseEvent-Reason-API.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ index 79d9a58c66382fd94ab5f6020285e341b0114f6a..f36d72153c1ec0426790ed3033500c3c
9696
this.player.doCloseContainer();
9797
}
9898
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
99-
index a929c809dc1dcb2bdab4db0d2a8ca794189e93d9..c9c3ebcb7239bf01617a89f03cd0ad12dd0b2c34 100644
99+
index ac5607fb1ac771f16b14d71e08a8d4183a39a002..06338f5fa552a390db05a90b5cc796a70104ada0 100644
100100
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
101101
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
102102
@@ -468,7 +468,7 @@ public abstract class PlayerList {
@@ -165,10 +165,10 @@ index 6d4e0a90c70f7a66450cbb18ebec1d7bf9200af2..5ff159be1a6dfb4b1a5b9aa1e435d294
165165
@Override
166166
public boolean isBlocking() {
167167
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
168-
index a4333eae8aa2ae3fefdc8a765a4434c36e123b12..462877cf6f0dce4f86b6a47564affe9beb2559a8 100644
168+
index b3f01ea79ecbce0130bbf3315a4076661affd1ae..01d257d1fe33b3d38e155b69436173a8a3c828e2 100644
169169
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
170170
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
171-
@@ -1290,7 +1290,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
171+
@@ -1278,7 +1278,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
172172

173173
// Close any foreign inventory
174174
if (this.getHandle().containerMenu != this.getHandle().inventoryMenu) {

patches/server/0240-Expose-attack-cooldown-methods-for-Player.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ Subject: [PATCH] Expose attack cooldown methods for Player
55

66

77
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
8-
index 462877cf6f0dce4f86b6a47564affe9beb2559a8..e4d840d6335007a6a542240746504bf1f2af332d 100644
8+
index 01d257d1fe33b3d38e155b69436173a8a3c828e2..ca3e3aa01ee5f1b926478817636e6b94bf3176fd 100644
99
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
1010
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
11-
@@ -3007,6 +3007,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
11+
@@ -2995,6 +2995,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
1212

1313
return this.adventure$pointers;
1414
}

patches/server/0241-Improve-death-events.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ index 29b836a75b835f0d5233db419fc5ca8dde885fdb..2bd97344502a63173de923542f27759d
7979
}
8080
}
8181
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
82-
index 5b8e0931be2acb1eb4ac6f399ecc0a5ebc5db586..7a89c25fcd1c76e4b176c257600db89788aa0f21 100644
82+
index 30343efb680edf3dc355498b04c5db9ebecbf270..781568c0aef7556fd4422574d31c0ad790f0afa7 100644
8383
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
8484
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
8585
@@ -295,6 +295,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -420,10 +420,10 @@ index 2caba38a50b7ea535337a3540aa5272d4a9f1878..e20565cf256aacd012a1722c5ebbf901
420420
// CraftBukkit end
421421
this.gameEvent(GameEvent.ENTITY_DIE);
422422
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
423-
index e4d840d6335007a6a542240746504bf1f2af332d..159bba49095aec77cce5f53d4388a5dff0afcc60 100644
423+
index ca3e3aa01ee5f1b926478817636e6b94bf3176fd..66446d549444316ca89051a0da99583dc4ef80fe 100644
424424
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
425425
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
426-
@@ -2544,7 +2544,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
426+
@@ -2532,7 +2532,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
427427
@Override
428428
public void sendHealthUpdate() {
429429
FoodData foodData = this.getHandle().getFoodData();

patches/server/0270-Replace-OfflinePlayer-getLastPlayed.patch

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ index 8d958ac09bd9484d879eee6acb6aaea20f4f8339..3e0ddfe11d74ce47a023837b2ee472f0
2828
public boolean queueHealthUpdatePacket;
2929
public net.minecraft.network.protocol.game.ClientboundSetHealthPacket queuedHealthUpdatePacket;
3030
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
31-
index f2c7fba1f474618eb68a804d2dc7fc8d70c8ff6f..f56ef720a74611ffef314553f4f785ea5cf086ac 100644
31+
index 8bb2749f751839f7dfd8fb62f676bd54ec8b1b09..4b2826f3319dca1f795653106d22fc6948c6a27a 100644
3232
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
3333
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
3434
@@ -182,6 +182,7 @@ public abstract class PlayerList {
@@ -106,7 +106,7 @@ index f6b2ca92fd3510a76cbf56d0ea55aa6caaf12ba1..e0d342a0ddd140b342f7af138c71596c
106106
public Location getLastDeathLocation() {
107107
if (this.getData().contains("LastDeathLocation", 10)) {
108108
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
109-
index 159bba49095aec77cce5f53d4388a5dff0afcc60..f351250b8e8b66bcf72230bbc76835fcb45817e1 100644
109+
index 66446d549444316ca89051a0da99583dc4ef80fe..d77a729354448831852a883acfff45ccb151cc0c 100644
110110
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
111111
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
112112
@@ -215,6 +215,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -117,7 +117,7 @@ index 159bba49095aec77cce5f53d4388a5dff0afcc60..f351250b8e8b66bcf72230bbc76835fc
117117

118118
public CraftPlayer(CraftServer server, ServerPlayer entity) {
119119
super(server, entity);
120-
@@ -2076,6 +2077,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
120+
@@ -2064,6 +2065,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
121121
this.firstPlayed = firstPlayed;
122122
}
123123

@@ -136,7 +136,7 @@ index 159bba49095aec77cce5f53d4388a5dff0afcc60..f351250b8e8b66bcf72230bbc76835fc
136136
public void readExtraData(CompoundTag nbttagcompound) {
137137
this.hasPlayedBefore = true;
138138
if (nbttagcompound.contains("bukkit")) {
139-
@@ -2098,6 +2111,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
139+
@@ -2086,6 +2099,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
140140
}
141141

142142
public void setExtraData(CompoundTag nbttagcompound) {
@@ -145,7 +145,7 @@ index 159bba49095aec77cce5f53d4388a5dff0afcc60..f351250b8e8b66bcf72230bbc76835fc
145145
if (!nbttagcompound.contains("bukkit")) {
146146
nbttagcompound.put("bukkit", new CompoundTag());
147147
}
148-
@@ -2112,6 +2127,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
148+
@@ -2100,6 +2115,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
149149
data.putLong("firstPlayed", this.getFirstPlayed());
150150
data.putLong("lastPlayed", System.currentTimeMillis());
151151
data.putString("lastKnownName", handle.getScoreboardName());

patches/server/0278-Fixes-and-additions-to-the-spawn-reason-API.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ index 97b48186a48ca037645d4a5ae84e3a95fd413a33..a04cfa09d9f8594a7ad3120855efe164
6767
String s1 = connection.getLoggableAddress(this.server.logIPs());
6868

6969
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
70-
index 2e1628a9b5507ff6b1f00ac83247fc033b2db1c4..e7b4809aa7220597ae92cf8f941f61e874d45d46 100644
70+
index a430a3e2c3b4ae53cad1fbaf4dd71b9e2f24ccf7..49310b11116259193a93aca37da9c6a6949eb948 100644
7171
--- a/src/main/java/net/minecraft/world/entity/Entity.java
7272
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
7373
@@ -256,6 +256,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
@@ -272,10 +272,10 @@ index f0163b7fa8b27823db9df5b8d2b6adcb63023164..de9d00ec932c8d07b28dd68ac9b8e6d5
272272
if (org.bukkit.craftbukkit.event.CraftEventFactory.callTrialSpawnerSpawnEvent(entity, pos).isCancelled()) {
273273
return Optional.empty();
274274
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
275-
index 0e5cc680ee2418ec2af5fc3e215618ad4e768ed0..7fb04535b8c0744d0fa4b0c0a933234134486956 100644
275+
index d6241e2db362de034ae610694c49c1883ffabd07..73788d702a0a814fe7b1e64b33a3b97ca1777662 100644
276276
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
277277
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
278-
@@ -1019,4 +1019,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
278+
@@ -1014,4 +1014,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
279279
return this.getHandle().spawnedViaMobSpawner;
280280
}
281281
// Paper end - Entity#fromMobSpawner

patches/server/0337-Implement-Player-Client-Options-API.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@ index 363175d3325c012f31ba84060bb0bfac694f6ab8..9911e231ad021286f2da90057b06874f
136136
this.adventure$locale = java.util.Objects.requireNonNullElse(net.kyori.adventure.translation.Translator.parseLocale(this.language), java.util.Locale.US); // Paper
137137
this.requestedViewDistance = clientOptions.viewDistance();
138138
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
139-
index faab55435a0c4fc6ff9d117f29a2401677b9f828..69108fd869c7c929fd7971abea520d5ab9063f69 100644
139+
index 341dbff92d15886afe8fe628e06d1c07817241ed..66e5e949c8711103ae9bf73161422f350c217874 100644
140140
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
141141
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
142-
@@ -670,6 +670,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
142+
@@ -658,6 +658,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
143143
connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message);
144144
}
145145
}

patches/server/0378-Add-entity-liquid-API.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ public net.minecraft.world.entity.Entity isInRain()Z
88
public net.minecraft.world.entity.Entity isInBubbleColumn()Z
99

1010
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
11-
index 7fb04535b8c0744d0fa4b0c0a933234134486956..b001284e368f64871824c1f961999bb3f726de57 100644
11+
index 73788d702a0a814fe7b1e64b33a3b97ca1777662..ec122fa4e443290ff973797740172e07f8e736ca 100644
1212
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
1313
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
14-
@@ -1026,4 +1026,41 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
14+
@@ -1021,4 +1021,41 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
1515
return getHandle().spawnReason;
1616
}
1717
// Paper end - entity spawn reason API

patches/server/0389-Brand-support.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ index b9fbaddcc8239bf737fdea51790f678306e511eb..9a8b08d4b70b8890961e4af7ce6e870a
5757
} catch (Exception ex) {
5858
ServerGamePacketListenerImpl.LOGGER.error("Couldn\'t dispatch custom payload", ex);
5959
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
60-
index 69108fd869c7c929fd7971abea520d5ab9063f69..3191c66c9e5b9c5fcfd07716733aaa51612d507f 100644
60+
index 66e5e949c8711103ae9bf73161422f350c217874..80e25cc8de5e3714dee5cb5ce22e49695a149258 100644
6161
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
6262
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
63-
@@ -3166,6 +3166,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
63+
@@ -3154,6 +3154,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
6464
// Paper end
6565
};
6666

0 commit comments

Comments
 (0)