|
| 1 | +From 8470f1798dbc68685a0e4f051cfde090e57cce48 Mon Sep 17 00:00:00 2001 |
| 2 | + |
| 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