Merge branch '2.9' into release

This commit is contained in:
KHobbits 2012-08-21 19:34:26 +01:00
commit 44e9c6ebfc
137 changed files with 1653 additions and 10076 deletions

83
.gitignore vendored
View File

@ -1,42 +1,45 @@
.DS_Store
/BuildAll/nbproject/private/
/EssentialsProtect/nbproject/private/
/EssentialsChat/nbproject/private/
/EssentialsGroupBridge/nbproject/private/
/EssentialsGeoIP/nbproject/private/
/EssentialsSpawn/nbproject/private/
/EssentialsXMPP/nbproject/private/
/EssentialsGroupManager/nbproject/private/
/BuildAll/build/
/EssentialsGroupBridge/dist/
/EssentialsGroupBridge/build/
/EssentialsGeoIP/dist/
/EssentialsGeoIP/build/
/EssentialsGroupManager/build/
/EssentialsGroupManager/dist/
/BuildAll/dist/
/EssentialsChat/build/
/EssentialsChat/dist/
/EssentialsSpawn/build/
/EssentialsSpawn/dist/
/EssentialsXMPP/dist/
/EssentialsXMPP/build/
/EssentialsProtect/dist/
/EssentialsProtect/build/
/EssentialsPermissionsCommands/nbproject/private/
/EssentialsPermissionsCommands/build/
/EssentialsPermissionsCommands/dist/
/Essentials/nbproject/private/
/Essentials/dist/
/Essentials/build/
/YamlAnnotations/
/EssentialsUpdate/nbproject/private/
/EssentialsRelease/
/EssentialsUpdate/dist/
/EssentialsUpdate/build/
/WebPush/apikey.php
/WebPush/nbproject/private
/.idea
.DS_Store
/BuildAll/nbproject/private/
/EssentialsProtect/nbproject/private/
/EssentialsChat/nbproject/private/
/EssentialsGroupBridge/nbproject/private/
/EssentialsGeoIP/nbproject/private/
/EssentialsSpawn/nbproject/private/
/EssentialsXMPP/nbproject/private/
/EssentialsGroupManager/nbproject/private/
/BuildAll/build/
/EssentialsGroupBridge/dist/
/EssentialsGroupBridge/build/
/EssentialsGeoIP/dist/
/EssentialsGeoIP/build/
/EssentialsGroupManager/build/
/EssentialsGroupManager/dist/
/BuildAll/dist/
/EssentialsChat/build/
/EssentialsChat/dist/
/EssentialsSpawn/build/
/EssentialsSpawn/dist/
/EssentialsXMPP/dist/
/EssentialsXMPP/build/
/EssentialsProtect/dist/
/EssentialsProtect/build/
/EssentialsPermissionsCommands/nbproject/private/
/EssentialsPermissionsCommands/build/
/EssentialsPermissionsCommands/dist/
/Essentials/nbproject/private/
/Essentials/dist/
/Essentials/build/
/YamlAnnotations/
/EssentialsUpdate/nbproject/private/
/EssentialsRelease/
/EssentialsUpdate/dist/
/EssentialsUpdate/build/
/WebPush/apikey.php
/WebPush/nbproject/private
/.idea
*.iml
/EssentialsGroupManager/bin
/EssentialsGroupManager/.externalToolBuilders
/EssentialsGroupManager/.externalToolBuilders
/EssentialsAntiBuild/nbproject/private/
/EssentialsAntiBuild/dist/
/EssentialsAntiBuild/build/

View File

@ -12,9 +12,9 @@ is divided into following sections:
- execution
- debugging
- javadoc
- test compilation
- test execution
- test debugging
- junit compilation
- junit execution
- junit debugging
- applet
- cleanup
@ -181,7 +181,6 @@ is divided into following sections:
</and>
</condition>
<property name="run.jvmargs" value=""/>
<property name="run.jvmargs.ide" value=""/>
<property name="javac.compilerargs" value=""/>
<property name="work.dir" value="${basedir}"/>
<condition property="no.deps">
@ -226,27 +225,6 @@ is divided into following sections:
<property name="jar.index.metainf" value="${jar.index}"/>
<property name="copylibs.rebase" value="true"/>
<available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
<condition property="junit.available">
<or>
<available classname="org.junit.Test" classpath="${run.test.classpath}"/>
<available classname="junit.framework.Test" classpath="${run.test.classpath}"/>
</or>
</condition>
<condition property="testng.available">
<available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/>
</condition>
<condition property="junit+testng.available">
<and>
<istrue value="${junit.available}"/>
<istrue value="${testng.available}"/>
</and>
</condition>
<condition else="testng" property="testng.mode" value="mixed">
<istrue value="${junit+testng.available}"/>
</condition>
<condition else="" property="testng.debug.mode" value="-mixed">
<istrue value="${junit+testng.available}"/>
</condition>
</target>
<target name="-post-init">
<!-- Empty placeholder for easier customization. -->
@ -379,52 +357,11 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
<target if="${junit.available}" name="-init-macrodef-junit-init">
<condition else="false" property="nb.junit.batch" value="true">
<and>
<istrue value="${junit.available}"/>
<not>
<isset property="test.method"/>
</not>
</and>
</condition>
<condition else="false" property="nb.junit.single" value="true">
<and>
<istrue value="${junit.available}"/>
<isset property="test.method"/>
</and>
</condition>
</target>
<target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
<target name="-init-macrodef-junit">
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg value="-ea"/>
<customize/>
</junit>
</sequential>
</macrodef>
</target>
<target if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
@ -433,270 +370,32 @@ is divided into following sections:
<filename name="@{testincludes}"/>
</fileset>
</batchtest>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg value="-ea"/>
<customize/>
<jvmarg line="${run.jvmargs}"/>
</junit>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
<target if="${testng.available}" name="-init-macrodef-testng">
<macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}">
<isset property="test.method"/>
</condition>
<union id="test.set">
<fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
<filename name="@{testincludes}"/>
</fileset>
</union>
<taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
<testng classfilesetref="test.set" failureProperty="tests.failed" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="BuildAll" testname="TestNG tests" workingDir="${work.dir}">
<xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
<propertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</propertyset>
<customize/>
</testng>
</sequential>
</macrodef>
</target>
<target name="-init-macrodef-test-impl">
<macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element implicit="true" name="customize" optional="true"/>
<sequential>
<echo>No tests executed.</echo>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl">
<macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element implicit="true" name="customize" optional="true"/>
<sequential>
<j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize/>
</j2seproject3:junit>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl">
<macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element implicit="true" name="customize" optional="true"/>
<sequential>
<j2seproject3:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize/>
</j2seproject3:testng>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test">
<macrodef name="test" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<sequential>
<j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
</customize>
</j2seproject3:test-impl>
</sequential>
</macrodef>
</target>
<target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
<macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg value="-ea"/>
<jvmarg line="${debug-args-line}"/>
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
<customize/>
</junit>
</sequential>
</macrodef>
</target>
<target if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
<macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<batchtest todir="${build.test.results.dir}">
<fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
<filename name="@{testincludes}"/>
</fileset>
</batchtest>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg value="-ea"/>
<jvmarg line="${debug-args-line}"/>
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
<customize/>
</junit>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
<macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element implicit="true" name="customize" optional="true"/>
<sequential>
<j2seproject3:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize/>
</j2seproject3:junit-debug>
</sequential>
</macrodef>
</target>
<target if="${testng.available}" name="-init-macrodef-testng-debug">
<macrodef name="testng-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${main.class}" name="testClass"/>
<attribute default="" name="testMethod"/>
<element name="customize2" optional="true"/>
<sequential>
<condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
<isset property="test.method"/>
</condition>
<condition else="-suitename BuildAll -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
<matches pattern=".*\.xml" string="@{testClass}"/>
</condition>
<delete dir="${build.test.results.dir}" quiet="true"/>
<mkdir dir="${build.test.results.dir}"/>
<j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
<customize>
<customize2/>
<jvmarg value="-ea"/>
<arg line="${testng.debug.mode}"/>
<arg line="-d ${build.test.results.dir}"/>
<arg line="-listener org.testng.reporters.VerboseReporter"/>
<arg line="${testng.cmd.args}"/>
</customize>
</j2seproject3:debug>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl">
<macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${main.class}" name="testClass"/>
<attribute default="" name="testMethod"/>
<element implicit="true" name="customize2" optional="true"/>
<sequential>
<j2seproject3:testng-debug testClass="@{testClass}" testMethod="@{testMethod}">
<customize2/>
</j2seproject3:testng-debug>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit">
<macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<attribute default="${main.class}" name="testClass"/>
<attribute default="" name="testMethod"/>
<sequential>
<j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
</customize>
</j2seproject3:test-debug-impl>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng">
<macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<attribute default="${main.class}" name="testClass"/>
<attribute default="" name="testMethod"/>
<sequential>
<j2seproject3:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}">
<customize2>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
</customize2>
</j2seproject3:testng-debug-impl>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/>
<!--
pre NB7.2 profiling section; consider it deprecated
-->
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/>
<target if="profiler.info.jvmargs.agent" name="-profile-pre-init">
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
<target name="-profile-pre-init">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target if="profiler.info.jvmargs.agent" name="-profile-post-init">
<target name="-profile-post-init">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target if="profiler.info.jvmargs.agent" name="-profile-init-macrodef-profile">
<target name="-profile-init-macrodef-profile">
<macrodef name="resolve">
<attribute name="name"/>
<attribute name="value"/>
@ -728,13 +427,10 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" if="profiler.info.jvmargs.agent" name="-profile-init-check">
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
<fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
<fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
</target>
<!--
end of pre NB7.2 profiling section
-->
<target depends="-init-debug-args" name="-init-macrodef-nbjpda">
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="name"/>
@ -792,7 +488,6 @@ is divided into following sections:
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
<classpath>
<path path="@{classpath}"/>
</classpath>
@ -809,7 +504,6 @@ is divided into following sections:
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="classname"/>
<attribute default="${run.classpath}" name="classpath"/>
<attribute default="jvm" name="jvm"/>
<element name="customize" optional="true"/>
<sequential>
<java classname="@{classname}" dir="${work.dir}" fork="true">
@ -817,7 +511,6 @@ is divided into following sections:
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
<classpath>
<path path="@{classpath}"/>
</classpath>
@ -844,9 +537,6 @@ is divided into following sections:
<path path="${run.classpath.without.build.classes.dir}"/>
<chainedmapper>
<flattenmapper/>
<filtermapper>
<replacestring from=" " to="%20"/>
</filtermapper>
<globmapper from="*" to="lib/*"/>
</chainedmapper>
</pathconvert>
@ -892,7 +582,7 @@ is divided into following sections:
<target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
<property name="ap.cmd.line.internal" value=""/>
</target>
<target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
<target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
<!--
===================
COMPILATION SECTION
@ -948,6 +638,13 @@ is divided into following sections:
<param name="call.target" value="jar"/>
<param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
</antcall>
<antcall target="-maybe-call-dep">
<param name="call.built.properties" value="${built-jar.properties}"/>
<param location="${project.EssentialsAntiBuild}" name="call.subproject"/>
<param location="${project.EssentialsAntiBuild}/build.xml" name="call.script"/>
<param name="call.target" value="jar"/>
<param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
</antcall>
<antcall target="-maybe-call-dep">
<param name="call.built.properties" value="${built-jar.properties}"/>
<param location="${project.EssentialsProtect}" name="call.subproject"/>
@ -1164,11 +861,7 @@ is divided into following sections:
PROFILING SECTION
=================
-->
<!--
pre NB7.2 profiler integration
-->
<target depends="profile-init,compile" description="Profile a project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72">
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
@ -1176,9 +869,8 @@ is divided into following sections:
</nbprofiledirect>
<profile/>
</target>
<target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="profiler.info.jvmargs.agent" name="-profile-single-pre72">
<target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
<fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
@ -1186,8 +878,12 @@ is divided into following sections:
</nbprofiledirect>
<profile classname="${profile.class}"/>
</target>
<target depends="profile-init,compile-single" if="profiler.info.jvmargs.agent" name="-profile-applet-pre72">
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<!--
=========================
APPLET PROFILING SECTION
=========================
-->
<target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
@ -1199,8 +895,12 @@ is divided into following sections:
</customize>
</profile>
</target>
<target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<!--
=========================
TESTS PROFILING SECTION
=========================
-->
<target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
<nbprofiledirect>
<classpath>
<path path="${run.test.classpath}"/>
@ -1222,42 +922,6 @@ is divided into following sections:
<formatter type="xml"/>
</junit>
</target>
<!--
end of pre NB72 profiling section
-->
<target if="netbeans.home" name="-profile-check">
<condition property="profiler.configured">
<or>
<contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
<contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
</or>
</condition>
</target>
<target depends="-profile-check,-profile-pre72" description="Profile a project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent">
<startprofiler/>
<antcall target="run"/>
</target>
<target depends="-profile-check,-profile-single-pre72" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-single" unless="profiler.info.jvmargs.agent">
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
<startprofiler/>
<antcall target="run-single"/>
</target>
<target depends="-profile-test-single-pre72" description="Profile a selected test in the IDE." name="profile-test-single"/>
<target depends="-profile-check" description="Profile a selected test in the IDE." if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs">
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
<startprofiler/>
<antcall target="test-single"/>
</target>
<target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main">
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
<startprofiler/>
<antcal target="run-test-with-main"/>
</target>
<target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent">
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
<startprofiler/>
<antcall target="run-applet"/>
</target>
<!--
===============
JAVADOC SECTION
@ -1301,7 +965,7 @@ is divided into following sections:
<target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
<!--
=========================
TEST COMPILATION SECTION
JUNIT COMPILATION SECTION
=========================
-->
<target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
@ -1344,14 +1008,14 @@ is divided into following sections:
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
<!--
=======================
TEST EXECUTION SECTION
JUNIT EXECUTION SECTION
=======================
-->
<target depends="init" if="have.tests" name="-pre-test-run">
<mkdir dir="${build.test.results.dir}"/>
</target>
<target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
<j2seproject3:test testincludes="**/*Test.java"/>
<j2seproject3:junit testincludes="**/*Test.java"/>
</target>
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
@ -1364,40 +1028,39 @@ is divided into following sections:
</target>
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
<j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
<j2seproject3:junit excludes="" includes="${test.includes}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
<fail unless="test.class">Must select some files in the IDE or set test.class</fail>
<fail unless="test.method">Must select some method in the IDE or set test.method</fail>
<j2seproject3:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
<!--
=======================
TEST DEBUGGING SECTION
JUNIT DEBUGGING SECTION
=======================
-->
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test">
<target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
<j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method">
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
<fail unless="test.method">Must select some method in the IDE or set test.method</fail>
<j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/>
<property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
<delete file="${test.report.file}"/>
<mkdir dir="${build.test.results.dir}"/>
<j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
<customize>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<arg value="${test.class}"/>
<arg value="showoutput=true"/>
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
</customize>
</j2seproject3:debug>
</target>
<target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
</target>
<target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
<target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
<target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
</target>
@ -1484,6 +1147,13 @@ is divided into following sections:
<param name="call.target" value="clean"/>
<param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
</antcall>
<antcall target="-maybe-call-dep">
<param name="call.built.properties" value="${built-clean.properties}"/>
<param location="${project.EssentialsAntiBuild}" name="call.subproject"/>
<param location="${project.EssentialsAntiBuild}/build.xml" name="call.script"/>
<param name="call.target" value="clean"/>
<param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
</antcall>
<antcall target="-maybe-call-dep">
<param name="call.built.properties" value="${built-clean.properties}"/>
<param location="${project.EssentialsProtect}" name="call.subproject"/>
@ -1518,12 +1188,9 @@ is divided into following sections:
<target name="-check-call-dep">
<property file="${call.built.properties}" prefix="already.built."/>
<condition property="should.call.dep">
<and>
<not>
<isset property="already.built.${call.subproject}"/>
</not>
<available file="${call.script}"/>
</and>
<not>
<isset property="already.built.${call.subproject}"/>
</not>
</condition>
</target>
<target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">

View File

@ -1,8 +1,8 @@
build.xml.data.CRC32=51b33957
build.xml.data.CRC32=b4df970c
build.xml.script.CRC32=7a797370
build.xml.stylesheet.CRC32=28e38971@1.44.1.45
build.xml.stylesheet.CRC32=28e38971@1.50.3.46
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=51b33957
nbproject/build-impl.xml.script.CRC32=2a17f1e9
nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46
nbproject/build-impl.xml.data.CRC32=b4df970c
nbproject/build-impl.xml.script.CRC32=1fd6d3cc
nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.3.46

View File

@ -66,6 +66,7 @@ jar.compress=true
javac.classpath=\
${reference.Essentials.jar}:\
${reference.EssentialsChat.jar}:\
${reference.EssentialsAntiBuild.jar}:\
${reference.EssentialsProtect.jar}:\
${reference.EssentialsSpawn.jar}:\
${reference.EssentialsGeoIP.jar}:\
@ -103,6 +104,7 @@ project.EssentialsChat=../EssentialsChat
project.EssentialsGeoIP=../EssentialsGeoIP
project.EssentialsGroupBridge=../EssentialsGroupBridge
project.EssentialsGroupManager=../EssentialsGroupManager
project.EssentialsAntiBuild=../EssentialsAntiBuild
project.EssentialsProtect=../EssentialsProtect
project.EssentialsSpawn=../EssentialsSpawn
project.EssentialsXMPP=../EssentialsXMPP
@ -111,6 +113,7 @@ reference.EssentialsChat.jar=${project.EssentialsChat}/dist/EssentialsChat.jar
reference.EssentialsGeoIP.jar=${project.EssentialsGeoIP}/dist/EssentialsGeoIP.jar
reference.EssentialsGroupBridge.jar=${project.EssentialsGroupBridge}/dist/EssentialsGroupBridge.jar
reference.EssentialsGroupManager.jar=${project.EssentialsGroupManager}/dist/EssentialsGroupManager.jar
reference.EssentialsAntiBuild.jar=${project.EssentialsAntiBuild}/dist/EssentialsAntiBuild.jar
reference.EssentialsProtect.jar=${project.EssentialsProtect}/dist/EssentialsProtect.jar
reference.EssentialsSpawn.jar=${project.EssentialsSpawn}/dist/EssentialsSpawn.jar
reference.EssentialsXMPP.jar=${project.EssentialsXMPP}/dist/EssentialsXMPP.jar

View File

@ -55,6 +55,14 @@
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsAntiBuild</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsProtect</foreign-project>
<artifact-type>jar</artifact-type>

View File

@ -1,5 +1,5 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.enabled.in.editor=true
annotation.processing.processors.list=lombok.core.AnnotationProcessor
annotation.processing.run.all.processors=false
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output

View File

