Added pom.xml, moved files around. Sun Rhino support has been dropped.

This commit is contained in:
sk89q 2011-04-30 19:04:03 -07:00
parent 3ada3a9774
commit e121442ee9
216 changed files with 1379 additions and 1303 deletions

View File

@ -1,4 +1,4 @@
WorldEdit WorldEdit ${project.version}
Copyright (c) 2010, 2011 sk89q <http://www.sk89q.com> Copyright (c) 2010, 2011 sk89q <http://www.sk89q.com>
Licensed under the GNU General Public License v3 Licensed under the GNU General Public License v3

View File

@ -1,8 +1,9 @@
<project name="WorldEdit" default="dist" basedir="."> <project name="WorldEdit" default="dist" basedir=".">
<description>WorldEdit allows for editing the Minecraft SMP world <description>WorldEdit allows for editing the Minecraft SMP world
en-masse, de-griefing, and fixing issues.</description> en-masse, de-griefing, and fixing issues.</description>
<property name="src.dir" location="src"/> <property name="src.dir" location="src/main"/>
<property name="resources.dir" location="src/resources"/>
<property name="build.dir" location="build"/> <property name="build.dir" location="build"/>
<property name="dist.dir" location="dist"/> <property name="dist.dir" location="dist"/>
<property name="release.dir" location="release"/> <property name="release.dir" location="release"/>
@ -43,10 +44,10 @@
<!--<attribute name="Main-Class" value="com.sk89q.worldedit.cli.Main"/>--> <!--<attribute name="Main-Class" value="com.sk89q.worldedit.cli.Main"/>-->
</manifest> </manifest>
<delete file="${build.dir}/plugin.yml"/> <delete file="${build.dir}/plugin.yml"/>
<copy tofile="${build.dir}/plugin.yml" file="plugin.yml"/> <copy tofile="${build.dir}/plugin.yml" file="${resources.dir}/plugin.yml"/>
<replace file="${build.dir}/plugin.yml" token="WEVERSIONMACRO" value="${version}"/> <replace file="${build.dir}/plugin.yml" token="%VERSION%" value="${version}"/>
<mkdir dir="${build.dir}/defaults"/> <mkdir dir="${build.dir}/defaults"/>
<copy tofile="${build.dir}/defaults/config.yml" file="config.yml"/> <copy tofile="${build.dir}/defaults/config.yml" file="${resources.dir}/config.yml"/>
<jar jarfile="${dist.dir}/WorldEdit.jar" basedir="${build.dir}" manifest="manifest.mf"> <jar jarfile="${dist.dir}/WorldEdit.jar" basedir="${build.dir}" manifest="manifest.mf">
<zipgroupfileset dir="lib" includes="worldeditsunrhino.jar" /> <zipgroupfileset dir="lib" includes="worldeditsunrhino.jar" />
<zipgroupfileset dir="lib" includes="jchronic.jar" /> <zipgroupfileset dir="lib" includes="jchronic.jar" />
@ -72,6 +73,7 @@
<copy tofile="${release.dir}/LICENSE.txt" file="LICENSE.txt"/> <copy tofile="${release.dir}/LICENSE.txt" file="LICENSE.txt"/>
<copy tofile="${release.dir}/NOTICE.txt" file="NOTICE.txt"/> <copy tofile="${release.dir}/NOTICE.txt" file="NOTICE.txt"/>
<copy tofile="${release.dir}/README.txt" file="README.txt"/> <copy tofile="${release.dir}/README.txt" file="README.txt"/>
<replace file="${release.dir}/README.txt" token="$${project.version}" value="${version}"/>
<copy tofile="${release.dir}/WorldEdit.jar" file="${dist.dir}/WorldEdit.jar"/> <copy tofile="${release.dir}/WorldEdit.jar" file="${dist.dir}/WorldEdit.jar"/>
<zip destfile="${release.dir}/worldedit-${version}.zip" basedir="${release.dir}" excludes="*.zip plugin.yml"/> <zip destfile="${release.dir}/worldedit-${version}.zip" basedir="${release.dir}" excludes="*.zip plugin.yml"/>
<mkdir dir="${release.dir}/src"/> <mkdir dir="${release.dir}/src"/>

View File

@ -1,3 +0,0 @@
This contains sources for an implementation of the Sun Rhino engine for
WorldEdit. However, this Rhino version is an internal component of
the Sun JVM and thus it is implementation specific.

View File

@ -1,47 +0,0 @@
<project name="WorldEditSunRhino" default="dist" basedir=".">
<description>Sun Rhino implementation.</description>
<property name="src.dir" location="src"/>
<property name="build.dir" location="build"/>
<property name="dist.dir" location="dist"/>
<property name="release.dir" location="release"/>
<property name="lib.dir" location="lib"/>
<fileset dir="${lib.dir}" id="libs">
<include name="WorldEdit.jar" />
</fileset>
<target name="init">
<mkdir dir="${build.dir}"/>
</target>
<!-- Compile the source files -->
<target name="compile" depends="init">
<javac srcdir="${src.dir}" deprecation="true" includeantruntime="true" destdir="${build.dir}" debug="true">
<classpath>
<fileset refid="libs"/>
</classpath>
</javac>
</target>
<!-- Build the .jar -->
<target name="jar" depends="compile">
<mkdir dir="${dist.dir}"/>
<manifest file="manifest.mf" mode="replace">
</manifest>
<jar jarfile="${dist.dir}/worldeditsunrhino.jar" basedir="${build.dir}" manifest="manifest.mf" />
</target>
<!-- Create the .jar -->
<target name="dist">
<property name="version" value="nightly"/>
<antcall target="jar"/>
</target>
<!-- Clean the output -->
<target name="clean">
<delete dir="${build.dir}"/>
<delete dir="${dist.dir}"/>
<delete dir="${release.dir}"/>
</target>
</project>

View File

