1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

Massive performance improvements to Rainbow Glass Panes

This commit is contained in:
TheBusyBiscuit 2020-07-03 17:43:10 +02:00
parent 06b14836dd
commit 768e4f1021
4 changed files with 39 additions and 22 deletions

View File

@ -41,22 +41,23 @@
* Added an AoE damage effect to the Explosive Bow
* Added runtime deprecation warnings for ItemHandlers and Attributes used by Addons
* Added a proper lag profiler
* Added per-plugin lag info to /sf timings
#### Changes
* Coolant Cells now last twice as long
* Ticking blocks will now catch more errors caused by addons
* Massive performance improvements to GPS/GEO machines, especially Oil Pump and GEO Miner
* Changed the texture for the Nuclear Reactor
* Changed the texture for the Nether Star Reactor
* Performance improvements to Rainbow Blocks
* Crafting Tin cans now produces 8 items instead of 4
* Multi Tool lore now says "Crouch" instead of "Hold Shift"
* items which cannot be distributed by a Cargo Net will be dropped on the ground now instead of getting deleted
* Items which cannot be distributed by a Cargo Net will be dropped on the ground now instead of getting deleted
* Slimefun no longer supports CraftBukkit
* Item Energy is now also stored persistently via NBT
* General performance improvements for ticking blocks
* Performance improvements to GPS/GEO machines, especially Oil Pump and GEO Miner
* Performance improvements for ticking blocks
* Performance improvements to the Cargo Net
* Some performance improvements to the Energy Net
* performance improvements to the Energy Net
* Performance improvements to Rainbow Blocks
#### Fixes
* Fixed #2005
@ -79,6 +80,7 @@
* Fixed /sf timings reporting slightly inaccurate timings
* Fixed concurrency-related issues with the profiling
* Fixed #2066
* Fixed Rainbow Glass Panes not properly connecting to blocks
## Release Candidate 13 (16 Jun 2020)
https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#13

View File

@ -2,10 +2,12 @@ package io.github.thebusybiscuit.slimefun4.core.handlers;
import java.util.Arrays;
import org.apache.commons.lang.Validate;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Waterlogged;
import org.bukkit.block.data.type.GlassPane;
import io.github.thebusybiscuit.cscorelib2.collections.LoopIterator;
import io.github.thebusybiscuit.cscorelib2.materials.MaterialCollection;
@ -29,31 +31,33 @@ import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
public class RainbowTickHandler extends BlockTicker {
private final LoopIterator<Material> iterator;
private final boolean waterlogged;
private final boolean glassPanes;
private Material material;
public RainbowTickHandler(Material... materials) {
Validate.noNullElements(materials, "A RainbowTicker cannot have a Material that is null!");
if (materials.length == 0) {
throw new IllegalArgumentException("A RainbowTicker must have at least one Material associated with it!");
}
waterlogged = containsWaterlogged(materials);
glassPanes = containsGlassPanes(materials);
iterator = new LoopIterator<>(Arrays.asList(materials));
material = iterator.next();
}
/**
* This method checks whether a given {@link Material} array contains any {@link Material}
* that would result in a {@link Waterlogged} {@link BlockData}.
* that would result in a {@link GlassPane} {@link BlockData}.
* This is done to save performance, so we don't have to validate {@link BlockData} at
* runtime.
*
* @param materials
* The {@link Material} Array to check
*
* @return Whether the array contained any {@link Waterlogged} materials
* @return Whether the array contained any {@link GlassPane} materials
*/
private boolean containsWaterlogged(Material[] materials) {
private boolean containsGlassPanes(Material[] materials) {
if (SlimefunPlugin.getMinecraftVersion() == MinecraftVersion.UNIT_TEST) {
// BlockData is not available to us during Unit Tests :/
return false;
@ -62,8 +66,8 @@ public class RainbowTickHandler extends BlockTicker {
for (Material type : materials) {
// This BlockData is purely virtual and only created on startup, it should have
// no impact on performance, in fact it should save performance as it preloads
// the data but also saves heavy calls for non-waterlogged Materials
if (type.createBlockData() instanceof Waterlogged) {
// the data but also saves heavy calls for other Materials
if (type.createBlockData() instanceof GlassPane) {
return true;
}
}
@ -83,19 +87,29 @@ public class RainbowTickHandler extends BlockTicker {
return;
}
if (waterlogged) {
if (glassPanes) {
BlockData blockData = b.getBlockData();
b.setType(material, true);
if (blockData instanceof Waterlogged && ((Waterlogged) blockData).isWaterlogged()) {
Waterlogged block = (Waterlogged) b.getBlockData();
block.setWaterlogged(true);
if (blockData instanceof GlassPane) {
BlockData block = material.createBlockData(bd -> {
if (bd instanceof GlassPane) {
GlassPane previousData = (GlassPane) blockData;
GlassPane nextData = (GlassPane) bd;
nextData.setWaterlogged(previousData.isWaterlogged());
for (BlockFace face : previousData.getAllowedFaces()) {
nextData.setFace(face, previousData.hasFace(face));
}
}
});
b.setBlockData(block);
return;
}
}
else {
b.setType(material, false);
}
b.setType(material, false);
}
@Override

View File

@ -66,7 +66,7 @@ public final class ChatUtils {
*/
public static String humanize(String string) {
StringBuilder builder = new StringBuilder();
String[] segments = string.toLowerCase(Locale.ROOT).split("_");
String[] segments = PatternUtils.UNDERSCORE.split(string.toLowerCase(Locale.ROOT));
builder.append(Character.toUpperCase(segments[0].charAt(0))).append(segments[0].substring(1));

View File

@ -21,6 +21,7 @@ public final class PatternUtils {
public static final Pattern COMMA = Pattern.compile(",");
public static final Pattern SLASH_SEPARATOR = Pattern.compile(" / ");
public static final Pattern DASH = Pattern.compile("-");
public static final Pattern UNDERSCORE = Pattern.compile("_");
public static final Pattern ASCII = Pattern.compile("[A-Za-z \"_]+");
public static final Pattern ALPHANUMERIC = Pattern.compile("[A-Fa-f0-9]+");
public static final Pattern NUMERIC = Pattern.compile("[0-9]+");