@ -70,7 +70,8 @@ public class I18n implements II18n
public static String _(final String string, final Object... objects)
{
if (instance == null) {
if (instance == null)
{
return "";
}
if (objects.length == 0)
@ -85,11 +86,20 @@ public class I18n implements II18n
public String format(final String string, final Object... objects)
{
final String format = translate(string);
String format = translate(string);
MessageFormat messageFormat = messageFormatCache.get(format);
if (messageFormat == null)
{
messageFormat = new MessageFormat(format);
try
{
messageFormat = new MessageFormat(format);
}
catch (IllegalArgumentException e)
{
ess.getLogger().log(Level.SEVERE, "Invalid Translation key for '" + string + "': " + e.getMessage());
format = format.replaceAll("\\{(\\D*?)\\}", "\\[$1\\]");
messageFormat = new MessageFormat(format);
}
messageFormatCache.put(format, messageFormat);
}
return messageFormat.format(objects);

View File

@ -1,9 +1,5 @@
package com.earth2me.essentials;
/**
* @deprecated New interface will be IReload in api package
*/
@Deprecated
public interface IConf {
public void reloadConfig();
}

View File

@ -12,10 +12,6 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitScheduler;
/**
* @deprecated This will be moved to the api package soon
*/
@Deprecated
public interface IEssentials extends Plugin
{
void addReloadListener(IConf listener);

View File

@ -5,10 +5,6 @@ import org.bukkit.Location;
import org.bukkit.entity.Player;
/**
* @deprecated This will be moved to the api package soon
*/
@Deprecated
public interface IUser extends Player
{
long getLastTeleportTimestamp();

View File

@ -78,6 +78,7 @@ public class Kit
{
throw new Exception(_("kitError2"));
}
try
{

View File

@ -63,6 +63,12 @@ public class Trade
public void isAffordableFor(final IUser user) throws ChargeException
{
if (ess.getSettings().isDebug())
{
ess.getLogger().log(Level.INFO, "checking if " + user.getName() + " can afford charge.");
}
if (getMoney() != null
&& getMoney() > 0
&& !user.canAfford(getMoney()))
@ -206,8 +212,17 @@ public class Trade
cost = ess.getSettings().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command);
if (cost == 0.0 && fallbackCommand != null && !fallbackCommand.isEmpty())
{
if (ess.getSettings().isDebug())
{
ess.getLogger().log(Level.INFO, "checking fallback command cost (" + fallbackCommand + ") cost for " + user.getName());
}
cost = ess.getSettings().getCommandCost(fallbackCommand.charAt(0) == '/' ? fallbackCommand.substring(1) : fallbackCommand);
}
if (ess.getSettings().isDebug())
{
ess.getLogger().log(Level.INFO, "calculated command (" + command + ") cost for " + user.getName() + " as " + cost);
}
}
return cost;
}

View File

@ -1,10 +0,0 @@
package com.earth2me.essentials.api;
import java.util.Map;
import org.bukkit.command.PluginCommand;
public interface IAlternativeCommandsHandler
{
Map<String, String> disabledCommands();
}

View File

@ -1,51 +0,0 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.perm.IPermissionsHandler;
import com.earth2me.essentials.register.payment.Methods;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
public interface IEssentials extends Plugin, IReload
{
void addReloadListener(IReload listener);
IUser getUser(Object base);
int broadcastMessage(IUser sender, String message);
II18n getI18n();
ISettings getSettings();
IJails getJail();
IWarps getWarps();
IWorth getWorth();
IItemDb getItemDb();
IUserMap getUserMap();
IEssentialsEconomy getEconomy();
World getWorld(String name);
Methods getPaymentMethod();
int scheduleAsyncDelayedTask(Runnable run);
int scheduleSyncDelayedTask(Runnable run);
int scheduleSyncDelayedTask(Runnable run, long delay);
int scheduleSyncRepeatingTask(Runnable run, long delay, long period);
IPermissionsHandler getPermissionsHandler();
IAlternativeCommandsHandler getAlternativeCommandsHandler();
void showCommandError(CommandSender sender, String commandLabel, Throwable exception);
}

View File

@ -1,37 +0,0 @@
package com.earth2me.essentials.api;
public interface IEssentialsEconomy
{
double getMoney(String name) throws UserDoesNotExistException;
void setMoney(String name, double balance) throws UserDoesNotExistException, NoLoanPermittedException;
void add(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException;
void subtract(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException;
void divide(String name, double value) throws UserDoesNotExistException, NoLoanPermittedException;
void multiply(String name, double value) throws UserDoesNotExistException, NoLoanPermittedException;
void resetBalance(String name) throws UserDoesNotExistException, NoLoanPermittedException;
boolean hasEnough(String name, double amount) throws UserDoesNotExistException;
boolean hasMore(String name, double amount) throws UserDoesNotExistException;
boolean hasLess(String name, double amount) throws UserDoesNotExistException;
boolean isNegative(String name) throws UserDoesNotExistException;
String format(double amount);
boolean playerExists(String name);
boolean isNPC(String name) throws UserDoesNotExistException;
boolean createNPC(String name);
void removeNPC(String name) throws UserDoesNotExistException;
}

View File

@ -1,10 +0,0 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.settings.Settings;
import com.earth2me.essentials.storage.IStorageObjectHolder;
public interface ISettings extends IStorageObjectHolder<Settings>
{
}

View File

@ -1,43 +0,0 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.commands.IEssentialsCommand;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public interface IUser extends Player, IReload
{
long getLastTeleportTimestamp();
boolean isAuthorized(String node);
boolean isAuthorized(IEssentialsCommand cmd);
boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix);
void setLastTeleportTimestamp(long time);
Location getLastLocation();
Player getBase();
double getMoney();
void takeMoney(double value);
void giveMoney(double value);
String getGroup();
void setLastLocation();
Location getHome(String name) throws Exception;
Location getHome(Location loc) throws Exception;
boolean isHidden();
ITeleport getTeleport();
void setJail(String jail);
}

View File

@ -1,20 +0,0 @@
package com.earth2me.essentials.api;
import java.io.File;
import java.util.Set;
public interface IUserMap
{
boolean userExists(final String name);
IUser getUser(final String name);
void removeUser(final String name);
Set<String> getAllUniqueUsers();
int getUniqueUsers();
File getUserFile(final String name);
}

View File

@ -1,16 +0,0 @@
package com.earth2me.essentials.api;
import java.util.Collection;
import org.bukkit.Location;
public interface IWarps extends IReload
{
Location getWarp(String warp) throws Exception;
Collection<String> getWarps();
void removeWarp(String name) throws Exception;
void setWarp(String name, Location loc) throws Exception;
}

View File

@ -1,11 +0,0 @@
package com.earth2me.essentials.api;
import org.bukkit.inventory.ItemStack;
public interface IWorth extends IReload
{
double getPrice(ItemStack itemStack);
void setPrice(ItemStack itemStack, double price);
}

View File

@ -3,6 +3,7 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.Console;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.User;
import java.util.logging.Level;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -55,6 +56,8 @@ public class Commandban extends EssentialsCommand
user.setBanReason(banReason);
user.setBanned(true);
user.kickPlayer(banReason);
server.getLogger().log(Level.INFO, _("playerBanned", senderName, user.getName(), banReason));
for (Player onlinePlayer : server.getOnlinePlayers())
{

View File

@ -23,53 +23,86 @@ public class Commandgamemode extends EssentialsCommand
{
throw new NotEnoughArgumentsException();
}
gamemodeOtherPlayers(server, sender, args);
GameMode gameMode = matchGameMode(args[0].toLowerCase(Locale.ENGLISH));
gamemodeOtherPlayers(server, sender, gameMode, args[1]);
}
@Override
protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception
{
if (args.length < 1)
GameMode gameMode;
if (args.length == 0)
{
throw new NotEnoughArgumentsException();
gameMode = matchGameMode(commandLabel);
}
if (args.length > 1 && args[1].trim().length() > 2 && user.isAuthorized("essentials.gamemode.others"))
else if (args.length > 1 && args[1].trim().length() > 2 && user.isAuthorized("essentials.gamemode.others"))
{
gamemodeOtherPlayers(server, user, args);
gameMode = matchGameMode(args[0].toLowerCase(Locale.ENGLISH));
gamemodeOtherPlayers(server, user, gameMode, args[1]);
return;
}
performSetMode(args[0].toLowerCase(Locale.ENGLISH), user);
else
{
try {
gameMode = matchGameMode(args[0].toLowerCase(Locale.ENGLISH));
}
catch (NotEnoughArgumentsException e) {
gameMode = matchGameMode(commandLabel);
gamemodeOtherPlayers(server, user, gameMode, args[0]);
return;
}
}
user.setGameMode(gameMode);
user.sendMessage(_("gameMode", _(user.getGameMode().toString().toLowerCase(Locale.ENGLISH)), user.getDisplayName()));
}
private void gamemodeOtherPlayers(final Server server, final CommandSender sender, final String[] args)
private void gamemodeOtherPlayers(final Server server, final CommandSender sender, final GameMode gameMode, final String player) throws NotEnoughArgumentsException
{
for (Player matchPlayer : server.matchPlayer(args[1]))
//TODO: TL this
if (player.trim().length() < 2)
{
final User player = ess.getUser(matchPlayer);
if (player.isHidden())
throw new NotEnoughArgumentsException("You need to specify a valid player/mode.");
}
boolean foundUser = false;
for (Player matchPlayer : server.matchPlayer(player))
{
final User user = ess.getUser(matchPlayer);
if (user.isHidden())
{
continue;
}
performSetMode(args[0].toLowerCase(Locale.ENGLISH), player);
sender.sendMessage(_("gameMode", _(player.getGameMode().toString().toLowerCase(Locale.ENGLISH)), player.getDisplayName()));
user.setGameMode(gameMode);
sender.sendMessage(_("gameMode", _(user.getGameMode().toString().toLowerCase(Locale.ENGLISH)), user.getDisplayName()));
foundUser = true;
}
if (!foundUser)
{
throw new NotEnoughArgumentsException(_("playerNotFound"));
}
}
private void performSetMode(String mode, Player player)
private GameMode matchGameMode(String modeString) throws NotEnoughArgumentsException
{
if (mode.contains("survi") || mode.equalsIgnoreCase("0") || mode.equalsIgnoreCase("s"))
GameMode mode = null;
if (modeString.equalsIgnoreCase("gmc") || modeString.equalsIgnoreCase("egmc")
|| modeString.contains("creat") || modeString.equalsIgnoreCase("1") || modeString.equalsIgnoreCase("c"))
{
player.setGameMode(GameMode.SURVIVAL);
mode = GameMode.CREATIVE;
}
else if (mode.contains("creat") || mode.equalsIgnoreCase("1") || mode.equalsIgnoreCase("c"))
else if (modeString.equalsIgnoreCase("gms") || modeString.equalsIgnoreCase("egms")
|| modeString.contains("survi") || modeString.equalsIgnoreCase("0") || modeString.equalsIgnoreCase("s"))
{
player.setGameMode(GameMode.CREATIVE);
mode = GameMode.SURVIVAL;
}
else if (mode.contains("advent") || mode.equalsIgnoreCase("2") || mode.equalsIgnoreCase("a"))
else if (modeString.equalsIgnoreCase("gma") || modeString.equalsIgnoreCase("egma")
|| modeString.contains("advent") || modeString.equalsIgnoreCase("2") || modeString.equalsIgnoreCase("a"))
{
player.setGameMode(GameMode.ADVENTURE);
mode = GameMode.ADVENTURE;
}
else {
throw new NotEnoughArgumentsException();
}
return mode;
}
}

View File

@ -3,6 +3,7 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.Console;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.User;
import java.util.logging.Level;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -31,6 +32,8 @@ public class Commandkick extends EssentialsCommand
final String kickReason = args.length > 1 ? getFinalArg(args, 1) : _("kickDefault");
user.kickPlayer(kickReason);
final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME;
server.getLogger().log(Level.INFO, _("playerKicked", senderName, user.getName(), kickReason));
for (Player onlinePlayer : server.getOnlinePlayers())
{

View File

@ -21,6 +21,12 @@ public class Commandkill extends EssentialsCommand
{
throw new NotEnoughArgumentsException();
}
//TODO: TL this
if (args[0].trim().length() < 2)
{
throw new NotEnoughArgumentsException("You need to specify a player to kill.");
}
for (Player matchPlayer : server.matchPlayer(args[0]))
{

View File

@ -26,12 +26,12 @@ public class Commandkit extends EssentialsCommand
else if (args.length > 1 && user.isAuthorized("essentials.kit.others"))
{
final User userTo = getPlayer(server, args, 1, true);
final String kitName = Util.sanitizeString(args[0].toLowerCase(Locale.ENGLISH));
final String kitName = Util.sanitizeString(args[0].toLowerCase(Locale.ENGLISH)).trim();
giveKit(userTo, user, kitName);
}
else
{
final String kitName = Util.sanitizeString(args[0].toLowerCase(Locale.ENGLISH));
final String kitName = Util.sanitizeString(args[0].toLowerCase(Locale.ENGLISH)).trim();
giveKit(user, user, kitName);
}
}
@ -59,7 +59,12 @@ public class Commandkit extends EssentialsCommand
}
private void giveKit(User userTo, User userFrom, String kitName) throws Exception
{
{
if (kitName.isEmpty())
{
throw new Exception(_("kitError2"));
}
final Map<String, Object> kit = ess.getSettings().getKit(kitName);
if (!userFrom.isAuthorized("essentials.kit." + kitName))

View File

@ -21,7 +21,7 @@ public class Commandmsg extends EssentialsCommand
@Override
public void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception
{
if (args.length < 2 || args[0].trim().length() < 3 || args[1].trim().isEmpty())
if (args.length < 2 || args[0].trim().length() < 2 || args[1].trim().isEmpty())
{
throw new NotEnoughArgumentsException();
}

View File

@ -22,7 +22,8 @@ public class Commandpay extends EssentialsCommand
throw new NotEnoughArgumentsException();
}
if (args[0].trim().length() < 3)
//TODO: TL this
if (args[0].trim().length() < 2)
{
throw new NotEnoughArgumentsException("You need to specify a player to pay.");
}

View File

@ -56,7 +56,7 @@ public class Commandwarp extends EssentialsCommand
@Override
public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception
{
if (args.length < 2 || args[0].matches("[0-9]+"))
if (args.length < 2 || Util.isInt(args[0]))
{
warpList(sender, args);
throw new NoChargeException();
@ -94,7 +94,7 @@ public class Commandwarp extends EssentialsCommand
}
}
int page = 1;
if (args.length > 0)
if (args.length > 0 && Util.isInt(args[0]))
{
page = Integer.parseInt(args[0]);
}

View File

@ -44,7 +44,7 @@ public class BPermissions2Handler extends SuperpermsHandler
@Override
public boolean canBuild(final Player base, final String group)
{
return hasPermission(base, "essentials.build") || hasPermission(base, "bPermissions.build");
return hasPermission(base, "bPermissions.build");
}
@Override

View File

@ -56,7 +56,7 @@ public class BPermissionsHandler extends SuperpermsHandler
@Override
public boolean canBuild(final Player base, final String group)
{
return hasPermission(base, "essentials.build") || hasPermission(base, "bPermissions.build");
return hasPermission(base, "bPermissions.build");
}
@Override

View File

@ -78,6 +78,6 @@ public class PermissionsBukkitHandler extends SuperpermsHandler
@Override
public boolean canBuild(Player base, String group)
{
return hasPermission(base, "essentials.build") || hasPermission(base, "permissions.build");
return hasPermission(base, "permissions.build");
}
}

View File

@ -55,7 +55,7 @@ public class PrivilegesHandler extends SuperpermsHandler
@Override
public boolean canBuild(Player base, String group)
{
return hasPermission(base, "essentials.build") || hasPermission(base, "privileges.build");
return hasPermission(base, "privileges.build");
}
}

View File

@ -21,7 +21,7 @@ public class SuperpermsHandler implements IPermissionsHandler
@Override
public boolean canBuild(final Player base, final String group)
{
return hasPermission(base, "essentials.build");
return false;
}
@Override

View File

@ -1,17 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Backup implements StorageObject
{
@Comment("Interval in minutes")
private long interval = 60;
@Comment("Add a command that backups your data, e.g. 'rdiff-backup World1 backups/World1'")
private String command;
}

View File

@ -1,29 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Chat implements StorageObject
{
@Comment("The character(s) to prefix all nicknames, so that you know they are not true usernames.")
private String nicknamePrefix = "~";
@Comment("Disable this if you have any other plugin, that modifies the displayname of a user.")
private boolean changeDisplayname = true;
private String displaynameFormat = "{PREFIX}{NICKNAMEPREFIX}{NAME}{SUFFIX}";
@Comment(
{
"If EssentialsChat is installed, this will define how far a player's voice travels, in blocks. Set to 0 to make all chat global.",
"Note that users with the \"essentials.chat.spy\" permission will hear everything, regardless of this setting.",
"Users with essentials.chat.shout can override this by prefixing text with an exclamation mark (!)",
"Or with essentials.chat.question can override this by prefixing text with a question mark (?)",
"You can add command costs for shout/question by adding chat-shout and chat-question to the command costs section."
})
private int localRadius = 0;
@Comment("Set the default chat format here, it will be overwritten by group specific chat formats.")
private String defaultFormat = "&7[{GROUP}]&f {DISPLAYNAME}&7:&f {MESSAGE}";
}

View File

@ -1,40 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.settings.commands.*;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.ListType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Commands implements StorageObject
{
private Afk afk = new Afk();
private God god = new God();
private Help help = new Help();
private Home home = new Home();
private Kit kit = new Kit();
private Lightning lightning = new Lightning();
private Spawnmob spawnmob = new Spawnmob();
@ListType
@Comment(
{
"When a command conflicts with another plugin, by default, Essentials will try to force the OTHER plugin to take",
"priority. If a command is in this list, Essentials will try to give ITSELF priority. This does not always work:",
"usually whichever plugin was updated most recently wins out. However, the full name of the command will always work.",
"For example, if WorldGuard and Essentials are both enabled, and WorldGuard takes control over /god, /essentials:god",
"will still map to Essentials, whereas it might normally get forced upon WorldGuard. Commands prefixed with an \"e\",",
"such as /egod, will always grant Essentials priority.",
"We should try to take priority over /god. If this doesn't work, use /essentials:god or /egod.",
"If god is set using WorldGuard, use /ungod to remove then use whichever you see fit."
})
private List<String> overwritten = new ArrayList<String>();
@ListType
@Comment("Disabled commands will be completelly unavailable on the server.")
private List<String> disabled = new ArrayList<String>();
}

View File

@ -1,43 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.MapValueType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.HashMap;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Economy implements StorageObject
{
@Comment("Defines the balance with which new players begin. Defaults to 0.")
private double startingBalance = 0.0;
@MapValueType(Double.class)
@Comment("Defines the cost to use the given commands PER USE")
private Map<String, Double> commandCosts = new HashMap<String, Double>();
@Comment("Set this to a currency symbol you want to use.")
private String currencySymbol = "$";
public String getCurrencySymbol()
{
return currencySymbol == null || currencySymbol.isEmpty() ? "$" : currencySymbol.substring(0, 1);
}
private final transient static double MAXMONEY = 10000000000000.0;
@Comment(
{
"Set the maximum amount of money a player can have",
"The amount is always limited to 10 trillions because of the limitations of a java double"
})
private double maxMoney = MAXMONEY;
public double getMaxMoney()
{
return Math.abs(maxMoney) > MAXMONEY ? MAXMONEY : Math.abs(maxMoney);
}
@Comment("Enable this to log all interactions with trade/buy/sell signs and sell command")
private boolean logEnabled = false;
private Worth worth = new Worth();
}

View File

@ -1,33 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class General implements StorageObject
{
@Comment("Backup runs a command while saving is disabled")
private Backup backup = new Backup();
@Comment("You can disable the death messages of minecraft.")
private boolean deathMessages = true;
@Comment("Turn this on, if you want to see more error messages, if something goes wrong.")
private boolean debug = false;
@Comment(
{
"Set the locale here, if you want to change the language of Essentials.",
"If this is not set, Essentials will use the language of your computer.",
"Available locales: da, de, en, fr, nl"
})
private String locale;
@Comment(
{
"Should we announce to the server when someone logs in for the first time?",
"If so, use this format, replacing {DISPLAYNAME} with the player name.",
"If not, set to ''"
})
private String newPlayerAnnouncement = "&dWelcome {DISPLAYNAME} to the server!";
}

View File

@ -1,27 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class GroupOptions implements StorageObject
{
@Comment("Message format of chat messages")
private String messageFormat;
@Comment("Prefix for name")
private String prefix;
@Comment("Suffix for name")
private String suffix;
@Comment("Amount of homes a player can have")
private Integer homes;
@Comment("Cooldown between teleports")
private Integer teleportCooldown;
@Comment("Delay before teleport")
private Integer teleportDelay;
@Comment("Cooldown between heals")
private Integer healCooldown;
}

View File

@ -1,28 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.MapValueType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.LinkedHashMap;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Groups implements StorageObject
{
public Groups()
{
GroupOptions defaultOptions = new GroupOptions();
groups.put("default", defaultOptions);
}
@Comment(
{
"The order of the groups matters, the groups are checked from top to bottom.",
"All group names have to be lower case.",
"The groups can be connected to users using the permission essentials.groups.groupname"
})
@MapValueType(GroupOptions.class)
private LinkedHashMap<String, GroupOptions> groups = new LinkedHashMap<String, GroupOptions>();
}

View File

@ -1,22 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.MapValueType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.HashMap;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.bukkit.Location;
@Data
@EqualsAndHashCode(callSuper = false)
public class Locations implements StorageObject
{
@MapValueType(Location.class)
Map<String, Location> jails = new HashMap<String, Location>();
@MapValueType(Location.class)
Map<String, Location> warps = new HashMap<String, Location>();
@MapValueType(Location.class)
Map<String, Location> spawns = new HashMap<String, Location>();
}

View File

@ -1,58 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Settings implements StorageObject
{
@Comment(
{
"##########################################################",
"+------------------------------------------------------+ #",
"| General Settings | #",
"+------------------------------------------------------+ #",
"##########################################################"
})
private General general = new General();
@Comment(
{
"##########################################################",
"+------------------------------------------------------+ #",
"| Chat Settings | #",
"+------------------------------------------------------+ #",
"##########################################################"
})
private Chat chat = new Chat();
@Comment(
{
"##########################################################",
"+------------------------------------------------------+ #",
"| Economy Settings | #",
"+------------------------------------------------------+ #",
"##########################################################"
})
private Economy economy = new Economy();
@Comment(
{
"##########################################################",
"+------------------------------------------------------+ #",
"| Commands Settings | #",
"+------------------------------------------------------+ #",
"##########################################################"
})
private Commands commands = new Commands();
@Comment(
{
"##########################################################",
"+------------------------------------------------------+ #",
"| Group Settings | #",
"+------------------------------------------------------+ #",
"##########################################################"
})
private Groups groups = new Groups();
}

View File

@ -1,34 +0,0 @@
package com.earth2me.essentials.settings;
import com.earth2me.essentials.storage.EnchantmentLevel;
import com.earth2me.essentials.storage.MapKeyType;
import com.earth2me.essentials.storage.MapValueType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.HashMap;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.material.MaterialData;
@Data
@EqualsAndHashCode(callSuper = false)
public class Worth implements StorageObject
{
@MapKeyType(MaterialData.class)
@MapValueType(Double.class)
private Map<MaterialData, Double> sell = new HashMap<MaterialData, Double>();
@MapKeyType(MaterialData.class)
@MapValueType(Double.class)
private Map<MaterialData, Double> buy = new HashMap<MaterialData, Double>();
@MapKeyType(EnchantmentLevel.class)
@MapValueType(Double.class)
private Map<EnchantmentLevel, Double> enchantmentMultiplier = new HashMap<EnchantmentLevel, Double>();
public Worth()
{
sell.put(new MaterialData(Material.APPLE, (byte)0), 1.0);
}
}

View File

@ -1,36 +0,0 @@
package com.earth2me.essentials.settings.commands;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Afk implements StorageObject
{
@Comment(
{
"After this timeout in seconds, the user will be set as afk.",
"Set to -1 for no timeout."
})
private int autoAFK = 300;
@Comment(
{
"Auto-AFK Kick",
"After this timeout in seconds, the user will be kicked from the server.",
"Set to -1 for no timeout."
})
private int autoAFKKick = -1;
@Comment(
{
"Set this to true, if you want to freeze the player, if he is afk.",
"Other players or monsters can't push him out of afk mode then.",
"This will also enable temporary god mode for the afk player.",
"The player has to use the command /afk to leave the afk mode.",
"You have to add a message to your welcome message or help page,",
"since the player will not get a message, if he tries to move."
})
private boolean freezeAFKPlayers = false;
}

View File

@ -1,15 +0,0 @@
package com.earth2me.essentials.settings.commands;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class God implements StorageObject
{
@Comment("Turn off god mode when people exit")
private boolean removeOnDisconnect = false;
}

View File

@ -1,23 +0,0 @@
package com.earth2me.essentials.settings.commands;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Help implements StorageObject
{
@Comment("Show other plugins commands in help")
private boolean showNonEssCommandsInHelp = true;
@Comment(
{
"Hide plugins which don't give a permission in their plugin.yml for each command.",
"You can override a true value here for a single plugin by adding a permission to a user/group.",
"The individual permission is: essentials.help.<plugin>, anyone with essentials.* or '*' will see all help this setting reguardless.",
"You can use negative permissions to remove access to just a single plugins help if the following is enabled."
})
private boolean hidePermissionlessCommands = true;
}

View File

@ -1,24 +0,0 @@
package com.earth2me.essentials.settings.commands;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Home implements StorageObject
{
@Comment("When players die, should they respawn at their homes, instead of the spawnpoint?")
private boolean respawnAtHome = false;
@Comment(
{
"When a player interacts with a bed, should their home be set to that location?",
"If you enable this and remove default player access to the /sethome command, ",
"you can make beds the only way for players to set their home location."
})
private boolean bedSetsHome = false;
@Comment("If no home is set, should the player be send to spawn, when /home is used.")
private boolean spawnIfNoHome = false;
}

View File

@ -1,28 +0,0 @@
package com.earth2me.essentials.settings.commands;
import com.earth2me.essentials.storage.MapValueType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.HashMap;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
@Data
@EqualsAndHashCode(callSuper = false)
public class Kit implements StorageObject
{
public Kit()
{
final KitObject kit = new KitObject();
kit.setDelay(10.0);
kit.getItems().add(new ItemStack(Material.DIAMOND_SPADE, 1));
kit.getItems().add(new ItemStack(Material.DIAMOND_PICKAXE, 1));
kit.getItems().add(new ItemStack(Material.DIAMOND_AXE, 1));
kits.put("tools", kit);
}
@MapValueType(KitObject.class)
private Map<String, KitObject> kits = new HashMap<String, KitObject>();
}

View File

@ -1,19 +0,0 @@
package com.earth2me.essentials.settings.commands;
import com.earth2me.essentials.storage.ListType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.bukkit.inventory.ItemStack;
@Data
@EqualsAndHashCode(callSuper = false)
public class KitObject implements StorageObject
{
@ListType(ItemStack.class)
private List<ItemStack> items = new ArrayList<ItemStack>();
private Double delay;
}

View File

@ -1,15 +0,0 @@
package com.earth2me.essentials.settings.commands;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Lightning implements StorageObject
{
@Comment("Shall we notify users when using /lightning")
private boolean warnPlayer = true;
}

View File

@ -1,15 +0,0 @@
package com.earth2me.essentials.settings.commands;
import com.earth2me.essentials.storage.Comment;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Spawnmob implements StorageObject
{
@Comment("The maximum amount of monsters, a player can spawn with a call of /spawnmob.")
private int limit = 10;
}

View File

@ -19,7 +19,7 @@ public class SignKit extends EssentialsSign
{
validateTrade(sign, 3, ess);
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH);
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH).trim();
if (kitName.isEmpty())
{
@ -48,7 +48,7 @@ public class SignKit extends EssentialsSign
@Override
protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException
{
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH);
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH).trim();
final String group = sign.getLine(2);
if ((!group.isEmpty() && ("§2Everyone".equals(group) || player.inGroup(group)))
|| (group.isEmpty() && (player.isAuthorized("essentials.kit." + kitName))))

View File

@ -1,7 +1,5 @@
package com.earth2me.essentials.storage;
import com.earth2me.essentials.user.UserData;
public interface IStorageObjectHolder<T extends StorageObject>
{

View File

@ -1,14 +0,0 @@
package com.earth2me.essentials.user;
import com.earth2me.essentials.storage.StorageObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class Ban implements StorageObject
{
private String reason;
private long timeout;
}

View File

@ -1,15 +0,0 @@
package com.earth2me.essentials.user;
import org.bukkit.Location;
public interface IOfflinePlayer
{
String getName();
String getDisplayName();
Location getBedSpawnLocation();
void setBanned(boolean bln);
}

View File

@ -1,9 +0,0 @@
package com.earth2me.essentials.user;
import com.earth2me.essentials.storage.IStorageObjectHolder;
public interface IOfflineUser extends IStorageObjectHolder<UserData>, IOfflinePlayer
{
}

View File

@ -1,27 +0,0 @@
package com.earth2me.essentials.user;
import com.earth2me.essentials.storage.MapKeyType;
import com.earth2me.essentials.storage.MapValueType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.HashMap;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
@Data
@EqualsAndHashCode(callSuper = false)
public class Inventory implements StorageObject
{
private int size;
@MapKeyType(Integer.class)
@MapValueType(ItemStack.class)
private Map<Integer, ItemStack> items = new HashMap<Integer, ItemStack>();
public Inventory()
{
items.put(1, new ItemStack(Material.APPLE, 64));
}
}

View File

@ -1,220 +0,0 @@
package com.earth2me.essentials.user;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.IUser;
import com.earth2me.essentials.Teleport;
import com.earth2me.essentials.commands.IEssentialsCommand;
import lombok.Cleanup;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
public class User extends UserBase implements IUser
{
public User(final Player base, final IEssentials ess)
{
super(base, ess);
}
public User(final OfflinePlayer offlinePlayer, final IEssentials ess)
{
super(offlinePlayer, ess);
}
public void example()
{
// Cleanup will call close at the end of the function
@Cleanup
final User user = this;
// read lock allows to read data from the user
user.acquireReadLock();
final double money = user.getData().getMoney();
// write lock allows only one thread to modify the data
user.acquireWriteLock();
user.getData().setMoney(10 + money);
}
@Override
public void finishRead()
{
}
@Override
public void finishWrite()
{
}
@Override
public long getLastTeleportTimestamp()
{
acquireReadLock();
try
{
return getData().getTimestamps().get("lastteleport");
}
finally
{
unlock();
}
}
@Override
public boolean isAuthorized(String node)
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isAuthorized(IEssentialsCommand cmd)
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix)
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setLastTeleportTimestamp(long time)
{
acquireWriteLock();
try
{
getData().getTimestamps().put("lastteleport", time);
}
finally
{
unlock();
}
}
@Override
public Location getLastLocation()
{
acquireReadLock();
try
{
return getData().getLastLocation();
}
finally
{
unlock();
}
}
@Override
public double getMoney()
{
acquireReadLock();
try
{
return getData().getMoney();
}
finally
{
unlock();
}
}
@Override
public void takeMoney(double value)
{
acquireWriteLock();
try
{
getData().setMoney(getData().getMoney() - value);
}
finally
{
unlock();
}
}
@Override
public void giveMoney(double value)
{
acquireWriteLock();
try
{
getData().setMoney(getData().getMoney() + value);
}
finally
{
unlock();
}
}
@Override
public String getGroup()
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setLastLocation()
{
acquireWriteLock();
try
{
getData().setLastLocation(base.getLocation());
}
finally
{
unlock();
}
}
@Override
public Location getHome(String name) throws Exception
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Location getHome(Location loc) throws Exception
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isHidden()
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Teleport getTeleport()
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setJail(final String jail)
{
acquireWriteLock();
try
{
getData().setJail(jail);
}
finally
{
unlock();
}
}
@Override
public boolean canAfford(final double cost)
{
final double mon = getMoney();
if (isAuthorized("essentials.eco.loan"))
{
return (mon - cost) >= ess.getSettings().getMinMoney();
}
return cost <= mon;
}
}

View File

@ -1,117 +0,0 @@
package com.earth2me.essentials.user;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.storage.AsyncStorageObjectHolder;
import java.io.File;
import lombok.Delegate;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.entity.Entity;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permissible;
import org.bukkit.permissions.ServerOperator;
import org.bukkit.OfflinePlayer;
public abstract class UserBase extends AsyncStorageObjectHolder<UserData> implements Player, IOfflineUser
{
@Delegate(types =
{
Player.class, Entity.class, CommandSender.class, ServerOperator.class,
HumanEntity.class, ConfigurationSerializable.class, LivingEntity.class,
Permissible.class
},excludes=IOfflinePlayer.class)
protected Player base;
protected transient OfflinePlayer offlinePlayer;
public UserBase(final Player base, final IEssentials ess)
{
super(ess, UserData.class);
this.base = base;
reloadConfig();
}
public UserBase(final OfflinePlayer offlinePlayer, final IEssentials ess)
{
super(ess, UserData.class);
this.offlinePlayer = offlinePlayer;
reloadConfig();
}
public final Player getBase()
{
return base;
}
public final Player setBase(final Player base)
{
return this.base = base;
}
public void update(final Player base)
{
setBase(base);
}
public void update(final OfflinePlayer offlinePlayer)
{
this.offlinePlayer = offlinePlayer;
}
public void dispose()
{
this.offlinePlayer = Bukkit.getOfflinePlayer(base.getName());
this.base = null;
}
public boolean isOnlineUser() {
return base != null;
}
@Override
public String getName()
{
if (isOnlineUser()) {
return base.getName();
} else {
return offlinePlayer.getName();
}
}
@Override
public String getDisplayName()
{
if (isOnlineUser()) {
return base.getDisplayName();
} else {
return offlinePlayer.getName();
}
}
@Override
public Location getBedSpawnLocation()
{
return base.getBedSpawnLocation();
}
@Override
public void setBanned(boolean bln)
{
if (isOnlineUser()) {
base.setBanned(bln);
} else {
offlinePlayer.setBanned(bln);
}
}
@Override
public File getStorageFile()
{
return ess.getUserMap().getUserFile(getName());
}
}

View File

@ -1,56 +0,0 @@
package com.earth2me.essentials.user;
import com.earth2me.essentials.storage.ListType;
import com.earth2me.essentials.storage.MapKeyType;
import com.earth2me.essentials.storage.MapValueType;
import com.earth2me.essentials.storage.StorageObject;
import java.util.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.bukkit.Location;
import org.bukkit.Material;
@Data
@EqualsAndHashCode(callSuper = false)
public class UserData implements StorageObject
{
private String nickname;
private double money;
@MapValueType(Location.class)
private Map<String, Location> homes = new HashMap<String, Location>();
@ListType(Material.class)
private Set<Material> unlimited = new HashSet<Material>();
@MapValueType(List.class)
@MapKeyType(Material.class)
private Map<Material, List<String>> powerTools = new HashMap<Material, List<String>>();
private Location lastLocation;
@MapValueType(Long.class)
private Map<String, Long> timestamps;
private String jail;
@ListType
private List<String> mails;
private Inventory inventory;
private boolean teleportEnabled;
@ListType
private Set<String> ignore;
private boolean godmode;
private boolean muted;
private boolean jailed;
private Ban ban;
private String ipAddress;
private boolean afk;
private boolean newplayer = true;
private String geolocation;
private boolean socialspy;
private boolean npc;
private boolean powertoolsenabled;
public UserData()
{
unlimited.add(Material.AIR);
unlimited.add(Material.ARROW);
unlimited.add(Material.APPLE);
powerTools.put(Material.DEAD_BUSH, Collections.singletonList("test"));
}
}

View File

@ -1,128 +0,0 @@
package com.earth2me.essentials.user;
import com.earth2me.essentials.IConf;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.Util;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.util.concurrent.UncheckedExecutionException;
import java.io.File;
import java.util.Collections;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.ExecutionException;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class UserMap extends CacheLoader<String, User> implements IConf
{
private final transient IEssentials ess;
private final transient Cache<String, User> users = CacheBuilder.newBuilder().softValues().build(this);
private final transient ConcurrentSkipListSet<String> keys = new ConcurrentSkipListSet<String>();
public UserMap(final IEssentials ess)
{
super();
this.ess = ess;
loadAllUsersAsync(ess);
}
private void loadAllUsersAsync(final IEssentials ess)
{
ess.scheduleAsyncDelayedTask(new Runnable()
{
@Override
public void run()
{
final File userdir = new File(ess.getDataFolder(), "userdata");
if (!userdir.exists())
{
return;
}
keys.clear();
users.invalidateAll();
for (String string : userdir.list())
{
if (!string.endsWith(".yml"))
{
continue;
}
final String name = string.substring(0, string.length() - 4);
keys.add(name.toLowerCase(Locale.ENGLISH));
}
}
});
}
public boolean userExists(final String name)
{
return keys.contains(name.toLowerCase(Locale.ENGLISH));
}
public User getUser(final String name)
{
try
{
return users.get(name.toLowerCase(Locale.ENGLISH));
}
catch (ExecutionException ex)
{
return null;
}
catch (UncheckedExecutionException ex)
{
return null;
}
}
@Override
public User load(final String name) throws Exception
{
for (Player player : ess.getServer().getOnlinePlayers())
{
if (player.getName().equalsIgnoreCase(name))
{
keys.add(name.toLowerCase(Locale.ENGLISH));
return new User(player, ess);
}
}
final File userFile = getUserFile(name);
if (userFile.exists())
{
keys.add(name.toLowerCase(Locale.ENGLISH));
return new User(Bukkit.getOfflinePlayer(name), ess);
}
throw new Exception("User not found!");
}
@Override
public void reloadConfig()
{
loadAllUsersAsync(ess);
}
public void removeUser(final String name)
{
keys.remove(name.toLowerCase(Locale.ENGLISH));
users.invalidate(name.toLowerCase(Locale.ENGLISH));
}
public Set<String> getAllUniqueUsers()
{
return Collections.unmodifiableSet(keys);
}
public int getUniqueUsers()
{
return keys.size();
}
public File getUserFile(final String name)
{
final File userFolder = new File(ess.getDataFolder(), "userdata");
return new File(userFolder, Util.sanitizeFileName(name) + ".yml");
}
}

View File

@ -450,28 +450,6 @@ protect:
password: 'root'
mysqlDb: 'jdbc:mysql://localhost:3306/minecraft'
# For which block types would you like to be alerted?
# You can find a list of IDs in plugins/Essentials/items.csv after loading Essentials for the first time.
# 10 = lava :: 11 = still lava :: 46 = TNT :: 327 = lava bucket
alert:
on-placement: 10,11,46,327
on-use: 327
on-break:
blacklist:
# Which blocks should people be prevented from placing
placement: 10,11,46,327
# Which items should people be prevented from using
usage: 327
# Which blocks should people be prevented from breaking
break:
# Which blocks should not be pushed by pistons
piston:
# General physics/behavior modifications
prevent:
lava-flow: false
@ -532,10 +510,10 @@ protect:
# Protect various blocks.
protect:
# Protect all signs
signs: true
signs: false
# Prevent users from destroying rails
rails: true
rails: false
# Blocks below rails/signs are also protected if the respective rail/sign is protected.
# This makes it more difficult to circumvent protection, and should be enabled.
@ -577,6 +555,20 @@ protect:
# Should the damage after hit by a lightning be disabled?
lightning: false
# Disable weather options
weather:
storm: false
thunder: false
lightning: false
############################################################
# +------------------------------------------------------+ #
# | EssentialsAntiBuild | #
# +------------------------------------------------------+ #
############################################################
# Disable various default physics and behaviors
# Should people with build: false in permissions be allowed to build
# Set true to disable building for those people
build: true
@ -587,12 +579,28 @@ protect:
# Should we tell people they are not allowed to build
warn-on-build-disallow: true
# For which block types would you like to be alerted?
# You can find a list of IDs in plugins/Essentials/items.csv after loading Essentials for the first time.
# 10 = lava :: 11 = still lava :: 46 = TNT :: 327 = lava bucket
alert:
on-placement: 10,11,46,327
on-use: 327
on-break:
# Disable weather options
weather:
storm: false
thunder: false
lightning: false
blacklist:
# Which blocks should people be prevented from placing
placement: 10,11,46,327
# Which items should people be prevented from using
usage: 327
# Which blocks should people be prevented from breaking
break:
# Which blocks should not be pushed by pistons
piston:
############################################################
# +------------------------------------------------------+ #

View File

@ -22,6 +22,20 @@ wplank,5,0
plankwooden,5,0
plankwood,5,0
plankw,5,0
oakplank,5,0
oakwoodenplank,5,0
oakwoodplank,5,0
oakwplank,5,0
oakplankwooden,5,0
oakplankwood,5,0
oakplankw,5,0
oplank,5,0
owoodenplank,5,0
owoodplank,5,0
owplank,5,0
oplankwooden,5,0
oplankwood,5,0
oplankw,5,0
darkplank,5,1
darkwoodenplank,5,1
darkwoodplank,5,1
@ -50,6 +64,20 @@ swplank,5,1
splankwooden,5,1
splankwood,5,1
splankw,5,1
pineplank,5,1
pinewoodenplank,5,1
pinewoodplank,5,1
pinewplank,5,1
pineplankwooden,5,1
pineplankwood,5,1
pineplankw,5,1
pplank,5,1
pwoodenplank,5,1
pwoodplank,5,1
pwplank,5,1
pplankwooden,5,1
pplankwood,5,1
pplankw,5,1
lightplank,5,2
lightwoodenplank,5,2
lightwoodplank,5,2
@ -57,6 +85,13 @@ lightwplank,5,2
lightplankwooden,5,2
lightplankwood,5,2
lightplankw,5,2
lplank,5,2
lwoodenplank,5,2
lwoodplank,5,2
lwplank,5,2
lplankwooden,5,2
lplankwood,5,2
lplankw,5,2
birchplank,5,2
birchwoodenplank,5,2
birchwoodplank,5,2
@ -71,6 +106,19 @@ bwplank,5,2
bplankwooden,5,2
bplankwood,5,2
bplankw,5,2
whiteplank,5,2
whitewoodenplank,5,2
whitewoodplank,5,2
whitewplank,5,2
whiteplankwooden,5,2
whiteplankwood,5,2
whiteplankw,5,2
wwoodenplank,5,2
wwoodplank,5,2
wwplank,5,2
wplankwooden,5,2
wplankwood,5,2
wplankw,5,2
jungleplank,5,3
junglewoodenplank,5,3
junglewoodplank,5,3
@ -85,6 +133,20 @@ jwplank,5,3
jplankwooden,5,3
jplankwood,5,3
jplankw,5,3
forestplank,5,3
forestwoodenplank,5,3
forestwoodplank,5,3
forestwplank,5,3
forestplankwooden,5,3
forestplankwood,5,3
forestplankw,5,3
fplank,5,3
fwoodenplank,5,3
fwoodplank,5,3
fwplank,5,3
fplankwooden,5,3
fplankwood,5,3
fplankw,5,3
sapling,6,0
treesapling,6,0
logsapling,6,0
@ -94,162 +156,91 @@ oaktreesapling,6,0
oaklogsapling,6,0
oaktrunksapling,6,0
oakwoodsapling,6,0
normaltreesapling,6,0
normallogsapling,6,0
normaltrunksapling,6,0
normalwoodsapling,6,0
osapling,6,0
otreesapling,6,0
ologsapling,6,0
otrunksapling,6,0
owoodsapling,6,0
nsapling,6,0
ntreesapling,6,0
nlogsapling,6,0
ntrunksapling,6,0
nwoodsapling,6,0
treesap,6,0
logsap,6,0
trunksap,6,0
woodsap,6,0
oaktreesap,6,0
oaklogsap,6,0
oaktrunksap,6,0
oakwoodsap,6,0
osap,6,0
otreesap,6,0
ologsap,6,0
otrunksap,6,0
owoodsap,6,0
darksapling,6,1
darktreesapling,6,1
darklogsapling,6,1
darktrunksapling,6,1
darkwoodsapling,6,1
blacksapling,6,1
blacktreesapling,6,1
blacklogsapling,6,1
blacktrunksapling,6,1
blackwoodsapling,6,1
sprucesapling,6,1
sprucetreesapling,6,1
sprucelogsapling,6,1
sprucetrunksapling,6,1
sprucewoodsapling,6,1
pinesapling,6,1
pinetreesapling,6,1
pinelogsapling,6,1
pinetrunksapling,6,1
pinewoodsapling,6,1
dsapling,6,1
dtreesapling,6,1
dlogsapling,6,1
dtrunksapling,6,1
dwoodsapling,6,1
blsapling,6,1
bltreesapling,6,1
bllogsapling,6,1
bltrunksapling,6,1
blwoodsapling,6,1
ssapling,6,1
streesapling,6,1
slogsapling,6,1
strunksapling,6,1
swoodsapling,6,1
darksap,6,1
darktreesap,6,1
darklogsap,6,1
darktrunksap,6,1
darkwoodsap,6,1
blacksap,6,1
blacktreesap,6,1
blacklogsap,6,1
blacktrunksap,6,1
blackwoodsap,6,1
pinesap,6,1
pinetreesap,6,1
pinelogsap,6,1
pinetrunksap,6,1
pinewoodsap,6,1
sprucesap,6,1
sprucetreesap,6,1
sprucelogsap,6,1
sprucetrunksap,6,1
sprucewoodsap,6,1
dsap,6,1
dtreesap,6,1
dlogsap,6,1
dtrunksap,6,1
dwoodsap,6,1
blsap,6,1
bltreesap,6,1
bllogsap,6,1
bltrunksap,6,1
blwoodsap,6,1
ssap,6,1
streesap,6,1
slogsap,6,1
strunksap,6,1
swoodsap,6,1
psapling,6,1
ptreesapling,6,1
plogsapling,6,1
ptrunksapling,6,1
pwoodsapling,6,1
birchsapling,6,2
birchtreesapling,6,2
birchlogsapling,6,2
birchtrunksapling,6,2
birchwoodsapling,6,2
lightsapling,6,2
lighttreesapling,6,2
lightlogsapling,6,2
lighttrunksapling,6,2
lightwoodsapling,6,2
whitesapling,6,2
whitetreesapling,6,2
whitelogsapling,6,2
whitetrunksapling,6,2
whitewoodsapling,6,2
bisapling,6,2
bitreesapling,6,2
bilogsapling,6,2
bitrunksapling,6,2
biwoodsapling,6,2
bsapling,6,2
btreesapling,6,2
blogsapling,6,2
btrunksapling,6,2
bwoodsapling,6,2
pasapling,6,2
patreesapling,6,2
palogsapling,6,2
patrunksapling,6,2
pawoodsapling,6,2
lsapling,6,2
ltreesapling,6,2
llogsapling,6,2
ltrunksapling,6,2
lwoodsapling,6,2
wsapling,6,2
wtreesapling,6,2
wlogsapling,6,2
wtrunksapling,6,2
wwoodsapling,6,2
birchsap,6,2
birchtreesap,6,2
birchlogsap,6,2
birchtrunksap,6,2
birchwoodsap,6,2
whitesap,6,2
whitetreesap,6,2
whitelogsap,6,2
whitetrunksap,6,2
whitewoodsap,6,2
bisap,6,2
bitreesap,6,2
bilogsap,6,2
bitrunksap,6,2
biwoodsap,6,2
bsap,6,2
btreesap,6,2
blogsap,6,2
btrunksap,6,2
bwoodsap,6,2
pasap,6,2
patreesap,6,2
palogsap,6,2
patrunksap,6,2
pawoodsap,6,2
wsap,6,2
wtreesap,6,2
wlogsap,6,2
wtrunksap,6,2
wwoodsap,6,2
junglesapling,6,3
jungletreesapling,6,3
junglelogsapling,6,3
jungletrunksapling,6,3
junglewoodsapling,6,3
forestsapling,6,3
foresttreesapling,6,3
forestlogsapling,6,3
foresttrunksapling,6,3
forestwoodsapling,6,3
jsapling,6,3
junglesap,6,3
jsap,6,3
jtreesapling,6,3
jlogsapling,6,3
jtrunksapling,6,3
jwoodsapling,6,3
fsapling,6,3
ftreesapling,6,3
flogsapling,6,3
ftrunksapling,6,3
fwoodsapling,6,3
bedrock,7,0
oprock,7,0
opblock,7,0
@ -291,6 +282,7 @@ tree,17,0
log,17,0
trunk,17,0
wood,17,0
oak,17,0
oaktree,17,0
oaklog,17,0
oaktrunk,17,0
@ -299,44 +291,48 @@ otree,17,0
olog,17,0
otrunk,17,0
owood,17,0
dark,17,1
darktree,17,1
darklog,17,1
darktrunk,17,1
darkwood,17,1
blacktree,17,1
blacklog,17,1
blacktrunk,17,1
blackwood,17,1
spruce,17,1
sprucetree,17,1
sprucelog,17,1
sprucetrunk,17,1
sprucewood,17,1
pine,17,1
pinetree,17,1
pinelog,17,1
pinetrunk,17,1
pinewood,17,1
dtree,17,1
dlog,17,1
dtrunk,17,1
dwood,17,1
bltree,17,1
bllog,17,1
bltrunk,17,1
blwood,17,1
stree,17,1
slog,17,1
strunk,17,1
swood,17,1
ptree,17,1
plog,17,1
ptrunk,17,1
pwood,17,1
birch,17,2
birchtree,17,2
birchlog,17,2
birchtrunk,17,2
birchwood,17,2
white,17,2
whitetree,17,2
whitelog,17,2
whitetrunk,17,2
whitewood,17,2
bitree,17,2
bilog,17,2
bitrunk,17,2
biwood,17,2
light,17,2
lighttree,17,2
lightlog,17,2
lighttrunk,17,2
lightwood,17,2
btree,17,2
blog,17,2
btrunk,17,2
@ -345,18 +341,38 @@ wtree,17,2
wlog,17,2
wtrunk,17,2
wwood,17,2
junglewood,17,3
jwood,17,3
ltree,17,2
llog,17,2
ltrunk,17,2
lwood,17,2
jungle,17,3
jungletree,17,3
junglelog,17,3
jungletrunk,17,3
junglewood,17,3
forest,17,3
foresttree,17,3
forestlog,17,3
foresttrunk,17,3
forestwood,17,3
jtree,17,3
jlog,17,3
monkeytree,17,3
monkeylog,17,3
jtrunk,17,3
jwood,17,3
ftree,17,3
flog,17,3
ftrunk,17,3
fwood,17,3
leaves,18,4
leaf,18,4
treeleaves,18,4
logleaves,18,4
trunkleaves,18,4
woodleaves,18,4
oakleaves,18,4
oakleaf,18,4
oleaves,18,4
oleaf,18,4
oaktreeleaves,18,4
oaklogleaves,18,4
oaktrunkleaves,18,4
@ -377,8 +393,70 @@ otreeleaf,18,4
ologleaf,18,4
otrunkleaf,18,4
owoodleaf,18,4
spruceleaves,18,5
spruceleaf,18,5
sleaves,18,5
sleaf,18,5
sprucetreeleaves,18,5
sprucelogleaves,18,5
sprucetrunkleaves,18,5
sprucewoodleaves,18,5
streeleaves,18,5
slogleaves,18,5
strunkleaves,18,5
swoodleaves,18,5
pineleaves,18,5
pineleaf,18,5
pleaves,18,5
pleaf,18,5
pinetreeleaves,18,5
pinelogleaves,18,5
pinetrunkleaves,18,5
pinewoodleaves,18,5
ptreeleaves,18,5
plogleaves,18,5
ptrunkleaves,18,5
pwoodleaves,18,5
darkleaves,18,5
darkleaf,18,5
dleaves,18,5
dleaf,18,5
darktreeleaves,18,5
darklogleaves,18,5
darktrunkleaves,18,5
darkwoodleaves,18,5
dtreeleaves,18,5
dlogleaves,18,5
dtrunkleaves,18,5
dwoodleaves,18,5
sprucetreeleaf,18,5
sprucelogleaf,18,5
sprucetrunkleaf,18,5
sprucewoodleaf,18,5
streeleaf,18,5
slogleaf,18,5
strunkleaf,18,5
swoodleaf,18,5
pinetreeleaf,18,5
pinelogleaf,18,5
pinetrunkleaf,18,5
pinewoodleaf,18,5
ptreeleaf,18,5
plogleaf,18,5
ptrunkleaf,18,5
pwoodleaf,18,5
darktreeleaf,18,5
darklogleaf,18,5
darktrunkleaf,18,5
darkwoodleaf,18,5
dtreeleaf,18,5
dlogleaf,18,5
dtrunkleaf,18,5
dwoodleaf,18,5
birchleaves,18,6
birchleaf,18,6
bleaves,18,6
bleaf,18,6
birchtreeleaves,18,6
birchlogleaves,18,6
birchtrunkleaves,18,6
@ -387,10 +465,30 @@ btreeleaves,18,6
blogleaves,18,6
btrunkleaves,18,6
bwoodleaves,18,6
bitreeleaves,18,6
bilogleaves,18,6
bitrunkleaves,18,6
biwoodleaves,18,6
lightleaves,18,6
lightleaf,18,6
lleaves,18,6
lleaf,18,6
lighttreeleaves,18,6
lightlogleaves,18,6
lighttrunkleaves,18,6
lightwoodleaves,18,6
ltreeleaves,18,6
llogleaves,18,6
ltrunkleaves,18,6
lwoodleaves,18,6
whiteleaves,18,6
whiteleaf,18,6
wleaves,18,6
wleaf,18,6
whitetreeleaves,18,6
whitelogleaves,18,6
whitetrunkleaves,18,6
whitewoodleaves,18,6
wtreeleaves,18,6
wlogleaves,18,6
wtrunkleaves,18,6
wwoodleaves,18,6
birchtreeleaf,18,6
birchlogleaf,18,6
birchtrunkleaf,18,6
@ -399,16 +497,62 @@ btreeleaf,18,6
blogleaf,18,6
btrunkleaf,18,6
bwoodleaf,18,6
bitreeleaf,18,6
bilogleaf,18,6
bitrunkleaf,18,6
biwoodleaf,18,6
lighttreeleaf,18,6
lightlogleaf,18,6
lighttrunkleaf,18,6
lightwoodleaf,18,6
ltreeleaf,18,6
llogleaf,18,6
ltrunkleaf,18,6
lwoodleaf,18,6
whitetreeleaf,18,6
whitelogleaf,18,6
whitetrunkleaf,18,6
whitewoodleaf,18,6
wtreeleaf,18,6
wlogleaf,18,6
wtrunkleaf,18,6
wwoodleaf,18,6
jungleleaves,18,7
jungleleaf,18,7
jleaves,18,7
jleaf,18,7
jungleleaf,18,7
monkeyleaf,18,7
monkeyleaves,18,7
jungletreeleaves,18,7
junglelogleaves,18,7
jungletrunkleaves,18,7
junglewoodleaves,18,7
jtreeleaves,18,7
jlogleaves,18,7
jtrunkleaves,18,7
jwoodleaves,18,7
forestleaves,18,7
forestleaf,18,7
fleaves,18,7
fleaf,18,7
foresttreeleaves,18,7
forestlogleaves,18,7
foresttrunkleaves,18,7
forestwoodleaves,18,7
ftreeleaves,18,7
flogleaves,18,7
ftrunkleaves,18,7
fwoodleaves,18,7
jungletreeleaf,18,7
junglelogleaf,18,7
jungletrunkleaf,18,7
junglewoodleaf,18,7
jtreeleaf,18,7
jlogleaf,18,7
jtrunkleaf,18,7
jwoodleaf,18,7
foresttreeleaf,18,7
forestlogleaf,18,7
foresttrunkleaf,18,7
forestwoodleaf,18,7
ftreeleaf,18,7
flogleaf,18,7
ftrunkleaf,18,7
fwoodleaf,18,7
sponge,19,0
glass,20,0
lapislazuliore,21,0
@ -586,6 +730,12 @@ lightgrecotton,35,5
lgrecloth,35,5
lgrewool,35,5
lgrecotton,35,5
limecloth,35,5
limewool,35,5
limecotton,35,5
lcloth,35,5
lwool,35,5
lcotton,35,5
pinkcloth,35,6
pinkwool,35,6
pinkcotton,35,6
@ -1104,6 +1254,9 @@ mcobblestone,48,0
mossycobble,48,0
mosscobble,48,0
mcobble,48,0
mossstone,48,0
mossystone,48,0
mstone,48,0
obsidian,49,0
obsi,49,0
obby,49,0
@ -2821,6 +2974,8 @@ flintiron,259,0
flinttinder,259,0
lighter,259,0
apple,260,0
normalapple,260,0
redapple,260,0
bow,261,0
arrow,262,0
coal,263,0
@ -3205,6 +3360,27 @@ picture,321,0
goldenapple,322,0
goldapple,322,0
gapple,322,0
enchantedgoldenapple,322,1
enchantedgoldapple,322,1
enchantedgapple,322,1
supergoldenapple,322,1
supergoldapple,322,1
supergapple,322,1
magicalgoldenapple,322,1
magicalgoldapple,322,1
magicalgapple,322,1
magicgoldenapple,322,1
magicgoldapple,322,1
magicgapple,322,1
egoldenapple,322,1
egoldapple,322,1
egapple,322,1
sgoldenapple,322,1
sgoldapple,322,1
sgapple,322,1
mgoldenapple,322,1
mgoldapple,322,1
mgapple,322,1
sign,323,0
woodendoor,324,0
wooddoor,324,0
@ -3628,8 +3804,24 @@ delay,356,0
dioder,356,0
diode,356,0
cookie,357,0
map,358,0
chart,358,0
map,358,0
map_0,358,0
map_1,358,1
map_2,358,2
map_3,358,3
map_4,358,4
map_5,358,5
map_6,358,6
map_7,358,7
map_8,358,8
map_9,358,9
map_10,358,10
map_11,358,11
map_12,358,12
map_13,358,13
map_14,358,14
map_15,358,15
shears,359,0
shear,359,0
sheers,359,0
@ -4108,7 +4300,7 @@ spldmgpotion,373,16396
splharmingpot,373,16396
spldamagepot,373,16396
spldmgpot,373,16396
sdpot,373,16396
spdpot,373,16396
splashregenerationleveliipotion,373,16417
splashregenerateleveliipotion,373,16417
splashregenleveliipotion,373,16417
@ -4798,10 +4990,10 @@ redmusicrecord,2259,0
redmusicdisk,2259,0
redmusicdisc,2259,0
redmusiccd,2259,0
chripmusicrecord,2259,0
chripmusicdisk,2259,0
chripmusicdisc,2259,0
chripmusiccd,2259,0
chirpmusicrecord,2259,0
chirpmusicdisk,2259,0
chirpmusicdisc,2259,0
chirpmusiccd,2259,0
remusicrecord,2259,0
remusicdisk,2259,0
remusicdisc,2259,0
@ -4810,10 +5002,10 @@ redmrecord,2259,0
redmdisk,2259,0
redmdisc,2259,0
redmcd,2259,0
chripmrecord,2259,0
chripmdisk,2259,0
chripmdisc,2259,0
chripmcd,2259,0
chirpmrecord,2259,0
chirpmdisk,2259,0
chirpmdisc,2259,0
chirpmcd,2259,0
remrecord,2259,0
remdisk,2259,0
remdisc,2259,0
@ -4822,10 +5014,10 @@ redrecord,2259,0
reddisk,2259,0
reddisc,2259,0
redcd,2259,0
chriprecord,2259,0
chripdisk,2259,0
chripdisc,2259,0
chripcd,2259,0
chirprecord,2259,0
chirpdisk,2259,0
chirpdisc,2259,0
chirpcd,2259,0
rerecord,2259,0
redisk,2259,0
redisc,2259,0
@ -4905,7 +5097,7 @@ cd5,2260,0
5record,2260,0
5disk,2260,0
5disc,2260,0
5cs,2260,0
5cd,2260,0
purplemusicrecord,2261,0
purplemusicdisk,2261,0
purplemusicdisc,2261,0
@ -5149,7 +5341,7 @@ cd10,2265,0
10record,2265,0
10disk,2265,0
10disc,2265,0
10cs,2265,0
10cd,2265,0
crackedmusicrecord,2266,0
crackedmusicdisk,2266,0
crackedmusicdisc,2266,0

1 #version: teamcity
22 plankwooden,5,0
23 plankwood,5,0
24 plankw,5,0
25 oakplank,5,0
26 oakwoodenplank,5,0
27 oakwoodplank,5,0
28 oakwplank,5,0
29 oakplankwooden,5,0
30 oakplankwood,5,0
31 oakplankw,5,0
32 oplank,5,0
33 owoodenplank,5,0
34 owoodplank,5,0
35 owplank,5,0
36 oplankwooden,5,0
37 oplankwood,5,0
38 oplankw,5,0
39 darkplank,5,1
40 darkwoodenplank,5,1
41 darkwoodplank,5,1
64 splankwooden,5,1
65 splankwood,5,1
66 splankw,5,1
67 pineplank,5,1
68 pinewoodenplank,5,1
69 pinewoodplank,5,1
70 pinewplank,5,1
71 pineplankwooden,5,1
72 pineplankwood,5,1
73 pineplankw,5,1
74 pplank,5,1
75 pwoodenplank,5,1
76 pwoodplank,5,1
77 pwplank,5,1
78 pplankwooden,5,1
79 pplankwood,5,1
80 pplankw,5,1
81 lightplank,5,2
82 lightwoodenplank,5,2
83 lightwoodplank,5,2
85 lightplankwooden,5,2
86 lightplankwood,5,2
87 lightplankw,5,2
88 lplank,5,2
89 lwoodenplank,5,2
90 lwoodplank,5,2
91 lwplank,5,2
92 lplankwooden,5,2
93 lplankwood,5,2
94 lplankw,5,2
95 birchplank,5,2
96 birchwoodenplank,5,2
97 birchwoodplank,5,2
106 bplankwooden,5,2
107 bplankwood,5,2
108 bplankw,5,2
109 whiteplank,5,2
110 whitewoodenplank,5,2
111 whitewoodplank,5,2
112 whitewplank,5,2
113 whiteplankwooden,5,2
114 whiteplankwood,5,2
115 whiteplankw,5,2
116 wwoodenplank,5,2
117 wwoodplank,5,2
118 wwplank,5,2
119 wplankwooden,5,2
120 wplankwood,5,2
121 wplankw,5,2
122 jungleplank,5,3
123 junglewoodenplank,5,3
124 junglewoodplank,5,3
133 jplankwooden,5,3
134 jplankwood,5,3
135 jplankw,5,3
136 forestplank,5,3
137 forestwoodenplank,5,3
138 forestwoodplank,5,3
139 forestwplank,5,3
140 forestplankwooden,5,3
141 forestplankwood,5,3
142 forestplankw,5,3
143 fplank,5,3
144 fwoodenplank,5,3
145 fwoodplank,5,3
146 fwplank,5,3
147 fplankwooden,5,3
148 fplankwood,5,3
149 fplankw,5,3
150 sapling,6,0
151 treesapling,6,0
152 logsapling,6,0
156 oaklogsapling,6,0
157 oaktrunksapling,6,0
158 oakwoodsapling,6,0
normaltreesapling,6,0
normallogsapling,6,0
normaltrunksapling,6,0
normalwoodsapling,6,0
159 osapling,6,0
160 otreesapling,6,0
161 ologsapling,6,0
162 otrunksapling,6,0
163 owoodsapling,6,0
nsapling,6,0
ntreesapling,6,0
nlogsapling,6,0
ntrunksapling,6,0
nwoodsapling,6,0
treesap,6,0
logsap,6,0
trunksap,6,0
woodsap,6,0
oaktreesap,6,0
oaklogsap,6,0
oaktrunksap,6,0
oakwoodsap,6,0
osap,6,0
otreesap,6,0
ologsap,6,0
otrunksap,6,0
owoodsap,6,0
164 darksapling,6,1
165 darktreesapling,6,1
166 darklogsapling,6,1
167 darktrunksapling,6,1
168 darkwoodsapling,6,1
blacksapling,6,1
blacktreesapling,6,1
blacklogsapling,6,1
blacktrunksapling,6,1
blackwoodsapling,6,1
169 sprucesapling,6,1
170 sprucetreesapling,6,1
171 sprucelogsapling,6,1
172 sprucetrunksapling,6,1
173 sprucewoodsapling,6,1
174 pinesapling,6,1
175 pinetreesapling,6,1
176 pinelogsapling,6,1
177 pinetrunksapling,6,1
178 pinewoodsapling,6,1
179 dsapling,6,1
180 dtreesapling,6,1
181 dlogsapling,6,1
182 dtrunksapling,6,1
183 dwoodsapling,6,1
blsapling,6,1
bltreesapling,6,1
bllogsapling,6,1
bltrunksapling,6,1
blwoodsapling,6,1
184 ssapling,6,1
185 streesapling,6,1
186 slogsapling,6,1
187 strunksapling,6,1
188 swoodsapling,6,1
189 darksap,6,1 psapling,6,1
190 darktreesap,6,1 ptreesapling,6,1
191 darklogsap,6,1 plogsapling,6,1
192 darktrunksap,6,1 ptrunksapling,6,1
193 darkwoodsap,6,1 pwoodsapling,6,1
blacksap,6,1
blacktreesap,6,1
blacklogsap,6,1
blacktrunksap,6,1
blackwoodsap,6,1
pinesap,6,1
pinetreesap,6,1
pinelogsap,6,1
pinetrunksap,6,1
pinewoodsap,6,1
sprucesap,6,1
sprucetreesap,6,1
sprucelogsap,6,1
sprucetrunksap,6,1
sprucewoodsap,6,1
dsap,6,1
dtreesap,6,1
dlogsap,6,1
dtrunksap,6,1
dwoodsap,6,1
blsap,6,1
bltreesap,6,1
bllogsap,6,1
bltrunksap,6,1
blwoodsap,6,1
ssap,6,1
streesap,6,1
slogsap,6,1
strunksap,6,1
swoodsap,6,1
194 birchsapling,6,2
195 birchtreesapling,6,2
196 birchlogsapling,6,2
197 birchtrunksapling,6,2
198 birchwoodsapling,6,2
199 lightsapling,6,2
200 lighttreesapling,6,2
201 lightlogsapling,6,2
202 lighttrunksapling,6,2
203 lightwoodsapling,6,2
204 whitesapling,6,2
205 whitetreesapling,6,2
206 whitelogsapling,6,2
207 whitetrunksapling,6,2
208 whitewoodsapling,6,2
bisapling,6,2
bitreesapling,6,2
bilogsapling,6,2
bitrunksapling,6,2
biwoodsapling,6,2
209 bsapling,6,2
210 btreesapling,6,2
211 blogsapling,6,2
212 btrunksapling,6,2
213 bwoodsapling,6,2
214 pasapling,6,2 lsapling,6,2
215 patreesapling,6,2 ltreesapling,6,2
216 palogsapling,6,2 llogsapling,6,2
217 patrunksapling,6,2 ltrunksapling,6,2
218 pawoodsapling,6,2 lwoodsapling,6,2
219 wsapling,6,2
220 wtreesapling,6,2
221 wlogsapling,6,2
222 wtrunksapling,6,2
223 wwoodsapling,6,2
birchsap,6,2
birchtreesap,6,2
birchlogsap,6,2
birchtrunksap,6,2
birchwoodsap,6,2
whitesap,6,2
whitetreesap,6,2
whitelogsap,6,2
whitetrunksap,6,2
whitewoodsap,6,2
bisap,6,2
bitreesap,6,2
bilogsap,6,2
bitrunksap,6,2
biwoodsap,6,2
bsap,6,2
btreesap,6,2
blogsap,6,2
btrunksap,6,2
bwoodsap,6,2
pasap,6,2
patreesap,6,2
palogsap,6,2
patrunksap,6,2
pawoodsap,6,2
wsap,6,2
wtreesap,6,2
wlogsap,6,2
wtrunksap,6,2
wwoodsap,6,2
224 junglesapling,6,3
225 jungletreesapling,6,3
226 junglelogsapling,6,3
227 jungletrunksapling,6,3
228 junglewoodsapling,6,3
229 forestsapling,6,3
230 foresttreesapling,6,3
231 forestlogsapling,6,3
232 foresttrunksapling,6,3
233 forestwoodsapling,6,3
234 jsapling,6,3
235 junglesap,6,3 jtreesapling,6,3
236 jsap,6,3 jlogsapling,6,3
237 jtrunksapling,6,3
238 jwoodsapling,6,3
239 fsapling,6,3
240 ftreesapling,6,3
241 flogsapling,6,3
242 ftrunksapling,6,3
243 fwoodsapling,6,3
244 bedrock,7,0
245 oprock,7,0
246 opblock,7,0
282 log,17,0
283 trunk,17,0
284 wood,17,0
285 oak,17,0
286 oaktree,17,0
287 oaklog,17,0
288 oaktrunk,17,0
291 olog,17,0
292 otrunk,17,0
293 owood,17,0
294 dark,17,1
295 darktree,17,1
296 darklog,17,1
297 darktrunk,17,1
298 darkwood,17,1
blacktree,17,1
blacklog,17,1
blacktrunk,17,1
blackwood,17,1
299 spruce,17,1
300 sprucetree,17,1
301 sprucelog,17,1
302 sprucetrunk,17,1
303 sprucewood,17,1
304 pine,17,1
305 pinetree,17,1
306 pinelog,17,1
307 pinetrunk,17,1
308 pinewood,17,1
309 dtree,17,1
310 dlog,17,1
311 dtrunk,17,1
312 dwood,17,1
bltree,17,1
bllog,17,1
bltrunk,17,1
blwood,17,1
313 stree,17,1
314 slog,17,1
315 strunk,17,1
316 swood,17,1
317 ptree,17,1
318 plog,17,1
319 ptrunk,17,1
320 pwood,17,1
321 birch,17,2
322 birchtree,17,2
323 birchlog,17,2
324 birchtrunk,17,2
325 birchwood,17,2
326 white,17,2
327 whitetree,17,2
328 whitelog,17,2
329 whitetrunk,17,2
330 whitewood,17,2
331 bitree,17,2 light,17,2
332 bilog,17,2 lighttree,17,2
333 bitrunk,17,2 lightlog,17,2
334 biwood,17,2 lighttrunk,17,2
335 lightwood,17,2
336 btree,17,2
337 blog,17,2
338 btrunk,17,2
341 wlog,17,2
342 wtrunk,17,2
343 wwood,17,2
344 junglewood,17,3 ltree,17,2
345 jwood,17,3 llog,17,2
346 ltrunk,17,2
347 lwood,17,2
348 jungle,17,3
349 jungletree,17,3
350 junglelog,17,3
351 jungletrunk,17,3
352 junglewood,17,3
353 forest,17,3
354 foresttree,17,3
355 forestlog,17,3
356 foresttrunk,17,3
357 forestwood,17,3
358 jtree,17,3
359 jlog,17,3
360 monkeytree,17,3 jtrunk,17,3
361 monkeylog,17,3 jwood,17,3
362 ftree,17,3
363 flog,17,3
364 ftrunk,17,3
365 fwood,17,3
366 leaves,18,4
367 leaf,18,4
368 treeleaves,18,4
369 logleaves,18,4
370 trunkleaves,18,4
371 woodleaves,18,4
372 oakleaves,18,4
373 oakleaf,18,4
374 oleaves,18,4
375 oleaf,18,4
376 oaktreeleaves,18,4
377 oaklogleaves,18,4
378 oaktrunkleaves,18,4
393 ologleaf,18,4
394 otrunkleaf,18,4
395 owoodleaf,18,4
396 spruceleaves,18,5
397 spruceleaf,18,5
398 sleaves,18,5
399 sleaf,18,5
400 sprucetreeleaves,18,5
401 sprucelogleaves,18,5
402 sprucetrunkleaves,18,5
403 sprucewoodleaves,18,5
404 streeleaves,18,5
405 slogleaves,18,5
406 strunkleaves,18,5
407 swoodleaves,18,5
408 pineleaves,18,5
409 pineleaf,18,5
410 pleaves,18,5
411 pleaf,18,5
412 pinetreeleaves,18,5
413 pinelogleaves,18,5
414 pinetrunkleaves,18,5
415 pinewoodleaves,18,5
416 ptreeleaves,18,5
417 plogleaves,18,5
418 ptrunkleaves,18,5
419 pwoodleaves,18,5
420 darkleaves,18,5
421 darkleaf,18,5
422 dleaves,18,5
423 dleaf,18,5
424 darktreeleaves,18,5
425 darklogleaves,18,5
426 darktrunkleaves,18,5
427 darkwoodleaves,18,5
428 dtreeleaves,18,5
429 dlogleaves,18,5
430 dtrunkleaves,18,5
431 dwoodleaves,18,5
432 sprucetreeleaf,18,5
433 sprucelogleaf,18,5
434 sprucetrunkleaf,18,5
435 sprucewoodleaf,18,5
436 streeleaf,18,5
437 slogleaf,18,5
438 strunkleaf,18,5
439 swoodleaf,18,5
440 pinetreeleaf,18,5
441 pinelogleaf,18,5
442 pinetrunkleaf,18,5
443 pinewoodleaf,18,5
444 ptreeleaf,18,5
445 plogleaf,18,5
446 ptrunkleaf,18,5
447 pwoodleaf,18,5
448 darktreeleaf,18,5
449 darklogleaf,18,5
450 darktrunkleaf,18,5
451 darkwoodleaf,18,5
452 dtreeleaf,18,5
453 dlogleaf,18,5
454 dtrunkleaf,18,5
455 dwoodleaf,18,5
456 birchleaves,18,6
457 birchleaf,18,6
458 bleaves,18,6
459 bleaf,18,6
460 birchtreeleaves,18,6
461 birchlogleaves,18,6
462 birchtrunkleaves,18,6
465 blogleaves,18,6
466 btrunkleaves,18,6
467 bwoodleaves,18,6
468 bitreeleaves,18,6 lightleaves,18,6
469 bilogleaves,18,6 lightleaf,18,6
470 bitrunkleaves,18,6 lleaves,18,6
471 biwoodleaves,18,6 lleaf,18,6
472 lighttreeleaves,18,6
473 lightlogleaves,18,6
474 lighttrunkleaves,18,6
475 lightwoodleaves,18,6
476 ltreeleaves,18,6
477 llogleaves,18,6
478 ltrunkleaves,18,6
479 lwoodleaves,18,6
480 whiteleaves,18,6
481 whiteleaf,18,6
482 wleaves,18,6
483 wleaf,18,6
484 whitetreeleaves,18,6
485 whitelogleaves,18,6
486 whitetrunkleaves,18,6
487 whitewoodleaves,18,6
488 wtreeleaves,18,6
489 wlogleaves,18,6
490 wtrunkleaves,18,6
491 wwoodleaves,18,6
492 birchtreeleaf,18,6
493 birchlogleaf,18,6
494 birchtrunkleaf,18,6
497 blogleaf,18,6
498 btrunkleaf,18,6
499 bwoodleaf,18,6
500 bitreeleaf,18,6 lighttreeleaf,18,6
501 bilogleaf,18,6 lightlogleaf,18,6
502 bitrunkleaf,18,6 lighttrunkleaf,18,6
503 biwoodleaf,18,6 lightwoodleaf,18,6
504 ltreeleaf,18,6
505 llogleaf,18,6
506 ltrunkleaf,18,6
507 lwoodleaf,18,6
508 whitetreeleaf,18,6
509 whitelogleaf,18,6
510 whitetrunkleaf,18,6
511 whitewoodleaf,18,6
512 wtreeleaf,18,6
513 wlogleaf,18,6
514 wtrunkleaf,18,6
515 wwoodleaf,18,6
516 jungleleaves,18,7
517 jungleleaf,18,7
518 jleaves,18,7
519 jleaf,18,7
520 jungleleaf,18,7 jungletreeleaves,18,7
521 monkeyleaf,18,7 junglelogleaves,18,7
522 monkeyleaves,18,7 jungletrunkleaves,18,7
523 junglewoodleaves,18,7
524 jtreeleaves,18,7
525 jlogleaves,18,7
526 jtrunkleaves,18,7
527 jwoodleaves,18,7
528 forestleaves,18,7
529 forestleaf,18,7
530 fleaves,18,7
531 fleaf,18,7
532 foresttreeleaves,18,7
533 forestlogleaves,18,7
534 foresttrunkleaves,18,7
535 forestwoodleaves,18,7
536 ftreeleaves,18,7
537 flogleaves,18,7
538 ftrunkleaves,18,7
539 fwoodleaves,18,7
540 jungletreeleaf,18,7
541 junglelogleaf,18,7
542 jungletrunkleaf,18,7
543 junglewoodleaf,18,7
544 jtreeleaf,18,7
545 jlogleaf,18,7
546 jtrunkleaf,18,7
547 jwoodleaf,18,7
548 foresttreeleaf,18,7
549 forestlogleaf,18,7
550 foresttrunkleaf,18,7
551 forestwoodleaf,18,7
552 ftreeleaf,18,7
553 flogleaf,18,7
554 ftrunkleaf,18,7
555 fwoodleaf,18,7
556 sponge,19,0
557 glass,20,0
558 lapislazuliore,21,0
730 lgrecloth,35,5
731 lgrewool,35,5
732 lgrecotton,35,5
733 limecloth,35,5
734 limewool,35,5
735 limecotton,35,5
736 lcloth,35,5
737 lwool,35,5
738 lcotton,35,5
739 pinkcloth,35,6
740 pinkwool,35,6
741 pinkcotton,35,6
1254 mossycobble,48,0
1255 mosscobble,48,0
1256 mcobble,48,0
1257 mossstone,48,0
1258 mossystone,48,0
1259 mstone,48,0
1260 obsidian,49,0
1261 obsi,49,0
1262 obby,49,0
2974 flinttinder,259,0
2975 lighter,259,0
2976 apple,260,0
2977 normalapple,260,0
2978 redapple,260,0
2979 bow,261,0
2980 arrow,262,0
2981 coal,263,0
3360 goldenapple,322,0
3361 goldapple,322,0
3362 gapple,322,0
3363 enchantedgoldenapple,322,1
3364 enchantedgoldapple,322,1
3365 enchantedgapple,322,1
3366 supergoldenapple,322,1
3367 supergoldapple,322,1
3368 supergapple,322,1
3369 magicalgoldenapple,322,1
3370 magicalgoldapple,322,1
3371 magicalgapple,322,1
3372 magicgoldenapple,322,1
3373 magicgoldapple,322,1
3374 magicgapple,322,1
3375 egoldenapple,322,1
3376 egoldapple,322,1
3377 egapple,322,1
3378 sgoldenapple,322,1
3379 sgoldapple,322,1
3380 sgapple,322,1
3381 mgoldenapple,322,1
3382 mgoldapple,322,1
3383 mgapple,322,1
3384 sign,323,0
3385 woodendoor,324,0
3386 wooddoor,324,0
3804 dioder,356,0
3805 diode,356,0
3806 cookie,357,0
map,358,0
3807 chart,358,0
3808 map,358,0
3809 map_0,358,0
3810 map_1,358,1
3811 map_2,358,2
3812 map_3,358,3
3813 map_4,358,4
3814 map_5,358,5
3815 map_6,358,6
3816 map_7,358,7
3817 map_8,358,8
3818 map_9,358,9
3819 map_10,358,10
3820 map_11,358,11
3821 map_12,358,12
3822 map_13,358,13
3823 map_14,358,14
3824 map_15,358,15
3825 shears,359,0
3826 shear,359,0
3827 sheers,359,0
4300 splharmingpot,373,16396
4301 spldamagepot,373,16396
4302 spldmgpot,373,16396
4303 sdpot,373,16396 spdpot,373,16396
4304 splashregenerationleveliipotion,373,16417
4305 splashregenerateleveliipotion,373,16417
4306 splashregenleveliipotion,373,16417
4990 redmusicdisk,2259,0
4991 redmusicdisc,2259,0
4992 redmusiccd,2259,0
4993 chripmusicrecord,2259,0 chirpmusicrecord,2259,0
4994 chripmusicdisk,2259,0 chirpmusicdisk,2259,0
4995 chripmusicdisc,2259,0 chirpmusicdisc,2259,0
4996 chripmusiccd,2259,0 chirpmusiccd,2259,0
4997 remusicrecord,2259,0
4998 remusicdisk,2259,0
4999 remusicdisc,2259,0
5002 redmdisk,2259,0
5003 redmdisc,2259,0
5004 redmcd,2259,0
5005 chripmrecord,2259,0 chirpmrecord,2259,0
5006 chripmdisk,2259,0 chirpmdisk,2259,0
5007 chripmdisc,2259,0 chirpmdisc,2259,0
5008 chripmcd,2259,0 chirpmcd,2259,0
5009 remrecord,2259,0
5010 remdisk,2259,0
5011 remdisc,2259,0
5014 reddisk,2259,0
5015 reddisc,2259,0
5016 redcd,2259,0
5017 chriprecord,2259,0 chirprecord,2259,0
5018 chripdisk,2259,0 chirpdisk,2259,0
5019 chripdisc,2259,0 chirpdisc,2259,0
5020 chripcd,2259,0 chirpcd,2259,0
5021 rerecord,2259,0
5022 redisk,2259,0
5023 redisc,2259,0
5097 5record,2260,0
5098 5disk,2260,0
5099 5disc,2260,0
5100 5cs,2260,0 5cd,2260,0
5101 purplemusicrecord,2261,0
5102 purplemusicdisk,2261,0
5103 purplemusicdisc,2261,0
5341 10record,2265,0
5342 10disk,2265,0
5343 10disc,2265,0
5344 10cs,2265,0 10cd,2265,0
5345 crackedmusicrecord,2266,0
5346 crackedmusicdisk,2266,0
5347 crackedmusicdisc,2266,0

View File

@ -3,16 +3,16 @@
# Translations start here
# by: oggehej, corrected by NeonMaster.
action=* {0} {1}
addedToAccount=\u00a7a{0} har blivit tillagt p\u00c3\u00a5 ditt konto.
addedToOthersAccount=\u00a7a{0} har blivit tillagt p\u00c3\u00a5 {1}\u00a7a konto. Ny balans: {2}
addedToAccount=\u00a7a{0} har blivit tillagt p\u00e5 ditt konto.
addedToOthersAccount=\u00a7a{0} har blivit tillagt p\u00e5 {1}\u00a7a konto. Ny balans: {2}
adventure = adventure
alertBroke=gjorde s\u00c3\u00b6nder:
alertBroke=gjorde s\u00f6nder:
alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} at: {3}
alertPlaced=placerade:
alertUsed=anv\u00c3\u00a4nde:
autoAfkKickReason=Du har blivit utsparkad f\u00c3\u00b6r att ha varit inaktiv i mer \u00c3\u00a4n {0} minuter.
backAfterDeath=\u00a77Anv\u00c3\u00a4nd /back kommandot f\u00c3\u00b6r att komma tillbaka till din d\u00c3\u00b6dsplats.
backUsageMsg=\u00a77Tar dig tillbaka till din f\u00c3\u00b6reg\u00c3\u00a5ende position.
alertUsed=anv\u00e4nde:
autoAfkKickReason=Du har blivit utsparkad f\u00f6r att ha varit inaktiv i mer \u00e4n {0} minuter.
backAfterDeath=\u00a77Anv\u00e4nd /back kommandot f\u00f6r att komma tillbaka till din d\u00f6dsplats.
backUsageMsg=\u00a77Tar dig tillbaka till din f\u00f6reg\u00e5ende position.
backupDisabled=Ett externt backup-skript har inte blivit konfigurerat.
backupFinished=Backup klar
backupStarted=Backup startad
@ -20,418 +20,418 @@ balance=\u00a77Balans: {0}
balanceTop=\u00a77Topp balans ({0})
banExempt=\u00a7cDu kan inte banna den spelaren.
banIpAddress=\u00a77Bannade IP-adress
bannedIpsFileError=Kunde inte l\u00c3\u00a4sa banned-ips.txt
bannedIpsFileError=Kunde inte l\u00e4sa banned-ips.txt
bannedIpsFileNotFound=banned-ips.txt hittades inte
bannedPlayersFileError=Kunde inte l\u00c3\u00a4sa banned-players.txt
bannedPlayersFileError=Kunde inte l\u00e4sa banned-players.txt
bannedPlayersFileNotFound=banned-players.txt hittades inte
bigTreeFailure=\u00a7cEtt stort tr\u00c3\u00a4d kunde inte genereras misslyckades. F\u00c3\u00b6s\u00c3\u00b6k igen p\u00c3\u00a5 gr\u00c3\u00a4s eller jord.
bigTreeSuccess= \u00a77Stort tr\u00c3\u00a4d genererat.
blockList=Essentials vidarebefordrade f\u00c3\u00b6ljande kommandon till ett annat insticksprogram:
broadcast=[\u00a7cUts\u00c3\u00a4ndning\u00a7f]\u00a7a {0}
buildAlert=\u00a7cDu har inte till\u00c3\u00a5telse att bygga
bukkitFormatChanged=Bukkit versionsformat bytt. Version \u00c3\u00a4r inte kollad.
burnMsg=\u00a77Du satte eld p\u00c3\u00a5 {0} i {1} sekunder.
bigTreeFailure=\u00a7cEtt stort tr\u00e4d kunde inte genereras misslyckades. F\u00f6s\u00f6k igen p\u00e5 gr\u00e4s eller jord.
bigTreeSuccess= \u00a77Stort tr\u00e4d genererat.
blockList=Essentials vidarebefordrade f\u00f6ljande kommandon till ett annat insticksprogram:
broadcast=[\u00a7cUts\u00e4ndning\u00a7f]\u00a7a {0}
buildAlert=\u00a7cDu har inte till\u00e5telse att bygga
bukkitFormatChanged=Bukkit versionsformat bytt. Version \u00e4r inte kollad.
burnMsg=\u00a77Du satte eld p\u00e5 {0} i {1} sekunder.
canTalkAgain=\u00a77Du kan nu prata igen!
cantFindGeoIpDB=Kunde inte hitta GeoIP-databasen!
cantReadGeoIpDB=Kunde inte l\u00c3\u00a4sa inneh\u00c3\u00a5ll fr\u00c3\u00a5n GeoIP-databasen!
cantSpawnItem=\u00a7cDu har inte beh\u00c3\u00b6righet att spawna {0}
cantReadGeoIpDB=Kunde inte l\u00e4sa inneh\u00e5ll fr\u00e5n GeoIP-databasen!
cantSpawnItem=\u00a7cDu har inte beh\u00f6righet att spawna {0}
chatTypeLocal=[L]
chatTypeSpy=[Spy]
commandFailed=Kommando {0} misslyckades:
commandHelpFailedForPlugin=Kunde inte hitta hj\u00c3\u00a4lp f\u00c3\u00b6r: {0}
commandNotLoaded=\u00a7cKommando {0} \u00c3\u00a4r felaktigt laddat.
compassBearing=\u00a77B\u00c3\u00a4ring: {0} ({1} grader).
commandHelpFailedForPlugin=Kunde inte hitta hj\u00e4lp f\u00f6r: {0}
commandNotLoaded=\u00a7cKommando {0} \u00e4r felaktigt laddat.
compassBearing=\u00a77B\u00e4ring: {0} ({1} grader).
configFileMoveError=Kunde inte flytta config.yml till backup-platsen.
configFileRenameError=Kunde inte byta namn p\u00c3\u00a5 temp-filen till config.yml
configFileRenameError=Kunde inte byta namn p\u00e5 temp-filen till config.yml
connectedPlayers=Anslutna spelare:
connectionFailed=Kunde inte \u00c3\u00b6ppna anslutning.
connectionFailed=Kunde inte \u00f6ppna anslutning.
cooldownWithMessage=\u00a7cNedkylning: {0}
corruptNodeInConfig=\u00a74Notice: Din konfigurationsfil har en korrupt {0} nod.
couldNotFindTemplate=Kunde inte hitta mallen {0}
creatingConfigFromTemplate=Skapar konfiguration fr\u00c3\u00a5n mallen: {0}
creatingConfigFromTemplate=Skapar konfiguration fr\u00e5n mallen: {0}
creatingEmptyConfig=Skapar tom konfiguration: {0}
creative=kreativ
currency={0}{1}
currentWorld=Nuvarande v\u00c3\u00a4rld: {0}
currentWorld=Nuvarande v\u00e4rld: {0}
day=dag
days=dagar
defaultBanReason=Banhammaren har talat!
deleteFileError=Kunde inte radera filen: {0}
deleteHome=\u00a77Hemmet {0} har tagits bort.
deleteJail=\u00a77F\u00c3\u00a4ngelset {0} har tagits bort.
deleteJail=\u00a77F\u00e4ngelset {0} har tagits bort.
deleteWarp=\u00a77Warpen {0} har tagits bort.
deniedAccessCommand={0} nekades \u00c3\u00a5tkomst till kommandot.
dependancyDownloaded=[Essentials] Beroende {0} laddades ner framg\u00c3\u00a5ngsrikt.
dependancyException=[Essentials] Ett fel uppstod n\u00c3\u00a4r ett beroende laddades ner.
dependancyNotFound=[Essentials] Ett n\u00c3\u00b6dv\u00c3\u00a4ndigt beroende hittades inte, laddar ner nu.
depth=\u00a77Du \u00c3\u00a4r p\u00c3\u00a5 havsniv\u00c3\u00a5n.
depthAboveSea=\u00a77Du \u00c3\u00a4r {0} block ovanf\u00c3\u00b6r havsni\u00c3\u00a5n.
depthBelowSea=\u00a77Du \u00c3\u00a4r {0} block under havsniv\u00c3\u00a5n.
destinationNotSet=Ingen destination \u00c3\u00a4r inst\u00c3\u00a4lld.
disableUnlimited=\u00a77Inaktiverade o\u00c3\u00a4ndligt placerande av {0} f\u00c3\u00b6r {1}.
deniedAccessCommand={0} nekades \u00e5tkomst till kommandot.
dependancyDownloaded=[Essentials] Beroende {0} laddades ner framg\u00e5ngsrikt.
dependancyException=[Essentials] Ett fel uppstod n\u00e4r ett beroende laddades ner.
dependancyNotFound=[Essentials] Ett n\u00f6dv\u00e4ndigt beroende hittades inte, laddar ner nu.
depth=\u00a77Du \u00e4r p\u00e5 havsniv\u00e5n.
depthAboveSea=\u00a77Du \u00e4r {0} block ovanf\u00f6r havsni\u00e5n.
depthBelowSea=\u00a77Du \u00e4r {0} block under havsniv\u00e5n.
destinationNotSet=Ingen destination \u00e4r inst\u00e4lld.
disableUnlimited=\u00a77Inaktiverade o\u00e4ndligt placerande av {0} f\u00f6r {1}.
disabled=inaktiverad
disabledToSpawnMob=Att spawna fram den h\u00c3\u00a4r moben \u00c3\u00a4r inaktiverat i configurationsfilen.
dontMoveMessage=\u00a77Teleporteringen p\u00c3\u00a5b\u00c3\u00b6rjas om {0}. R\u00c3\u00b6r dig inte.
downloadingGeoIp=Laddar ner GeoIP-databasen... det h\u00c3\u00a4r kan ta en stund (land: 0.6 MB, stad: 20MB)
duplicatedUserdata=Dublicerad anv\u00c3\u00a4ndardata: {0} och {1}
durability=\u00a77Det h\u00c3\u00a4r verktyget har \u00a7c{0}\u00a77 anv\u00c3\u00a4ndningar kvar
enableUnlimited=\u00a77Ger o\u00c3\u00a4ndligt av {0} till {1}.
disabledToSpawnMob=Att spawna fram den h\u00e4r moben \u00e4r inaktiverat i configurationsfilen.
dontMoveMessage=\u00a77Teleporteringen p\u00e5b\u00f6rjas om {0}. R\u00f6r dig inte.
downloadingGeoIp=Laddar ner GeoIP-databasen... det h\u00e4r kan ta en stund (land: 0.6 MB, stad: 20MB)
duplicatedUserdata=Dublicerad anv\u00e4ndardata: {0} och {1}
durability=\u00a77Det h\u00e4r verktyget har \u00a7c{0}\u00a77 anv\u00e4ndningar kvar
enableUnlimited=\u00a77Ger o\u00e4ndligt av {0} till {1}.
enabled=aktiverad
enchantmentApplied = \u00a77F\u00c3\u00b6rtrollningen {0} har blivit till\u00c3\u00a4mpad p\u00c3\u00a5 saken du har i handen.
enchantmentNotFound = \u00a7cF\u00c3\u00b6rtrollningen hittades inte
enchantmentPerm = \u00a7cDu har inte beh\u00c3\u00b6righet att {0}
enchantmentRemoved = \u00a77F\u00c3\u00b6rtrollningen {0} har tagits bort fr\u00c3\u00a5n saken i din hand.
enchantments = \u00a77F\u00c3\u00b6rtrollningar: {0}
enchantmentApplied = \u00a77F\u00f6rtrollningen {0} har blivit till\u00e4mpad p\u00e5 saken du har i handen.
enchantmentNotFound = \u00a7cF\u00f6rtrollningen hittades inte
enchantmentPerm = \u00a7cDu har inte beh\u00f6righet att {0}
enchantmentRemoved = \u00a77F\u00f6rtrollningen {0} har tagits bort fr\u00e5n saken i din hand.
enchantments = \u00a77F\u00f6rtrollningar: {0}
errorCallingCommand=Kunde inte kontakta kommandot /{0}
errorWithMessage=\u00a7cFel: {0}
essentialsHelp1=Filen \u00c3\u00a4r trasig och Essentials kan inte \u00c3\u00b6ppna den. Essentials \u00c3\u00a4r nu inaktiverat. Om du inte kan fixa problemet sj\u00c3\u00a4lv, g\u00c3\u00a5 till http://tiny.cc/EssentialsChat
essentialsHelp2=Filen \u00c3\u00a4r trasig och Essentials kan inte \u00c3\u00b6ppna den. Essentials \u00c3\u00a4r nu inaktiverat. Om du inte kan fixa problemet sj\u00c3\u00a4lv, skriv /essentialshelp i spelet eller g\u00c3\u00a5 till http://tiny.cc/EssentialsChat
essentialsHelp1=Filen \u00e4r trasig och Essentials kan inte \u00f6ppna den. Essentials \u00e4r nu inaktiverat. Om du inte kan fixa problemet sj\u00e4lv, g\u00e5 till http://tiny.cc/EssentialsChat
essentialsHelp2=Filen \u00e4r trasig och Essentials kan inte \u00f6ppna den. Essentials \u00e4r nu inaktiverat. Om du inte kan fixa problemet sj\u00e4lv, skriv /essentialshelp i spelet eller g\u00e5 till http://tiny.cc/EssentialsChat
essentialsReload=\u00a77Essentials Omladdat {0}
exp=\u00a7c{0} \u00a77har\u00a7c {1} \u00a77exp (level\u00a7c {2}\u00a77) och beh\u00c3\u00b6ver\u00a7c {3} \u00a77mer erfarenhet f\u00c3\u00b6r att g\u00c3\u00a5 upp en niv\u00c3\u00a5.
exp=\u00a7c{0} \u00a77har\u00a7c {1} \u00a77exp (level\u00a7c {2}\u00a77) och beh\u00f6ver\u00a7c {3} \u00a77mer erfarenhet f\u00f6r att g\u00e5 upp en niv\u00e5.
expSet=\u00a7c{0} \u00a77har nu\u00a7c {1} \u00a77erfarenhet.
extinguish=\u00a77Du sl\u00c3\u00a4ckte dig sj\u00c3\u00a4lv.
extinguishOthers=\u00a77Du sl\u00c3\u00a4ckte {0}.
failedToCloseConfig=Kunde inte st\u00c3\u00a4nga konfiguration {0}
extinguish=\u00a77Du sl\u00e4ckte dig sj\u00e4lv.
extinguishOthers=\u00a77Du sl\u00e4ckte {0}.
failedToCloseConfig=Kunde inte st\u00e4nga konfiguration {0}
failedToCreateConfig=Kunde inte skapa konfiguration {0}
failedToWriteConfig=Kunde inte skriva konfiguration {0}
false=falskt
feed=\u00a77Din hunger \u00c3\u00a4r m\u00c3\u00a4ttad.
feed=\u00a77Din hunger \u00e4r m\u00e4ttad.
feedOther=\u00a77Matade {0}.
fileRenameError=Namnbytet av filen {0} misslyckades
flyMode=\u00a77Aktiverade flygl\u00c3\u00a4ge {0} f\u00c3\u00b6r {1}.
flyMode=\u00a77Aktiverade flygl\u00e4ge {0} f\u00f6r {1}.
foreverAlone=\u00a7cDu har ingen att svara.
freedMemory=Befriade {0} MB.
gameMode=\u00a77Satte {0}s spell\u00c3\u00a4ge till {1}.
gameMode=\u00a77Satte {0}s spell\u00e4ge till {1}.
gcchunks= bitar,
gcentities= enheter
gcfree=Ledigt minne: {0} MB
gcmax=Maximalt minne: {0} MB
gctotal=Tilldelat minne: {0} MB
geoIpUrlEmpty=Nerladdningsadressen f\u00c3\u00b6r GeoIP \u00c3\u00a4r tom.
geoIpUrlInvalid=Nerladdningsadressen f\u00c3\u00b6r GeoIP \u00c3\u00a4r ogiltig.
geoipJoinFormat=Spelaren {0} kommer fr\u00c3\u00a5n {1}
godDisabledFor=inaktiverat f\u00c3\u00b6r {0}
godEnabledFor=aktiverat f\u00c3\u00b6r {0}
godMode=\u00a77Od\u00c3\u00b6dlighet {0}.
hatArmor=\u00a7cFel, du kan inte anv\u00c3\u00a4nda den h\u00c3\u00a4r saken som en hatt!
hatFail=\u00a7cDu m\u00c3\u00a5ste ha n\u00c3\u00a5gonting att b\u00c3\u00a4ra i din hand.
geoIpUrlEmpty=Nerladdningsadressen f\u00f6r GeoIP \u00e4r tom.
geoIpUrlInvalid=Nerladdningsadressen f\u00f6r GeoIP \u00e4r ogiltig.
geoipJoinFormat=Spelaren {0} kommer fr\u00e5n {1}
godDisabledFor=inaktiverat f\u00f6r {0}
godEnabledFor=aktiverat f\u00f6r {0}
godMode=\u00a77Od\u00f6dlighet {0}.
hatArmor=\u00a7cFel, du kan inte anv\u00e4nda den h\u00e4r saken som en hatt!
hatFail=\u00a7cDu m\u00e5ste ha n\u00e5gonting att b\u00e4ra i din hand.
hatPlaced=\u00a7eNjut av din nya hatt!
haveBeenReleased=\u00a77Du har blivit friad
heal=\u00a77Du har blivit l\u00c3\u00a4kt.
healOther=\u00a77L\u00c3\u00a4kte {0}.
helpConsole=F\u00c3\u00b6r att visa hj\u00c3\u00a4lp fr\u00c3\u00a5n konsolen, skriv ?.
helpFrom=\u00a77Kommandon fr\u00c3\u00a5n {0}:
heal=\u00a77Du har blivit l\u00e4kt.
healOther=\u00a77L\u00e4kte {0}.
helpConsole=F\u00f6r att visa hj\u00e4lp fr\u00e5n konsolen, skriv ?.
helpFrom=\u00a77Kommandon fr\u00e5n {0}:
helpLine=\u00a76/{0}\u00a7f: {1}
helpMatching=\u00a77Kommandon matchar "{0}":
helpOp=\u00a7c[OpHj\u00c3\u00a4lp]\u00a7f \u00a77{0}:\u00a7f {1}
helpOp=\u00a7c[OpHj\u00e4lp]\u00a7f \u00a77{0}:\u00a7f {1}
helpPages=Sida \u00a7c{0}\u00a7f av \u00a7c{1}\u00a7f:
helpPlugin=\u00a74{0}\u00a7f: Hj\u00c3\u00a4lp f\u00c3\u00b6r insticksprogram: /help {1}
holeInFloor=H\u00c3\u00a5l i golvet
homeSet=\u00a77Hem inst\u00c3\u00a4llt.
homeSetToBed=\u00a77Ditt hem \u00c3\u00a4r nu inst\u00c3\u00a4llt till den h\u00c3\u00a4r s\u00c3\u00a4ngen.
helpPlugin=\u00a74{0}\u00a7f: Hj\u00e4lp f\u00f6r insticksprogram: /help {1}
holeInFloor=H\u00e5l i golvet
homeSet=\u00a77Hem inst\u00e4llt.
homeSetToBed=\u00a77Ditt hem \u00e4r nu inst\u00e4llt till den h\u00e4r s\u00e4ngen.
homes=Hem: {0}
hour=timme
hours=timmar
ignorePlayer=Du ignorerar spelaren {0} fr\u00c3\u00a5n och med nu.
ignorePlayer=Du ignorerar spelaren {0} fr\u00e5n och med nu.
illegalDate=Felaktigt datumformat.
infoChapter=V\u00c3\u00a4lj kapitel:
infoChapter=V\u00e4lj kapitel:
infoChapterPages=Kapitel {0}, sida \u00a7c{1}\u00a7f av \u00a7c{2}\u00a7f:
infoFileDoesNotExist=Filen info.txt finns inte. Skapar en f\u00c3\u00b6r dig.
infoFileDoesNotExist=Filen info.txt finns inte. Skapar en f\u00f6r dig.
infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Sida \u00a74{0}\u00a76/\u00a74{1} \u00a7e----
infoUnknownChapter=Ok\u00c3\u00a4nt kapitel.
invBigger=De andra anv\u00c3\u00a4ndarnas f\u00c3\u00b6rr\u00c3\u00a5d \u00c3\u00a4r st\u00c3\u00b6rre \u00c3\u00a4n ditt.
invRestored=Ditt f\u00c3\u00b6rr\u00c3\u00a5d har blivit \u00c3\u00a5terst\u00c3\u00a4llt.
invSee=Du ser nu {0}s f\u00c3\u00b6rr\u00c3\u00a5d.
invSeeHelp=Anv\u00c3\u00a4nd /invsee f\u00c3\u00b6r att \u00c3\u00a5terst\u00c3\u00a4lla ditt f\u00c3\u00b6rr\u00c3\u00a5d.
infoUnknownChapter=Ok\u00e4nt kapitel.
invBigger=De andra anv\u00e4ndarnas f\u00f6rr\u00e5d \u00e4r st\u00f6rre \u00e4n ditt.
invRestored=Ditt f\u00f6rr\u00e5d har blivit \u00e5terst\u00e4llt.
invSee=Du ser nu {0}s f\u00f6rr\u00e5d.
invSeeHelp=Anv\u00e4nd /invsee f\u00f6r att \u00e5terst\u00e4lla ditt f\u00f6rr\u00e5d.
invalidCharge=\u00a7cOgiltig laddning.
invalidHome=Hemmet {0} finns inte
invalidMob=Ogiltig monster-typ.
invalidServer=Ogiltig server!
invalidSignLine=Rad {0} p\u00c3\u00a5 skylten \u00c3\u00a4r ogiltig.
invalidWorld=\u00a7cOgiltig v\u00c3\u00a4rld.
inventoryCleared=\u00a77F\u00c3\u00b6rr\u00c3\u00a5d rensat.
inventoryClearedOthers=\u00a77F\u00c3\u00b6rr\u00c3\u00a5det av \u00a7c{0}\u00a77 \u00c3\u00a4r rensat.
is=\u00c3\u00a4r
itemCannotBeSold=Det objektet kan inte s\u00c3\u00a4ljas till servern.
itemMustBeStacked=Objektet m\u00c3\u00a5ste k\u00c3\u00b6pas i staplar. En m\u00c3\u00a4ngd av 2s kommer bli 2 staplar, etc.
itemNotEnough1=\u00a7cDu har inte tillr\u00c3\u00a4ckligt av den saken f\u00c3\u00b6r att s\u00c3\u00a4lja.
itemNotEnough2=\u00a77Om du ville s\u00c3\u00a4lja alla block av den typen, anv\u00c3\u00a4nd /sell blocknamn
itemNotEnough3=\u00a77/sell blocknamn -1 kommer att s\u00c3\u00a4lja allt av den blocktypen f\u00c3\u00b6rutom 1 o.s.v.
itemSellAir=F\u00c3\u00b6rs\u00c3\u00b6kte du att s\u00c3\u00a4lja luft? S\u00c3\u00a4tt en sak i din hand.
itemSold=\u00a77S\u00c3\u00a5lde f\u00c3\u00b6r \u00a7c{0} \u00a77({1} {2} f\u00c3\u00b6r {3} styck)
itemSoldConsole={0} s\u00c3\u00a5lde {1} f\u00c3\u00b6r \u00a77{2} \u00a77({3} saker f\u00c3\u00b6r {4} styck)
invalidSignLine=Rad {0} p\u00e5 skylten \u00e4r ogiltig.
invalidWorld=\u00a7cOgiltig v\u00e4rld.
inventoryCleared=\u00a77F\u00f6rr\u00e5d rensat.
inventoryClearedOthers=\u00a77F\u00f6rr\u00e5det av \u00a7c{0}\u00a77 \u00e4r rensat.
is=\u00e4r
itemCannotBeSold=Det objektet kan inte s\u00e4ljas till servern.
itemMustBeStacked=Objektet m\u00e5ste k\u00f6pas i staplar. En m\u00e4ngd av 2s kommer bli 2 staplar, etc.
itemNotEnough1=\u00a7cDu har inte tillr\u00e4ckligt av den saken f\u00f6r att s\u00e4lja.
itemNotEnough2=\u00a77Om du ville s\u00e4lja alla block av den typen, anv\u00e4nd /sell blocknamn
itemNotEnough3=\u00a77/sell blocknamn -1 kommer att s\u00e4lja allt av den blocktypen f\u00f6rutom 1 o.s.v.
itemSellAir=F\u00f6rs\u00f6kte du att s\u00e4lja luft? S\u00e4tt en sak i din hand.
itemSold=\u00a77S\u00e5lde f\u00f6r \u00a7c{0} \u00a77({1} {2} f\u00f6r {3} styck)
itemSoldConsole={0} s\u00e5lde {1} f\u00f6r \u00a77{2} \u00a77({3} saker f\u00f6r {4} styck)
itemSpawn=\u00a77Ger {0} stycken {1}
itemsCsvNotLoaded=Kunde inte ladda items.csv.
jailAlreadyIncarcerated=\u00a7cPersonen \u00c3\u00a4r redan i f\u00c3\u00a4ngelse: {0}
jailMessage=\u00a7cBryter du mot reglerna, f\u00c3\u00a5r du st\u00c3\u00a5 ditt kast.
jailNotExist=Det f\u00c3\u00a4ngelset finns inte.
jailReleased=\u00a77Spelaren \u00a7e{0}\u00a77 \u00c3\u00a4r frisl\u00c3\u00a4ppt.
jailReleasedPlayerNotify=\u00a77Du har blivit frisl\u00c3\u00a4ppt!
jailSentenceExtended=F\u00c3\u00a4ngelsestraffet f\u00c3\u00b6rl\u00c3\u00a4ngt till: {0)
jailSet=\u00a77F\u00c3\u00a4ngelset {0} har skapats
jumpError=Det skulle skadat din dators hj\u00c3\u00a4rna.
kickDefault=Utsparkad fr\u00c3\u00a5n server
jailAlreadyIncarcerated=\u00a7cPersonen \u00e4r redan i f\u00e4ngelse: {0}
jailMessage=\u00a7cBryter du mot reglerna, f\u00e5r du st\u00e5 ditt kast.
jailNotExist=Det f\u00e4ngelset finns inte.
jailReleased=\u00a77Spelaren \u00a7e{0}\u00a77 \u00e4r frisl\u00e4ppt.
jailReleasedPlayerNotify=\u00a77Du har blivit frisl\u00e4ppt!
jailSentenceExtended=F\u00e4ngelsestraffet f\u00f6rl\u00e4ngt till: {0)
jailSet=\u00a77F\u00e4ngelset {0} har skapats
jumpError=Det skulle skadat din dators hj\u00e4rna.
kickDefault=Utsparkad fr\u00e5n server
kickExempt=\u00a7cDu kan inte sparka ut den spelaren.
kickedAll=\u00a7cSparkade ut alla spelare fr\u00c3\u00a5n servern
kill=\u00a77D\u00c3\u00b6dade {0}.
kickedAll=\u00a7cSparkade ut alla spelare fr\u00e5n servern
kill=\u00a77D\u00f6dade {0}.
kitError2=\u00a7cDet kit:et finns inte eller har blivit felaktigt definierat.
kitError=\u00a7cDet finns inga giltiga kit.
kitErrorHelp=\u00a7cKanske en sak fattar m\u00c3\u00a4ngd i konfigurationen?
kitErrorHelp=\u00a7cKanske en sak fattar m\u00e4ngd i konfigurationen?
kitGive=\u00a77Ger kit {0}.
kitInvFull=\u00a7cDitt F\u00c3\u00b6rr\u00c3\u00a5d var fullt, placerar kit p\u00c3\u00a5 golvet
kitTimed=\u00a7cDu kan inte anv\u00c3\u00a4nda det kit:et igen p\u00c3\u00a5 {0}.
kitInvFull=\u00a7cDitt F\u00f6rr\u00e5d var fullt, placerar kit p\u00e5 golvet
kitTimed=\u00a7cDu kan inte anv\u00e4nda det kit:et igen p\u00e5 {0}.
kits=\u00a77Kit: {0}
lightningSmited=\u00a77Blixten har slagit ner p\u00c3\u00a5 dig
lightningUse=\u00a77En blixt kommer sl\u00c3\u00a5 ner p\u00c3\u00a5 {0}
lightningSmited=\u00a77Blixten har slagit ner p\u00e5 dig
lightningUse=\u00a77En blixt kommer sl\u00e5 ner p\u00e5 {0}
listAfkTag = \u00a77[AFK]\u00a7f
listAmount = \u00a79Det \u00c3\u00a4r \u00a7c{0}\u00a79 av maximalt \u00a7c{1}\u00a79 spelare online.
listAmountHidden = \u00a79Det \u00c3\u00a4r \u00a7c{0}\u00a77/{1}\u00a79 Av maximalt \u00a7c{2}\u00a79 spelare online.
listAmount = \u00a79Det \u00e4r \u00a7c{0}\u00a79 av maximalt \u00a7c{1}\u00a79 spelare online.
listAmountHidden = \u00a79Det \u00e4r \u00a7c{0}\u00a77/{1}\u00a79 Av maximalt \u00a7c{2}\u00a79 spelare online.
listGroupTag={0}\u00a7f:
listHiddenTag = \u00a77[G\u00c3\u0096MD]\u00a7f
listHiddenTag = \u00a77[G\u00d6MD]\u00a7f
loadWarpError=Kunde inte ladda warp {0}
localFormat=Lokal: <{0}> {1}
mailClear=\u00a7cF\u00c3\u00b6r att markera dina meddelanden som l\u00c3\u00a4sta, skriv /mail clear
mailClear=\u00a7cF\u00f6r att markera dina meddelanden som l\u00e4sta, skriv /mail clear
mailCleared=\u00a77Meddelanden rensade!
mailSent=\u00a77Meddelandet skickad!
markMailAsRead=\u00a7cF\u00c3\u00b6r att markera dina meddelanden som l\u00c3\u00a4sta, skriv /mail clear
markedAsAway=\u00a77Du \u00c3\u00a4r nu markerad som borta.
markedAsNotAway=\u00a77Du \u00c3\u00a4r inte l\u00c3\u00a4ngre markerad som borta.
maxHomes=Du kan inte ha fler \u00c3\u00a4n {0} hem.
mayNotJail=\u00a7cDu f\u00c3\u00a5r inte s\u00c3\u00a4tta den personen i f\u00c3\u00a4ngelse
markMailAsRead=\u00a7cF\u00f6r att markera dina meddelanden som l\u00e4sta, skriv /mail clear
markedAsAway=\u00a77Du \u00e4r nu markerad som borta.
markedAsNotAway=\u00a77Du \u00e4r inte l\u00e4ngre markerad som borta.
maxHomes=Du kan inte ha fler \u00e4n {0} hem.
mayNotJail=\u00a7cDu f\u00e5r inte s\u00e4tta den personen i f\u00e4ngelse
me=jag
minute=minut
minutes=minuter
missingItems=Du har inte {0}x {1}.
missingPrefixSuffix=Saknar ett prefix eller suffix f\u00c3\u00b6r {0}
mobSpawnError=Fel n\u00c3\u00a4r mob-spawnaren f\u00c3\u00b6rs\u00c3\u00b6kte att \u00c3\u00a4ndras.
mobSpawnLimit=M\u00c3\u00a4ngden mobs begr\u00c3\u00a4nsad till serverns maxgr\u00c3\u00a4ns
mobSpawnTarget=M\u00c3\u00a5lblocket m\u00c3\u00a5ste vara en mob-spawnare.
missingPrefixSuffix=Saknar ett prefix eller suffix f\u00f6r {0}
mobSpawnError=Fel n\u00e4r mob-spawnaren f\u00f6rs\u00f6kte att \u00e4ndras.
mobSpawnLimit=M\u00e4ngden mobs begr\u00e4nsad till serverns maxgr\u00e4ns
mobSpawnTarget=M\u00e5lblocket m\u00e5ste vara en mob-spawnare.
mobsAvailable=\u00a77Mobs: {0}
moneyRecievedFrom=\u00a7a{0} har tagits emot fr\u00c3\u00a5n {1}
moneyRecievedFrom=\u00a7a{0} har tagits emot fr\u00e5n {1}
moneySentTo=\u00a7a{0} har skickats till {1}
moneyTaken={0} \u00c3\u00a4r taget fr\u00c3\u00a5n ditt bankkonto.
month=m\u00c3\u00a5nad
months=m\u00c3\u00a5nader
moreThanZero=M\u00c3\u00a5ngden m\u00c3\u00a5ste vara st\u00c3\u00b6rre \u00c3\u00a4n 0.
moneyTaken={0} \u00e4r taget fr\u00e5n ditt bankkonto.
month=m\u00e5nad
months=m\u00e5nader
moreThanZero=M\u00e5ngden m\u00e5ste vara st\u00f6rre \u00e4n 0.
msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2}
muteExempt=\u00a7cDu kan inte tysta den spelaren.
mutedPlayer=Spelaren {0} \u00c3\u00a4r tystad.
mutedPlayerFor=Spelaren {0} \u00c3\u00a4r tystad i {1}.
mutedUserSpeaks={0} f\u00c3\u00b6rs\u00c3\u00b6kte att prata, men blev tystad.
nearbyPlayers=Spelare i n\u00c3\u00a4rheten: {0}
negativeBalanceError=Anv\u00c3\u00a4ndaren \u00c3\u00a4r inte till\u00c3\u00a5ten att ha en negativ balans.
nickChanged=Smeknamn \u00c3\u00a4ndrat.
nickDisplayName=\u00a77Du m\u00c3\u00a5ste aktivera change-displayname i Essentials-konfigurationen.
nickInUse=\u00a7cDet namnet anv\u00c3\u00a4nds redan.
nickNamesAlpha=\u00a7cSmeknamn m\u00c3\u00a5ste vara alfanumeriska.
nickNoMore=\u00a77Du har inte ett smeknamn l\u00c3\u00a4ngre
nickOthersPermission=\u00a7cDu har inte tillst\u00c3\u00a5nd att \u00c3\u00a4ndra andras smeknamn
nickSet=\u00a77Ditt smeknamn \u00c3\u00a4r nu \u00a7c{0}
noAccessCommand=\u00a7cDu har inte tillg\u00c3\u00a5ng till det kommandot.
noAccessPermission=\u00a7cDu har inte tillst\u00c3\u00a5nd till att komma \u00c3\u00a5t det {0}.
noBreakBedrock=Du har inte till\u00c3\u00a5telse att f\u00c3\u00b6rst\u00c3\u00b6ra berggrund.
noDestroyPermission=\u00a7Du har inte till\u00c3\u00a5telse att f\u00c3\u00b6rst\u00c3\u00b6ra det {0}.
noDurability=\u00a7cDen saken har inte en h\u00c3\u00a5llbarhet.
noGodWorldWarning=\u00a7cVarning! Od\u00c3\u00b6dlighet i den h\u00c3\u00a4r v\u00c3\u00a4rlden \u00c3\u00a4r inaktiverat.
mutedPlayer=Spelaren {0} \u00e4r tystad.
mutedPlayerFor=Spelaren {0} \u00e4r tystad i {1}.
mutedUserSpeaks={0} f\u00f6rs\u00f6kte att prata, men blev tystad.
nearbyPlayers=Spelare i n\u00e4rheten: {0}
negativeBalanceError=Anv\u00e4ndaren \u00e4r inte till\u00e5ten att ha en negativ balans.
nickChanged=Smeknamn \u00e4ndrat.
nickDisplayName=\u00a77Du m\u00e5ste aktivera change-displayname i Essentials-konfigurationen.
nickInUse=\u00a7cDet namnet anv\u00e4nds redan.
nickNamesAlpha=\u00a7cSmeknamn m\u00e5ste vara alfanumeriska.
nickNoMore=\u00a77Du har inte ett smeknamn l\u00e4ngre
nickOthersPermission=\u00a7cDu har inte tillst\u00e5nd att \u00e4ndra andras smeknamn
nickSet=\u00a77Ditt smeknamn \u00e4r nu \u00a7c{0}
noAccessCommand=\u00a7cDu har inte tillg\u00e5ng till det kommandot.
noAccessPermission=\u00a7cDu har inte tillst\u00e5nd till att komma \u00e5t det {0}.
noBreakBedrock=Du har inte till\u00e5telse att f\u00f6rst\u00f6ra berggrund.
noDestroyPermission=\u00a7Du har inte till\u00e5telse att f\u00f6rst\u00f6ra det {0}.
noDurability=\u00a7cDen saken har inte en h\u00e5llbarhet.
noGodWorldWarning=\u00a7cVarning! Od\u00f6dlighet i den h\u00e4r v\u00e4rlden \u00e4r inaktiverat.
noHelpFound=\u00a7cInga matchande kommandon.
noHomeSet=Du har inte angett ett hem.
noHomeSetPlayer=Den h\u00c3\u00a4r spelaren har inte ett hem.
noKitPermission=\u00a7cDu beh\u00c3\u00b6ver \u00a7c{0}\u00a7c tillst\u00c3\u00a5nd f\u00c3\u00b6r att anv\u00c3\u00a4nda det kitet.
noKits=\u00a77Det finns inga kits tillg\u00c3\u00a4ngliga \u00c3\u00a4n
noHomeSetPlayer=Den h\u00e4r spelaren har inte ett hem.
noKitPermission=\u00a7cDu beh\u00f6ver \u00a7c{0}\u00a7c tillst\u00e5nd f\u00f6r att anv\u00e4nda det kitet.
noKits=\u00a77Det finns inga kits tillg\u00e4ngliga \u00e4n
noMail=Du har inget meddelande
noMotd=\u00a7cDet finns inget meddelande f\u00c3\u00b6r dagen.
noMotd=\u00a7cDet finns inget meddelande f\u00f6r dagen.
noNewMail=\u00a77Du har inget nytt meddelande.
noPendingRequest=Du har inga v\u00c3\u00a4ntande f\u00c3\u00b6rfr\u00c3\u00a5gan.
noPerm=\u00a7cDu har inte \u00a7f{0}\u00a7c till\u00c3\u00a5telse.
noPermToSpawnMob=\u00a7cDu har inte till\u00c3\u00a5telse att spawna den h\u00c3\u00a4r moben.
noPlacePermission=\u00a7cDu har inte till\u00c3\u00a5telse att placera ett block n\u00c3\u00a4ra den skylten.
noPendingRequest=Du har inga v\u00e4ntande f\u00f6rfr\u00e5gan.
noPerm=\u00a7cDu har inte \u00a7f{0}\u00a7c till\u00e5telse.
noPermToSpawnMob=\u00a7cDu har inte till\u00e5telse att spawna den h\u00e4r moben.
noPlacePermission=\u00a7cDu har inte till\u00e5telse att placera ett block n\u00e4ra den skylten.
noPowerTools=Du har inga power-tools tilldelade.
noRules=\u00a7cDet finns inga specifierade regler \u00c3\u00a4n.
noWarpsDefined=Inga warpar \u00c3\u00a4r definerade
noRules=\u00a7cDet finns inga specifierade regler \u00e4n.
noWarpsDefined=Inga warpar \u00e4r definerade
none=inga
notAllowedToQuestion=\u00a7cDu har inte tillst\u00c3\u00a5nd att anv\u00c3\u00a4nda den fr\u00c3\u00a5gan.
notAllowedToShout=\u00a7cDu har inte tillst\u00c3\u00a5nd att ropa.
notAllowedToQuestion=\u00a7cDu har inte tillst\u00e5nd att anv\u00e4nda den fr\u00e5gan.
notAllowedToShout=\u00a7cDu har inte tillst\u00e5nd att ropa.
notEnoughExperience=Du har inte nog med erfarenhet.
notEnoughMoney=Du har inte tillr\u00c3\u00a4ckligt med pengar.
notRecommendedBukkit= * ! * Bukkit-versionen \u00c3\u00a4r inte rekommenderad f\u00c3\u00b6r den h\u00c3\u00a4r versionen av Essentials.
notSupportedYet=St\u00c3\u00b6ds inte \u00c3\u00a4n.
notEnoughMoney=Du har inte tillr\u00e4ckligt med pengar.
notRecommendedBukkit= * ! * Bukkit-versionen \u00e4r inte rekommenderad f\u00f6r den h\u00e4r versionen av Essentials.
notSupportedYet=St\u00f6ds inte \u00e4n.
nothingInHand = \u00a7cDu har inget i din hand.
now=nu
nuke=L\u00c3\u00a5t d\u00c3\u00b6d regna \u00c3\u00b6ver dem
numberRequired=Det ska vara ett nummer d\u00c3\u00a4r, dumbom.
onlyDayNight=/time st\u00c3\u00b6der bara day(dag) eller night(natt).
onlyPlayers=Bara spelare som \u00c3\u00a4r online kan anv\u00c3\u00a4nda {0}.
onlySunStorm=/weather st\u00c3\u00b6der bara sun(sol) eller storm(storm).
orderBalances=Best\u00c3\u00a4ller balanser av {0} anv\u00c3\u00a4ndare, v\u00c3\u00a4nligen v\u00c3\u00a4nta...
pTimeCurrent=\u00a7e{0}'*s\u00a7f klockan \u00c3\u00a4r {1}.
pTimeCurrentFixed=\u00a7e{0}''s\u00a7f tiden \u00c3\u00a4r fixerad till {1}.
pTimeNormal=\u00a7e{0}''s\u00a7f tiden \u00c3\u00a4r normal och matchar servern.
pTimeOthersPermission=\u00a7cDu har inte beh\u00c3\u00b6righet att st\u00c3\u00a4lla in andra spelares tid.
nuke=L\u00e5t d\u00f6d regna \u00f6ver dem
numberRequired=Det ska vara ett nummer d\u00e4r, dumbom.
onlyDayNight=/time st\u00f6der bara day(dag) eller night(natt).
onlyPlayers=Bara spelare som \u00e4r online kan anv\u00e4nda {0}.
onlySunStorm=/weather st\u00f6der bara sun(sol) eller storm(storm).
orderBalances=Best\u00e4ller balanser av {0} anv\u00e4ndare, v\u00e4nligen v\u00e4nta...
pTimeCurrent=\u00a7e{0}'*s\u00a7f klockan \u00e4r {1}.
pTimeCurrentFixed=\u00a7e{0}''s\u00a7f tiden \u00e4r fixerad till {1}.
pTimeNormal=\u00a7e{0}''s\u00a7f tiden \u00e4r normal och matchar servern.
pTimeOthersPermission=\u00a7cDu har inte beh\u00f6righet att st\u00e4lla in andra spelares tid.
pTimePlayers=Dessa spelare har sin egen tid:
pTimeReset=Spelarens tid har blivit \u00c3\u00a5terst\u00c3\u00a4lld till: \u00a7e{0}
pTimeSet=Spelarens tid \u00c3\u00a4r inst\u00c3\u00a4lld till \u00a73{0}\u00a7f till: \u00a7e{1}
pTimeSetFixed=Spelarens tid \u00c3\u00a4r fixerad till \u00a73{0}\u00a7f f\u00c3\u00b6r: \u00a7e{1}
parseError=Fel vid tolkning av {0} p\u00c3\u00a5 rad {1}
pendingTeleportCancelled=\u00a7cAvvaktande teleporteringsbeg\u00c3\u00a4ran \u00c3\u00a4r avbruten.
pTimeReset=Spelarens tid har blivit \u00e5terst\u00e4lld till: \u00a7e{0}
pTimeSet=Spelarens tid \u00e4r inst\u00e4lld till \u00a73{0}\u00a7f till: \u00a7e{1}
pTimeSetFixed=Spelarens tid \u00e4r fixerad till \u00a73{0}\u00a7f f\u00f6r: \u00a7e{1}
parseError=Fel vid tolkning av {0} p\u00e5 rad {1}
pendingTeleportCancelled=\u00a7cAvvaktande teleporteringsbeg\u00e4ran \u00e4r avbruten.
permissionsError=Saknar Permissions/GroupManager; chattens prefixer/suffixer kommer vara inaktiverade.
playerBanned=\u00a7cSpelaren {0} bannad {1} f\u00c3\u00b6r {2}
playerInJail=\u00a7cSpelaren \u00c3\u00a4r redan i f\u00c3\u00a4ngelse {0}.
playerJailed=\u00a77Spelaren {0} f\u00c3\u00a4ngslad.
playerJailedFor= \u00a77Spelaren {0} f\u00c3\u00a4ngslad f\u00c3\u00b6r {1}.
playerKicked=\u00a7cSpelaren {0} har sparkat ut {1} f\u00c3\u00b6r {2}
playerBanned=\u00a7cSpelaren {0} bannad {1} f\u00f6r {2}
playerInJail=\u00a7cSpelaren \u00e4r redan i f\u00e4ngelse {0}.
playerJailed=\u00a77Spelaren {0} f\u00e4ngslad.
playerJailedFor= \u00a77Spelaren {0} f\u00e4ngslad f\u00f6r {1}.
playerKicked=\u00a7cSpelaren {0} har sparkat ut {1} f\u00f6r {2}
playerMuted=\u00a77Du har blivit tystad
playerMutedFor=\u00a77Du har blivit tystad f\u00c3\u00b6r {0}
playerNeverOnServer=\u00a7cSpelaren {0} har aldrig varit p\u00c3\u00a5 den h\u00c3\u00a4r servern.
playerMutedFor=\u00a77Du har blivit tystad f\u00f6r {0}
playerNeverOnServer=\u00a7cSpelaren {0} har aldrig varit p\u00e5 den h\u00e4r servern.
playerNotFound=\u00a7cSpelaren hittades inte.
playerUnmuted=\u00a77Du kan nu prata
pong=Pong!
possibleWorlds=\u00a77M\u00c3\u00b6jliga v\u00c3\u00a4rdar \u00c3\u00a4r nummer mellan 0 och {0}.
possibleWorlds=\u00a77M\u00f6jliga v\u00e4rdar \u00e4r nummer mellan 0 och {0}.
powerToolAir=Kommandot kan inte tilldelas luft.
powerToolAlreadySet=Kommandot \u00a7c{0}\u00a7f \u00c3\u00a4r redan tilldelat {1}.
powerToolAlreadySet=Kommandot \u00a7c{0}\u00a7f \u00e4r redan tilldelat {1}.
powerToolAttach=\u00a7c{0}\u00a7f kommandot tilldelat {1}.
powerToolClearAll=Alla powertool-kommandon har blivit rensade.
powerToolList={1} har f\u00c3\u00b6ljane kommandon: \u00a7c{0}\u00a7f.
powerToolList={1} har f\u00f6ljane kommandon: \u00a7c{0}\u00a7f.
powerToolListEmpty={0} har inga kommandon tilldelade.
powerToolNoSuchCommandAssigned=Kommandot \u00a7c{0}\u00a7f har inte blivit tilldelat {1}.
powerToolRemove=Kommandot \u00a7c{0}\u00a7f \u00c3\u00a4r borttaget fr\u00c3\u00a5n {1}.
powerToolRemoveAll=Alla kommandon \u00c3\u00a4r borttagna fr\u00c3\u00a5n {0}.
powerToolRemove=Kommandot \u00a7c{0}\u00a7f \u00e4r borttaget fr\u00e5n {1}.
powerToolRemoveAll=Alla kommandon \u00e4r borttagna fr\u00e5n {0}.
powerToolsDisabled=Alla dina powertools har blivit inaktiverade.
powerToolsEnabled=Alla dina powertools har blivit aktiverade.
protectionOwner=\u00a76[EssentialsProtect] Skydds\u00c3\u00a4gare: {0}
questionFormat=\u00a77[Fr\u00c3\u00a5ga]\u00a7f {0}
readNextPage=Skriv /{0} {1} f\u00c3\u00b6r att l\u00c3\u00a4sa n\u00c3\u00a4sta sida
protectionOwner=\u00a76[EssentialsProtect] Skydds\u00e4gare: {0}
questionFormat=\u00a77[Fr\u00e5ga]\u00a7f {0}
readNextPage=Skriv /{0} {1} f\u00f6r att l\u00e4sa n\u00e4sta sida
reloadAllPlugins=\u00a77Laddade om alla insticksprogram.
removed=\u00a77Tog bort {0} enheter.
repair=Du har reparerat din: \u00a7e{0}.
repairAlreadyFixed=\u00a77Den h\u00c3\u00a4r saken beh\u00c3\u00b6ver inte repareras.
repairEnchanted=\u00a77Du har inte beh\u00c3\u00b6righet att reparera f\u00c3\u00b6rtrollade saker.
repairInvalidType=\u00a7cDen h\u00c3\u00a4r saken kan inte bli reparerad.
repairNone=Det var inga saker som beh\u00c3\u00b6ver repareras.
requestAccepted=\u00a77Teleporterings-f\u00c3\u00b6rfr\u00c3\u00a5gan accepterad.
requestAcceptedFrom=\u00a77{0} accepterade din teleportations-f\u00c3\u00b6rfr\u00c3\u00a5gan.
requestDenied=\u00a77Teleportations-f\u00c3\u00b6rfr\u00c3\u00a5gan nekad.
requestDeniedFrom=\u00a77{0} nekade din teleportations-f\u00c3\u00b6rfr\u00c3\u00a5gan.
requestSent=\u00a77F\u00c3\u00b6rfr\u00c3\u00a5gan skickad till {0}\u00a77.
requestTimedOut=\u00a7cTeleportations-f\u00c3\u00b6rfr\u00c3\u00a5gan har g\u00c3\u00a5tt ut
requiredBukkit= * ! * Du beh\u00c3\u00b6ver minst bygge {0} av CraftBukkit, ladda ner den fr\u00c3\u00a5n http://dl.bukkit.org/downloads/craftbukkit/
returnPlayerToJailError=Ett fel uppstod n\u00c3\u00a4r spelaren {0} skulle \u00c3\u00a5terv\u00c3\u00a4nda till f\u00c3\u00a4ngelset: {1}
repairAlreadyFixed=\u00a77Den h\u00e4r saken beh\u00f6ver inte repareras.
repairEnchanted=\u00a77Du har inte beh\u00f6righet att reparera f\u00f6rtrollade saker.
repairInvalidType=\u00a7cDen h\u00e4r saken kan inte bli reparerad.
repairNone=Det var inga saker som beh\u00f6ver repareras.
requestAccepted=\u00a77Teleporterings-f\u00f6rfr\u00e5gan accepterad.
requestAcceptedFrom=\u00a77{0} accepterade din teleportations-f\u00f6rfr\u00e5gan.
requestDenied=\u00a77Teleportations-f\u00f6rfr\u00e5gan nekad.
requestDeniedFrom=\u00a77{0} nekade din teleportations-f\u00f6rfr\u00e5gan.
requestSent=\u00a77F\u00f6rfr\u00e5gan skickad till {0}\u00a77.
requestTimedOut=\u00a7cTeleportations-f\u00f6rfr\u00e5gan har g\u00e5tt ut
requiredBukkit= * ! * Du beh\u00f6ver minst bygge {0} av CraftBukkit, ladda ner den fr\u00e5n http://dl.bukkit.org/downloads/craftbukkit/
returnPlayerToJailError=Ett fel uppstod n\u00e4r spelaren {0} skulle \u00e5terv\u00e4nda till f\u00e4ngelset: {1}
second=sekund
seconds=sekunder
seenOffline=Spelaren {0} \u00c3\u00a4r offline sedan {1}
seenOnline=Spelaren {0} \u00c3\u00a4r online sedan {1}
serverFull=Servern \u00c3\u00a4r full
serverTotal=Totalt p\u00c3\u00a5 servern: {0}
seenOffline=Spelaren {0} \u00e4r offline sedan {1}
seenOnline=Spelaren {0} \u00e4r online sedan {1}
serverFull=Servern \u00e4r full
serverTotal=Totalt p\u00e5 servern: {0}
setSpawner=Bytte typen av spawnare till {0}
sheepMalformedColor=Felformulerad f\u00c3\u00a4rg.
sheepMalformedColor=Felformulerad f\u00e4rg.
shoutFormat=\u00a77[Hojtning]\u00a7f {0}
signFormatFail=\u00a74[{0}]
signFormatSuccess=\u00a71[{0}]
signFormatTemplate=[{0}]
signProtectInvalidLocation=\u00a74Du har inte till\u00c3\u00a5telse att g\u00c3\u00b6ra skyltar h\u00c3\u00a4r.
signProtectInvalidLocation=\u00a74Du har inte till\u00e5telse att g\u00f6ra skyltar h\u00e4r.
similarWarpExist=En warp med ett liknande namn finns redan.
slimeMalformedSize=Felformulerad storlek.
soloMob=Det h\u00c3\u00a4r monstret gillar att vara ensam
spawnSet=\u00a77Spawnpunkten inst\u00c3\u00a4lld f\u00c3\u00b6r gruppen {0}.
soloMob=Det h\u00e4r monstret gillar att vara ensam
spawnSet=\u00a77Spawnpunkten inst\u00e4lld f\u00f6r gruppen {0}.
spawned=spawnade
sudoExempt=Du kan inte g\u00c3\u00b6ra en sudo p\u00c3\u00a5 den h\u00c3\u00a4r anv\u00c3\u00a4ndaren
sudoExempt=Du kan inte g\u00f6ra en sudo p\u00e5 den h\u00e4r anv\u00e4ndaren
sudoRun=Tvingar {0} att springa: /{1} {2}
suicideMessage=\u00a77Adj\u00c3\u00b6 grymma v\u00c3\u00a4rld...
suicideMessage=\u00a77Adj\u00f6 grymma v\u00e4rld...
suicideSuccess= \u00a77{0} tog sitt eget liv
survival=\u00c3\u00b6verlevnad
takenFromAccount=\u00a7c{0} har tagits fr\u00c3\u00a5n ditt konto.
takenFromOthersAccount=\u00a7c{0} taget fr\u00c3\u00a5n {1}\u00a7c konto. Ny balans: {2}
teleportAAll=\u00a77Teleportations-f\u00c3\u00b6rfr\u00c3\u00a5gan skickad till alla spelare...
survival=\u00f6verlevnad
takenFromAccount=\u00a7c{0} har tagits fr\u00e5n ditt konto.
takenFromOthersAccount=\u00a7c{0} taget fr\u00e5n {1}\u00a7c konto. Ny balans: {2}
teleportAAll=\u00a77Teleportations-f\u00f6rfr\u00e5gan skickad till alla spelare...
teleportAll=\u00a77Teleporterar alla spelare...
teleportAtoB=\u00a77{0}\u00a77 teleporterade dig till {1}\u00a77.
teleportDisabled={0} har teleportering inaktiverat.
teleportHereRequest=\u00a7c{0}\u00a7c har fr\u00c3\u00a5gat dig om du vill teleportera till dem.
teleportHereRequest=\u00a7c{0}\u00a7c har fr\u00e5gat dig om du vill teleportera till dem.
teleportNewPlayerError=Messlyckades med att teleportera ny spelare
teleportRequest=\u00a7c{0}\u00a7c har beg\u00c3\u00a4rt att f\u00c3\u00a5 teleportera sig till dig.
teleportRequestTimeoutInfo=\u00a77Den h\u00c3\u00a4r beg\u00c3\u00a4ran kommer att g\u00c3\u00a5 ut efter {0} sekunder.
teleportRequest=\u00a7c{0}\u00a7c har beg\u00e4rt att f\u00e5 teleportera sig till dig.
teleportRequestTimeoutInfo=\u00a77Den h\u00e4r beg\u00e4ran kommer att g\u00e5 ut efter {0} sekunder.
teleportTop=\u00a77Teleporterar till toppen.
teleportationCommencing=\u00a77Teleporteringen p\u00c3\u00a5b\u00c3\u00b6rjas...
teleportationCommencing=\u00a77Teleporteringen p\u00e5b\u00f6rjas...
teleportationDisabled=\u00a77Teleportering inaktiverat.
teleportationEnabled=\u00a77Teleportering aktiverat.
teleporting=\u00a77Teleporterar...
teleportingPortal=\u00a77Teleporterar via portal.
tempBanned=Tempor\u00c3\u00a4rt bannad fr\u00c3\u00a5n servern f\u00c3\u00b6r {0}
tempbanExempt=\u00a77Du kan inte tempor\u00c3\u00a4rt banna den spelaren
thunder= Du {0} \u00c3\u00a5ska i din v\u00c3\u00a4rld
thunderDuration=Du {0} i din v\u00c3\u00a4rld i {1} sekunder.
timeBeforeHeal=Tid f\u00c3\u00b6re n\u00c3\u00a4ste l\u00c3\u00a4kning: {0}
timeBeforeTeleport=Tid f\u00c3\u00b6re n\u00c3\u00a4sta teleportering: {0}
tempBanned=Tempor\u00e4rt bannad fr\u00e5n servern f\u00f6r {0}
tempbanExempt=\u00a77Du kan inte tempor\u00e4rt banna den spelaren
thunder= Du {0} \u00e5ska i din v\u00e4rld
thunderDuration=Du {0} i din v\u00e4rld i {1} sekunder.
timeBeforeHeal=Tid f\u00f6re n\u00e4ste l\u00e4kning: {0}
timeBeforeTeleport=Tid f\u00f6re n\u00e4sta teleportering: {0}
timeFormat=\u00a73{0}\u00a7f eller \u00a73{1}\u00a7f eller \u00a73{2}\u00a7f
timePattern=(?:([0-9]+)\\s*y[a-z]*[,\\s]*)?(?:([0-9]+)\\s*mo[a-z]*[,\\s]*)?(?:([0-9]+)\\s*w[a-z]*[,\\s]*)?(?:([0-9]+)\\s*d[a-z]*[,\\s]*)?(?:([0-9]+)\\s*h[a-z]*[,\\s]*)?(?:([0-9]+)\\s*m[a-z]*[,\\s]*)?(?:([0-9]+)\\s*(?:s[a-z]*)?)?
timeSet=Tid inst\u00c3\u00a4lld i alla v\u00c3\u00a4rldar.
timeSetPermission=\u00a7cDu har inte tillst\u00c3\u00a5nd att st\u00c3\u00a4lla in tiden.
timeWorldCurrent=Den nuvarande tiden i {0} \u00c3\u00a4r \u00a73{1}
timeWorldSet=Tiden \u00c3\u00a4r nu {0} i: \u00a7c{1}
timeSet=Tid inst\u00e4lld i alla v\u00e4rldar.
timeSetPermission=\u00a7cDu har inte tillst\u00e5nd att st\u00e4lla in tiden.
timeWorldCurrent=Den nuvarande tiden i {0} \u00e4r \u00a73{1}
timeWorldSet=Tiden \u00e4r nu {0} i: \u00a7c{1}
tps=Nuvarande TPS = {0}
tradeCompleted=\u00a77K\u00c3\u00b6p avslutat.
tradeSignEmpty=K\u00c3\u00b6pskylten har inget tillg\u00c3\u00a4ngligt f\u00c3\u00b6r dig.
tradeSignEmptyOwner=Det finns inget att fr\u00c3\u00a5n den h\u00c3\u00a4r k\u00c3\u00b6pskylten.
treeFailure=\u00a7cTr\u00c3\u00a4dgenereringn misslyckades. Prova igen p\u00c3\u00a5 gr\u00c3\u00a4s eller jord.
treeSpawned=\u00a77Tr\u00c3\u00a4d genererat.
tradeCompleted=\u00a77K\u00f6p avslutat.
tradeSignEmpty=K\u00f6pskylten har inget tillg\u00e4ngligt f\u00f6r dig.
tradeSignEmptyOwner=Det finns inget att fr\u00e5n den h\u00e4r k\u00f6pskylten.
treeFailure=\u00a7cTr\u00e4dgenereringn misslyckades. Prova igen p\u00e5 gr\u00e4s eller jord.
treeSpawned=\u00a77Tr\u00e4d genererat.
true=sant
typeTpaccept=\u00a77F\u00c3\u00b6r att teleportera, skriv \u00a7c/tpaccept\u00a77.
typeTpdeny=\u00a77F\u00c3\u00b6r att neka denna f\u00c3\u00b6rfr\u00c3\u00a5gan, skriv \u00a7c/tpdeny\u00a77.
typeWorldName=\u00a77Du kan ocks\u00c3\u00a5 skriva namnet av en specifik v\u00c3\u00a4rld.
typeTpaccept=\u00a77F\u00f6r att teleportera, skriv \u00a7c/tpaccept\u00a77.
typeTpdeny=\u00a77F\u00f6r att neka denna f\u00f6rfr\u00e5gan, skriv \u00a7c/tpdeny\u00a77.
typeWorldName=\u00a77Du kan ocks\u00e5 skriva namnet av en specifik v\u00e4rld.
unableToSpawnMob=Kunde inte spawna moben.
unbannedIP=Tog bort bannlysningen fr\u00c3\u00a5n IP-adress.
unbannedPlayer=Tog bort bannlysningen fr\u00c3\u00a5n spelaren.
unignorePlayer=Du ignorerar inte spelaren {0} l\u00c3\u00a4ngre.
unknownItemId=Ok\u00c3\u00a4nt objekt-ID: {0}
unknownItemInList=Ok\u00c3\u00a4nt objekt {0} i listan {1}.
unknownItemName=Ok\u00c3\u00a4nt objektnamn: {0}
unlimitedItemPermission=\u00a7cInget tillst\u00c3\u00a5nd f\u00c3\u00b6r obegr\u00c3\u00a4nsad tillg\u00c3\u00a5ng av {0}.
unlimitedItems=Obegr\u00c3\u00a4nsade objekt:
unmutedPlayer=Spelaren {0} \u00c3\u00a4r inte bannlyst l\u00c3\u00a4ngre.
unvanished=\u00a7aDu \u00c3\u00a4r synlig igen.
unbannedIP=Tog bort bannlysningen fr\u00e5n IP-adress.
unbannedPlayer=Tog bort bannlysningen fr\u00e5n spelaren.
unignorePlayer=Du ignorerar inte spelaren {0} l\u00e4ngre.
unknownItemId=Ok\u00e4nt objekt-ID: {0}
unknownItemInList=Ok\u00e4nt objekt {0} i listan {1}.
unknownItemName=Ok\u00e4nt objektnamn: {0}
unlimitedItemPermission=\u00a7cInget tillst\u00e5nd f\u00f6r obegr\u00e4nsad tillg\u00e5ng av {0}.
unlimitedItems=Obegr\u00e4nsade objekt:
unmutedPlayer=Spelaren {0} \u00e4r inte bannlyst l\u00e4ngre.
unvanished=\u00a7aDu \u00e4r synlig igen.
unvanishedReload=\u00a7cEn omladdning har tvingat dig att bli synlig.
upgradingFilesError=Fel vid uppgradering av filerna
userDoesNotExist=Anv\u00c3\u00a4ndaren {0} existerar inte.
userIsAway={0} \u00c3\u00a4r nu AFK
userIsNotAway={0} \u00c3\u00a4r inte l\u00c3\u00a4ngre AFK
userJailed=\u00a77Du har blivit f\u00c3\u00a4ngslad
userUsedPortal={0} anv\u00c3\u00a4nde en existerande utg\u00c3\u00a5ngsportal.
userDoesNotExist=Anv\u00e4ndaren {0} existerar inte.
userIsAway={0} \u00e4r nu AFK
userIsNotAway={0} \u00e4r inte l\u00e4ngre AFK
userJailed=\u00a77Du har blivit f\u00e4ngslad
userUsedPortal={0} anv\u00e4nde en existerande utg\u00e5ngsportal.
userdataMoveBackError=Kunde inte flytta userdata/{0}.tmp till userdata/{1}
userdataMoveError=Kunde inte flytta userdata/{0} till userdata/{1}.tmp
usingTempFolderForTesting=Anv\u00c3\u00a4nder tempor\u00c3\u00a4r mapp mapp f\u00c3\u00b6r testning:
vanished=\u00a7aDu \u00c3\u00a4r nu osynlig.
versionMismatch=Versionerna matchar inte! V\u00c3\u00a4nligen uppgradera {0} till samma version.
versionMismatchAll=Versionerna matchar inte! V\u00c3\u00a4nligen uppgradera alla Essentials jars till samma version.
voiceSilenced=\u00a77Din r\u00c3\u00b6st har tystats
usingTempFolderForTesting=Anv\u00e4nder tempor\u00e4r mapp mapp f\u00f6r testning:
vanished=\u00a7aDu \u00e4r nu osynlig.
versionMismatch=Versionerna matchar inte! V\u00e4nligen uppgradera {0} till samma version.
versionMismatchAll=Versionerna matchar inte! V\u00e4nligen uppgradera alla Essentials jars till samma version.
voiceSilenced=\u00a77Din r\u00f6st har tystats
warpDeleteError=Problem med att ta bort warp-filen.
warpListPermission=\u00a7cDu har inte tillst\u00c3\u00a5nd att lista warparna.
warpListPermission=\u00a7cDu har inte tillst\u00e5nd att lista warparna.
warpNotExist=Den warpen finns inte.
warpOverwrite=\u00a7cDu kan inte skriva \u00c3\u00b6ver den warpen.
warpSet=\u00a77Warpen {0} inst\u00c3\u00a4lld.
warpUsePermission=\u00a7cDU har inte tillst\u00c3\u00a5nd att anv\u00c3\u00a4nda den warpen.
warpOverwrite=\u00a7cDu kan inte skriva \u00f6ver den warpen.
warpSet=\u00a77Warpen {0} inst\u00e4lld.
warpUsePermission=\u00a7cDU har inte tillst\u00e5nd att anv\u00e4nda den warpen.
warpingTo=\u00a77Warpar till {0}.
warps=Warpar: {0}
warpsCount=\u00a77Det finns {0} warpar. Visar sida {1} av {2}.
weatherStorm=\u00a77Du har st\u00c3\u00a4llt in v\u00c3\u00a4dret till storm i {0}
weatherStormFor=\u00a77Du har st\u00c3\u00a4llt in v\u00c3\u00a4dret till storm i {0} f\u00c3\u00b6r {1} sekunder
weatherSun=\u00a77Du har st\u00c3\u00a4llt in v\u00c3\u00a4dret till sol i {0}
weatherSunFor=\u00a77Du har st\u00c3\u00a4llt in v\u00c3\u00a4dret till sol i {0} f\u00c3\u00b6r {1} sekunder
weatherStorm=\u00a77Du har st\u00e4llt in v\u00e4dret till storm i {0}
weatherStormFor=\u00a77Du har st\u00e4llt in v\u00e4dret till storm i {0} f\u00f6r {1} sekunder
weatherSun=\u00a77Du har st\u00e4llt in v\u00e4dret till sol i {0}
weatherSunFor=\u00a77Du har st\u00e4llt in v\u00e4dret till sol i {0} f\u00f6r {1} sekunder
whoisBanned=\u00a79 - Bannade spelare: {0}
whoisExp=\u00a79 - Erfarenhet: {0} (Niv\u00c3\u00a5 {1})
whoisGamemode=\u00a79 - Spell\u00c3\u00a4ge: {0}
whoisExp=\u00a79 - Erfarenhet: {0} (Niv\u00e5 {1})
whoisGamemode=\u00a79 - Spell\u00e4ge: {0}
whoisGeoLocation=\u00a79 - Plats: {0}
whoisGod=\u00a79 - Od\u00c3\u00b6dlighet: {0}
whoisHealth=\u00a79 - H\u00c3\u00a4lsa: {0}/20
whoisGod=\u00a79 - Od\u00f6dlighet: {0}
whoisHealth=\u00a79 - H\u00e4lsa: {0}/20
whoisIPAddress=\u00a79 - IP-Adress: {0}
whoisIs={0} \u00c3\u00a4r {1}
whoisJail=\u00a79 - F\u00c3\u00a4ngelse: {0}
whoisIs={0} \u00e4r {1}
whoisJail=\u00a79 - F\u00e4ngelse: {0}
whoisLocation=\u00a79 - Plats: ({0}, {1}, {2}, {3})
whoisMoney=\u00a79 - Pengar: {0}
whoisOP=\u00a79 - Operat\u00c3\u00b6rer: {0}
whoisStatusAvailable=\u00a79 - Status: Tillg\u00c3\u00a4nglig
whoisOP=\u00a79 - Operat\u00f6rer: {0}
whoisStatusAvailable=\u00a79 - Status: Tillg\u00e4nglig
whoisStatusAway=\u00a79 - Status: \u00a7cBorta\u00a7f
worth=\u00a77Stapeln med {0} ({2} objekt) \u00c3\u00a4r v\u00c3\u00a4rd \u00a7c{1}\u00a77 ({3} styck)
worthMeta=\u00a77Stapeln med {0} av typ {1} ({3} objekt) \u00c3\u00a4r v\u00c3\u00a4rd \u00a7c{2}\u00a77 ({4} styck)
worthSet=V\u00c3\u00a4rdet inst\u00c3\u00a4llt
year=\u00c3\u00a5r
years=\u00c3\u00a5r
youAreHealed=\u00a77Du har blivit l\u00c3\u00a4kt.
youHaveNewMail=\u00a7cDu har {0} meddelanden!\u00a7f Skriv \u00a77/mail read\u00a7f f\u00c3\u00b6r att l\u00c3\u00a4sa dina meddelanden.
worth=\u00a77Stapeln med {0} ({2} objekt) \u00e4r v\u00e4rd \u00a7c{1}\u00a77 ({3} styck)
worthMeta=\u00a77Stapeln med {0} av typ {1} ({3} objekt) \u00e4r v\u00e4rd \u00a7c{2}\u00a77 ({4} styck)
worthSet=V\u00e4rdet inst\u00e4llt
year=\u00e5r
years=\u00e5r
youAreHealed=\u00a77Du har blivit l\u00e4kt.
youHaveNewMail=\u00a7cDu har {0} meddelanden!\u00a7f Skriv \u00a77/mail read\u00a7f f\u00f6r att l\u00e4sa dina meddelanden.

View File

@ -118,7 +118,7 @@ commands:
gamemode:
description: Change player gamemode.
usage: /<command> <survival|creative|adventure> [player]
aliases: [gm,creative,creativemode,egamemode,ecreative,ecreativemode,egm]
aliases: [gm,creative,creativemode,survival,survivalmode,adventure,adventuremode,gmc,gma,gms,egamemod,eecreative,ecreativemode,esurvival,esurvivalmode,eadventure,eadventuremode,egmc,egma,egms,egm]
getpos:
description: Get your current coordinates or those of a player.
usage: /<command> [player]
@ -423,7 +423,7 @@ commands:
usage: /<command> <pagenumber|warp> [player]
aliases: [ewarp,warps,ewarps]
weather:
description: Setting the weather.
description: Sets the weather.
usage: /<command> <storm/sun> [duration]
aliases: [sky,sun,storm,eweather,rain,erain,esky,esun,estorm]
whois:

View File

@ -1,199 +1,167 @@
worth:
stonebutton:
'0': 7.0
wood: 1.0
arrow: 10.0
diamondpickaxe: 1000.0
rawfish: 5.0
minecart: 20.0
leatherchestplate: 40.0
storageminecart: 35.0
leaves:
'0': 0.0
feather: 3.0
goldchestplate: 600.0
mushroomsoup: 30.0
bread: 20.0
stationarywater:
'0': 1.0
workbench: 20.0
stonehoe: 40.0
brownmushroom: 2.0
wool:
'0': 8.0
mossycobblestone: 90.0
diamondhoe: 600.0
woodsword: 10.0
torch:
'0': 1.0
grass: 1.0
poweredminecart: 30.0
snowball: 1.0
goldenapple: 500.0
leatherleggings: 20.0
log:
'0': 2.0
diamondaxe: 1000.0
slimeball: 50.0
fence: 10.0
stonespade: 40.0
claybrick: 10.0
noteblock: 40.0
ironaxe: 60.0
coalore: 15.0
clayball: 8.0
fishingrod: 25.0
ironhoe: 60.0
goldrecord: 950.0
ironpickaxe: 80.0
irondoor: 35.0
bucket: 10.0
redrose: 2.0
grilledpork: 6.0
gravel: 1.0
wooddoor: 30.0
chainmailhelmet: 40.0
ironchestplate: 300.0
diamondblock: 1500.0
diamondhelmet: 1500.0
goldhelmet: 300.0
redstonetorchon:
'0': 10.0
ironspade: 40.0
furnace:
'0': 10.0
ironsword: 60.0
dispenser:
'0': 9.0
woodaxe: 10.0
seeds: 5.0
painting: 50.0
woodplate:
'0': 10.0
redstoneore: 30.0
diamondspade: 350.0
waterbucket: 10.0
water:
'0': 1.0
bedrock: 1000.0
irondoorblock:
'0': 15.0
goldhoe: 200.0
sand: 1.0
goldsword: 200.0
stoneaxe: 40.0
bookshelf: 20.0
ironblock: 160.0
jackolantern:
'0': 60.0
boat: 5.0
diamondchestplate: 3000.0
redstonewire:
'0': 7.0
redmushroom: 2.0
string: 5.0
stoneplate:
'0': 10.0
wallsign:
'0': 1.0
cactus:
'0': 10.0
sulphur: 19.0
rails:
'0': 40.0
ironore: 18.0
leatherhelmet: 20.0
stone: 2.0
egg: 1.0
diamondore: 200.0
woodhoe: 10.0
goldleggings: 400.0
chainmailleggings: 50.0
yellowflower: 2.0
ironhelmet: 120.0
obsidian: 130.0
dirt: 1.0
leather: 10.0
leatherboots: 17.0
lever:
'0': 7.0
cobblestone: 1.0
cake: 100.0
woodstairs:
'0': 8.0
ironingot: 20.0
goldore: 45.0
pumpkin:
'0': 50.0
bed: 25.0
watch: 100.0
ironleggings: 250.0
sign: 10.0
doublestep:
'0': 3.0
woodpickaxe: 10.0
stonepickaxe: 40.0
chainmailboots: 30.0
diamondleggings: 2200.0
cookedfish: 20.0
saddle: 100.0
cobblestonestairs:
'0': 22.0
tnt: 10000.0
glowingredstoneore: 30.0
apple: 10.0
woodspade: 10.0
goldingot: 50.0
diode: 10.0
soil:
'0': 3.0
clay: 3.0
goldblock: 400.0
stick: 1.0
paper: 30.0
brick: 40.0
stationarylava:
'0': 1.0
chest: 15.0
sandstone: 5.0
goldpickaxe: 300.0
compass: 50.0
sugarcane: 10.0
diamondsword: 700.0
goldboots: 250.0
sponge: 80.0
stonesword: 40.0
coal:
'0': 3.0
goldaxe: 300.0
bone: 10.0
diamond: 230.0
glass: 10.0
goldspade: 220.0
lapisblock: 500.0
lavabucket: 30.0
wheat: 9.0
ladder:
'0': 10.0
sugarcaneblock:
'0': 15.0
bowl: 6.0
chainmailchestplate: 40.0
sapling:
'0': 2.0
diamondboots: 1500.0
lapisore: 100.0
lava:
'0': 1.0
milkbucket: 15.0
redstone: 1.0
greenrecord: 1000.0
inksack:
'0': 10.0
glowstonedust: 11.0
book: 35.0
bow: 75.0
ironboots: 50.0
step:
'0': 3.0
sugar: 5.0
stonebutton: 6.0
wood: 0.50
arrow: 3.50
diamondpickaxe: 650.0
rawfish: 5.0
minecart: 23.0
leatherchestplate: 85.0
storageminecart: 30.0
leaves: 1.0
feather: 3.0
goldchestplate: 6.5
mushroomsoup: 4.5
bread: 30.0
stationarywater: 1.0
workbench: 2.5
stonehoe: 2.5
brownmushroom: 2.0
wool: 20.0
mossycobblestone: 90.0
diamondhoe: 400.0
woodsword: 1.0
torch: 4.0
grass: 1.0
poweredminecart: 32.0
snowball: 1.0
goldenapple: 100.0
leatherleggings: 75.0
log: 2.0
diamondaxe: 650.0
slimeball: 50.0
fence: 1.0
stonespade: 1.5
claybrick: 5.0
noteblock: 36.0
ironaxe: 22.0
coalore: 15.0
clayball: 3.0
fishingrod: 10.0
ironhoe: 22.0
goldrecord: 100.0
ironpickaxe: 22.0
irondoor: 22.0
bucket: 22.0
redrose: 2.0
grilledpork: 7.0
gravel: 1.0
wooddoor: 3.0
chainmailhelmet: 40.0
ironchestplate: 22.0
diamondblock: 2000.0
diamondhelmet: 1000.0
goldhelmet: 6.0
redstonetorchon: 32.0
ironspade: 22.0
furnace: 8.5
ironsword: 22.0
dispenser: 58.0
woodaxe: 2.0
seeds: 2.0
painting: 25.0
woodplate: 1.0
redstoneore: 30.0
diamondspade: 210.0
waterbucket: 40.0
water: 1.0
bedrock: 100.0
irondoorblock: 15.0
goldhoe: 6.0
sand: 1.0
goldsword: 6.0
stoneaxe: 3.0
bookshelf: 140.0
ironblock: 190.0
jackolantern: 56.0
boat: 3.0
diamondchestplate: 1750.0
redstonewire: 30.0
redmushroom: 2.0
string: 5.0
stoneplate: 6.0
wallsign: 1.0
cactus: 10.0
sulphur: 20.0
rails: 22.0
ironore: 18.0
leatherhelmet: 52.0
stone: 3.00
egg: 1.0
diamondore: 200.0
woodhoe: 2.0
goldleggings: 6.0
chainmailleggings: 50.0
yellowflower: 2.0
ironhelmet: 22.0
obsidian: 130.0
dirt: 1.0
leather: 10.0
leatherboots: 42.0
lever: 1.0
cobblestone: 1.0
cake: 180.0
woodstairs: 1.0
ironingot: 22.0
goldore: 45.0
pumpkin: 50.0
bed: 68.0
watch: 6.0
ironleggings: 22.0
sign: 1.5
doublestep: 1.0
woodpickaxe: 2.0
stonepickaxe: 4.0
chainmailboots: 30.0
diamondleggings: 1500.0
cookedfish: 7.0
saddle: 100.0
cobblestonestairs: 1.5
tnt: 100.0
glowingredstoneore: 30.0
apple: 10.0
woodspade: 1.0
goldingot: 105.0
diode: 110.0
soil: 1.0
clay: 12.0
goldblock: 450.0
stick: 0.25
paper: 10.0
brick: 21.0
stationarylava: 1.0
chest: 4.0
sandstone: 3.0
goldpickaxe: 6.0
compass: 22.0
sugarcane: 10.0
diamondsword: 420.0
goldboots: 6.0
sponge: 80.0
stonesword: 2.5
coal: 15.0
goldaxe: 6.0
bone: 2.0
diamond: 200.0
glass: 3.00
goldspade: 6.0
lapisblock: 950.0
lavabucket: 40.0
wheat: 9.0
ladder: 0.5
sugarcaneblock: 15.0
bowl: 0.50
chainmailchestplate: 40.0
sapling: 2.0
diamondboots: 850.0
lapisore: 100.0
lava: 25.0
milkbucket: 40.0
redstone: 32.0
greenrecord: 100.0
inksack: 10.0
glowstonedust: 10.0
book: 45.0
bow: 15.0
ironboots: 22.0
step: 1.5
sugar: 10.0

View File

@ -1,10 +1,5 @@
package com.earth2me.essentials;
import com.earth2me.essentials.settings.Settings;
import com.earth2me.essentials.storage.ObjectLoadException;
import com.earth2me.essentials.storage.StorageObject;
import com.earth2me.essentials.storage.YamlStorageReader;
import com.earth2me.essentials.storage.YamlStorageWriter;
import java.io.*;
import junit.framework.TestCase;
import org.bukkit.Location;
@ -39,100 +34,6 @@ public class StorageTest extends TestCase
}
}
@Test
public void testSettings()
{
try
{
assertTrue(StorageObject.class.isAssignableFrom(Settings.class));
ExecuteTimer ext = new ExecuteTimer();
ext.start();
final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
final Reader reader = new InputStreamReader(bais);
final Settings settings = new YamlStorageReader(reader, null).load(Settings.class);
ext.mark("load empty settings");
final ByteArrayInputStream bais3 = new ByteArrayInputStream(new byte[0]);
final Reader reader3 = new InputStreamReader(bais3);
final Settings settings3 = new YamlStorageReader(reader3, null).load(Settings.class);
ext.mark("load empty settings (class cached)");
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintWriter writer = new PrintWriter(baos);
new YamlStorageWriter(writer).save(settings);
writer.close();
ext.mark("write settings");
byte[] written = baos.toByteArray();
System.out.println(new String(written));
final ByteArrayInputStream bais2 = new ByteArrayInputStream(written);
final Reader reader2 = new InputStreamReader(bais2);
final Settings settings2 = new YamlStorageReader(reader2, null).load(Settings.class);
System.out.println(settings.toString());
System.out.println(settings2.toString());
ext.mark("reload settings");
System.out.println(ext.end());
//assertEquals("Default and rewritten config should be equal", settings, settings2);
//that assertion fails, because empty list and maps return as null
}
catch (ObjectLoadException ex)
{
fail(ex.getMessage());
}
}
@Test
public void testUserdata()
{
try
{
FakeServer server = new FakeServer();
World world = server.createWorld("testWorld", Environment.NORMAL);
ExecuteTimer ext = new ExecuteTimer();
ext.start();
final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
final Reader reader = new InputStreamReader(bais);
final com.earth2me.essentials.user.UserData userdata = new YamlStorageReader(reader, null).load(com.earth2me.essentials.user.UserData.class);
ext.mark("load empty user");
final ByteArrayInputStream bais3 = new ByteArrayInputStream(new byte[0]);
final Reader reader3 = new InputStreamReader(bais3);
final com.earth2me.essentials.user.UserData userdata3 = new YamlStorageReader(reader3, null).load(com.earth2me.essentials.user.UserData.class);
ext.mark("load empty user (class cached)");
for (int j = 0; j < 10000; j++)
{
userdata.getHomes().put("home", new Location(world, j, j, j));
}
ext.mark("change home 10000 times");
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintWriter writer = new PrintWriter(baos);
new YamlStorageWriter(writer).save(userdata);
writer.close();
ext.mark("write user");
final ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
final PrintWriter writer2 = new PrintWriter(baos2);
new YamlStorageWriter(writer2).save(userdata);
writer2.close();
ext.mark("write user (cached)");
byte[] written = baos.toByteArray();
System.out.println(new String(written));
ext.mark("debug output");
final ByteArrayInputStream bais2 = new ByteArrayInputStream(written);
final Reader reader2 = new InputStreamReader(bais2);
final com.earth2me.essentials.user.UserData userdata2 = new YamlStorageReader(reader2, null).load(com.earth2me.essentials.user.UserData.class);
ext.mark("reload file");
final ByteArrayInputStream bais4 = new ByteArrayInputStream(written);
final Reader reader4 = new InputStreamReader(bais4);
final com.earth2me.essentials.user.UserData userdata4 = new YamlStorageReader(reader4, null).load(com.earth2me.essentials.user.UserData.class);
ext.mark("reload file (cached)");
System.out.println(userdata.toString());
System.out.println(userdata2.toString());
System.out.println(ext.end());
}
catch (ObjectLoadException ex)
{
fail(ex.getMessage());
}
}
@Test
public void testOldUserdata()
{

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project [ <!ENTITY buildinc SYSTEM "../build.inc.xml"> ]>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
@ -7,9 +8,9 @@
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="EssentialsUpdate" default="default" basedir=".">
<description>Builds, tests, and runs the project EssentialsUpdate.</description>
<import file="nbproject/build-impl.xml"/>
<project name="EssentialsAntiBuild" default="default" basedir=".">
<description>Builds, tests, and runs the project EssentialsAntiBuild.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
@ -59,7 +60,7 @@
An example of overriding the target for project execution could look like this:
<target name="run" depends="EssentialsUpdate-impl.jar">
<target name="run" depends="EssentialsProtect-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
@ -71,4 +72,12 @@
nbproject/build-impl.xml file.
-->
<target name="-post-jar">
<jar jarfile="${dist.dir}/EssentialsAntiBuild.jar">
<zipfileset src="${dist.jar}" excludes="META-INF/*" />
<manifest>
<attribute name="Classpath" value="EssentialsAntiBuild.jar"/>
</manifest>
</jar>
</target>
</project>

View File

@ -12,14 +12,14 @@ is divided into following sections:
- execution
- debugging
- javadoc
- test compilation
- test execution
- test debugging
- junit compilation
- junit execution
- junit debugging
- applet
- cleanup
-->
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="EssentialsUpdate-impl">
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="EssentialsAntiBuild-impl">
<fail message="Please build using Ant 1.8.0 or higher.">
<condition>
<not>
@ -181,7 +181,6 @@ is divided into following sections:
</and>
</condition>
<property name="run.jvmargs" value=""/>
<property name="run.jvmargs.ide" value=""/>
<property name="javac.compilerargs" value=""/>
<property name="work.dir" value="${basedir}"/>
<condition property="no.deps">
@ -226,27 +225,6 @@ is divided into following sections:
<property name="jar.index.metainf" value="${jar.index}"/>
<property name="copylibs.rebase" value="true"/>
<available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
<condition property="junit.available">
<or>
<available classname="org.junit.Test" classpath="${run.test.classpath}"/>
<available classname="junit.framework.Test" classpath="${run.test.classpath}"/>
</or>
</condition>
<condition property="testng.available">
<available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/>
</condition>
<condition property="junit+testng.available">
<and>
<istrue value="${junit.available}"/>
<istrue value="${testng.available}"/>
</and>
</condition>
<condition else="testng" property="testng.mode" value="mixed">
<istrue value="${junit+testng.available}"/>
</condition>
<condition else="" property="testng.debug.mode" value="-mixed">
<istrue value="${junit+testng.available}"/>
</condition>
</target>
<target name="-post-init">
<!-- Empty placeholder for easier customization. -->
@ -379,52 +357,11 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
<target if="${junit.available}" name="-init-macrodef-junit-init">
<condition else="false" property="nb.junit.batch" value="true">
<and>
<istrue value="${junit.available}"/>
<not>
<isset property="test.method"/>
</not>
</and>
</condition>
<condition else="false" property="nb.junit.single" value="true">
<and>
<istrue value="${junit.available}"/>
<isset property="test.method"/>
</and>
</condition>
</target>
<target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
<target name="-init-macrodef-junit">
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg value="-ea"/>
<customize/>
</junit>
</sequential>
</macrodef>
</target>
<target if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
@ -433,270 +370,32 @@ is divided into following sections:
<filename name="@{testincludes}"/>
</fileset>
</batchtest>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg value="-ea"/>
<customize/>
<jvmarg line="${run.jvmargs}"/>
</junit>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
<target if="${testng.available}" name="-init-macrodef-testng">
<macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}">
<isset property="test.method"/>
</condition>
<union id="test.set">
<fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
<filename name="@{testincludes}"/>
</fileset>
</union>
<taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
<testng classfilesetref="test.set" failureProperty="tests.failed" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="EssentialsUpdate" testname="TestNG tests" workingDir="${work.dir}">
<xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
<propertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</propertyset>
<customize/>
</testng>
</sequential>
</macrodef>
</target>
<target name="-init-macrodef-test-impl">
<macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element implicit="true" name="customize" optional="true"/>
<sequential>
<echo>No tests executed.</echo>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl">
<macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element implicit="true" name="customize" optional="true"/>
<sequential>
<j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize/>
</j2seproject3:junit>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl">
<macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element implicit="true" name="customize" optional="true"/>
<sequential>
<j2seproject3:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize/>
</j2seproject3:testng>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test">
<macrodef name="test" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<sequential>
<j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
</customize>
</j2seproject3:test-impl>
</sequential>
</macrodef>
</target>
<target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
<macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg value="-ea"/>
<jvmarg line="${debug-args-line}"/>
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
<customize/>
</junit>
</sequential>
</macrodef>
</target>
<target if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
<macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element name="customize" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<batchtest todir="${build.test.results.dir}">
<fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
<filename name="@{testincludes}"/>
</fileset>
</batchtest>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg value="-ea"/>
<jvmarg line="${debug-args-line}"/>
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
<customize/>
</junit>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
<macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<element implicit="true" name="customize" optional="true"/>
<sequential>
<j2seproject3:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize/>
</j2seproject3:junit-debug>
</sequential>
</macrodef>
</target>
<target if="${testng.available}" name="-init-macrodef-testng-debug">
<macrodef name="testng-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${main.class}" name="testClass"/>
<attribute default="" name="testMethod"/>
<element name="customize2" optional="true"/>
<sequential>
<condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
<isset property="test.method"/>
</condition>
<condition else="-suitename EssentialsUpdate -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
<matches pattern=".*\.xml" string="@{testClass}"/>
</condition>
<delete dir="${build.test.results.dir}" quiet="true"/>
<mkdir dir="${build.test.results.dir}"/>
<j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
<customize>
<customize2/>
<jvmarg value="-ea"/>
<arg line="${testng.debug.mode}"/>
<arg line="-d ${build.test.results.dir}"/>
<arg line="-listener org.testng.reporters.VerboseReporter"/>
<arg line="${testng.cmd.args}"/>
</customize>
</j2seproject3:debug>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl">
<macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${main.class}" name="testClass"/>
<attribute default="" name="testMethod"/>
<element implicit="true" name="customize2" optional="true"/>
<sequential>
<j2seproject3:testng-debug testClass="@{testClass}" testMethod="@{testMethod}">
<customize2/>
</j2seproject3:testng-debug>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit">
<macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<attribute default="${main.class}" name="testClass"/>
<attribute default="" name="testMethod"/>
<sequential>
<j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
</customize>
</j2seproject3:test-debug-impl>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng">
<macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
<attribute default="${main.class}" name="testClass"/>
<attribute default="" name="testMethod"/>
<sequential>
<j2seproject3:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}">
<customize2>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
</customize2>
</j2seproject3:testng-debug-impl>
</sequential>
</macrodef>
</target>
<target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/>
<!--
pre NB7.2 profiling section; consider it deprecated
-->
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/>
<target if="profiler.info.jvmargs.agent" name="-profile-pre-init">
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
<target name="-profile-pre-init">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target if="profiler.info.jvmargs.agent" name="-profile-post-init">
<target name="-profile-post-init">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
<target if="profiler.info.jvmargs.agent" name="-profile-init-macrodef-profile">
<target name="-profile-init-macrodef-profile">
<macrodef name="resolve">
<attribute name="name"/>
<attribute name="value"/>
@ -728,13 +427,10 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" if="profiler.info.jvmargs.agent" name="-profile-init-check">
<target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
<fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
<fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
</target>
<!--
end of pre NB7.2 profiling section
-->
<target depends="-init-debug-args" name="-init-macrodef-nbjpda">
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="name"/>
@ -792,7 +488,6 @@ is divided into following sections:
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
<classpath>
<path path="@{classpath}"/>
</classpath>
@ -809,7 +504,6 @@ is divided into following sections:
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="classname"/>
<attribute default="${run.classpath}" name="classpath"/>
<attribute default="jvm" name="jvm"/>
<element name="customize" optional="true"/>
<sequential>
<java classname="@{classname}" dir="${work.dir}" fork="true">
@ -817,7 +511,6 @@ is divided into following sections:
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
<classpath>
<path path="@{classpath}"/>
</classpath>
@ -844,9 +537,6 @@ is divided into following sections:
<path path="${run.classpath.without.build.classes.dir}"/>
<chainedmapper>
<flattenmapper/>
<filtermapper>
<replacestring from=" " to="%20"/>
</filtermapper>
<globmapper from="*" to="lib/*"/>
</chainedmapper>
</pathconvert>
@ -892,7 +582,7 @@ is divided into following sections:
<target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
<property name="ap.cmd.line.internal" value=""/>
</target>
<target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
<target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
<!--
===================
COMPILATION SECTION
@ -903,7 +593,7 @@ is divided into following sections:
<delete file="${built-jar.properties}" quiet="true"/>
</target>
<target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
<echo level="warn" message="Cycle detected: EssentialsUpdate was already built"/>
<echo level="warn" message="Cycle detected: EssentialsAntiBuild was already built"/>
</target>
<target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
<mkdir dir="${build.dir}"/>
@ -913,6 +603,13 @@ is divided into following sections:
<propertyfile file="${built-jar.properties}">
<entry key="${basedir}" value=""/>
</propertyfile>
<antcall target="-maybe-call-dep">
<param name="call.built.properties" value="${built-jar.properties}"/>
<param location="${project.Essentials}" name="call.subproject"/>
<param location="${project.Essentials}/build.xml" name="call.script"/>
<param name="call.target" value="jar"/>
<param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
</antcall>
</target>
<target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
<target depends="init" name="-check-automatic-build">
@ -1108,11 +805,7 @@ is divided into following sections:
PROFILING SECTION
=================
-->
<!--
pre NB7.2 profiler integration
-->
<target depends="profile-init,compile" description="Profile a project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72">
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
@ -1120,9 +813,8 @@ is divided into following sections:
</nbprofiledirect>
<profile/>
</target>
<target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="profiler.info.jvmargs.agent" name="-profile-single-pre72">
<target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
<fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
@ -1130,8 +822,12 @@ is divided into following sections:
</nbprofiledirect>
<profile classname="${profile.class}"/>
</target>
<target depends="profile-init,compile-single" if="profiler.info.jvmargs.agent" name="-profile-applet-pre72">
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<!--
=========================
APPLET PROFILING SECTION
=========================
-->
<target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
<nbprofiledirect>
<classpath>
<path path="${run.classpath}"/>
@ -1143,8 +839,12 @@ is divided into following sections:
</customize>
</profile>
</target>
<target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<!--
=========================
TESTS PROFILING SECTION
=========================
-->
<target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
<nbprofiledirect>
<classpath>
<path path="${run.test.classpath}"/>
@ -1166,42 +866,6 @@ is divided into following sections:
<formatter type="xml"/>
</junit>
</target>
<!--
end of pre NB72 profiling section
-->
<target if="netbeans.home" name="-profile-check">
<condition property="profiler.configured">
<or>
<contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
<contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
</or>
</condition>
</target>
<target depends="-profile-check,-profile-pre72" description="Profile a project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent">
<startprofiler/>
<antcall target="run"/>
</target>
<target depends="-profile-check,-profile-single-pre72" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-single" unless="profiler.info.jvmargs.agent">
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
<startprofiler/>
<antcall target="run-single"/>
</target>
<target depends="-profile-test-single-pre72" description="Profile a selected test in the IDE." name="profile-test-single"/>
<target depends="-profile-check" description="Profile a selected test in the IDE." if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs">
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
<startprofiler/>
<antcall target="test-single"/>
</target>
<target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main">
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
<startprofiler/>
<antcal target="run-test-with-main"/>
</target>
<target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent">
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
<startprofiler/>
<antcall target="run-applet"/>
</target>
<!--
===============
JAVADOC SECTION
@ -1245,7 +909,7 @@ is divided into following sections:
<target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
<!--
=========================
TEST COMPILATION SECTION
JUNIT COMPILATION SECTION
=========================
-->
<target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
@ -1288,14 +952,14 @@ is divided into following sections:
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
<!--
=======================
TEST EXECUTION SECTION
JUNIT EXECUTION SECTION
=======================
-->
<target depends="init" if="have.tests" name="-pre-test-run">
<mkdir dir="${build.test.results.dir}"/>
</target>
<target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
<j2seproject3:test testincludes="**/*Test.java"/>
<j2seproject3:junit testincludes="**/*Test.java"/>
</target>
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
@ -1308,40 +972,39 @@ is divided into following sections:
</target>
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
<j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
<j2seproject3:junit excludes="" includes="${test.includes}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
<fail unless="test.class">Must select some files in the IDE or set test.class</fail>
<fail unless="test.method">Must select some method in the IDE or set test.method</fail>
<j2seproject3:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
<!--
=======================
TEST DEBUGGING SECTION
JUNIT DEBUGGING SECTION
=======================
-->
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test">
<target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
<j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method">
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
<fail unless="test.method">Must select some method in the IDE or set test.method</fail>
<j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/>
<property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
<delete file="${test.report.file}"/>
<mkdir dir="${build.test.results.dir}"/>
<j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
<customize>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
<arg value="${test.class}"/>
<arg value="showoutput=true"/>
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
</customize>
</j2seproject3:debug>
</target>
<target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
</target>
<target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
<target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
<target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
</target>
@ -1383,7 +1046,7 @@ is divided into following sections:
<delete file="${built-clean.properties}" quiet="true"/>
</target>
<target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
<echo level="warn" message="Cycle detected: EssentialsUpdate was already built"/>
<echo level="warn" message="Cycle detected: EssentialsAntiBuild was already built"/>
</target>
<target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
<mkdir dir="${build.dir}"/>
@ -1393,6 +1056,13 @@ is divided into following sections:
<propertyfile file="${built-clean.properties}">
<entry key="${basedir}" value=""/>
</propertyfile>
<antcall target="-maybe-call-dep">
<param name="call.built.properties" value="${built-clean.properties}"/>
<param location="${project.Essentials}" name="call.subproject"/>
<param location="${project.Essentials}/build.xml" name="call.script"/>
<param name="call.target" value="clean"/>
<param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
</antcall>
</target>
<target depends="init" name="-do-clean">
<delete dir="${build.dir}"/>
@ -1406,12 +1076,9 @@ is divided into following sections:
<target name="-check-call-dep">
<property file="${call.built.properties}" prefix="already.built."/>
<condition property="should.call.dep">
<and>
<not>
<isset property="already.built.${call.subproject}"/>
</not>
<available file="${call.script}"/>
</and>
<not>
<isset property="already.built.${call.subproject}"/>
</not>
</condition>
</target>
<target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">