@ -1,61 +0,0 @@
// $Id$
/*
* WorldEdit
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.scripting;
import sun.org.mozilla.javascript.internal.*;
public class SunRhinoContextFactory extends ContextFactory {
protected int timeLimit;
public SunRhinoContextFactory(int timeLimit) {
this.timeLimit = timeLimit;
}
protected Context makeContext() {
RhinoContext cx = new RhinoContext(this);
cx.setInstructionObserverThreshold(10000);
return cx;
}
protected void observeInstructionCount(Context cx, int instructionCount) {
RhinoContext mcx = (RhinoContext)cx;
long currentTime = System.currentTimeMillis();
if (currentTime - mcx.startTime > timeLimit) {
throw new Error("Script timed out (" + timeLimit + "ms)");
}
}
protected Object doTopCall(Callable callable, Context cx, Scriptable scope,
Scriptable thisObj, Object[] args) {
RhinoContext mcx = (RhinoContext)cx;
mcx.startTime = System.currentTimeMillis();
return super.doTopCall(callable, cx, scope, thisObj, args);
}
private static class RhinoContext extends Context {
long startTime;
public RhinoContext(ContextFactory factory) {
super();
}
}
}

View File

@ -1,90 +0,0 @@
// $Id$
/*
* WorldEdit
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.scripting;
import java.util.Map;
import javax.script.ScriptException;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import sun.org.mozilla.javascript.internal.*;
public class SunRhinoCraftScriptEngine implements CraftScriptEngine {
private int timeLimit;
@Override
public void setTimeLimit(int milliseconds) {
timeLimit = milliseconds;
}
@Override
public int getTimeLimit() {
return timeLimit;
}
@Override
public Object evaluate(final String script, final String filename,
final Map<String, Object> args)
throws ScriptException, Throwable {
SunRhinoContextFactory factory = new SunRhinoContextFactory(timeLimit);
factory.initApplicationClassLoader(WorldEdit.class.getClassLoader());
try {
return factory.call(new ContextAction() {
public Object run(Context cx) {
Scriptable topLevel = new ImporterTopLevel(cx);
Scriptable scope = cx.initStandardObjects();
topLevel.setParentScope(scope);
for (Map.Entry<String, Object> entry : args.entrySet()) {
ScriptableObject.putProperty(scope, entry.getKey(),
Context.javaToJS(entry.getValue(), scope));
}
return cx.evaluateString(topLevel, script, filename, 1, null);
}
});
} catch (Error e) {
throw new ScriptException(e.getMessage());
} catch (RhinoException e) {
if (e instanceof WrappedException) {
Throwable cause = ((WrappedException)e).getCause();
if (cause instanceof WorldEditException) {
throw ((WrappedException)e).getCause();
}
}
String msg;
int line = (line = e.lineNumber()) == 0 ? -1 : line;
if (e instanceof JavaScriptException) {
msg = String.valueOf(((JavaScriptException)e).getValue());
} else {
msg = e.getMessage();
}
ScriptException scriptException =
new ScriptException(msg, e.sourceName(), line);
scriptException.initCause(e);
throw scriptException;
}
}
}

171
pom.xml Normal file
View File

@ -0,0 +1,171 @@
<!-- Maven build file for WorldEdit Copyright (c) 2011 sk89q <http://www.sk89q.com>
WorldEdit is available under the GNU General Public License v3 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sk89q</groupId>
<artifactId>worldedit</artifactId>
<version>4.4.0-SNAPSHOT</version>
<name>WorldEdit</name>
<description>WorldEdit allows for editing the Minecraft SMP world
en-masse, de-griefing, and fixing issues.</description>
<scm>
<connection>scm:git:git://github.com/sk89q/worldedit.git</connection>
<url>https://github.com/sk89q/worldedit</url>
<developerConnection>scm:git:git@github.com:sk89q/worldedit.git</developerConnection>
</scm>
<repositories>
<!-- Repository for other dependencies of SK's -->
<repository>
<id>sk89q-mvn2</id>
<url>http://mvn2.sk89q.com/repo</url>
</repository>
<!-- Repository for Bukkit -->
<repository>
<id>bukkit-repo</id>
<url>http://repo.bukkit.org/artifactory/repo</url>
</repository>
</repositories>
<dependencies>
<!-- Used for Permissions support (this version has both the legacy API
and the new Permissions API to compile against -->
<dependency>
<groupId>com.sk89q</groupId>
<artifactId>dummypermscompat</artifactId>
<version>1.0</version>
</dependency>
<!-- Bukkit -->
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Archive reading library for snapshots -->
<dependency>
<groupId>de.schlichtherle</groupId>
<artifactId>truezip</artifactId>
<version>6.8.3</version>
</dependency>
<!-- JavaScript library -->
<dependency>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
<version>1.7R2</version>
</dependency>
<!-- Time related functions, used for snapshots. This is NOT the original
jchronic as it has been modified to have some extra timezone related methods
(which were hacked in) -->
<dependency>
<groupId>com.sk89q</groupId>
<artifactId>jchronic</artifactId>
<version>0.2.4a </version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>${basedir}/src/main</sourceDirectory>
<!-- Resources -->
<resources>
<resource>
<targetPath></targetPath>
<filtering>true</filtering>
<directory>${basedir}</directory>
<includes>
<include>src/resources/plugin.yml</include>
</includes>
</resource>
<resource>
<targetPath>defaults/</targetPath>
<filtering>true</filtering>
<directory>${basedir}</directory>
<includes>
<include>src/resources/config.yml</include>
</includes>
</resource>
</resources>
<!-- Plugins -->
<plugins>
<!-- Compile plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
</plugin>
<!-- JAR creation plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<addMavenDescriptor>true</addMavenDescriptor>
<pomPropertiesFile>true</pomPropertiesFile>
<manifest>
<addClasspath>truezip.jar WorldEdit/truezip.jar js.jar
WorldEdit/js.jar</addClasspath>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<!-- This is a legacy manifest entry for older versions of
WorldEdit (like really old) -->
<WorldEdit-Version>${project.version}</WorldEdit-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- Assembly -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
<configuration>
<descriptor>${basedir}/src/assembly/default.xml</descriptor>
</configuration>
</plugin>
<!-- Shade -->
<!-- We want to bundle in some dependencies -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<!-- We want to bundle in the modified jchronic library -->
<includes>
<include>com.sk89q:jchronic</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
<!-- Release -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.1</version>
</plugin>
</plugins>
</build>
</project>

35
src/assembly/default.xml Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>tar.gz</format>
<format>tar.bz2</format>
<format>zip</format>
</formats>
<files>
<file>
<source>${project.build.directory}/${artifactId}-${project.version}.jar</source>
<destName>WorldEdit.jar</destName>
<outputDirectory>/</outputDirectory>
<filtered>false</filtered>
</file>
<file>
<source>README.txt</source>
<outputDirectory>/</outputDirectory>
<filtered>true</filtered>
</file>
</files>
<fileSets>
<fileSet>
<includes>
<include>LICENSE.txt</include>
<include>CHANGELOG.txt</include>
<include>NOTICE.txt</include>
<include>craftscripts/*</include>
</includes>
</fileSet>
</fileSets>
</assembly>

View File

@ -1,192 +0,0 @@
package com.sk89q.jnbt;
/*
* JNBT License
*
* Copyright (c) 2010 Graham Edgecombe
* 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 the JNBT team nor the names of its
* 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 HOLDER 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.
*/
import java.io.Closeable;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sk89q.jnbt.ByteArrayTag;
import com.sk89q.jnbt.ByteTag;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.DoubleTag;
import com.sk89q.jnbt.EndTag;
import com.sk89q.jnbt.FloatTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.ListTag;
import com.sk89q.jnbt.LongTag;
import com.sk89q.jnbt.NBTConstants;
import com.sk89q.jnbt.NBTUtils;
import com.sk89q.jnbt.ShortTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
/**
* <p>This class reads <strong>NBT</strong>, or
* <strong>Named Binary Tag</strong> streams, and produces an object graph of
* subclasses of the <code>Tag</code> object.</p>
*
* <p>The NBT format was created by Markus Persson, and the specification may
* be found at <a href="http://www.minecraft.net/docs/NBT.txt">
* http://www.minecraft.net/docs/NBT.txt</a>.</p>
* @author Graham Edgecombe
*
*/
public final class NBTInputStream implements Closeable {
/**
* The data input stream.
*/
private final DataInputStream is;
/**
* Creates a new <code>NBTInputStream</code>, which will source its data
* from the specified input stream.
* @param is The input stream.
* @throws IOException if an I/O error occurs.
*/
public NBTInputStream(InputStream is) throws IOException {
this.is = new DataInputStream(is);
}
/**
* Reads an NBT tag from the stream.
* @return The tag that was read.
* @throws IOException if an I/O error occurs.
*/
public Tag readTag() throws IOException {
return readTag(0);
}
/**
* Reads an NBT from the stream.
* @param depth The depth of this tag.
* @return The tag that was read.
* @throws IOException if an I/O error occurs.
*/
private Tag readTag(int depth) throws IOException {
int type = is.readByte() & 0xFF;
String name;
if(type != NBTConstants.TYPE_END) {
int nameLength = is.readShort() & 0xFFFF;
byte[] nameBytes = new byte[nameLength];
is.readFully(nameBytes);
name = new String(nameBytes, NBTConstants.CHARSET);
} else {
name = "";
}
return readTagPayload(type, name, depth);
}
/**
* Reads the payload of a tag, given the name and type.
* @param type The type.
* @param name The name.
* @param depth The depth.
* @return The tag.
* @throws IOException if an I/O error occurs.
*/
private Tag readTagPayload(int type, String name, int depth) throws IOException {
switch(type) {
case NBTConstants.TYPE_END:
if(depth == 0) {
throw new IOException("TAG_End found without a TAG_Compound/TAG_List tag preceding it.");
} else {
return new EndTag();
}
case NBTConstants.TYPE_BYTE:
return new ByteTag(name, is.readByte());
case NBTConstants.TYPE_SHORT:
return new ShortTag(name, is.readShort());
case NBTConstants.TYPE_INT:
return new IntTag(name, is.readInt());
case NBTConstants.TYPE_LONG:
return new LongTag(name, is.readLong());
case NBTConstants.TYPE_FLOAT:
return new FloatTag(name, is.readFloat());
case NBTConstants.TYPE_DOUBLE:
return new DoubleTag(name, is.readDouble());
case NBTConstants.TYPE_BYTE_ARRAY:
int length = is.readInt();
byte[] bytes = new byte[length];
is.readFully(bytes);
return new ByteArrayTag(name, bytes);
case NBTConstants.TYPE_STRING:
length = is.readShort();
bytes = new byte[length];
is.readFully(bytes);
return new StringTag(name, new String(bytes, NBTConstants.CHARSET));
case NBTConstants.TYPE_LIST:
int childType = is.readByte();
length = is.readInt();
List<Tag> tagList = new ArrayList<Tag>();
for(int i = 0; i < length; i++) {
Tag tag = readTagPayload(childType, "", depth + 1);
if(tag instanceof EndTag) {
throw new IOException("TAG_End not permitted in a list.");
}
tagList.add(tag);
}
return new ListTag(name, NBTUtils.getTypeClass(childType), tagList);
case NBTConstants.TYPE_COMPOUND:
Map<String, Tag> tagMap = new HashMap<String, Tag>();
while(true) {
Tag tag = readTag(depth + 1);
if(tag instanceof EndTag) {
break;
} else {
tagMap.put(tag.getName(), tag);
}
}
return new CompoundTag(name, tagMap);
default:
throw new IOException("Invalid tag type: " + type + ".");
}
}
@Override
public void close() throws IOException {
is.close();
}
}

