mirror of
https://github.com/essentials/Essentials.git
synced 2025-08-14 02:24:16 +02:00
Moved signs code to a new module
This commit is contained in:
74
EssentialsSigns/build.xml
Normal file
74
EssentialsSigns/build.xml
Normal file
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- 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.) -->
|
||||
<!-- By default, only the Clean and Build commands use this build script. -->
|
||||
<!-- Commands such as Run, Debug, and Test only use this build script if -->
|
||||
<!-- 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="EssentialsSigns" default="default" basedir=".">
|
||||
<description>Builds, tests, and runs the project EssentialsSigns.</description>
|
||||
<import file="nbproject/build-impl.xml"/>
|
||||
<!--
|
||||
|
||||
There exist several targets which are by default empty and which can be
|
||||
used for execution of your tasks. These targets are usually executed
|
||||
before and after some main targets. They are:
|
||||
|
||||
-pre-init: called before initialization of project properties
|
||||
-post-init: called after initialization of project properties
|
||||
-pre-compile: called before javac compilation
|
||||
-post-compile: called after javac compilation
|
||||
-pre-compile-single: called before javac compilation of single file
|
||||
-post-compile-single: called after javac compilation of single file
|
||||
-pre-compile-test: called before javac compilation of JUnit tests
|
||||
-post-compile-test: called after javac compilation of JUnit tests
|
||||
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||
-pre-jar: called before JAR building
|
||||
-post-jar: called after JAR building
|
||||
-post-clean: called after cleaning build products
|
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.)
|
||||
|
||||
Example of inserting an obfuscator after compilation could look like this:
|
||||
|
||||
<target name="-post-compile">
|
||||
<obfuscate>
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
</obfuscate>
|
||||
</target>
|
||||
|
||||
For list of available properties check the imported
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets.
|
||||
The targets of interest are:
|
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation
|
||||
-init-macrodef-junit: defines macro for junit execution
|
||||
-init-macrodef-debug: defines macro for class debugging
|
||||
-init-macrodef-java: defines macro for class execution
|
||||
-do-jar-with-manifest: JAR building (if you are using a manifest)
|
||||
-do-jar-without-manifest: JAR building (if you are not using a manifest)
|
||||
run: execution of project
|
||||
-javadoc-build: Javadoc generation
|
||||
test-report: JUnit report generation
|
||||
|
||||
An example of overriding the target for project execution could look like this:
|
||||
|
||||
<target name="run" depends="EssentialsSigns-impl.jar">
|
||||
<exec dir="bin" executable="launcher.exe">
|
||||
<arg file="${dist.jar}"/>
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
Notice that the overridden target depends on the jar target and not only on
|
||||
the compile target as the regular run target does. Again, for a list of available
|
||||
properties which you can use, check the target you are overriding in the
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
-->
|
||||
</project>
|
3
EssentialsSigns/manifest.mf
Normal file
3
EssentialsSigns/manifest.mf
Normal file
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
X-COMMENT: Main-Class will be added automatically by build
|
||||
|
1083
EssentialsSigns/nbproject/build-impl.xml
Normal file
1083
EssentialsSigns/nbproject/build-impl.xml
Normal file
File diff suppressed because it is too large
Load Diff
8
EssentialsSigns/nbproject/genfiles.properties
Normal file
8
EssentialsSigns/nbproject/genfiles.properties
Normal file
@@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=4bedf084
|
||||
build.xml.script.CRC32=560095e7
|
||||
build.xml.stylesheet.CRC32=28e38971@1.47.1.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=4bedf084
|
||||
nbproject/build-impl.xml.script.CRC32=154412d6
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=c12040a1@1.47.1.46
|
125
EssentialsSigns/nbproject/project.properties
Normal file
125
EssentialsSigns/nbproject/project.properties
Normal file
@@ -0,0 +1,125 @@
|
||||
annotation.processing.enabled=true
|
||||
annotation.processing.enabled.in.editor=false
|
||||
annotation.processing.run.all.processors=true
|
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
|
||||
application.title=EssentialsSigns
|
||||
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
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=2
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=120
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none
|
||||
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAnnotationArgs=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineArrayInit=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAssignment=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineBinaryOp=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineCallArgs=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineDisjunctiveCatchTypes=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineFor=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineImplements=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineMethodParams=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineParenthesized=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTernaryOp=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineThrows=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTryResources=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesAfterClassHeader=0
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesBeforeClass=2
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.classDeclBracePlacement=NEW_LINE
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.expand-tabs=false
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.importGroupsOrder=*
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indent-shift-width=4
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indentCasesFromSwitch=false
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.methodDeclBracePlacement=NEW_LINE
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.otherBracePlacement=NEW_LINE
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeCatchOnNewLine=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeElseOnNewLine=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeFinallyOnNewLine=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeWhileOnNewLine=true
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.separateImportGroups=false
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceAfterTypeCast=false
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaces-per-tab=4
|
||||
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.tab-size=4
|
||||
build.classes.dir=${build.dir}/classes
|
||||
build.classes.excludes=**/*.java,**/*.form
|
||||
# This directory is removed when the project is cleaned:
|
||||
build.dir=build
|
||||
build.generated.dir=${build.dir}/generated
|
||||
build.generated.sources.dir=${build.dir}/generated-sources
|
||||
# Only compile against the classpath explicitly listed here:
|
||||
build.sysclasspath=ignore
|
||||
build.test.classes.dir=${build.dir}/test/classes
|
||||
build.test.results.dir=${build.dir}/test/results
|
||||
# Uncomment to specify the preferred debugger connection transport:
|
||||
#debug.transport=dt_socket
|
||||
debug.classpath=\
|
||||
${run.classpath}
|
||||
debug.test.classpath=\
|
||||
${run.test.classpath}
|
||||
# This directory is removed when the project is cleaned:
|
||||
dist.dir=dist
|
||||
dist.jar=${dist.dir}/EssentialsSigns.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=false
|
||||
jar.index=${jnlp.enabled}
|
||||
javac.classpath=\
|
||||
${file.reference.bukkit.jar}:\
|
||||
${reference.Essentials.jar}
|
||||
# Space-separated list of extra javac options
|
||||
javac.compilerargs=
|
||||
javac.deprecation=false
|
||||
javac.processorpath=\
|
||||
${javac.classpath}
|
||||
javac.source=1.6
|
||||
javac.target=1.6
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
javac.test.processorpath=\
|
||||
${javac.test.classpath}
|
||||
javadoc.additionalparam=
|
||||
javadoc.author=false
|
||||
javadoc.encoding=${source.encoding}
|
||||
javadoc.noindex=false
|
||||
javadoc.nonavbar=false
|
||||
javadoc.notree=false
|
||||
javadoc.private=false
|
||||
javadoc.splitindex=true
|
||||
javadoc.use=true
|
||||
javadoc.version=false
|
||||
javadoc.windowtitle=
|
||||
jnlp.codebase.type=no.codebase
|
||||
jnlp.descriptor=application
|
||||
jnlp.enabled=false
|
||||
jnlp.mixed.code=default
|
||||
jnlp.offline-allowed=false
|
||||
jnlp.signed=false
|
||||
jnlp.signing=
|
||||
jnlp.signing.alias=
|
||||
jnlp.signing.keystore=
|
||||
main.class=
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
mkdist.disabled=false
|
||||
platform.active=default_platform
|
||||
project.Essentials=../Essentials
|
||||
reference.Essentials.jar=${project.Essentials}/dist/Essentials.jar
|
||||
run.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
# Space-separated list of JVM arguments used when running the project
|
||||
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
|
||||
# or test-sys-prop.name=value to set system properties for unit tests):
|
||||
run.jvmargs=
|
||||
run.test.classpath=\
|
||||
${javac.test.classpath}:\
|
||||
${build.test.classes.dir}
|
||||
source.encoding=UTF-8
|
||||
src.dir=src
|
||||
test.src.dir=test
|
28
EssentialsSigns/nbproject/project.xml
Normal file
28
EssentialsSigns/nbproject/project.xml
Normal file
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.java.j2seproject</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>EssentialsSigns</name>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
<test-roots>
|
||||
<root id="test.src.dir"/>
|
||||
</test-roots>
|
||||
</data>
|
||||
<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>
|
@@ -0,0 +1,517 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.*;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.block.SignChangeEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
|
||||
public class EssentialsSign
|
||||
{
|
||||
private static final Set<Material> EMPTY_SET = new HashSet<Material>();
|
||||
protected transient final String signName;
|
||||
|
||||
public EssentialsSign(final String signName)
|
||||
{
|
||||
this.signName = signName;
|
||||
}
|
||||
|
||||
public final boolean onSignCreate(final SignChangeEvent event, final IEssentials ess)
|
||||
{
|
||||
final ISign sign = new EventSign(event);
|
||||
final IUser user = ess.getUser(event.getPlayer());
|
||||
if (!(user.isAuthorized("essentials.signs." + signName.toLowerCase(Locale.ENGLISH) + ".create")
|
||||
|| user.isAuthorized("essentials.signs.create." + signName.toLowerCase(Locale.ENGLISH))))
|
||||
{
|
||||
// Return true, so other plugins can use the same sign title, just hope
|
||||
// they won't change it to §1[Signname]
|
||||
return true;
|
||||
}
|
||||
sign.setLine(0, _("signFormatFail", this.signName));
|
||||
try
|
||||
{
|
||||
final boolean ret = onSignCreate(sign, user, getUsername(user), ess);
|
||||
if (ret)
|
||||
{
|
||||
sign.setLine(0, getSuccessName());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
catch (ChargeException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
}
|
||||
catch (SignException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
}
|
||||
// Return true, so the player sees the wrong sign.
|
||||
return true;
|
||||
}
|
||||
|
||||
public String getSuccessName()
|
||||
{
|
||||
return _("signFormatSuccess", this.signName);
|
||||
}
|
||||
|
||||
public String getTemplateName()
|
||||
{
|
||||
return _("signFormatTemplate", this.signName);
|
||||
}
|
||||
|
||||
private String getUsername(final IUser user)
|
||||
{
|
||||
return user.getName().substring(0, user.getName().length() > 13 ? 13 : user.getName().length());
|
||||
}
|
||||
|
||||
public final boolean onSignInteract(final Block block, final Player player, final IEssentials ess)
|
||||
{
|
||||
final ISign sign = new BlockSign(block);
|
||||
final IUser user = ess.getUser(player);
|
||||
try
|
||||
{
|
||||
return (user.isAuthorized("essentials.signs." + signName.toLowerCase(Locale.ENGLISH) + ".use")
|
||||
|| user.isAuthorized("essentials.signs.use." + signName.toLowerCase(Locale.ENGLISH)))
|
||||
&& onSignInteract(sign, user, getUsername(user), ess);
|
||||
}
|
||||
catch (ChargeException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user,signName, ex);
|
||||
return false;
|
||||
}
|
||||
catch (SignException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public final boolean onSignBreak(final Block block, final Player player, final IEssentials ess)
|
||||
{
|
||||
final ISign sign = new BlockSign(block);
|
||||
final IUser user = ess.getUser(player);
|
||||
try
|
||||
{
|
||||
return (user.isAuthorized("essentials.signs." + signName.toLowerCase(Locale.ENGLISH) + ".break")
|
||||
|| user.isAuthorized("essentials.signs.break." + signName.toLowerCase(Locale.ENGLISH)))
|
||||
&& onSignBreak(sign, user, getUsername(user), ess);
|
||||
}
|
||||
catch (SignException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean onSignBreak(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public final boolean onBlockPlace(final Block block, final Player player, final IEssentials ess)
|
||||
{
|
||||
IUser user = ess.getUser(player);
|
||||
try
|
||||
{
|
||||
return onBlockPlace(block, user, getUsername(user), ess);
|
||||
}
|
||||
catch (ChargeException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
}
|
||||
catch (SignException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public final boolean onBlockInteract(final Block block, final Player player, final IEssentials ess)
|
||||
{
|
||||
IUser user = ess.getUser(player);
|
||||
try
|
||||
{
|
||||
return onBlockInteract(block, user, getUsername(user), ess);
|
||||
}
|
||||
catch (ChargeException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
}
|
||||
catch (SignException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public final boolean onBlockBreak(final Block block, final Player player, final IEssentials ess)
|
||||
{
|
||||
IUser user = ess.getUser(player);
|
||||
try
|
||||
{
|
||||
return onBlockBreak(block, user, getUsername(user), ess);
|
||||
}
|
||||
catch (SignException ex)
|
||||
{
|
||||
ess.getCommandHandler().showCommandError(user, signName, ex);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean onBlockBreak(final Block block, final IEssentials ess)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onBlockExplode(final Block block, final IEssentials ess)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onBlockBurn(final Block block, final IEssentials ess)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onBlockIgnite(final Block block, final IEssentials ess)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onBlockPush(final Block block, final IEssentials ess)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean checkIfBlockBreaksSigns(final Block block)
|
||||
{
|
||||
final Block sign = block.getRelative(BlockFace.UP);
|
||||
if (sign.getType() == Material.SIGN_POST && isValidSign(new BlockSign(sign)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
final BlockFace[] directions = new BlockFace[]
|
||||
{
|
||||
BlockFace.NORTH,
|
||||
BlockFace.EAST,
|
||||
BlockFace.SOUTH,
|
||||
BlockFace.WEST
|
||||
};
|
||||
for (BlockFace blockFace : directions)
|
||||
{
|
||||
final Block signblock = block.getRelative(blockFace);
|
||||
if (signblock.getType() == Material.WALL_SIGN)
|
||||
{
|
||||
final org.bukkit.material.Sign signMat = (org.bukkit.material.Sign)signblock.getState().getData();
|
||||
if (signMat != null && signMat.getFacing() == blockFace && isValidSign(new BlockSign(signblock)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isValidSign(final ISign sign)
|
||||
{
|
||||
return sign.getLine(0).matches("§1\\[.*\\]");
|
||||
}
|
||||
|
||||
protected boolean onBlockPlace(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean onBlockInteract(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean onBlockBreak(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public Set<Material> getBlocks()
|
||||
{
|
||||
return EMPTY_SET;
|
||||
}
|
||||
|
||||
protected final void validateTrade(final ISign sign, final int index, final IEssentials ess) throws SignException
|
||||
{
|
||||
final String line = sign.getLine(index).trim();
|
||||
if (line.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
final Trade trade = getTrade(sign, index, 0, ess);
|
||||
final Double money = trade.getMoney();
|
||||
if (money != null)
|
||||
{
|
||||
sign.setLine(index, Util.formatCurrency(money, ess));
|
||||
}
|
||||
}
|
||||
|
||||
protected final void validateTrade(final ISign sign, final int amountIndex, final int itemIndex,
|
||||
final IUser player, final IEssentials ess) throws SignException
|
||||
{
|
||||
if (sign.getLine(itemIndex).equalsIgnoreCase("exp") || sign.getLine(itemIndex).equalsIgnoreCase("xp"))
|
||||
{
|
||||
int amount = getIntegerPositive(sign.getLine(amountIndex));
|
||||
sign.setLine(amountIndex, Integer.toString(amount));
|
||||
sign.setLine(itemIndex, "exp");
|
||||
return;
|
||||
}
|
||||
final Trade trade = getTrade(sign, amountIndex, itemIndex, player, ess);
|
||||
final ItemStack item = trade.getItemStack();
|
||||
sign.setLine(amountIndex, Integer.toString(item.getAmount()));
|
||||
sign.setLine(itemIndex, sign.getLine(itemIndex).trim());
|
||||
}
|
||||
|
||||
protected final Trade getTrade(final ISign sign, final int amountIndex, final int itemIndex,
|
||||
final IUser player, final IEssentials ess) throws SignException
|
||||
{
|
||||
if (sign.getLine(itemIndex).equalsIgnoreCase("exp") || sign.getLine(itemIndex).equalsIgnoreCase("xp"))
|
||||
{
|
||||
final int amount = getIntegerPositive(sign.getLine(amountIndex));
|
||||
return new Trade(amount, ess);
|
||||
}
|
||||
final ItemStack item = getItemStack(sign.getLine(itemIndex), 1, ess);
|
||||
final int amount = Math.min(getIntegerPositive(sign.getLine(amountIndex)), item.getType().getMaxStackSize() * player.getInventory().getSize());
|
||||
if (item.getTypeId() == 0 || amount < 1)
|
||||
{
|
||||
throw new SignException(_("moreThanZero"));
|
||||
}
|
||||
item.setAmount(amount);
|
||||
return new Trade(item, ess);
|
||||
}
|
||||
|
||||
protected final void validateInteger(final ISign sign, final int index) throws SignException
|
||||
{
|
||||
final String line = sign.getLine(index).trim();
|
||||
if (line.isEmpty())
|
||||
{
|
||||
throw new SignException("Empty line " + index);
|
||||
}
|
||||
final int quantity = getIntegerPositive(line);
|
||||
sign.setLine(index, Integer.toString(quantity));
|
||||
}
|
||||
|
||||
protected final int getIntegerPositive(final String line) throws SignException
|
||||
{
|
||||
final int quantity = getInteger(line);
|
||||
if (quantity < 1)
|
||||
{
|
||||
throw new SignException(_("moreThanZero"));
|
||||
}
|
||||
return quantity;
|
||||
}
|
||||
|
||||
protected final int getInteger(final String line) throws SignException
|
||||
{
|
||||
try
|
||||
{
|
||||
final int quantity = Integer.parseInt(line);
|
||||
|
||||
return quantity;
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
throw new SignException("Invalid sign", ex);
|
||||
}
|
||||
}
|
||||
|
||||
protected final ItemStack getItemStack(final String itemName, final int quantity, final IEssentials ess) throws SignException
|
||||
{
|
||||
try
|
||||
{
|
||||
final ItemStack item = ess.getItemDb().get(itemName);
|
||||
item.setAmount(quantity);
|
||||
return item;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
|
||||
protected final Double getMoney(final String line) throws SignException
|
||||
{
|
||||
final boolean isMoney = line.matches("^[^0-9-\\.][\\.0-9]+$");
|
||||
return isMoney ? getDoublePositive(line.substring(1)) : null;
|
||||
}
|
||||
|
||||
protected final Double getDoublePositive(final String line) throws SignException
|
||||
{
|
||||
final double quantity = getDouble(line);
|
||||
if (Math.round(quantity * 100.0) < 1.0)
|
||||
{
|
||||
throw new SignException(_("moreThanZero"));
|
||||
}
|
||||
return quantity;
|
||||
}
|
||||
|
||||
protected final Double getDouble(final String line) throws SignException
|
||||
{
|
||||
try
|
||||
{
|
||||
return Double.parseDouble(line);
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
|
||||
protected final Trade getTrade(final ISign sign, final int index, final IEssentials ess) throws SignException
|
||||
{
|
||||
return getTrade(sign, index, 1, ess);
|
||||
}
|
||||
|
||||
protected final Trade getTrade(final ISign sign, final int index, final int decrement, final IEssentials ess) throws SignException
|
||||
{
|
||||
final String line = sign.getLine(index).trim();
|
||||
if (line.isEmpty())
|
||||
{
|
||||
return new Trade(signName.toLowerCase(Locale.ENGLISH) + "sign", ess);
|
||||
}
|
||||
|
||||
final Double money = getMoney(line);
|
||||
if (money == null)
|
||||
{
|
||||
final String[] split = line.split("[ :]+", 2);
|
||||
if (split.length != 2)
|
||||
{
|
||||
throw new SignException(_("invalidCharge"));
|
||||
}
|
||||
final int quantity = getIntegerPositive(split[0]);
|
||||
|
||||
final String item = split[1].toLowerCase(Locale.ENGLISH);
|
||||
if (item.equalsIgnoreCase("times"))
|
||||
{
|
||||
sign.setLine(index, (quantity - decrement) + " times");
|
||||
return new Trade(signName.toLowerCase(Locale.ENGLISH) + "sign", ess);
|
||||
}
|
||||
else if (item.equalsIgnoreCase("exp") || item.equalsIgnoreCase("xp"))
|
||||
{
|
||||
sign.setLine(index, quantity + " exp");
|
||||
return new Trade(quantity, ess);
|
||||
}
|
||||
else
|
||||
{
|
||||
final ItemStack stack = getItemStack(item, quantity, ess);
|
||||
sign.setLine(index, quantity + " " + item);
|
||||
return new Trade(stack, ess);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return new Trade(money, ess);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static class EventSign implements ISign
|
||||
{
|
||||
private final transient SignChangeEvent event;
|
||||
private final transient Block block;
|
||||
|
||||
public EventSign(final SignChangeEvent event)
|
||||
{
|
||||
this.event = event;
|
||||
this.block = event.getBlock();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final String getLine(final int index)
|
||||
{
|
||||
return event.getLine(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void setLine(final int index, final String text)
|
||||
{
|
||||
event.setLine(index, text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Block getBlock()
|
||||
{
|
||||
return block;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSign()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static class BlockSign implements ISign
|
||||
{
|
||||
private final transient Sign sign;
|
||||
private final transient Block block;
|
||||
|
||||
public BlockSign(final Block block)
|
||||
{
|
||||
this.block = block;
|
||||
this.sign = (Sign)block.getState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final String getLine(final int index)
|
||||
{
|
||||
return sign.getLine(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void setLine(final int index, final String text)
|
||||
{
|
||||
sign.setLine(index, text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Block getBlock()
|
||||
{
|
||||
return block;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void updateSign()
|
||||
{
|
||||
sign.update();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public interface ISign
|
||||
{
|
||||
String getLine(final int index);
|
||||
|
||||
void setLine(final int index, final String text);
|
||||
|
||||
public Block getBlock();
|
||||
|
||||
void updateSign();
|
||||
}
|
||||
}
|
@@ -0,0 +1,55 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
|
||||
public class EssentialsSignsPlugin extends JavaPlugin
|
||||
{
|
||||
private static final transient Logger LOGGER = Bukkit.getLogger();
|
||||
private transient IEssentials ess;
|
||||
|
||||
public void onEnable()
|
||||
{
|
||||
final PluginManager pluginManager = getServer().getPluginManager();
|
||||
ess = (IEssentials)pluginManager.getPlugin("Essentials");
|
||||
if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion()))
|
||||
{
|
||||
LOGGER.log(Level.WARNING, _("versionMismatchAll"));
|
||||
}
|
||||
if (!ess.isEnabled())
|
||||
{
|
||||
this.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
|
||||
final SignBlockListener signBlockListener = new SignBlockListener(ess);
|
||||
pluginManager.registerEvent(Event.Type.SIGN_CHANGE, signBlockListener, Event.Priority.Highest, this);
|
||||
pluginManager.registerEvent(Event.Type.BLOCK_PLACE, signBlockListener, Event.Priority.Low, this);
|
||||
pluginManager.registerEvent(Event.Type.BLOCK_BREAK, signBlockListener, Event.Priority.Highest, this);
|
||||
pluginManager.registerEvent(Event.Type.BLOCK_IGNITE, signBlockListener, Event.Priority.Low, this);
|
||||
pluginManager.registerEvent(Event.Type.BLOCK_BURN, signBlockListener, Event.Priority.Low, this);
|
||||
pluginManager.registerEvent(Event.Type.BLOCK_PISTON_EXTEND, signBlockListener, Event.Priority.Low, this);
|
||||
pluginManager.registerEvent(Event.Type.BLOCK_PISTON_RETRACT, signBlockListener, Event.Priority.Low, this);
|
||||
|
||||
final SignPlayerListener signPlayerListener = new SignPlayerListener(ess);
|
||||
pluginManager.registerEvent(Event.Type.PLAYER_INTERACT, signPlayerListener, Event.Priority.Low, this);
|
||||
|
||||
final SignEntityListener signEntityListener = new SignEntityListener(ess);
|
||||
pluginManager.registerEvent(Event.Type.ENTITY_EXPLODE, signEntityListener, Event.Priority.Low, this);
|
||||
pluginManager.registerEvent(Event.Type.ENDERMAN_PICKUP, signEntityListener, Event.Priority.Low, this);
|
||||
|
||||
|
||||
LOGGER.info(_("loadinfo", this.getDescription().getName(), this.getDescription().getVersion(), "essentials team"));
|
||||
}
|
||||
|
||||
public void onDisable()
|
||||
{
|
||||
}
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
|
||||
|
||||
public class SignBalance extends EssentialsSign
|
||||
{
|
||||
public SignBalance()
|
||||
{
|
||||
super("Balance");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
player.sendMessage(_("balance", player.getMoney()));
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,252 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.block.*;
|
||||
|
||||
|
||||
public class SignBlockListener extends BlockListener
|
||||
{
|
||||
private final transient IEssentials ess;
|
||||
private final static Logger LOGGER = Logger.getLogger("Minecraft");
|
||||
|
||||
public SignBlockListener(final IEssentials ess)
|
||||
{
|
||||
this.ess = ess;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockBreak(final BlockBreakEvent event)
|
||||
{
|
||||
if (event.isCancelled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (protectSignsAndBlocks(event.getBlock(), event.getPlayer()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean protectSignsAndBlocks(final Block block, final Player player)
|
||||
{
|
||||
final int mat = block.getTypeId();
|
||||
if (mat == Material.SIGN_POST.getId() || mat == Material.WALL_SIGN.getId())
|
||||
{
|
||||
final Sign csign = (Sign)block.getState();
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (csign.getLine(0).equalsIgnoreCase(sign.getSuccessName())
|
||||
&& !sign.onSignBreak(block, player, ess))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// prevent any signs be broken by destroying the block they are attached to
|
||||
if (EssentialsSign.checkIfBlockBreaksSigns(block))
|
||||
{
|
||||
LOGGER.log(Level.INFO, "Prevented that a block was broken next to a sign.");
|
||||
return true;
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType())
|
||||
&& !sign.onBlockBreak(block, player, ess))
|
||||
{
|
||||
LOGGER.log(Level.INFO, "A block was protected by a sign.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSignChange(final SignChangeEvent event)
|
||||
{
|
||||
if (event.isCancelled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
IUser user = ess.getUser(event.getPlayer());
|
||||
if (user.isAuthorized("essentials.signs.color"))
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
event.setLine(i, event.getLine(i).replaceAll("&([0-9a-f])", "§$1"));
|
||||
}
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (event.getLine(0).equalsIgnoreCase(sign.getSuccessName()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
if (event.getLine(0).equalsIgnoreCase(sign.getTemplateName())
|
||||
&& !sign.onSignCreate(event, ess))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockPlace(final BlockPlaceEvent event)
|
||||
{
|
||||
if (event.isCancelled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Block against = event.getBlockAgainst();
|
||||
if ((against.getType() == Material.WALL_SIGN
|
||||
|| against.getType() == Material.SIGN_POST)
|
||||
&& EssentialsSign.isValidSign(new EssentialsSign.BlockSign(against)))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
final Block block = event.getBlock();
|
||||
if (block.getType() == Material.WALL_SIGN
|
||||
|| block.getType() == Material.SIGN_POST)
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType())
|
||||
&& !sign.onBlockPlace(block, event.getPlayer(), ess))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockBurn(final BlockBurnEvent event)
|
||||
{
|
||||
if (event.isCancelled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Block block = event.getBlock();
|
||||
if (((block.getType() == Material.WALL_SIGN
|
||||
|| block.getType() == Material.SIGN_POST)
|
||||
&& EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
|
||||
|| EssentialsSign.checkIfBlockBreaksSigns(block))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType())
|
||||
&& !sign.onBlockBurn(block, ess))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockIgnite(final BlockIgniteEvent event)
|
||||
{
|
||||
if (event.isCancelled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Block block = event.getBlock();
|
||||
if (((block.getType() == Material.WALL_SIGN
|
||||
|| block.getType() == Material.SIGN_POST)
|
||||
&& EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
|
||||
|| EssentialsSign.checkIfBlockBreaksSigns(block))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType())
|
||||
&& !sign.onBlockIgnite(block, ess))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockPistonExtend(final BlockPistonExtendEvent event)
|
||||
{
|
||||
for (Block block : event.getBlocks())
|
||||
{
|
||||
if (((block.getType() == Material.WALL_SIGN
|
||||
|| block.getType() == Material.SIGN_POST)
|
||||
&& EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
|
||||
|| EssentialsSign.checkIfBlockBreaksSigns(block))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType())
|
||||
&& !sign.onBlockPush(block, ess))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockPistonRetract(final BlockPistonRetractEvent event)
|
||||
{
|
||||
if (event.isSticky())
|
||||
{
|
||||
final Block block = event.getBlock();
|
||||
if (((block.getType() == Material.WALL_SIGN
|
||||
|| block.getType() == Material.SIGN_POST)
|
||||
&& EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
|
||||
|| EssentialsSign.checkIfBlockBreaksSigns(block))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType())
|
||||
&& !sign.onBlockPush(block, ess))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,38 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
|
||||
|
||||
public class SignBuy extends EssentialsSign
|
||||
{
|
||||
public SignBuy()
|
||||
{
|
||||
super("Buy");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
validateTrade(sign, 1, 2, player, ess);
|
||||
validateTrade(sign, 3, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final Trade items = getTrade(sign, 1, 2, player, ess);
|
||||
final Trade charge = getTrade(sign, 3, ess);
|
||||
charge.isAffordableFor(player);
|
||||
if (!items.pay(player, false))
|
||||
{
|
||||
throw new ChargeException("Inventory full");
|
||||
}
|
||||
charge.charge(player);
|
||||
Trade.log("Sign", "Buy", "Interact", username, charge, username, items, sign.getBlock().getLocation(), ess);
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import com.earth2me.essentials.craftbukkit.ShowInventory;
|
||||
|
||||
|
||||
public class SignDisposal extends EssentialsSign
|
||||
{
|
||||
public SignDisposal()
|
||||
{
|
||||
super("Disposal");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess)
|
||||
{
|
||||
ShowInventory.showEmptyInventory(player.getBase());
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,121 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import com.earth2me.essentials.Enchantments;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
|
||||
import java.util.Locale;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
|
||||
public class SignEnchant extends EssentialsSign
|
||||
{
|
||||
public SignEnchant()
|
||||
{
|
||||
super("Enchant");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final ItemStack stack = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess);
|
||||
final String[] enchantLevel = sign.getLine(2).split(":");
|
||||
if (enchantLevel.length != 2)
|
||||
{
|
||||
throw new SignException(_("invalidSignLine", 3));
|
||||
}
|
||||
final Enchantment enchantment = Enchantments.getByName(enchantLevel[0]);
|
||||
if (enchantment == null)
|
||||
{
|
||||
throw new SignException(_("enchantmentNotFound"));
|
||||
}
|
||||
int level;
|
||||
try
|
||||
{
|
||||
level = Integer.parseInt(enchantLevel[1]);
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage());
|
||||
}
|
||||
if (level < 1 || level > enchantment.getMaxLevel())
|
||||
{
|
||||
level = enchantment.getMaxLevel();
|
||||
sign.setLine(2, enchantLevel[0] + ":" + level);
|
||||
}
|
||||
try
|
||||
{
|
||||
if (stack != null)
|
||||
{
|
||||
stack.addEnchantment(enchantment, level);
|
||||
}
|
||||
}
|
||||
catch (Throwable ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage());
|
||||
}
|
||||
getTrade(sign, 3, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final ItemStack search = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess);
|
||||
int slot = -1;
|
||||
final Trade charge = getTrade(sign, 3, ess);
|
||||
charge.isAffordableFor(player);
|
||||
final String[] enchantLevel = sign.getLine(2).split(":");
|
||||
if (enchantLevel.length != 2)
|
||||
{
|
||||
throw new SignException(_("invalidSignLine", 3));
|
||||
}
|
||||
final Enchantment enchantment = Enchantments.getByName(enchantLevel[0]);
|
||||
if (enchantment == null)
|
||||
{
|
||||
throw new SignException(_("enchantmentNotFound"));
|
||||
}
|
||||
int level;
|
||||
try
|
||||
{
|
||||
level = Integer.parseInt(enchantLevel[1]);
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
level = enchantment.getMaxLevel();
|
||||
}
|
||||
|
||||
final ItemStack playerHand = player.getItemInHand();
|
||||
if (playerHand == null
|
||||
|| playerHand.getAmount() != 1
|
||||
|| (playerHand.containsEnchantment(enchantment)
|
||||
&& playerHand.getEnchantmentLevel(enchantment) == level))
|
||||
{
|
||||
throw new SignException(_("missingItems", 1, sign.getLine(1)));
|
||||
}
|
||||
if (search != null && playerHand.getType() != search.getType())
|
||||
{
|
||||
throw new SignException(_("missingItems", 1, search.getType().toString().toLowerCase(Locale.ENGLISH).replace('_', ' ')));
|
||||
}
|
||||
|
||||
final ItemStack toEnchant = playerHand;
|
||||
try
|
||||
{
|
||||
toEnchant.addEnchantment(enchantment, level);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage(), ex);
|
||||
}
|
||||
|
||||
charge.charge(player);
|
||||
Trade.log("Sign", "Enchant", "Interact", username, charge, username, charge, sign.getBlock().getLocation(), ess);
|
||||
player.updateInventory();
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,73 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.event.entity.EndermanPickupEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.entity.EntityListener;
|
||||
|
||||
|
||||
public class SignEntityListener extends EntityListener
|
||||
{
|
||||
private final transient IEssentials ess;
|
||||
|
||||
public SignEntityListener(final IEssentials ess)
|
||||
{
|
||||
this.ess = ess;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEntityExplode(final EntityExplodeEvent event)
|
||||
{
|
||||
for (Block block : event.blockList())
|
||||
{
|
||||
if (((block.getType() == Material.WALL_SIGN
|
||||
|| block.getType() == Material.SIGN_POST)
|
||||
&& EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
|
||||
|| EssentialsSign.checkIfBlockBreaksSigns(block))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType()))
|
||||
{
|
||||
event.setCancelled(!sign.onBlockExplode(block, ess));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEndermanPickup(EndermanPickupEvent event)
|
||||
{
|
||||
if (event.isCancelled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Block block = event.getBlock();
|
||||
if (((block.getType() == Material.WALL_SIGN
|
||||
|| block.getType() == Material.SIGN_POST)
|
||||
&& EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
|
||||
|| EssentialsSign.checkIfBlockBreaksSigns(block))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType())
|
||||
&& !sign.onBlockBreak(block, ess))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,15 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
|
||||
public class SignException extends Exception
|
||||
{
|
||||
public SignException(final String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
|
||||
public SignException(final String message, final Throwable throwable)
|
||||
{
|
||||
super(message, throwable);
|
||||
}
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import com.earth2me.essentials.craftbukkit.ShowInventory;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
|
||||
public class SignFree extends EssentialsSign
|
||||
{
|
||||
public SignFree()
|
||||
{
|
||||
super("Free");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
getItemStack(sign.getLine(1), 1, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
final ItemStack item = getItemStack(sign.getLine(1), 1, ess);
|
||||
if (item.getType() == Material.AIR)
|
||||
{
|
||||
throw new SignException(_("cantSpawnItem", "Air"));
|
||||
}
|
||||
|
||||
item.setAmount(item.getType().getMaxStackSize() * 9 * 4);
|
||||
ShowInventory.showFilledInventory(player.getBase(), item);
|
||||
Trade.log("Sign", "Free", "Interact", username, null, username, new Trade(item, ess), sign.getBlock().getLocation(), ess);
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,37 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import java.util.Locale;
|
||||
import org.bukkit.GameMode;
|
||||
|
||||
|
||||
public class SignGameMode extends EssentialsSign
|
||||
{
|
||||
public SignGameMode()
|
||||
{
|
||||
super("GameMode");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
validateTrade(sign, 1, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final Trade charge = getTrade(sign, 1, ess);
|
||||
charge.isAffordableFor(player);
|
||||
|
||||
player.setGameMode(player.getGameMode() == GameMode.SURVIVAL ? GameMode.CREATIVE : GameMode.SURVIVAL);
|
||||
player.sendMessage(_("gameMode", _(player.getGameMode().toString().toLowerCase(Locale.ENGLISH)), player.getDisplayName()));
|
||||
charge.charge(player);
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,36 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
|
||||
|
||||
public class SignHeal extends EssentialsSign
|
||||
{
|
||||
public SignHeal()
|
||||
{
|
||||
super("Heal");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
validateTrade(sign, 1, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final Trade charge = getTrade(sign, 1, ess);
|
||||
charge.isAffordableFor(player);
|
||||
player.setHealth(20);
|
||||
player.setFoodLevel(20);
|
||||
player.setFireTicks(0);
|
||||
player.sendMessage(_("youAreHealed"));
|
||||
charge.charge(player);
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,75 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.*;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public class SignKit extends EssentialsSign
|
||||
{
|
||||
public SignKit()
|
||||
{
|
||||
super("Kit");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
validateTrade(sign, 3, ess);
|
||||
|
||||
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH);
|
||||
|
||||
if (kitName.isEmpty())
|
||||
{
|
||||
sign.setLine(1, "§dKit name!");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
ess.getSettings().getKit(kitName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage(), ex);
|
||||
}
|
||||
final String group = sign.getLine(2);
|
||||
if ("Everyone".equalsIgnoreCase(group) || "Everybody".equalsIgnoreCase(group))
|
||||
{
|
||||
sign.setLine(2, "§2Everyone");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH);
|
||||
final String group = sign.getLine(2);
|
||||
if ((!group.isEmpty() && ("§2Everyone".equals(group) || player.inGroup(group)))
|
||||
|| (group.isEmpty() && (player.isAuthorized("essentials.kit." + kitName))))
|
||||
{
|
||||
final Trade charge = getTrade(sign, 3, ess);
|
||||
charge.isAffordableFor(player);
|
||||
try
|
||||
{
|
||||
final Object kit = ess.getSettings().getKit(kitName);
|
||||
final Map<String, Object> els = (Map<String, Object>)kit;
|
||||
final List<String> items = Kit.getItems(player, els);
|
||||
Kit.expandItems(ess, player, items);
|
||||
charge.charge(player);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage(), ex);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@@ -0,0 +1,41 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class SignMail extends EssentialsSign
|
||||
{
|
||||
public SignMail()
|
||||
{
|
||||
super("Mail");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
final List<String> mail;
|
||||
player.acquireReadLock();
|
||||
try
|
||||
{
|
||||
mail = player.getData().getMails();
|
||||
}
|
||||
finally
|
||||
{
|
||||
player.unlock();
|
||||
}
|
||||
if (mail == null || mail.isEmpty())
|
||||
{
|
||||
player.sendMessage(_("noNewMail"));
|
||||
return false;
|
||||
}
|
||||
for (String s : mail)
|
||||
{
|
||||
player.sendMessage(s);
|
||||
}
|
||||
player.sendMessage(_("markMailAsRead"));
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,68 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerListener;
|
||||
|
||||
|
||||
public class SignPlayerListener extends PlayerListener
|
||||
{
|
||||
private final transient IEssentials ess;
|
||||
|
||||
public SignPlayerListener(IEssentials ess)
|
||||
{
|
||||
this.ess = ess;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerInteract(PlayerInteractEvent event)
|
||||
{
|
||||
if (event.isCancelled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Block block = event.getClickedBlock();
|
||||
if (block == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
final int mat = block.getTypeId();
|
||||
if (mat == Material.SIGN_POST.getId() || mat == Material.WALL_SIGN.getId())
|
||||
{
|
||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||
{
|
||||
return;
|
||||
}
|
||||
final Sign csign = (Sign)block.getState();
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (csign.getLine(0).equalsIgnoreCase(sign.getSuccessName()))
|
||||
{
|
||||
sign.onSignInteract(block, event.getPlayer(), ess);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (Signs signs : Signs.values())
|
||||
{
|
||||
final EssentialsSign sign = signs.getSign();
|
||||
if (sign.getBlocks().contains(block.getType())
|
||||
&& !sign.onBlockInteract(block, event.getPlayer(), ess))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,350 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import com.earth2me.essentials.Util;
|
||||
import java.util.*;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
|
||||
public class SignProtection extends EssentialsSign
|
||||
{
|
||||
private final transient Set<Material> protectedBlocks = EnumSet.noneOf(Material.class);
|
||||
|
||||
public SignProtection()
|
||||
{
|
||||
super("Protection");
|
||||
protectedBlocks.add(Material.CHEST);
|
||||
protectedBlocks.add(Material.BURNING_FURNACE);
|
||||
protectedBlocks.add(Material.FURNACE);
|
||||
protectedBlocks.add(Material.DISPENSER);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
sign.setLine(3, "§4" + username);
|
||||
if (hasAdjacentBlock(sign.getBlock()))
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(sign.getBlock(), player, username, true);
|
||||
if (state == SignProtectionState.NOSIGN || state == SignProtectionState.OWNER
|
||||
|| player.isAuthorized("essentials.signs.protection.override"))
|
||||
{
|
||||
sign.setLine(3, "§1" + username);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
player.sendMessage(_("signProtectInvalidLocation"));
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignBreak(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
final SignProtectionState state = checkProtectionSign(sign, player, username);
|
||||
return state == SignProtectionState.OWNER;
|
||||
}
|
||||
|
||||
public boolean hasAdjacentBlock(final Block block, final Block... ignoredBlocks)
|
||||
{
|
||||
final Block[] faces = getAdjacentBlocks(block);
|
||||
for (Block b : faces)
|
||||
{
|
||||
for (Block ignoredBlock : ignoredBlocks)
|
||||
{
|
||||
if (b.getLocation().equals(ignoredBlock.getLocation()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (protectedBlocks.contains(b.getType()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void checkIfSignsAreBroken(final Block block, final IUser player, final String username, final IEssentials ess)
|
||||
{
|
||||
final Map<Location, SignProtectionState> signs = getConnectedSigns(block, player, username, false);
|
||||
for (Map.Entry<Location, SignProtectionState> entry : signs.entrySet())
|
||||
{
|
||||
if (entry.getValue() != SignProtectionState.NOSIGN)
|
||||
{
|
||||
final Block sign = entry.getKey().getBlock();
|
||||
if (!hasAdjacentBlock(sign, block))
|
||||
{
|
||||
block.setType(Material.AIR);
|
||||
final Trade trade = new Trade(new ItemStack(Material.SIGN, 1), ess);
|
||||
trade.pay(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Map<Location, SignProtectionState> getConnectedSigns(final Block block, final IUser user, final String username, boolean secure)
|
||||
{
|
||||
final Map<Location, SignProtectionState> signs = new HashMap<Location, SignProtectionState>();
|
||||
getConnectedSigns(block, signs, user, username, secure ? 4 : 2);
|
||||
return signs;
|
||||
}
|
||||
|
||||
private void getConnectedSigns(final Block block, final Map<Location, SignProtectionState> signs, final IUser user, final String username, final int depth)
|
||||
{
|
||||
final Block[] faces = getAdjacentBlocks(block);
|
||||
for (Block b : faces)
|
||||
{
|
||||
final Location loc = b.getLocation();
|
||||
if (signs.containsKey(loc))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
final SignProtectionState check = checkProtectionSign(b, user, username);
|
||||
signs.put(loc, check);
|
||||
|
||||
if (protectedBlocks.contains(b.getType()) && depth > 0)
|
||||
{
|
||||
getConnectedSigns(b, signs, user, username, depth - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public enum SignProtectionState
|
||||
{
|
||||
NOT_ALLOWED, ALLOWED, NOSIGN, OWNER
|
||||
}
|
||||
|
||||
private SignProtectionState checkProtectionSign(final Block block, final IUser user, final String username)
|
||||
{
|
||||
if (block.getType() == Material.SIGN_POST || block.getType() == Material.WALL_SIGN)
|
||||
{
|
||||
final BlockSign sign = new BlockSign(block);
|
||||
if (sign.getLine(0).equalsIgnoreCase(this.getSuccessName()))
|
||||
{
|
||||
return checkProtectionSign(sign, user, username);
|
||||
}
|
||||
}
|
||||
return SignProtectionState.NOSIGN;
|
||||
}
|
||||
|
||||
private SignProtectionState checkProtectionSign(final ISign sign, final IUser user, final String username)
|
||||
{
|
||||
if (user == null || username == null)
|
||||
{
|
||||
return SignProtectionState.NOT_ALLOWED;
|
||||
}
|
||||
if (user.isAuthorized("essentials.signs.protection.override"))
|
||||
{
|
||||
return SignProtectionState.OWNER;
|
||||
}
|
||||
if (Util.stripColor(sign.getLine(3)).equalsIgnoreCase(username))
|
||||
{
|
||||
return SignProtectionState.OWNER;
|
||||
}
|
||||
for (int i = 1; i <= 2; i++)
|
||||
{
|
||||
final String line = sign.getLine(i);
|
||||
if (line.startsWith("(") && line.endsWith(")") && user.inGroup(line.substring(1, line.length() - 1)))
|
||||
{
|
||||
return SignProtectionState.ALLOWED;
|
||||
}
|
||||
else if (line.equalsIgnoreCase(username))
|
||||
{
|
||||
return SignProtectionState.ALLOWED;
|
||||
}
|
||||
}
|
||||
return SignProtectionState.NOT_ALLOWED;
|
||||
}
|
||||
|
||||
private Block[] getAdjacentBlocks(final Block block)
|
||||
{
|
||||
return new Block[]
|
||||
{
|
||||
block.getRelative(BlockFace.NORTH),
|
||||
block.getRelative(BlockFace.SOUTH),
|
||||
block.getRelative(BlockFace.EAST),
|
||||
block.getRelative(BlockFace.WEST),
|
||||
block.getRelative(BlockFace.DOWN),
|
||||
block.getRelative(BlockFace.UP)
|
||||
};
|
||||
}
|
||||
|
||||
public SignProtectionState isBlockProtected(final Block block, final IUser user, final String username, boolean secure)
|
||||
{
|
||||
final Map<Location, SignProtectionState> signs = getConnectedSigns(block, user, username, secure);
|
||||
SignProtectionState retstate = SignProtectionState.NOSIGN;
|
||||
for (SignProtectionState state : signs.values())
|
||||
{
|
||||
if (state == SignProtectionState.ALLOWED)
|
||||
{
|
||||
retstate = state;
|
||||
}
|
||||
else if (state == SignProtectionState.NOT_ALLOWED && retstate != SignProtectionState.ALLOWED)
|
||||
{
|
||||
retstate = state;
|
||||
}
|
||||
}
|
||||
if (!secure || retstate == SignProtectionState.NOSIGN)
|
||||
{
|
||||
for (SignProtectionState state : signs.values())
|
||||
{
|
||||
if (state == SignProtectionState.OWNER)
|
||||
{
|
||||
return state;
|
||||
}
|
||||
}
|
||||
}
|
||||
return retstate;
|
||||
}
|
||||
|
||||
public boolean isBlockProtected(final Block block)
|
||||
{
|
||||
final Block[] faces = getAdjacentBlocks(block);
|
||||
for (Block b : faces)
|
||||
{
|
||||
if (b.getType() == Material.SIGN_POST || b.getType() == Material.WALL_SIGN)
|
||||
{
|
||||
final Sign sign = (Sign)b.getState();
|
||||
if (sign.getLine(0).equalsIgnoreCase("§1[Protection]"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (protectedBlocks.contains(b.getType()))
|
||||
{
|
||||
final Block[] faceChest = getAdjacentBlocks(b);
|
||||
|
||||
for (Block a : faceChest)
|
||||
{
|
||||
if (a.getType() == Material.SIGN_POST || a.getType() == Material.WALL_SIGN)
|
||||
{
|
||||
final Sign sign = (Sign)a.getState();
|
||||
if (sign.getLine(0).equalsIgnoreCase("§1[Protection]"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Material> getBlocks()
|
||||
{
|
||||
return protectedBlocks;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onBlockPlace(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
for (Block adjBlock : getAdjacentBlocks(block))
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(adjBlock, player, username, true);
|
||||
|
||||
if ((state == SignProtectionState.ALLOWED || state == SignProtectionState.NOT_ALLOWED)
|
||||
&& !player.isAuthorized("essentials.signs.protection.override"))
|
||||
{
|
||||
player.sendMessage(_("noPlacePermission", block.getType().toString().toLowerCase(Locale.ENGLISH)));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onBlockInteract(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(block, player, username, false);
|
||||
|
||||
if (state == SignProtectionState.OWNER || state == SignProtectionState.NOSIGN || state == SignProtectionState.ALLOWED)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (state == SignProtectionState.NOT_ALLOWED
|
||||
&& player.isAuthorized("essentials.signs.protection.override"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
player.sendMessage(_("noAccessPermission", block.getType().toString().toLowerCase(Locale.ENGLISH)));
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onBlockBreak(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(block, player, username, false);
|
||||
|
||||
if (state == SignProtectionState.OWNER || state == SignProtectionState.NOSIGN)
|
||||
{
|
||||
checkIfSignsAreBroken(block, player, username, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((state == SignProtectionState.ALLOWED || state == SignProtectionState.NOT_ALLOWED)
|
||||
&& player.isAuthorized("essentials.signs.protection.override"))
|
||||
{
|
||||
checkIfSignsAreBroken(block, player, username, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
player.sendMessage(_("noDestroyPermission", block.getType().toString().toLowerCase(Locale.ENGLISH)));
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockBreak(final Block block, final IEssentials ess)
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(block, null, null, false);
|
||||
|
||||
return state == SignProtectionState.NOSIGN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockExplode(final Block block, final IEssentials ess)
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(block, null, null, false);
|
||||
|
||||
return state == SignProtectionState.NOSIGN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockBurn(final Block block, final IEssentials ess)
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(block, null, null, false);
|
||||
|
||||
return state == SignProtectionState.NOSIGN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockIgnite(final Block block, final IEssentials ess)
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(block, null, null, false);
|
||||
|
||||
return state == SignProtectionState.NOSIGN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockPush(final Block block, final IEssentials ess)
|
||||
{
|
||||
final SignProtectionState state = isBlockProtected(block, null, null, false);
|
||||
|
||||
return state == SignProtectionState.NOSIGN;
|
||||
}
|
||||
}
|
@@ -0,0 +1,35 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
|
||||
|
||||
public class SignSell extends EssentialsSign
|
||||
{
|
||||
public SignSell()
|
||||
{
|
||||
super("Sell");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
validateTrade(sign, 1, 2, player, ess);
|
||||
validateTrade(sign, 3, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final Trade charge = getTrade(sign, 1, 2, player, ess);
|
||||
final Trade money = getTrade(sign, 3, ess);
|
||||
charge.isAffordableFor(player);
|
||||
money.pay(player);
|
||||
charge.charge(player);
|
||||
Trade.log("Sign", "Sell", "Interact", username, charge, username, money, sign.getBlock().getLocation(), ess);
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,47 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import com.earth2me.essentials.commands.Commandspawnmob;
|
||||
|
||||
|
||||
public class SignSpawnmob extends EssentialsSign
|
||||
{
|
||||
public SignSpawnmob()
|
||||
{
|
||||
super("Spawnmob");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
validateInteger(sign, 1);
|
||||
validateTrade(sign, 3, ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final Trade charge = getTrade(sign, 3, ess);
|
||||
charge.isAffordableFor(player);
|
||||
Commandspawnmob command = new Commandspawnmob();
|
||||
command.setEssentials(ess);
|
||||
String[] args = new String[]
|
||||
{
|
||||
sign.getLine(2), sign.getLine(1)
|
||||
};
|
||||
try
|
||||
{
|
||||
command.run(ess.getServer(), player, "spawnmob", args);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage(), ex);
|
||||
}
|
||||
charge.charge(player);
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,57 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
|
||||
|
||||
public class SignTime extends EssentialsSign
|
||||
{
|
||||
public SignTime()
|
||||
{
|
||||
super("Time");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
validateTrade(sign, 2, ess);
|
||||
final String timeString = sign.getLine(1);
|
||||
if ("Day".equalsIgnoreCase(timeString))
|
||||
{
|
||||
sign.setLine(1, "§2Day");
|
||||
return true;
|
||||
}
|
||||
if ("Night".equalsIgnoreCase(timeString))
|
||||
{
|
||||
sign.setLine(1, "§2Night");
|
||||
return true;
|
||||
}
|
||||
throw new SignException(_("onlyDayNight"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final Trade charge = getTrade(sign, 2, ess);
|
||||
charge.isAffordableFor(player);
|
||||
final String timeString = sign.getLine(1);
|
||||
long time = player.getWorld().getTime();
|
||||
time -= time % 24000;
|
||||
if ("§2Day".equalsIgnoreCase(timeString))
|
||||
{
|
||||
player.getWorld().setTime(time + 24000);
|
||||
charge.charge(player);
|
||||
return true;
|
||||
}
|
||||
if ("§2Night".equalsIgnoreCase(timeString))
|
||||
{
|
||||
player.getWorld().setTime(time + 37700);
|
||||
charge.charge(player);
|
||||
return true;
|
||||
}
|
||||
throw new SignException(_("onlyDayNight"));
|
||||
}
|
||||
}
|
356
EssentialsSigns/src/com/earth2me/essentials/signs/SignTrade.java
Normal file
356
EssentialsSigns/src/com/earth2me/essentials/signs/SignTrade.java
Normal file
@@ -0,0 +1,356 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.*;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
//TODO: Sell Enchantment on Trade signs?
|
||||
public class SignTrade extends EssentialsSign
|
||||
{
|
||||
|
||||
public SignTrade()
|
||||
{
|
||||
super("Trade");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
validateTrade(sign, 1, false, ess);
|
||||
validateTrade(sign, 2, true, ess);
|
||||
final Trade charge = getTrade(sign, 2, true, true, ess);
|
||||
charge.isAffordableFor(player);
|
||||
sign.setLine(3, "§8" + username);
|
||||
charge.charge(player);
|
||||
Trade.log("Sign", "Trade", "Create", username, charge, username, null, sign.getBlock().getLocation(), ess);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
if (sign.getLine(3).substring(2).equalsIgnoreCase(username))
|
||||
{
|
||||
final Trade store = rechargeSign(sign, ess, player);
|
||||
Trade stored = null;
|
||||
try
|
||||
{
|
||||
stored = getTrade(sign, 1, true, true, ess);
|
||||
substractAmount(sign, 1, stored, ess);
|
||||
stored.pay(player);
|
||||
}
|
||||
catch (SignException e)
|
||||
{
|
||||
if (store == null)
|
||||
{
|
||||
throw new SignException(_("tradeSignEmptyOwner"), e);
|
||||
}
|
||||
}
|
||||
Trade.log("Sign", "Trade", "OwnerInteract", username, store, username, stored, sign.getBlock().getLocation(), ess);
|
||||
}
|
||||
else
|
||||
{
|
||||
final Trade charge = getTrade(sign, 1, false, false, ess);
|
||||
final Trade trade = getTrade(sign, 2, false, true, ess);
|
||||
charge.isAffordableFor(player);
|
||||
if (!trade.pay(player, false))
|
||||
{
|
||||
throw new ChargeException("Full inventory");
|
||||
}
|
||||
substractAmount(sign, 2, trade, ess);
|
||||
addAmount(sign, 1, charge, ess);
|
||||
charge.charge(player);
|
||||
Trade.log("Sign", "Trade", "Interact", sign.getLine(3), charge, username, trade, sign.getBlock().getLocation(), ess);
|
||||
}
|
||||
sign.updateSign();
|
||||
return true;
|
||||
}
|
||||
|
||||
private Trade rechargeSign(final ISign sign, final IEssentials ess, final IUser player) throws SignException, ChargeException
|
||||
{
|
||||
final Trade trade = getTrade(sign, 2, false, false, ess);
|
||||
if (trade.getItemStack() != null && player.getItemInHand() != null
|
||||
&& trade.getItemStack().getTypeId() == player.getItemInHand().getTypeId()
|
||||
&& trade.getItemStack().getDurability() == player.getItemInHand().getDurability()
|
||||
&& trade.getItemStack().getEnchantments().equals(player.getItemInHand().getEnchantments()))
|
||||
{
|
||||
int amount = player.getItemInHand().getAmount();
|
||||
amount -= amount % trade.getItemStack().getAmount();
|
||||
if (amount > 0)
|
||||
{
|
||||
final ItemStack stack = player.getItemInHand().clone();
|
||||
stack.setAmount(amount);
|
||||
final Trade store = new Trade(stack, ess);
|
||||
addAmount(sign, 2, store, ess);
|
||||
store.charge(player);
|
||||
return store;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignBreak(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
if ((sign.getLine(3).length() > 3 && sign.getLine(3).substring(2).equalsIgnoreCase(username))
|
||||
|| player.isAuthorized("essentials.signs.trade.override"))
|
||||
{
|
||||
try
|
||||
{
|
||||
final Trade stored1 = getTrade(sign, 1, true, false, ess);
|
||||
final Trade stored2 = getTrade(sign, 2, true, false, ess);
|
||||
stored1.pay(player);
|
||||
stored2.pay(player);
|
||||
Trade.log("Sign", "Trade", "Break", username, stored2, username, stored1, sign.getBlock().getLocation(), ess);
|
||||
}
|
||||
catch (SignException e)
|
||||
{
|
||||
if (player.isAuthorized("essentials.signs.trade.override"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected final void validateTrade(final ISign sign, final int index, final boolean amountNeeded, final IEssentials ess) throws SignException
|
||||
{
|
||||
final String line = sign.getLine(index).trim();
|
||||
if (line.isEmpty())
|
||||
{
|
||||
throw new SignException("Empty line");
|
||||
}
|
||||
final String[] split = line.split("[ :]+");
|
||||
|
||||
if (split.length == 1 && !amountNeeded)
|
||||
{
|
||||
final Double money = getMoney(split[0]);
|
||||
if (money != null)
|
||||
{
|
||||
if (Util.formatCurrency(money, ess).length() * 2 > 15)
|
||||
{
|
||||
throw new SignException("Line can be too long!");
|
||||
}
|
||||
sign.setLine(index, Util.formatCurrency(money, ess) + ":0");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (split.length == 2 && amountNeeded)
|
||||
{
|
||||
final Double money = getMoney(split[0]);
|
||||
Double amount = getDoublePositive(split[1]);
|
||||
if (money != null && amount != null)
|
||||
{
|
||||
amount -= amount % money;
|
||||
if (amount < 0.01 || money < 0.01)
|
||||
{
|
||||
throw new SignException(_("moreThanZero"));
|
||||
}
|
||||
sign.setLine(index, Util.formatCurrency(money, ess) + ":" + Util.formatCurrency(amount, ess).substring(1));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (split.length == 2 && !amountNeeded)
|
||||
{
|
||||
final int amount = getIntegerPositive(split[0]);
|
||||
|
||||
if (amount < 1)
|
||||
{
|
||||
throw new SignException(_("moreThanZero"));
|
||||
}
|
||||
if (!(split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp"))
|
||||
&& getItemStack(split[1], amount, ess).getTypeId() == 0)
|
||||
{
|
||||
throw new SignException(_("moreThanZero"));
|
||||
}
|
||||
String newline = amount + " " + split[1] + ":0";
|
||||
if ((newline + amount).length() > 15)
|
||||
{
|
||||
throw new SignException("Line can be too long!");
|
||||
}
|
||||
sign.setLine(index, newline);
|
||||
return;
|
||||
}
|
||||
|
||||
if (split.length == 3 && amountNeeded)
|
||||
{
|
||||
final int stackamount = getIntegerPositive(split[0]);
|
||||
int amount = getIntegerPositive(split[2]);
|
||||
amount -= amount % stackamount;
|
||||
if (amount < 1 || stackamount < 1)
|
||||
{
|
||||
throw new SignException(_("moreThanZero"));
|
||||
}
|
||||
if (!(split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp"))
|
||||
&& getItemStack(split[1], stackamount, ess).getTypeId() == 0)
|
||||
{
|
||||
throw new SignException(_("moreThanZero"));
|
||||
}
|
||||
sign.setLine(index, stackamount + " " + split[1] + ":" + amount);
|
||||
return;
|
||||
}
|
||||
throw new SignException(_("invalidSignLine", index + 1));
|
||||
}
|
||||
|
||||
protected final Trade getTrade(final ISign sign, final int index, final boolean fullAmount, final boolean notEmpty, final IEssentials ess) throws SignException
|
||||
{
|
||||
final String line = sign.getLine(index).trim();
|
||||
if (line.isEmpty())
|
||||
{
|
||||
throw new SignException("Empty line");
|
||||
}
|
||||
final String[] split = line.split("[ :]+");
|
||||
|
||||
if (split.length == 2)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Double money = getMoney(split[0]);
|
||||
final Double amount = notEmpty ? getDoublePositive(split[1]) : getDouble(split[1]);
|
||||
if (money != null && amount != null)
|
||||
{
|
||||
return new Trade(fullAmount ? amount : money, ess);
|
||||
}
|
||||
}
|
||||
catch (SignException e)
|
||||
{
|
||||
throw new SignException(_("tradeSignEmpty"));
|
||||
}
|
||||
}
|
||||
|
||||
if (split.length == 3)
|
||||
{
|
||||
if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp"))
|
||||
{
|
||||
final int stackamount = getIntegerPositive(split[0]);
|
||||
int amount = getInteger(split[2]);
|
||||
amount -= amount % stackamount;
|
||||
if (notEmpty && (amount < 1 || stackamount < 1))
|
||||
{
|
||||
throw new SignException(_("tradeSignEmpty"));
|
||||
}
|
||||
return new Trade(fullAmount ? amount : stackamount, ess);
|
||||
}
|
||||
else
|
||||
{
|
||||
final int stackamount = getIntegerPositive(split[0]);
|
||||
final ItemStack item = getItemStack(split[1], stackamount, ess);
|
||||
int amount = getInteger(split[2]);
|
||||
amount -= amount % stackamount;
|
||||
if (notEmpty && (amount < 1 || stackamount < 1 || item.getTypeId() == 0))
|
||||
{
|
||||
throw new SignException(_("tradeSignEmpty"));
|
||||
}
|
||||
item.setAmount(fullAmount ? amount : stackamount);
|
||||
return new Trade(item, ess);
|
||||
}
|
||||
}
|
||||
throw new SignException(_("invalidSignLine", index + 1));
|
||||
}
|
||||
|
||||
protected final void substractAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException
|
||||
{
|
||||
final Double money = trade.getMoney();
|
||||
if (money != null)
|
||||
{
|
||||
changeAmount(sign, index, -money, ess);
|
||||
}
|
||||
final ItemStack item = trade.getItemStack();
|
||||
if (item != null)
|
||||
{
|
||||
changeAmount(sign, index, -item.getAmount(), ess);
|
||||
}
|
||||
final Integer exp = trade.getExperience();
|
||||
if (exp != null)
|
||||
{
|
||||
changeAmount(sign, index, -exp.intValue(), ess);
|
||||
}
|
||||
}
|
||||
|
||||
protected final void addAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException
|
||||
{
|
||||
final Double money = trade.getMoney();
|
||||
if (money != null)
|
||||
{
|
||||
changeAmount(sign, index, money, ess);
|
||||
}
|
||||
final ItemStack item = trade.getItemStack();
|
||||
if (item != null)
|
||||
{
|
||||
changeAmount(sign, index, item.getAmount(), ess);
|
||||
}
|
||||
final Integer exp = trade.getExperience();
|
||||
if (exp != null)
|
||||
{
|
||||
changeAmount(sign, index, exp.intValue(), ess);
|
||||
}
|
||||
}
|
||||
|
||||
private void changeAmount(final ISign sign, final int index, final double value, final IEssentials ess) throws SignException
|
||||
{
|
||||
|
||||
final String line = sign.getLine(index).trim();
|
||||
if (line.isEmpty())
|
||||
{
|
||||
throw new SignException("Empty line");
|
||||
}
|
||||
final String[] split = line.split("[ :]+");
|
||||
|
||||
if (split.length == 2)
|
||||
{
|
||||
final Double money = getMoney(split[0]);
|
||||
final Double amount = getDouble(split[1]);
|
||||
if (money != null && amount != null)
|
||||
{
|
||||
final String newline = Util.formatCurrency(money, ess) + ":" + Util.formatCurrency(amount + value, ess).substring(1);
|
||||
if (newline.length() > 15)
|
||||
{
|
||||
throw new SignException("Line too long!");
|
||||
}
|
||||
sign.setLine(index, newline);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (split.length == 3)
|
||||
{
|
||||
if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp"))
|
||||
{
|
||||
final int stackamount = getIntegerPositive(split[0]);
|
||||
final int amount = getInteger(split[2]);
|
||||
final String newline = stackamount + " " + split[1] + ":" + (amount + Math.round(value));
|
||||
if (newline.length() > 15)
|
||||
{
|
||||
throw new SignException("Line too long!");
|
||||
}
|
||||
sign.setLine(index, newline);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
final int stackamount = getIntegerPositive(split[0]);
|
||||
//TODO: Unused local variable
|
||||
final ItemStack item = getItemStack(split[1], stackamount, ess);
|
||||
final int amount = getInteger(split[2]);
|
||||
final String newline = stackamount + " " + split[1] + ":" + (amount + Math.round(value));
|
||||
if (newline.length() > 15)
|
||||
{
|
||||
throw new SignException("Line too long!");
|
||||
}
|
||||
sign.setLine(index, newline);
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new SignException(_("invalidSignLine", index + 1));
|
||||
}
|
||||
}
|
@@ -0,0 +1,70 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||
|
||||
|
||||
public class SignWarp extends EssentialsSign
|
||||
{
|
||||
public SignWarp()
|
||||
{
|
||||
super("Warp");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
validateTrade(sign, 3, ess);
|
||||
final String warpName = sign.getLine(1);
|
||||
|
||||
if (warpName.isEmpty())
|
||||
{
|
||||
sign.setLine(1, "§dWarp name!");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
ess.getWarps().getWarp(warpName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage(), ex);
|
||||
}
|
||||
final String group = sign.getLine(2);
|
||||
if ("Everyone".equalsIgnoreCase(group) || "Everybody".equalsIgnoreCase(group))
|
||||
{
|
||||
sign.setLine(2, "§2Everyone");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final String warpName = sign.getLine(1);
|
||||
final String group = sign.getLine(2);
|
||||
if ((!group.isEmpty()
|
||||
&& ("§2Everyone".equals(group)
|
||||
|| player.inGroup(group)))
|
||||
|| (group.isEmpty() && (!ess.getSettings().getPerWarpPermission() || player.isAuthorized("essentials.warp." + warpName))))
|
||||
{
|
||||
final Trade charge = getTrade(sign, 3, ess);
|
||||
try
|
||||
{
|
||||
player.getTeleport().warp(warpName, charge, TeleportCause.PLUGIN);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new SignException(ex.getMessage(), ex);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@@ -0,0 +1,55 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import static com.earth2me.essentials.I18n._;
|
||||
import com.earth2me.essentials.api.IEssentials;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.api.IUser;
|
||||
|
||||
|
||||
public class SignWeather extends EssentialsSign
|
||||
{
|
||||
public SignWeather()
|
||||
{
|
||||
super("Weather");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException
|
||||
{
|
||||
validateTrade(sign, 2, ess);
|
||||
final String timeString = sign.getLine(1);
|
||||
if ("Sun".equalsIgnoreCase(timeString))
|
||||
{
|
||||
sign.setLine(1, "§2Sun");
|
||||
return true;
|
||||
}
|
||||
if ("Storm".equalsIgnoreCase(timeString))
|
||||
{
|
||||
sign.setLine(1, "§2Storm");
|
||||
return true;
|
||||
}
|
||||
throw new SignException(_("onlySunStorm"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException
|
||||
{
|
||||
final Trade charge = getTrade(sign, 2, ess);
|
||||
charge.isAffordableFor(player);
|
||||
final String weatherString = sign.getLine(1);
|
||||
if ("§2Sun".equalsIgnoreCase(weatherString))
|
||||
{
|
||||
player.getWorld().setStorm(false);
|
||||
charge.charge(player);
|
||||
return true;
|
||||
}
|
||||
if ("§2Storm".equalsIgnoreCase(weatherString))
|
||||
{
|
||||
player.getWorld().setStorm(true);
|
||||
charge.charge(player);
|
||||
return true;
|
||||
}
|
||||
throw new SignException(_("onlySunStorm"));
|
||||
}
|
||||
}
|
33
EssentialsSigns/src/com/earth2me/essentials/signs/Signs.java
Normal file
33
EssentialsSigns/src/com/earth2me/essentials/signs/Signs.java
Normal file
@@ -0,0 +1,33 @@
|
||||
package com.earth2me.essentials.signs;
|
||||
|
||||
|
||||
public enum Signs
|
||||
{
|
||||
BALANCE(new SignBalance()),
|
||||
BUY(new SignBuy()),
|
||||
DISPOSAL(new SignDisposal()),
|
||||
ENCHANT(new SignEnchant()),
|
||||
FREE(new SignFree()),
|
||||
GAMEMODE(new SignGameMode()),
|
||||
HEAL(new SignHeal()),
|
||||
KIT(new SignKit()),
|
||||
MAIL(new SignMail()),
|
||||
PROTECTION(new SignProtection()),
|
||||
SELL(new SignSell()),
|
||||
SPAWNMOB(new SignSpawnmob()),
|
||||
TIME(new SignTime()),
|
||||
TRADE(new SignTrade()),
|
||||
WARP(new SignWarp()),
|
||||
WEATHER(new SignWeather());
|
||||
private final EssentialsSign sign;
|
||||
|
||||
private Signs(final EssentialsSign sign)
|
||||
{
|
||||
this.sign = sign;
|
||||
}
|
||||
|
||||
public EssentialsSign getSign()
|
||||
{
|
||||
return sign;
|
||||
}
|
||||
}
|
9
EssentialsSigns/src/plugin.yml
Normal file
9
EssentialsSigns/src/plugin.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.)
|
||||
name: EssentialsSigns
|
||||
main: com.earth2me.essentials.signs.EssentialsSignsPlugin
|
||||
# Note to developers: This next line cannot change, or the automatic versioning system will break.
|
||||
version: TeamCity
|
||||
website: http://tiny.cc/EssentialsWiki
|
||||
description: Provides signs, utilizing Essentials.
|
||||
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits]
|
||||
depend: [Essentials]
|
Reference in New Issue
Block a user