Optimized LoreStreams

This commit is contained in:
Sn0wStorm 2016-06-13 23:26:10 +02:00
parent a4489bfd39
commit 8e7205e0af
6 changed files with 90 additions and 55 deletions

View File

@ -636,8 +636,8 @@ public class Brew {
} }
public void testStore(DataOutputStream out) throws IOException { public void testStore(DataOutputStream out) throws IOException {
out.writeByte(1); // Version
out.writeByte(86); // Parity out.writeByte(86); // Parity
out.writeByte(1); // Version
out.writeInt(quality); out.writeInt(quality);
int bools = 0; int bools = 0;
bools += (distillRuns != 0 ? 1 : 0); bools += (distillRuns != 0 ? 1 : 0);
@ -664,14 +664,14 @@ public class Brew {
} }
public void testLoad(DataInputStream in) throws IOException { public void testLoad(DataInputStream in) throws IOException {
if (in.readByte() != 1) {
P.p.log("unknown version");
return;
}
if (in.readByte() != 86) { if (in.readByte() != 86) {
P.p.log("parity check failed"); P.p.log("parity check failed");
return; return;
} }
if (in.readByte() != 1) {
P.p.log("unknown version");
return;
}
if (in.readInt() != quality) { if (in.readInt() != quality) {
P.p.log("quality wrong"); P.p.log("quality wrong");
} }
@ -706,6 +706,7 @@ public class Brew {
P.p.log("stat wrong"); P.p.log("stat wrong");
} }
ingredients.testLoad(in); ingredients.testLoad(in);
P.p.log("load successful");
} }
// Saves all data // Saves all data

View File

@ -8,8 +8,8 @@ import com.dre.brewery.integration.WGBarrelOld;
import com.dre.brewery.listeners.*; import com.dre.brewery.listeners.*;
import com.dre.brewery.lore.Base91DecoderStream; import com.dre.brewery.lore.Base91DecoderStream;
import com.dre.brewery.lore.Base91EncoderStream; import com.dre.brewery.lore.Base91EncoderStream;
import com.dre.brewery.lore.LoreReader; import com.dre.brewery.lore.LoreLoadStream;
import com.dre.brewery.lore.LoreWriter; import com.dre.brewery.lore.LoreSaveStream;
import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang.math.NumberUtils;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -68,7 +68,7 @@ public class P extends JavaPlugin {
try { try {
ItemMeta meta = new ItemStack(Material.POTION).getItemMeta(); 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.writeInt(2);
data.writeLong(5); data.writeLong(5);
@ -86,7 +86,7 @@ public class P extends JavaPlugin {
data.close(); data.close();
meta.getLore(); 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() + ", "); P.p.log(dataIn.readInt() + ", " + dataIn.readLong() + ", ");

View File

@ -4,8 +4,8 @@ import com.dre.brewery.*;
import com.dre.brewery.integration.LogBlockBarrel; import com.dre.brewery.integration.LogBlockBarrel;
import com.dre.brewery.lore.Base91DecoderStream; import com.dre.brewery.lore.Base91DecoderStream;
import com.dre.brewery.lore.Base91EncoderStream; import com.dre.brewery.lore.Base91EncoderStream;
import com.dre.brewery.lore.LoreReader; import com.dre.brewery.lore.LoreLoadStream;
import com.dre.brewery.lore.LoreWriter; import com.dre.brewery.lore.LoreSaveStream;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -28,7 +28,6 @@ import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.UUID; import java.util.UUID;
/** /**
@ -240,7 +239,7 @@ public class InventoryListener implements Listener {
brew.touch(); brew.touch();
try { try {
DataInputStream in = new DataInputStream(new Base91DecoderStream(new LoreReader(potion))); DataInputStream in = new DataInputStream(new Base91DecoderStream(new LoreLoadStream(potion)));
brew.testLoad(in); brew.testLoad(in);
@ -261,12 +260,12 @@ public class InventoryListener implements Listener {
}*/ }*/
in.close(); in.close();
} catch (IOException e) { } catch (IllegalArgumentException argExc) {
e.printStackTrace(); P.p.log("No Data in Lore");
try { try {
DataOutputStream out = new DataOutputStream(new Base91EncoderStream(new LoreWriter(potion, 2))); DataOutputStream out = new DataOutputStream(new Base91EncoderStream(new LoreSaveStream(potion, 2)));
brew.testStore(out); brew.testStore(out);
@ -297,6 +296,8 @@ public class InventoryListener implements Listener {
h.printStackTrace(); h.printStackTrace();
} }
} catch (IOException e) {
e.printStackTrace();
} }
} }
} }

View File

@ -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<String> 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();
}
}

View File

@ -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<String> 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");
}
}

View File

@ -5,15 +5,20 @@ import org.bukkit.inventory.meta.ItemMeta;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
public class LoreWriter extends ByteArrayOutputStream { public class LoreSaveStream extends ByteArrayOutputStream {
private ItemMeta meta; private ItemMeta meta;
private int line; private int line;
private boolean flushed = false; 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); super(128);
this.meta = meta; this.meta = meta;
this.line = line; this.line = line;
@ -43,10 +48,24 @@ public class LoreWriter extends ByteArrayOutputStream {
} else { } else {
lore = new ArrayList<>(); lore = new ArrayList<>();
} }
int prev = 0;
for (Iterator<String> 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) { while (lore.size() < line) {
lore.add(""); lore.add("");
} }
//TODO when existing data string in lore
lore.add(line, loreLineBuilder.toString()); lore.add(line, loreLineBuilder.toString());
meta.setLore(lore); meta.setLore(lore);
} }