View File

@ -1,271 +0,0 @@
package com.sk89q.jnbt;
import java.io.Closeable;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.GZIPOutputStream;
import com.sk89q.jnbt.ByteArrayTag;
import com.sk89q.jnbt.ByteTag;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.DoubleTag;
import com.sk89q.jnbt.EndTag;
import com.sk89q.jnbt.FloatTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.ListTag;
import com.sk89q.jnbt.LongTag;
import com.sk89q.jnbt.NBTConstants;
import com.sk89q.jnbt.NBTUtils;
import com.sk89q.jnbt.ShortTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
/*
* JNBT License
*
* Copyright (c) 2010 Graham Edgecombe
* 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 the JNBT team nor the names of its
* 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 HOLDER 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.
*/
/**
* <p>This class writes <strong>NBT</strong>, or
* <strong>Named Binary Tag</strong> <code>Tag</code> objects to an underlying
* <code>OutputStream</code>.</p>
*
* <p>The NBT format was created by Markus Persson, and the specification may
* be found at <a href="http://www.minecraft.net/docs/NBT.txt">
* http://www.minecraft.net/docs/NBT.txt</a>.</p>
* @author Graham Edgecombe
*
*/
public final class NBTOutputStream implements Closeable {
/**
* The output stream.
*/
private final DataOutputStream os;
/**
* Creates a new <code>NBTOutputStream</code>, which will write data to the
* specified underlying output stream.
* @param os The output stream.
* @throws IOException if an I/O error occurs.
*/
public NBTOutputStream(OutputStream os) throws IOException {
this.os = new DataOutputStream(new GZIPOutputStream(os));
}
/**
* Writes a tag.
* @param tag The tag to write.
* @throws IOException if an I/O error occurs.
*/
public void writeTag(Tag tag) throws IOException {
int type = NBTUtils.getTypeCode(tag.getClass());
String name = tag.getName();
byte[] nameBytes = name.getBytes(NBTConstants.CHARSET);
os.writeByte(type);
os.writeShort(nameBytes.length);
os.write(nameBytes);
if(type == NBTConstants.TYPE_END) {
throw new IOException("Named TAG_End not permitted.");
}
writeTagPayload(tag);
}
/**
* Writes tag payload.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeTagPayload(Tag tag) throws IOException {
int type = NBTUtils.getTypeCode(tag.getClass());
switch(type) {
case NBTConstants.TYPE_END:
writeEndTagPayload((EndTag) tag);
break;
case NBTConstants.TYPE_BYTE:
writeByteTagPayload((ByteTag) tag);
break;
case NBTConstants.TYPE_SHORT:
writeShortTagPayload((ShortTag) tag);
break;
case NBTConstants.TYPE_INT:
writeIntTagPayload((IntTag) tag);
break;
case NBTConstants.TYPE_LONG:
writeLongTagPayload((LongTag) tag);
break;
case NBTConstants.TYPE_FLOAT:
writeFloatTagPayload((FloatTag) tag);
break;
case NBTConstants.TYPE_DOUBLE:
writeDoubleTagPayload((DoubleTag) tag);
break;
case NBTConstants.TYPE_BYTE_ARRAY:
writeByteArrayTagPayload((ByteArrayTag) tag);
break;
case NBTConstants.TYPE_STRING:
writeStringTagPayload((StringTag) tag);
break;
case NBTConstants.TYPE_LIST:
writeListTagPayload((ListTag) tag);
break;
case NBTConstants.TYPE_COMPOUND:
writeCompoundTagPayload((CompoundTag) tag);
break;
default:
throw new IOException("Invalid tag type: " + type + ".");
}
}
/**
* Writes a <code>TAG_Byte</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeByteTagPayload(ByteTag tag) throws IOException {
os.writeByte(tag.getValue());
}
/**
* Writes a <code>TAG_Byte_Array</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeByteArrayTagPayload(ByteArrayTag tag) throws IOException {
byte[] bytes = tag.getValue();
os.writeInt(bytes.length);
os.write(bytes);
}
/**
* Writes a <code>TAG_Compound</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeCompoundTagPayload(CompoundTag tag) throws IOException {
for(Tag childTag : tag.getValue().values()) {
writeTag(childTag);
}
os.writeByte((byte) 0); // end tag - better way?
}
/**
* Writes a <code>TAG_List</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeListTagPayload(ListTag tag) throws IOException {
Class<? extends Tag> clazz = tag.getType();
List<Tag> tags = tag.getValue();
int size = tags.size();
os.writeByte(NBTUtils.getTypeCode(clazz));
os.writeInt(size);
for(int i = 0; i < size; i++) {
writeTagPayload(tags.get(i));
}
}
/**
* Writes a <code>TAG_String</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeStringTagPayload(StringTag tag) throws IOException {
byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET);
os.writeShort(bytes.length);
os.write(bytes);
}
/**
* Writes a <code>TAG_Double</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeDoubleTagPayload(DoubleTag tag) throws IOException {
os.writeDouble(tag.getValue());
}
/**
* Writes a <code>TAG_Float</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeFloatTagPayload(FloatTag tag) throws IOException {
os.writeFloat(tag.getValue());
}
/**
* Writes a <code>TAG_Long</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeLongTagPayload(LongTag tag) throws IOException {
os.writeLong(tag.getValue());
}
/**
* Writes a <code>TAG_Int</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeIntTagPayload(IntTag tag) throws IOException {
os.writeInt(tag.getValue());
}
/**
* Writes a <code>TAG_Short</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeShortTagPayload(ShortTag tag) throws IOException {
os.writeShort(tag.getValue());
}
/**
* Writes a <code>TAG_Empty</code> tag.
* @param tag The tag.
* @throws IOException if an I/O error occurs.
*/
private void writeEndTagPayload(EndTag tag) {
/* empty */
}
@Override
public void close() throws IOException {
os.close();
}
}

