geforkt von Mirrors/Paper
145 Zeilen
7.8 KiB
Diff
145 Zeilen
7.8 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Fri, 29 Apr 2016 20:02:00 -0400
|
||
|
Subject: [PATCH] Improve Maps (in item frames) performance and bug fixes
|
||
|
|
||
|
Maps used a modified version of rendering to support plugin controlled
|
||
|
imaging on maps. The Craft Map Renderer is much slower than Vanilla,
|
||
|
causing maps in item frames to cause a noticeable hit on server performance.
|
||
|
|
||
|
This updates the map system to not use the Craft system if we detect that no
|
||
|
custom renderers are in use, defaulting to the much simpler Vanilla system.
|
||
|
|
||
|
Additionally, numerous issues to player position tracking on maps has been fixed.
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
|
||
|
index 75424a5dd6db57dded3b6d895e6b5b102e91c77e..c7652d6bff7630e2eefbb4c3b0deb6e17b9c98d0 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
|
||
|
@@ -1170,6 +1170,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
|
||
|
{
|
||
|
if ( iter.next().trackee == entity )
|
||
|
{
|
||
|
+ map.decorations.remove(entity.getDisplayName().getString()); // Paper
|
||
|
iter.remove();
|
||
|
}
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
|
||
|
index f42e16589476c1bd10b13214dda5ac7bb3e52131..e3e3426a00128b56d523bb43a59b814b915ad0ff 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
|
||
|
@@ -86,6 +86,7 @@ import net.minecraft.world.item.ItemElytra;
|
||
|
import net.minecraft.world.item.ItemProjectileWeapon;
|
||
|
import net.minecraft.world.item.ItemStack;
|
||
|
import net.minecraft.world.item.ItemSword;
|
||
|
+import net.minecraft.world.item.ItemWorldMap;
|
||
|
import net.minecraft.world.item.Items;
|
||
|
import net.minecraft.world.item.crafting.IRecipe;
|
||
|
import net.minecraft.world.item.enchantment.EnchantmentManager;
|
||
|
@@ -104,6 +105,7 @@ import net.minecraft.world.level.block.entity.TileEntitySign;
|
||
|
import net.minecraft.world.level.block.entity.TileEntityStructure;
|
||
|
import net.minecraft.world.level.block.state.IBlockData;
|
||
|
import net.minecraft.world.level.block.state.pattern.ShapeDetectorBlock;
|
||
|
+import net.minecraft.world.level.saveddata.maps.WorldMap;
|
||
|
import net.minecraft.world.phys.AxisAlignedBB;
|
||
|
import net.minecraft.world.phys.Vec3D;
|
||
|
import net.minecraft.world.scores.Scoreboard;
|
||
|
@@ -689,6 +691,12 @@ public abstract class EntityHuman extends EntityLiving {
|
||
|
return null;
|
||
|
}
|
||
|
// CraftBukkit end
|
||
|
+ // Paper start - remove player from map on drop
|
||
|
+ if (itemstack.getItem() == Items.FILLED_MAP) {
|
||
|
+ WorldMap worldmap = ItemWorldMap.getSavedMap(itemstack, this.world);
|
||
|
+ worldmap.updateSeenPlayers(this, itemstack);
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
return entityitem;
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/level/saveddata/maps/WorldMap.java b/src/main/java/net/minecraft/world/level/saveddata/maps/WorldMap.java
|
||
|
index 3f057f0bd23bc1c693c8f04ee8acd6626c620008..d470af1814af332595c1c0beb1cdc552e186a6bb 100644
|
||
|
--- a/src/main/java/net/minecraft/world/level/saveddata/maps/WorldMap.java
|
||
|
+++ b/src/main/java/net/minecraft/world/level/saveddata/maps/WorldMap.java
|
||
|
@@ -57,6 +57,7 @@ public class WorldMap extends PersistentBase {
|
||
|
private final Map<String, MapIconBanner> m = Maps.newHashMap();
|
||
|
public final Map<String, MapIcon> decorations = Maps.newLinkedHashMap();
|
||
|
private final Map<String, WorldMapFrame> n = Maps.newHashMap();
|
||
|
+ private org.bukkit.craftbukkit.map.RenderData vanillaRender = new org.bukkit.craftbukkit.map.RenderData(); // Paper
|
||
|
|
||
|
// CraftBukkit start
|
||
|
public final CraftMapView mapView;
|
||
|
@@ -69,6 +70,7 @@ public class WorldMap extends PersistentBase {
|
||
|
// CraftBukkit start
|
||
|
mapView = new CraftMapView(this);
|
||
|
server = (CraftServer) org.bukkit.Bukkit.getServer();
|
||
|
+ vanillaRender.buffer = colors; // Paper
|
||
|
// CraftBukkit end
|
||
|
}
|
||
|
|
||
|
@@ -136,6 +138,7 @@ public class WorldMap extends PersistentBase {
|
||
|
this.m.put(mapiconbanner.f(), mapiconbanner);
|
||
|
this.a(mapiconbanner.c(), (GeneratorAccess) null, mapiconbanner.f(), (double) mapiconbanner.a().getX(), (double) mapiconbanner.a().getZ(), 180.0D, mapiconbanner.d());
|
||
|
}
|
||
|
+ this.vanillaRender.buffer = colors; // Paper
|
||
|
|
||
|
NBTTagList nbttaglist1 = nbttagcompound.getList("frames", 10);
|
||
|
|
||
|
@@ -216,6 +219,7 @@ public class WorldMap extends PersistentBase {
|
||
|
this.b();
|
||
|
}
|
||
|
|
||
|
+ public void updateSeenPlayers(EntityHuman entityhuman, ItemStack itemstack) { this.a(entityhuman, itemstack); } // Paper - OBFHELPER
|
||
|
public void a(EntityHuman entityhuman, ItemStack itemstack) {
|
||
|
if (!this.humans.containsKey(entityhuman)) {
|
||
|
WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = new WorldMap.WorldMapHumanTracker(entityhuman);
|
||
|
@@ -451,6 +455,21 @@ public class WorldMap extends PersistentBase {
|
||
|
|
||
|
public class WorldMapHumanTracker {
|
||
|
|
||
|
+ // Paper start
|
||
|
+ private void addSeenPlayers(java.util.Collection<MapIcon> icons) {
|
||
|
+ org.bukkit.entity.Player player = (org.bukkit.entity.Player) trackee.getBukkitEntity();
|
||
|
+ WorldMap.this.decorations.forEach((name, mapIcon) -> {
|
||
|
+ // If this cursor is for a player check visibility with vanish system
|
||
|
+ org.bukkit.entity.Player other = org.bukkit.Bukkit.getPlayerExact(name); // Spigot
|
||
|
+ if (other == null || player.canSee(other)) {
|
||
|
+ icons.add(mapIcon);
|
||
|
+ }
|
||
|
+ });
|
||
|
+ }
|
||
|
+ private boolean shouldUseVanillaMap() {
|
||
|
+ return mapView.getRenderers().size() == 1 && mapView.getRenderers().get(0).getClass() == org.bukkit.craftbukkit.map.CraftMapRenderer.class;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
public final EntityHuman trackee;
|
||
|
private boolean d = true;
|
||
|
private int e;
|
||
|
@@ -467,9 +486,12 @@ public class WorldMap extends PersistentBase {
|
||
|
@Nullable
|
||
|
public Packet<?> a(ItemStack itemstack) {
|
||
|
// CraftBukkit start
|
||
|
- org.bukkit.craftbukkit.map.RenderData render = WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()); // CraftBukkit
|
||
|
+ if (!this.d && this.i % 5 != 0) { this.i++; return null; } // Paper - this won't end up sending, so don't render it!
|
||
|
+ boolean vanillaMaps = shouldUseVanillaMap(); // Paper
|
||
|
+ org.bukkit.craftbukkit.map.RenderData render = !vanillaMaps ? WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()) : WorldMap.this.vanillaRender; // CraftBukkit // Paper
|
||
|
|
||
|
java.util.Collection<MapIcon> icons = new java.util.ArrayList<MapIcon>();
|
||
|
+ if (vanillaMaps) addSeenPlayers(icons); // Paper
|
||
|
|
||
|
for ( org.bukkit.map.MapCursor cursor : render.cursors) {
|
||
|
|
||
|
diff --git a/src/main/java/org/bukkit/craftbukkit/map/RenderData.java b/src/main/java/org/bukkit/craftbukkit/map/RenderData.java
|
||
|
index 256a131781721c86dd6cdbc329335964570cbe8c..5768cd512ec166f1e8d1f4a28792015347297c3f 100644
|
||
|
--- a/src/main/java/org/bukkit/craftbukkit/map/RenderData.java
|
||
|
+++ b/src/main/java/org/bukkit/craftbukkit/map/RenderData.java
|
||
|
@@ -5,7 +5,7 @@ import org.bukkit.map.MapCursor;
|
||
|
|
||
|
public class RenderData {
|
||
|
|
||
|
- public final byte[] buffer;
|
||
|
+ public byte[] buffer; // Paper
|
||
|
public final ArrayList<MapCursor> cursors;
|
||
|
|
||
|
public RenderData() {
|