View File

@ -0,0 +1,8 @@
build.xml.data.CRC32=ff207988
build.xml.script.CRC32=1ed11cc3
build.xml.stylesheet.CRC32=28e38971@1.38.3.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=ddb4519c
nbproject/build-impl.xml.script.CRC32=cfb9443d
nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.3.46

View File

@ -1,9 +1,10 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.processors.list=
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=EssentialsUpdate
application.vendor=essentialsteam
application.title=EssentialsAntiBuild
application.vendor=
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=2
@ -59,14 +60,17 @@ debug.test.classpath=\
${run.test.classpath}
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/EssentialsUpdate.jar
dist.jar=${dist.dir}/original-EssentialsAntiBuild.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
file.reference.bukkit.jar=../lib/bukkit.jar
includes=**
jar.archive.disabled=${jnlp.enabled}
jar.compress=true
jar.index=${jnlp.enabled}
javac.classpath=\
${reference.Essentials.jar}:\
${file.reference.bukkit.jar}
# Space-separated list of extra javac options
javac.compilerargs=
@ -92,11 +96,18 @@ javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
main.class=
jnlp.codebase.type=no.codebase
jnlp.descriptor=application
jnlp.enabled=false
jnlp.mixed.code=defaut
jnlp.offline-allowed=false
jnlp.signed=false
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
mkdist.disabled=true
platform.active=default_platform
project.Essentials=../Essentials
reference.Essentials.jar=${project.Essentials}/dist/Essentials.jar
run.classpath=\
${javac.classpath}:\
${build.classes.dir}

