mirror of
https://github.com/PaperMC/Paper.git
synced 2024-08-31 01:00:22 +02:00
145 lines
7.7 KiB
Diff
145 lines
7.7 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 ce13b2b9bcf0984732b3309ec3f14731cc6aef5f..92fc07fb1a9dab0d44ac439287d10ae05a4e7043 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
@@ -2046,6 +2046,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
|
{
|
|
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 4d9b7fbb35d0c8f4fbb43b77a2e11a919614ab56..2862e75108b3304ab186ed89eb36801500e58b85 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
@@ -87,6 +87,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; // Paper
|
|
import net.minecraft.world.item.ProjectileWeaponItem;
|
|
import net.minecraft.world.item.SwordItem;
|
|
import net.minecraft.world.item.crafting.Recipe;
|
|
@@ -105,6 +106,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; // Paper
|
|
import net.minecraft.world.phys.AABB;
|
|
import net.minecraft.world.phys.Vec3;
|
|
import net.minecraft.world.scores.PlayerTeam;
|
|
@@ -730,6 +732,14 @@ 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.getSavedData(stack, this.level);
|
|
+ if (worldmap != null) {
|
|
+ worldmap.tickCarriedBy(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 3b35ec1df648a3de920ea0c15962388044737bbc..a6219dd70ab76959b2aaa155d5d17acc22095753 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
|
|
@@ -63,6 +63,7 @@ public class MapItemSavedData extends SavedData {
|
|
public final Map<String, MapDecoration> decorations = Maps.newLinkedHashMap();
|
|
private final Map<String, MapFrame> frameMarkers = Maps.newHashMap();
|
|
private int trackedDecorationCount;
|
|
+ private org.bukkit.craftbukkit.map.RenderData vanillaRender = new org.bukkit.craftbukkit.map.RenderData(); // Paper
|
|
|
|
// CraftBukkit start
|
|
public final CraftMapView mapView;
|
|
@@ -83,6 +84,7 @@ public class MapItemSavedData extends SavedData {
|
|
// CraftBukkit start
|
|
this.mapView = new CraftMapView(this);
|
|
this.server = (CraftServer) org.bukkit.Bukkit.getServer();
|
|
+ this.vanillaRender.buffer = colors; // Paper
|
|
// CraftBukkit end
|
|
}
|
|
|
|
@@ -138,6 +140,7 @@ public class MapItemSavedData extends SavedData {
|
|
if (abyte.length == 16384) {
|
|
worldmap.colors = abyte;
|
|
}
|
|
+ worldmap.vanillaRender.buffer = abyte; // Paper
|
|
|
|
ListTag nbttaglist = nbt.getList("banners", 10);
|
|
|
|
@@ -548,6 +551,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) this.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;
|
|
@@ -581,7 +599,9 @@ public class MapItemSavedData extends SavedData {
|
|
@Nullable
|
|
Packet<?> nextUpdatePacket(int mapId) {
|
|
MapItemSavedData.MapPatch worldmap_b;
|
|
- 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
|
|
|
|
if (this.dirtyData) {
|
|
this.dirtyData = false;
|
|
@@ -597,6 +617,8 @@ public class MapItemSavedData extends SavedData {
|
|
// CraftBukkit start
|
|
java.util.Collection<MapDecoration> icons = new java.util.ArrayList<MapDecoration>();
|
|
|
|
+ if (vanillaMaps) addSeenPlayers(icons); // Paper
|
|
+
|
|
for (org.bukkit.map.MapCursor cursor : render.cursors) {
|
|
if (cursor.isVisible()) {
|
|
icons.add(new MapDecoration(MapDecoration.Type.byIcon(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection(), PaperAdventure.asVanilla(cursor.caption()))); // Paper - Adventure
|
|
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() {
|