Skip to content
This repository was archived by the owner on Dec 29, 2023. It is now read-only.

Commit 0be5b1a

Browse files
committed
Implement [Paper-0090] Improve Maps (in item frames) performance and bug fixes by Aikar
1 parent 3072130 commit 0be5b1a

File tree

2 files changed

+171
-0
lines changed

2 files changed

+171
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ Titanium implements patches from other engines as well. **All credits go to the
7171
[Paper-0072] Fix Furnace cook time bug when lagging by Aikar
7272
[Paper-0076] Optimized light level comaprsions by Aikar
7373
[Paper-0085] Use a Shared Random for Entities
74+
[Paper-0090] Improve Maps (in item frames) performance and bug fixes by Aikar
7475
[Paper-0121] Reduce IO ops opening a new region
7576
[Paper-0144] Improve Minecraft Hopper Performance
7677
[Paper-0168] Disable ticking of snow blocks
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
From 8470f1798dbc68685a0e4f051cfde090e57cce48 Mon Sep 17 00:00:00 2001
2+
From: Aikar <[email protected]>
3+
Date: Fri, 29 Apr 2016 20:02:00 -0400
4+
Subject: [PATCH] Implement [Paper-0090] Improve Maps (in item frames)
5+
performance and bug fixes by Aikar
6+
7+
8+
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
9+
index 247c0ae3a..d60fd9dc9 100644
10+
--- a/src/main/java/net/minecraft/server/EntityHuman.java
11+
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
12+
@@ -625,6 +625,14 @@ public abstract class EntityHuman extends EntityLiving {
13+
this.b(StatisticList.v);
14+
}
15+
16+
+ // Paper start - remove player from map on drop
17+
+ if (itemstack.getItem() == Items.FILLED_MAP)
18+
+ {
19+
+ WorldMap worldmap = ((ItemWorldMap) itemstack.getItem()).getSavedMap(itemstack, this.world);
20+
+ worldmap.updateSeenPlayers(this, itemstack);
21+
+ }
22+
+ // Paper end
23+
+
24+
return entityitem;
25+
}
26+
}
27+
diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
28+
index 1b70d8a44..bc05f0e6c 100644
29+
--- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java
30+
+++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
31+
@@ -189,11 +189,11 @@ public class EntityTrackerEntry {
32+
this.broadcast(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle));
33+
}
34+
35+
- if (this.tracker instanceof EntityItemFrame /*&& this.m % 10 == 0*/) { // CraftBukkit - Moved below, should always enter this block
36+
+ if (this.tracker instanceof EntityItemFrame && this.m % 20 == 0) { // Paper
37+
EntityItemFrame entityitemframe = (EntityItemFrame) this.tracker;
38+
ItemStack itemstack = entityitemframe.getItem();
39+
40+
- if (this.m % 10 == 0 && itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.m % 10 logic here so item frames do not enter the other blocks
41+
+ if (itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { // Paper - moved back up
42+
WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, this.tracker.world);
43+
Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit
44+
45+
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
46+
index a20e213fb..fccee8a32 100644
47+
--- a/src/main/java/net/minecraft/server/World.java
48+
+++ b/src/main/java/net/minecraft/server/World.java
49+
@@ -1203,6 +1203,7 @@ public abstract class World implements IBlockAccess {
50+
{
51+
if ( iter.next().trackee == entity )
52+
{
53+
+ map.decorations.remove(entity.getUniqueID()); // Paper
54+
iter.remove();
55+
}
56+
}
57+
diff --git a/src/main/java/net/minecraft/server/WorldMap.java b/src/main/java/net/minecraft/server/WorldMap.java
58+
index f5d2d6d41..089de0627 100644
59+
--- a/src/main/java/net/minecraft/server/WorldMap.java
60+
+++ b/src/main/java/net/minecraft/server/WorldMap.java
61+
@@ -3,6 +3,7 @@ package net.minecraft.server;
62+
import com.google.common.base.Charsets;
63+
import com.google.common.collect.Lists;
64+
import com.google.common.collect.Maps;
65+
+import java.util.Collection;
66+
import java.util.Iterator;
67+
import java.util.List;
68+
import java.util.Map;
69+
@@ -10,9 +11,11 @@ import java.util.Map;
70+
// CraftBukkit start
71+
import java.util.UUID;
72+
73+
+import org.bukkit.Bukkit;
74+
import org.bukkit.craftbukkit.CraftServer;
75+
import org.bukkit.craftbukkit.CraftWorld;
76+
import org.bukkit.craftbukkit.map.CraftMapView;
77+
+import org.bukkit.entity.Player;
78+
// CraftBukkit end
79+
80+
public class WorldMap extends PersistentBase {
81+
@@ -25,6 +28,7 @@ public class WorldMap extends PersistentBase {
82+
public List<WorldMap.WorldMapHumanTracker> g = Lists.newArrayList();
83+
public Map<EntityHuman, WorldMap.WorldMapHumanTracker> i = Maps.newHashMap(); // Spigot
84+
public Map<UUID, MapIcon> decorations = Maps.newLinkedHashMap(); // Spigot
85+
+ private org.bukkit.craftbukkit.map.RenderData vanillaRender = new org.bukkit.craftbukkit.map.RenderData(); // Paper
86+
87+
// CraftBukkit start
88+
public final CraftMapView mapView;
89+
@@ -37,6 +41,7 @@ public class WorldMap extends PersistentBase {
90+
// CraftBukkit start
91+
mapView = new CraftMapView(this);
92+
server = (CraftServer) org.bukkit.Bukkit.getServer();
93+
+ vanillaRender.buffer = colors; // Paper
94+
// CraftBukkit end
95+
}
96+
97+
@@ -105,6 +110,7 @@ public class WorldMap extends PersistentBase {
98+
}
99+
}
100+
101+
+ this.vanillaRender.buffer = this.colors; // Paper
102+
}
103+
104+
public void b(NBTTagCompound nbttagcompound) {
105+
@@ -136,6 +142,12 @@ public class WorldMap extends PersistentBase {
106+
nbttagcompound.setByteArray("colors", this.colors);
107+
}
108+
109+
+ // Paper start
110+
+ public void updateSeenPlayers(EntityHuman entityhuman, ItemStack itemstack) {
111+
+ this.a(entityhuman, itemstack);
112+
+ }
113+
+ // Paper end
114+
+
115+
public void a(EntityHuman entityhuman, ItemStack itemstack) {
116+
if (!this.i.containsKey(entityhuman)) {
117+
WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = new WorldMap.WorldMapHumanTracker(entityhuman);
118+
@@ -277,9 +289,13 @@ public class WorldMap extends PersistentBase {
119+
120+
public Packet a(ItemStack itemstack) {
121+
// CraftBukkit start
122+
- org.bukkit.craftbukkit.map.RenderData render = WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()); // CraftBukkit
123+
+ // org.bukkit.craftbukkit.map.RenderData render = WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()); // CraftBukkit
124+
+ if (!this.d && this.i % 5 != 0) { this.i++; return null; } // Paper - this won't end up sending, so don't render it!
125+
+ boolean vanillaMaps = shouldUseVanillaMap(); // Paper
126+
+ org.bukkit.craftbukkit.map.RenderData render = !vanillaMaps ? WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()) : WorldMap.this.vanillaRender; // CraftBukkit // Paper
127+
128+
java.util.Collection<MapIcon> icons = new java.util.ArrayList<MapIcon>();
129+
+ if (vanillaMaps) addSeenPlayers(icons); // Paper
130+
131+
for ( org.bukkit.map.MapCursor cursor : render.cursors) {
132+
133+
@@ -297,6 +313,21 @@ public class WorldMap extends PersistentBase {
134+
// CraftBukkit end
135+
}
136+
137+
+ // Paper start
138+
+ private void addSeenPlayers(Collection<MapIcon> icons) {
139+
+ Player player = (Player) this.trackee.getBukkitEntity();
140+
+ WorldMap.this.decorations.forEach((uuid, mapIcon) -> {
141+
+ Player other = Bukkit.getPlayer(uuid);
142+
+ if (other == null || player.canSee(other))
143+
+ icons.add(mapIcon);
144+
+ });
145+
+ }
146+
+
147+
+ private boolean shouldUseVanillaMap() {
148+
+ return mapView.getRenderers().size() == 1 && mapView.getRenderers().get(0).getClass() == org.bukkit.craftbukkit.map.CraftMapRenderer.class;
149+
+ }
150+
+ // Paper end
151+
+
152+
public void a(int i, int j) {
153+
if (this.d) {
154+
this.e = Math.min(this.e, i);
155+
diff --git a/src/main/java/org/bukkit/craftbukkit/map/RenderData.java b/src/main/java/org/bukkit/craftbukkit/map/RenderData.java
156+
index 256a13178..503a31b4e 100644
157+
--- a/src/main/java/org/bukkit/craftbukkit/map/RenderData.java
158+
+++ b/src/main/java/org/bukkit/craftbukkit/map/RenderData.java
159+
@@ -5,7 +5,7 @@ import org.bukkit.map.MapCursor;
160+
161+
public class RenderData {
162+
163+
- public final byte[] buffer;
164+
+ public byte[] buffer;
165+
public final ArrayList<MapCursor> cursors;
166+
167+
public RenderData() {
168+
--
169+
2.36.0.windows.1
170+

0 commit comments

Comments
 (0)