From 8e7205e0afb4b54dea74f07e78eee1d21fecf704 Mon Sep 17 00:00:00 2001 From: Sn0wStorm Date: Mon, 13 Jun 2016 23:26:10 +0200 Subject: [PATCH] Optimized LoreStreams --- src/com/dre/brewery/Brew.java | 11 ++-- src/com/dre/brewery/P.java | 8 +-- .../brewery/listeners/InventoryListener.java | 15 +++--- src/com/dre/brewery/lore/LoreLoadStream.java | 50 +++++++++++++++++++ src/com/dre/brewery/lore/LoreReader.java | 36 ------------- .../{LoreWriter.java => LoreSaveStream.java} | 25 ++++++++-- 6 files changed, 90 insertions(+), 55 deletions(-) create mode 100644 src/com/dre/brewery/lore/LoreLoadStream.java delete mode 100644 src/com/dre/brewery/lore/LoreReader.java rename src/com/dre/brewery/lore/{LoreWriter.java => LoreSaveStream.java} (70%) diff --git a/src/com/dre/brewery/Brew.java b/src/com/dre/brewery/Brew.java index 85c133b..dfd1c5e 100644 --- a/src/com/dre/brewery/Brew.java +++ b/src/com/dre/brewery/Brew.java @@ -636,8 +636,8 @@ public class Brew { } public void testStore(DataOutputStream out) throws IOException { - out.writeByte(1); // Version out.writeByte(86); // Parity + out.writeByte(1); // Version out.writeInt(quality); int bools = 0; bools += (distillRuns != 0 ? 1 : 0); @@ -664,14 +664,14 @@ public class Brew { } public void testLoad(DataInputStream in) throws IOException { - if (in.readByte() != 1) { - P.p.log("unknown version"); - return; - } if (in.readByte() != 86) { P.p.log("parity check failed"); return; } + if (in.readByte() != 1) { + P.p.log("unknown version"); + return; + } if (in.readInt() != quality) { P.p.log("quality wrong"); } @@ -706,6 +706,7 @@ public class Brew { P.p.log("stat wrong"); } ingredients.testLoad(in); + P.p.log("load successful"); } // Saves all data diff --git a/src/com/dre/brewery/P.java b/src/com/dre/brewery/P.java index 3e7d18b..cffbfc8 100644 --- a/src/com/dre/brewery/P.java +++ b/src/com/dre/brewery/P.java @@ -8,8 +8,8 @@ import com.dre.brewery.integration.WGBarrelOld; import com.dre.brewery.listeners.*; import com.dre.brewery.lore.Base91DecoderStream; import com.dre.brewery.lore.Base91EncoderStream; -import com.dre.brewery.lore.LoreReader; -import com.dre.brewery.lore.LoreWriter; +import com.dre.brewery.lore.LoreLoadStream; +import com.dre.brewery.lore.LoreSaveStream; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.*; import org.bukkit.block.Block; @@ -68,7 +68,7 @@ public class P extends JavaPlugin { try { ItemMeta meta = new ItemStack(Material.POTION).getItemMeta(); - DataOutputStream data = new DataOutputStream(new Base91EncoderStream(new LoreWriter(meta, 3))); + DataOutputStream data = new DataOutputStream(new Base91EncoderStream(new LoreSaveStream(meta, 3))); data.writeInt(2); data.writeLong(5); @@ -86,7 +86,7 @@ public class P extends JavaPlugin { data.close(); meta.getLore(); - DataInputStream dataIn = new DataInputStream(new Base91DecoderStream(new LoreReader(meta))); + DataInputStream dataIn = new DataInputStream(new Base91DecoderStream(new LoreLoadStream(meta))); P.p.log(dataIn.readInt() + ", " + dataIn.readLong() + ", "); diff --git a/src/com/dre/brewery/listeners/InventoryListener.java b/src/com/dre/brewery/listeners/InventoryListener.java index 8587734..d333c00 100644 --- a/src/com/dre/brewery/listeners/InventoryListener.java +++ b/src/com/dre/brewery/listeners/InventoryListener.java @@ -4,8 +4,8 @@ import com.dre.brewery.*; import com.dre.brewery.integration.LogBlockBarrel; import com.dre.brewery.lore.Base91DecoderStream; import com.dre.brewery.lore.Base91EncoderStream; -import com.dre.brewery.lore.LoreReader; -import com.dre.brewery.lore.LoreWriter; +import com.dre.brewery.lore.LoreLoadStream; +import com.dre.brewery.lore.LoreSaveStream; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; @@ -28,7 +28,6 @@ import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.UUID; /** @@ -240,7 +239,7 @@ public class InventoryListener implements Listener { brew.touch(); try { - DataInputStream in = new DataInputStream(new Base91DecoderStream(new LoreReader(potion))); + DataInputStream in = new DataInputStream(new Base91DecoderStream(new LoreLoadStream(potion))); brew.testLoad(in); @@ -261,12 +260,12 @@ public class InventoryListener implements Listener { }*/ in.close(); - } catch (IOException e) { - e.printStackTrace(); + } catch (IllegalArgumentException argExc) { + P.p.log("No Data in Lore"); try { - DataOutputStream out = new DataOutputStream(new Base91EncoderStream(new LoreWriter(potion, 2))); + DataOutputStream out = new DataOutputStream(new Base91EncoderStream(new LoreSaveStream(potion, 2))); brew.testStore(out); @@ -297,6 +296,8 @@ public class InventoryListener implements Listener { h.printStackTrace(); } + } catch (IOException e) { + e.printStackTrace(); } } } diff --git a/src/com/dre/brewery/lore/LoreLoadStream.java b/src/com/dre/brewery/lore/LoreLoadStream.java new file mode 100644 index 0000000..3d73889 --- /dev/null +++ b/src/com/dre/brewery/lore/LoreLoadStream.java @@ -0,0 +1,50 @@ +package com.dre.brewery.lore; + +import org.bukkit.inventory.meta.ItemMeta; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; + +public class LoreLoadStream extends ByteArrayInputStream { + + public LoreLoadStream(ItemMeta meta) throws IllegalArgumentException { + this(meta, -1); + } + + public LoreLoadStream(ItemMeta meta, int line) throws IllegalArgumentException { + super(loreToBytes(meta, line)); + } + + private static byte[] loreToBytes(ItemMeta meta, int lineNum) throws IllegalArgumentException { + if (meta.hasLore()) { + List lore = meta.getLore(); + if (lineNum >= 0) { + String line = lore.get(lineNum); + if (line.startsWith("§%")) { + return loreLineToBytes(line); + } + } + for (String line : lore) { + if (line.startsWith("§%")) { + return loreLineToBytes(line); + } + } + } + throw new IllegalArgumentException("Meta has no data in lore"); + } + + private static byte[] loreLineToBytes(String line) { + StringBuilder build = new StringBuilder((int) (line.length() / 2F)); + byte skip = 2; + for (char c : line.toCharArray()) { + if (skip > 0) { + skip--; + continue; + } + if (c == '§') continue; + build.append(c); + } + return build.toString().getBytes(); + } +} diff --git a/src/com/dre/brewery/lore/LoreReader.java b/src/com/dre/brewery/lore/LoreReader.java deleted file mode 100644 index b12f2ec..0000000 --- a/src/com/dre/brewery/lore/LoreReader.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dre.brewery.lore; - -import org.bukkit.inventory.meta.ItemMeta; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.List; - -public class LoreReader extends ByteArrayInputStream { - - public LoreReader(ItemMeta meta) throws IOException { - super(loreToBytes(meta)); - } - - private static byte[] loreToBytes(ItemMeta meta) throws IOException { - if (meta.hasLore()) { - List lore = meta.getLore(); - for (String line : lore) { - if (line.startsWith("§%")) { - StringBuilder build = new StringBuilder((int) (line.length() / 2F)); - byte skip = 2; - for (char c : line.toCharArray()) { - if (skip > 0) { - skip--; - continue; - } - if (c == '§') continue; - build.append(c); - } - return build.toString().getBytes(); - } - } - } - throw new IOException("Meta has no data in lore"); - } -} diff --git a/src/com/dre/brewery/lore/LoreWriter.java b/src/com/dre/brewery/lore/LoreSaveStream.java similarity index 70% rename from src/com/dre/brewery/lore/LoreWriter.java rename to src/com/dre/brewery/lore/LoreSaveStream.java index 4d00247..a895691 100644 --- a/src/com/dre/brewery/lore/LoreWriter.java +++ b/src/com/dre/brewery/lore/LoreSaveStream.java @@ -5,15 +5,20 @@ import org.bukkit.inventory.meta.ItemMeta; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; -public class LoreWriter extends ByteArrayOutputStream { +public class LoreSaveStream extends ByteArrayOutputStream { private ItemMeta meta; private int line; private boolean flushed = false; - public LoreWriter(ItemMeta meta, int line) { + public LoreSaveStream(ItemMeta meta) { + this(meta, -1); + } + + public LoreSaveStream(ItemMeta meta, int line) { super(128); this.meta = meta; this.line = line; @@ -43,10 +48,24 @@ public class LoreWriter extends ByteArrayOutputStream { } else { lore = new ArrayList<>(); } + int prev = 0; + for (Iterator iterator = lore.iterator(); iterator.hasNext(); ) { + if (iterator.next().startsWith("§%")) { + iterator.remove(); + break; + } + prev++; + } + if (line < 0) { + if (prev >= 0) { + line = prev; + } else { + line = lore.size(); + } + } while (lore.size() < line) { lore.add(""); } - //TODO when existing data string in lore lore.add(line, loreLineBuilder.toString()); meta.setLore(lore); }