mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-20 03:35:51 +00:00
Some optimizations, also changed /sf timings to use floating point times
This commit is contained in:
parent
e036e0f756
commit
9f3c3a413b
@ -66,8 +66,9 @@ public final class OreGenSystem {
|
||||
public static int getSupplies(OreGenResource resource, Chunk chunk, boolean generate) {
|
||||
if (resource == null) return 0;
|
||||
|
||||
if (BlockStorage.hasChunkInfo(chunk, "resources_" + resource.getName().toUpperCase())) {
|
||||
return Integer.parseInt(BlockStorage.getChunkInfo(chunk, "resources_" + resource.getName().toUpperCase()));
|
||||
String supply = BlockStorage.getChunkInfo(chunk, "resources_" + resource.getName().toUpperCase());
|
||||
if (supply != null) {
|
||||
return Integer.parseInt(supply);
|
||||
}
|
||||
else if (!generate) {
|
||||
return 0;
|
||||
|
@ -98,11 +98,16 @@ public abstract class OilPump extends AContainer {
|
||||
else {
|
||||
OreGenResource oil = OreGenSystem.getResource("Oil");
|
||||
int supplies = OreGenSystem.getSupplies(oil, b.getChunk(), false);
|
||||
|
||||
if (supplies > 0) {
|
||||
for (int slot: getInputSlots()) {
|
||||
if (SlimefunManager.isItemSimiliar(inv.getItemInSlot(slot), new ItemStack(Material.BUCKET), true)) {
|
||||
MachineRecipe r = new MachineRecipe(26, new ItemStack[0], new ItemStack[] {SlimefunItems.BUCKET_OF_OIL});
|
||||
if (!inv.fits(SlimefunItems.BUCKET_OF_OIL, getOutputSlots())) return;
|
||||
|
||||
if (!inv.fits(SlimefunItems.BUCKET_OF_OIL, getOutputSlots())) {
|
||||
return;
|
||||
}
|
||||
|
||||
inv.replaceExistingItem(slot, InvUtils.decreaseItem(inv.getItemInSlot(slot), 1));
|
||||
processing.put(b, r);
|
||||
progress.put(b, r.getTicks());
|
||||
|
@ -8,6 +8,8 @@ import java.util.Set;
|
||||
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||
|
||||
public class BlockInfoConfig extends Config {
|
||||
@ -136,4 +138,8 @@ public class BlockInfoConfig extends Config {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public String toJSON() {
|
||||
return new GsonBuilder().create().toJson(data);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -160,7 +160,9 @@ public class BlockStorage {
|
||||
FileConfiguration cfg = YamlConfiguration.loadConfiguration(chunks);
|
||||
for (String key: cfg.getKeys(false)) {
|
||||
try {
|
||||
if (world.getName().equals(key.split(";")[0])) SlimefunPlugin.getUtilities().mapChunks.put(key, cfg.getString(key));
|
||||
if (world.getName().equals(key.split(";")[0])) {
|
||||
SlimefunPlugin.getUtilities().mapChunks.put(key, new BlockInfoConfig(parseJSON(cfg.getString(key))));
|
||||
}
|
||||
} catch (Exception x) {
|
||||
Slimefun.getLogger().log(Level.WARNING, "Failed to load " + chunks.getName() + " in World " + world.getName() + '(' + key + ") for Slimefun " + Slimefun.getVersion(), x);
|
||||
}
|
||||
@ -238,6 +240,7 @@ public class BlockStorage {
|
||||
for (Map.Entry<String, Config> entry: cache.entrySet()) {
|
||||
blocksCache.remove(entry.getKey());
|
||||
Config cfg = entry.getValue();
|
||||
|
||||
if (cfg.getKeys().isEmpty()) {
|
||||
if (!cfg.getFile().delete()) {
|
||||
Slimefun.getLogger().log(Level.WARNING, "Could not delete File: " + cfg.getFile().getName());
|
||||
@ -269,10 +272,10 @@ public class BlockStorage {
|
||||
|
||||
if (chunkChanges > 0) {
|
||||
File chunks = new File(path_chunks + "chunks.sfc");
|
||||
Config cfg = new Config("data-storage/Slimefun/temp.yml");
|
||||
Config cfg = new Config(path_chunks + "chunks.temp");
|
||||
|
||||
for (Map.Entry<String, String> entry: SlimefunPlugin.getUtilities().mapChunks.entrySet()) {
|
||||
cfg.setValue(entry.getKey(), entry.getValue());
|
||||
for (Map.Entry<String, BlockInfoConfig> entry: SlimefunPlugin.getUtilities().mapChunks.entrySet()) {
|
||||
cfg.setValue(entry.getKey(), entry.getValue().toJSON());
|
||||
}
|
||||
|
||||
cfg.save(chunks);
|
||||
@ -369,7 +372,7 @@ public class BlockStorage {
|
||||
|
||||
private static String getJSONData(Chunk chunk) {
|
||||
if (chunk == null) return null;
|
||||
return SlimefunPlugin.getUtilities().mapChunks.get(serializeChunk(chunk));
|
||||
return SlimefunPlugin.getUtilities().mapChunks.get(serializeChunk(chunk)).toJSON();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@ -422,7 +425,9 @@ public class BlockStorage {
|
||||
storage.storage.put(l, cfg);
|
||||
if (BlockMenuPreset.isInventory(cfg.getString("id"))) {
|
||||
if (BlockMenuPreset.isUniversalInventory(cfg.getString("id"))) {
|
||||
if (!SlimefunPlugin.getUtilities().universalInventories.containsKey(cfg.getString("id"))) storage.loadUniversalInventory(BlockMenuPreset.getPreset(cfg.getString("id")));
|
||||
if (!SlimefunPlugin.getUtilities().universalInventories.containsKey(cfg.getString("id"))) {
|
||||
storage.loadUniversalInventory(BlockMenuPreset.getPreset(cfg.getString("id")));
|
||||
}
|
||||
}
|
||||
else if (!storage.hasInventory(l)) {
|
||||
File file = new File("data-storage/Slimefun/stored-inventories/" + serializeLocation(l) + ".sfi");
|
||||
@ -433,9 +438,11 @@ public class BlockStorage {
|
||||
}
|
||||
refreshCache(getStorage(l.getWorld()), l, cfg.getString("id"), serializeBlockInfo(cfg), updateTicker);
|
||||
}
|
||||
|
||||
public static void setBlockInfo(Block b, String json, boolean updateTicker) {
|
||||
setBlockInfo(b.getLocation(), json, updateTicker);
|
||||
}
|
||||
|
||||
public static void setBlockInfo(Location l, String json, boolean updateTicker) {
|
||||
Config blockInfo = json == null ? new BlockInfoConfig() : parseBlockInfo(l, json);
|
||||
if (blockInfo == null) return;
|
||||
@ -666,17 +673,11 @@ public class BlockStorage {
|
||||
|
||||
public static Config getChunkInfo(Chunk chunk) {
|
||||
try {
|
||||
Config cfg = new Config("data-storage/Slimefun/temp.yml");
|
||||
if (!SlimefunPlugin.getUtilities().mapChunks.containsKey(serializeChunk(chunk))) return cfg;
|
||||
|
||||
for (Map.Entry<String, String> entry: parseJSON(getJSONData(chunk)).entrySet()) {
|
||||
cfg.setValue(entry.getKey(), entry.getValue());
|
||||
}
|
||||
|
||||
return cfg;
|
||||
BlockInfoConfig cfg = SlimefunPlugin.getUtilities().mapChunks.get(serializeChunk(chunk));
|
||||
return cfg == null ? new BlockInfoConfig() : cfg;
|
||||
} catch (Exception x) {
|
||||
Slimefun.getLogger().log(Level.SEVERE, "Failed to parse ChunkInfo for Chunk: " + (chunk == null ? "?": chunk.getX()) + ", " + (chunk == null ? "?": chunk.getZ()) + " (" + getJSONData(chunk) + ") for Slimefun " + Slimefun.getVersion(), x);
|
||||
return new Config("data-storage/Slimefun/temp.yml");
|
||||
return new BlockInfoConfig();
|
||||
}
|
||||
}
|
||||
|
||||
@ -685,16 +686,14 @@ public class BlockStorage {
|
||||
}
|
||||
|
||||
public static void setChunkInfo(Chunk chunk, String key, String value) {
|
||||
Config cfg = new Config("data-storage/Slimefun/temp.yml");
|
||||
if (hasChunkInfo(chunk)) cfg = getChunkInfo(chunk);
|
||||
cfg.setValue(key, value);
|
||||
BlockInfoConfig cfg = SlimefunPlugin.getUtilities().mapChunks.get(serializeChunk(chunk));
|
||||
|
||||
JsonObject json = new JsonObject();
|
||||
for (String path: cfg.getKeys()) {
|
||||
json.add(path, new JsonPrimitive(cfg.getString(path)));
|
||||
if (cfg == null) {
|
||||
cfg = new BlockInfoConfig();
|
||||
SlimefunPlugin.getUtilities().mapChunks.put(serializeChunk(chunk), cfg);
|
||||
}
|
||||
|
||||
SlimefunPlugin.getUtilities().mapChunks.put(serializeChunk(chunk), json.toString());
|
||||
cfg.setValue(key, value);
|
||||
|
||||
chunkChanges++;
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package me.mrCookieSlime.Slimefun.api;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
@ -29,6 +30,8 @@ import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||
|
||||
public class TickerTask implements Runnable {
|
||||
|
||||
private static final DecimalFormat decimalFormat = new DecimalFormat("#.###");
|
||||
|
||||
private boolean halted = false;
|
||||
|
||||
protected final Map<Location, Location> move = new HashMap<>();
|
||||
@ -60,7 +63,7 @@ public class TickerTask implements Runnable {
|
||||
if (running) return;
|
||||
|
||||
running = true;
|
||||
long timestamp = System.currentTimeMillis();
|
||||
long timestamp = System.nanoTime();
|
||||
|
||||
skipped = 0;
|
||||
chunks = 0;
|
||||
@ -85,7 +88,7 @@ public class TickerTask implements Runnable {
|
||||
|
||||
if (!halted) {
|
||||
for (final String c: BlockStorage.getTickingChunks()) {
|
||||
long timestamp2 = System.currentTimeMillis();
|
||||
long timestamp2 = System.nanoTime();
|
||||
chunks++;
|
||||
|
||||
for (final Location l: BlockStorage.getTickingLocations(c)) {
|
||||
@ -102,17 +105,17 @@ public class TickerTask implements Runnable {
|
||||
if (item.getBlockTicker().isSynchronized()) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
|
||||
try {
|
||||
long timestamp3 = System.currentTimeMillis();
|
||||
long timestamp3 = System.nanoTime();
|
||||
item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l));
|
||||
|
||||
Long machinetime = machineTimings.get(item.getID());
|
||||
Integer chunk = chunkItemCount.get(c);
|
||||
Integer machine = machineCount.get(item.getID());
|
||||
|
||||
machineTimings.put(item.getID(), (machinetime != null ? machinetime: 0) + (System.currentTimeMillis() - timestamp3));
|
||||
machineTimings.put(item.getID(), (machinetime != null ? machinetime: 0) + (System.nanoTime() - timestamp3));
|
||||
chunkItemCount.put(c, (chunk != null ? chunk: 0) + 1);
|
||||
machineCount.put(item.getID(), (machine != null ? machine: 0) + 1);
|
||||
blockTimings.put(l, System.currentTimeMillis() - timestamp3);
|
||||
blockTimings.put(l, System.nanoTime() - timestamp3);
|
||||
} catch (Exception x) {
|
||||
int errors = bugged.getOrDefault(l, 0);
|
||||
reportErrors(l, item, x, errors);
|
||||
@ -120,13 +123,13 @@ public class TickerTask implements Runnable {
|
||||
});
|
||||
}
|
||||
else {
|
||||
long timestamp3 = System.currentTimeMillis();
|
||||
long timestamp3 = System.nanoTime();
|
||||
item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l));
|
||||
|
||||
machineTimings.merge(item.getID(), (System.currentTimeMillis() - timestamp3), Long::sum);
|
||||
machineTimings.merge(item.getID(), (System.nanoTime() - timestamp3), Long::sum);
|
||||
chunkItemCount.merge(c, 1, Integer::sum);
|
||||
machineCount.merge(item.getID(), 1, Integer::sum);
|
||||
blockTimings.put(l, System.currentTimeMillis() - timestamp3);
|
||||
blockTimings.put(l, System.nanoTime() - timestamp3);
|
||||
}
|
||||
tickers.add(item.getBlockTicker());
|
||||
} catch (Exception x) {
|
||||
@ -144,7 +147,7 @@ public class TickerTask implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
chunkTimings.put(c, System.currentTimeMillis() - timestamp2);
|
||||
chunkTimings.put(c, System.nanoTime() - timestamp2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -159,7 +162,7 @@ public class TickerTask implements Runnable {
|
||||
iterator.remove();
|
||||
}
|
||||
|
||||
time = System.currentTimeMillis() - timestamp;
|
||||
time = System.nanoTime() - timestamp;
|
||||
running = false;
|
||||
}
|
||||
|
||||
@ -187,15 +190,15 @@ public class TickerTask implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
public long getTime() {
|
||||
return time;
|
||||
public String getTime() {
|
||||
return toMillis(time);
|
||||
}
|
||||
|
||||
public void info(CommandSender sender) {
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2== &aSlimefun Diagnostic Tool &2=="));
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Halted: &e&l" + String.valueOf(halted).toUpperCase()));
|
||||
sender.sendMessage("");
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Impact: &e" + time + "ms / 50-750ms"));
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Impact: &e" + toMillis(time)));
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Chunks: &e" + chunks));
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Machines: &e" + machines));
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Skipped Machines: &e" + skipped));
|
||||
@ -215,10 +218,10 @@ public class TickerTask implements Runnable {
|
||||
|
||||
for (Map.Entry<String, Long> entry : timings) {
|
||||
int count = machineCount.get(entry.getKey());
|
||||
if (entry.getValue() > 0)
|
||||
if (entry.getValue() > 500_000)
|
||||
hover.append("\n&c").append(entry.getKey()).append(" - ")
|
||||
.append(count).append("x &7(").append(entry.getValue()).append("ms, ")
|
||||
.append(entry.getValue() / count).append("ms avg/machine)");
|
||||
.append(count).append("x &7(").append(toMillis(entry.getValue())).append(", ")
|
||||
.append(toMillis(entry.getValue() / count)).append(" avg/machine)");
|
||||
else
|
||||
hidden++;
|
||||
}
|
||||
@ -237,11 +240,10 @@ public class TickerTask implements Runnable {
|
||||
|
||||
for (Map.Entry<String, Long> entry: timings) {
|
||||
int count = machineCount.get(entry.getKey());
|
||||
if (entry.getValue() > 0)
|
||||
sender.sendMessage(ChatColors.color(" &e" + entry.getKey() + " - " + count + "x &7(" + entry.getValue() + "ms"
|
||||
+ ", " + (entry.getValue() / count) + "ms avg/machine)"));
|
||||
else
|
||||
hidden++;
|
||||
if (entry.getValue() > 500_000) {
|
||||
sender.sendMessage(ChatColors.color(" &e" + entry.getKey() + " - " + count + "x &7(" + toMillis(entry.getValue()) + ", " + toMillis(entry.getValue() / count) + " avg/machine)"));
|
||||
}
|
||||
else hidden++;
|
||||
}
|
||||
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c+ &4" + hidden + " Hidden"));
|
||||
@ -265,7 +267,7 @@ public class TickerTask implements Runnable {
|
||||
if (entry.getValue() > 0)
|
||||
hover.append("\n&c").append(entry.getKey().replace("CraftChunk", "")).append(" - ")
|
||||
.append(chunkItemCount.getOrDefault(entry.getKey(), 0))
|
||||
.append("x &7(").append(entry.getValue()).append("ms)");
|
||||
.append("x &7(").append(toMillis(entry.getValue())).append(")");
|
||||
else
|
||||
hidden++;
|
||||
}
|
||||
@ -285,7 +287,7 @@ public class TickerTask implements Runnable {
|
||||
for (Map.Entry<String, Long> entry: timings) {
|
||||
if (!chunksSkipped.contains(entry.getKey())) {
|
||||
if (entry.getValue() > 0) sender.sendMessage(" &c" + entry.getKey().replace("CraftChunk", "") + " - "
|
||||
+ (chunkItemCount.getOrDefault(entry.getKey(), 0)) + "x &7(" + entry.getValue() + "ms)");
|
||||
+ (chunkItemCount.getOrDefault(entry.getKey(), 0)) + "x &7(" + toMillis(entry.getValue()) + ")");
|
||||
else hidden++;
|
||||
}
|
||||
}
|
||||
@ -317,6 +319,10 @@ public class TickerTask implements Runnable {
|
||||
halted = true;
|
||||
}
|
||||
|
||||
private String toMillis(long time) {
|
||||
return decimalFormat.format(time / 1000000F) + "ms";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TickerTask {\n"
|
||||
|
@ -27,6 +27,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||
import me.mrCookieSlime.Slimefun.Setup.PostSlimefunLoadingHandler;
|
||||
import me.mrCookieSlime.Slimefun.ancient_altar.AltarRecipe;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockInfoConfig;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
import me.mrCookieSlime.Slimefun.api.GuideHandler;
|
||||
import me.mrCookieSlime.Slimefun.api.PlayerProfile;
|
||||
@ -92,7 +93,7 @@ public final class Utilities {
|
||||
public final Map<String, BlockStorage> worlds = new HashMap<>();
|
||||
public final Set<String> loadedTickers = new HashSet<>();
|
||||
|
||||
public final Map<String, String> mapChunks = new HashMap<>();
|
||||
public final Map<String, BlockInfoConfig> mapChunks = new HashMap<>();
|
||||
public final Map<String, Set<Location>> tickingChunks = new HashMap<>();
|
||||
public final Map<String, UniversalBlockMenu> universalInventories = new HashMap<>();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user