View File

@ -3,7 +3,7 @@
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>EssentialsUpdate</name>
<name>EssentialsAntiBuild</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
@ -14,5 +14,15 @@
<libraries xmlns="http://www.netbeans.org/ns/ant-project-libraries/1">
<definitions>../lib/nblibraries.properties</definitions>
</libraries>
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
<reference>
<foreign-project>Essentials</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
</references>
</configuration>
</project>

View File

@ -0,0 +1,73 @@
package com.earth2me.essentials.antibuild;
public enum AntiBuildConfig
{
disable_build("protect.disable.build", true),
disable_use("protect.disable.use", true),
alert_on_placement("protect.alert.on-placement"),
alert_on_use("protect.alert.on-use"),
alert_on_break("protect.alert.on-break"),
blacklist_placement("protect.blacklist.placement"),
blacklist_usage("protect.blacklist.usage"),
blacklist_break("protect.blacklist.break"),
blacklist_piston("protect.blacklist.piston");
private final String configName;
private final String defValueString;
private final boolean defValueBoolean;
private final boolean isList;
private final boolean isString;
private AntiBuildConfig(final String configName)
{
this(configName, null, false, true, false);
}
private AntiBuildConfig(final String configName, final boolean defValueBoolean)
{
this(configName, null, defValueBoolean, false, false);
}
private AntiBuildConfig(final String configName, final String defValueString, final boolean defValueBoolean, final boolean isList, final boolean isString)
{
this.configName = configName;
this.defValueString = defValueString;
this.defValueBoolean = defValueBoolean;
this.isList = isList;
this.isString = isString;
}
/**
* @return the configName
*/
public String getConfigName()
{
return configName;
}
/**
* @return the default value String
*/
public String getDefaultValueString()
{
return defValueString;
}
/**
* @return the default value boolean
*/
public boolean getDefaultValueBoolean()
{
return defValueBoolean;
}
public boolean isString()
{
return isString;
}
public boolean isList()
{
return isList;
}
}