View File

@ -1,166 +0,0 @@
package com.sk89q.jnbt;
import com.sk89q.jnbt.ByteArrayTag;
import com.sk89q.jnbt.ByteTag;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.DoubleTag;
import com.sk89q.jnbt.EndTag;
import com.sk89q.jnbt.FloatTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.ListTag;
import com.sk89q.jnbt.LongTag;
import com.sk89q.jnbt.NBTConstants;
import com.sk89q.jnbt.ShortTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
/*
* JNBT License
*
* Copyright (c) 2010 Graham Edgecombe
* 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 the JNBT team nor the names of its
* 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 HOLDER 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.
*/
/**
* A class which contains NBT-related utility methods.
* @author Graham Edgecombe
*
*/
public final class NBTUtils {
/**
* Gets the type name of a tag.
* @param clazz The tag class.
* @return The type name.
*/
public static String getTypeName(Class<? extends Tag> clazz) {
if(clazz.equals(ByteArrayTag.class)) {
return "TAG_Byte_Array";
} else if(clazz.equals(ByteTag.class)) {
return "TAG_Byte";
} else if(clazz.equals(CompoundTag.class)) {
return "TAG_Compound";
} else if(clazz.equals(DoubleTag.class)) {
return "TAG_Double";
} else if(clazz.equals(EndTag.class)) {
return "TAG_End";
} else if(clazz.equals(FloatTag.class)) {
return "TAG_Float";
} else if(clazz.equals(IntTag.class)) {
return "TAG_Int";
} else if(clazz.equals(ListTag.class)) {
return "TAG_List";
} else if(clazz.equals(LongTag.class)) {
return "TAG_Long";
} else if(clazz.equals(ShortTag.class)) {
return "TAG_Short";
} else if(clazz.equals(StringTag.class)) {
return "TAG_String";
} else {
throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
}
}
/**
* Gets the type code of a tag class.
* @param clazz The tag class.
* @return The type code.
* @throws IllegalArgumentException if the tag class is invalid.
*/
public static int getTypeCode(Class<? extends Tag> clazz) {
if(clazz.equals(ByteArrayTag.class)) {
return NBTConstants.TYPE_BYTE_ARRAY;
} else if(clazz.equals(ByteTag.class)) {
return NBTConstants.TYPE_BYTE;
} else if(clazz.equals(CompoundTag.class)) {
return NBTConstants.TYPE_COMPOUND;
} else if(clazz.equals(DoubleTag.class)) {
return NBTConstants.TYPE_DOUBLE;
} else if(clazz.equals(EndTag.class)) {
return NBTConstants.TYPE_END;
} else if(clazz.equals(FloatTag.class)) {
return NBTConstants.TYPE_FLOAT;
} else if(clazz.equals(IntTag.class)) {
return NBTConstants.TYPE_INT;
} else if(clazz.equals(ListTag.class)) {
return NBTConstants.TYPE_LIST;
} else if(clazz.equals(LongTag.class)) {
return NBTConstants.TYPE_LONG;
} else if(clazz.equals(ShortTag.class)) {
return NBTConstants.TYPE_SHORT;
} else if(clazz.equals(StringTag.class)) {
return NBTConstants.TYPE_STRING;
} else {
throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
}
}
/**
* Gets the class of a type of tag.
* @param type The type.
* @return The class.
* @throws IllegalArgumentException if the tag type is invalid.
*/
public static Class<? extends Tag> getTypeClass(int type) {
switch(type) {
case NBTConstants.TYPE_END:
return EndTag.class;
case NBTConstants.TYPE_BYTE:
return ByteTag.class;
case NBTConstants.TYPE_SHORT:
return ShortTag.class;
case NBTConstants.TYPE_INT:
return IntTag.class;
case NBTConstants.TYPE_LONG:
return LongTag.class;
case NBTConstants.TYPE_FLOAT:
return FloatTag.class;
case NBTConstants.TYPE_DOUBLE:
return DoubleTag.class;
case NBTConstants.TYPE_BYTE_ARRAY:
return ByteArrayTag.class;
case NBTConstants.TYPE_STRING:
return StringTag.class;
case NBTConstants.TYPE_LIST:
return ListTag.class;
case NBTConstants.TYPE_COMPOUND:
return CompoundTag.class;
default:
throw new IllegalArgumentException("Invalid tag type : " + type + ".");
}
}
/**
* Default private constructor.
*/
private NBTUtils() {
}
}

View File

@ -27,21 +27,17 @@ public class PluginPermissionsResolver implements PermissionsResolver {
this.resolver = resolver; this.resolver = resolver;
} }
@Override
public void load() { public void load() {
} }
@Override
public boolean hasPermission(String name, String permission) { public boolean hasPermission(String name, String permission) {
return resolver.hasPermission(name, permission); return resolver.hasPermission(name, permission);
} }
@Override
public boolean inGroup(String player, String group) { public boolean inGroup(String player, String group) {
return resolver.inGroup(player, group); return resolver.inGroup(player, group);
} }
@Override
public String[] getGroups(String player) { public String[] getGroups(String player) {
return resolver.getGroups(player); return resolver.getGroups(player);
} }

View File

@ -37,47 +37,51 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_Byte_Array</code> tag. * The <code>TAG_Byte_Array</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class ByteArrayTag extends Tag { public final class ByteArrayTag extends Tag {
/** /**
* The value. * The value.
*/ */
private final byte[] value; private final byte[] value;
/** /**
* Creates the tag. * Creates the tag.
* @param name The name. *
* @param value The value. * @param name
*/ * The name.
public ByteArrayTag(String name, byte[] value) { * @param value
super(name); * The value.
this.value = value; */
} public ByteArrayTag(String name, byte[] value) {
super(name);
@Override this.value = value;
public byte[] getValue() { }
return value;
} @Override
public byte[] getValue() {
@Override return value;
public String toString() { }
StringBuilder hex = new StringBuilder();
for(byte b : value) { @Override
String hexDigits = Integer.toHexString(b).toUpperCase(); public String toString() {
if(hexDigits.length() == 1) { StringBuilder hex = new StringBuilder();
hex.append("0"); for (byte b : value) {
} String hexDigits = Integer.toHexString(b).toUpperCase();
hex.append(hexDigits).append(" "); if (hexDigits.length() == 1) {
} hex.append("0");
String name = getName(); }
String append = ""; hex.append(hexDigits).append(" ");
if(name != null && !name.equals("")) { }
append = "(\"" + this.getName() + "\")"; String name = getName();
} String append = "";
return "TAG_Byte_Array" + append + ": " + hex.toString(); if (name != null && !name.equals("")) {
} append = "(\"" + this.getName() + "\")";
}
return "TAG_Byte_Array" + append + ": " + hex.toString();
}
} }

View File

