145 Zeilen
7.9 KiB
Diff
145 Zeilen
7.9 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/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
index bb99d9fe5e274318d8480a6de2c45b0a57351f77..0a613f94d1c796267636e1a343aeee65a49ffed5 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
@@ -1164,6 +1164,7 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
{
|
||
|
if ( iter.next().player == entity )
|
||
|
{
|
||
|
+ map.decorations.remove(entity.getName().getString()); // Paper
|
||
|
iter.remove();
|
||
|
}
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
index 3b451e75a7f49ea6b543aee9f0a51c0be3c4dfba..c11d5aa115d10e3c12863cf9d42c60194d63b690 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
@@ -85,6 +85,7 @@ import net.minecraft.world.item.ElytraItem;
|
||
|
import net.minecraft.world.item.ItemCooldowns;
|
||
|
import net.minecraft.world.item.ItemStack;
|
||
|
import net.minecraft.world.item.Items;
|
||
|
+import net.minecraft.world.item.MapItem;
|
||
|
import net.minecraft.world.item.ProjectileWeaponItem;
|
||
|
import net.minecraft.world.item.SwordItem;
|
||
|
import net.minecraft.world.item.crafting.Recipe;
|
||
|
@@ -104,6 +105,7 @@ import net.minecraft.world.level.block.entity.SignBlockEntity;
|
||
|
import net.minecraft.world.level.block.entity.StructureBlockEntity;
|
||
|
import net.minecraft.world.level.block.state.BlockState;
|
||
|
import net.minecraft.world.level.block.state.pattern.BlockInWorld;
|
||
|
+import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
|
||
|
import net.minecraft.world.phys.AABB;
|
||
|
import net.minecraft.world.phys.Vec3;
|
||
|
import net.minecraft.world.scores.PlayerTeam;
|
||
|
@@ -686,6 +688,12 @@ public abstract class Player extends LivingEntity {
|
||
|
return null;
|
||
|
}
|
||
|
// CraftBukkit end
|
||
|
+ // Paper start - remove player from map on drop
|
||
|
+ if (stack.getItem() == Items.FILLED_MAP) {
|
||
|
+ MapItemSavedData worldmap = MapItem.getOrCreateSavedData(stack, this.level);
|
||
|
+ worldmap.updateSeenPlayers(this, stack);
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
return entityitem;
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java
|
||
|
index d44505b3ee2a35422568e9bce0d868191e348fc0..7582c7cd4235d212a0cf66a4c59ce0cedaa360ad 100644
|
||
|
--- a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java
|
||
|
+++ b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java
|
||
|
@@ -57,6 +57,7 @@ public class MapItemSavedData extends SavedData {
|
||
|
private final Map<String, MapBanner> bannerMarkers = Maps.newHashMap();
|
||
|
public final Map<String, MapDecoration> decorations = Maps.newLinkedHashMap();
|
||
|
private final Map<String, MapFrame> frameMarkers = 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 MapItemSavedData extends SavedData {
|
||
|
// CraftBukkit start
|
||
|
mapView = new CraftMapView(this);
|
||
|
server = (CraftServer) org.bukkit.Bukkit.getServer();
|
||
|
+ vanillaRender.buffer = colors; // Paper
|
||
|
// CraftBukkit end
|
||
|
}
|
||
|
|
||
|
@@ -136,6 +138,7 @@ public class MapItemSavedData extends SavedData {
|
||
|
this.bannerMarkers.put(mapiconbanner.getId(), mapiconbanner);
|
||
|
this.addDecoration(mapiconbanner.getDecoration(), (LevelAccessor) null, mapiconbanner.getId(), (double) mapiconbanner.getPos().getX(), (double) mapiconbanner.getPos().getZ(), 180.0D, mapiconbanner.getName());
|
||
|
}
|
||
|
+ this.vanillaRender.buffer = colors; // Paper
|
||
|
|
||
|
ListTag nbttaglist1 = tag.getList("frames", 10);
|
||
|
|
||
|
@@ -216,6 +219,7 @@ public class MapItemSavedData extends SavedData {
|
||
|
this.setDirty();
|
||
|
}
|
||
|
|
||
|
+ public void updateSeenPlayers(Player entityhuman, ItemStack itemstack) { this.tickCarriedBy(entityhuman, itemstack); } // Paper - OBFHELPER
|
||
|
public void tickCarriedBy(Player player, ItemStack stack) {
|
||
|
if (!this.carriedByPlayers.containsKey(player)) {
|
||
|
MapItemSavedData.HoldingPlayer worldmap_worldmaphumantracker = new MapItemSavedData.HoldingPlayer(player);
|
||
|
@@ -451,6 +455,21 @@ public class MapItemSavedData extends SavedData {
|
||
|
|
||
|
public class HoldingPlayer {
|
||
|
|
||
|
+ // Paper start
|
||
|
+ private void addSeenPlayers(java.util.Collection<MapDecoration> icons) {
|
||
|
+ org.bukkit.entity.Player player = (org.bukkit.entity.Player) player.getBukkitEntity();
|
||
|
+ MapItemSavedData.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 Player player;
|
||
|
private boolean dirtyData = true;
|
||
|
private int minDirtyX;
|
||
|
@@ -467,9 +486,12 @@ public class MapItemSavedData extends SavedData {
|
||
|
@Nullable
|
||
|
public Packet<?> nextUpdatePacket(ItemStack stack) {
|
||
|
// CraftBukkit start
|
||
|
- org.bukkit.craftbukkit.map.RenderData render = MapItemSavedData.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.player.getBukkitEntity()); // CraftBukkit
|
||
|
+ if (!this.dirtyData && this.tick % 5 != 0) { this.tick++; 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 ? MapItemSavedData.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.player.getBukkitEntity()) : MapItemSavedData.this.vanillaRender; // CraftBukkit // Paper
|
||
|
|
||
|
java.util.Collection<MapDecoration> icons = new java.util.ArrayList<MapDecoration>();
|
||
|
+ 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() {
|