View File

@ -0,0 +1,65 @@
package com.earth2me.essentials.antibuild;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
public class EssentialsAntiBuild extends JavaPlugin implements IAntiBuild
{
private static final Logger LOGGER = Logger.getLogger("Minecraft");
private final transient Map<AntiBuildConfig, Boolean> settingsBoolean = new EnumMap<AntiBuildConfig, Boolean>(AntiBuildConfig.class);
private final transient Map<AntiBuildConfig, List<Integer>> settingsList = new EnumMap<AntiBuildConfig, List<Integer>>(AntiBuildConfig.class);
private transient EssentialsConnect ess = null;
@Override
public void onEnable()
{
final PluginManager pm = this.getServer().getPluginManager();
final Plugin essPlugin = pm.getPlugin("Essentials");
if (essPlugin == null || !essPlugin.isEnabled())
{
return;
}
ess = new EssentialsConnect(essPlugin, this);
final EssentialsAntiBuildListener blockListener = new EssentialsAntiBuildListener(this);
pm.registerEvents(blockListener, this);
}
@Override
public boolean checkProtectionItems(final AntiBuildConfig list, final int id)
{
final List<Integer> itemList = settingsList.get(list);
return itemList != null && !itemList.isEmpty() && itemList.contains(id);
}
@Override
public EssentialsConnect getEssentialsConnect()
{
return ess;
}
@Override
public Map<AntiBuildConfig, Boolean> getSettingsBoolean()
{
return settingsBoolean;
}
@Override
public Map<AntiBuildConfig, List<Integer>> getSettingsList()
{
return settingsList;
}
@Override
public boolean getSettingBool(final AntiBuildConfig protectConfig)
{
final Boolean bool = settingsBoolean.get(protectConfig);
return bool == null ? protectConfig.getDefaultValueBoolean() : bool;
}
}