@ -37,39 +37,43 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_Byte</code> tag. * The <code>TAG_Byte</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class ByteTag extends Tag { public final class ByteTag extends Tag {
/** /**
* The value. * The value.
*/ */
private final byte value; private final byte value;
/** /**
* Creates the tag. * Creates the tag.
* @param name The name. *
* @param value The value. * @param name
*/ * The name.
public ByteTag(String name, byte value) { * @param value
super(name); * The value.
this.value = value; */
} public ByteTag(String name, byte value) {
super(name);
this.value = value;
}
@Override
public Byte getValue() {
return value;
}
@Override
public String toString() {
String name = getName();
String append = "";
if (name != null && !name.equals("")) {
append = "(\"" + this.getName() + "\")";
}
return "TAG_Byte" + append + ": " + value;
}
@Override
public Byte getValue() {
return value;
}
@Override
public String toString() {
String name = getName();
String append = "";
if(name != null && !name.equals("")) {
append = "(\"" + this.getName() + "\")";
}
return "TAG_Byte" + append + ": " + value;
}
} }

View File

@ -39,45 +39,52 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_Compound</code> tag. * The <code>TAG_Compound</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class CompoundTag extends Tag { public final class CompoundTag extends Tag {
/**
* The value.
*/
private final Map<String, Tag> value;
/**
* Creates the tag.
* @param name The name.
* @param value The value.
*/
public CompoundTag(String name, Map<String, Tag> value) {
super(name);
this.value = Collections.unmodifiableMap(value);
}
@Override /**
public Map<String, Tag> getValue() { * The value.
return value; */
} private final Map<String, Tag> value;
@Override /**
public String toString() { * Creates the tag.
String name = getName(); *
String append = ""; * @param name
if(name != null && !name.equals("")) { * The name.
append = "(\"" + this.getName() + "\")"; * @param value
} * The value.
StringBuilder bldr = new StringBuilder(); */
bldr.append("TAG_Compound" + append + ": " + value.size() + " entries\r\n{\r\n"); public CompoundTag(String name, Map<String, Tag> value) {
for(Map.Entry<String, Tag> entry : value.entrySet()) { super(name);
bldr.append(" " + entry.getValue().toString().replaceAll("\r\n", "\r\n ") + "\r\n"); this.value = Collections.unmodifiableMap(value);
} }
bldr.append("}");
return bldr.toString(); @Override
} public Map<String, Tag> getValue() {
return value;
}
@Override
public String toString() {
String name = getName();
String append = "";
if (name != null && !name.equals("")) {
append = "(\"" + this.getName() + "\")";
}
StringBuilder bldr = new StringBuilder();
bldr.append("TAG_Compound" + append + ": " + value.size()
+ " entries\r\n{\r\n");
for (Map.Entry<String, Tag> entry : value.entrySet()) {
bldr.append(" "
+ entry.getValue().toString().replaceAll("\r\n", "\r\n ")
+ "\r\n");
}
bldr.append("}");
return bldr.toString();
}
} }

View File

@ -37,39 +37,43 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_Double</code> tag. * The <code>TAG_Double</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class DoubleTag extends Tag { public final class DoubleTag extends Tag {
/**
* The value.
*/
private final double value;
/** /**
* Creates the tag. * The value.
* @param name The name. */
* @param value The value. private final double value;
*/
public DoubleTag(String name, double value) { /**
super(name); * Creates the tag.
this.value = value; *
} * @param name
* The name.
@Override * @param value
public Double getValue() { * The value.
return value; */
} public DoubleTag(String name, double value) {
super(name);
@Override this.value = value;
public String toString() { }
String name = getName();
String append = ""; @Override
if(name != null && !name.equals("")) { public Double getValue() {
append = "(\"" + this.getName() + "\")"; return value;
} }
return "TAG_Double" + append + ": " + value;
} @Override
public String toString() {
String name = getName();
String append = "";
if (name != null && !name.equals("")) {
append = "(\"" + this.getName() + "\")";
}
return "TAG_Double" + append + ": " + value;
}
} }

View File

@ -37,26 +37,27 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_End</code> tag. * The <code>TAG_End</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class EndTag extends Tag { public final class EndTag extends Tag {
/** /**
* Creates the tag. * Creates the tag.
*/ */
public EndTag() { public EndTag() {
super(""); super("");
} }
@Override @Override
public Object getValue() { public Object getValue() {
return null; return null;
} }
@Override @Override
public String toString() { public String toString() {
return "TAG_End"; return "TAG_End";
} }
} }

View File

@ -37,39 +37,43 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_Float</code> tag. * The <code>TAG_Float</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class FloatTag extends Tag { public final class FloatTag extends Tag {
/** /**
* The value. * The value.
*/ */
private final float value; private final float value;
/** /**
* Creates the tag. * Creates the tag.
* @param name The name. *
* @param value The value. * @param name
*/ * The name.
public FloatTag(String name, float value) { * @param value
super(name); * The value.
this.value = value; */
} public FloatTag(String name, float value) {
super(name);
@Override this.value = value;
public Float getValue() { }
return value;
} @Override
public Float getValue() {
@Override return value;
public String toString() { }
String name = getName();
String append = ""; @Override
if(name != null && !name.equals("")) { public String toString() {
append = "(\"" + this.getName() + "\")"; String name = getName();
} String append = "";
return "TAG_Float" + append + ": " + value; if (name != null && !name.equals("")) {
} append = "(\"" + this.getName() + "\")";
}
return "TAG_Float" + append + ": " + value;
}
} }

View File

@ -37,39 +37,43 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_Int</code> tag. * The <code>TAG_Int</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class IntTag extends Tag { public final class IntTag extends Tag {
/** /**
* The value. * The value.
*/ */
private final int value; private final int value;
/**
* Creates the tag.
* @param name The name.
* @param value The value.
*/
public IntTag(String name, int value) {
super(name);
this.value = value;
}
@Override /**
public Integer getValue() { * Creates the tag.
return value; *
} * @param name
* The name.
@Override * @param value
public String toString() { * The value.
String name = getName(); */
String append = ""; public IntTag(String name, int value) {
if(name != null && !name.equals("")) { super(name);
append = "(\"" + this.getName() + "\")"; this.value = value;
} }
return "TAG_Int" + append + ": " + value;
} @Override
public Integer getValue() {
return value;
}
@Override
public String toString() {
String name = getName();
String append = "";
if (name != null && !name.equals("")) {
append = "(\"" + this.getName() + "\")";
}
return "TAG_Int" + append + ": " + value;
}
} }

View File

