mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-04 10:11:29 +01:00
6ef36f5d24
This will provide quite a major performance boost by avoiding synchronizing on EVERY chunk lookup. Synchronize, even without contention, incurs processor cache flushes. Considering this is the 2nd hottest method in the code base, lets avoid doing that... Additionally, chunk conversion operations were occuring while under synchronization which lead to deadlocks. Now the conversion will occur outside of the lock, and fix that issue, resolving #1586 Note, that the chunk map is still thread safe for get operations! The chunk map was never intended to be modified async with our changes, as we post to main to modify the map, however we do still synchronize for write operations (put, remove) We also synchronize for async get operations, ensuring that async gets are safe. We do not need to synchronize main thread gets as the processor cache will be insync since the map is only updated on the main thread. However, if someone does try to delete or put concurrently, we will force their operation back to the main thread.
57 lines
No EOL
2.7 KiB
Diff
57 lines
No EOL
2.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Caleb Bassham <caleb.bassham@gmail.com>
|
|
Date: Fri, 28 Sep 2018 02:32:19 -0500
|
|
Subject: [PATCH] Call player spectator target events
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
index 7ac07ac07ac0..7ac07ac07ac0 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
@@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
private EntityHuman.EnumChatVisibility cs;
|
|
private boolean ct = true;
|
|
private long cu = SystemUtils.b();
|
|
- private Entity cv;
|
|
+ private Entity cv; private void setSpectatorTargetField(Entity e) { this.cv = e; } // Paper - OBFHELPER
|
|
public boolean worldChangeInvuln;
|
|
private boolean cx; private void setHasSeenCredits(boolean has) { this.cx = has; } // Paper - OBFHELPER
|
|
private final RecipeBookServer cy;
|
|
@@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
return (Entity) (this.cv == null ? this : this.cv);
|
|
}
|
|
|
|
- public void setSpectatorTarget(Entity entity) {
|
|
+ public void setSpectatorTarget(Entity newSpectatorTarget) {
|
|
Entity entity1 = this.getSpecatorTarget();
|
|
|
|
- this.cv = (Entity) (entity == null ? this : entity);
|
|
- if (entity1 != this.cv) {
|
|
+ if (newSpectatorTarget == null) {
|
|
+ newSpectatorTarget = this;
|
|
+ }
|
|
+
|
|
+ if (entity1 != newSpectatorTarget) {
|
|
+ if (newSpectatorTarget == this) {
|
|
+ com.destroystokyo.paper.event.player.PlayerStopSpectatingEntityEvent playerStopSpectatingEntityEvent = new com.destroystokyo.paper.event.player.PlayerStopSpectatingEntityEvent(this.getBukkitEntity(), entity1.getBukkitEntity());
|
|
+
|
|
+ if (!playerStopSpectatingEntityEvent.callEvent()) {
|
|
+ return;
|
|
+ }
|
|
+ } else {
|
|
+ com.destroystokyo.paper.event.player.PlayerStartSpectatingEntityEvent playerStartSpectatingEntityEvent = new com.destroystokyo.paper.event.player.PlayerStartSpectatingEntityEvent(this.getBukkitEntity(), entity1.getBukkitEntity(), newSpectatorTarget.getBukkitEntity());
|
|
+
|
|
+ if (!playerStartSpectatingEntityEvent.callEvent()) {
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+
|
|
this.playerConnection.sendPacket(new PacketPlayOutCamera(this.cv));
|
|
this.playerConnection.a(this.cv.locX, this.cv.locY, this.cv.locZ, this.yaw, this.pitch, TeleportCause.SPECTATE); // CraftBukkit
|
|
}
|
|
|
|
+ setSpectatorTargetField(newSpectatorTarget);
|
|
}
|
|
|
|
protected void E() {
|
|
--
|