mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-26 19:07:40 +01:00
211cba970b
Provides an API to control the loot table for an object. Also provides a feature that any Lootable Inventory (Chests in Structures) can automatically replenish after a given time. This feature is good for long term worlds so that newer players do not suffer with "Every chest has been looted" API and Event added to control the Auto Replenish feature for players.
82 lines
3.2 KiB
Diff
82 lines
3.2 KiB
Diff
From 4edc5edf0d28d370646105bb6be847ad0944cd9b Mon Sep 17 00:00:00 2001
|
|
From: Antony Riley <antony@cyberiantiger.org>
|
|
Date: Tue, 29 Mar 2016 08:22:55 +0300
|
|
Subject: [PATCH] Sanitise RegionFileCache and make configurable.
|
|
|
|
RegionFileCache prior to this patch would close every single open region
|
|
file upon reaching a size of 256.
|
|
This patch modifies that behaviour so it closes the the least recently
|
|
used RegionFile.
|
|
The implementation uses a LinkedHashMap as an LRU cache (modified from HashMap).
|
|
The maximum size of the RegionFileCache is also made configurable.
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
index a643acc..431faa8 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
@@ -213,4 +213,9 @@ public class PaperConfig {
|
|
public static void healthDeath() {
|
|
setHealthBeforeDeathEvent = getBoolean("settings.set-health-before-death-event", false);
|
|
}
|
|
+
|
|
+ public static int regionFileCacheSize = 256;
|
|
+ private static void regionFileCacheSize() {
|
|
+ regionFileCacheSize = getInt("settings.region-file-cache-size", 256);
|
|
+ }
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/RegionFileCache.java b/src/main/java/net/minecraft/server/RegionFileCache.java
|
|
index 5eb01c3..9744e72 100644
|
|
--- a/src/main/java/net/minecraft/server/RegionFileCache.java
|
|
+++ b/src/main/java/net/minecraft/server/RegionFileCache.java
|
|
@@ -8,10 +8,12 @@ import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
+import com.destroystokyo.paper.PaperConfig; // Paper
|
|
+import java.util.LinkedHashMap; // Paper
|
|
|
|
public class RegionFileCache {
|
|
|
|
- public static final Map<File, RegionFile> a = Maps.newHashMap(); // Spigot - private -> public
|
|
+ public static final Map<File, RegionFile> a = new LinkedHashMap(PaperConfig.regionFileCacheSize, 0.75f, true); // Spigot - private -> public, Paper - HashMap -> LinkedHashMap
|
|
|
|
// Paper start
|
|
public static synchronized RegionFile a(File file, int i, int j) {
|
|
@@ -32,8 +34,8 @@ public class RegionFileCache {
|
|
file1.mkdirs();
|
|
}
|
|
|
|
- if (RegionFileCache.a.size() >= 256) {
|
|
- a();
|
|
+ if (RegionFileCache.a.size() >= PaperConfig.regionFileCacheSize) { // Paper
|
|
+ trimCache(); // Paper
|
|
}
|
|
|
|
RegionFile regionfile1 = new RegionFile(file2);
|
|
@@ -43,6 +45,22 @@ public class RegionFileCache {
|
|
}
|
|
}
|
|
|
|
+ // Paper Start
|
|
+ private static synchronized void trimCache() {
|
|
+ Iterator<Map.Entry<File, RegionFile>> itr = RegionFileCache.a.entrySet().iterator();
|
|
+ int count = RegionFileCache.a.size() - PaperConfig.regionFileCacheSize;
|
|
+ while (count-- >= 0 && itr.hasNext()) {
|
|
+ try {
|
|
+ itr.next().getValue().c();
|
|
+ } catch (IOException ioexception) {
|
|
+ ioexception.printStackTrace();
|
|
+ ServerInternalException.reportInternalException(ioexception);
|
|
+ }
|
|
+ itr.remove();
|
|
+ }
|
|
+ }
|
|
+ // Paper End
|
|
+
|
|
public static synchronized void a() {
|
|
Iterator iterator = RegionFileCache.a.values().iterator();
|
|
|
|
--
|
|
2.8.2
|
|
|