View File

@ -0,0 +1,215 @@
package com.earth2me.essentials.antibuild;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.User;
import java.util.logging.Level;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.Event.Result;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
public class EssentialsAntiBuildListener implements Listener
{
final private transient IAntiBuild prot;
final private transient IEssentials ess;
public EssentialsAntiBuildListener(final IAntiBuild parent)
{
this.prot = parent;
this.ess = prot.getEssentialsConnect().getEssentials();
}
private boolean metaPermCheck(User user, String action, Block block)
{
if (block == null)
{
return false;
}
return metaPermCheck(user, action, block.getTypeId(), block.getData());
}
private boolean metaPermCheck(User user, String action, int blockId, byte data)
{
final String blockPerm = "essentials.build." + action + "." + blockId;
final String dataPerm = blockPerm + ":" + data;
if (user.isPermissionSet(dataPerm))
{
return user.isAuthorized(dataPerm);
}
else
{
if (ess.getSettings().isDebug())
{
ess.getLogger().log(Level.INFO, "abort checking if " + user.getName() + " has " + dataPerm + " - not directly set");
}
}
return user.isAuthorized(blockPerm);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockPlace(final BlockPlaceEvent event)
{
if (event.isCancelled())
{
return;
}
final User user = ess.getUser(event.getPlayer());
if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build")
&& !metaPermCheck(user, "place", event.getBlock()))
{
if (ess.getSettings().warnOnBuildDisallow())
{
user.sendMessage(_("buildAlert"));
}
event.setCancelled(true);
return;
}
final Block blockPlaced = event.getBlockPlaced();
final int id = blockPlaced.getTypeId();
if (prot.checkProtectionItems(AntiBuildConfig.blacklist_placement, id) && !user.isAuthorized("essentials.protect.exemptplacement"))
{
event.setCancelled(true);
return;
}
if (prot.checkProtectionItems(AntiBuildConfig.alert_on_placement, id)
&& !user.isAuthorized("essentials.protect.alerts.notrigger"))
{
prot.getEssentialsConnect().alert(user, blockPlaced.getType().toString(), _("alertPlaced"));
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockBreak(final BlockBreakEvent event)
{
if (event.isCancelled())
{
return;
}
final User user = ess.getUser(event.getPlayer());
if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build")
&& !metaPermCheck(user, "break", event.getBlock()))
{
if (ess.getSettings().warnOnBuildDisallow())
{
user.sendMessage(_("buildAlert"));
}
event.setCancelled(true);
return;
}
final Block block = event.getBlock();
final int typeId = block.getTypeId();
if (prot.checkProtectionItems(AntiBuildConfig.blacklist_break, typeId)
&& !user.isAuthorized("essentials.protect.exemptbreak"))
{
event.setCancelled(true);
return;
}
final Material type = block.getType();
if (prot.checkProtectionItems(AntiBuildConfig.alert_on_break, typeId)
&& !user.isAuthorized("essentials.protect.alerts.notrigger"))
{
prot.getEssentialsConnect().alert(user, type.toString(), _("alertBroke"));
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockPistonExtend(BlockPistonExtendEvent event)
{
if (event.isCancelled())
{
return;
}
for (Block block : event.getBlocks())
{
if (prot.checkProtectionItems(AntiBuildConfig.blacklist_piston, block.getTypeId()))
{
event.setCancelled(true);
return;
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockPistonRetract(BlockPistonRetractEvent event)
{
if (event.isCancelled() || !event.isSticky())
{
return;
}
final Block block = event.getRetractLocation().getBlock();
if (prot.checkProtectionItems(AntiBuildConfig.blacklist_piston, block.getTypeId()))
{
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.LOW)
public void onPlayerInteract(final PlayerInteractEvent event)
{
// Do not return if cancelled, because the interact event has 2 cancelled states.
final User user = ess.getUser(event.getPlayer());
if (event.hasItem()
&& (event.getItem().getType() == Material.WATER_BUCKET
|| event.getItem().getType() == Material.LAVA_BUCKET)
&& prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build"))
{
if (ess.getSettings().warnOnBuildDisallow())
{
user.sendMessage(_("buildAlert"));
}
event.setCancelled(true);
return;
}
final ItemStack item = event.getItem();
if (item != null
&& prot.checkProtectionItems(AntiBuildConfig.blacklist_usage, item.getTypeId())
&& !user.isAuthorized("essentials.protect.exemptusage"))
{
event.setCancelled(true);
return;
}
if (item != null
&& prot.checkProtectionItems(AntiBuildConfig.alert_on_use, item.getTypeId())
&& !user.isAuthorized("essentials.protect.alerts.notrigger"))
{
prot.getEssentialsConnect().alert(user, item.getType().toString(), _("alertUsed"));
}
if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.interact") && !user.isAuthorized("essentials.build"))
{
if (!metaPermCheck(user, "interact", event.getClickedBlock()))
{
event.setUseInteractedBlock(Result.DENY);
if (ess.getSettings().warnOnBuildDisallow())
{
user.sendMessage(_("buildAlert"));
}
}
if (event.hasItem() && !metaPermCheck(user, "use", event.getItem().getTypeId(), event.getItem().getData().getData()))
{
event.setUseItemInHand(Result.DENY);
}
}
}
}

View File

@ -0,0 +1,80 @@
package com.earth2me.essentials.antibuild;
import com.earth2me.essentials.IConf;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.User;
import static com.earth2me.essentials.I18n._;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public class EssentialsConnect
{
private static final Logger LOGGER = Logger.getLogger("Minecraft");
private final transient IEssentials ess;
private final transient IAntiBuild protect;
public EssentialsConnect(Plugin essPlugin, Plugin essProtect)
{
if (!essProtect.getDescription().getVersion().equals(essPlugin.getDescription().getVersion()))
{
LOGGER.log(Level.WARNING, _("versionMismatchAll"));
}
ess = (IEssentials)essPlugin;
protect = (IAntiBuild)essProtect;
AntiBuildReloader pr = new AntiBuildReloader();
pr.reloadConfig();
ess.addReloadListener(pr);
}
public void onDisable()
{
}
public IEssentials getEssentials()
{
return ess;
}
public void alert(final User user, final String item, final String type)
{
final Location loc = user.getLocation();
final String warnMessage = _("alertFormat", user.getName(), type, item,
loc.getWorld().getName() + "," + loc.getBlockX() + ","
+ loc.getBlockY() + "," + loc.getBlockZ());
LOGGER.log(Level.WARNING, warnMessage);
for (Player p : ess.getServer().getOnlinePlayers())
{
final User alertUser = ess.getUser(p);
if (alertUser.isAuthorized("essentials.protect.alerts"))
{
alertUser.sendMessage(warnMessage);
}
}
}
private class AntiBuildReloader implements IConf
{
@Override
public void reloadConfig()
{
for (AntiBuildConfig protectConfig : AntiBuildConfig.values())
{
if (protectConfig.isList())
{
protect.getSettingsList().put(protectConfig, ess.getSettings().getProtectList(protectConfig.getConfigName()));
}
else
{
protect.getSettingsBoolean().put(protectConfig, ess.getSettings().getProtectBoolean(protectConfig.getConfigName(), protectConfig.getDefaultValueBoolean()));
}
}
}
}
}

View File

@ -0,0 +1,19 @@
package com.earth2me.essentials.antibuild;
import java.util.List;
import java.util.Map;
import org.bukkit.plugin.Plugin;
public interface IAntiBuild extends Plugin
{
boolean checkProtectionItems(final AntiBuildConfig list, final int id);
boolean getSettingBool(final AntiBuildConfig protectConfig);
EssentialsConnect getEssentialsConnect();
Map<AntiBuildConfig, Boolean> getSettingsBoolean();
Map<AntiBuildConfig, List<Integer>> getSettingsList();
}

View File

@ -0,0 +1,9 @@
# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.)
name: EssentialsAntiBuild
main: com.earth2me.essentials.antibuild.EssentialsAntiBuild
# Note to developers: This next line cannot change, or the automatic versioning system will break.
version: TeamCity
website: http://www.earth2me.net:8001/
description: Provides build protection.
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits]
softdepend: [Essentials]

View File

@ -172,7 +172,7 @@ public abstract class EssentialsChatPlayer implements Listener
}
}
String message = String.format(event.getFormat(), type.concat(sender.getDisplayName()), event.getMessage());
String message = type.concat(String.format(event.getFormat(), sender.getDisplayName(), event.getMessage()));
synchronized (listeners)
{
for (Map.Entry<String, IEssentialsChatListener> listener : listeners.entrySet())

View File

@ -2,7 +2,6 @@ package com.earth2me.essentials.protect;
import com.earth2me.essentials.IConf;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.User;
import com.earth2me.essentials.protect.data.ProtectedBlockMemory;
import com.earth2me.essentials.protect.data.ProtectedBlockMySQL;
import com.earth2me.essentials.protect.data.ProtectedBlockSQLite;
@ -10,8 +9,6 @@ import java.beans.PropertyVetoException;
import static com.earth2me.essentials.I18n._;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
@ -43,23 +40,6 @@ public class EssentialsConnect
return ess;
}
public void alert(final User user, final String item, final String type)
{
final Location loc = user.getLocation();
final String warnMessage = _("alertFormat", user.getName(), type, item,
loc.getWorld().getName() + "," + loc.getBlockX() + ","
+ loc.getBlockY() + "," + loc.getBlockZ());
LOGGER.log(Level.WARNING, warnMessage);
for (Player p : ess.getServer().getOnlinePlayers())
{
final User alertUser = ess.getUser(p);
if (alertUser.isAuthorized("essentials.protect.alerts"))
{
alertUser.sendMessage(warnMessage);
}
}
}
private class ProtectReloader implements IConf
{

View File

@ -73,13 +73,6 @@ public class EssentialsProtect extends JavaPlugin implements IProtect
LOGGER.log(Level.SEVERE, "Essentials not installed or failed to load. Essenials Protect is in emergency mode now.");
}
@Override
public boolean checkProtectionItems(final ProtectConfig list, final int id)
{
final List<Integer> itemList = settingsList.get(list);
return itemList != null && !itemList.isEmpty() && itemList.contains(id);
}
@Override
public IProtectedBlock getStorage()
{

View File

@ -1,6 +1,5 @@
package com.earth2me.essentials.protect;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.User;
import com.earth2me.essentials.protect.data.IProtectedBlock;
@ -36,26 +35,9 @@ public class EssentialsProtectBlockListener implements Listener
final User user = ess.getUser(event.getPlayer());
if (prot.getSettingBool(ProtectConfig.disable_build) && !user.canBuild())
{
event.setCancelled(true);
return;
}
final Block blockPlaced = event.getBlockPlaced();
final int id = blockPlaced.getTypeId();
if (prot.checkProtectionItems(ProtectConfig.blacklist_placement, id) && !user.isAuthorized("essentials.protect.exemptplacement"))
{
event.setCancelled(true);
return;
}
if (!user.hasPermission("essentials.protect.alerts.notrigger")
&& prot.checkProtectionItems(ProtectConfig.alert_on_placement, id))
{
prot.getEssentialsConnect().alert(user, blockPlaced.getType().toString(), _("alertPlaced"));
}
final Block below = blockPlaced.getRelative(BlockFace.DOWN);
if ((below.getType() == Material.RAILS || below.getType() == Material.POWERED_RAIL || below.getType() == Material.DETECTOR_RAIL)
@ -234,27 +216,11 @@ public class EssentialsProtectBlockListener implements Listener
}
final User user = ess.getUser(event.getPlayer());
if (prot.getSettingBool(ProtectConfig.disable_build) && !user.canBuild())
{
event.setCancelled(true);
return;
}
final Block block = event.getBlock();
final int typeId = block.getTypeId();
if (prot.checkProtectionItems(ProtectConfig.blacklist_break, typeId)
&& !user.isAuthorized("essentials.protect.exemptbreak"))
{
event.setCancelled(true);
return;
}
final Material type = block.getType();
if (!user.hasPermission("essentials.protect.alerts.notrigger")
&& prot.checkProtectionItems(ProtectConfig.alert_on_break, typeId))
{
prot.getEssentialsConnect().alert(user, type.toString(), _("alertBroke"));
}
final IProtectedBlock storage = prot.getStorage();
if (user.isAuthorized("essentials.protect.admin"))
@ -333,11 +299,6 @@ public class EssentialsProtectBlockListener implements Listener
}
for (Block block : event.getBlocks())
{
if (prot.checkProtectionItems(ProtectConfig.blacklist_piston, block.getTypeId()))
{
event.setCancelled(true);
return;
}
if ((block.getRelative(BlockFace.UP).getType() == Material.RAILS
|| block.getType() == Material.RAILS
|| block.getRelative(BlockFace.UP).getType() == Material.POWERED_RAIL
@ -385,11 +346,6 @@ public class EssentialsProtectBlockListener implements Listener
return;
}
final Block block = event.getRetractLocation().getBlock();
if (prot.checkProtectionItems(ProtectConfig.blacklist_piston, block.getTypeId()))
{
event.setCancelled(true);
return;
}
if ((block.getRelative(BlockFace.UP).getType() == Material.RAILS
|| block.getType() == Material.RAILS
|| block.getRelative(BlockFace.UP).getType() == Material.POWERED_RAIL

View File

@ -3,14 +3,12 @@ package com.earth2me.essentials.protect;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.User;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
public class EssentialsProtectPlayerListener implements Listener
@ -30,38 +28,6 @@ public class EssentialsProtectPlayerListener implements Listener
// Do not return if cancelled, because the interact event has 2 cancelled states.
final User user = ess.getUser(event.getPlayer());
if (event.hasItem()
&& (event.getItem().getType() == Material.WATER_BUCKET
|| event.getItem().getType() == Material.LAVA_BUCKET)
&& prot.getSettingBool(ProtectConfig.disable_build) && !user.canBuild())
{
if (ess.getSettings().warnOnBuildDisallow())
{
user.sendMessage(_("buildAlert"));
}
event.setCancelled(true);
return;
}
if (prot.getSettingBool(ProtectConfig.disable_use) && !user.canBuild())
{
if (ess.getSettings().warnOnBuildDisallow())
{
user.sendMessage(_("buildAlert"));
}
event.setCancelled(true);
return;
}
final ItemStack item = event.getItem();
if (item != null
&& prot.checkProtectionItems(ProtectConfig.blacklist_usage, item.getTypeId())
&& !user.isAuthorized("essentials.protect.exemptusage"))
{
event.setCancelled(true);
return;
}
if (user.isAuthorized("essentials.protect.ownerinfo") && event.getAction() == Action.RIGHT_CLICK_BLOCK)
{
final StringBuilder stringBuilder = new StringBuilder();
@ -82,11 +48,5 @@ public class EssentialsProtectPlayerListener implements Listener
user.sendMessage(_("protectionOwner", ownerNames));
}
}
if (item != null
&& !user.hasPermission("essentials.protect.alerts.notrigger")
&& prot.checkProtectionItems(ProtectConfig.alert_on_use, item.getTypeId()))
{
prot.getEssentialsConnect().alert(user, item.getType().toString(), _("alertUsed"));
}
}
}

View File

@ -8,8 +8,6 @@ import org.bukkit.plugin.Plugin;
public interface IProtect extends Plugin
{
boolean checkProtectionItems(final ProtectConfig list, final int id);
boolean getSettingBool(final ProtectConfig protectConfig);
String getSettingString(final ProtectConfig protectConfig);

View File

@ -10,8 +10,6 @@ public enum ProtectConfig
memstore("protect.memstore", false),
disable_contactdmg("protect.disable.contactdmg", false),
disable_lavadmg("protect.disable.lavadmg", false),
disable_build("protect.disable.build", true),
disable_use("protect.disable.use", true),
disable_pvp("protect.disable.pvp", false),
disable_projectiles("protect.disable.projectiles", false),
disable_fall("protect.disable.fall", false),
@ -47,14 +45,7 @@ public enum ProtectConfig
protect_below_rails("protect.protect.block-below", true),
protect_signs("protect.protect.signs", true),
protect_against_signs("protect.protect.block-below", true),
enderdragon_fakeexplosions("protect.enderdragon-fakeexplosions", false),
alert_on_placement("protect.alert.on-placement"),
alert_on_use("protect.alert.on-use"),
alert_on_break("protect.alert.on-break"),
blacklist_placement("protect.blacklist.placement"),
blacklist_usage("protect.blacklist.usage"),
blacklist_break("protect.blacklist.break"),
blacklist_piston("protect.blacklist.piston");
enderdragon_fakeexplosions("protect.enderdragon-fakeexplosions", false);
private final String configName;
private final String defValueString;
private final boolean defValueBoolean;

View File

@ -1,8 +0,0 @@
build.xml.data.CRC32=fd4b98a9
build.xml.script.CRC32=334f342d
build.xml.stylesheet.CRC32=28e38971@1.44.1.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=fd4b98a9
nbproject/build-impl.xml.script.CRC32=966cfa4e
nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46

View File

@ -1 +0,0 @@
DoNotUseThreads

View File

@ -1,39 +0,0 @@
package com.earth2me.essentials.update;
import org.bukkit.plugin.Plugin;
public abstract class AbstractWorkListener
{
public AbstractWorkListener(final Plugin plugin, final VersionInfo newVersionInfo)
{
this.plugin = plugin;
this.newVersionInfo = newVersionInfo;
}
private final transient Plugin plugin;
private final transient VersionInfo newVersionInfo;
public final void onWorkAbort()
{
onWorkAbort(null);
}
public abstract void onWorkAbort(String message);
public final void onWorkDone()
{
onWorkDone(null);
}
public abstract void onWorkDone(String message);
public VersionInfo getNewVersionInfo()
{
return newVersionInfo;
}
public Plugin getPlugin()
{
return plugin;
}
}

View File

@ -1,171 +0,0 @@
package com.earth2me.essentials.update;
import com.earth2me.essentials.update.chat.*;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
public class EssentialsHelp implements Listener
{
private transient Player chatUser;
private final transient Server server;
private final transient Plugin plugin;
private transient IrcBot ircBot;
private final transient Map<String, Command> commands = new HashMap<String, Command>();
public EssentialsHelp(final Plugin plugin)
{
super();
this.plugin = plugin;
this.server = plugin.getServer();
commands.put("!help", new HelpCommand());
commands.put("!list", new ListCommand());
commands.put("!startup", new StartupCommand(plugin));
commands.put("!errors", new ErrorsCommand(plugin));
commands.put("!config", new ConfigCommand(plugin));
}
public void registerEvents()
{
final PluginManager pluginManager = server.getPluginManager();
pluginManager.registerEvents(this, plugin);
}
public void onCommand(final CommandSender sender)
{
if (sender instanceof Player && sender.hasPermission("essentials.helpchat"))
{
if (chatUser == null)
{
chatUser = (Player)sender;
ircBot = null;
sender.sendMessage("You will be connected to the Essentials Help Chat.");
sender.sendMessage("All your chat messages will be forwarded to the channel. You can't chat with other players on your server while in help chat, but you can use commands.");
sender.sendMessage("Please be patient, if noone is available, check back later.");
sender.sendMessage("Type !help to get a list of all commands.");
sender.sendMessage("Type !quit to leave the channel.");
sender.sendMessage("Do you want to join the channel now? (yes/no)");
}
if (!chatUser.equals(sender))
{
sender.sendMessage("The player " + chatUser.getDisplayName() + " is already using the essentialshelp.");
}
}
else
{
sender.sendMessage("Please run the command as op from in game.");
}
}
public void onDisable()
{
closeConnection();
}
private boolean sendChatMessage(final Player player, final String message)
{
final String messageCleaned = message.trim();
if (messageCleaned.isEmpty())
{
return false;
}
if (ircBot == null)
{
return handleAnswer(messageCleaned, player);
}
else
{
if (ircBot.isKicked())
{
closeConnection();
return false;
}
final String lowMessage = messageCleaned.toLowerCase(Locale.ENGLISH);
if (lowMessage.startsWith("!quit"))
{
closeConnection();
player.sendMessage("Connection closed.");
return true;
}
if (!ircBot.isConnected() || ircBot.getChannels().length == 0)
{
return false;
}
if (handleCommands(lowMessage, player))
{
return true;
}
ircBot.sendMessage(messageCleaned);
chatUser.sendMessage("§6" + ircBot.getNick() + ": §7" + messageCleaned);
return true;
}
}
private void closeConnection()
{
chatUser = null;
if (ircBot != null)
{
ircBot.quit();
ircBot = null;
}
}
private boolean handleAnswer(final String message, final Player player)
{
if (message.equalsIgnoreCase("yes"))
{
player.sendMessage("Connecting...");
connectToIRC(player);
return true;
}
if (message.equalsIgnoreCase("no") || message.equalsIgnoreCase("!quit"))
{
chatUser = null;
return true;
}
return false;
}
private boolean handleCommands(final String lowMessage, final Player player)
{
final String[] parts = lowMessage.split(" ");
if (commands.containsKey(parts[0]))
{
commands.get(parts[0]).run(ircBot, player);
return true;
}
return false;
}
private void connectToIRC(final Player player)
{
ircBot = new IrcBot(player, "Ess_" + player.getName(), UsernameUtil.createUsername(player));
}
@EventHandler
public void onPlayerChat(final AsyncPlayerChatEvent event)
{
if (event.getPlayer() == chatUser)
{
final boolean success = sendChatMessage(event.getPlayer(), event.getMessage());
event.setCancelled(success);
}
}
@EventHandler
public void onPlayerQuit(final PlayerQuitEvent event)
{
closeConnection();
}
}

View File

@ -1,61 +0,0 @@
package com.earth2me.essentials.update;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
public class EssentialsUpdate extends JavaPlugin
{
private transient EssentialsHelp essentialsHelp;
private transient UpdateProcess updateProcess;
@Override
public void onEnable()
{
if (!getDataFolder().exists() && !getDataFolder().mkdirs())
{
Bukkit.getLogger().log(Level.SEVERE, "Could not create data folder: {0}", getDataFolder().getPath());
}
essentialsHelp = new EssentialsHelp(this);
essentialsHelp.registerEvents();
final UpdateCheck updateCheck = new UpdateCheck(this);
updateCheck.checkForUpdates();
updateProcess = new UpdateProcess(this, updateCheck);
updateProcess.registerEvents();
Bukkit.getLogger().log(Level.INFO, "EssentialsUpdate {0} loaded.", getDescription().getVersion());
if (updateCheck.isEssentialsInstalled())
{
updateCheck.scheduleUpdateTask();
}
else
{
Bukkit.getLogger().info("Essentials is ready for installation. Join the game and follow the instructions.");
}
}
@Override
public void onDisable()
{
essentialsHelp.onDisable();
}
@Override
public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args)
{
if (command.getName().equalsIgnoreCase("essentialsupdate"))
{
updateProcess.onCommand(sender);
}
if (command.getName().equalsIgnoreCase("essentialshelp"))
{
essentialsHelp.onCommand(sender);
}
return true;
}
}

View File

@ -1,113 +0,0 @@
package com.earth2me.essentials.update;
import java.io.*;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import org.bukkit.Bukkit;
public class GetFile
{
private transient URLConnection connection;
private transient MessageDigest digest;
public GetFile(final String urlString) throws MalformedURLException, IOException
{
this(new URL(urlString));
}
public GetFile(final URL url) throws IOException
{
this.connection = url.openConnection();
this.connection.setConnectTimeout(1000);
this.connection.setReadTimeout(5000);
this.connection.setUseCaches(false);
this.connection.connect();
final int respCode = ((HttpURLConnection)this.connection).getResponseCode();
if (respCode >= 300 && respCode < 400 && this.connection.getHeaderField("Location") != null)
{
connection.getInputStream().close();
final URL redirect = new URL(this.connection.getHeaderField("Location"));
this.connection = redirect.openConnection();
this.connection.setConnectTimeout(1000);
this.connection.setReadTimeout(5000);
this.connection.setUseCaches(false);
this.connection.connect();
}
}
public void saveTo(final File file) throws IOException
{
try
{
saveTo(file, null);
}
catch (NoSuchAlgorithmException ex)
{
throw new RuntimeException(ex);
}
}
public void saveTo(final File file, final String key) throws IOException, NoSuchAlgorithmException
{
if (key != null)
{
digest = MessageDigest.getInstance("SHA256");
}
final byte[] buffer = new byte[1024 * 8];
boolean brokenFile = false;
final BufferedInputStream input = new BufferedInputStream(connection.getInputStream());
try
{
final BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file));
try
{
int length;
do
{
length = input.read(buffer);
if (length >= 0)
{
if (key != null)
{
digest.update(buffer, 0, length);
}
output.write(buffer, 0, length);
}
}
while (length >= 0);
if (key != null)
{
final byte[] checksum = digest.digest();
final String checksumString = new BigInteger(checksum).toString(36);
if (!checksumString.equals(key))
{
brokenFile = true;
}
}
}
finally
{
output.close();
}
if (brokenFile && !file.delete())
{
Bukkit.getLogger().log(Level.SEVERE, "Could not delete file {0}", file.getPath());
}
}
finally
{
input.close();
}
if (brokenFile)
{
throw new IOException("Checksum check failed.");
}
}
}

View File

@ -1,35 +0,0 @@
package com.earth2me.essentials.update;
import java.net.MalformedURLException;
import java.net.URL;
import org.bukkit.configuration.Configuration;
public class ModuleInfo
{
private final transient String url;
private final transient String version;
private final transient String hash;
public ModuleInfo(final Configuration updateConfig, final String path)
{
url = updateConfig.getString(path + ".url", null);
version = updateConfig.getString(path + ".version", null);
hash = updateConfig.getString(path + ".hash", null);
}
public URL getUrl() throws MalformedURLException
{
return new URL(url);
}
public String getVersion()
{
return version;
}
public String getHash()
{
return hash;
}
}

View File

@ -1,40 +0,0 @@
package com.earth2me.essentials.update;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PastieUpload
{
private final transient PostToUrl connection;
public PastieUpload() throws MalformedURLException
{
connection = new PostToUrl(new URL("http://pastie.org/pastes"));
}
public String send(final String data) throws IOException
{
final Map<String, Object> map = new HashMap<String, Object>();
map.put("paste[parser_id]", "19");
map.put("paste[authorization]", "burger");
map.put("paste[body]", data);
map.put("paste[restricted]", "1");
final String html = connection.send(map);
final Matcher matcher = Pattern.compile("(?s).*\\?key=([a-z0-9]+).*").matcher(html);
if (matcher.matches())
{
final String key = matcher.group(1);
return "http://pastie.org/private/" + key;
}
else
{
throw new IOException("Failed to upload to pastie.org");
}
}
}

View File

@ -1,66 +0,0 @@
package com.earth2me.essentials.update;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Random;
public class PostToUrl
{
private final transient URL url;
private final transient String boundary;
private final transient Random random = new Random();
private final static String CRLF = "\r\n";
private final static Charset UTF8 = Charset.forName("utf-8");
public PostToUrl(final URL url)
{
this.url = url;
final byte[] bytes = new byte[32];
random.nextBytes(bytes);
this.boundary = "----------" + new BigInteger(bytes).toString(Character.MAX_RADIX) + "_$";
}
public String send(final Map<String, Object> data) throws IOException
{
final URLConnection connection = url.openConnection();
connection.setRequestProperty("content-type", "multipart/form-data; boundary=" + boundary);
final StringBuilder dataBuilder = new StringBuilder();
for (Map.Entry<String, Object> entry : data.entrySet())
{
if (entry.getValue() instanceof String)
{
dataBuilder.append("--").append(boundary).append(CRLF);
dataBuilder.append("Content-Disposition: form-data; name=\"").append(entry.getKey()).append('"').append(CRLF);
dataBuilder.append(CRLF);
dataBuilder.append(entry.getValue()).append(CRLF);
}
// TODO: Add support for file upload
}
dataBuilder.append("--").append(boundary).append("--").append(CRLF);
dataBuilder.append(CRLF);
connection.setDoOutput(true);
final byte[] message = dataBuilder.toString().getBytes(UTF8);
connection.setRequestProperty("content-length", Integer.toString(message.length));
connection.connect();
final OutputStream stream = connection.getOutputStream();
stream.write(message);
stream.close();
final BufferedReader page = new BufferedReader(new InputStreamReader(connection.getInputStream(), UTF8));
final StringBuilder input = new StringBuilder();
String line;
while ((line = page.readLine()) != null)
{
input.append(line).append("\n");
}
page.close();
return input.toString();
}
}

View File

@ -1,202 +0,0 @@
package com.earth2me.essentials.update;
import java.io.File;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
public class UpdateCheck
{
private transient CheckResult result = CheckResult.UNKNOWN;
private transient Version currentVersion;
private transient Version newVersion = null;
private transient int bukkitResult = 0;
private transient UpdateFile updateFile;
private final static int CHECK_INTERVAL = 20 * 60 * 60 * 6;
private final transient Plugin plugin;
private transient boolean essentialsInstalled;
public UpdateCheck(final Plugin plugin)
{
this.plugin = plugin;
updateFile = new UpdateFile(plugin);
checkForEssentials();
}
private void checkForEssentials()
{
final PluginManager pluginManager = plugin.getServer().getPluginManager();
final Plugin essentials = pluginManager.getPlugin("Essentials");
essentialsInstalled = essentials != null;
if (essentialsInstalled)
{
currentVersion = new Version(essentials.getDescription().getVersion());
}
else
{
if (new File(plugin.getDataFolder().getParentFile(), "Essentials.jar").exists())
{
Bukkit.getLogger().severe("Essentials.jar found, but not recognized by Bukkit. Broken download?");
}
}
}
public void scheduleUpdateTask()
{
plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable()
{
@Override
public void run()
{
updateFile = new UpdateFile(plugin);
checkForUpdates();
}
}, CHECK_INTERVAL, CHECK_INTERVAL);
}
public boolean isEssentialsInstalled()
{
return essentialsInstalled;
}
public CheckResult getResult()
{
return result;
}
public int getNewBukkitVersion()
{
return bukkitResult;
}
public VersionInfo getNewVersionInfo()
{
return updateFile.getVersions().get(newVersion);
}
public enum CheckResult
{
NEW_ESS, NEW_ESS_BUKKIT, NEW_BUKKIT, OK, UNKNOWN
}
public void checkForUpdates()
{
if (currentVersion == null)
{
return;
}
final Map<Version, VersionInfo> versions = updateFile.getVersions();
final int bukkitVersion = getBukkitVersion();
Version higher = null;
Version found = null;
Version lower = null;
int bukkitHigher = 0;
int bukkitLower = 0;
for (Entry<Version, VersionInfo> entry : versions.entrySet())
{
final int minBukkit = entry.getValue().getMinBukkit();
final int maxBukkit = entry.getValue().getMaxBukkit();
if (minBukkit == 0 || maxBukkit == 0)
{
continue;
}
if (bukkitVersion <= maxBukkit)
{
if (bukkitVersion < minBukkit)
{
if (higher == null || higher.compareTo(entry.getKey()) < 0)
{
higher = entry.getKey();
bukkitHigher = minBukkit;
}
}
else
{
if (found == null || found.compareTo(entry.getKey()) < 0)
{
found = entry.getKey();
}
}
}
else
{
if (lower == null || lower.compareTo(entry.getKey()) < 0)
{
lower = entry.getKey();
bukkitLower = minBukkit;
}
}
}
if (found != null)
{
if (found.compareTo(currentVersion) > 0)
{
result = CheckResult.NEW_ESS;
newVersion = found;
}
else
{
result = CheckResult.OK;
}
}
else if (higher != null)
{
if (higher.compareTo(currentVersion) > 0)
{
newVersion = higher;
result = CheckResult.NEW_ESS_BUKKIT;
bukkitResult = bukkitHigher;
}
else if (higher.compareTo(currentVersion) < 0)
{
result = CheckResult.UNKNOWN;
}
else
{
result = CheckResult.NEW_BUKKIT;
bukkitResult = bukkitHigher;
}
}
else if (lower != null)
{
if (lower.compareTo(currentVersion) > 0)
{
result = CheckResult.NEW_ESS_BUKKIT;
newVersion = lower;
bukkitResult = bukkitLower;
}
else if (lower.compareTo(currentVersion) < 0)
{
result = CheckResult.UNKNOWN;
}
else
{
result = CheckResult.NEW_BUKKIT;
bukkitResult = bukkitLower;
}
}
}
private int getBukkitVersion()
{
final Matcher versionMatch = Pattern.compile("git-Bukkit-([0-9]+).([0-9]+).([0-9]+)-[0-9]+-[0-9a-z]+-b([0-9]+)jnks.*").matcher(plugin.getServer().getVersion());
if (versionMatch.matches())
{
return Integer.parseInt(versionMatch.group(4));
}
throw new NumberFormatException("Bukkit Version changed!");
}
public Version getNewVersion()
{
return newVersion;
}
}

View File

@ -1,205 +0,0 @@
package com.earth2me.essentials.update;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
public class UpdateFile
{
private final static Logger LOGGER = Bukkit.getLogger();
private final static String UPDATE_URL = "http://goo.gl/67jev";
private final static BigInteger PUBLIC_KEY = new BigInteger("5ha6a2d4qdy17ttkg8evh74sl5a87djojwenu12k1lvy8ui6003e6l06rntczpoh99mhc3txj8mqlxw111oyy9yl7s7qpyluyzix3j1odxrxx4u52gxvyu6qiteapczkzvi7rxgeqsozz7b19rdx73a7quo9ybwpz1cr82r7x5k0pg2a73pjjsv2j1awr13azo7klrcxp9y5xxwf5qv1s3tw4zqftli18u0ek5qkbzfbgk1v5n2f11pkwwk6p0mibrn26wnjbv11vyiqgu95o7busmt6vf5q7grpcenl637w83mbin56s3asj1131b2mscj9xep3cbj7la9tgsxl5bj87vzy8sk2d34kzwqdqgh9nry43nqqus12l1stmiv184r8r3jcy8w43e8h1u1mzklldb5eytkuhayqik8l3ns04hwt8sgacvw534be8sx26qrn5s1", 36);
private final transient File file;
private transient YamlConfiguration updateConfig;
private final transient Plugin plugin;
private final transient TreeMap<Version, VersionInfo> versions = new TreeMap<Version, VersionInfo>();
public UpdateFile(final Plugin plugin)
{
this.plugin = plugin;
final long lastUpdate = Long.parseLong(plugin.getConfig().getString("lastupdate", "0"));
file = new File(plugin.getDataFolder(), "update.yml");
if (lastUpdate < System.currentTimeMillis() - 1000 * 60 * 60 * 6 || !file.exists())
{
if (file.exists() && !file.delete())
{
LOGGER.log(Level.SEVERE, "Could not delete file update.yml!");
return;
}
if (!downloadFile() || !checkFile())
{
LOGGER.log(Level.SEVERE, "Could not download and verify file update.yml!");
return;
}
}
try
{
readVersions();
}
catch (Exception ex)
{
LOGGER.log(Level.SEVERE, "Could not load update.yml!");
return;
}
}
private boolean downloadFile()
{
GetFile getFile;
try
{
getFile = new GetFile(UPDATE_URL);
getFile.saveTo(file);
plugin.getConfig().set("lastupdate", System.currentTimeMillis());
plugin.getConfig().save(new File(plugin.getDataFolder(), "config.yml"));
return true;
}
catch (IOException ex)
{
LOGGER.log(Level.SEVERE, "Error while downloading update.yml", ex);
return false;
}
}
private boolean checkFile()
{
BufferedInputStream bis = null;
try
{
bis = new BufferedInputStream(new FileInputStream(file));
if (bis.read() != '#')
{
throw new IOException("File has to start with #");
}
final StringBuilder length = new StringBuilder();
final StringBuilder signature = new StringBuilder();
boolean isSignature = false;
do
{
final int cur = bis.read();
if (cur == -1)
{
break;
}
if (cur == ':')
{
isSignature = true;
}
else if (cur == '\n')
{
break;
}
else if ((cur >= '0' && cur <= '9')
|| (cur >= 'a' && cur <= 'z'))
{
if (isSignature)
{
signature.append((char)cur);
}
else
{
length.append((char)cur);
}
}
else
{
throw new IOException("Illegal character in signature!");
}
}
while (true);
if (length.length() == 0 || signature.length() == 0)
{
throw new IOException("Broken signature!");
}
final int sigLength = new BigInteger(length.toString(), 36).intValue();
if (sigLength < 0 || sigLength > 2048)
{
throw new IOException("Invalid signature length!");
}
final byte[] sigBytes = new BigInteger(signature.toString(), 36).toByteArray();
if (sigLength < sigBytes.length)
{
throw new IOException("Length is less then available bytes.");
}
byte[] realBytes;
if (sigLength == sigBytes.length)
{
realBytes = sigBytes;
}
else
{
realBytes = new byte[sigLength];
System.arraycopy(sigBytes, 0, realBytes, sigLength - sigBytes.length, sigBytes.length);
}
final X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(PUBLIC_KEY.toByteArray());
final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
final PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
final Signature rsa = Signature.getInstance("SHA256withRSA");
rsa.initVerify(pubKey);
final byte[] buffer = new byte[2048];
int readLength;
do
{
readLength = bis.read(buffer);
if (readLength >= 0)
{
rsa.update(buffer, 0, readLength);
}
}
while (readLength >= 0);
return rsa.verify(realBytes);
}
catch (Exception ex)
{
LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
}
finally
{
try
{
if (bis != null)
{
bis.close();
}
}
catch (IOException ex)
{
LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
}
}
return false;
}
private void readVersions() throws Exception
{
updateConfig = new YamlConfiguration();
updateConfig.load(file);
versions.clear();
for (String versionString : updateConfig.getKeys(false))
{
final Version version = new Version(versionString);
final VersionInfo info = new VersionInfo(updateConfig, versionString);
versions.put(version, info);
}
}
public Map<Version, VersionInfo> getVersions()
{
return Collections.unmodifiableMap(versions.descendingMap());
}
}

View File

@ -1,199 +0,0 @@
package com.earth2me.essentials.update;
import com.earth2me.essentials.update.states.InstallationFinishedEvent;
import com.earth2me.essentials.update.states.StateMachine;
import com.earth2me.essentials.update.tasks.SelfUpdate;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.Plugin;
public class UpdateProcess implements Listener
{
private transient Player currentPlayer;
private final transient Plugin plugin;
private final transient UpdateCheck updateCheck;
private transient StateMachine stateMachine;
public UpdateProcess(final Plugin plugin, final UpdateCheck updateCheck)
{
super();
this.plugin = plugin;
this.updateCheck = updateCheck;
}
public void registerEvents()
{
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
public boolean selfUpdate()
{
if (new Version(plugin.getDescription().getVersion()).compareTo(updateCheck.getNewVersion()) < 0)
{
if (currentPlayer != null)
{
currentPlayer.sendMessage("A newer version of EssentialsUpdate is found. Downloading new file and reloading server.");
}
Bukkit.getLogger().log(Level.INFO, "A newer version of EssentialsUpdate is found. Downloading new file and reloading server.");
new SelfUpdate(new AbstractWorkListener(plugin, updateCheck.getNewVersionInfo())
{
@Override
public void onWorkAbort(final String message)
{
if (message != null && !message.isEmpty()
&& UpdateProcess.this.currentPlayer != null
&& UpdateProcess.this.currentPlayer.isOnline())
{
UpdateProcess.this.currentPlayer.sendMessage(message);
}
if (message != null && !message.isEmpty())
{
Bukkit.getLogger().log(Level.SEVERE, message);
}
UpdateProcess.this.currentPlayer = null;
}
@Override
public void onWorkDone(final String message)
{
if (message != null && !message.isEmpty()
&& UpdateProcess.this.currentPlayer != null
&& UpdateProcess.this.currentPlayer.isOnline())
{
UpdateProcess.this.currentPlayer.sendMessage(message);
}
if (message != null && !message.isEmpty())
{
Bukkit.getLogger().log(Level.INFO, message);
}
UpdateProcess.this.currentPlayer = null;
}
}).start();
return true;
}
if (updateCheck.getResult() == UpdateCheck.CheckResult.NEW_ESS_BUKKIT)
{
final String message = "Please update bukkit to version " + updateCheck.getNewBukkitVersion() + " before updating Essentials.";
if (currentPlayer != null)
{
currentPlayer.sendMessage(message);
}
Bukkit.getLogger().log(Level.INFO, message);
currentPlayer = null;
return true;
}
return false;
}
@EventHandler
public void onInstallationFinished(final InstallationFinishedEvent event)
{
UpdateProcess.this.currentPlayer = null;
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerChat(final AsyncPlayerChatEvent event)
{
if (event.getPlayer() == currentPlayer)
{
final StateMachine.MachineResult result = stateMachine.reactOnMessage(event.getMessage());
if (result == StateMachine.MachineResult.ABORT)
{
currentPlayer.sendMessage("Installation wizard aborted. You can restart it using /essentialsupdate.");
currentPlayer = null;
}
if (result == StateMachine.MachineResult.DONE)
{
startWork();
}
event.setCancelled(true);
return;
}
}
@EventHandler
public void onPlayerJoin(final PlayerJoinEvent event)
{
final Player player = event.getPlayer();
if (currentPlayer.getName().equals(player.getName()))
{
currentPlayer = player;
player.sendMessage("You quit the game, while the installation wizard was running.");
player.sendMessage("The installation wizard will now resume.");
player.sendMessage("You can exit the wizard by typing quit into the chat.");
stateMachine.resumeInstallation(player);
}
if (player.hasPermission("essentials.update") && !updateCheck.isEssentialsInstalled())
{
player.sendMessage("Hello " + player.getDisplayName());
player.sendMessage("Please type /essentialsupdate into the chat to start the installation of Essentials.");
}
if (player.hasPermission("essentials.update"))
{
final UpdateCheck.CheckResult result = updateCheck.getResult();
switch (result)
{
case NEW_ESS:
player.sendMessage("The new version " + updateCheck.getNewVersion().toString() + " for Essentials is available. Please type /essentialsupdate to update.");
break;
case NEW_BUKKIT:
player.sendMessage("Your bukkit version is not the recommended build for Essentials, please update to version " + updateCheck.getNewBukkitVersion() + ".");
break;
case NEW_ESS_BUKKIT:
player.sendMessage("There is a new version " + updateCheck.getNewVersion().toString() + " of Essentials for Bukkit " + updateCheck.getNewBukkitVersion());
break;
default:
}
}
}
public void onCommand(final CommandSender sender)
{
if (sender instanceof Player && sender.hasPermission("essentials.update"))
{
if (currentPlayer == null)
{
currentPlayer = (Player)sender;
if (selfUpdate())
{
return;
}
stateMachine = new StateMachine(plugin, currentPlayer, updateCheck);
final StateMachine.MachineResult result = stateMachine.askQuestion();
if (result == StateMachine.MachineResult.DONE)
{
startWork();
}
}
if (!currentPlayer.equals(sender))
{
sender.sendMessage("The player " + currentPlayer.getDisplayName() + " is already using the wizard.");
}
}
else
{
sender.sendMessage("Please run the command as op from in game.");
}
}
private void startWork()
{
currentPlayer.sendMessage("Installation wizard done. Starting installation.");
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable()
{
@Override
public void run()
{
stateMachine.startWork();
}
});
}
}

View File

@ -1,173 +0,0 @@
package com.earth2me.essentials.update;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Version implements Comparable<Version>
{
public enum Type
{
STABLE, PREVIEW, DEVELOPER
}
public int getMajor()
{
return major;
}
public int getMinor()
{
return minor;
}
public int getBuild()
{
return build;
}
public Type getType()
{
return type;
}
private final transient int major;
private final transient int minor;
private final transient int build;
private final transient Type type;
public Version(final String versionString)
{
final Matcher matcher = Pattern.compile("(Pre|Dev)?([0-9]+)[_\\.]([0-9]+)[_\\.]([0-9]+).*").matcher(versionString);
if (!matcher.matches() || matcher.groupCount() < 4)
{
type = Type.DEVELOPER;
major = 99;
minor = build = 0;
return;
}
if (versionString.startsWith("Pre"))
{
type = Type.PREVIEW;
}
else if (versionString.startsWith("Dev"))
{
type = Type.DEVELOPER;
}
else
{
type = Type.STABLE;
}
major = Integer.parseInt(matcher.group(2));
minor = Integer.parseInt(matcher.group(3));
build = Integer.parseInt(matcher.group(4));
}
@Override
public int compareTo(final Version other)
{
int ret = 0;
if (other.getType() == Type.DEVELOPER && getType() != Type.DEVELOPER)
{
ret = -1;
}
else if (getType() == Type.DEVELOPER && other.getType() != Type.DEVELOPER)
{
ret = 1;
}
else if (other.getMajor() > getMajor())
{
ret = -1;
}
else if (getMajor() > other.getMajor())
{
ret = 1;
}
else if (other.getMinor() > getMinor())
{
ret = -1;
}
else if (getMinor() > other.getMinor())
{
ret = 1;
}
else if (other.getBuild() > getBuild())
{
ret = -1;
}
else if (getBuild() > other.getBuild())
{
ret = 1;
}
else if (other.getType() == Type.STABLE && getType() == Type.PREVIEW)
{
ret = -1;
}
else if (getType() == Type.STABLE && other.getType() == Type.PREVIEW)
{
ret = 1;
}
return ret;
}
@Override
public boolean equals(final Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final Version other = (Version)obj;
if (this.major != other.major)
{
return false;
}
if (this.minor != other.minor)
{
return false;
}
if (this.build != other.build)
{
return false;
}
if (this.type != other.type)
{
return false;
}
return true;
}
@Override
public int hashCode()
{
int hash = 5;
hash = 71 * hash + this.major;
hash = 71 * hash + this.minor;
hash = 71 * hash + this.build;
hash = 71 * hash + (this.type == null ? 0 : this.type.hashCode());
return hash;
}
@Override
public String toString()
{
final StringBuilder builder = new StringBuilder();
if (type == Type.DEVELOPER)
{
builder.append("Dev");
}
if (type == Type.PREVIEW)
{
builder.append("Pre");
}
builder.append(major);
builder.append('.');
builder.append(minor);
builder.append('.');
builder.append(build);
return builder.toString();
}
}

View File

@ -1,49 +0,0 @@
package com.earth2me.essentials.update;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.configuration.Configuration;
public class VersionInfo
{
private final transient List<String> changelog;
private final transient int minBukkit;
private final transient int maxBukkit;
private final transient Map<String, ModuleInfo> modules;
public VersionInfo(final Configuration updateConfig, final String path)
{
changelog = updateConfig.getStringList(path + ".changelog");
minBukkit = updateConfig.getInt(path + ".min-bukkit", 0);
maxBukkit = updateConfig.getInt(path + ".max-bukkit", 0);
modules = new HashMap<String, ModuleInfo>();
final String modulesPath = path + ".modules";
for (String module : updateConfig.getKeys(false))
{
modules.put(module, new ModuleInfo(updateConfig, modulesPath + module));
}
}
public List<String> getChangelog()
{
return Collections.unmodifiableList(changelog);
}
public int getMinBukkit()
{
return minBukkit;
}
public int getMaxBukkit()
{
return maxBukkit;
}
public Map<String, ModuleInfo> getModules()
{
return Collections.unmodifiableMap(modules);
}
}

View File

@ -1,73 +0,0 @@
package com.earth2me.essentials.update.chat;
import com.earth2me.essentials.update.PastieUpload;
import java.io.*;
import java.nio.charset.Charset;
import org.bukkit.plugin.Plugin;
public abstract class AbstractFileCommand implements Command
{
private final transient Plugin plugin;
private final static Charset UTF8 = Charset.forName("utf-8");
public AbstractFileCommand(final Plugin plugin)
{
this.plugin = plugin;
}
protected BufferedReader getServerLogReader() throws IOException
{
final File bukkitFolder = plugin.getDataFolder().getAbsoluteFile().getParentFile().getParentFile();
if (bukkitFolder == null || !bukkitFolder.exists())
{
throw new IOException("Bukkit folder not found.");
}
final File logFile = new File(bukkitFolder, "server.log");
if (!logFile.exists())
{
throw new IOException("Server log not found.");
}
final FileInputStream fis = new FileInputStream(logFile);
try
{
if (logFile.length() > 1000000)
{
fis.skip(logFile.length() - 1000000);
}
return new BufferedReader(new InputStreamReader(fis));
}
catch (IOException ex)
{
fis.close();
throw ex;
}
}
protected BufferedReader getPluginConfig(final String pluginName, final String fileName) throws IOException
{
final File configFolder = new File(plugin.getDataFolder().getAbsoluteFile().getParentFile(), pluginName);
if (!configFolder.exists())
{
throw new IOException(pluginName + " plugin folder not found.");
}
final File configFile = new File(configFolder, fileName);
if (!configFile.exists())
{
throw new IOException(pluginName + " plugin file " + fileName + " not found.");
}
return new BufferedReader(new InputStreamReader(new FileInputStream(configFile), UTF8));
}
protected String uploadToPastie(final StringBuilder input) throws IOException
{
if (input.length() > 15000)
{
input.delete(0, input.length() - 15000);
input.append("## Cropped after 15000 bytes");
}
final PastieUpload pastie = new PastieUpload();
return pastie.send(input.toString());
}
}

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