mirror of
https://github.com/DieReicheErethons/Brewery.git
synced 2024-09-29 04:07:30 +02:00
Started LoreOutputStream storing data with Base91
This commit is contained in:
parent
41c6782635
commit
34cbdf51dd
@ -6,23 +6,9 @@ import com.dre.brewery.integration.WGBarrel;
|
|||||||
import com.dre.brewery.integration.WGBarrelNew;
|
import com.dre.brewery.integration.WGBarrelNew;
|
||||||
import com.dre.brewery.integration.WGBarrelOld;
|
import com.dre.brewery.integration.WGBarrelOld;
|
||||||
import com.dre.brewery.listeners.*;
|
import com.dre.brewery.listeners.*;
|
||||||
import java.io.File;
|
import com.dre.brewery.lore.LoreOutputStream;
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ListIterator;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
import org.apache.commons.lang.math.NumberUtils;
|
import org.apache.commons.lang.math.NumberUtils;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.*;
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
@ -31,8 +17,12 @@ import org.bukkit.configuration.file.YamlConfiguration;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
public class P extends JavaPlugin {
|
public class P extends JavaPlugin {
|
||||||
public static P p;
|
public static P p;
|
||||||
public static final String configVersion = "1.4";
|
public static final String configVersion = "1.4";
|
||||||
@ -72,6 +62,109 @@ public class P extends JavaPlugin {
|
|||||||
useUUID = !v.matches("(^|.*[^\\.\\d])1\\.[0-6]([^\\d].*|$)") && !v.matches("(^|.*[^\\.\\d])1\\.7\\.[0-5]([^\\d].*|$)");
|
useUUID = !v.matches("(^|.*[^\\.\\d])1\\.[0-6]([^\\d].*|$)") && !v.matches("(^|.*[^\\.\\d])1\\.7\\.[0-5]([^\\d].*|$)");
|
||||||
use1_9 = !v.matches("(^|.*[^\\.\\d])1\\.[0-8]([^\\d].*|$)");
|
use1_9 = !v.matches("(^|.*[^\\.\\d])1\\.[0-8]([^\\d].*|$)");
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
ItemMeta meta = new ItemStack(Material.POTION).getItemMeta();
|
||||||
|
LoreOutputStream out = new LoreOutputStream(meta, 3);
|
||||||
|
DataOutputStream data = new DataOutputStream(out);
|
||||||
|
|
||||||
|
data.writeInt(2);
|
||||||
|
data.writeLong(5);
|
||||||
|
|
||||||
|
byte[] test = new byte[128];
|
||||||
|
test[1] = 6;
|
||||||
|
test[2] = 12;
|
||||||
|
test[3] = 21;
|
||||||
|
data.write(test);
|
||||||
|
|
||||||
|
data.writeInt(123324);
|
||||||
|
data.writeLong(12343843);
|
||||||
|
|
||||||
|
data.close();
|
||||||
|
meta.getLore();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*basE91 basE91 = new basE91();
|
||||||
|
int[] input = new int[] {12, 65, 324, 5, 12, 129459, 1234567, Integer.MIN_VALUE, Integer.MAX_VALUE};
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
DataOutputStream data = new DataOutputStream(stream);
|
||||||
|
for (int i = 0; i < input.length; i++) {
|
||||||
|
data.writeInt(input[i]);
|
||||||
|
}
|
||||||
|
data.flush();
|
||||||
|
data.close();
|
||||||
|
byte[] in = stream.toByteArray();
|
||||||
|
byte[] out = new byte[4096];
|
||||||
|
int lenght = basE91.encode(in, in.length, out);
|
||||||
|
basE91.encEnd(out);
|
||||||
|
String done = new String(out, 0, lenght);
|
||||||
|
|
||||||
|
byte[] tin = done.getBytes();
|
||||||
|
|
||||||
|
byte[] tout = new byte[4096];
|
||||||
|
lenght = basE91.decode(tin, tin.length, tout);
|
||||||
|
basE91.decEnd(tout);
|
||||||
|
|
||||||
|
|
||||||
|
ByteArrayInputStream tstream = new ByteArrayInputStream(tout, 0, lenght);
|
||||||
|
DataInputStream tdata = new DataInputStream(tstream);
|
||||||
|
int[] test = new int[4096];
|
||||||
|
for (int j = 0; j < 6; j++) {
|
||||||
|
if (tstream.available() <= 0) break;
|
||||||
|
test[j] = tdata.readInt();
|
||||||
|
|
||||||
|
}
|
||||||
|
tdata.close();
|
||||||
|
test = test;*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*basE91 basE91 = new basE91();
|
||||||
|
int[] input = new int[] {12, 65, 324, 5, 12, 129459, 1234567, Integer.MIN_VALUE, Integer.MAX_VALUE};
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
DataOutputStream data = new DataOutputStream(stream);
|
||||||
|
for (int i = 0; i < input.length; i++) {
|
||||||
|
data.writeInt(input[i]);
|
||||||
|
}
|
||||||
|
data.flush();
|
||||||
|
data.close();
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
ByteArrayInputStream in = new ByteArrayInputStream(stream.toByteArray());
|
||||||
|
|
||||||
|
encode(in, out, in.available());
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
String done = new String(out.toByteArray());
|
||||||
|
|
||||||
|
ByteArrayInputStream tin = new ByteArrayInputStream(done.getBytes());
|
||||||
|
ByteArrayOutputStream tout = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
decode(tin, tout, tin.available());
|
||||||
|
|
||||||
|
tin.close();
|
||||||
|
tout.flush();
|
||||||
|
tout.close();
|
||||||
|
|
||||||
|
ByteArrayInputStream tstream = new ByteArrayInputStream(tout.toByteArray());
|
||||||
|
DataInputStream tdata = new DataInputStream(tstream);
|
||||||
|
int[] test = new int[4096];
|
||||||
|
for (int j = 0; j < 9; j++) {
|
||||||
|
if (tstream.available() <= 0) break;
|
||||||
|
test[j] = tdata.readInt();
|
||||||
|
|
||||||
|
}
|
||||||
|
tdata.close();
|
||||||
|
test = test;*/
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// load the Config
|
// load the Config
|
||||||
try {
|
try {
|
||||||
if (!readConfig()) {
|
if (!readConfig()) {
|
||||||
|
123
src/com/dre/brewery/lore/LoreOutputStream.java
Normal file
123
src/com/dre/brewery/lore/LoreOutputStream.java
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
package com.dre.brewery.lore;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class LoreOutputStream extends OutputStream {
|
||||||
|
|
||||||
|
private static final basE91 ENCODER = new basE91();
|
||||||
|
|
||||||
|
private byte[] buf = new byte[16];
|
||||||
|
private byte[] encBuf = new byte[24];
|
||||||
|
private int writer = 0;
|
||||||
|
private int encoded = 0;
|
||||||
|
|
||||||
|
private ItemMeta meta;
|
||||||
|
private final int line;
|
||||||
|
private ByteArrayOutputStream stream = new ByteArrayOutputStream(128);
|
||||||
|
|
||||||
|
public LoreOutputStream(ItemMeta meta, int line) {
|
||||||
|
this.meta = meta;
|
||||||
|
this.line = line;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void encFlush() {
|
||||||
|
encoded = ENCODER.encode(buf, writer, encBuf);
|
||||||
|
stream.write(encBuf, 0, encoded);
|
||||||
|
writer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(int b) throws IOException {
|
||||||
|
buf[writer++] = (byte) b;
|
||||||
|
if (writer >= buf.length) {
|
||||||
|
encFlush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(byte[] b, int off, int len) throws IOException {
|
||||||
|
if (len == 0) return;
|
||||||
|
if (b == null) throw new NullPointerException();
|
||||||
|
if (len < 0 || off < 0 || (off + len) > b.length || off > b.length || (off + len) < 0) {
|
||||||
|
throw new IndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf.length - writer >= len) {
|
||||||
|
// Enough space in the buffer, copy it in
|
||||||
|
System.arraycopy(b, off, buf, writer, len);
|
||||||
|
writer += len;
|
||||||
|
if (writer >= buf.length) {
|
||||||
|
encFlush();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (off == 0 && buf.length >= len) {
|
||||||
|
// Buffer is too full, so flush and encode data directly
|
||||||
|
encFlush();
|
||||||
|
encoded = ENCODER.encode(b, len, encBuf);
|
||||||
|
stream.write(encBuf, 0, encoded);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// More data than space in the Buffer
|
||||||
|
ByteArrayInputStream in = new ByteArrayInputStream(b, off, len);
|
||||||
|
while (true) {
|
||||||
|
writer += in.read(buf, writer, buf.length - writer);
|
||||||
|
if (writer >= buf.length) {
|
||||||
|
encFlush();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flush() throws IOException {
|
||||||
|
super.flush();
|
||||||
|
if (writer > 0) {
|
||||||
|
encFlush();
|
||||||
|
}
|
||||||
|
|
||||||
|
encoded = ENCODER.encEnd(encBuf);
|
||||||
|
if (encoded > 0) {
|
||||||
|
stream.write(encBuf, 0, encoded);
|
||||||
|
}
|
||||||
|
if (stream.size() <= 0) return;
|
||||||
|
|
||||||
|
stream.flush();
|
||||||
|
String s = stream.toString();
|
||||||
|
|
||||||
|
StringBuilder loreLineBuilder = new StringBuilder(s.length() * 2);
|
||||||
|
for (char c : s.toCharArray()) {
|
||||||
|
loreLineBuilder.append('§').append(c);
|
||||||
|
}
|
||||||
|
List<String> lore;
|
||||||
|
if (meta.hasLore()) {
|
||||||
|
lore = meta.getLore();
|
||||||
|
} else {
|
||||||
|
lore = new ArrayList<>();
|
||||||
|
}
|
||||||
|
while (lore.size() < line) {
|
||||||
|
lore.add("");
|
||||||
|
}
|
||||||
|
//TODO when existing data string in lore
|
||||||
|
lore.add(line, loreLineBuilder.toString());
|
||||||
|
meta.setLore(lore);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
super.close();
|
||||||
|
stream.close();
|
||||||
|
ENCODER.encReset();
|
||||||
|
buf = null;
|
||||||
|
encBuf = null;
|
||||||
|
meta = null;
|
||||||
|
stream = null;
|
||||||
|
}
|
||||||
|
}
|
25
src/com/dre/brewery/lore/LoreWriter.java
Normal file
25
src/com/dre/brewery/lore/LoreWriter.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package com.dre.brewery.lore;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public class LoreWriter extends OutputStream {
|
||||||
|
|
||||||
|
ItemMeta meta;
|
||||||
|
|
||||||
|
public LoreWriter(ItemMeta meta) {
|
||||||
|
this.meta = meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(int b) throws IOException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(byte[] b, int off, int len) throws IOException {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
139
src/com/dre/brewery/lore/basE91.java
Normal file
139
src/com/dre/brewery/lore/basE91.java
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
package com.dre.brewery.lore;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* basE91 encoding/decoding routines
|
||||||
|
*
|
||||||
|
* Copyright (c) 2000-2006 Joachim Henke
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
* - Neither the name of Joachim Henke nor the names of his contributors may
|
||||||
|
* be used to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class basE91
|
||||||
|
{
|
||||||
|
private int ebq, en, dbq, dn, dv;
|
||||||
|
public final byte[] enctab;
|
||||||
|
private final byte[] dectab;
|
||||||
|
|
||||||
|
public int encode(byte[] ib, int n, byte[] ob)
|
||||||
|
{
|
||||||
|
int i, c = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
|
ebq |= (ib[i] & 255) << en;
|
||||||
|
en += 8;
|
||||||
|
if (en > 13) {
|
||||||
|
int ev = ebq & 8191;
|
||||||
|
|
||||||
|
if (ev > 88) {
|
||||||
|
ebq >>= 13;
|
||||||
|
en -= 13;
|
||||||
|
} else {
|
||||||
|
ev = ebq & 16383;
|
||||||
|
ebq >>= 14;
|
||||||
|
en -= 14;
|
||||||
|
}
|
||||||
|
ob[c++] = enctab[ev % 91];
|
||||||
|
ob[c++] = enctab[ev / 91];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int encEnd(byte[] ob)
|
||||||
|
{
|
||||||
|
int c = 0;
|
||||||
|
|
||||||
|
if (en > 0) {
|
||||||
|
ob[c++] = enctab[ebq % 91];
|
||||||
|
if (en > 7 || ebq > 90)
|
||||||
|
ob[c++] = enctab[ebq / 91];
|
||||||
|
}
|
||||||
|
encReset();
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void encReset()
|
||||||
|
{
|
||||||
|
ebq = 0;
|
||||||
|
en = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int decode(byte[] ib, int n, byte[] ob)
|
||||||
|
{
|
||||||
|
int i, c = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
|
if (dectab[ib[i]] == -1)
|
||||||
|
continue;
|
||||||
|
if (dv == -1)
|
||||||
|
dv = dectab[ib[i]];
|
||||||
|
else {
|
||||||
|
dv += dectab[ib[i]] * 91;
|
||||||
|
dbq |= dv << dn;
|
||||||
|
dn += (dv & 8191) > 88 ? 13 : 14;
|
||||||
|
do {
|
||||||
|
ob[c++] = (byte) dbq;
|
||||||
|
dbq >>= 8;
|
||||||
|
dn -= 8;
|
||||||
|
} while (dn > 7);
|
||||||
|
dv = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int decEnd(byte[] ob)
|
||||||
|
{
|
||||||
|
int c = 0;
|
||||||
|
|
||||||
|
if (dv != -1)
|
||||||
|
ob[c++] = (byte) (dbq | dv << dn);
|
||||||
|
decReset();
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decReset()
|
||||||
|
{
|
||||||
|
dbq = 0;
|
||||||
|
dn = 0;
|
||||||
|
dv = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public basE91()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
String ts = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!$%&()*+,-./:;<=>?@[\\]^_`{|}~";
|
||||||
|
|
||||||
|
enctab = ts.getBytes();
|
||||||
|
dectab = new byte[256];
|
||||||
|
for (i = 0; i < 256; ++i)
|
||||||
|
dectab[i] = -1;
|
||||||
|
for (i = 0; i < 91; ++i)
|
||||||
|
dectab[enctab[i]] = (byte) i;
|
||||||
|
encReset();
|
||||||
|
decReset();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user