@ -40,60 +40,69 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_List</code> tag. * The <code>TAG_List</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class ListTag extends Tag { public final class ListTag extends Tag {
/** /**
* The type. * The type.
*/ */
private final Class<? extends Tag> type; private final Class<? extends Tag> type;
/** /**
* The value. * The value.
*/ */
private final List<Tag> value; private final List<Tag> value;
/** /**
* Creates the tag. * Creates the tag.
* @param name The name. *
* @param type The type of item in the list. * @param name
* @param value The value. * The name.
*/ * @param type
public ListTag(String name, Class<? extends Tag> type, List<Tag> value) { * The type of item in the list.
super(name); * @param value
this.type = type; * The value.
this.value = Collections.unmodifiableList(value); */
} public ListTag(String name, Class<? extends Tag> type, List<Tag> value) {
super(name);
/** this.type = type;
* Gets the type of item in this list. this.value = Collections.unmodifiableList(value);
* @return The type of item in this list. }
*/
public Class<? extends Tag> getType() { /**
return type; * Gets the type of item in this list.
} *
* @return The type of item in this list.
@Override */
public List<Tag> getValue() { public Class<? extends Tag> getType() {
return value; return type;
} }
@Override @Override
public String toString() { public List<Tag> getValue() {
String name = getName(); return value;
String append = ""; }
if(name != null && !name.equals("")) {
append = "(\"" + this.getName() + "\")"; @Override
} public String toString() {
StringBuilder bldr = new StringBuilder(); String name = getName();
bldr.append("TAG_List" + append + ": " + value.size() + " entries of type " + NBTUtils.getTypeName(type) + "\r\n{\r\n"); String append = "";
for(Tag t : value) { if (name != null && !name.equals("")) {
bldr.append(" " + t.toString().replaceAll("\r\n", "\r\n ") + "\r\n"); append = "(\"" + this.getName() + "\")";
} }
bldr.append("}"); StringBuilder bldr = new StringBuilder();
return bldr.toString(); bldr.append("TAG_List" + append + ": " + value.size()
} + " entries of type " + NBTUtils.getTypeName(type)
+ "\r\n{\r\n");
for (Tag t : value) {
bldr.append(" " + t.toString().replaceAll("\r\n", "\r\n ")
+ "\r\n");
}
bldr.append("}");
return bldr.toString();
}
} }

View File

@ -37,39 +37,43 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_Long</code> tag. * The <code>TAG_Long</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class LongTag extends Tag { public final class LongTag extends Tag {
/** /**
* The value. * The value.
*/ */
private final long value; private final long value;
/** /**
* Creates the tag. * Creates the tag.
* @param name The name. *
* @param value The value. * @param name
*/ * The name.
public LongTag(String name, long value) { * @param value
super(name); * The value.
this.value = value; */
} public LongTag(String name, long value) {
super(name);
@Override this.value = value;
public Long getValue() { }
return value;
} @Override
public Long getValue() {
@Override return value;
public String toString() { }
String name = getName();
String append = ""; @Override
if(name != null && !name.equals("")) { public String toString() {
append = "(\"" + this.getName() + "\")"; String name = getName();
} String append = "";
return "TAG_Long" + append + ": " + value; if (name != null && !name.equals("")) {
} append = "(\"" + this.getName() + "\")";
}
return "TAG_Long" + append + ": " + value;
}
} }

View File

@ -37,36 +37,30 @@ import java.nio.charset.Charset;
/** /**
* A class which holds constant values. * A class which holds constant values.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class NBTConstants { public final class NBTConstants {
/** /**
* The character set used by NBT (UTF-8). * The character set used by NBT (UTF-8).
*/ */
public static final Charset CHARSET = Charset.forName("UTF-8"); public static final Charset CHARSET = Charset.forName("UTF-8");
/** /**
* Tag type constants. * Tag type constants.
*/ */
public static final int TYPE_END = 0, public static final int TYPE_END = 0, TYPE_BYTE = 1, TYPE_SHORT = 2,
TYPE_BYTE = 1, TYPE_INT = 3, TYPE_LONG = 4, TYPE_FLOAT = 5, TYPE_DOUBLE = 6,
TYPE_SHORT = 2, TYPE_BYTE_ARRAY = 7, TYPE_STRING = 8, TYPE_LIST = 9,
TYPE_INT = 3, TYPE_COMPOUND = 10;
TYPE_LONG = 4,
TYPE_FLOAT = 5, /**
TYPE_DOUBLE = 6, * Default private constructor.
TYPE_BYTE_ARRAY = 7, */
TYPE_STRING = 8, private NBTConstants() {
TYPE_LIST = 9,
TYPE_COMPOUND = 10; }
/**
* Default private constructor.
*/
private NBTConstants() {
}
} }

View File

@ -0,0 +1,211 @@
package com.sk89q.jnbt;
/*
* JNBT License
*
* Copyright (c) 2010 Graham Edgecombe
* 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 the JNBT team nor the names of its
* 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 HOLDER 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.
*/
import java.io.Closeable;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sk89q.jnbt.ByteArrayTag;
import com.sk89q.jnbt.ByteTag;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.DoubleTag;
import com.sk89q.jnbt.EndTag;
import com.sk89q.jnbt.FloatTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.ListTag;
import com.sk89q.jnbt.LongTag;
import com.sk89q.jnbt.NBTConstants;
import com.sk89q.jnbt.NBTUtils;
import com.sk89q.jnbt.ShortTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
/**
* <p>
* This class reads <strong>NBT</strong>, or <strong>Named Binary Tag</strong>
* streams, and produces an object graph of subclasses of the <code>Tag</code>
* object.
* </p>
*
* <p>
* The NBT format was created by Markus Persson, and the specification may be
* found at <a href="http://www.minecraft.net/docs/NBT.txt">
* http://www.minecraft.net/docs/NBT.txt</a>.
* </p>
*
* @author Graham Edgecombe
*
*/
public final class NBTInputStream implements Closeable {
/**
* The data input stream.
*/
private final DataInputStream is;
/**
* Creates a new <code>NBTInputStream</code>, which will source its data
* from the specified input stream.
*
* @param is
* The input stream.
* @throws IOException
* if an I/O error occurs.
*/
public NBTInputStream(InputStream is) throws IOException {
this.is = new DataInputStream(is);
}
/**
* Reads an NBT tag from the stream.
*
* @return The tag that was read.
* @throws IOException
* if an I/O error occurs.
*/
public Tag readTag() throws IOException {
return readTag(0);
}
/**
* Reads an NBT from the stream.
*
* @param depth
* The depth of this tag.
* @return The tag that was read.
* @throws IOException
* if an I/O error occurs.
*/
private Tag readTag(int depth) throws IOException {
int type = is.readByte() & 0xFF;
String name;
if (type != NBTConstants.TYPE_END) {
int nameLength = is.readShort() & 0xFFFF;
byte[] nameBytes = new byte[nameLength];
is.readFully(nameBytes);
name = new String(nameBytes, NBTConstants.CHARSET);
} else {
name = "";
}
return readTagPayload(type, name, depth);
}
/**
* Reads the payload of a tag, given the name and type.
*
* @param type
* The type.
* @param name
* The name.
* @param depth
* The depth.
* @return The tag.
* @throws IOException
* if an I/O error occurs.
*/
private Tag readTagPayload(int type, String name, int depth)
throws IOException {
switch (type) {
case NBTConstants.TYPE_END:
if (depth == 0) {
throw new IOException(
"TAG_End found without a TAG_Compound/TAG_List tag preceding it.");
} else {
return new EndTag();
}
case NBTConstants.TYPE_BYTE:
return new ByteTag(name, is.readByte());
case NBTConstants.TYPE_SHORT:
return new ShortTag(name, is.readShort());
case NBTConstants.TYPE_INT:
return new IntTag(name, is.readInt());
case NBTConstants.TYPE_LONG:
return new LongTag(name, is.readLong());
case NBTConstants.TYPE_FLOAT:
return new FloatTag(name, is.readFloat());
case NBTConstants.TYPE_DOUBLE:
return new DoubleTag(name, is.readDouble());
case NBTConstants.TYPE_BYTE_ARRAY:
int length = is.readInt();
byte[] bytes = new byte[length];
is.readFully(bytes);
return new ByteArrayTag(name, bytes);
case NBTConstants.TYPE_STRING:
length = is.readShort();
bytes = new byte[length];
is.readFully(bytes);
return new StringTag(name, new String(bytes, NBTConstants.CHARSET));
case NBTConstants.TYPE_LIST:
int childType = is.readByte();
length = is.readInt();
List<Tag> tagList = new ArrayList<Tag>();
for (int i = 0; i < length; i++) {
Tag tag = readTagPayload(childType, "", depth + 1);
if (tag instanceof EndTag) {
throw new IOException("TAG_End not permitted in a list.");
}
tagList.add(tag);
}
return new ListTag(name, NBTUtils.getTypeClass(childType), tagList);
case NBTConstants.TYPE_COMPOUND:
Map<String, Tag> tagMap = new HashMap<String, Tag>();
while (true) {
Tag tag = readTag(depth + 1);
if (tag instanceof EndTag) {
break;
} else {
tagMap.put(tag.getName(), tag);
}
}
return new CompoundTag(name, tagMap);
default:
throw new IOException("Invalid tag type: " + type + ".");
}
}
public void close() throws IOException {
is.close();
}
}

