](https://www.jetbrains.com)
-
-[JetBrains](https://www.jetbrains.com/), creators of the IntelliJ IDEA, supports Paper with one of their [Open Source Licenses](https://www.jetbrains.com/opensource/). IntelliJ IDEA is the recommended IDE for working with Paper, and most of the Paper team uses it.
-
-All our sponsors!
-[](https://papermc.io/sponsors)
+Код ядра наследует лицензию Paper ([GPLv3](LICENSE.md)). Все изменения в
+`me.sashegdev.delta` — тоже GPLv3.
\ No newline at end of file
diff --git a/paper-server/src/main/java/io/papermc/paper/command/PaperCommands.java b/paper-server/src/main/java/io/papermc/paper/command/PaperCommands.java
index 6dfd0b1a8..0d38928a5 100644
--- a/paper-server/src/main/java/io/papermc/paper/command/PaperCommands.java
+++ b/paper-server/src/main/java/io/papermc/paper/command/PaperCommands.java
@@ -24,6 +24,9 @@ public final class PaperCommands {
public static void registerCommands(final MinecraftServer server) {
COMMANDS.put("paper", new PaperCommand("paper"));
COMMANDS.put("mspt", new MSPTCommand("mspt"));
+ // Delta start - /delta core command
+ COMMANDS.put("delta", new me.sashegdev.delta.DeltaCommand("delta"));
+ // Delta end
COMMANDS.forEach((s, command) -> {
server.server.getCommandMap().register(s, "Paper", command);
diff --git a/paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
index 3f5e76e4d..71735ac1b 100644
--- a/paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
+++ b/paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
@@ -220,6 +220,10 @@ public class GlobalConfiguration extends ConfigurationPart {
@SuppressWarnings("unused") // used in postProcess
public ChunkSystem chunkSystem;
+ // Delta start - custom core config (paper-global.yml section "delta")
+ public me.sashegdev.delta.DeltaConfig delta;
+ // Delta end
+
public class ChunkSystem extends ConfigurationPart {
public int ioThreads = -1;
diff --git a/paper-server/src/main/java/me/sashegdev/delta/DeltaCommand.java b/paper-server/src/main/java/me/sashegdev/delta/DeltaCommand.java
new file mode 100644
index 000000000..e7bf22211
--- /dev/null
+++ b/paper-server/src/main/java/me/sashegdev/delta/DeltaCommand.java
@@ -0,0 +1,118 @@
+package me.sashegdev.delta;
+
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * /delta — инспекция и настройка патчей Delta.
+ */
+public class DeltaCommand extends Command {
+
+ private static final ListВызывается из {@code ChunkMap.TrackedEntity#updatePlayer} — это единая + * точка, где решается, полетит ли сущность клиенту. Display-сущности + * (BlockDisplay/TextDisplay/ItemDisplay) не имеют коллизий и физики, поэтому + * их можно безопасно резать по дальности: клиент их просто не увидит, но + * серверное состояние останется корректным. + */ +public final class DeltaTracking { + + private DeltaTracking() { + } + + /** + * @return эффективную дальность трекинга с учётом Delta-конфига + */ + public static double adjustRange(final Entity entity, final double range) { + if (!(entity instanceof Display)) { + return range; + } + final DeltaConfig cfg = delta(); + if (cfg == null || !cfg.displayTrackingRangeEnabled) { + return range; + } + final int configured = cfg.displayTrackingRange; + return configured <= 0 ? range : Math.min(range, configured); + } + + private static DeltaConfig delta() { + try { + return GlobalConfiguration.get().delta; + } catch (Throwable t) { + // конфиг ещё не инициализирован (например, очень ранний вызов) + return null; + } + } + + public static String describe() { + final DeltaConfig cfg = delta(); + if (cfg == null) { + return "config not loaded"; + } + if (!cfg.displayTrackingRangeEnabled) { + return "display tracking: stock (disabled)"; + } + return "display tracking: " + cfg.displayTrackingRange + " blocks"; + } +} \ No newline at end of file