View File

@ -0,0 +1,316 @@
package com.sk89q.jnbt;
import java.io.Closeable;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.GZIPOutputStream;
import com.sk89q.jnbt.ByteArrayTag;
import com.sk89q.jnbt.ByteTag;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.DoubleTag;
import com.sk89q.jnbt.EndTag;
import com.sk89q.jnbt.FloatTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.ListTag;
import com.sk89q.jnbt.LongTag;
import com.sk89q.jnbt.NBTConstants;
import com.sk89q.jnbt.NBTUtils;
import com.sk89q.jnbt.ShortTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
/*
* JNBT License
*
* Copyright (c) 2010 Graham Edgecombe
* 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 the JNBT team nor the names of its
* 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 HOLDER 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.
*/
/**
* <p>
* This class writes <strong>NBT</strong>, or <strong>Named Binary Tag</strong>
* <code>Tag</code> objects to an underlying <code>OutputStream</code>.
* </p>
*
* <p>
* The NBT format was created by Markus Persson, and the specification may be
* found at <a href="http://www.minecraft.net/docs/NBT.txt">
* http://www.minecraft.net/docs/NBT.txt</a>.
* </p>
*
* @author Graham Edgecombe
*
*/
public final class NBTOutputStream implements Closeable {
/**
* The output stream.
*/
private final DataOutputStream os;
/**
* Creates a new <code>NBTOutputStream</code>, which will write data to the
* specified underlying output stream.
*
* @param os
* The output stream.
* @throws IOException
* if an I/O error occurs.
*/
public NBTOutputStream(OutputStream os) throws IOException {
this.os = new DataOutputStream(new GZIPOutputStream(os));
}
/**
* Writes a tag.
*
* @param tag
* The tag to write.
* @throws IOException
* if an I/O error occurs.
*/
public void writeTag(Tag tag) throws IOException {
int type = NBTUtils.getTypeCode(tag.getClass());
String name = tag.getName();
byte[] nameBytes = name.getBytes(NBTConstants.CHARSET);
os.writeByte(type);
os.writeShort(nameBytes.length);
os.write(nameBytes);
if (type == NBTConstants.TYPE_END) {
throw new IOException("Named TAG_End not permitted.");
}
writeTagPayload(tag);
}
/**
* Writes tag payload.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeTagPayload(Tag tag) throws IOException {
int type = NBTUtils.getTypeCode(tag.getClass());
switch (type) {
case NBTConstants.TYPE_END:
writeEndTagPayload((EndTag) tag);
break;
case NBTConstants.TYPE_BYTE:
writeByteTagPayload((ByteTag) tag);
break;
case NBTConstants.TYPE_SHORT:
writeShortTagPayload((ShortTag) tag);
break;
case NBTConstants.TYPE_INT:
writeIntTagPayload((IntTag) tag);
break;
case NBTConstants.TYPE_LONG:
writeLongTagPayload((LongTag) tag);
break;
case NBTConstants.TYPE_FLOAT:
writeFloatTagPayload((FloatTag) tag);
break;
case NBTConstants.TYPE_DOUBLE:
writeDoubleTagPayload((DoubleTag) tag);
break;
case NBTConstants.TYPE_BYTE_ARRAY:
writeByteArrayTagPayload((ByteArrayTag) tag);
break;
case NBTConstants.TYPE_STRING:
writeStringTagPayload((StringTag) tag);
break;
case NBTConstants.TYPE_LIST:
writeListTagPayload((ListTag) tag);
break;
case NBTConstants.TYPE_COMPOUND:
writeCompoundTagPayload((CompoundTag) tag);
break;
default:
throw new IOException("Invalid tag type: " + type + ".");
}
}
/**
* Writes a <code>TAG_Byte</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeByteTagPayload(ByteTag tag) throws IOException {
os.writeByte(tag.getValue());
}
/**
* Writes a <code>TAG_Byte_Array</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeByteArrayTagPayload(ByteArrayTag tag) throws IOException {
byte[] bytes = tag.getValue();
os.writeInt(bytes.length);
os.write(bytes);
}
/**
* Writes a <code>TAG_Compound</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeCompoundTagPayload(CompoundTag tag) throws IOException {
for (Tag childTag : tag.getValue().values()) {
writeTag(childTag);
}
os.writeByte((byte) 0); // end tag - better way?
}
/**
* Writes a <code>TAG_List</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeListTagPayload(ListTag tag) throws IOException {
Class<? extends Tag> clazz = tag.getType();
List<Tag> tags = tag.getValue();
int size = tags.size();
os.writeByte(NBTUtils.getTypeCode(clazz));
os.writeInt(size);
for (int i = 0; i < size; i++) {
writeTagPayload(tags.get(i));
}
}
/**
* Writes a <code>TAG_String</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeStringTagPayload(StringTag tag) throws IOException {
byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET);
os.writeShort(bytes.length);
os.write(bytes);
}
/**
* Writes a <code>TAG_Double</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeDoubleTagPayload(DoubleTag tag) throws IOException {
os.writeDouble(tag.getValue());
}
/**
* Writes a <code>TAG_Float</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeFloatTagPayload(FloatTag tag) throws IOException {
os.writeFloat(tag.getValue());
}
/**
* Writes a <code>TAG_Long</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeLongTagPayload(LongTag tag) throws IOException {
os.writeLong(tag.getValue());
}
/**
* Writes a <code>TAG_Int</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeIntTagPayload(IntTag tag) throws IOException {
os.writeInt(tag.getValue());
}
/**
* Writes a <code>TAG_Short</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeShortTagPayload(ShortTag tag) throws IOException {
os.writeShort(tag.getValue());
}
/**
* Writes a <code>TAG_Empty</code> tag.
*
* @param tag
* The tag.
* @throws IOException
* if an I/O error occurs.
*/
private void writeEndTagPayload(EndTag tag) {
/* empty */
}
public void close() throws IOException {
os.close();
}
}

View File

@ -0,0 +1,178 @@
package com.sk89q.jnbt;
import com.sk89q.jnbt.ByteArrayTag;
import com.sk89q.jnbt.ByteTag;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.DoubleTag;
import com.sk89q.jnbt.EndTag;
import com.sk89q.jnbt.FloatTag;
import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.ListTag;
import com.sk89q.jnbt.LongTag;
import com.sk89q.jnbt.NBTConstants;
import com.sk89q.jnbt.ShortTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
/*
* JNBT License
*
* Copyright (c) 2010 Graham Edgecombe
* 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 the JNBT team nor the names of its
* 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 HOLDER 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.
*/
/**
* A class which contains NBT-related utility methods.
*
* @author Graham Edgecombe
*
*/
public final class NBTUtils {
/**
* Gets the type name of a tag.
*
* @param clazz
* The tag class.
* @return The type name.
*/
public static String getTypeName(Class<? extends Tag> clazz) {
if (clazz.equals(ByteArrayTag.class)) {
return "TAG_Byte_Array";
} else if (clazz.equals(ByteTag.class)) {
return "TAG_Byte";
} else if (clazz.equals(CompoundTag.class)) {
return "TAG_Compound";
} else if (clazz.equals(DoubleTag.class)) {
return "TAG_Double";
} else if (clazz.equals(EndTag.class)) {
return "TAG_End";
} else if (clazz.equals(FloatTag.class)) {
return "TAG_Float";
} else if (clazz.equals(IntTag.class)) {
return "TAG_Int";
} else if (clazz.equals(ListTag.class)) {
return "TAG_List";
} else if (clazz.equals(LongTag.class)) {
return "TAG_Long";
} else if (clazz.equals(ShortTag.class)) {
return "TAG_Short";
} else if (clazz.equals(StringTag.class)) {
return "TAG_String";
} else {
throw new IllegalArgumentException("Invalid tag classs ("
+ clazz.getName() + ").");
}
}
/**
* Gets the type code of a tag class.
*
* @param clazz
* The tag class.
* @return The type code.
* @throws IllegalArgumentException
* if the tag class is invalid.
*/
public static int getTypeCode(Class<? extends Tag> clazz) {
if (clazz.equals(ByteArrayTag.class)) {
return NBTConstants.TYPE_BYTE_ARRAY;
} else if (clazz.equals(ByteTag.class)) {
return NBTConstants.TYPE_BYTE;
} else if (clazz.equals(CompoundTag.class)) {
return NBTConstants.TYPE_COMPOUND;
} else if (clazz.equals(DoubleTag.class)) {
return NBTConstants.TYPE_DOUBLE;
} else if (clazz.equals(EndTag.class)) {
return NBTConstants.TYPE_END;
} else if (clazz.equals(FloatTag.class)) {
return NBTConstants.TYPE_FLOAT;
} else if (clazz.equals(IntTag.class)) {
return NBTConstants.TYPE_INT;
} else if (clazz.equals(ListTag.class)) {
return NBTConstants.TYPE_LIST;
} else if (clazz.equals(LongTag.class)) {
return NBTConstants.TYPE_LONG;
} else if (clazz.equals(ShortTag.class)) {
return NBTConstants.TYPE_SHORT;
} else if (clazz.equals(StringTag.class)) {
return NBTConstants.TYPE_STRING;
} else {
throw new IllegalArgumentException("Invalid tag classs ("
+ clazz.getName() + ").");
}
}
/**
* Gets the class of a type of tag.
*
* @param type
* The type.
* @return The class.
* @throws IllegalArgumentException
* if the tag type is invalid.
*/
public static Class<? extends Tag> getTypeClass(int type) {
switch (type) {
case NBTConstants.TYPE_END:
return EndTag.class;
case NBTConstants.TYPE_BYTE:
return ByteTag.class;
case NBTConstants.TYPE_SHORT:
return ShortTag.class;
case NBTConstants.TYPE_INT:
return IntTag.class;
case NBTConstants.TYPE_LONG:
return LongTag.class;
case NBTConstants.TYPE_FLOAT:
return FloatTag.class;
case NBTConstants.TYPE_DOUBLE:
return DoubleTag.class;
case NBTConstants.TYPE_BYTE_ARRAY:
return ByteArrayTag.class;
case NBTConstants.TYPE_STRING:
return StringTag.class;
case NBTConstants.TYPE_LIST:
return ListTag.class;
case NBTConstants.TYPE_COMPOUND:
return CompoundTag.class;
default:
throw new IllegalArgumentException("Invalid tag type : " + type
+ ".");
}
}
/**
* Default private constructor.
*/
private NBTUtils() {
}
}

View File

@ -37,39 +37,43 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_Short</code> tag. * The <code>TAG_Short</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class ShortTag extends Tag { public final class ShortTag extends Tag {
/** /**
* The value. * The value.
*/ */
private final short value; private final short value;
/** /**
* Creates the tag. * Creates the tag.
* @param name The name. *
* @param value The value. * @param name
*/ * The name.
public ShortTag(String name, short value) { * @param value
super(name); * The value.
this.value = value; */
} public ShortTag(String name, short value) {
super(name);
@Override this.value = value;
public Short getValue() { }
return value;
} @Override
public Short getValue() {
@Override return value;
public String toString() { }
String name = getName();
String append = ""; @Override
if(name != null && !name.equals("")) { public String toString() {
append = "(\"" + this.getName() + "\")"; String name = getName();
} String append = "";
return "TAG_Short" + append + ": " + value; if (name != null && !name.equals("")) {
} append = "(\"" + this.getName() + "\")";
}
return "TAG_Short" + append + ": " + value;
}
} }

View File

@ -37,39 +37,43 @@ import com.sk89q.jnbt.Tag;
/** /**
* The <code>TAG_String</code> tag. * The <code>TAG_String</code> tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public final class StringTag extends Tag { public final class StringTag extends Tag {
/** /**
* The value. * The value.
*/ */
private final String value; private final String value;
/** /**
* Creates the tag. * Creates the tag.
* @param name The name. *
* @param value The value. * @param name
*/ * The name.
public StringTag(String name, String value) { * @param value
super(name); * The value.
this.value = value; */
} public StringTag(String name, String value) {
super(name);
@Override this.value = value;
public String getValue() { }
return value;
} @Override
public String getValue() {
@Override return value;
public String toString() { }
String name = getName();
String append = ""; @Override
if(name != null && !name.equals("")) { public String toString() {
append = "(\"" + this.getName() + "\")"; String name = getName();
} String append = "";
return "TAG_String" + append + ": " + value; if (name != null && !name.equals("")) {
} append = "(\"" + this.getName() + "\")";
}
return "TAG_String" + append + ": " + value;
}
} }

View File

@ -35,36 +35,41 @@ package com.sk89q.jnbt;
/** /**
* Represents a single NBT tag. * Represents a single NBT tag.
*
* @author Graham Edgecombe * @author Graham Edgecombe
* *
*/ */
public abstract class Tag { public abstract class Tag {
/** /**
* The name of this tag. * The name of this tag.
*/ */
private final String name; private final String name;
/** /**
* Creates the tag with the specified name. * Creates the tag with the specified name.
* @param name The name. *
*/ * @param name
public Tag(String name) { * The name.
this.name = name; */
} public Tag(String name) {
this.name = name;
/** }
* Gets the name of this tag.
* @return The name of this tag. /**
*/ * Gets the name of this tag.
public final String getName() { *
return name; * @return The name of this tag.
} */
public final String getName() {
/** return name;
* Gets the value of this tag. }
* @return The value of this tag.
*/ /**
public abstract Object getValue(); * Gets the value of this tag.
*
* @return The value of this tag.
*/
public abstract Object getValue();
} }

View File

@ -1099,13 +1099,9 @@ public class WorldEdit {
try { try {
engine = new RhinoCraftScriptEngine(); engine = new RhinoCraftScriptEngine();
} catch (NoClassDefFoundError e) { } catch (NoClassDefFoundError e) {
try { player.printError("Failed to find an installed script engine.");
engine = new SunRhinoCraftScriptEngine(); player.printError("Please see http://wiki.sk89q.com/wiki/WorldEdit/Installation");
} catch (NoClassDefFoundError e2) { return;
player.printError("Failed to find an installed script engine.");
player.printError("Please see http://wiki.sk89q.com/wiki/WorldEdit/Installation");
return;
}
} }
engine.setTimeLimit(config.scriptTimeout); engine.setTimeLimit(config.scriptTimeout);

Some files were not shown because too many files have changed in this diff Show More