diff --git a/.gitignore b/.gitignore index eda2b5917a..9251ca7e61 100644 --- a/.gitignore +++ b/.gitignore @@ -1,42 +1,47 @@ -.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 \ No newline at end of file +/EssentialsGroupManager/.externalToolBuilders +/EssentialsAntiBuild/nbproject/private/ +/EssentialsAntiBuild/dist/ +/EssentialsAntiBuild/build/ +/jars +/out \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..b68a6c4952 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,17 @@ +language: java +jdk: + - oraclejdk7 + - openjdk7 + - openjdk6 +script: ant collect +notifications: + irc: + channels: + - "irc.esper.net#lain" + on_success: change + on_failure: always + email: + recipients: + - "khobbits@ess3.net" + on_success: change + on_failure: always \ No newline at end of file diff --git a/BuildAll/nbproject/build-impl.xml b/BuildAll/nbproject/build-impl.xml index 1f8bcbaaea..3c7d317da7 100644 --- a/BuildAll/nbproject/build-impl.xml +++ b/BuildAll/nbproject/build-impl.xml @@ -12,9 +12,9 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup @@ -181,6 +181,7 @@ is divided into following sections: + @@ -225,6 +226,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -357,11 +379,52 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -370,32 +433,270 @@ is divided into following sections: - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -427,10 +728,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -488,6 +792,7 @@ is divided into following sections: + @@ -504,6 +809,7 @@ is divided into following sections: + @@ -511,6 +817,7 @@ is divided into following sections: + @@ -537,6 +844,9 @@ is divided into following sections: + + + @@ -582,7 +892,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -862,8 +1176,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -871,12 +1186,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -888,12 +1199,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -915,6 +1222,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -1001,14 +1344,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -1021,39 +1364,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1128,15 +1472,15 @@ is divided into following sections: - - + + - - + + @@ -1174,9 +1518,12 @@ is divided into following sections: - - - + + + + + + diff --git a/BuildAll/nbproject/genfiles.properties b/BuildAll/nbproject/genfiles.properties index 8068c7fc04..b95cd73c29 100644 --- a/BuildAll/nbproject/genfiles.properties +++ b/BuildAll/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=51b33957 +build.xml.data.CRC32=cab45985 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=c5170bed -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 +nbproject/build-impl.xml.data.CRC32=b4df970c +nbproject/build-impl.xml.script.CRC32=8905537e +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/BuildAll/nbproject/project.properties b/BuildAll/nbproject/project.properties index 246ea1240f..a18e718e52 100644 --- a/BuildAll/nbproject/project.properties +++ b/BuildAll/nbproject/project.properties @@ -66,10 +66,10 @@ jar.compress=true javac.classpath=\ ${reference.Essentials.jar}:\ ${reference.EssentialsChat.jar}:\ + ${reference.EssentialsAntiBuild.jar}:\ ${reference.EssentialsProtect.jar}:\ ${reference.EssentialsSpawn.jar}:\ ${reference.EssentialsGeoIP.jar}:\ - ${reference.EssentialsGroupBridge.jar}:\ ${reference.EssentialsXMPP.jar}:\ ${reference.EssentialsGroupManager.jar} # Space-separated list of extra javac options @@ -101,16 +101,16 @@ platform.active=default_platform project.Essentials=../Essentials project.EssentialsChat=../EssentialsChat project.EssentialsGeoIP=../EssentialsGeoIP -project.EssentialsGroupBridge=../EssentialsGroupBridge project.EssentialsGroupManager=../EssentialsGroupManager +project.EssentialsAntiBuild=../EssentialsAntiBuild project.EssentialsProtect=../EssentialsProtect project.EssentialsSpawn=../EssentialsSpawn project.EssentialsXMPP=../EssentialsXMPP reference.Essentials.jar=${project.Essentials}/dist/Essentials.jar 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 diff --git a/BuildAll/nbproject/project.xml b/BuildAll/nbproject/project.xml index 420233ac92..a7afa7da68 100644 --- a/BuildAll/nbproject/project.xml +++ b/BuildAll/nbproject/project.xml @@ -40,7 +40,7 @@ jar - EssentialsGroupBridge + EssentialsGroupManager jar jar @@ -48,7 +48,7 @@ jar - EssentialsGroupManager + EssentialsAntiBuild jar jar diff --git a/Essentials/nbproject/build-impl.xml b/Essentials/nbproject/build-impl.xml index f79ca7e26d..7a011527b1 100644 --- a/Essentials/nbproject/build-impl.xml +++ b/Essentials/nbproject/build-impl.xml @@ -12,9 +12,9 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup @@ -181,6 +181,7 @@ is divided into following sections: + @@ -225,6 +226,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -357,11 +379,57 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -369,33 +437,277 @@ is divided into following sections: + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -427,10 +739,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -488,6 +803,7 @@ is divided into following sections: + @@ -504,6 +820,7 @@ is divided into following sections: + @@ -511,6 +828,7 @@ is divided into following sections: + @@ -537,6 +855,9 @@ is divided into following sections: + + + @@ -582,7 +903,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -813,8 +1138,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -822,12 +1148,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -839,12 +1161,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -866,6 +1184,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -952,14 +1306,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -972,39 +1326,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1076,9 +1431,12 @@ is divided into following sections: - - - + + + + + + diff --git a/Essentials/nbproject/genfiles.properties b/Essentials/nbproject/genfiles.properties index 8d631fddf4..8b1c292649 100644 --- a/Essentials/nbproject/genfiles.properties +++ b/Essentials/nbproject/genfiles.properties @@ -4,8 +4,8 @@ build.xml.stylesheet.CRC32=28e38971@1.38.2.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=a830bc14 -nbproject/build-impl.xml.script.CRC32=a9f8842a -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 +nbproject/build-impl.xml.script.CRC32=21ffdddf +nbproject/build-impl.xml.stylesheet.CRC32=c6d2a60f@1.56.1.46 nbproject/profiler-build-impl.xml.data.CRC32=ab78ce15 nbproject/profiler-build-impl.xml.script.CRC32=abda56ed nbproject/profiler-build-impl.xml.stylesheet.CRC32=f10cf54c@1.11.1 diff --git a/Essentials/nbproject/project.properties b/Essentials/nbproject/project.properties index 7a5ffe7bbb..f749b85535 100644 --- a/Essentials/nbproject/project.properties +++ b/Essentials/nbproject/project.properties @@ -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 @@ -68,7 +68,6 @@ file.reference.BOSEconomy7.jar=../lib/BOSEconomy7.jar file.reference.bPermissions.jar=../lib/bPermissions.jar file.reference.bpermissions2.jar=../lib/bpermissions2.jar file.reference.bukkit.jar=../lib/bukkit.jar -file.reference.craftbukkit.jar=../lib/craftbukkit.jar file.reference.iCo4.jar=../lib/iCo4.jar file.reference.iCo5.jar=../lib/iCo5.jar file.reference.iCo6.jar=../lib/iCo6.jar @@ -79,6 +78,7 @@ file.reference.PermissionsBukkit-1.2.jar=../lib/PermissionsBukkit-1.2.jar file.reference.PermissionsEx.jar=../lib/PermissionsEx.jar file.reference.Privileges.jar=..\\lib\\Privileges.jar file.reference.Vault.jar=../lib/Vault.jar +file.reference.SimplyPerms.jar=../lib/SimplyPerms.jar includes=** jar.archive.disabled=${jnlp.enabled} jar.compress=true @@ -96,12 +96,12 @@ javac.classpath=\ ${file.reference.lombok.jar}:\ ${reference.EssentialsGroupManager.jar}:\ ${file.reference.bukkit.jar}:\ - ${file.reference.craftbukkit.jar}:\ ${file.reference.Vault.jar}:\ ${file.reference.Privileges.jar}:\ - ${file.reference.bpermissions2.jar} + ${file.reference.bpermissions2.jar}:\ + ${file.reference.SimplyPerms.jar} # Space-separated list of extra javac options -javac.compilerargs= +javac.compilerargs=-Xlint:unchecked javac.deprecation=false javac.processorpath=\ ${javac.classpath} diff --git a/Essentials/src/book.txt b/Essentials/src/book.txt new file mode 100644 index 0000000000..164910fb7e --- /dev/null +++ b/Essentials/src/book.txt @@ -0,0 +1,18 @@ +This is the book file. + +This file format works similar to the info.txt, motd.txt and rules.txt + +Place content in here that you would like to be used by books ingame. + +You can use this content by using the book:
meta option in kits or item spawning. + +#Colors +Minecraft colors: +&0 &&0 &1 &&1 &2 &&2 &3 &&3 +&4 &&4 &5 &&5 &6 &&6 &7 &&7 +&8 &&8 &9 &&9 &a &&a &b &&b +&c &&c &d &&d &e &&e &f &&f +&0 +&&k &kMagic&r &&l &lBold +&&m &mStrike&r &&n &nUline +&&o &oItalic&r &&r &rReset \ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/AlternativeCommandsHandler.java b/Essentials/src/com/earth2me/essentials/AlternativeCommandsHandler.java index e75644ad53..e9cb6fe193 100644 --- a/Essentials/src/com/earth2me/essentials/AlternativeCommandsHandler.java +++ b/Essentials/src/com/earth2me/essentials/AlternativeCommandsHandler.java @@ -121,13 +121,14 @@ public PluginCommand getAlternative(final String label) return commands.get(0); } - public void executed(final String label, final String otherLabel) + public void executed(final String label, final PluginCommand pc) { + final String altString = pc.getPlugin().getName() + ":" + pc.getLabel(); if (ess.getSettings().isDebug()) { - LOGGER.log(Level.INFO, "Essentials: Alternative command " + label + " found, using " + otherLabel); + LOGGER.log(Level.INFO, "Essentials: Alternative command " + label + " found, using " + altString); } - disabledList.put(label, otherLabel); + disabledList.put(label, altString); } public Map disabledCommands() diff --git a/Essentials/src/com/earth2me/essentials/Backup.java b/Essentials/src/com/earth2me/essentials/Backup.java index baa90e561e..3b7d9297c1 100644 --- a/Essentials/src/com/earth2me/essentials/Backup.java +++ b/Essentials/src/com/earth2me/essentials/Backup.java @@ -25,16 +25,33 @@ public Backup(final IEssentials ess) server = ess.getServer(); if (server.getOnlinePlayers().length > 0) { - startTask(); + ess.runTaskAsynchronously(new Runnable() + { + @Override + public void run() + { + startTask(); + } + }); } } - void onPlayerJoin() + public void onPlayerJoin() { startTask(); } - private void startTask() + public synchronized void stopTask() + { + running = false; + if (taskId != -1) + { + server.getScheduler().cancelTask(taskId); + } + taskId = -1; + } + + private synchronized void startTask() { if (!running) { @@ -61,7 +78,8 @@ public void run() { return; } - if ("save-all".equalsIgnoreCase(command)) { + if ("save-all".equalsIgnoreCase(command)) + { final CommandSender cs = server.getConsoleSender(); server.dispatchCommand(cs, "save-all"); active = false; @@ -72,7 +90,7 @@ public void run() server.dispatchCommand(cs, "save-all"); server.dispatchCommand(cs, "save-off"); - ess.scheduleAsyncDelayedTask( + ess.runTaskAsynchronously( new Runnable() { @Override @@ -123,11 +141,7 @@ public void run() server.dispatchCommand(cs, "save-on"); if (server.getOnlinePlayers().length == 0) { - running = false; - if (taskId != -1) - { - server.getScheduler().cancelTask(taskId); - } + stopTask(); } active = false; LOGGER.log(Level.INFO, _("backupFinished")); diff --git a/Essentials/src/com/earth2me/essentials/DescParseTickFormat.java b/Essentials/src/com/earth2me/essentials/DescParseTickFormat.java index 9c40acacc7..91efe3c0ad 100644 --- a/Essentials/src/com/earth2me/essentials/DescParseTickFormat.java +++ b/Essentials/src/com/earth2me/essentials/DescParseTickFormat.java @@ -269,11 +269,11 @@ public static Date ticksToDate(long ticks) // How many ingame days have passed since the server start? final long days = ticks / ticksPerDay; - ticks = ticks - days * ticksPerDay; + ticks -= days * ticksPerDay; // How many hours on the last day? final long hours = ticks / ticksPerHour; - ticks = ticks - hours * ticksPerHour; + ticks -= hours * ticksPerHour; // How many minutes on the last day? final long minutes = (long)Math.floor(ticks / ticksPerMinute); diff --git a/Essentials/src/com/earth2me/essentials/Enchantments.java b/Essentials/src/com/earth2me/essentials/Enchantments.java index 060dfd2c1e..e30bff1c1f 100644 --- a/Essentials/src/com/earth2me/essentials/Enchantments.java +++ b/Essentials/src/com/earth2me/essentials/Enchantments.java @@ -5,112 +5,144 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.regex.Pattern; import org.bukkit.enchantments.Enchantment; public class Enchantments { - private static final transient Pattern NUMPATTERN = Pattern.compile("\\d+"); private static final Map ENCHANTMENTS = new HashMap(); + private static final Map ALIASENCHANTMENTS = new HashMap(); static { ENCHANTMENTS.put("alldamage", Enchantment.DAMAGE_ALL); - ENCHANTMENTS.put("alldmg", Enchantment.DAMAGE_ALL); + ALIASENCHANTMENTS.put("alldmg", Enchantment.DAMAGE_ALL); ENCHANTMENTS.put("sharpness", Enchantment.DAMAGE_ALL); - ENCHANTMENTS.put("sharp", Enchantment.DAMAGE_ALL); - - ENCHANTMENTS.put("arthropodsdamage", Enchantment.DAMAGE_ARTHROPODS); + ALIASENCHANTMENTS.put("sharp", Enchantment.DAMAGE_ALL); + ALIASENCHANTMENTS.put("dal", Enchantment.DAMAGE_ALL); + ENCHANTMENTS.put("ardmg", Enchantment.DAMAGE_ARTHROPODS); ENCHANTMENTS.put("baneofarthropods", Enchantment.DAMAGE_ARTHROPODS); - ENCHANTMENTS.put("baneofarthropod", Enchantment.DAMAGE_ARTHROPODS); - ENCHANTMENTS.put("arthropod", Enchantment.DAMAGE_ARTHROPODS); + ALIASENCHANTMENTS.put("baneofarthropod", Enchantment.DAMAGE_ARTHROPODS); + ALIASENCHANTMENTS.put("arthropod", Enchantment.DAMAGE_ARTHROPODS); + ALIASENCHANTMENTS.put("dar", Enchantment.DAMAGE_ARTHROPODS); ENCHANTMENTS.put("undeaddamage", Enchantment.DAMAGE_UNDEAD); ENCHANTMENTS.put("smite", Enchantment.DAMAGE_UNDEAD); + ALIASENCHANTMENTS.put("du", Enchantment.DAMAGE_UNDEAD); ENCHANTMENTS.put("digspeed", Enchantment.DIG_SPEED); ENCHANTMENTS.put("efficiency", Enchantment.DIG_SPEED); - ENCHANTMENTS.put("minespeed", Enchantment.DIG_SPEED); - ENCHANTMENTS.put("cutspeed", Enchantment.DIG_SPEED); + ALIASENCHANTMENTS.put("minespeed", Enchantment.DIG_SPEED); + ALIASENCHANTMENTS.put("cutspeed", Enchantment.DIG_SPEED); + ALIASENCHANTMENTS.put("ds", Enchantment.DIG_SPEED); + ALIASENCHANTMENTS.put("eff", Enchantment.DIG_SPEED); ENCHANTMENTS.put("durability", Enchantment.DURABILITY); - ENCHANTMENTS.put("dura", Enchantment.DURABILITY); + ALIASENCHANTMENTS.put("dura", Enchantment.DURABILITY); ENCHANTMENTS.put("unbreaking", Enchantment.DURABILITY); + ALIASENCHANTMENTS.put("d", Enchantment.DURABILITY); + + ENCHANTMENTS.put("thorns", Enchantment.THORNS); + ENCHANTMENTS.put("highcrit", Enchantment.THORNS); + ALIASENCHANTMENTS.put("thorn", Enchantment.THORNS); + ALIASENCHANTMENTS.put("highercrit", Enchantment.THORNS); + ALIASENCHANTMENTS.put("t", Enchantment.THORNS); ENCHANTMENTS.put("fireaspect", Enchantment.FIRE_ASPECT); ENCHANTMENTS.put("fire", Enchantment.FIRE_ASPECT); - ENCHANTMENTS.put("meleefire", Enchantment.FIRE_ASPECT); - ENCHANTMENTS.put("meleeflame", Enchantment.FIRE_ASPECT); + ALIASENCHANTMENTS.put("meleefire", Enchantment.FIRE_ASPECT); + ALIASENCHANTMENTS.put("meleeflame", Enchantment.FIRE_ASPECT); + ALIASENCHANTMENTS.put("fa", Enchantment.FIRE_ASPECT); ENCHANTMENTS.put("knockback", Enchantment.KNOCKBACK); + ALIASENCHANTMENTS.put("kback", Enchantment.KNOCKBACK); + ALIASENCHANTMENTS.put("kb", Enchantment.KNOCKBACK); + ALIASENCHANTMENTS.put("k", Enchantment.KNOCKBACK); - ENCHANTMENTS.put("blockslootbonus", Enchantment.LOOT_BONUS_BLOCKS); + ALIASENCHANTMENTS.put("blockslootbonus", Enchantment.LOOT_BONUS_BLOCKS); ENCHANTMENTS.put("fortune", Enchantment.LOOT_BONUS_BLOCKS); + ALIASENCHANTMENTS.put("fort", Enchantment.LOOT_BONUS_BLOCKS); + ALIASENCHANTMENTS.put("lbb", Enchantment.LOOT_BONUS_BLOCKS); - ENCHANTMENTS.put("mobslootbonus", Enchantment.LOOT_BONUS_MOBS); + ALIASENCHANTMENTS.put("mobslootbonus", Enchantment.LOOT_BONUS_MOBS); ENCHANTMENTS.put("mobloot", Enchantment.LOOT_BONUS_MOBS); ENCHANTMENTS.put("looting", Enchantment.LOOT_BONUS_MOBS); + ALIASENCHANTMENTS.put("lbm", Enchantment.LOOT_BONUS_MOBS); - ENCHANTMENTS.put("oxygen", Enchantment.OXYGEN); + ALIASENCHANTMENTS.put("oxygen", Enchantment.OXYGEN); ENCHANTMENTS.put("respiration", Enchantment.OXYGEN); - ENCHANTMENTS.put("breathing", Enchantment.OXYGEN); + ALIASENCHANTMENTS.put("breathing", Enchantment.OXYGEN); ENCHANTMENTS.put("breath", Enchantment.OXYGEN); + ALIASENCHANTMENTS.put("o", Enchantment.OXYGEN); ENCHANTMENTS.put("protection", Enchantment.PROTECTION_ENVIRONMENTAL); - ENCHANTMENTS.put("prot", Enchantment.PROTECTION_ENVIRONMENTAL); + ALIASENCHANTMENTS.put("prot", Enchantment.PROTECTION_ENVIRONMENTAL); ENCHANTMENTS.put("protect", Enchantment.PROTECTION_ENVIRONMENTAL); + ALIASENCHANTMENTS.put("p", Enchantment.PROTECTION_ENVIRONMENTAL); - ENCHANTMENTS.put("explosionsprotection", Enchantment.PROTECTION_EXPLOSIONS); - ENCHANTMENTS.put("explosionprotection", Enchantment.PROTECTION_EXPLOSIONS); - ENCHANTMENTS.put("expprot", Enchantment.PROTECTION_EXPLOSIONS); - ENCHANTMENTS.put("blastprotection", Enchantment.PROTECTION_EXPLOSIONS); + ALIASENCHANTMENTS.put("explosionsprotection", Enchantment.PROTECTION_EXPLOSIONS); + ALIASENCHANTMENTS.put("explosionprotection", Enchantment.PROTECTION_EXPLOSIONS); + ALIASENCHANTMENTS.put("expprot", Enchantment.PROTECTION_EXPLOSIONS); + ALIASENCHANTMENTS.put("blastprotection", Enchantment.PROTECTION_EXPLOSIONS); ENCHANTMENTS.put("blastprotect", Enchantment.PROTECTION_EXPLOSIONS); + ALIASENCHANTMENTS.put("pe", Enchantment.PROTECTION_EXPLOSIONS); - ENCHANTMENTS.put("fallprotection", Enchantment.PROTECTION_FALL); + ALIASENCHANTMENTS.put("fallprotection", Enchantment.PROTECTION_FALL); ENCHANTMENTS.put("fallprot", Enchantment.PROTECTION_FALL); ENCHANTMENTS.put("featherfall", Enchantment.PROTECTION_FALL); - ENCHANTMENTS.put("featherfalling", Enchantment.PROTECTION_FALL); + ALIASENCHANTMENTS.put("featherfalling", Enchantment.PROTECTION_FALL); + ALIASENCHANTMENTS.put("pfa", Enchantment.PROTECTION_FALL); - ENCHANTMENTS.put("fireprotection", Enchantment.PROTECTION_FIRE); - ENCHANTMENTS.put("flameprotection", Enchantment.PROTECTION_FIRE); + ALIASENCHANTMENTS.put("fireprotection", Enchantment.PROTECTION_FIRE); + ALIASENCHANTMENTS.put("flameprotection", Enchantment.PROTECTION_FIRE); ENCHANTMENTS.put("fireprotect", Enchantment.PROTECTION_FIRE); - ENCHANTMENTS.put("flameprotect", Enchantment.PROTECTION_FIRE); + ALIASENCHANTMENTS.put("flameprotect", Enchantment.PROTECTION_FIRE); + ENCHANTMENTS.put("fireprot", Enchantment.PROTECTION_FIRE); + ALIASENCHANTMENTS.put("flameprot", Enchantment.PROTECTION_FIRE); + ALIASENCHANTMENTS.put("pf", Enchantment.PROTECTION_FIRE); ENCHANTMENTS.put("projectileprotection", Enchantment.PROTECTION_PROJECTILE); ENCHANTMENTS.put("projprot", Enchantment.PROTECTION_PROJECTILE); + ALIASENCHANTMENTS.put("pp", Enchantment.PROTECTION_PROJECTILE); ENCHANTMENTS.put("silktouch", Enchantment.SILK_TOUCH); - ENCHANTMENTS.put("softtouch", Enchantment.SILK_TOUCH); + ALIASENCHANTMENTS.put("softtouch", Enchantment.SILK_TOUCH); + ALIASENCHANTMENTS.put("st", Enchantment.SILK_TOUCH); ENCHANTMENTS.put("waterworker", Enchantment.WATER_WORKER); ENCHANTMENTS.put("aquaaffinity", Enchantment.WATER_WORKER); + ALIASENCHANTMENTS.put("watermine", Enchantment.WATER_WORKER); + ALIASENCHANTMENTS.put("ww", Enchantment.WATER_WORKER); - ENCHANTMENTS.put("firearrow", Enchantment.ARROW_FIRE); + ALIASENCHANTMENTS.put("firearrow", Enchantment.ARROW_FIRE); ENCHANTMENTS.put("flame", Enchantment.ARROW_FIRE); ENCHANTMENTS.put("flamearrow", Enchantment.ARROW_FIRE); + ALIASENCHANTMENTS.put("af", Enchantment.ARROW_FIRE); ENCHANTMENTS.put("arrowdamage", Enchantment.ARROW_DAMAGE); ENCHANTMENTS.put("power", Enchantment.ARROW_DAMAGE); - ENCHANTMENTS.put("arrowpower", Enchantment.ARROW_DAMAGE); + ALIASENCHANTMENTS.put("arrowpower", Enchantment.ARROW_DAMAGE); + ALIASENCHANTMENTS.put("ad", Enchantment.ARROW_DAMAGE); ENCHANTMENTS.put("arrowknockback", Enchantment.ARROW_KNOCKBACK); - ENCHANTMENTS.put("arrowkb", Enchantment.ARROW_KNOCKBACK); + ALIASENCHANTMENTS.put("arrowkb", Enchantment.ARROW_KNOCKBACK); ENCHANTMENTS.put("punch", Enchantment.ARROW_KNOCKBACK); - ENCHANTMENTS.put("arrowpunch", Enchantment.ARROW_KNOCKBACK); + ALIASENCHANTMENTS.put("arrowpunch", Enchantment.ARROW_KNOCKBACK); + ALIASENCHANTMENTS.put("ak", Enchantment.ARROW_KNOCKBACK); - ENCHANTMENTS.put("infinitearrows", Enchantment.ARROW_INFINITE); + ALIASENCHANTMENTS.put("infinitearrows", Enchantment.ARROW_INFINITE); ENCHANTMENTS.put("infarrows", Enchantment.ARROW_INFINITE); ENCHANTMENTS.put("infinity", Enchantment.ARROW_INFINITE); - ENCHANTMENTS.put("infinite", Enchantment.ARROW_INFINITE); - ENCHANTMENTS.put("unlimited", Enchantment.ARROW_INFINITE); - ENCHANTMENTS.put("unlimitedarrows", Enchantment.ARROW_INFINITE); + ALIASENCHANTMENTS.put("infinite", Enchantment.ARROW_INFINITE); + ALIASENCHANTMENTS.put("unlimited", Enchantment.ARROW_INFINITE); + ALIASENCHANTMENTS.put("unlimitedarrows", Enchantment.ARROW_INFINITE); + ALIASENCHANTMENTS.put("ai", Enchantment.ARROW_INFINITE); } public static Enchantment getByName(String name) { Enchantment enchantment; - if (NUMPATTERN.matcher(name).matches()) { + if (Util.isInt(name)) { enchantment = Enchantment.getById(Integer.parseInt(name)); } else { enchantment = Enchantment.getByName(name.toUpperCase(Locale.ENGLISH)); @@ -119,6 +151,10 @@ public static Enchantment getByName(String name) { { enchantment = ENCHANTMENTS.get(name.toLowerCase(Locale.ENGLISH)); } + if (enchantment == null) + { + enchantment = ALIASENCHANTMENTS.get(name.toLowerCase(Locale.ENGLISH)); + } return enchantment; } diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 8790e70223..d9b1af096f 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -20,7 +20,6 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.api.Economy; import com.earth2me.essentials.api.IJails; -import com.earth2me.essentials.commands.EssentialsCommand; import com.earth2me.essentials.commands.IEssentialsCommand; import com.earth2me.essentials.commands.NoChargeException; import com.earth2me.essentials.commands.NotEnoughArgumentsException; @@ -36,7 +35,6 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -49,9 +47,12 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; +import org.bukkit.command.SimpleCommandMap; +import org.bukkit.command.defaults.VanillaCommand; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.world.WorldLoadEvent; @@ -62,12 +63,13 @@ import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.scheduler.BukkitTask; import org.yaml.snakeyaml.error.YAMLException; public class Essentials extends JavaPlugin implements IEssentials { - public static final int BUKKIT_VERSION = 2149; + public static final int BUKKIT_VERSION = 2754; private static final Logger LOGGER = Logger.getLogger("Minecraft"); private transient ISettings settings; private final transient TNTExplodeListener tntListener = new TNTExplodeListener(this); @@ -86,6 +88,7 @@ public class Essentials extends JavaPlugin implements IEssentials private transient Metrics metrics; private transient EssentialsTimer timer; private transient List vanishedPlayers = new ArrayList(); + private transient SimpleCommandMap scm; @Override public ISettings getSettings() @@ -124,6 +127,7 @@ public void onEnable() i18n = new I18n(this); i18n.onEnable(); execTimer.mark("I18n1"); + scm = new SimpleCommandMap(this.getServer()); final PluginManager pm = getServer().getPluginManager(); for (Plugin plugin : pm.getPlugins()) { @@ -178,6 +182,8 @@ public void onEnable() itemDb = new ItemDb(this); confList.add(itemDb); execTimer.mark("Init(Worth/ItemDB)"); + jails = new Jails(this); + confList.add(jails); reload(); } catch (YAMLException exception) @@ -209,6 +215,40 @@ public void onPlayerJoin(final PlayerJoinEvent event) backup = new Backup(this); permissionsHandler = new PermissionsHandler(this, settings.useBukkitPermissions()); alternativeCommandsHandler = new AlternativeCommandsHandler(this); + + timer = new EssentialsTimer(this); + scheduleSyncRepeatingTask(timer, 1000, 50); + + Economy.setEss(this); + execTimer.mark("RegHandler"); + + final MetricsStarter metricsStarter = new MetricsStarter(this); + if (metricsStarter.getStart() != null && metricsStarter.getStart() == true) + { + runTaskLaterAsynchronously(metricsStarter, 1); + } + else if (metricsStarter.getStart() != null && metricsStarter.getStart() == false) + { + final MetricsListener metricsListener = new MetricsListener(this, metricsStarter); + pm.registerEvents(metricsListener, this); + } + + final String timeroutput = execTimer.end(); + if (getSettings().isDebug()) + { + LOGGER.log(Level.INFO, "Essentials load " + timeroutput); + } + } + + private void registerListeners(PluginManager pm) + { + HandlerList.unregisterAll(this); + + if (getSettings().isDebug()) + { + LOGGER.log(Level.INFO, "Registering Listeners"); + } + final EssentialsPluginListener serverListener = new EssentialsPluginListener(this); pm.registerEvents(serverListener, this); confList.add(serverListener); @@ -234,34 +274,9 @@ public void onPlayerJoin(final PlayerJoinEvent event) final EssentialsWorldListener worldListener = new EssentialsWorldListener(this); pm.registerEvents(worldListener, this); - //TODO: Check if this should be here, and not above before reload() - jails = new Jails(this); - confList.add(jails); - pm.registerEvents(tntListener, this); - timer = new EssentialsTimer(this); - getScheduler().scheduleSyncRepeatingTask(this, timer, 100, 100); - - Economy.setEss(this); - execTimer.mark("RegListeners"); - - final MetricsStarter metricsStarter = new MetricsStarter(this); - if (metricsStarter.getStart() != null && metricsStarter.getStart() == true) - { - getScheduler().scheduleAsyncDelayedTask(this, metricsStarter, 1); - } - else if (metricsStarter.getStart() != null && metricsStarter.getStart() == false) - { - final MetricsListener metricsListener = new MetricsListener(this, metricsStarter); - pm.registerEvents(metricsListener, this); - } - - final String timeroutput = execTimer.end(); - if (getSettings().isDebug()) - { - LOGGER.log(Level.INFO, "Essentials load " + timeroutput); - } + jails.resetListener(); } @Override @@ -276,7 +291,9 @@ public void onDisable() p.sendMessage(_("unvanishedReload")); } } + cleanupOpenInventories(); i18n.onDisable(); + backup.stopTask(); Economy.setEss(null); Trade.closeLog(); } @@ -293,6 +310,9 @@ public void reload() } i18n.updateLocale(settings.getLocale()); + + final PluginManager pm = getServer().getPluginManager(); + registerListeners(pm); } @Override @@ -310,7 +330,7 @@ public boolean onCommandEssentials(final CommandSender sender, final Command com final PluginCommand pc = alternativeCommandsHandler.getAlternative(commandLabel); if (pc != null) { - alternativeCommandsHandler.executed(commandLabel, pc.getLabel()); + alternativeCommandsHandler.executed(commandLabel, pc); try { return pc.execute(sender, commandLabel, args); @@ -330,11 +350,10 @@ public boolean onCommandEssentials(final CommandSender sender, final Command com if (sender instanceof Player) { user = getUser(sender); - LOGGER.log(Level.INFO, String.format("[PLAYER_COMMAND] %s: /%s %s ", ((Player)sender).getName(), commandLabel, EssentialsCommand.getFinalArg(args, 0))); } // New mail notification - if (user != null && !getSettings().isCommandDisabled("mail") && !commandLabel.equals("mail") && user.isAuthorized("essentials.mail")) + if (user != null && !getSettings().isCommandDisabled("mail") && !command.getName().equals("mail") && user.isAuthorized("essentials.mail")) { final List mail = user.getMails(); if (mail != null && !mail.isEmpty()) @@ -343,9 +362,26 @@ public boolean onCommandEssentials(final CommandSender sender, final Command com } } + //Print version even if admin command is not available + if (commandLabel.equalsIgnoreCase("essversion")) + { + sender.sendMessage("This server is running Essentials " + getDescription().getVersion()); + return true; + } + // Check for disabled commands if (getSettings().isCommandDisabled(commandLabel)) { + if (scm != null) + { + for (VanillaCommand cmd : scm.getFallbackCommands()) + { + if (cmd.matches(commandLabel)) + { + cmd.execute(sender, commandLabel, args); + } + } + } return true; } @@ -371,6 +407,19 @@ public boolean onCommandEssentials(final CommandSender sender, final Command com return true; } + if (user != null && user.isJailed() && !user.isAuthorized(cmd, "essentials.jail.allow.")) + { + if (user.getJailTimeout() > 0) + { + user.sendMessage(_("playerJailedFor", user.getName(), Util.formatDateDiff(user.getJailTimeout()))); + } + else + { + user.sendMessage(_("jailMessage")); + } + return true; + } + // Run the command try { @@ -411,6 +460,26 @@ public boolean onCommandEssentials(final CommandSender sender, final Command com } } + public void cleanupOpenInventories() + { + for (Player player : getServer().getOnlinePlayers()) + { + User user = getUser(player); + if (user.isRecipeSee()) + { + user.getPlayer().getOpenInventory().getTopInventory().clear(); + user.getPlayer().getOpenInventory().close(); + user.setRecipeSee(false); + } + if (user.isInvSee() || user.isEnderSee()) + { + user.getPlayer().getOpenInventory().close(); + user.setInvSee(false); + user.setEnderSee(false); + } + } + } + @Override public void showError(final CommandSender sender, final Throwable exception, final String commandLabel) { @@ -470,16 +539,22 @@ public User getUser(final Object base) } if (base instanceof String) { - final User user = userMap.getUser((String)base); - if (user != null && user.getBase() instanceof OfflinePlayer) - { - ((OfflinePlayer)user.getBase()).setName((String)base); - } - return user; + return getOfflineUser((String)base); } return null; } + @Override + public User getOfflineUser(final String name) + { + final User user = userMap.getUser(name); + if (user != null && user.getBase() instanceof OfflinePlayer) + { + ((OfflinePlayer)user.getBase()).setName(name); + } + return user; + } + private User getUser(final T base) { if (base == null) @@ -491,6 +566,13 @@ private User getUser(final T base) { return (User)base; } + + if (userMap == null) + { + LOGGER.log(Level.WARNING, "Essentials userMap not initialized"); + return null; + } + User user = userMap.getUser(base.getName()); if (user == null) @@ -504,17 +586,6 @@ private User getUser(final T base) return user; } - @Override - public User getOfflineUser(final String name) - { - final User user = userMap.getUser(name); - if (user != null && user.getBase() instanceof OfflinePlayer) - { - ((OfflinePlayer)user.getBase()).setName(name); - } - return user; - } - @Override public World getWorld(final String name) { @@ -567,9 +638,15 @@ public int broadcastMessage(final IUser sender, final String message) } @Override - public int scheduleAsyncDelayedTask(final Runnable run) + public BukkitTask runTaskAsynchronously(final Runnable run) + { + return this.getScheduler().runTaskAsynchronously(this, run); + } + + @Override + public BukkitTask runTaskLaterAsynchronously(final Runnable run, final long delay) { - return this.getScheduler().scheduleAsyncDelayedTask(this, run); + return this.getScheduler().runTaskLaterAsynchronously(this, run, delay); } @Override @@ -638,6 +715,7 @@ public List getVanishedPlayers() return vanishedPlayers; } + private static class EssentialsWorldListener implements Listener, Runnable { private transient final IEssentials ess; diff --git a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java index 0c6bec0fee..c5c35d9018 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java @@ -28,8 +28,7 @@ public void onBlockPlace(final BlockPlaceEvent event) return; } final User user = ess.getUser(event.getPlayer()); - final boolean unlimitedForUser = user.hasUnlimited(is); - if (unlimitedForUser && user.getGameMode() == GameMode.SURVIVAL) + if (user.hasUnlimited(is) && user.getGameMode() == GameMode.SURVIVAL) { ess.scheduleSyncDelayedTask( new Runnable() diff --git a/Essentials/src/com/earth2me/essentials/EssentialsConf.java b/Essentials/src/com/earth2me/essentials/EssentialsConf.java index b2cb1fd125..26f9d1c9da 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsConf.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsConf.java @@ -5,43 +5,51 @@ import java.io.*; import java.nio.ByteBuffer; import java.nio.CharBuffer; -import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CoderResult; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; +import org.bukkit.*; +import org.bukkit.OfflinePlayer; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; public class EssentialsConf extends YamlConfiguration { private static final Logger LOGGER = Logger.getLogger("Minecraft"); - private transient File configFile; - private transient String templateName = null; - private transient Class resourceClass = EssentialsConf.class; + private final File configFile; + private String templateName = null; + private Class resourceClass = EssentialsConf.class; private static final Charset UTF8 = Charset.forName("UTF-8"); + private static final ExecutorService EXECUTOR_SERVICE = Executors.newSingleThreadExecutor(); + private final AtomicInteger pendingDiskWrites = new AtomicInteger(0); public EssentialsConf(final File configFile) { super(); - this.configFile = configFile; + this.configFile = configFile.getAbsoluteFile(); } + private final byte[] bytebuffer = new byte[1024]; public synchronized void load() { - configFile = configFile.getAbsoluteFile(); + if (pendingDiskWrites.get() != 0) + { + LOGGER.log(Level.INFO, "File " + configFile + " not read, because it's not yet written to disk."); + return; + } if (!configFile.getParentFile().exists()) { if (!configFile.getParentFile().mkdirs()) @@ -94,18 +102,7 @@ public synchronized void load() } else { - try - { - LOGGER.log(Level.INFO, _("creatingEmptyConfig", configFile.toString())); - if (!configFile.createNewFile()) - { - LOGGER.log(Level.SEVERE, _("failedToCreateConfig", configFile.toString())); - } - } - catch (IOException ex) - { - LOGGER.log(Level.SEVERE, _("failedToCreateConfig", configFile.toString()), ex); - } + return; } } @@ -115,9 +112,12 @@ public synchronized void load() final FileInputStream inputStream = new FileInputStream(configFile); try { - final FileChannel channel = inputStream.getChannel(); final ByteBuffer buffer = ByteBuffer.allocate((int)configFile.length()); - channel.read(buffer); + int length; + while ((length = inputStream.read(bytebuffer)) != -1) + { + buffer.put(bytebuffer, 0, length); + } buffer.rewind(); final CharBuffer data = CharBuffer.allocate((int)configFile.length()); CharsetDecoder decoder = UTF8.newDecoder(); @@ -232,6 +232,148 @@ public void setTemplateName(final String templateName, final Class resClass) this.resourceClass = resClass; } + public void save() + { + try + { + save(configFile); + } + catch (IOException ex) + { + LOGGER.log(Level.SEVERE, ex.getMessage(), ex); + } + } + + public void saveWithError() throws IOException + { + save(configFile); + } + + @Override + public synchronized void save(final File file) throws IOException + { + delayedSave(file); + } + + public synchronized void forceSave() + { + try + { + Future future = delayedSave(configFile); + if (future != null) + { + future.get(); + } + } + catch (InterruptedException ex) + { + LOGGER.log(Level.SEVERE, ex.getMessage(), ex); + } + catch (ExecutionException ex) + { + LOGGER.log(Level.SEVERE, ex.getMessage(), ex); + } + } + + private Future delayedSave(final File file) + { + //long startTime = System.nanoTime(); + if (file == null) + { + throw new IllegalArgumentException("File cannot be null"); + } + + final String data = saveToString(); + + if (data.length() == 0) + { + return null; + } + + pendingDiskWrites.incrementAndGet(); + + Future future = EXECUTOR_SERVICE.submit(new WriteRunner(configFile, data, pendingDiskWrites)); + + //LOGGER.log(Level.INFO, configFile + " prepared for writing in " + (System.nanoTime() - startTime) + " nsec."); + + return future; + } + + + private static class WriteRunner implements Runnable + { + private final File configFile; + private final String data; + private final AtomicInteger pendingDiskWrites; + + private WriteRunner(final File configFile, final String data, final AtomicInteger pendingDiskWrites) + { + this.configFile = configFile; + this.data = data; + this.pendingDiskWrites = pendingDiskWrites; + } + + @Override + public void run() + { + //long startTime = System.nanoTime(); + synchronized (configFile) + { + if (pendingDiskWrites.get() > 1) + { + // Writes can be skipped, because they are stored in a queue (in the executor). + // Only the last is actually written. + pendingDiskWrites.decrementAndGet(); + //LOGGER.log(Level.INFO, configFile + " skipped writing in " + (System.nanoTime() - startTime) + " nsec."); + return; + } + try + { + Files.createParentDirs(configFile); + + if (!configFile.exists()) + { + try + { + LOGGER.log(Level.INFO, _("creatingEmptyConfig", configFile.toString())); + if (!configFile.createNewFile()) + { + LOGGER.log(Level.SEVERE, _("failedToCreateConfig", configFile.toString())); + return; + } + } + catch (IOException ex) + { + LOGGER.log(Level.SEVERE, _("failedToCreateConfig", configFile.toString()), ex); + return; + } + } + + + final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(configFile), UTF8); + + try + { + writer.write(data); + } + finally + { + writer.close(); + } + } + catch (IOException e) + { + LOGGER.log(Level.SEVERE, e.getMessage(), e); + } + finally + { + //LOGGER.log(Level.INFO, configFile + " written to disk in " + (System.nanoTime() - startTime) + " nsec."); + pendingDiskWrites.decrementAndGet(); + } + } + } + } + public boolean hasProperty(final String path) { return isSet(path); @@ -316,81 +458,297 @@ public void setProperty(final String path, final ItemStack stack) set(path, map); } - public long getLong(final String path, final long def) + public void setProperty(String path, List object) { - try - { - final Number num = (Number)get(path); - return num == null ? def : num.longValue(); - } - catch (ClassCastException ex) - { - return def; - } + set(path, new ArrayList(object)); + } + + public void setProperty(String path, Map object) + { + set(path, new LinkedHashMap(object)); + } + + public Object getProperty(String path) + { + return get(path); + } + + public void setProperty(String path, Object object) + { + set(path, object); + } + + public void removeProperty(String path) + { + set(path, null); } @Override - public double getDouble(final String path, final double def) + public synchronized Object get(String path) { - try - { - Number num = (Number)get(path); - return num == null ? def : num.doubleValue(); - } - catch (ClassCastException ex) - { - return def; - } + return super.get(path); } - public void save() + @Override + public synchronized Object get(String path, Object def) { - try - { - save(configFile); - } - catch (IOException ex) - { - LOGGER.log(Level.SEVERE, ex.getMessage(), ex); - } + return super.get(path, def); } @Override - public synchronized void save(final File file) throws IOException + public synchronized boolean getBoolean(String path) { - if (file == null) - { - throw new IllegalArgumentException("File cannot be null"); - } + return super.getBoolean(path); + } - Files.createParentDirs(file); + @Override + public synchronized boolean getBoolean(String path, boolean def) + { + return super.getBoolean(path, def); + } - final String data = saveToString(); + @Override + public synchronized List getBooleanList(String path) + { + return super.getBooleanList(path); + } - final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), UTF8); + @Override + public synchronized List getByteList(String path) + { + return super.getByteList(path); + } - try - { - writer.write(data); - } - finally - { - writer.close(); - } + @Override + public synchronized List getCharacterList(String path) + { + return super.getCharacterList(path); } - public Object getProperty(String path) + @Override + public synchronized ConfigurationSection getConfigurationSection(String path) { - return get(path); + return super.getConfigurationSection(path); } - public void setProperty(String path, Object object) + @Override + public synchronized double getDouble(String path) { - set(path, object); + return super.getDouble(path); } - public void removeProperty(String path) + @Override + public synchronized double getDouble(final String path, final double def) { - set(path, null); + return super.getDouble(path, def); + } + + @Override + public synchronized List getDoubleList(String path) + { + return super.getDoubleList(path); + } + + @Override + public synchronized List getFloatList(String path) + { + return super.getFloatList(path); + } + + @Override + public synchronized int getInt(String path) + { + return super.getInt(path); + } + + @Override + public synchronized int getInt(String path, int def) + { + return super.getInt(path, def); + } + + @Override + public synchronized List getIntegerList(String path) + { + return super.getIntegerList(path); + } + + @Override + public synchronized ItemStack getItemStack(String path, ItemStack def) + { + return super.getItemStack(path, def); + } + + @Override + public synchronized Set getKeys(boolean deep) + { + return super.getKeys(deep); + } + + @Override + public synchronized List getList(String path) + { + return super.getList(path); + } + + @Override + public synchronized List getList(String path, List def) + { + return super.getList(path, def); + } + + @Override + public synchronized long getLong(String path) + { + return super.getLong(path); + } + + @Override + public synchronized long getLong(final String path, final long def) + { + return super.getLong(path, def); + } + + @Override + public synchronized List getLongList(String path) + { + return super.getLongList(path); + } + + public synchronized Map getMap() + { + return map; + } + + @Override + public synchronized List> getMapList(String path) + { + return super.getMapList(path); + } + + @Override + public synchronized OfflinePlayer getOfflinePlayer(String path) + { + return super.getOfflinePlayer(path); + } + + @Override + public synchronized OfflinePlayer getOfflinePlayer(String path, OfflinePlayer def) + { + return super.getOfflinePlayer(path, def); + } + + @Override + public synchronized List getShortList(String path) + { + return super.getShortList(path); + } + + @Override + public synchronized String getString(String path) + { + return super.getString(path); + } + + @Override + public synchronized String getString(String path, String def) + { + return super.getString(path, def); + } + + @Override + public synchronized List getStringList(String path) + { + return super.getStringList(path); + } + + @Override + public synchronized Map getValues(boolean deep) + { + return super.getValues(deep); + } + + @Override + public synchronized Vector getVector(String path) + { + return super.getVector(path); + } + + @Override + public synchronized Vector getVector(String path, Vector def) + { + return super.getVector(path, def); + } + + @Override + public synchronized boolean isBoolean(String path) + { + return super.isBoolean(path); + } + + @Override + public synchronized boolean isConfigurationSection(String path) + { + return super.isConfigurationSection(path); + } + + @Override + public synchronized boolean isDouble(String path) + { + return super.isDouble(path); + } + + @Override + public synchronized boolean isInt(String path) + { + return super.isInt(path); + } + + @Override + public synchronized boolean isItemStack(String path) + { + return super.isItemStack(path); + } + + @Override + public synchronized boolean isList(String path) + { + return super.isList(path); + } + + @Override + public synchronized boolean isLong(String path) + { + return super.isLong(path); + } + + @Override + public synchronized boolean isOfflinePlayer(String path) + { + return super.isOfflinePlayer(path); + } + + @Override + public synchronized boolean isSet(String path) + { + return super.isSet(path); + } + + @Override + public synchronized boolean isString(String path) + { + return super.isString(path); + } + + @Override + public synchronized boolean isVector(String path) + { + return super.isVector(path); + } + + @Override + public synchronized void set(String path, Object value) + { + super.set(path, value); } } diff --git a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java index 19cfde0f4c..bb58067bc2 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java @@ -2,10 +2,11 @@ import static com.earth2me.essentials.I18n._; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Pattern; import org.bukkit.Material; -import org.bukkit.entity.Ageable; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; +import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -16,69 +17,105 @@ public class EssentialsEntityListener implements Listener { + private static final Logger LOGGER = Logger.getLogger("Minecraft"); private final IEssentials ess; + private static final transient Pattern powertoolPlayer = Pattern.compile("\\{player\\}"); public EssentialsEntityListener(IEssentials ess) { this.ess = ess; } + // This method does something undocumented reguarding certain bucket types #EasterEgg @EventHandler(priority = EventPriority.LOW) public void onEntityDamage(final EntityDamageByEntityEvent event) { final Entity eAttack = event.getDamager(); final Entity eDefend = event.getEntity(); - if (eDefend instanceof Player && eAttack instanceof Player) + if (eAttack instanceof Player) { - final User defender = ess.getUser(eDefend); final User attacker = ess.getUser(eAttack); - - if (ess.getSettings().getLoginAttackDelay() > 0 && !attacker.isAuthorized("essentials.pvpdelay.exempt") - && (System.currentTimeMillis() < (attacker.getLastLogin() + ess.getSettings().getLoginAttackDelay()))) + if (eDefend instanceof Player) { - event.setCancelled(true); + onPlayerVsPlayerDamage(event, (Player)eDefend, attacker); } - - if (attacker.hasInvulnerabilityAfterTeleport() || defender.hasInvulnerabilityAfterTeleport()) + else if (eDefend instanceof Ageable) { - event.setCancelled(true); + final ItemStack hand = attacker.getItemInHand(); + if (hand != null && hand.getType() == Material.MILK_BUCKET) + { + ((Ageable)eDefend).setBaby(); + hand.setType(Material.BUCKET); + attacker.setItemInHand(hand); + attacker.updateInventory(); + event.setCancelled(true); + } } - attacker.updateActivity(true); - final List commandList = attacker.getPowertool(attacker.getItemInHand()); - if (commandList != null && !commandList.isEmpty()) + } + else if (eAttack instanceof Projectile && eDefend instanceof Player) + { + Entity shooter = ((Projectile)event.getDamager()).getShooter(); + if (shooter instanceof Player) { - for (final String command : commandList) - { - if (command != null && !command.isEmpty()) - { - ess.scheduleSyncDelayedTask( - new Runnable() - { - @Override - public void run() - { - attacker.getServer().dispatchCommand(attacker.getBase(), command.replaceAll("\\{player\\}", defender.getName())); - } - }); - - event.setCancelled(true); - return; - } - } + final User attacker = ess.getUser(shooter); + onPlayerVsPlayerDamage(event, (Player)eDefend, attacker); + attacker.updateActivity(true); } } - else if (eDefend instanceof Ageable && eAttack instanceof Player) + } + + private void onPlayerVsPlayerDamage(final EntityDamageByEntityEvent event, final Player defender, final User attacker) + { + if (ess.getSettings().getLoginAttackDelay() > 0 + && (System.currentTimeMillis() < (attacker.getLastLogin() + ess.getSettings().getLoginAttackDelay())) + && !attacker.isAuthorized("essentials.pvpdelay.exempt")) + { + event.setCancelled(true); + } + + if (!defender.equals(attacker.getBase()) && (attacker.hasInvulnerabilityAfterTeleport() || ess.getUser(defender).hasInvulnerabilityAfterTeleport())) + { + event.setCancelled(true); + } + + if (attacker.isGodModeEnabled() && !attacker.isAuthorized("essentials.god.pvp")) { - final Player player = (Player)eAttack; - final ItemStack hand = player.getItemInHand(); - if (hand != null && hand.getType() == Material.MILK_BUCKET) + event.setCancelled(true); + } + + if (attacker.isHidden() && !attacker.isAuthorized("essentials.vanish.pvp")) + { + event.setCancelled(true); + } + + onPlayerVsPlayerPowertool(event, defender, attacker); + } + + private void onPlayerVsPlayerPowertool(final EntityDamageByEntityEvent event, final Player defender, final User attacker) + { + final List commandList = attacker.getPowertool(attacker.getItemInHand()); + if (commandList != null && !commandList.isEmpty()) + { + for (final String tempCommand : commandList) { - ((Ageable)eDefend).setBaby(); - hand.setType(Material.BUCKET); - player.setItemInHand(hand); - player.updateInventory(); - event.setCancelled(true); + final String command = powertoolPlayer.matcher(tempCommand).replaceAll(defender.getName()); + if (command != null && !command.isEmpty() && !command.equals(tempCommand)) + { + ess.scheduleSyncDelayedTask( + new Runnable() + { + @Override + public void run() + { + attacker.getServer().dispatchCommand(attacker.getBase(), command); + LOGGER.log(Level.INFO, String.format("[PT] %s issued server command: /%s", attacker.getName(), command)); + } + }); + + event.setCancelled(true); + return; + } } } } @@ -119,11 +156,25 @@ public void onPlayerDeathEvent(final PlayerDeathEvent event) } } + @EventHandler(priority = EventPriority.LOW) + public void onPlayerDeathExpEvent(final PlayerDeathEvent event) + { + final User user = ess.getUser(event.getEntity()); + if (user.isAuthorized("essentials.keepxp")) + { + event.setKeepLevel(true); + event.setDroppedExp(0); + } + } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onFoodLevelChange(final FoodLevelChangeEvent event) { if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled()) { + final Player player = (Player)event.getEntity(); + player.setFoodLevel(20); + player.setSaturation(10); event.setCancelled(true); } } @@ -137,4 +188,28 @@ public void onEntityRegainHealth(final EntityRegainHealthEvent event) event.setCancelled(true); } } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPotionSplashEvent(final PotionSplashEvent event) + { + for (LivingEntity entity : event.getAffectedEntities()) + { + if (entity instanceof Player && ess.getUser(entity).isGodModeEnabled()) + { + event.setIntensity(entity, 0d); + } + } + } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onEntityShootBow (EntityShootBowEvent event) + { + if (event.getEntity() instanceof Player) + { + final User user = ess.getUser(event.getEntity()); + if (user.isAfk()) + { + user.updateActivity(true); + } + } + } } diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index 369eb38085..ca90182527 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -6,14 +6,15 @@ import com.earth2me.essentials.textreader.TextInput; import com.earth2me.essentials.textreader.TextPager; import java.io.IOException; -import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -25,6 +26,7 @@ import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.*; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; @@ -50,7 +52,7 @@ public void onPlayerRespawn(final PlayerRespawnEvent event) } @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerChat(final PlayerChatEvent event) + public void onPlayerChat(final AsyncPlayerChatEvent event) { final User user = ess.getUser(event.getPlayer()); if (user.isMuted()) @@ -75,10 +77,20 @@ public void onPlayerChat(final PlayerChatEvent event) @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onPlayerMove(final PlayerMoveEvent event) { - if ((!ess.getSettings().cancelAfkOnMove() && !ess.getSettings().getFreezeAfkPlayers()) - || event.getFrom().getBlockX() == event.getTo().getBlockX() - && event.getFrom().getBlockZ() == event.getTo().getBlockZ() - && event.getFrom().getBlockY() == event.getTo().getBlockY()) + if (!ess.getSettings().cancelAfkOnMove() && !ess.getSettings().getFreezeAfkPlayers()) + { + event.getHandlers().unregister(this); + + if (ess.getSettings().isDebug()) + { + LOGGER.log(Level.INFO, "Unregistering move listener"); + } + + return; + } + if (event.getFrom().getBlockX() == event.getTo().getBlockX() + && event.getFrom().getBlockZ() == event.getTo().getBlockZ() + && event.getFrom().getBlockY() == event.getTo().getBlockY()) { return; } @@ -87,7 +99,13 @@ public void onPlayerMove(final PlayerMoveEvent event) if (user.isAfk() && ess.getSettings().getFreezeAfkPlayers()) { final Location from = event.getFrom(); - final Location to = event.getTo().clone(); + final Location origTo = event.getTo(); + final Location to = origTo.clone(); + if (ess.getSettings().cancelAfkOnMove() && origTo.getY() >= from.getBlockY() + 1) + { + user.updateActivity(true); + return; + } to.setX(from.getX()); to.setY(from.getY()); to.setZ(from.getZ()); @@ -120,7 +138,11 @@ public void onPlayerQuit(final PlayerQuitEvent event) { user.toggleVanished(); } - user.setLastLocation(); + user.setLogoutLocation(); + if (user.isRecipeSee()) + { + user.getPlayer().getOpenInventory().getTopInventory().clear(); + } user.updateActivity(false); user.dispose(); } @@ -128,7 +150,7 @@ public void onPlayerQuit(final PlayerQuitEvent event) @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(final PlayerJoinEvent event) { - ess.scheduleAsyncDelayedTask(new Runnable() + ess.runTaskAsynchronously(new Runnable() { @Override public void run() @@ -144,62 +166,115 @@ public void delayedJoin(final Player player) { return; } + ess.getBackup().onPlayerJoin(); final User user = ess.getUser(player); - user.setDisplayNick(); - updateCompass(user); - user.setLastLogin(System.currentTimeMillis()); - user.updateActivity(false); - for (String p : ess.getVanishedPlayers()) + if (user.isNPC()) { - if (!user.isAuthorized("essentials.vanish.see")) - { - user.hidePlayer(ess.getUser(p).getBase()); - } + user.setNPC(false); } - if (user.isAuthorized("essentials.sleepingignored")) - { - user.setSleepingIgnored(true); - } + final long currentTime = System.currentTimeMillis(); + user.checkMuteTimeout(currentTime); + user.updateActivity(false); - if (!ess.getSettings().isCommandDisabled("motd") && user.isAuthorized("essentials.motd")) + ess.scheduleSyncDelayedTask(new Runnable() { - try - { - final IText input = new TextInput(user, "motd", true, ess); - final IText output = new KeywordReplacer(input, user, ess); - final TextPager pager = new TextPager(output, true); - pager.showPage("1", null, "motd", user); - } - catch (IOException ex) + @Override + public void run() { - if (ess.getSettings().isDebug()) + if (!user.isOnline()) { - LOGGER.log(Level.WARNING, ex.getMessage(), ex); + return; } - else + + user.setLastLogin(currentTime); + user.setDisplayNick(); + updateCompass(user); + + if (!ess.getVanishedPlayers().isEmpty() && !user.isAuthorized("essentials.vanish.see")) { - LOGGER.log(Level.WARNING, ex.getMessage()); + for (String p : ess.getVanishedPlayers()) + { + Player toVanish = ess.getServer().getPlayerExact(p); + if (toVanish != null && toVanish.isOnline()) + { + user.hidePlayer(toVanish); + } + } } - } - } - if (!ess.getSettings().isCommandDisabled("mail") && user.isAuthorized("essentials.mail")) - { - final List mail = user.getMails(); - if (mail.isEmpty()) - { - user.sendMessage(_("noNewMail")); - } - else - { - user.sendMessage(_("youHaveNewMail", mail.size())); + if (user.isAuthorized("essentials.sleepingignored")) + { + user.setSleepingIgnored(true); + } + + if (!ess.getSettings().isCommandDisabled("motd") && user.isAuthorized("essentials.motd")) + { + try + { + final IText input = new TextInput(user, "motd", true, ess); + final IText output = new KeywordReplacer(input, user, ess); + final TextPager pager = new TextPager(output, true); + pager.showPage("1", null, "motd", user); + } + catch (IOException ex) + { + if (ess.getSettings().isDebug()) + { + LOGGER.log(Level.WARNING, ex.getMessage(), ex); + } + else + { + LOGGER.log(Level.WARNING, ex.getMessage()); + } + } + } + + if (!ess.getSettings().isCommandDisabled("mail") && user.isAuthorized("essentials.mail")) + { + final List mail = user.getMails(); + if (mail.isEmpty()) + { + final String msg = _("noNewMail"); + if (!msg.isEmpty()) + { + user.sendMessage(msg); + } + } + else + { + user.sendMessage(_("youHaveNewMail", mail.size())); + } + } + + if (user.isAuthorized("essentials.fly.safelogin")) + { + final World world = user.getLocation().getWorld(); + final int x = user.getLocation().getBlockX(); + int y = user.getLocation().getBlockY(); + final int z = user.getLocation().getBlockZ(); + while (Util.isBlockUnsafe(world, x, y, z) && y > -1) + { + y--; + } + + if (user.getLocation().getBlockY() - y > 1 || y < 0) + { + user.setAllowFlight(true); + user.setFlying(true); + user.sendMessage(_("flyMode", _("enabled"), user.getDisplayName())); + } + } + user.setFlySpeed(0.1f); + user.setWalkSpeed(0.2f); + } - } + }); } + // Makes the compass item ingame always point to the first essentials home. #EasterEgg private void updateCompass(final User user) { Location loc = user.getHome(user.getLocation()); @@ -210,14 +285,7 @@ private void updateCompass(final User user) if (loc != null) { final Location updateLoc = loc; - ess.scheduleSyncDelayedTask(new Runnable() - { - @Override - public void run() - { - user.setCompassTarget(updateLoc); - } - }); + user.setCompassTarget(updateLoc); } } @@ -226,7 +294,6 @@ public void onPlayerLogin(final PlayerLoginEvent event) { switch (event.getResult()) { - case ALLOWED: case KICK_FULL: case KICK_BANNED: break; @@ -235,21 +302,25 @@ public void onPlayerLogin(final PlayerLoginEvent event) } final User user = ess.getUser(event.getPlayer()); - if (user.isNPC()) - { - user.setNPC(false); - } - - final long currentTime = System.currentTimeMillis(); - final boolean banExpired = user.checkBanTimeout(currentTime); - user.checkMuteTimeout(currentTime); - user.checkJailTimeout(currentTime); - if (!banExpired && (user.isBanned() || event.getResult() == Result.KICK_BANNED)) + if (event.getResult() == Result.KICK_BANNED || user.isBanned()) { - final String banReason = user.getBanReason(); - event.disallow(Result.KICK_BANNED, banReason != null && !banReason.isEmpty() && !banReason.equalsIgnoreCase("ban") ? banReason : _("defaultBanReason")); - return; + final boolean banExpired = user.checkBanTimeout(System.currentTimeMillis()); + if (!banExpired) + { + String banReason = user.getBanReason(); + if (banReason == null || banReason.isEmpty() || banReason.equalsIgnoreCase("ban")) + { + banReason = _("defaultBanReason"); + } + if (user.getBanTimeout() > 0) + { + //TODO: TL This + banReason += "\n\n" + "Expires in " + Util.formatDateDiff(user.getBanTimeout()); + } + event.disallow(Result.KICK_BANNED, banReason); + return; + } } if (event.getResult() == Result.KICK_FULL && !user.isAuthorized("essentials.joinfullserver")) @@ -309,14 +380,13 @@ public void run() }); } } - private final static List COMMANDS = Arrays.asList("msg", "r", "mail", "m", "t", "whisper", "emsg", "tell", "er", "reply", "ereply", "email"); @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerCommandPreprocess(final PlayerCommandPreprocessEvent event) { final Player player = event.getPlayer(); final String cmd = event.getMessage().toLowerCase(Locale.ENGLISH).split(" ")[0].replace("/", "").toLowerCase(Locale.ENGLISH); - if (COMMANDS.contains(cmd)) + if (ess.getSettings().getSocialSpyCommands().contains(cmd)) { for (Player onlinePlayer : ess.getServer().getOnlinePlayers()) { @@ -334,6 +404,18 @@ else if (!cmd.equalsIgnoreCase("afk")) } } + @EventHandler(priority = EventPriority.NORMAL) + public void onPlayerChangedWorldFlyReset(final PlayerChangedWorldEvent event) + { + final User user = ess.getUser(event.getPlayer()); + if (user.getGameMode() != GameMode.CREATIVE && !user.isAuthorized("essentials.fly")) + { + user.setAllowFlight(false); + } + user.setFlySpeed(0.1f); + user.setWalkSpeed(0.2f); + } + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerChangedWorld(final PlayerChangedWorldEvent event) { @@ -346,10 +428,14 @@ public void onPlayerChangedWorld(final PlayerChangedWorldEvent event) user.sendMessage(_("noGodWorldWarning")); } - if (!event.getPlayer().getWorld().getName().equals(newWorld)) + if (!user.getWorld().getName().equals(newWorld)) { user.sendMessage(_("currentWorld", newWorld)); } + if (user.isVanished()) + { + user.setVanished(user.isAuthorized("essentials.vanish")); + } } @EventHandler(priority = EventPriority.NORMAL) @@ -360,16 +446,29 @@ public void onPlayerInteract(final PlayerInteractEvent event) case RIGHT_CLICK_BLOCK: if (!event.isCancelled() && event.getClickedBlock().getTypeId() == BED && ess.getSettings().getUpdateBedAtDaytime()) { - Player player = event.getPlayer(); - player.setBedSpawnLocation(event.getClickedBlock().getLocation()); - player.sendMessage(_("homeSet", player.getLocation().getWorld().getName(), player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ())); + User player = ess.getUser(event.getPlayer()); + if (player.isAuthorized("essentials.sethome.bed")) + { + player.setBedSpawnLocation(event.getClickedBlock().getLocation()); + player.sendMessage(_("bedSet", player.getLocation().getWorld().getName(), player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ())); + } } break; case LEFT_CLICK_AIR: + if (event.getPlayer().isFlying()) + { + final User user = ess.getUser(event.getPlayer()); + if (user.isFlyClickJump()) + { + useFlyClickJump(user); + return; + } + } case LEFT_CLICK_BLOCK: if (event.getItem() != null && event.getItem().getTypeId() != AIR) { final User user = ess.getUser(event.getPlayer()); + user.updateActivity(true); if (user.hasPowerTools() && user.arePowerToolsEnabled() && usePowertools(user, event.getItem().getTypeId())) { event.setCancelled(true); @@ -381,6 +480,39 @@ public void onPlayerInteract(final PlayerInteractEvent event) } } + // This method allows the /jump lock feature to work, allows teleporting while flying #EasterEgg + private void useFlyClickJump(final User user) + { + try + { + final Location otarget = Util.getTarget(user); + + ess.scheduleSyncDelayedTask( + new Runnable() + { + @Override + public void run() + { + Location loc = user.getLocation(); + loc.setX(otarget.getX()); + loc.setZ(otarget.getZ()); + while (Util.isBlockDamaging(loc.getWorld(), loc.getBlockX(), loc.getBlockY() - 1, loc.getBlockZ())) + { + loc.setY(loc.getY() + 1d); + } + user.getBase().teleport(loc, TeleportCause.PLUGIN); + } + }); + } + catch (Exception ex) + { + if (ess.getSettings().isDebug()) + { + LOGGER.log(Level.WARNING, ex.getMessage(), ex); + } + } + } + private boolean usePowertools(final User user, final int id) { final List commandList = user.getPowertool(id); @@ -411,6 +543,7 @@ else if (command.startsWith("c:")) public void run() { user.getServer().dispatchCommand(user.getBase(), command); + LOGGER.log(Level.INFO, String.format("[PT] %s issued server command: /%s", user.getName(), command)); } }); } @@ -430,13 +563,16 @@ public void onPlayerPickupItem(final PlayerPickupItemEvent event) } } - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onInventoryClickEvent(final InventoryClickEvent event) { - if (event.getView().getTopInventory().getType() == InventoryType.PLAYER) + final Inventory top = event.getView().getTopInventory(); + final InventoryType type = top.getType(); + + if (type == InventoryType.PLAYER) { final User user = ess.getUser(event.getWhoClicked()); - final InventoryHolder invHolder = event.getView().getTopInventory().getHolder(); + final InventoryHolder invHolder = top.getHolder(); if (invHolder != null && invHolder instanceof HumanEntity) { final User invOwner = ess.getUser((HumanEntity)invHolder); @@ -445,18 +581,76 @@ public void onInventoryClickEvent(final InventoryClickEvent event) || !invOwner.isOnline())) { event.setCancelled(true); + user.updateInventory(); } } } + else if (type == InventoryType.ENDER_CHEST) + { + final User user = ess.getUser(event.getWhoClicked()); + if (user.isEnderSee() && (!user.isAuthorized("essentials.enderchest.modify"))) + { + event.setCancelled(true); + } + } + else if (type == InventoryType.WORKBENCH) + { + User user = ess.getUser(event.getWhoClicked()); + if (user.isRecipeSee()) + { + event.setCancelled(true); + } + } + else if (type == InventoryType.CHEST && top.getSize() == 9) + { + final User user = ess.getUser(event.getWhoClicked()); + final InventoryHolder invHolder = top.getHolder(); + if (invHolder != null && invHolder instanceof HumanEntity && user.isInvSee()) + { + event.setCancelled(true); + } + } } @EventHandler(priority = EventPriority.MONITOR) public void onInventoryCloseEvent(final InventoryCloseEvent event) { - if (event.getView().getTopInventory().getType() == InventoryType.PLAYER) + final Inventory top = event.getView().getTopInventory(); + final InventoryType type = top.getType(); + if (type == InventoryType.PLAYER) { final User user = ess.getUser(event.getPlayer()); user.setInvSee(false); } + else if (type == InventoryType.ENDER_CHEST) + { + final User user = ess.getUser(event.getPlayer()); + user.setEnderSee(false); + } + else if (type == InventoryType.WORKBENCH) + { + final User user = ess.getUser(event.getPlayer()); + if (user.isRecipeSee()) + { + user.setRecipeSee(false); + event.getView().getTopInventory().clear(); + } + } + else if (type == InventoryType.CHEST && top.getSize() == 9) + { + final InventoryHolder invHolder = top.getHolder(); + if (invHolder != null && invHolder instanceof HumanEntity) + { + final User user = ess.getUser(event.getPlayer()); + user.setInvSee(false); + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerFishEvent(final PlayerFishEvent event) + { + final User user = ess.getUser(event.getPlayer()); + user.updateActivity(true); } } diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java index 2ec8538ca1..c25233bcc4 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java @@ -1,6 +1,7 @@ package com.earth2me.essentials; import java.util.logging.Level; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -11,7 +12,7 @@ public class EssentialsPluginListener implements Listener, IConf { private final transient IEssentials ess; - + public EssentialsPluginListener(final IEssentials ess) { this.ess = ess; @@ -20,17 +21,25 @@ public EssentialsPluginListener(final IEssentials ess) @EventHandler(priority = EventPriority.MONITOR) public void onPluginEnable(final PluginEnableEvent event) { + if (event.getPlugin().getName().equals("EssentialsChat")) + { + ess.getSettings().setEssentialsChatActive(true); + } ess.getPermissionsHandler().checkPermissions(); ess.getAlternativeCommandsHandler().addPlugin(event.getPlugin()); if (!ess.getPaymentMethod().hasMethod() && ess.getPaymentMethod().setMethod(ess.getServer().getPluginManager())) { ess.getLogger().log(Level.INFO, "Payment method found (" + ess.getPaymentMethod().getMethod().getLongName() + " version: " + ess.getPaymentMethod().getMethod().getVersion() + ")"); } - } + } @EventHandler(priority = EventPriority.MONITOR) public void onPluginDisable(final PluginDisableEvent event) { + if (event.getPlugin().getName().equals("EssentialsChat")) + { + ess.getSettings().setEssentialsChatActive(false); + } ess.getPermissionsHandler().checkPermissions(); ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin()); // Check to see if the plugin thats being disabled is the one we are using diff --git a/Essentials/src/com/earth2me/essentials/EssentialsTimer.java b/Essentials/src/com/earth2me/essentials/EssentialsTimer.java index 95cf77521d..38c42e9184 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsTimer.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsTimer.java @@ -12,8 +12,12 @@ public class EssentialsTimer implements Runnable { private final transient IEssentials ess; private final transient Set onlineUsers = new HashSet(); - private transient long lastPoll = System.currentTimeMillis(); - private final transient LinkedList history = new LinkedList(); + private transient long lastPoll = System.nanoTime(); + private final LinkedList history = new LinkedList(); + private int skip1 = 0; + private int skip2 = 0; + private final long maxTime = 10 * 1000000; + private final long tickInterval = 50; EssentialsTimer(final IEssentials ess) { @@ -23,8 +27,9 @@ public class EssentialsTimer implements Runnable @Override public void run() { + final long startTime = System.nanoTime(); final long currentTime = System.currentTimeMillis(); - long timeSpent = (currentTime - lastPoll) / 1000; + long timeSpent = (startTime - lastPoll) / 1000; if (timeSpent == 0) { timeSpent = 1; @@ -33,14 +38,29 @@ public void run() { history.remove(); } - float tps = 100f / timeSpent; + double tps = tickInterval * 1000000.0 / timeSpent; if (tps <= 20) { history.add(tps); } - lastPoll = currentTime; + lastPoll = startTime; + int count = 0; for (Player player : ess.getServer().getOnlinePlayers()) { + count++; + if (skip1 > 0) + { + skip1--; + continue; + } + if (count % 10 == 0) + { + if (System.nanoTime() - startTime > maxTime / 2) + { + skip1 = count - 1; + break; + } + } try { final User user = ess.getUser(player); @@ -54,9 +74,24 @@ public void run() } } + count = 0; final Iterator iterator = onlineUsers.iterator(); while (iterator.hasNext()) { + count++; + if (skip2 > 0) + { + skip2--; + continue; + } + if (count % 10 == 0) + { + if (System.nanoTime() - startTime > maxTime) + { + skip2 = count - 1; + break; + } + } final User user = iterator.next(); if (user.getLastOnlineActivity() < currentTime && user.getLastOnlineActivity() > user.getLastLogout()) { @@ -70,10 +105,10 @@ public void run() } } - public float getAverageTPS() + public double getAverageTPS() { - float avg = 0; - for (Float f : history) + double avg = 0; + for (Double f : history) { if (f != null) { diff --git a/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java b/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java index bc0de9fa40..60b23a8c87 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java @@ -1,9 +1,9 @@ package com.earth2me.essentials; +import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.craftbukkit.FakeWorld; import com.earth2me.essentials.settings.Spawns; import com.earth2me.essentials.storage.YamlStorageWriter; -import static com.earth2me.essentials.I18n._; import java.io.*; import java.math.BigInteger; import java.security.DigestInputStream; @@ -230,7 +230,7 @@ private void updateUsersToNewDefaultHome() config.removeProperty("home"); config.setProperty("home.default", worldName); config.setProperty("home.worlds." + worldName, loc); - config.save(); + config.forceSave(); } } } @@ -285,7 +285,7 @@ private void updateUsersPowerToolsFormat() ((Map)powertools).put(entry.getKey(), temp); } } - config.save(); + config.forceSave(); } } catch (RuntimeException ex) @@ -358,7 +358,7 @@ private void updateUsersHomesFormat() } } config.removeProperty("home"); - config.save(); + config.forceSave(); } } diff --git a/Essentials/src/com/earth2me/essentials/I18n.java b/Essentials/src/com/earth2me/essentials/I18n.java index 97d500a6a9..b2ae6a73a7 100644 --- a/Essentials/src/com/earth2me/essentials/I18n.java +++ b/Essentials/src/com/earth2me/essentials/I18n.java @@ -43,6 +43,7 @@ public void onDisable() instance = null; } + @Override public Locale getCurrentLocale() { return currentLocale; @@ -70,7 +71,8 @@ public String translate(final String string) public static String _(final String string, final Object... objects) { - if (instance == null) { + if (instance == null) + { return ""; } if (objects.length == 0) @@ -85,11 +87,20 @@ public static String _(final String string, final Object... objects) 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); @@ -133,7 +144,7 @@ private static class FileResClassLoader extends ClassLoader { private final transient File dataFolder; - public FileResClassLoader(final ClassLoader classLoader, final IEssentials ess) + FileResClassLoader(final ClassLoader classLoader, final IEssentials ess) { super(classLoader); this.dataFolder = ess.getDataFolder(); diff --git a/Essentials/src/com/earth2me/essentials/IConf.java b/Essentials/src/com/earth2me/essentials/IConf.java index 580e6232f5..600c7ed48a 100644 --- a/Essentials/src/com/earth2me/essentials/IConf.java +++ b/Essentials/src/com/earth2me/essentials/IConf.java @@ -1,9 +1,6 @@ package com.earth2me.essentials; -/** - * @deprecated New interface will be IReload in api package - */ -@Deprecated -public interface IConf { +public interface IConf +{ public void reloadConfig(); } diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java index f12798db36..35efd61932 100644 --- a/Essentials/src/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/com/earth2me/essentials/IEssentials.java @@ -10,12 +10,9 @@ import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.scheduler.BukkitTask; -/** - * @deprecated This will be moved to the api package soon - */ -@Deprecated public interface IEssentials extends Plugin { void addReloadListener(IConf listener); @@ -48,7 +45,9 @@ public interface IEssentials extends Plugin Methods getPaymentMethod(); - int scheduleAsyncDelayedTask(Runnable run); + BukkitTask runTaskAsynchronously(Runnable run); + + BukkitTask runTaskLaterAsynchronously(Runnable run, long delay); int scheduleSyncDelayedTask(Runnable run); diff --git a/Essentials/src/com/earth2me/essentials/IReplyTo.java b/Essentials/src/com/earth2me/essentials/IReplyTo.java index 5bef5fced4..429fd75840 100644 --- a/Essentials/src/com/earth2me/essentials/IReplyTo.java +++ b/Essentials/src/com/earth2me/essentials/IReplyTo.java @@ -2,8 +2,17 @@ import org.bukkit.command.CommandSender; -public interface IReplyTo { +public interface IReplyTo +{ + /** + * Sets the user to reply to + * @param user + */ public void setReplyTo(CommandSender user); + /** + * Gets the user the sender should reply to + * @return + */ public CommandSender getReplyTo(); } diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index 71fc7f5dd8..be75ef50d5 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -42,6 +42,8 @@ public interface ISettings extends IConf double getHealCooldown(); + Set getSocialSpyCommands(); + Map getKit(String name); ConfigurationSection getKits(); @@ -74,8 +76,6 @@ public interface ISettings extends IConf int getHomeLimit(User user); - boolean getSortListByGroups(); - int getSpawnMobLimit(); int getStartingBalance(); @@ -92,10 +92,6 @@ public interface ISettings extends IConf boolean isCommandOverridden(String name); - boolean isCommandRestricted(IEssentialsCommand cmd); - - boolean isCommandRestricted(String label); - boolean isDebug(); boolean isEcoDisabled(); @@ -110,8 +106,6 @@ public interface ISettings extends IConf boolean showNonEssCommandsInHelp(); - boolean spawnIfNoHome(); - boolean warnOnBuildDisallow(); boolean warnOnSmite(); @@ -147,6 +141,8 @@ public interface ISettings extends IConf boolean getFreezeAfkPlayers(); boolean cancelAfkOnMove(); + + boolean cancelAfkOnInteract(); boolean areDeathMessagesEnabled(); @@ -155,11 +151,13 @@ public interface ISettings extends IConf Set getNoGodWorlds(); boolean getUpdateBedAtDaytime(); + + boolean allowUnsafeEnchantments(); boolean getRepairEnchanted(); boolean isWorldTeleportPermissions(); - + boolean isWorldHomePermissions(); boolean registerBackInListener(); @@ -177,8 +175,20 @@ public interface ISettings extends IConf long getTeleportInvulnerability(); boolean isTeleportInvulnerability(); - + long getLoginAttackDelay(); - + int getSignUsePerSecond(); + + double getMaxFlySpeed(); + + double getMaxWalkSpeed(); + + public int getMailsPerMinute(); + + public void setEssentialsChatActive(boolean b); + + long getMaxTempban(); + + public Map getListGroupConfig(); } diff --git a/Essentials/src/com/earth2me/essentials/IUser.java b/Essentials/src/com/earth2me/essentials/IUser.java index bfa9ed146e..00c4f328f8 100644 --- a/Essentials/src/com/earth2me/essentials/IUser.java +++ b/Essentials/src/com/earth2me/essentials/IUser.java @@ -1,14 +1,12 @@ package com.earth2me.essentials; import com.earth2me.essentials.commands.IEssentialsCommand; +import java.util.Map; +import java.util.Set; 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(); @@ -46,4 +44,22 @@ public interface IUser extends Player Teleport getTeleport(); void setJail(String jail); + + boolean isIgnoreExempt(); + + boolean isAfk(); + + void setAfk(final boolean set); + + void setLogoutLocation(); + + Location getLogoutLocation(); + + void setConfigProperty(String node, Object object); + + Set getConfigKeys(); + + Map getConfigMap(); + + Map getConfigMap(String node); } diff --git a/Essentials/src/com/earth2me/essentials/ItemDb.java b/Essentials/src/com/earth2me/essentials/ItemDb.java index e3df50bab3..a79685bb51 100644 --- a/Essentials/src/com/earth2me/essentials/ItemDb.java +++ b/Essentials/src/com/earth2me/essentials/ItemDb.java @@ -1,11 +1,9 @@ package com.earth2me.essentials; -import com.earth2me.essentials.api.IItemDb; import static com.earth2me.essentials.I18n._; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import com.earth2me.essentials.api.IItemDb; +import java.util.*; +import java.util.regex.Pattern; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -20,8 +18,10 @@ public ItemDb(final IEssentials ess) file = new ManagedFile("items.csv", ess); } private final transient Map items = new HashMap(); + private final transient Map> names = new HashMap>(); private final transient Map durabilities = new HashMap(); private final transient ManagedFile file; + private final transient Pattern splitPattern = Pattern.compile("[:+',;.]"); @Override public void reloadConfig() @@ -35,6 +35,7 @@ public void reloadConfig() durabilities.clear(); items.clear(); + names.clear(); for (String line : lines) { @@ -51,9 +52,25 @@ public void reloadConfig() } final int numeric = Integer.parseInt(parts[1]); + final short data = parts.length > 2 && !parts[2].equals("0") ? Short.parseShort(parts[2]) : 0; + String itemName = parts[0].toLowerCase(Locale.ENGLISH); - durabilities.put(parts[0].toLowerCase(Locale.ENGLISH), parts.length > 2 && !parts[2].equals("0") ? Short.parseShort(parts[2]) : 0); - items.put(parts[0].toLowerCase(Locale.ENGLISH), numeric); + durabilities.put(itemName, data); + items.put(itemName, numeric); + + ItemData itemData = new ItemData(numeric, data); + if (names.containsKey(itemData)) + { + List nameList = names.get(itemData); + nameList.add(itemName); + Collections.sort(nameList, new LengthCompare()); + } + else + { + List nameList = new ArrayList(); + nameList.add(itemName); + names.put(itemData, nameList); + } } } @@ -69,19 +86,20 @@ public ItemStack get(final String id) throws Exception int itemid = 0; String itemname = null; short metaData = 0; + String[] parts = splitPattern.split(id);; if (id.matches("^\\d+[:+',;.]\\d+$")) { - itemid = Integer.parseInt(id.split("[:+',;.]")[0]); - metaData = Short.parseShort(id.split("[:+',;.]")[1]); + itemid = Integer.parseInt(parts[0]); + metaData = Short.parseShort(parts[1]); } - else if (id.matches("^\\d+$")) + else if (Util.isInt(id)) { itemid = Integer.parseInt(id); } else if (id.matches("^[^:+',;.]+[:+',;.]\\d+$")) { - itemname = id.split("[:+',;.]")[0].toLowerCase(Locale.ENGLISH); - metaData = Short.parseShort(id.split("[:+',;.]")[1]); + itemname = parts[0].toLowerCase(Locale.ENGLISH); + metaData = Short.parseShort(parts[1]); } else { @@ -98,9 +116,9 @@ else if (id.matches("^\\d+$")) metaData = durabilities.get(itemname); } } - else if (Material.getMaterial(itemname) != null) + else if (Material.getMaterial(itemname.toUpperCase(Locale.ENGLISH)) != null) { - itemid = Material.getMaterial(itemname).getId(); + itemid = Material.getMaterial(itemname.toUpperCase(Locale.ENGLISH)).getId(); metaData = 0; } else @@ -119,4 +137,85 @@ else if (Material.getMaterial(itemname) != null) retval.setDurability(metaData); return retval; } + + public String names(ItemStack item) + { + ItemData itemData = new ItemData(item.getTypeId(), item.getDurability()); + List nameList = names.get(itemData); + if (nameList == null) + { + itemData = new ItemData(item.getTypeId(), (short)0); + nameList = names.get(itemData); + if (nameList == null) + { + return null; + } + } + + if (nameList.size() > 15) + { + nameList = nameList.subList(0, 14); + } + return Util.joinList(", ", nameList); + } + + + class ItemData + { + final private int itemNo; + final private short itemData; + + ItemData(final int itemNo, final short itemData) + { + this.itemNo = itemNo; + this.itemData = itemData; + } + + public int getItemNo() + { + return itemNo; + } + + public short getItemData() + { + return itemData; + } + + @Override + public int hashCode() + { + return (31 * itemNo) ^ itemData; + } + + @Override + public boolean equals(Object o) + { + if (o == null) + { + return false; + } + if (!(o instanceof ItemData)) + { + return false; + } + ItemData pairo = (ItemData)o; + return this.itemNo == pairo.getItemNo() + && this.itemData == pairo.getItemData(); + } + } + + + class LengthCompare implements java.util.Comparator + { + public LengthCompare() + { + super(); + } + + @Override + public int compare(String s1, String s2) + { + return s1.length() - s2.length(); + } + } } diff --git a/Essentials/src/com/earth2me/essentials/Jails.java b/Essentials/src/com/earth2me/essentials/Jails.java index 0aa90e08cf..4cffb125b8 100644 --- a/Essentials/src/com/earth2me/essentials/Jails.java +++ b/Essentials/src/com/earth2me/essentials/Jails.java @@ -44,6 +44,10 @@ private void registerListeners() final PluginManager pluginManager = ess.getServer().getPluginManager(); final JailListener blockListener = new JailListener(); pluginManager.registerEvents(blockListener, ess); + if (ess.getSettings().isDebug()) + { + LOGGER.log(Level.INFO, "Registering Jail listener"); + } } @Override @@ -55,16 +59,24 @@ public File getStorageFile() @Override public void finishRead() { - if (enabled == false && getCount() > 0) - { - registerListeners(); - } + checkRegister(); } @Override public void finishWrite() { - if (enabled == false) + checkRegister(); + } + + public void resetListener() + { + enabled = false; + checkRegister(); + } + + private void checkRegister() + { + if (enabled == false && getCount() > 0) { registerListeners(); } @@ -298,6 +310,8 @@ public void onPlayerTeleport(final PlayerTeleportEvent event) public void onPlayerJoin(final PlayerJoinEvent event) { final User user = ess.getUser(event.getPlayer()); + final long currentTime = System.currentTimeMillis(); + user.checkJailTimeout(currentTime); if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty()) { return; diff --git a/Essentials/src/com/earth2me/essentials/Kit.java b/Essentials/src/com/earth2me/essentials/Kit.java index 5a907beb3a..571787384b 100644 --- a/Essentials/src/com/earth2me/essentials/Kit.java +++ b/Essentials/src/com/earth2me/essentials/Kit.java @@ -4,11 +4,12 @@ import static com.earth2me.essentials.I18n.capitalCase; import com.earth2me.essentials.commands.NoChargeException; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; +import com.earth2me.essentials.textreader.IText; +import com.earth2me.essentials.textreader.KeywordReplacer; +import com.earth2me.essentials.textreader.SimpleTextInput; import java.util.*; import java.util.logging.Level; -import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; @@ -23,7 +24,7 @@ public static String listKits(final IEssentials ess, final User user) throws Exc final StringBuilder list = new StringBuilder(); for (String kiteItem : kits.getKeys(false)) { - if (user == null || user.isAuthorized("essentials.kit." + kiteItem.toLowerCase(Locale.ENGLISH))) + if (user == null || user.isAuthorized("essentials.kits." + kiteItem.toLowerCase(Locale.ENGLISH))) { list.append(" ").append(capitalCase(kiteItem)); } @@ -37,12 +38,17 @@ public static String listKits(final IEssentials ess, final User user) throws Exc } - public static void checkTime(final User user, final String kitName, final Map els) throws NoChargeException + public static void checkTime(final User user, final String kitName, final Map els) throws Exception { + if (user.isAuthorized("essentials.kit.exemptdelay")) + { + return; + } + final Calendar time = new GregorianCalendar(); // Take the current time, and remove the delay from it. - final double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0L; + final double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0.0d; final Calendar earliestTime = new GregorianCalendar(); earliestTime.add(Calendar.SECOND, -(int)delay); earliestTime.add(Calendar.MILLISECOND, -(int)((delay * 1000.0) % 1000.0)); @@ -50,9 +56,9 @@ public static void checkTime(final User user, final String kitName, final Map time.getTimeInMillis()) // If this happens, let's give the user the benifit of the doubt. user.setKitTimestamp(kitName, time.getTimeInMillis()); } + else if (earliestLong < 0L) + { + user.sendMessage(_("kitOnce")); + throw new NoChargeException(); + } else { time.setTimeInMillis(lastTime); @@ -76,7 +87,7 @@ public static List getItems(final User user, final Map k { if (kit == null) { - throw new Exception(_("kitError2")); + throw new Exception(_("kitNotFound")); } try @@ -94,58 +105,39 @@ public static void expandItems(final IEssentials ess, final User user, final Lis { try { + IText input = new SimpleTextInput(items); + IText output = new KeywordReplacer(input, user, ess); + boolean spew = false; - for (String d : items) + final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments(); + for (String kitItem : output.getLines()) { - final String[] parts = d.split(" "); - final String[] item = parts[0].split("[:+',;.]", 2); - final int id = Material.getMaterial(Integer.parseInt(item[0])).getId(); - final short data = item.length > 1 ? Short.parseShort(item[1]) : 0; - final int amount = parts.length > 1 ? Integer.parseInt(parts[1]) : 1; + if (kitItem.startsWith(ess.getSettings().getCurrencySymbol())) + { + Double value = Double.parseDouble(kitItem.substring(ess.getSettings().getCurrencySymbol().length()).trim()); + Trade t = new Trade(value, ess); + t.pay(user); + continue; + } + + final String[] parts = kitItem.split(" "); + final ItemStack parseStack = ess.getItemDb().get(parts[0], parts.length > 1 ? Integer.parseInt(parts[1]) : 1); + final MetaItemStack metaStack = new MetaItemStack(parseStack); - final ItemStack stack = new ItemStack(id, amount, data); if (parts.length > 2) { - for (int i = 2; i < parts.length; i++) - { - final String[] split = parts[i].split("[:+',;.]", 2); - if (split.length < 1) - { - continue; - } - final Enchantment enchantment = Enchantments.getByName(split[0]); - if (enchantment == null) - { - throw new Exception("Enchantment not found: " + split[0]); - } - int level; - if (split.length > 1) - { - level = Integer.parseInt(split[1]); - } - else - { - level = enchantment.getMaxLevel(); - } - try - { - stack.addEnchantment(enchantment, level); - } - catch (Exception ex) - { - throw new Exception("Enchantment " + enchantment.getName() + ": " + ex.getMessage(), ex); - } - } + // We pass a null sender here because kits should not do perm checks + metaStack.parseStringMeta(null, allowUnsafe, parts, 2, ess); } final Map overfilled; if (user.isAuthorized("essentials.oversizedstacks")) { - overfilled = InventoryWorkaround.addItem(user.getInventory(), true, ess.getSettings().getOversizedStackSize(), stack); + overfilled = InventoryWorkaround.addOversizedItems(user.getInventory(), ess.getSettings().getOversizedStackSize(), metaStack.getItemStack()); } else { - overfilled = InventoryWorkaround.addItem(user.getInventory(), true, 0, stack); + overfilled = InventoryWorkaround.addItems(user.getInventory(), metaStack.getItemStack()); } for (ItemStack itemStack : overfilled.values()) { diff --git a/Essentials/src/com/earth2me/essentials/MetaItemStack.java b/Essentials/src/com/earth2me/essentials/MetaItemStack.java new file mode 100644 index 0000000000..f7ea6dbcc8 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/MetaItemStack.java @@ -0,0 +1,519 @@ +package com.earth2me.essentials; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.textreader.BookInput; +import com.earth2me.essentials.textreader.BookPager; +import com.earth2me.essentials.textreader.IText; +import java.util.*; +import java.util.regex.Pattern; +import org.bukkit.Color; +import org.bukkit.DyeColor; +import org.bukkit.FireworkEffect; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.*; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + + +public class MetaItemStack +{ + private final transient Pattern splitPattern = Pattern.compile("[:+',;.]"); + private final ItemStack stack; + private final static Map colorMap = new HashMap(); + private final static Map fireworkShape = new HashMap(); + private FireworkEffect.Builder builder = FireworkEffect.builder(); + private PotionEffectType pEffectType; + private PotionEffect pEffect; + private boolean validFirework = false; + private boolean validPotionEffect = false; + private boolean validPotionDuration = false; + private boolean validPotionPower = false; + private boolean completePotion = false; + private int power = 1; + private int duration = 120; + + static + { + for (DyeColor color : DyeColor.values()) + { + colorMap.put(color.name(), color); + } + for (FireworkEffect.Type type : FireworkEffect.Type.values()) + { + fireworkShape.put(type.name(), type); + } + } + + public MetaItemStack(final ItemStack stack) + { + this.stack = stack.clone(); + } + + public ItemStack getItemStack() + { + return stack; + } + + public boolean isValidFirework() + { + return validFirework; + } + + public boolean isValidPotion() + { + return validPotionEffect && validPotionDuration && validPotionPower; + } + + public FireworkEffect.Builder getFireworkBuilder() + { + return builder; + } + + public PotionEffect getPotionEffect() + { + return pEffect; + } + + public boolean completePotion() + { + return completePotion; + } + + private void resetPotionMeta() + { + pEffect = null; + pEffectType = null; + validPotionEffect = false; + validPotionDuration = false; + validPotionPower = false; + completePotion = true; + } + + public void parseStringMeta(final CommandSender sender, final boolean allowUnsafe, String[] string, int fromArg, final IEssentials ess) throws Exception + { + + for (int i = fromArg; i < string.length; i++) + { + addStringMeta(sender, allowUnsafe, string[i], ess); + } + if (validFirework) + { + if (!hasMetaPermission(sender, "firework", true, true, ess)) + { + throw new Exception(_("noMetaFirework")); + } + FireworkEffect effect = builder.build(); + FireworkMeta fmeta = (FireworkMeta)stack.getItemMeta(); + fmeta.addEffect(effect); + if (fmeta.getEffects().size() > 1 && !hasMetaPermission(sender, "firework-multiple", true, true, ess)) + { + throw new Exception(_("multipleCharges")); + } + stack.setItemMeta(fmeta); + } + } + + private void addStringMeta(final CommandSender sender, final boolean allowUnsafe, final String string, final IEssentials ess) throws Exception + { + final String[] split = splitPattern.split(string, 2); + if (split.length < 1) + { + return; + } + + if (split.length > 1 && split[0].equalsIgnoreCase("name") && hasMetaPermission(sender, "name", false, true, ess)) + { + final String displayName = Util.replaceFormat(split[1].replace('_', ' ')); + final ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(displayName); + stack.setItemMeta(meta); + } + else if (split.length > 1 && (split[0].equalsIgnoreCase("lore") || split[0].equalsIgnoreCase("desc")) && hasMetaPermission(sender, "lore", false, true, ess)) + { + final List lore = new ArrayList(); + for (String line : split[1].split("\\|")) + { + lore.add(Util.replaceFormat(line.replace('_', ' '))); + } + final ItemMeta meta = stack.getItemMeta(); + meta.setLore(lore); + stack.setItemMeta(meta); + } + else if (split.length > 1 && (split[0].equalsIgnoreCase("player") || split[0].equalsIgnoreCase("owner")) && stack.getType() == Material.SKULL_ITEM && hasMetaPermission(sender, "head", false, true, ess)) + { + if (stack.getDurability() == 3) + { + final String owner = split[1]; + final SkullMeta meta = (SkullMeta)stack.getItemMeta(); + boolean result = meta.setOwner(owner); + stack.setItemMeta(meta); + } + else + { + throw new Exception(_("onlyPlayerSkulls")); + } + } + else if (split.length > 1 && split[0].equalsIgnoreCase("book") && stack.getType() == Material.WRITTEN_BOOK + && (hasMetaPermission(sender, "book", true, true, ess) || hasMetaPermission(sender, "chapter-" + split[1].toLowerCase(Locale.ENGLISH), true, true, ess))) + { + final BookMeta meta = (BookMeta)stack.getItemMeta(); + final IText input = new BookInput("book", true, ess); + final BookPager pager = new BookPager(input); + + List pages = pager.getPages(split[1]); + meta.setPages(pages); + stack.setItemMeta(meta); + } + else if (split.length > 1 && split[0].equalsIgnoreCase("author") && stack.getType() == Material.WRITTEN_BOOK && hasMetaPermission(sender, "author", false, true, ess)) + { + final String author = split[1]; + final BookMeta meta = (BookMeta)stack.getItemMeta(); + meta.setAuthor(author); + stack.setItemMeta(meta); + } + else if (split.length > 1 && split[0].equalsIgnoreCase("title") && stack.getType() == Material.WRITTEN_BOOK && hasMetaPermission(sender, "title", false, true, ess)) + { + final String title = Util.replaceFormat(split[1].replace('_', ' ')); + final BookMeta meta = (BookMeta)stack.getItemMeta(); + meta.setTitle(title); + stack.setItemMeta(meta); + } + else if (split.length > 1 && split[0].equalsIgnoreCase("power") && stack.getType() == Material.FIREWORK && hasMetaPermission(sender, "firework-power", false, true, ess)) + { + final int power = Util.isInt(split[1]) ? Integer.parseInt(split[1]) : 0; + final FireworkMeta meta = (FireworkMeta)stack.getItemMeta(); + meta.setPower(power > 3 ? 4 : power); + stack.setItemMeta(meta); + } + else if (stack.getType() == Material.FIREWORK) //WARNING - Meta for fireworks will be ignored after this point. + { + addFireworkMeta(sender, false, string, ess); + } + else if (stack.getType() == Material.POTION) //WARNING - Meta for potions will be ignored after this point. + { + addPotionMeta(sender, false, string, ess); + } + else if (split.length > 1 && (split[0].equalsIgnoreCase("color") || split[0].equalsIgnoreCase("colour")) + && (stack.getType() == Material.LEATHER_BOOTS + || stack.getType() == Material.LEATHER_CHESTPLATE + || stack.getType() == Material.LEATHER_HELMET + || stack.getType() == Material.LEATHER_LEGGINGS)) + { + final String[] color = split[1].split("(\\||,)"); + if (color.length == 3) + { + final int red = Util.isInt(color[0]) ? Integer.parseInt(color[0]) : 0; + final int green = Util.isInt(color[1]) ? Integer.parseInt(color[1]) : 0; + final int blue = Util.isInt(color[2]) ? Integer.parseInt(color[2]) : 0; + final LeatherArmorMeta meta = (LeatherArmorMeta)stack.getItemMeta(); + meta.setColor(Color.fromRGB(red, green, blue)); + stack.setItemMeta(meta); + } + else + { + throw new Exception(_("leatherSyntax")); + } + } + else + { + parseEnchantmentStrings(sender, allowUnsafe, split, ess); + } + } + + public void addFireworkMeta(final CommandSender sender, final boolean allowShortName, final String string, final IEssentials ess) throws Exception + { + if (stack.getType() == Material.FIREWORK) + { + final String[] split = splitPattern.split(string, 2); + + if (split.length < 2) + { + return; + } + + if (split[0].equalsIgnoreCase("color") || split[0].equalsIgnoreCase("colour") || (allowShortName && split[0].equalsIgnoreCase("c"))) + { + if (validFirework) + { + if (!hasMetaPermission(sender, "firework", true, true, ess)) + { + throw new Exception(_("noMetaFirework")); + } + FireworkEffect effect = builder.build(); + FireworkMeta fmeta = (FireworkMeta)stack.getItemMeta(); + fmeta.addEffect(effect); + if (fmeta.getEffects().size() > 1 && !hasMetaPermission(sender, "firework-multiple", true, true, ess)) + { + throw new Exception(_("multipleCharges")); + } + stack.setItemMeta(fmeta); + builder = FireworkEffect.builder(); + } + + List primaryColors = new ArrayList(); + String[] colors = split[1].split(","); + for (String color : colors) + { + if (colorMap.containsKey(color.toUpperCase())) + { + validFirework = true; + primaryColors.add(colorMap.get(color.toUpperCase()).getFireworkColor()); + } + else + { + throw new Exception(_("invalidFireworkFormat", split[1], split[0])); + } + } + builder.withColor(primaryColors); + } + else if (split[0].equalsIgnoreCase("shape") || split[0].equalsIgnoreCase("type") || (allowShortName && (split[0].equalsIgnoreCase("s") || split[0].equalsIgnoreCase("t")))) + { + FireworkEffect.Type finalEffect = null; + split[1] = (split[1].equalsIgnoreCase("large") ? "BALL_LARGE" : split[1]); + if (fireworkShape.containsKey(split[1].toUpperCase())) + { + finalEffect = fireworkShape.get(split[1].toUpperCase()); + } + else + { + throw new Exception(_("invalidFireworkFormat", split[1], split[0])); + } + if (finalEffect != null) + { + builder.with(finalEffect); + } + } + else if (split[0].equalsIgnoreCase("fade") || (allowShortName && split[0].equalsIgnoreCase("f"))) + { + List fadeColors = new ArrayList(); + String[] colors = split[1].split(","); + for (String color : colors) + { + if (colorMap.containsKey(color.toUpperCase())) + { + fadeColors.add(colorMap.get(color.toUpperCase()).getFireworkColor()); + } + else + { + throw new Exception(_("invalidFireworkFormat", split[1], split[0])); + } + } + if (!fadeColors.isEmpty()) + { + builder.withFade(fadeColors); + } + } + else if (split[0].equalsIgnoreCase("effect") || (allowShortName && split[0].equalsIgnoreCase("e"))) + { + String[] effects = split[1].split(","); + for (String effect : effects) + { + if (effect.equalsIgnoreCase("twinkle")) + { + builder.flicker(true); + } + else if (effect.equalsIgnoreCase("trail")) + { + builder.trail(true); + } + else + { + throw new Exception(_("invalidFireworkFormat", split[1], split[0])); + } + } + } + } + } + + public void addPotionMeta(final CommandSender sender, final boolean allowShortName, final String string, final IEssentials ess) throws Exception + { + if (stack.getType() == Material.POTION) + { + final String[] split = splitPattern.split(string, 2); + + if (split.length < 2) + { + return; + } + + if (split[0].equalsIgnoreCase("effect") || (allowShortName && split[0].equalsIgnoreCase("e"))) + { + pEffectType = Potions.getByName(split[1]); + if (pEffectType != null && pEffectType.getName() != null) + { + if (hasMetaPermission(sender, "potions." + pEffectType.getName().toLowerCase(Locale.ENGLISH), true, false, ess)) + { + validPotionEffect = true; + } + else + { + throw new Exception(_("noPotionEffectPerm", pEffectType.getName().toLowerCase(Locale.ENGLISH))); + } + } + else + { + throw new Exception(_("invalidPotionMeta", split[1])); + } + } + else if (split[0].equalsIgnoreCase("power") || (allowShortName && split[0].equalsIgnoreCase("p"))) + { + if (Util.isInt(split[1])) + { + validPotionPower = true; + power = Integer.parseInt(split[1]); + if (power > 0 && power < 4) + { + power -= 1; + } + } + else + { + throw new Exception(_("invalidPotionMeta", split[1])); + } + } + else if (split[0].equalsIgnoreCase("duration") || (allowShortName && split[0].equalsIgnoreCase("d"))) + { + if (Util.isInt(split[1])) + { + validPotionDuration = true; + duration = Integer.parseInt(split[1]) * 20; //Duration is in ticks by default, converted to seconds + } + else + { + throw new Exception(_("invalidPotionMeta", split[1])); + } + } + + if (isValidPotion()) + { + PotionMeta pmeta = (PotionMeta)stack.getItemMeta(); + pEffect = pEffectType.createEffect(duration, power); + if (pmeta.getCustomEffects().size() > 1 && !hasMetaPermission(sender, "potions.multiple", true, false, ess)) + { + throw new Exception(_("multiplePotionEffects")); + } + pmeta.addCustomEffect(pEffect, true); + stack.setItemMeta(pmeta); + resetPotionMeta(); + } + } + } + + private void parseEnchantmentStrings(final CommandSender sender, final boolean allowUnsafe, final String[] split, final IEssentials ess) throws Exception + { + final Enchantment enchantment = Enchantments.getByName(split[0]); + if (enchantment == null || !hasMetaPermission(sender, "enchantments." + enchantment.getName().toLowerCase(Locale.ENGLISH), false, false, ess)) + { + return; + } + + int level = -1; + if (split.length > 1) + { + try + { + level = Integer.parseInt(split[1]); + } + catch (NumberFormatException ex) + { + level = -1; + } + } + + if (level < 0 || (!allowUnsafe && level > enchantment.getMaxLevel())) + { + level = enchantment.getMaxLevel(); + } + addEnchantment(sender, allowUnsafe, enchantment, level); + } + + public void addEnchantment(final CommandSender sender, final boolean allowUnsafe, final Enchantment enchantment, final int level) throws Exception + { + if (enchantment == null) + { + throw new Exception(_("enchantmentNotFound")); + } + try + { + if (stack.getType().equals(Material.ENCHANTED_BOOK)) + { + EnchantmentStorageMeta meta = (EnchantmentStorageMeta)stack.getItemMeta(); + if (level == 0) + { + meta.removeStoredEnchant(enchantment); + } + else + { + meta.addStoredEnchant(enchantment, level, allowUnsafe); + } + stack.setItemMeta(meta); + } + else // all other material types besides ENCHANTED_BOOK + { + if (level == 0) + { + stack.removeEnchantment(enchantment); + } + else + { + if (allowUnsafe) + { + stack.addUnsafeEnchantment(enchantment, level); + } + else + { + stack.addEnchantment(enchantment, level); + } + } + } + } + catch (Exception ex) + { + throw new Exception("Enchantment " + enchantment.getName() + ": " + ex.getMessage(), ex); + } + } + + public Enchantment getEnchantment(final User user, final String name) throws Exception + { + final Enchantment enchantment = Enchantments.getByName(name); + if (enchantment == null) + { + return null; + } + + final String enchantmentName = enchantment.getName().toLowerCase(Locale.ENGLISH); + + if (!hasMetaPermission(user, "enchantments." + enchantmentName, true, false)) + { + throw new Exception(_("enchantmentPerm", enchantmentName)); + } + return enchantment; + } + + private boolean hasMetaPermission(final CommandSender sender, final String metaPerm, final boolean graceful, final boolean includeBase, final IEssentials ess) throws Exception + { + final User user = ess.getUser(sender); + return hasMetaPermission(user, metaPerm, graceful, includeBase); + } + + private boolean hasMetaPermission(final User user, final String metaPerm, final boolean graceful, final boolean includeBase) throws Exception + { + final String permBase = includeBase ? "essentials.itemspawn.meta-" : "essentials."; + if (user == null || user.isAuthorized(permBase + metaPerm)) + { + return true; + } + + if (graceful) + { + return false; + } + else + { + throw new Exception(_("noMetaPerm", metaPerm)); + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/Mob.java b/Essentials/src/com/earth2me/essentials/Mob.java index 38c11a81a4..b08281df46 100644 --- a/Essentials/src/com/earth2me/essentials/Mob.java +++ b/Essentials/src/com/earth2me/essentials/Mob.java @@ -1,20 +1,19 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; -import java.util.Collections; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Location; import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +// Suffixes can be appended on the end of a mob name to make it plural +// Entities without a suffix, will default to 's' public enum Mob { CHICKEN("Chicken", Enemies.FRIENDLY, EntityType.CHICKEN), @@ -41,8 +40,18 @@ public enum Mob MAGMACUBE("MagmaCube", Enemies.ENEMY, EntityType.MAGMA_CUBE), SNOWMAN("Snowman", Enemies.FRIENDLY, "", EntityType.SNOWMAN), OCELOT("Ocelot", Enemies.NEUTRAL, EntityType.OCELOT), - IRONGOLEM("IronGolem", Enemies.NEUTRAL, EntityType.IRON_GOLEM); - + IRONGOLEM("IronGolem", Enemies.NEUTRAL, EntityType.IRON_GOLEM), + WITHER("Wither", Enemies.ENEMY, EntityType.WITHER), + BAT("Bat", Enemies.FRIENDLY, EntityType.BAT), + WITCH("Witch", Enemies.ENEMY, EntityType.WITCH), + BOAT("Boat", Enemies.NEUTRAL, EntityType.BOAT), + MINECART("Minecart", Enemies.NEUTRAL, EntityType.MINECART), + MINECART_CHEST("ChestMinecart", Enemies.NEUTRAL, EntityType.MINECART_CHEST), + MINECART_FURNACE("FurnaceMinecart", Enemies.NEUTRAL, EntityType.MINECART_FURNACE), + MINECART_TNT("TNTMinecart", Enemies.NEUTRAL, EntityType.MINECART_TNT), + MINECART_HOPPER("HopperMinecart", Enemies.NEUTRAL, EntityType.MINECART_HOPPER), + ENDERCRYSTAL("EnderCrystal", Enemies.NEUTRAL, EntityType.ENDER_CRYSTAL), + EXPERIENCEORB("ExperienceOrb", Enemies.NEUTRAL, EntityType.EXPERIENCE_ORB); public static final Logger logger = Logger.getLogger("Minecraft"); private Mob(String n, Enemies en, String s, EntityType type) @@ -72,14 +81,20 @@ private Mob(String n, Enemies en, EntityType type) hashMap.put(mob.name.toLowerCase(Locale.ENGLISH), mob); } } - - public static Set getMobList() { + + public static Set getMobList() + { return Collections.unmodifiableSet(hashMap.keySet()); } - public LivingEntity spawn(final Player player, final Server server, final Location loc) throws MobException + public Entity spawn(final Player player, final Server server, final Location loc) throws MobException + { + return spawn(player.getWorld(), server, loc); + } + + public Entity spawn(final World world, final Server server, final Location loc) throws MobException { - final LivingEntity entity = player.getWorld().spawn(loc, (Class)this.bukkitType.getEntityClass()); + final Entity entity = world.spawn(loc, (Class)this.bukkitType.getEntityClass()); if (entity == null) { logger.log(Level.WARNING, _("unableToSpawnMob")); diff --git a/Essentials/src/com/earth2me/essentials/OfflinePlayer.java b/Essentials/src/com/earth2me/essentials/OfflinePlayer.java index c6230f5e02..d78ff71462 100644 --- a/Essentials/src/com/earth2me/essentials/OfflinePlayer.java +++ b/Essentials/src/com/earth2me/essentials/OfflinePlayer.java @@ -11,11 +11,8 @@ import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.*; import org.bukkit.inventory.InventoryView.Property; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; import org.bukkit.map.MapView; import org.bukkit.metadata.MetadataValue; import org.bukkit.permissions.Permission; @@ -24,6 +21,7 @@ import org.bukkit.plugin.Plugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.Scoreboard; import org.bukkit.util.Vector; public class OfflinePlayer implements Player @@ -841,6 +839,12 @@ public void setBedSpawnLocation(Location lctn) throw new UnsupportedOperationException("Not supported yet."); } + @Override + public void setBedSpawnLocation(Location lctn, boolean force) + { + throw new UnsupportedOperationException("Not supported yet."); + } + @Override public void playEffect(EntityEffect ee) { @@ -1051,4 +1055,178 @@ public void setFlying(boolean arg0) { throw new UnsupportedOperationException("Not supported yet."); } + + @Override + public int getExpToLevel() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean hasLineOfSight(Entity entity) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isValid() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setFlySpeed(float value) throws IllegalArgumentException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setWalkSpeed(float value) throws IllegalArgumentException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public float getFlySpeed() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public float getWalkSpeed() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Inventory getEnderChest() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void playSound(Location arg0, Sound arg1, float arg2, float arg3) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void giveExpLevels(int i) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean getRemoveWhenFarAway() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setRemoveWhenFarAway(boolean bln) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public EntityEquipment getEquipment() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setCanPickupItems(boolean bln) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean getCanPickupItems() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Location getLocation(Location lctn) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setTexturePack(String string) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setMaxHealth(int i) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void resetMaxHealth() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setCustomName(String string) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getCustomName() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setCustomNameVisible(boolean bln) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isCustomNameVisible() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setPlayerWeather(WeatherType arg0) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public WeatherType getPlayerWeather() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void resetPlayerWeather() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isOnGround() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Scoreboard getScoreboard() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setScoreboard(Scoreboard scrbrd) throws IllegalArgumentException, IllegalStateException + { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/Essentials/src/com/earth2me/essentials/Potions.java b/Essentials/src/com/earth2me/essentials/Potions.java new file mode 100644 index 0000000000..cba132bdad --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/Potions.java @@ -0,0 +1,130 @@ +package com.earth2me.essentials; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import org.bukkit.potion.PotionEffectType; + + +public class Potions +{ + private static final Map POTIONS = new HashMap(); + private static final Map ALIASPOTIONS = new HashMap(); + + static + { + + POTIONS.put("speed", PotionEffectType.SPEED); + ALIASPOTIONS.put("fast", PotionEffectType.SPEED); + ALIASPOTIONS.put("runfast", PotionEffectType.SPEED); + ALIASPOTIONS.put("sprint", PotionEffectType.SPEED); + ALIASPOTIONS.put("swift", PotionEffectType.SPEED); + + POTIONS.put("slowness", PotionEffectType.SLOW); + ALIASPOTIONS.put("slow", PotionEffectType.SLOW); + ALIASPOTIONS.put("sluggish", PotionEffectType.SLOW); + + POTIONS.put("haste", PotionEffectType.FAST_DIGGING); + ALIASPOTIONS.put("superpick", PotionEffectType.FAST_DIGGING); + ALIASPOTIONS.put("quickmine", PotionEffectType.FAST_DIGGING); + ALIASPOTIONS.put("digspeed", PotionEffectType.FAST_DIGGING); + ALIASPOTIONS.put("digfast", PotionEffectType.FAST_DIGGING); + ALIASPOTIONS.put("sharp", PotionEffectType.FAST_DIGGING); + + POTIONS.put("fatigue", PotionEffectType.SLOW_DIGGING); + ALIASPOTIONS.put("slow", PotionEffectType.SLOW_DIGGING); + ALIASPOTIONS.put("dull", PotionEffectType.SLOW_DIGGING); + + POTIONS.put("strength", PotionEffectType.INCREASE_DAMAGE); + ALIASPOTIONS.put("strong", PotionEffectType.INCREASE_DAMAGE); + ALIASPOTIONS.put("bull", PotionEffectType.INCREASE_DAMAGE); + ALIASPOTIONS.put("attack", PotionEffectType.INCREASE_DAMAGE); + + POTIONS.put("heal", PotionEffectType.HEAL); + ALIASPOTIONS.put("healthy", PotionEffectType.HEAL); + ALIASPOTIONS.put("instaheal", PotionEffectType.HEAL); + + POTIONS.put("harm", PotionEffectType.HARM); + ALIASPOTIONS.put("harming", PotionEffectType.HARM); + ALIASPOTIONS.put("injure", PotionEffectType.HARM); + ALIASPOTIONS.put("damage", PotionEffectType.HARM); + ALIASPOTIONS.put("inflict", PotionEffectType.HARM); + + POTIONS.put("jump", PotionEffectType.JUMP); + ALIASPOTIONS.put("leap", PotionEffectType.JUMP); + + POTIONS.put("nausea", PotionEffectType.CONFUSION); + ALIASPOTIONS.put("sick", PotionEffectType.CONFUSION); + ALIASPOTIONS.put("sickness", PotionEffectType.CONFUSION); + ALIASPOTIONS.put("confusion", PotionEffectType.CONFUSION); + + POTIONS.put("regeneration", PotionEffectType.REGENERATION); + ALIASPOTIONS.put("regen", PotionEffectType.REGENERATION); + + POTIONS.put("resistance", PotionEffectType.DAMAGE_RESISTANCE); + ALIASPOTIONS.put("dmgresist", PotionEffectType.DAMAGE_RESISTANCE); + ALIASPOTIONS.put("armor", PotionEffectType.DAMAGE_RESISTANCE); + ALIASPOTIONS.put("dmgresist", PotionEffectType.DAMAGE_RESISTANCE); + + POTIONS.put("fireresist", PotionEffectType.FIRE_RESISTANCE); + ALIASPOTIONS.put("fireresistance", PotionEffectType.FIRE_RESISTANCE); + ALIASPOTIONS.put("resistfire", PotionEffectType.FIRE_RESISTANCE); + + POTIONS.put("waterbreath", PotionEffectType.WATER_BREATHING); + ALIASPOTIONS.put("waterbreathing", PotionEffectType.WATER_BREATHING); + + POTIONS.put("invisibility", PotionEffectType.INVISIBILITY); + ALIASPOTIONS.put("invisible", PotionEffectType.INVISIBILITY); + ALIASPOTIONS.put("invis", PotionEffectType.INVISIBILITY); + ALIASPOTIONS.put("vanish", PotionEffectType.INVISIBILITY); + ALIASPOTIONS.put("disappear", PotionEffectType.INVISIBILITY); + + POTIONS.put("blindness", PotionEffectType.BLINDNESS); + ALIASPOTIONS.put("blind", PotionEffectType.BLINDNESS); + + POTIONS.put("nightvision", PotionEffectType.NIGHT_VISION); + ALIASPOTIONS.put("vision", PotionEffectType.NIGHT_VISION); + + POTIONS.put("hunger", PotionEffectType.HUNGER); + ALIASPOTIONS.put("hungry", PotionEffectType.HUNGER); + ALIASPOTIONS.put("starve", PotionEffectType.HUNGER); + + POTIONS.put("weakness", PotionEffectType.WEAKNESS); + ALIASPOTIONS.put("weak", PotionEffectType.WEAKNESS); + + POTIONS.put("poison", PotionEffectType.POISON); + ALIASPOTIONS.put("venom", PotionEffectType.POISON); + + POTIONS.put("wither", PotionEffectType.WITHER); + ALIASPOTIONS.put("decay", PotionEffectType.WITHER); + } + + public static PotionEffectType getByName(String name) + { + PotionEffectType peffect; + if (Util.isInt(name)) + { + peffect = PotionEffectType.getById(Integer.parseInt(name)); + } + else + { + peffect = PotionEffectType.getByName(name.toUpperCase(Locale.ENGLISH)); + } + if (peffect == null) + { + peffect = POTIONS.get(name.toLowerCase(Locale.ENGLISH)); + } + if (peffect == null) + { + peffect = ALIASPOTIONS.get(name.toLowerCase(Locale.ENGLISH)); + } + return peffect; + } + + public static Set> entrySet() + { + return POTIONS.entrySet(); + } +} \ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index ec317dbfd5..3327849c17 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -12,6 +12,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.ChatColor; +import org.bukkit.command.PluginCommand; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.MemoryConfiguration; import org.bukkit.event.EventPriority; @@ -54,19 +55,21 @@ public Set getMultipleHomes() @Override public int getHomeLimit(final User user) { - final Set homeList = getMultipleHomes(); - if (homeList == null) + int limit = 1; + if (user.isAuthorized("essentials.sethome.multiple")) { - //TODO: Replace this code to remove backwards compat, after settings are automatically updated - // return getHomeLimit("default"); - return config.getInt("multiple-homes", 5); + limit = getHomeLimit("default"); } - int limit = getHomeLimit("default"); - for (String set : homeList) + + final Set homeList = getMultipleHomes(); + if (homeList != null) { - if (user.isAuthorized("essentials.sethome.multiple." + set) && (limit < getHomeLimit(set))) + for (String set : homeList) { - limit = getHomeLimit(set); + if (user.isAuthorized("essentials.sethome.multiple." + set) && (limit < getHomeLimit(set))) + { + limit = getHomeLimit(set); + } } } return limit; @@ -77,11 +80,17 @@ public int getHomeLimit(final String set) { return config.getInt("sethome-multiple." + set, config.getInt("sethome-multiple.default", 3)); } + private int chatRadius = 0; + + private int _getChatRadius() + { + return config.getInt("chat.radius", config.getInt("chat-radius", 0)); + } @Override public int getChatRadius() { - return config.getInt("chat.radius", config.getInt("chat-radius", 0)); + return chatRadius; } @Override @@ -113,39 +122,29 @@ public boolean isCommandDisabled(final IEssentialsCommand cmd) { return isCommandDisabled(cmd.getName()); } + private Set disabledCommands = new HashSet(); @Override public boolean isCommandDisabled(String label) { - for (String c : config.getStringList("disabled-commands")) - { - if (!c.equalsIgnoreCase(label)) - { - continue; - } - return true; - } - return config.getBoolean("disable-" + label.toLowerCase(Locale.ENGLISH), false); + return disabledCommands.contains(label); } - @Override - public boolean isCommandRestricted(IEssentialsCommand cmd) + private Set getDisabledCommands() { - return isCommandRestricted(cmd.getName()); - } - - @Override - public boolean isCommandRestricted(String label) - { - for (String c : config.getStringList("restricted-commands")) + Set disCommands = new HashSet(); + for (String c : config.getStringList("disabled-commands")) { - if (!c.equalsIgnoreCase(label)) + disCommands.add(c.toLowerCase(Locale.ENGLISH)); + } + for (String c : config.getKeys(false)) + { + if (c.startsWith("disable-")) { - continue; + disCommands.add(c.substring(8).toLowerCase(Locale.ENGLISH)); } - return true; } - return config.getBoolean("restrict-" + label.toLowerCase(Locale.ENGLISH), false); + return disCommands; } @Override @@ -175,6 +174,7 @@ public boolean isCommandOverridden(String name) } return config.getBoolean("override-" + name.toLowerCase(Locale.ENGLISH), false); } + private ConfigurationSection commandCosts; @Override public double getCommandCost(IEssentialsCommand cmd) @@ -182,23 +182,100 @@ public double getCommandCost(IEssentialsCommand cmd) return getCommandCost(cmd.getName()); } + public ConfigurationSection _getCommandCosts() + { + if (config.isConfigurationSection("command-costs")) + { + final ConfigurationSection section = config.getConfigurationSection("command-costs"); + final ConfigurationSection newSection = new MemoryConfiguration(); + for (String command : section.getKeys(false)) + { + PluginCommand cmd = ess.getServer().getPluginCommand(command); + if (command.charAt(0) == '/') + { + ess.getLogger().warning("Invalid command cost. '" + command + "' should not start with '/'."); + } + if (section.isDouble(command)) + { + newSection.set(command.toLowerCase(Locale.ENGLISH), section.getDouble(command)); + } + else if (section.isInt(command)) + { + newSection.set(command.toLowerCase(Locale.ENGLISH), (double)section.getInt(command)); + } + else if (section.isString(command)) + { + String costString = section.getString(command); + try + { + double cost = Double.parseDouble(costString.trim().replace(getCurrencySymbol(), "").replaceAll("\\W", "")); + newSection.set(command.toLowerCase(Locale.ENGLISH), cost); + } + catch (NumberFormatException ex) + { + ess.getLogger().warning("Invalid command cost for: " + command + " (" + costString + ")"); + } + + } + else + { + ess.getLogger().warning("Invalid command cost for: " + command); + } + } + return newSection; + } + return null; + } + @Override - public double getCommandCost(String label) + public double getCommandCost(String name) { - double cost = config.getDouble("command-costs." + label, 0.0); - if (cost == 0.0) + name = name.replace('.', '_').replace('/', '_'); + if (commandCosts != null) { - cost = config.getDouble("cost-" + label, 0.0); + return commandCosts.getDouble(name, 0.0); } - return cost; + return 0.0; + } + private Set socialSpyCommands = new HashSet(); + + public Set _getSocialSpyCommands() + { + Set socialspyCommands = new HashSet(); + + if (config.isList("socialspy-commands")) + { + for (String c : config.getStringList("socialspy-commands")) + { + socialspyCommands.add(c.toLowerCase(Locale.ENGLISH)); + } + } + else + { + socialspyCommands.addAll(Arrays.asList("msg", "r", "mail", "m", "whisper", "emsg", "t", "tell", "er", "reply", "ereply", "email", "action", "describe", "eme", "eaction", "edescribe", "etell", "ewhisper", "pm")); + } + + return socialspyCommands; } @Override - public String getNicknamePrefix() + public Set getSocialSpyCommands() + { + return socialSpyCommands; + } + private String nicknamePrefix = "~"; + + private String _getNicknamePrefix() { return config.getString("nickname-prefix", "~"); } + @Override + public String getNicknamePrefix() + { + return nicknamePrefix; + } + @Override public double getTeleportCooldown() { @@ -240,7 +317,7 @@ public ConfigurationSection getKits() public Map getKit(String name) { name = name.replace('.', '_').replace('/', '_'); - if (config.isConfigurationSection("kits")) + if (getKits() != null) { final ConfigurationSection kits = getKits(); if (kits.isConfigurationSection(name)) @@ -250,19 +327,25 @@ public Map getKit(String name) } return null; } + private ChatColor operatorColor = null; @Override - public ChatColor getOperatorColor() throws Exception + public ChatColor getOperatorColor() + { + return operatorColor; + } + + private ChatColor _getOperatorColor() { String colorName = config.getString("ops-name-color", null); if (colorName == null) { - return ChatColor.RED; + return ChatColor.DARK_RED; } if ("none".equalsIgnoreCase(colorName) || colorName.isEmpty()) { - throw new Exception(); + return null; } try @@ -317,7 +400,7 @@ public String getBackupCommand() { return config.getString("backup.command", null); } - private Map chatFormats = new HashMap(); + private Map chatFormats = Collections.synchronizedMap(new HashMap()); @Override public MessageFormat getChatFormat(String group) @@ -334,6 +417,7 @@ public MessageFormat getChatFormat(String group) format = format.replace("{WORLDNAME}", "{1}"); format = format.replace("{SHORTWORLDNAME}", "{2}"); format = format.replaceAll("\\{(\\D*?)\\}", "\\[$1\\]"); + format = "§r".concat(format); mFormat = new MessageFormat(format); chatFormats.put(group, mFormat); } @@ -369,11 +453,25 @@ public boolean getPerWarpPermission() { return config.getBoolean("per-warp-permission", false); } - + @Override - public boolean getSortListByGroups() + public Map getListGroupConfig() { - return config.getBoolean("sort-list-by-groups", true); + if (config.isConfigurationSection("list")) + { + Map values = config.getConfigurationSection("list").getValues(false); + if (!values.isEmpty()) { + return values; + } + } + Map defaultMap = new HashMap(); + if (config.getBoolean("sort-list-by-groups", false)) { + defaultMap.put("ListByGroup", "ListByGroup"); + } + else { + defaultMap.put("Players", "*"); + } + return defaultMap; } @Override @@ -382,16 +480,33 @@ public void reloadConfig() config.load(); noGodWorlds = new HashSet(config.getStringList("no-god-in-worlds")); enabledSigns = _getEnabledSigns(); + teleportInvulnerabilityTime = _getTeleportInvulnerability(); teleportInvulnerability = _isTeleportInvulnerability(); disableItemPickupWhileAfk = _getDisableItemPickupWhileAfk(); registerBackInListener = _registerBackInListener(); - cancelAfkOnMove = _cancelAfkOnMove(); + cancelAfkOnInteract = _cancelAfkOnInteract(); + cancelAfkOnMove = _cancelAfkOnMove() && cancelAfkOnInteract; getFreezeAfkPlayers = _getFreezeAfkPlayers(); itemSpawnBl = _getItemSpawnBlacklist(); loginAttackDelay = _getLoginAttackDelay(); signUsePerSecond = _getSignUsePerSecond(); kits = _getKits(); chatFormats.clear(); + changeDisplayName = _changeDisplayName(); + disabledCommands = getDisabledCommands(); + nicknamePrefix = _getNicknamePrefix(); + operatorColor = _getOperatorColor(); + changePlayerListName = _changePlayerListName(); + configDebug = _isDebug(); + prefixsuffixconfigured = _isPrefixSuffixConfigured(); + addprefixsuffix = _addPrefixSuffix(); + disablePrefix = _disablePrefix(); + disableSuffix = _disableSuffix(); + chatRadius = _getChatRadius(); + commandCosts = _getCommandCosts(); + socialSpyCommands = _getSocialSpyCommands(); + warnOnBuildDisallow = _warnOnBuildDisallow(); + mailsPerMinute = _getMailsPerMinute(); } private List itemSpawnBl = new ArrayList(); @@ -466,24 +581,30 @@ private List _getEnabledSigns() } return newSigns; } + private boolean warnOnBuildDisallow; - @Override - public boolean spawnIfNoHome() + private boolean _warnOnBuildDisallow() { - return config.getBoolean("spawn-if-no-home", false); + return config.getBoolean("protect.disable.warn-on-build-disallow", false); } @Override public boolean warnOnBuildDisallow() { - return config.getBoolean("protect.disable.warn-on-build-disallow", false); + return warnOnBuildDisallow; } private boolean debug = false; + private boolean configDebug = false; + + private boolean _isDebug() + { + return config.getBoolean("debug", false); + } @Override public boolean isDebug() { - return debug || config.getBoolean("debug", false); + return debug || configDebug; } @Override @@ -504,10 +625,12 @@ public String getLocale() return config.getString("locale", ""); } + //This method should always only return one character due to the implementation of the calling methods + //If you need to use a string currency, for example "coins", use the translation key 'currency'. @Override public String getCurrencySymbol() { - return config.getString("currency-symbol", "$").substring(0, 1).replaceAll("[0-9]", "$"); + return config.getString("currency-symbol", "$").concat("$").substring(0, 1).replaceAll("[0-9]", "$"); } @Override @@ -610,17 +733,29 @@ public boolean removeGodOnDisconnect() { return config.getBoolean("remove-god-on-disconnect", false); } + private boolean changeDisplayName = true; + + private boolean _changeDisplayName() + { + return config.getBoolean("change-displayname", true); + } @Override public boolean changeDisplayName() { - return config.getBoolean("change-displayname", true); + return changeDisplayName; + } + private boolean changePlayerListName = false; + + private boolean _changePlayerListName() + { + return config.getBoolean("change-playerlist", false); } @Override public boolean changePlayerListName() { - return config.getBoolean("change-playerlist", false); + return changePlayerListName; } @Override @@ -628,23 +763,54 @@ public boolean useBukkitPermissions() { return config.getBoolean("use-bukkit-permissions", false); } + private boolean prefixsuffixconfigured = false; + private boolean addprefixsuffix = false; + private boolean essentialsChatActive = false; + + private boolean _addPrefixSuffix() + { + return config.getBoolean("add-prefix-suffix", false); + } + + private boolean _isPrefixSuffixConfigured() + { + return config.hasProperty("add-prefix-suffix"); + } + + @Override + public void setEssentialsChatActive(boolean essentialsChatActive) + { + this.essentialsChatActive = essentialsChatActive; + } @Override public boolean addPrefixSuffix() { - return config.getBoolean("add-prefix-suffix", ess.getServer().getPluginManager().isPluginEnabled("EssentialsChat")); + return prefixsuffixconfigured ? addprefixsuffix : essentialsChatActive; + } + private boolean disablePrefix = false; + + private boolean _disablePrefix() + { + return config.getBoolean("disablePrefix", false); } @Override public boolean disablePrefix() { - return config.getBoolean("disablePrefix", false); + return disablePrefix; + } + private boolean disableSuffix = false; + + private boolean _disableSuffix() + { + return config.getBoolean("disableSuffix", false); } @Override public boolean disableSuffix() { - return config.getBoolean("disableSuffix", false); + return disableSuffix; } @Override @@ -682,6 +848,18 @@ private boolean _cancelAfkOnMove() { return config.getBoolean("cancel-afk-on-move", true); } + private boolean cancelAfkOnInteract; + + @Override + public boolean cancelAfkOnInteract() + { + return cancelAfkOnInteract; + } + + private boolean _cancelAfkOnInteract() + { + return config.getBoolean("cancel-afk-on-interact", true); + } @Override public boolean areDeathMessagesEnabled() @@ -708,12 +886,18 @@ public boolean getRepairEnchanted() return config.getBoolean("repair-enchanted", true); } + @Override + public boolean allowUnsafeEnchantments() + { + return config.getBoolean("unsafe-enchantments", false); + } + @Override public boolean isWorldTeleportPermissions() { return config.getBoolean("world-teleport-permissions", false); } - + @Override public boolean isWorldHomePermissions() { @@ -774,7 +958,7 @@ public EventPriority getRespawnPriority() @Override public long getTpaAcceptCancellation() { - return config.getLong("tpa-accept-cancellation", 0); + return config.getLong("tpa-accept-cancellation", 120); } @Override @@ -788,50 +972,87 @@ public void setMetricsEnabled(boolean metricsEnabled) { this.metricsEnabled = metricsEnabled; } - private boolean teleportInvulnerability; + private long teleportInvulnerabilityTime; + + public long _getTeleportInvulnerability() + { + return config.getLong("teleport-invulnerability", 0) * 1000; + } @Override public long getTeleportInvulnerability() { - return config.getLong("teleport-invulnerability", 0) * 1000; + return teleportInvulnerabilityTime; } + private boolean teleportInvulnerability; private boolean _isTeleportInvulnerability() { return (config.getLong("teleport-invulnerability", 0) > 0); } - + @Override public boolean isTeleportInvulnerability() { return teleportInvulnerability; } - private long loginAttackDelay; - + private long _getLoginAttackDelay() { return config.getLong("login-attack-delay", 0) * 1000; } - + @Override public long getLoginAttackDelay() { return loginAttackDelay; } - private int signUsePerSecond; - + private int _getSignUsePerSecond() { final int perSec = config.getInt("sign-use-per-second", 4); return perSec > 0 ? perSec : 1; } - + @Override public int getSignUsePerSecond() { return signUsePerSecond; } - + + @Override + public double getMaxFlySpeed() + { + double maxSpeed = config.getDouble("max-fly-speed", 0.8); + return maxSpeed > 1.0 ? 1.0 : Math.abs(maxSpeed); + } + + //This option does not exist in the config.yml because it wasn't yet implemented in bukkit + //The code was commented out in the /speed command + @Override + public double getMaxWalkSpeed() + { + double maxSpeed = config.getDouble("max-walk-speed", 0.8); + return maxSpeed > 1.0 ? 1.0 : Math.abs(maxSpeed); + } + private int mailsPerMinute; + + private int _getMailsPerMinute() + { + return config.getInt("mails-per-minute", 1000); + } + + @Override + public int getMailsPerMinute() + { + return mailsPerMinute; + } + + @Override + public long getMaxTempban() + { + return config.getLong("max-tempban-time", -1); + } } diff --git a/Essentials/src/com/earth2me/essentials/SpawnMob.java b/Essentials/src/com/earth2me/essentials/SpawnMob.java new file mode 100644 index 0000000000..5305f6539b --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/SpawnMob.java @@ -0,0 +1,327 @@ +package com.earth2me.essentials; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.Mob.MobException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Random; +import java.util.Set; +import org.bukkit.DyeColor; +import org.bukkit.Location; +import org.bukkit.Server; +import org.bukkit.block.Block; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.*; +import org.bukkit.entity.Skeleton.SkeletonType; +import org.bukkit.material.Colorable; + + +public class SpawnMob +{ + public static String mobList(final User user) + { + final Set mobList = Mob.getMobList(); + final Set availableList = new HashSet(); + for (String mob : mobList) + { + if (user.isAuthorized("essentials.spawnmob." + mob.toLowerCase(Locale.ENGLISH))) + { + availableList.add(mob); + } + } + if (availableList.isEmpty()) + { + availableList.add(_("none")); + } + return Util.joinList(availableList); + } + + public static List mobParts(final String mobString) + { + String[] mobParts = mobString.split(","); + + List mobs = new ArrayList(); + + for (String mobPart : mobParts) + { + String[] mobDatas = mobPart.split(":"); + mobs.add(mobDatas[0]); + } + return mobs; + } + + public static List mobData(final String mobString) + { + String[] mobParts = mobString.split(","); + + List mobData = new ArrayList(); + + for (String mobPart : mobParts) + { + String[] mobDatas = mobPart.split(":"); + if (mobDatas.length == 1) + { + mobData.add(null); + } + else + { + mobData.add(mobDatas[1]); + } + } + + return mobData; + } + + // This method spawns a mob where the user is looking, owned by user + public static void spawnmob(final IEssentials ess, final Server server, final User user, final List parts, final List data, int mobCount) throws Exception + { + final Block block = Util.getTarget(user).getBlock(); + if (block == null) + { + throw new Exception(_("unableToSpawnMob")); + } + spawnmob(ess, server, user, user, block.getLocation(), parts, data, mobCount); + } + + // This method spawns a mob at loc, owned by noone + public static void spawnmob(final IEssentials ess, final Server server, final CommandSender sender, final Location loc, final List parts, final List data, int mobCount) throws Exception + { + spawnmob(ess, server, sender, null, loc, parts, data, mobCount); + } + + // This method spawns a mob at target, owned by target + public static void spawnmob(final IEssentials ess, final Server server, final CommandSender sender, final User target, final List parts, final List data, int mobCount) throws Exception + { + spawnmob(ess, server, sender, target, target.getLocation(), parts, data, mobCount); + } + + // This method spawns a mob at loc, owned by target + public static void spawnmob(final IEssentials ess, final Server server, final CommandSender sender, final User target, final Location loc, final List parts, final List data, int mobCount) throws Exception + { + final Location sloc = Util.getSafeDestination(loc); + + for (int i = 0; i < parts.size(); i++) + { + Mob mob = Mob.fromName(parts.get(i)); + checkSpawnable(ess, sender, mob); + } + + final int serverLimit = ess.getSettings().getSpawnMobLimit(); + int effectiveLimit = serverLimit / parts.size(); + + if (effectiveLimit < 1) + { + effectiveLimit = 1; + while (parts.size() > serverLimit) + { + parts.remove(serverLimit); + } + } + + if (mobCount > effectiveLimit) + { + mobCount = effectiveLimit; + sender.sendMessage(_("mobSpawnLimit")); + } + + Mob mob = Mob.fromName(parts.get(0)); // Get the first mob + try + { + for (int i = 0; i < mobCount; i++) + { + spawnMob(ess, server, sender, target, sloc, parts, data); + } + sender.sendMessage(mobCount * parts.size() + " " + mob.name.toLowerCase(Locale.ENGLISH) + mob.suffix + " " + _("spawned")); + } + catch (MobException e1) + { + throw new Exception(_("unableToSpawnMob"), e1); + } + catch (NumberFormatException e2) + { + throw new Exception(_("numberRequired"), e2); + } + catch (NullPointerException np) + { + throw new Exception(_("soloMob"), np); + } + } + + private static void spawnMob(final IEssentials ess, final Server server, final CommandSender sender, final User target, final Location sloc, List parts, List data) throws Exception + { + Mob mob; + Entity spawnedMob = null; + Entity spawnedMount; + + for (int i = 0; i < parts.size(); i++) + { + if (i == 0) + { + mob = Mob.fromName(parts.get(i)); + spawnedMob = mob.spawn(sloc.getWorld(), server, sloc); + + if (data.get(i) != null) + { + changeMobData(mob.getType(), spawnedMob, data.get(i), target); + } + } + + int next = (i + 1); + if (next < parts.size()) //If it's the last mob in the list, don't set the mount + { + Mob mMob = Mob.fromName(parts.get(next)); + spawnedMount = mMob.spawn(sloc.getWorld(), server, sloc); + + if (data.get(next) != null) + { + changeMobData(mMob.getType(), spawnedMount, data.get(next), target); + } + + spawnedMob.setPassenger(spawnedMount); + + spawnedMob = spawnedMount; + } + } + } + + private static void checkSpawnable(IEssentials ess, CommandSender sender, Mob mob) throws Exception + { + if (mob == null) + { + throw new Exception(_("invalidMob")); + } + + if (ess.getSettings().getProtectPreventSpawn(mob.getType().toString().toLowerCase(Locale.ENGLISH))) + { + throw new Exception(_("disabledToSpawnMob")); + } + + if (sender instanceof User && !((User)sender).isAuthorized("essentials.spawnmob." + mob.name.toLowerCase(Locale.ENGLISH))) + { + throw new Exception(_("noPermToSpawnMob")); + } + } + + private static void changeMobData(final EntityType type, final Entity spawned, String data, final User target) throws Exception + { + data = data.toLowerCase(Locale.ENGLISH); + + if (spawned instanceof Slime) + { + try + { + ((Slime)spawned).setSize(Integer.parseInt(data)); + } + catch (Exception e) + { + throw new Exception(_("slimeMalformedSize"), e); + } + } + + if ((spawned instanceof Ageable) && data.contains("baby")) + { + ((Ageable)spawned).setBaby(); + data = data.replace("baby", ""); + } + + if (spawned instanceof Colorable) + { + final String color = data.toUpperCase(Locale.ENGLISH); + try + { + if (color.equals("RANDOM")) + { + final Random rand = new Random(); + ((Colorable)spawned).setColor(DyeColor.values()[rand.nextInt(DyeColor.values().length)]); + } + else if (color.length() > 1) + { + ((Colorable)spawned).setColor(DyeColor.valueOf(color)); + } + } + catch (Exception e) + { + throw new Exception(_("sheepMalformedColor"), e); + } + } + + if (spawned instanceof Tameable && data.contains("tamed") && target != null) + { + final Tameable tameable = ((Tameable)spawned); + tameable.setTamed(true); + tameable.setOwner(target.getBase()); + data = data.replace("tamed", ""); + } + + if (type == EntityType.WOLF) + { + if (data.contains("angry")) + { + ((Wolf)spawned).setAngry(true); + } + } + + if (type == EntityType.CREEPER && data.contains("powered")) + { + ((Creeper)spawned).setPowered(true); + } + + if (type == EntityType.OCELOT) + { + if (data.contains("siamese") || data.contains("white")) + { + ((Ocelot)spawned).setCatType(Ocelot.Type.SIAMESE_CAT); + } + else if (data.contains("red") || data.contains("orange") || data.contains("tabby")) + { + ((Ocelot)spawned).setCatType(Ocelot.Type.RED_CAT); + } + else if (data.contains("black") || data.contains("tuxedo")) + { + ((Ocelot)spawned).setCatType(Ocelot.Type.BLACK_CAT); + } + } + + if (type == EntityType.VILLAGER) + { + for (Villager.Profession prof : Villager.Profession.values()) + { + if (data.contains(prof.toString().toLowerCase(Locale.ENGLISH))) + { + ((Villager)spawned).setProfession(prof); + } + } + } + + if (spawned instanceof Zombie) + { + if (data.contains("villager")) + { + ((Zombie)spawned).setVillager(true); + } + if (data.contains("baby")) + { + ((Zombie)spawned).setBaby(true); + } + } + + if (type == EntityType.SKELETON) + { + if (data.contains("wither")) + { + ((Skeleton)spawned).setSkeletonType(SkeletonType.WITHER); + } + } + + if (type == EntityType.EXPERIENCE_ORB) + { + if (Util.isInt(data)) + { + ((ExperienceOrb)spawned).setExperience(Integer.parseInt(data)); + + } + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/TNTExplodeListener.java b/Essentials/src/com/earth2me/essentials/TNTExplodeListener.java index 4187f835d0..79cdfa7b45 100644 --- a/Essentials/src/com/earth2me/essentials/TNTExplodeListener.java +++ b/Essentials/src/com/earth2me/essentials/TNTExplodeListener.java @@ -24,13 +24,13 @@ public void enable() if (!enabled) { enabled = true; - timer = ess.scheduleSyncDelayedTask(this, 1000); + timer = ess.scheduleSyncDelayedTask(this, 200); return; } if (timer != -1) { ess.getScheduler().cancelTask(timer); - timer = ess.scheduleSyncDelayedTask(this, 1000); + timer = ess.scheduleSyncDelayedTask(this, 200); } } diff --git a/Essentials/src/com/earth2me/essentials/Teleport.java b/Essentials/src/com/earth2me/essentials/Teleport.java index 63ff596443..f295aef1a4 100644 --- a/Essentials/src/com/earth2me/essentials/Teleport.java +++ b/Essentials/src/com/earth2me/essentials/Teleport.java @@ -1,12 +1,11 @@ package com.earth2me.essentials; -import com.earth2me.essentials.api.ITeleport; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.ITeleport; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.logging.Logger; import org.bukkit.Location; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -17,36 +16,38 @@ public class Teleport implements Runnable, ITeleport private static final double MOVE_CONSTANT = 0.3; - private static class Target + private class Target { private final Location location; - private final Entity entity; + private final String name; - public Target(Location location) + Target(Location location) { this.location = location; - this.entity = null; + this.name = null; } - public Target(Entity entity) + Target(Player entity) { - this.entity = entity; + this.name = entity.getName(); this.location = null; } public Location getLocation() { - if (this.entity != null) + if (this.name != null) { - return this.entity.getLocation(); + + return ess.getServer().getPlayerExact(name).getLocation(); } return location; } } private IUser user; + private IUser teleportUser; private int teleTimer = -1; private long started; // time this task was initiated - private long delay; // how long to delay the teleport + private long tpdelay; // how long to delay the teleport private int health; // note that I initially stored a clone of the location for reference, but... // when comparing locations, I got incorrect mismatches (rounding errors, looked like) @@ -55,22 +56,35 @@ public Location getLocation() private long initY; private long initZ; private Target teleportTarget; + private boolean respawn; + private boolean canMove; private Trade chargeFor; private final IEssentials ess; private static final Logger logger = Logger.getLogger("Minecraft"); private TeleportCause cause; private void initTimer(long delay, Target target, Trade chargeFor, TeleportCause cause) + { + initTimer(delay, user, target, chargeFor, cause, false); + } + + private void initTimer(long delay, IUser teleportUser, Target target, Trade chargeFor, TeleportCause cause, boolean respawn) { this.started = System.currentTimeMillis(); - this.delay = delay; - this.health = user.getHealth(); - this.initX = Math.round(user.getLocation().getX() * MOVE_CONSTANT); - this.initY = Math.round(user.getLocation().getY() * MOVE_CONSTANT); - this.initZ = Math.round(user.getLocation().getZ() * MOVE_CONSTANT); + this.tpdelay = delay; + this.health = teleportUser.getHealth(); + this.initX = Math.round(teleportUser.getLocation().getX() * MOVE_CONSTANT); + this.initY = Math.round(teleportUser.getLocation().getY() * MOVE_CONSTANT); + this.initZ = Math.round(teleportUser.getLocation().getZ() * MOVE_CONSTANT); + this.teleportUser = teleportUser; this.teleportTarget = target; this.chargeFor = chargeFor; this.cause = cause; + this.respawn = respawn; + + this.canMove = user.isAuthorized("essentials.teleport.timer.move"); + + teleTimer = ess.scheduleSyncRepeatingTask(this, 10, 10); } @Override @@ -79,31 +93,53 @@ public void run() if (user == null || !user.isOnline() || user.getLocation() == null) { - cancel(); + cancel(false); return; } - if (Math.round(user.getLocation().getX() * MOVE_CONSTANT) != initX - || Math.round(user.getLocation().getY() * MOVE_CONSTANT) != initY - || Math.round(user.getLocation().getZ() * MOVE_CONSTANT) != initZ - || user.getHealth() < health) - { // user moved, cancel teleport - cancel(true); + + if (teleportUser == null || !teleportUser.isOnline()) + { + cancel(false); return; } - health = user.getHealth(); // in case user healed, then later gets injured + final Location currLocation = teleportUser.getLocation(); + if (currLocation == null) + { + cancel(false); + return; + } - long now = System.currentTimeMillis(); - if (now > started + delay) + if (!canMove + && (Math.round(currLocation.getX() * MOVE_CONSTANT) != initX + || Math.round(currLocation.getY() * MOVE_CONSTANT) != initY + || Math.round(currLocation.getZ() * MOVE_CONSTANT) != initZ + || teleportUser.getHealth() < health)) + { + // user moved, cancel teleport + cancel(true); + return; + } + + health = teleportUser.getHealth(); // in case user healed, then later gets injured + final long now = System.currentTimeMillis(); + if (now > started + tpdelay) { try { cooldown(false); - user.sendMessage(_("teleportationCommencing")); + teleportUser.sendMessage(_("teleportationCommencing")); try { - - now(teleportTarget, cause); + if (respawn) + { + teleportUser.getTeleport().respawn(cause); + } + else + { + teleportUser.getTeleport().now(teleportTarget, cause); + } + cancel(false); if (chargeFor != null) { chargeFor.charge(user); @@ -117,6 +153,10 @@ public void run() catch (Exception ex) { user.sendMessage(_("cooldownWithMessage", ex.getMessage())); + if (user != teleportUser) + { + teleportUser.sendMessage(_("cooldownWithMessage", ex.getMessage())); + } } } } @@ -127,22 +167,6 @@ public Teleport(IUser user, IEssentials ess) this.ess = ess; } - public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception - { - final Player player = user.getBase(); - final Location bed = player.getBedSpawnLocation(); - final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, bed == null ? player.getWorld().getSpawnLocation() : bed, bed != null); - ess.getServer().getPluginManager().callEvent(pre); - teleport(new Target(pre.getRespawnLocation()), chargeFor, cause); - } - - public void warp(String warp, Trade chargeFor, TeleportCause cause) throws Exception - { - Location loc = ess.getWarps().getWarp(warp); - teleport(new Target(loc), chargeFor, cause); - user.sendMessage(_("warpingTo", warp)); - } - public void cooldown(boolean check) throws Exception { final Calendar time = new GregorianCalendar(); @@ -181,6 +205,7 @@ else if (lastTime > earliestLong && !user.isAuthorized("essentials.teleport.cool } } + //If we need to cancel a pending teleport call this method public void cancel(boolean notifyUser) { if (teleTimer == -1) @@ -193,6 +218,10 @@ public void cancel(boolean notifyUser) if (notifyUser) { user.sendMessage(_("pendingTeleportCancelled")); + if (teleportUser != user) + { + teleportUser.sendMessage(_("pendingTeleportCancelled")); + } } } finally @@ -201,14 +230,38 @@ public void cancel(boolean notifyUser) } } - public void cancel() + //The now function is used when you want to skip tp delay when teleporting someone to a location or player. + public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception + { + if (cooldown) + { + cooldown(false); + } + now(new Target(loc), cause); + } + + public void now(Player entity, boolean cooldown, TeleportCause cause) throws Exception + { + if (cooldown) + { + cooldown(false); + } + now(new Target(entity), cause); + } + + private void now(Target target, TeleportCause cause) throws Exception { cancel(false); + user.setLastLocation(); + user.getBase().teleport(Util.getSafeDestination(target.getLocation()), cause); } + //The teleport function is used when you want to normally teleport someone to a location or player. + //This method is nolonger used internally and will be removed. + @Deprecated public void teleport(Location loc, Trade chargeFor) throws Exception { - teleport(new Target(loc), chargeFor, TeleportCause.PLUGIN); + teleport(loc, chargeFor, TeleportCause.PLUGIN); } public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception @@ -216,7 +269,7 @@ public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws teleport(new Target(loc), chargeFor, cause); } - public void teleport(Entity entity, Trade chargeFor, TeleportCause cause) throws Exception + public void teleport(Player entity, Trade chargeFor, TeleportCause cause) throws Exception { teleport(new Target(entity), chargeFor, cause); } @@ -241,58 +294,112 @@ private void teleport(Target target, Trade chargeFor, TeleportCause cause) throw return; } - cancel(); - Calendar c = new GregorianCalendar(); - c.add(Calendar.SECOND, (int)delay); - c.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0)); - user.sendMessage(_("dontMoveMessage", Util.formatDateDiff(c.getTimeInMillis()))); + cancel(false); + warnUser(user, delay); initTimer((long)(delay * 1000.0), target, chargeFor, cause); - - teleTimer = ess.scheduleSyncRepeatingTask(this, 10, 10); } - private void now(Target target, TeleportCause cause) throws Exception + //The teleportToMe function is a wrapper used to handle teleporting players to them, like /tphere + public void teleportToMe(User otherUser, Trade chargeFor, TeleportCause cause) throws Exception { - cancel(); - user.setLastLocation(); - user.getBase().teleport(Util.getSafeDestination(target.getLocation()), cause); - } + Target target = new Target(user); + double delay = ess.getSettings().getTeleportDelay(); - public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception - { - if (cooldown) + if (chargeFor != null) + { + chargeFor.isAffordableFor(user); + } + cooldown(true); + if (delay <= 0 || user.isAuthorized("essentials.teleport.timer.bypass")) { cooldown(false); + otherUser.getTeleport().now(target, cause); + if (chargeFor != null) + { + chargeFor.charge(user); + } + return; } - now(new Target(loc), cause); + + cancel(false); + warnUser(otherUser, delay); + initTimer((long)(delay * 1000.0), otherUser, target, chargeFor, cause, false); } - public void now(Location loc, Trade chargeFor, TeleportCause cause) throws Exception + private void warnUser(final IUser user, final double delay) { - cooldown(false); - chargeFor.charge(user); - now(new Target(loc), cause); + Calendar c = new GregorianCalendar(); + c.add(Calendar.SECOND, (int)delay); + c.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0)); + user.sendMessage(_("dontMoveMessage", Util.formatDateDiff(c.getTimeInMillis()))); } - public void now(Entity entity, boolean cooldown, TeleportCause cause) throws Exception + //The respawn function is a wrapper used to handle tp fallback, on /jail and /home + public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception { - if (cooldown) + double delay = ess.getSettings().getTeleportDelay(); + if (chargeFor != null) + { + chargeFor.isAffordableFor(user); + } + cooldown(true); + if (delay <= 0 || user.isAuthorized("essentials.teleport.timer.bypass")) { cooldown(false); + respawn(cause); + if (chargeFor != null) + { + chargeFor.charge(user); + } + return; } - now(new Target(entity), cause); + + cancel(false); + warnUser(user, delay); + initTimer((long)(delay * 1000.0), user, null, chargeFor, cause, true); + } + + public void respawn(TeleportCause cause) throws Exception + { + final Player player = user.getBase(); + Location bed = player.getBedSpawnLocation(); + if (bed != null) + { + now(new Target(bed), cause); + } + else + { + if (ess.getSettings().isDebug()) + { + ess.getLogger().info("Could not find bed spawn, forcing respawn event."); + } + final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, player.getWorld().getSpawnLocation(), false); + ess.getServer().getPluginManager().callEvent(pre); + now(new Target(pre.getRespawnLocation()), cause); + } + } + + //The warp function is a wrapper used to teleport a player to a /warp + public void warp(String warp, Trade chargeFor, TeleportCause cause) throws Exception + { + Location loc = ess.getWarps().getWarp(warp); + user.sendMessage(_("warpingTo", warp)); + teleport(new Target(loc), chargeFor, cause); } + //The back function is a wrapper used to teleport a player /back to their previous location. public void back(Trade chargeFor) throws Exception { teleport(new Target(user.getLastLocation()), chargeFor, TeleportCause.COMMAND); } + //This function is used to throw a user back after a jail sentence public void back() throws Exception { now(new Target(user.getLastLocation()), TeleportCause.COMMAND); } + //This function handles teleporting to /home public void home(Location loc, Trade chargeFor) throws Exception { teleport(new Target(loc), chargeFor, TeleportCause.COMMAND); diff --git a/Essentials/src/com/earth2me/essentials/Trade.java b/Essentials/src/com/earth2me/essentials/Trade.java index 3d3f36d8c1..457691bbf1 100644 --- a/Essentials/src/com/earth2me/essentials/Trade.java +++ b/Essentials/src/com/earth2me/essentials/Trade.java @@ -1,8 +1,8 @@ package com.earth2me.essentials; +import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.craftbukkit.SetExpFix; -import static com.earth2me.essentials.I18n._; import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -20,18 +20,25 @@ public class Trade { private final transient String command; - private final transient String fallbackCommand; + private final transient Trade fallbackTrade; private final transient Double money; private final transient ItemStack itemStack; private final transient Integer exp; private final transient IEssentials ess; - + + public enum TradeType + { + MONEY, + EXP, + ITEM + } + public Trade(final String command, final IEssentials ess) { this(command, null, null, null, null, ess); } - public Trade(final String command, final String fallback, final IEssentials ess) + public Trade(final String command, final Trade fallback, final IEssentials ess) { this(command, fallback, null, null, null, ess); } @@ -51,10 +58,10 @@ public Trade(final int exp, final IEssentials ess) this(null, null, null, null, exp, ess); } - private Trade(final String command, final String fallback, final Double money, final ItemStack item, final Integer exp, final IEssentials ess) + private Trade(final String command, final Trade fallback, final Double money, final ItemStack item, final Integer exp, final IEssentials ess) { this.command = command; - this.fallbackCommand = fallback; + this.fallbackTrade = fallback; this.money = money; this.itemStack = item; this.exp = exp; @@ -63,6 +70,12 @@ private Trade(final String command, final String fallback, final Double money, f 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())) @@ -71,7 +84,7 @@ && getMoney() > 0 } if (getItemStack() != null - && !InventoryWorkaround.containsItem(user.getInventory(), true, true, itemStack)) + && !user.getInventory().containsAtLeast(itemStack, itemStack.getAmount())) { throw new ChargeException(_("missingItems", getItemStack().getAmount(), getItemStack().getType().toString().toLowerCase(Locale.ENGLISH).replace("_", " "))); } @@ -107,7 +120,7 @@ public boolean pay(final IUser user, final boolean dropItems) { if (dropItems) { - final Map leftOver = InventoryWorkaround.addItem(user.getInventory(), true, getItemStack()); + final Map leftOver = InventoryWorkaround.addItems(user.getInventory(), getItemStack()); final Location loc = user.getLocation(); for (ItemStack itemStack : leftOver.values()) { @@ -131,7 +144,7 @@ public boolean pay(final IUser user, final boolean dropItems) } else { - success = InventoryWorkaround.addAllItems(user.getInventory(), true, getItemStack()); + success = InventoryWorkaround.addAllItems(user.getInventory(), getItemStack()); } user.updateInventory(); } @@ -144,9 +157,14 @@ public boolean pay(final IUser user, final boolean dropItems) public void charge(final IUser user) throws ChargeException { + if (ess.getSettings().isDebug()) + { + ess.getLogger().log(Level.INFO, "charging user " + user.getName()); + } + if (getMoney() != null) { - if (!user.canAfford(getMoney()) && getMoney() > 0) + if (!user.canAfford(getMoney()) && getMoney() > 0.0d) { throw new ChargeException(_("notEnoughMoney")); } @@ -154,17 +172,17 @@ public void charge(final IUser user) throws ChargeException } if (getItemStack() != null) { - if (!InventoryWorkaround.containsItem(user.getInventory(), true, true, itemStack)) + if (!user.getInventory().containsAtLeast(itemStack, itemStack.getAmount())) { throw new ChargeException(_("missingItems", getItemStack().getAmount(), getItemStack().getType().toString().toLowerCase(Locale.ENGLISH).replace("_", " "))); } - InventoryWorkaround.removeItem(user.getInventory(), true, true, getItemStack()); + user.getInventory().removeItem(getItemStack()); user.updateInventory(); } if (command != null) { final double cost = getCommandCost(user); - if (!user.canAfford(cost) && cost > 0) + if (!user.canAfford(cost) && cost > 0.0d) { throw new ChargeException(_("notEnoughMoney")); } @@ -195,26 +213,51 @@ public Integer getExperience() { return exp; } + + public TradeType getType() + { + if (getExperience() != null) { + return TradeType.EXP; + } + + if (getItemStack() != null) + { + return TradeType.ITEM; + } + + return TradeType.MONEY; + } public Double getCommandCost(final IUser user) { - double cost = 0d; - if (command != null && !command.isEmpty() - && !user.isAuthorized("essentials.nocommandcost.all") - && !user.isAuthorized("essentials.nocommandcost." + command)) + double cost = 0.0d; + if (command != null && !command.isEmpty()) { cost = ess.getSettings().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command); - if (cost == 0.0 && fallbackCommand != null && !fallbackCommand.isEmpty()) + if (cost == 0.0d && fallbackTrade != null) + { + cost = fallbackTrade.getCommandCost(user); + } + + if (ess.getSettings().isDebug()) { - cost = ess.getSettings().getCommandCost(fallbackCommand.charAt(0) == '/' ? fallbackCommand.substring(1) : fallbackCommand); + ess.getLogger().log(Level.INFO, "calculated command (" + command + ") cost for " + user.getName() + " as " + cost); } } + if (cost != 0.0d && (user.isAuthorized("essentials.nocommandcost.all") + || user.isAuthorized("essentials.nocommandcost." + command))) + { + return 0.0d; + } return cost; } private static FileWriter fw = null; public static void log(String type, String subtype, String event, String sender, Trade charge, String receiver, Trade pay, Location loc, IEssentials ess) { + //isEcoLogUpdateEnabled() - This refers to log entries with no location, ie API updates #EasterEgg + //isEcoLogEnabled() - This refers to log entries with with location, ie /pay /sell and eco signs. + if ((loc == null && !ess.getSettings().isEcoLogUpdateEnabled()) || (loc != null && !ess.getSettings().isEcoLogEnabled())) { diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index 3da49ad8b3..a771fae3f4 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -7,9 +7,13 @@ import java.util.GregorianCalendar; import java.util.logging.Level; import java.util.logging.Logger; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; public class User extends UserData implements Comparable, IReplyTo, IUser @@ -24,8 +28,11 @@ public class User extends UserData implements Comparable, IReplyTo, IUser private transient long lastThrottledAction; private transient long lastActivity = System.currentTimeMillis(); private boolean hidden = false; + private boolean rightClickJump = false; private transient Location afkPosition = null; private boolean invSee = false; + private boolean recipeSee = false; + private boolean enderSee = false; private static final Logger logger = Logger.getLogger("Minecraft"); User(final Player base, final IEssentials ess) @@ -59,21 +66,18 @@ public boolean isAuthorized(final IEssentialsCommand cmd, final String permissio @Override public boolean isAuthorized(final String node) { + final boolean result = isAuthorizedCheck(node); if (ess.getSettings().isDebug()) { - ess.getLogger().log(Level.INFO, "checking if " + base.getName() + " has " + node); - } - if (base instanceof OfflinePlayer) - { - return false; + ess.getLogger().log(Level.INFO, "checking if " + base.getName() + " has " + node + " - " + result); } + return result; + } - if (isOp()) - { - return true; - } + private boolean isAuthorizedCheck(final String node) + { - if (isJailed()) + if (base instanceof OfflinePlayer) { return false; } @@ -84,7 +88,15 @@ public boolean isAuthorized(final String node) } catch (Exception ex) { - ess.getLogger().log(Level.SEVERE, "Permission System Error: " + ess.getPermissionsHandler().getName() + " returned: " + ex.getMessage()); + if (ess.getSettings().isDebug()) + { + ess.getLogger().log(Level.SEVERE, "Permission System Error: " + ess.getPermissionsHandler().getName() + " returned: " + ex.getMessage(), ex); + } + else + { + ess.getLogger().log(Level.SEVERE, "Permission System Error: " + ess.getPermissionsHandler().getName() + " returned: " + ex.getMessage()); + } + return false; } } @@ -115,7 +127,7 @@ public void giveMoney(final double value) public void giveMoney(final double value, final CommandSender initiator) { - if (value == 0) + if (value == 0.0d) { return; } @@ -129,7 +141,7 @@ public void giveMoney(final double value, final CommandSender initiator) public void payUser(final User reciever, final double value) throws Exception { - if (value == 0) + if (value == 0.0d) { return; } @@ -154,7 +166,7 @@ public void takeMoney(final double value) public void takeMoney(final double value, final CommandSender initiator) { - if (value == 0) + if (value == 0.0d) { return; } @@ -174,6 +186,10 @@ public boolean canAfford(final double cost) public boolean canAfford(final double cost, final boolean permcheck) { + if (cost <= 0.0d) + { + return true; + } final double mon = getMoney(); if (!permcheck || isAuthorized("essentials.eco.loan")) { @@ -232,20 +248,16 @@ public Location getHome() throws Exception return getHome(getHomes().get(0)); } - public void setHome() - { - setHome("home", getLocation()); - } - - public void setHome(final String name) + @Override + public void setLastLocation() { - setHome(name, getLocation()); + setLastLocation(getLocation()); } @Override - public void setLastLocation() + public void setLogoutLocation() { - setLastLocation(getLocation()); + setLogoutLocation(getLocation()); } public void requestTeleport(final User player, final boolean here) @@ -271,7 +283,7 @@ public String getNick(final boolean longnick) String nickname; String suffix = ""; final String nick = getNickname(); - if (ess.getSettings().isCommandDisabled("nick") || nick == null || nick.isEmpty() || nick.equals(getName())) + if (ess.getSettings().isCommandDisabled("nick") || nick == null || nick.isEmpty() || nick.equalsIgnoreCase(getName())) { nickname = getName(); } @@ -284,11 +296,11 @@ public String getNick(final boolean longnick) { try { - final String opPrefix = ess.getSettings().getOperatorColor().toString(); - if (opPrefix.length() > 0) + final ChatColor opPrefix = ess.getSettings().getOperatorColor(); + if (opPrefix != null && opPrefix.toString().length() > 0) { - prefix.insert(0, opPrefix); - suffix = "§f"; + prefix.insert(0, opPrefix.toString()); + suffix = "§r"; } } catch (Exception e) @@ -298,17 +310,18 @@ public String getNick(final boolean longnick) if (ess.getSettings().addPrefixSuffix()) { + //These two extra toggles are not documented, because they are mostly redundant #EasterEgg if (!ess.getSettings().disablePrefix()) { final String ptext = ess.getPermissionsHandler().getPrefix(base).replace('&', '§'); prefix.insert(0, ptext); - suffix = "§f"; + suffix = "§r"; } if (!ess.getSettings().disableSuffix()) { final String stext = ess.getPermissionsHandler().getSuffix(base).replace('&', '§'); - suffix = stext + "§f"; - suffix = suffix.replace("§f§f", "§f"); + suffix = stext + "§r"; + suffix = suffix.replace("§f§f", "§f").replace("§f§r", "§r").replace("§r§r", "§r"); } } final String strPrefix = prefix.toString(); @@ -325,7 +338,8 @@ public String getNick(final boolean longnick) { output = Util.lastCode(strPrefix) + nickname.substring(0, 14); } - if (output.charAt(output.length() - 1) == '§') { + if (output.charAt(output.length() - 1) == '§') + { output = output.substring(0, output.length() - 1); } return output; @@ -482,6 +496,13 @@ public boolean checkJailTimeout(final long currentTime) } catch (Exception ex) { + try + { + getTeleport().respawn(null, TeleportCause.PLUGIN); + } + catch (Exception ex1) + { + } } return true; } @@ -515,13 +536,17 @@ public boolean checkBanTimeout(final long currentTime) public void updateActivity(final boolean broadcast) { - if (isAfk()) + if (isAfk() && ess.getSettings().cancelAfkOnInteract()) { setAfk(false); if (broadcast && !isHidden()) { setDisplayNick(); - ess.broadcastMessage(this, _("userIsNotAway", getDisplayName())); + final String msg = _("userIsNotAway", getDisplayName()); + if (!msg.isEmpty()) + { + ess.broadcastMessage(this, msg); + } } } lastActivity = System.currentTimeMillis(); @@ -548,13 +573,17 @@ public void checkActivity() } } final long autoafk = ess.getSettings().getAutoAfk(); - if (!isAfk() && autoafk > 0 && lastActivity + autoafk * 1000 < System.currentTimeMillis() && isAuthorized("essentials.afk")) + if (!isAfk() && autoafk > 0 && lastActivity + autoafk * 1000 < System.currentTimeMillis() && isAuthorized("essentials.afk.auto")) { setAfk(true); if (!isHidden()) { setDisplayNick(); - ess.broadcastMessage(this, _("userIsAway", getDisplayName())); + final String msg = _("userIsAway", getDisplayName()); + if (!msg.isEmpty()) + { + ess.broadcastMessage(this, msg); + } } } } @@ -610,6 +639,16 @@ public void setInvSee(final boolean set) { invSee = set; } + + public boolean isEnderSee() + { + return enderSee; + } + + public void setEnderSee(final boolean set) + { + enderSee = set; + } private transient long teleportInvulnerabilityTimestamp = 0; public void enableInvulnerabilityAfterTeleport() @@ -639,7 +678,7 @@ public boolean isVanished() { return vanished; } - + public void setVanished(final boolean set) { vanished = set; @@ -654,6 +693,10 @@ public void setVanished(final boolean set) } setHidden(true); ess.getVanishedPlayers().add(getName()); + if (isAuthorized("essentials.vanish.effect")) + { + this.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1, false)); + } } else { @@ -663,6 +706,10 @@ public void setVanished(final boolean set) } setHidden(false); ess.getVanishedPlayers().remove(getName()); + if (isAuthorized("essentials.vanish.effect")) + { + this.removePotionEffect(PotionEffectType.INVISIBILITY); + } } } @@ -671,23 +718,51 @@ public void toggleVanished() final boolean set = !vanished; this.setVanished(set); } - - public boolean checkSignThrottle() { - if (isSignThrottled()) { + + public boolean checkSignThrottle() + { + if (isSignThrottled()) + { return true; } updateThrottle(); return false; } - + public boolean isSignThrottled() { final long minTime = lastThrottledAction + (1000 / ess.getSettings().getSignUsePerSecond()); return (System.currentTimeMillis() < minTime); } - + public void updateThrottle() { lastThrottledAction = System.currentTimeMillis();; } + + public boolean isFlyClickJump() + { + return rightClickJump; + } + + public void setRightClickJump(boolean rightClickJump) + { + this.rightClickJump = rightClickJump; + } + + @Override + public boolean isIgnoreExempt() + { + return this.isAuthorized("essentials.chat.ignoreexempt"); + } + + public boolean isRecipeSee() + { + return recipeSee; + } + + public void setRecipeSee(boolean recipeSee) + { + this.recipeSee = recipeSee; + } } diff --git a/Essentials/src/com/earth2me/essentials/UserData.java b/Essentials/src/com/earth2me/essentials/UserData.java index 7dd9ebf97f..1769c0f030 100644 --- a/Essentials/src/com/earth2me/essentials/UserData.java +++ b/Essentials/src/com/earth2me/essentials/UserData.java @@ -4,6 +4,7 @@ import java.io.File; import java.util.*; import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -11,13 +12,14 @@ public abstract class UserData extends PlayerExtension implements IConf { protected final transient IEssentials ess; - private final EssentialsConf config; + private EssentialsConf config; + private final File folder; protected UserData(Player base, IEssentials ess) { super(base); this.ess = ess; - File folder = new File(ess.getDataFolder(), "userdata"); + folder = new File(ess.getDataFolder(), "userdata"); if (!folder.exists()) { folder.mkdirs(); @@ -26,6 +28,13 @@ protected UserData(Player base, IEssentials ess) reloadConfig(); } + public final void reset() + { + config.getFile().delete(); + config = new EssentialsConf(new File(folder, Util.sanitizeFileName(base.getName()) + ".yml")); + reloadConfig(); + } + @Override public final void reloadConfig() { @@ -39,23 +48,24 @@ public final void reloadConfig() lastHealTimestamp = _getLastHealTimestamp(); jail = _getJail(); mails = _getMails(); - teleportEnabled = getTeleportEnabled(); - ignoredPlayers = getIgnoredPlayers(); + teleportEnabled = _getTeleportEnabled(); godmode = _getGodModeEnabled(); - muted = getMuted(); + muted = _getMuted(); muteTimeout = _getMuteTimeout(); - jailed = getJailed(); + jailed = _getJailed(); jailTimeout = _getJailTimeout(); lastLogin = _getLastLogin(); lastLogout = _getLastLogout(); lastLoginAddress = _getLastLoginAddress(); - afk = getAfk(); + afk = _getAfk(); geolocation = _getGeoLocation(); isSocialSpyEnabled = _isSocialSpyEnabled(); isNPC = _isNPC(); arePowerToolsEnabled = _arePowerToolsEnabled(); kitTimestamps = _getKitTimestamps(); nickname = _getNickname(); + setIgnoredPlayers(_getIgnoredPlayers()); + logoutLocation = _getLogoutLocation(); } private double money; @@ -99,26 +109,25 @@ private Map _getHomes() return new HashMap(); } - public Location getHome(String name) throws Exception + private String getHomeName(String search) { - Location loc = config.getLocation("homes." + name, getServer()); - if (loc == null) + if (Util.isInt(search)) { try { - loc = config.getLocation("homes." + getHomes().get(Integer.parseInt(name) - 1), getServer()); - } - catch (IndexOutOfBoundsException e) - { - return null; + search = getHomes().get(Integer.parseInt(search) - 1); } - catch (NumberFormatException e) + catch (Exception e) { - return null; } } - - return loc; + return search; + } + + public Location getHome(String name) throws Exception + { + String search = getHomeName(name); + return config.getLocation("homes." + search, getServer()); } public Location getHome(final Location world) @@ -152,7 +161,7 @@ public List getHomes() public void setHome(String name, Location loc) { //Invalid names will corrupt the yaml - name = Util.sanitizeFileName(name); + name = Util.safeString(name); homes.put(name, loc); config.setProperty("homes." + name, loc); config.save(); @@ -160,20 +169,20 @@ public void setHome(String name, Location loc) public void delHome(String name) throws Exception { - String search = name; + String search = getHomeName(name); if (!homes.containsKey(search)) { - search = Util.sanitizeFileName(name); + search = Util.safeString(search); } if (homes.containsKey(search)) { - homes.remove(name); - config.removeProperty("homes." + name); + homes.remove(search); + config.removeProperty("homes." + search); config.save(); } else { - throw new Exception(_("invalidHome", name)); + throw new Exception(_("invalidHome", search)); } } @@ -310,6 +319,37 @@ public void setLastLocation(Location loc) config.setProperty("lastlocation", loc); config.save(); } + + private Location logoutLocation; + + private Location _getLogoutLocation() + { + try + { + return config.getLocation("logoutlocation", getServer()); + } + catch (Exception e) + { + return null; + } + } + + public Location getLogoutLocation() + { + return logoutLocation; + } + + public void setLogoutLocation(Location loc) + { + if (loc == null || loc.getWorld() == null) + { + return; + } + logoutLocation = loc; + config.setProperty("logoutlocation", loc); + config.save(); + } + private long lastTeleportTimestamp; private long _getLastTeleportTimestamp() @@ -406,7 +446,7 @@ public void addMail(String mail) } private boolean teleportEnabled; - private boolean getTeleportEnabled() + private boolean _getTeleportEnabled() { return config.getBoolean("teleportenabled", true); } @@ -438,16 +478,16 @@ public boolean toggleSocialSpy() } private List ignoredPlayers; - public List getIgnoredPlayers() + public List _getIgnoredPlayers() { - return config.getStringList("ignore"); + return Collections.synchronizedList(config.getStringList("ignore")); } public void setIgnoredPlayers(List players) { if (players == null || players.isEmpty()) { - ignoredPlayers = new ArrayList(); + ignoredPlayers = Collections.synchronizedList(new ArrayList()); config.removeProperty("ignore"); } else @@ -466,12 +506,12 @@ public boolean isIgnoredPlayer(final String userName) { return false; } - return isIgnoredPlayer(user); + return isIgnoredPlayer(user); } public boolean isIgnoredPlayer(IUser user) { - return (ignoredPlayers.contains(user.getName().toLowerCase(Locale.ENGLISH)) && !user.isAuthorized("essentials.chat.ignoreexempt")); + return (ignoredPlayers.contains(user.getName().toLowerCase(Locale.ENGLISH)) && !user.isIgnoreExempt()); } public void setIgnoredPlayer(IUser user, boolean set) @@ -506,10 +546,15 @@ public void setGodModeEnabled(boolean set) } private boolean muted; - public boolean getMuted() + public boolean _getMuted() { return config.getBoolean("muted", false); } + + public boolean getMuted() + { + return muted; + } public boolean isMuted() { @@ -542,7 +587,7 @@ public void setMuteTimeout(long time) } private boolean jailed; - private boolean getJailed() + private boolean _getJailed() { return config.getBoolean("jailed", false); } @@ -586,7 +631,7 @@ public void setJailTimeout(long time) public String getBanReason() { - return config.getString("ban.reason"); + return config.getString("ban.reason", ""); } public void setBanReason(String reason) @@ -626,7 +671,10 @@ private void _setLastLogin(long time) public void setLastLogin(long time) { _setLastLogin(time); - _setLastLoginAddress(base.getAddress().getAddress().getHostAddress()); + if (base.getAddress() != null && base.getAddress().getAddress() != null) + { + _setLastLoginAddress(base.getAddress().getAddress().getHostAddress()); + } config.save(); } private long lastLogout; @@ -666,7 +714,7 @@ private void _setLastLoginAddress(String address) } private boolean afk; - private boolean getAfk() + private boolean _getAfk() { return config.getBoolean("afk", false); } @@ -777,22 +825,39 @@ private boolean _arePowerToolsEnabled() { return config.getBoolean("powertoolsenabled", true); } - private Map kitTimestamps; - - private Map _getKitTimestamps() + private Map kitTimestamps; + + private Map _getKitTimestamps() { - + if (config.isConfigurationSection("timestamps.kits")) { - return config.getConfigurationSection("timestamps.kits").getValues(false); + final ConfigurationSection section = config.getConfigurationSection("timestamps.kits"); + final Map timestamps = new HashMap(); + for (String command : section.getKeys(false)) + { + if (section.isLong(command)) + { + timestamps.put(command.toLowerCase(Locale.ENGLISH), section.getLong(command)); + } + else if (section.isInt(command)) + { + timestamps.put(command.toLowerCase(Locale.ENGLISH), (long)section.getInt(command)); + } + } + return timestamps; } - return new HashMap(); + return new HashMap(); } - - public Long getKitTimestamp(final String name) + + public long getKitTimestamp(String name) { - final Number num = (Number)kitTimestamps.get(name.toLowerCase(Locale.ENGLISH)); - return num == null ? null : num.longValue(); + name = name.replace('.', '_').replace('/', '_'); + if (kitTimestamps != null && kitTimestamps.containsKey(name)) + { + return kitTimestamps.get(name); + } + return 0l; } public void setKitTimestamp(final String name, final long time) @@ -802,6 +867,60 @@ public void setKitTimestamp(final String name, final long time) config.save(); } + public void setConfigProperty(String node, Object object) + { + final String prefix = "info."; + node = prefix+node; + if (object instanceof Map) + { + config.setProperty(node, (Map) object); + } + else if (object instanceof List) + { + config.setProperty(node, (List) object); + } + else if (object instanceof Location) + { + config.setProperty(node, (Location) object); + } + else if (object instanceof ItemStack) + { + config.setProperty(node, (ItemStack) object); + } + else + { + config.setProperty(node, object); + } + config.save(); + } + + public Set getConfigKeys() + { + if (config.isConfigurationSection("info")) + { + return config.getConfigurationSection("info").getKeys(true); + } + return new HashSet(); + } + + public Map getConfigMap() + { + if (config.isConfigurationSection("info")) + { + return config.getConfigurationSection("info").getValues(true); + } + return new HashMap(); + } + + public Map getConfigMap(String node) + { + if (config.isConfigurationSection("info."+node)) + { + return config.getConfigurationSection("info."+node).getValues(true); + } + return new HashMap(); + } + public void save() { config.save(); diff --git a/Essentials/src/com/earth2me/essentials/UserMap.java b/Essentials/src/com/earth2me/essentials/UserMap.java index 94b5042414..19cfb98e91 100644 --- a/Essentials/src/com/earth2me/essentials/UserMap.java +++ b/Essentials/src/com/earth2me/essentials/UserMap.java @@ -27,7 +27,7 @@ public UserMap(final IEssentials ess) private void loadAllUsersAsync(final IEssentials ess) { - ess.scheduleAsyncDelayedTask(new Runnable() + ess.runTaskAsynchronously(new Runnable() { @Override public void run() diff --git a/Essentials/src/com/earth2me/essentials/Util.java b/Essentials/src/com/earth2me/essentials/Util.java index 112477ecb9..677aa230fa 100644 --- a/Essentials/src/com/earth2me/essentials/Util.java +++ b/Essentials/src/com/earth2me/essentials/Util.java @@ -1,6 +1,7 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; +import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.*; @@ -24,12 +25,19 @@ private Util() private final static Pattern INVALIDFILECHARS = Pattern.compile("[^a-z0-9]"); private final static Pattern INVALIDCHARS = Pattern.compile("[^\t\n\r\u0020-\u007E\u0085\u00A0-\uD7FF\uE000-\uFFFC]"); + //Used to clean file names before saving to disk public static String sanitizeFileName(final String name) { - final String newName = INVALIDFILECHARS.matcher(name.toLowerCase(Locale.ENGLISH)).replaceAll("_"); - return newName; + return safeString(name); } + //Used to clean strings/names before saving as filenames/permissions + public static String safeString(final String string) + { + return INVALIDFILECHARS.matcher(string.toLowerCase(Locale.ENGLISH)).replaceAll("_"); + } + + //Less restrictive string sanitizing, when not used as perm or filename public static String sanitizeString(final String string) { return INVALIDCHARS.matcher(string).replaceAll(""); @@ -215,10 +223,11 @@ public static long parseDateDiff(String time, boolean future) throws Exception { c.add(Calendar.SECOND, seconds * (future ? 1 : -1)); } - + Calendar max = new GregorianCalendar(); max.add(Calendar.YEAR, 10); - if (c.after(max)) { + if (c.after(max)) + { return max.getTimeInMillis(); } return c.getTimeInMillis(); @@ -284,6 +293,46 @@ public static Location getTarget(final LivingEntity entity) throws Exception } return block.getLocation(); } + public final static int RADIUS = 3; + public final static Vector3D[] VOLUME; + + + public static class Vector3D + { + public Vector3D(int x, int y, int z) + { + this.x = x; + this.y = y; + this.z = z; + } + public int x; + public int y; + public int z; + } + + static + { + List pos = new ArrayList(); + for (int x = -RADIUS; x <= RADIUS; x++) + { + for (int y = -RADIUS; y <= RADIUS; y++) + { + for (int z = -RADIUS; z <= RADIUS; z++) + { + pos.add(new Vector3D(x, y, z)); + } + } + } + Collections.sort(pos, new Comparator() + { + @Override + public int compare(Vector3D a, Vector3D b) + { + return (a.x * a.x + a.y * a.y + a.z * a.z) - (b.x * b.x + b.y * b.y + b.z * b.z); + } + }); + VOLUME = pos.toArray(new Vector3D[0]); + } public static Location getSafeDestination(final Location loc) throws Exception { @@ -295,25 +344,46 @@ public static Location getSafeDestination(final Location loc) throws Exception int x = loc.getBlockX(); int y = (int)Math.round(loc.getY()); int z = loc.getBlockZ(); + final int origX = x; + final int origY = y; + final int origZ = z; while (isBlockAboveAir(world, x, y, z)) { y -= 1; if (y < 0) { + y = origY; break; } } + int i = 0; + while (isBlockUnsafe(world, x, y, z)) + { + i++; + if (i >= VOLUME.length) + { + x = origX; + y = origY + RADIUS; + z = origZ; + break; + } + x = origX + VOLUME[i].x; + y = origY + VOLUME[i].y; + z = origZ + VOLUME[i].z; + } + while (isBlockUnsafe(world, x, y, z)) { y += 1; - if (y >= world.getHighestBlockYAt(x, z)) + if (y >= world.getMaxHeight()) { x += 1; break; } } + while (isBlockUnsafe(world, x, y, z)) { y -= 1; @@ -321,7 +391,7 @@ public static Location getSafeDestination(final Location loc) throws Exception { x += 1; y = world.getHighestBlockYAt(x, z); - if (x - 32 > loc.getBlockX()) + if (x - 48 > loc.getBlockX()) { throw new Exception(_("holeInFloor")); } @@ -336,6 +406,15 @@ private static boolean isBlockAboveAir(final World world, final int x, final int } public static boolean isBlockUnsafe(final World world, final int x, final int y, final int z) + { + if (isBlockDamaging(world, x, y, z)) + { + return true; + } + return isBlockAboveAir(world, x, y, z); + } + + public static boolean isBlockDamaging(final World world, final int x, final int y, final int z) { final Block below = world.getBlockAt(x, y - 1, z); if (below.getType() == Material.LAVA || below.getType() == Material.STATIONARY_LAVA) @@ -348,12 +427,17 @@ public static boolean isBlockUnsafe(final World world, final int x, final int y, return true; } + if (below.getType() == Material.BED_BLOCK) + { + return true; + } + if ((!AIR_MATERIALS.contains(world.getBlockAt(x, y, z).getType().getId())) || (!AIR_MATERIALS.contains(world.getBlockAt(x, y + 1, z).getType().getId()))) { return true; } - return isBlockAboveAir(world, x, y, z); + return false; } public static ItemStack convertBlockToItem(final Block block) @@ -441,6 +525,7 @@ public static ItemStack convertBlockToItem(final Block block) public static String formatAsCurrency(final double value) { + dFormat.setRoundingMode(RoundingMode.FLOOR); String str = dFormat.format(value); if (str.endsWith(".00")) { @@ -459,11 +544,6 @@ public static String shortCurrency(final double value, final IEssentials ess) return ess.getSettings().getCurrencySymbol() + formatAsCurrency(value); } - public static double roundDouble(final double d) - { - return Math.round(d * 100.0) / 100.0; - } - public static boolean isInt(final String sInt) { try @@ -510,17 +590,19 @@ public static String joinList(String seperator, Object... list) } return buf.toString(); } - - public static String lastCode(final String input) { + + public static String lastCode(final String input) + { int pos = input.lastIndexOf("§"); - if (pos == -1 || (pos + 1) == input.length()) { + if (pos == -1 || (pos + 1) == input.length()) + { return ""; } - return input.substring(pos, pos + 2); + return input.substring(pos, pos + 2); } - private static transient final Pattern URL_PATTERN = Pattern.compile("((?:(?:https?)://)?[\\w-_\\.]{2,})\\.([a-z]{2,3}(?:/\\S+)?)"); - private static transient final Pattern VANILLA_PATTERN = Pattern.compile("\u00A7+[0-9A-FK-ORa-fk-or]"); + private static transient final Pattern VANILLA_PATTERN = Pattern.compile("\u00A7+[0-9A-FK-ORa-fk-or]?"); + private static transient final Pattern LOGCOLOR_PATTERN = Pattern.compile("\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]"); private static transient final Pattern REPLACE_PATTERN = Pattern.compile("&([0-9a-fk-or])"); private static transient final Pattern VANILLA_COLOR_PATTERN = Pattern.compile("\u00A7+[0-9A-Fa-f]"); private static transient final Pattern VANILLA_MAGIC_PATTERN = Pattern.compile("\u00A7+[Kk]"); @@ -529,6 +611,7 @@ public static String lastCode(final String input) { private static transient final Pattern REPLACE_MAGIC_PATTERN = Pattern.compile("&(k)"); private static transient final Pattern REPLACE_FORMAT_PATTERN = Pattern.compile("&([l-or])"); + //This method is used to simply strip the native minecraft colour codes public static String stripFormat(final String input) { if (input == null) @@ -538,29 +621,26 @@ public static String stripFormat(final String input) return VANILLA_PATTERN.matcher(input).replaceAll(""); } - public static String replaceFormat(final String input) + public static String stripLogColorFormat(final String input) { if (input == null) { return null; } - return REPLACE_PATTERN.matcher(input).replaceAll("\u00a7$1"); + return LOGCOLOR_PATTERN.matcher(input).replaceAll(""); } - public static String blockURL(final String input) + //This method is used to simply replace the ess colour codes with minecraft ones, ie &c + public static String replaceFormat(final String input) { if (input == null) { return null; } - String text = URL_PATTERN.matcher(input).replaceAll("$1 $2"); - while (URL_PATTERN.matcher(text).find()) - { - text = URL_PATTERN.matcher(text).replaceAll("$1 $2"); - } - return text; + return REPLACE_PATTERN.matcher(input).replaceAll("\u00a7$1"); } + //This is the general permission sensitive message format function, does not touch urls. public static String formatString(final IUser user, final String permBase, final String input) { if (input == null) @@ -595,6 +675,7 @@ public static String formatString(final IUser user, final String permBase, final return message; } + //This is the general permission sensitive message format function, checks for urls. public static String formatMessage(final IUser user, final String permBase, final String input) { if (input == null) @@ -609,6 +690,20 @@ public static String formatMessage(final IUser user, final String permBase, fina return message; } + private static String blockURL(final String input) + { + if (input == null) + { + return null; + } + String text = URL_PATTERN.matcher(input).replaceAll("$1 $2"); + while (URL_PATTERN.matcher(text).find()) + { + text = URL_PATTERN.matcher(text).replaceAll("$1 $2"); + } + return text; + } + private static String stripColor(final String input, final Pattern pattern) { return pattern.matcher(input).replaceAll(""); @@ -618,4 +713,11 @@ private static String replaceColor(final String input, final Pattern pattern) { return pattern.matcher(input).replaceAll("\u00a7$1"); } + private static final Pattern IPPATTERN = Pattern.compile( + "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"); + + public static boolean validIP(String ipAddress) { + return IPPATTERN.matcher(ipAddress).matches(); + } } diff --git a/Essentials/src/com/earth2me/essentials/Warps.java b/Essentials/src/com/earth2me/essentials/Warps.java index ece987aba6..39f31369c3 100644 --- a/Essentials/src/com/earth2me/essentials/Warps.java +++ b/Essentials/src/com/earth2me/essentials/Warps.java @@ -1,8 +1,11 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IWarps; +import com.earth2me.essentials.api.InvalidNameException; import com.earth2me.essentials.commands.WarpNotFoundException; import java.io.File; +import java.io.IOException; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -10,7 +13,7 @@ import org.bukkit.Server; -public class Warps implements IConf +public class Warps implements IConf, IWarps { private static final Logger logger = Logger.getLogger("Minecraft"); private final Map warpPoints = new HashMap(); @@ -28,6 +31,7 @@ public Warps(Server server, File dataFolder) reloadConfig(); } + @Override public boolean isEmpty() { return warpPoints.isEmpty(); @@ -44,6 +48,7 @@ public Collection getWarpNames() return keys; } + @Override public Location getWarp(String warp) throws Exception { EssentialsConf conf = warpPoints.get(new StringIgnoreCase(warp)); @@ -54,6 +59,7 @@ public Location getWarp(String warp) throws Exception return conf.getLocation(null, server); } + @Override public void setWarp(String name, Location loc) throws Exception { String filename = Util.sanitizeFileName(name); @@ -70,7 +76,14 @@ public void setWarp(String name, Location loc) throws Exception } conf.setProperty(null, loc); conf.setProperty("name", name); - conf.save(); + try + { + conf.saveWithError(); + } + catch (IOException ex) + { + throw new IOException(_("invalidWarpName")); + } } public void delWarp(String name) throws Exception @@ -118,6 +131,26 @@ public final void reloadConfig() } } + // This is for api support, and so 3.x will not break this api + @Override + public Collection getList() + { + return getWarpNames(); + } + + // This is for api support, and so 3.x will not break this api + @Override + public void removeWarp(String name) throws Exception + { + delWarp(name); + } + + //This is here for future 3.x api support. Not implemented here becasue storage is handled differently + @Override + public File getWarpFile(String name) throws InvalidNameException + { + throw new UnsupportedOperationException("Not supported yet."); + } private static class StringIgnoreCase { diff --git a/Essentials/src/com/earth2me/essentials/api/Economy.java b/Essentials/src/com/earth2me/essentials/api/Economy.java index 6ed1829b30..c22145a133 100644 --- a/Essentials/src/com/earth2me/essentials/api/Economy.java +++ b/Essentials/src/com/earth2me/essentials/api/Economy.java @@ -8,7 +8,6 @@ import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; -import org.bukkit.entity.Player; /** @@ -43,7 +42,7 @@ private static void createNPCFile(String name) npcConfig.load(); npcConfig.setProperty("npc", true); npcConfig.setProperty("money", ess.getSettings().getStartingBalance()); - npcConfig.save(); + npcConfig.forceSave(); } private static void deleteNPC(String name) @@ -72,17 +71,7 @@ private static User getUserByName(String name) { throw new RuntimeException(noCallBeforeLoad); } - User user; - Player player = ess.getServer().getPlayer(name); - if (player != null) - { - user = ess.getUser(player); - } - else - { - user = ess.getOfflineUser(name); - } - return user; + return ess.getUser(name); } /** diff --git a/Essentials/src/com/earth2me/essentials/api/IAlternativeCommandsHandler.java b/Essentials/src/com/earth2me/essentials/api/IAlternativeCommandsHandler.java deleted file mode 100644 index 11619bca4f..0000000000 --- a/Essentials/src/com/earth2me/essentials/api/IAlternativeCommandsHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.earth2me.essentials.api; - -import java.util.Map; -import org.bukkit.command.PluginCommand; - - -public interface IAlternativeCommandsHandler -{ - Map disabledCommands(); -} diff --git a/Essentials/src/com/earth2me/essentials/api/IEssentials.java b/Essentials/src/com/earth2me/essentials/api/IEssentials.java deleted file mode 100644 index c04bed0bd9..0000000000 --- a/Essentials/src/com/earth2me/essentials/api/IEssentials.java +++ /dev/null @@ -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); -} diff --git a/Essentials/src/com/earth2me/essentials/api/IEssentialsEconomy.java b/Essentials/src/com/earth2me/essentials/api/IEssentialsEconomy.java deleted file mode 100644 index 72fb89d262..0000000000 --- a/Essentials/src/com/earth2me/essentials/api/IEssentialsEconomy.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/api/ISettings.java b/Essentials/src/com/earth2me/essentials/api/ISettings.java deleted file mode 100644 index eff65ad872..0000000000 --- a/Essentials/src/com/earth2me/essentials/api/ISettings.java +++ /dev/null @@ -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 -{ - -} diff --git a/Essentials/src/com/earth2me/essentials/api/IUser.java b/Essentials/src/com/earth2me/essentials/api/IUser.java deleted file mode 100644 index 5d2f9d4b87..0000000000 --- a/Essentials/src/com/earth2me/essentials/api/IUser.java +++ /dev/null @@ -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); -} diff --git a/Essentials/src/com/earth2me/essentials/api/IUserMap.java b/Essentials/src/com/earth2me/essentials/api/IUserMap.java deleted file mode 100644 index 9e609ab378..0000000000 --- a/Essentials/src/com/earth2me/essentials/api/IUserMap.java +++ /dev/null @@ -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 getAllUniqueUsers(); - - int getUniqueUsers(); - - File getUserFile(final String name); -} diff --git a/Essentials/src/com/earth2me/essentials/api/IWarps.java b/Essentials/src/com/earth2me/essentials/api/IWarps.java index 14779e327f..8bab073974 100644 --- a/Essentials/src/com/earth2me/essentials/api/IWarps.java +++ b/Essentials/src/com/earth2me/essentials/api/IWarps.java @@ -1,16 +1,60 @@ package com.earth2me.essentials.api; +import java.io.File; import java.util.Collection; import org.bukkit.Location; -public interface IWarps extends IReload +public interface IWarps { + /** + * Get a warp by name + * + * @param warp - Warp name + * @return - Location the warp is set to + * @throws Exception + */ Location getWarp(String warp) throws Exception; - Collection getWarps(); + /** + * Gets a list of warps + * + * @return - A {@link Collection} of warps + */ + Collection getList(); + /** + * Delete a warp from the warp DB + * + * @param name - Name of warp + * @throws Exception + */ void removeWarp(String name) throws Exception; + /** + * Set a warp + * + * @param name - Name of warp + * @param loc - Location of warp + * @throws Exception + */ void setWarp(String name, Location loc) throws Exception; + + /** + * Check to see if the file is empty + * + * @return + */ + boolean isEmpty(); + + /** + * Get a warp file + * note: this is not yet implemented, as 3.x uses different storage methods + * + * @param name - name of file + * @return - an instance of the file + * @throws InvalidNameException - When the file is not found + */ + File getWarpFile(String name) throws InvalidNameException; + } diff --git a/Essentials/src/com/earth2me/essentials/api/IWorth.java b/Essentials/src/com/earth2me/essentials/api/IWorth.java deleted file mode 100644 index 4add987712..0000000000 --- a/Essentials/src/com/earth2me/essentials/api/IWorth.java +++ /dev/null @@ -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); -} diff --git a/Essentials/src/com/earth2me/essentials/api/InvalidNameException.java b/Essentials/src/com/earth2me/essentials/api/InvalidNameException.java new file mode 100644 index 0000000000..b62a74ce3f --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/api/InvalidNameException.java @@ -0,0 +1,16 @@ +package com.earth2me.essentials.api; + + +public class InvalidNameException extends Exception +{ + /** + * NOTE: This is not implemented yet, just here for future 3.x api support + * Allow serialization of the InvalidNameException exception + */ + private static final long serialVersionUID = 1485321420293663139L; + + public InvalidNameException(Throwable thrwbl) + { + super(thrwbl); + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandafk.java b/Essentials/src/com/earth2me/essentials/commands/Commandafk.java index c718835710..f426769424 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandafk.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandafk.java @@ -2,6 +2,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import org.bukkit.command.CommandSender; import org.bukkit.Server; @@ -17,27 +18,39 @@ public void run(Server server, User user, String commandLabel, String[] args) th { if (args.length > 0 && user.isAuthorized("essentials.afk.others")) { - User afkUser = ess.getUser(ess.getServer().matchPlayer(args[0])); - if (afkUser != null) - { - toggleAfk(afkUser); - } + User afkUser = getPlayer(server, user, args, 0); + toggleAfk(afkUser); } else { toggleAfk(user); } } + + @Override + public void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception + { + if (args.length > 0) + { + User afkUser = getPlayer(server, args, 0, true, false); + toggleAfk(afkUser); + } + else + { + throw new NotEnoughArgumentsException(); + } + } private void toggleAfk(User user) { user.setDisplayNick(); + String msg = ""; if (!user.toggleAfk()) { //user.sendMessage(_("markedAsNotAway")); if (!user.isHidden()) { - ess.broadcastMessage(user, _("userIsNotAway", user.getDisplayName())); + msg = _("userIsNotAway", user.getDisplayName()); } user.updateActivity(false); } @@ -46,8 +59,13 @@ private void toggleAfk(User user) //user.sendMessage(_("markedAsAway")); if (!user.isHidden()) { - ess.broadcastMessage(user, _("userIsAway", user.getDisplayName())); + msg = _("userIsAway", user.getDisplayName()); } } + if (!msg.isEmpty()) + { + ess.broadcastMessage(user, msg); + } } } + diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java b/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java index 968d0012cd..79ef1f9693 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java @@ -6,7 +6,7 @@ import org.bukkit.Server; import org.bukkit.entity.TNTPrimed; - +// This command has a in theme message that only shows if you supply a parameter #EasterEgg public class Commandantioch extends EssentialsCommand { public Commandantioch() diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandback.java b/Essentials/src/com/earth2me/essentials/commands/Commandback.java index d2ed98e698..6943ab8020 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandback.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandback.java @@ -17,9 +17,9 @@ public Commandback() protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { if (user.getWorld() != user.getLastLocation().getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + user.getLastLocation().getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + user.getLastLocation().getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + user.getLastLocation().getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + user.getLastLocation().getWorld().getName())); } final Trade charge = new Trade(this.getName(), ess); charge.isAffordableFor(user); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java b/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java index 15c3c90889..062709bd47 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java @@ -21,17 +21,25 @@ protected void run(final Server server, final CommandSender sender, final String { throw new NotEnoughArgumentsException(); } - sender.sendMessage(_("balance", Util.displayCurrency(getPlayer(server, args, 0, true).getMoney(), ess))); + + User target = getPlayer(server, args, 0, true, true); + sender.sendMessage(_("balanceOther", target.getDisplayName(), Util.displayCurrency(target.getMoney(), ess))); } @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - final double bal = (args.length < 1 - || !(user.isAuthorized("essentials.balance.others") - || user.isAuthorized("essentials.balance.other")) - ? user - : getPlayer(server, args, 0, true)).getMoney(); - user.sendMessage(_("balance", Util.displayCurrency(bal, ess))); + + if (args.length < 1 || !user.isAuthorized("essentials.balance.others")) + { + final double bal = user.getMoney(); + user.sendMessage(_("balance", Util.displayCurrency(bal, ess))); + } + else + { + final User target = getPlayer(server, args, 0, true, true); + final double bal = target.getMoney(); + user.sendMessage(_("balanceOther", target.getDisplayName(), Util.displayCurrency(bal, ess))); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbalancetop.java b/Essentials/src/com/earth2me/essentials/commands/Commandbalancetop.java index 6c5e96b9f1..b150718059 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbalancetop.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbalancetop.java @@ -1,9 +1,9 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.User; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.User; import com.earth2me.essentials.Util; -import com.earth2me.essentials.textreader.ArrayListInput; +import com.earth2me.essentials.textreader.SimpleTextInput; import com.earth2me.essentials.textreader.TextPager; import java.text.DateFormat; import java.util.*; @@ -12,7 +12,7 @@ import org.bukkit.Server; import org.bukkit.command.CommandSender; - +//TODO: Remove op and replace with perm public class Commandbalancetop extends EssentialsCommand { public Commandbalancetop() @@ -21,7 +21,7 @@ public Commandbalancetop() } private static final int CACHETIME = 2 * 60 * 1000; public static final int MINUSERS = 50; - private static ArrayListInput cache = new ArrayListInput(); + private static SimpleTextInput cache = new SimpleTextInput(); private static long cacheage = 0; private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); @@ -63,7 +63,7 @@ protected void run(final Server server, final CommandSender sender, final String { lock.readLock().unlock(); } - ess.scheduleAsyncDelayedTask(new Viewer(sender, page, force)); + ess.runTaskAsynchronously(new Viewer(sender, page, force)); } else { @@ -71,7 +71,7 @@ protected void run(final Server server, final CommandSender sender, final String { sender.sendMessage(_("orderBalances", ess.getUserMap().getUniqueUsers())); } - ess.scheduleAsyncDelayedTask(new Viewer(sender, page, force)); + ess.runTaskAsynchronously(new Viewer(sender, page, force)); } } @@ -82,7 +82,7 @@ private static void outputCache(final CommandSender sender, int page) cal.setTimeInMillis(cacheage); final DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); sender.sendMessage(_("balanceTop", format.format(cal.getTime()))); - new TextPager(cache).showPage(Integer.toString(page), "", "balancetop", sender); + new TextPager(cache).showPage(Integer.toString(page), null, "balancetop", sender); } @@ -144,7 +144,7 @@ public int compare(final Entry entry1, final Entry 1) { - banReason = _("banFormat", getFinalArg(args, 1), senderName); + banReason = Util.replaceFormat(getFinalArg(args, 1).replace("\\n", "\n").replace("|", "\n")); } else { - banReason = _("banFormat", _("defaultBanReason"), senderName); + banReason = _("defaultBanReason"); } - - user.setBanReason(banReason); + + user.setBanReason(_("banFormat", banReason, senderName)); user.setBanned(true); - user.kickPlayer(banReason); + user.setBanTimeout(0); + user.kickPlayer(_("banFormat", banReason, senderName)); + + server.getLogger().log(Level.INFO, _("playerBanned", senderName, user.getName(), banReason)); + + if (nomatch) + { + sender.sendMessage(_("userUnknown", user.getName())); + } for (Player onlinePlayer : server.getOnlinePlayers()) { final User player = ess.getUser(onlinePlayer); - if (player.isAuthorized("essentials.ban.notify")) + if (onlinePlayer == sender || player.isAuthorized("essentials.ban.notify")) { onlinePlayer.sendMessage(_("playerBanned", senderName, user.getName(), banReason)); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java index 5459bd8fc1..ca0751a51a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java @@ -1,9 +1,12 @@ 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; public class Commandbanip extends EssentialsCommand @@ -21,22 +24,33 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - final User player = ess.getUser(args[0]); + final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; + final String ipAddress; + final User player = ess.getUser(args[0]); if (player == null) { - ess.getServer().banIP(args[0]); - sender.sendMessage(_("banIpAddress")); + ipAddress = args[0]; } else { - final String ipAddress = player.getLastLoginAddress(); + ipAddress = player.getLastLoginAddress(); if (ipAddress.length() == 0) { throw new Exception(_("playerNotFound")); } - ess.getServer().banIP(player.getLastLoginAddress()); - sender.sendMessage(_("banIpAddress")); + } + + ess.getServer().banIP(ipAddress); + server.getLogger().log(Level.INFO, _("playerBanIpAddress", senderName, ipAddress)); + + for (Player onlinePlayer : server.getOnlinePlayers()) + { + final User onlineUser = ess.getUser(onlinePlayer); + if (onlinePlayer == sender || onlineUser.isAuthorized("essentials.ban.notify")) + { + onlinePlayer.sendMessage(_("playerBanIpAddress", senderName, ipAddress)); + } } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbook.java b/Essentials/src/com/earth2me/essentials/commands/Commandbook.java new file mode 100644 index 0000000000..897069b934 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbook.java @@ -0,0 +1,92 @@ +package com.earth2me.essentials.commands; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.User; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; + + +public class Commandbook extends EssentialsCommand +{ + public Commandbook() + { + super("book"); + } + + //TODO: Translate this + @Override + public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + { + final ItemStack item = user.getItemInHand(); + final String player = user.getName(); + if (item.getType() == Material.WRITTEN_BOOK) + { + BookMeta bmeta = (BookMeta)item.getItemMeta(); + + if (args.length > 1 && args[0].equalsIgnoreCase("author")) + { + if (user.isAuthorized("essentals.book.author") && (isAuthor(bmeta, player) || user.isAuthorized("essentials.book.others"))) + { + bmeta.setAuthor(args[1]); + item.setItemMeta(bmeta); + user.sendMessage(_("bookAuthorSet", getFinalArg(args, 1))); + } + else + { + throw new Exception(_("denyChangeAuthor")); + } + } + else if (args.length > 1 && args[0].equalsIgnoreCase("title")) + { + if (user.isAuthorized("essentials.book.title") && (isAuthor(bmeta, player) || user.isAuthorized("essentials.book.others"))) + { + bmeta.setTitle(args[1]); + item.setItemMeta(bmeta); + user.sendMessage(_("bookTitleSet", getFinalArg(args, 1))); + } + else + { + throw new Exception(_("denyChangeTitle")); + } + } + else + { + if (isAuthor(bmeta, player) || user.isAuthorized("essentials.book.others")) + { + ItemStack newItem = new ItemStack(Material.BOOK_AND_QUILL, item.getAmount()); + newItem.setItemMeta(bmeta); + user.setItemInHand(newItem); + user.sendMessage(_("editBookContents")); + } + else + { + throw new Exception(_("denyBookEdit")); + } + } + } + else if (item.getType() == Material.BOOK_AND_QUILL) + { + BookMeta bmeta = (BookMeta)item.getItemMeta(); + if (!user.isAuthorized("essentals.book.author")) + { + bmeta.setAuthor(player); + } + ItemStack newItem = new ItemStack(Material.WRITTEN_BOOK, item.getAmount()); + newItem.setItemMeta(bmeta); + user.setItemInHand(newItem); + user.sendMessage(_("bookLocked")); + } + else + { + throw new Exception(_("holdBook")); + } + } + + private boolean isAuthor(BookMeta bmeta, String player) + { + String author = bmeta.getAuthor(); + return author != null && author.equalsIgnoreCase(player); + } +} \ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbreak.java b/Essentials/src/com/earth2me/essentials/commands/Commandbreak.java index 242fa9b537..af11f597d7 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbreak.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbreak.java @@ -2,13 +2,10 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; -import java.util.ArrayList; -import java.util.List; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.block.Block; import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; public class Commandbreak extends EssentialsCommand diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbroadcast.java b/Essentials/src/com/earth2me/essentials/commands/Commandbroadcast.java index e6eeda28b3..2b588d6846 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbroadcast.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbroadcast.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.User; import com.earth2me.essentials.Util; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -13,6 +14,17 @@ public Commandbroadcast() super("broadcast"); } + @Override + public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + { + if (args.length < 1) + { + throw new NotEnoughArgumentsException(); + } + + ess.broadcastMessage(null, _("broadcast", Util.replaceFormat(getFinalArg(args, 0)), user.getDisplayName())); + } + @Override public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { @@ -21,6 +33,6 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - ess.broadcastMessage(null, _("broadcast", Util.replaceFormat(getFinalArg(args, 0)))); + ess.broadcastMessage(null, _("broadcast", Util.replaceFormat(getFinalArg(args, 0)), sender.getName())); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandburn.java b/Essentials/src/com/earth2me/essentials/commands/Commandburn.java index 5d8d38ce7a..8c98188f71 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandburn.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandburn.java @@ -4,6 +4,7 @@ import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import com.earth2me.essentials.User; public class Commandburn extends EssentialsCommand @@ -20,11 +21,15 @@ protected void run(final Server server, final CommandSender sender, final String { throw new NotEnoughArgumentsException(); } - - for (Player p : server.matchPlayer(args[0])) + + //TODO: TL this + if (args[0].trim().length() < 2) { - p.setFireTicks(Integer.parseInt(args[1]) * 20); - sender.sendMessage(_("burnMsg", p.getDisplayName(), Integer.parseInt(args[1]))); + throw new NotEnoughArgumentsException("You need to specify a player to burn."); } + + User user = getPlayer(server, args, 0); + user.setFireTicks(Integer.parseInt(args[1]) * 20); + sender.sendMessage(_("burnMsg", user.getDisplayName(), Integer.parseInt(args[1]))); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java index ef2502b9bb..5ca434fc64 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java @@ -2,10 +2,12 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; public class Commandclearinventory extends EssentialsCommand @@ -21,77 +23,138 @@ public void run(Server server, User user, String commandLabel, String[] args) th { if (args.length > 0 && user.isAuthorized("essentials.clearinventory.others")) { - //TODO: Fix fringe user match case. - if (args[0].length() >= 3) + if (args[0].contentEquals("*") && user.isAuthorized("essentials.clearinventory.all")) { - List online = server.matchPlayer(args[0]); - - if (!online.isEmpty()) - { - for (Player p : online) - { - p.getInventory().clear(); - user.sendMessage(_("inventoryClearedOthers", p.getDisplayName())); - } - return; - } - throw new Exception(_("playerNotFound")); + cleanInventoryAll(server, user, args); + } + else if (args[0].trim().length() < 2) + { + cleanInventorySelf(server, user, args); } else { - Player p = server.getPlayer(args[0]); - if (p != null) - { - p.getInventory().clear(); - user.sendMessage(_("inventoryClearedOthers", p.getDisplayName())); - } - else - { - throw new Exception(_("playerNotFound")); - } + cleanInventoryOthers(server, user, args); } } else { - user.getInventory().clear(); - user.sendMessage(_("inventoryCleared")); + cleanInventorySelf(server, user, args); } } @Override protected void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception { - if (args.length < 1) + if (args.length > 0) + { + if (args[0].contentEquals("*")) + { + cleanInventoryAll(server, sender, args); + } + else if (args[0].trim().length() < 2) + { + throw new Exception(_("playerNotFound")); + } + else + { + cleanInventoryOthers(server, sender, args); + } + } + else { throw new NotEnoughArgumentsException(); } + } - if (args[0].length() >= 3) + private void cleanInventoryAll(Server server, CommandSender sender, String[] args) throws Exception + { + if (args.length > 1) { - List online = server.matchPlayer(args[0]); + for (Player onlinePlayer : server.getOnlinePlayers()) + { + clearInventory(onlinePlayer, args[1]); + } + sender.sendMessage(_("inventoryClearedAll")); + } + else + { + throw new NotEnoughArgumentsException(); + } + } - if (!online.isEmpty()) + private void cleanInventoryOthers(Server server, CommandSender sender, String[] args) throws Exception + { + List online = server.matchPlayer(args[0]); + + if (!online.isEmpty()) + { + for (Player p : online) { - for (Player p : online) + if (args.length > 1) + { + clearInventory(p, args[1]); + } + else { p.getInventory().clear(); - sender.sendMessage(_("inventoryClearedOthers", p.getDisplayName())); } - return; + sender.sendMessage(_("inventoryClearedOthers", p.getDisplayName())); } + } + else + { throw new Exception(_("playerNotFound")); } + } + + private void cleanInventorySelf(Server server, User user, String[] args) throws Exception + { + if (args.length > 0) + { + clearInventory(user, args[0]); + } + else + { + user.getInventory().clear(); + } + user.sendMessage(_("inventoryCleared")); + } + + private void clearInventory(Player player, String arg) throws Exception + { + if (arg.equalsIgnoreCase("*")) + { + player.getInventory().clear(); + } + else if (arg.equalsIgnoreCase("**")) + { + player.getInventory().clear(); + player.getInventory().setArmorContents(null); + } else { - Player u = server.getPlayer(args[0]); - if (u != null) + final String[] split = arg.split(":"); + final ItemStack item = ess.getItemDb().get(split[0]); + final int type = item.getTypeId(); + + if (split.length > 1 && Util.isInt(split[1])) { - u.getInventory().clear(); - sender.sendMessage(_("inventoryClearedOthers", u.getDisplayName())); + player.getInventory().clear(type, Integer.parseInt(split[1])); + } + else if (split.length > 1 && split[1].equalsIgnoreCase("*")) + { + player.getInventory().clear(type, -1); } else { - throw new Exception(_("playerNotFound")); + if (Util.isInt(split[0])) + { + player.getInventory().clear(type, -1); + } + else + { + player.getInventory().clear(type, item.getDurability()); + } } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java b/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java index c4d0a69464..182b695655 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java @@ -39,7 +39,7 @@ public void run(final Server server, final CommandSender sender, final String co if (expandedArg.length > 1 && (user == null || user.isAuthorized("essentials.delhome.others"))) { - user = getPlayer(server, expandedArg, 0, true); + user = getPlayer(server, expandedArg, 0, true, true); name = expandedArg[1]; } else if (user == null) @@ -50,10 +50,10 @@ else if (user == null) { name = expandedArg[0]; } - //TODO: Think up a nice error message - /* - * if (name.equalsIgnoreCase("bed")) { throw new Exception("You cannot remove the vanilla home point"); } - */ + + + if (name.equalsIgnoreCase("bed")) { throw new Exception(_("invalidHomeName")); } + user.delHome(name.toLowerCase(Locale.ENGLISH)); sender.sendMessage(_("deleteHome", name)); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java index dd6d6ad0d3..5cad0e7bee 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java @@ -2,6 +2,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.Locale; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -22,12 +23,16 @@ public void run(final Server server, final CommandSender sender, final String co { throw new NotEnoughArgumentsException(); } - EcoCommands cmd; + + Commandeco.EcoCommands cmd; + double startingBalance = (double)ess.getSettings().getStartingBalance(); double amount; + Double broadcast = null; + Double broadcastAll = null; try { - cmd = EcoCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH)); - amount = Double.parseDouble(args[2].replaceAll("[^0-9\\.]", "")); + cmd = Commandeco.EcoCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH)); + amount = (cmd == Commandeco.EcoCommands.RESET) ? startingBalance : Double.parseDouble(args[2].replaceAll("[^0-9\\.]", "")); } catch (Exception ex) { @@ -46,14 +51,13 @@ public void run(final Server server, final CommandSender sender, final String co break; case TAKE: - if (player.canAfford(amount, false)) - { - player.takeMoney(amount); - } + take(amount, player, null); break; case RESET: - player.setMoney(amount == 0 ? ess.getSettings().getStartingBalance() : amount); + case SET: + set(amount, player, null); + broadcastAll = amount; break; } } @@ -70,22 +74,20 @@ else if (args[1].contentEquals("*")) break; case TAKE: - if (!player.canAfford(amount, false)) - { - throw new Exception(_("notEnoughMoney")); - } - player.takeMoney(amount); + take(amount, player, null); break; case RESET: - player.setMoney(amount == 0 ? ess.getSettings().getStartingBalance() : amount); + case SET: + set(amount, player, null); + broadcast = amount; break; } } } else { - final User player = getPlayer(server, args, 1, true); + final User player = getPlayer(server, args, 1, true, true); switch (cmd) { case GIVE: @@ -93,23 +95,60 @@ else if (args[1].contentEquals("*")) break; case TAKE: - if (!player.canAfford(amount, false)) - { - throw new Exception(_("notEnoughMoney")); - } - player.takeMoney(amount, sender); + take(amount, player, sender); break; case RESET: - player.setMoney(amount == 0 ? ess.getSettings().getStartingBalance() : amount); + case SET: + set(amount, player, sender); break; } } + + if (broadcast != null) + { + server.broadcastMessage(_("resetBal", Util.formatAsCurrency(broadcast))); + } + if (broadcastAll != null) + { + server.broadcastMessage(_("resetBalAll", Util.formatAsCurrency(broadcastAll))); + } + } + + private void take(double amount, final User player, final CommandSender sender) throws Exception + { + double money = player.getMoney(); + double minBalance = ess.getSettings().getMinMoney(); + if (money - amount > minBalance) + { + player.takeMoney(amount, sender); + } + else if (sender == null) + { + player.setMoney(minBalance); + player.sendMessage(_("takenFromAccount", Util.displayCurrency(money - minBalance, ess))); + } + else + { + throw new Exception(_("insufficientFunds")); + } + } + + private void set(double amount, final User player, final CommandSender sender) + { + double minBalance = ess.getSettings().getMinMoney(); + boolean underMinimum = amount < minBalance; + player.setMoney(underMinimum ? minBalance : amount); + player.sendMessage(_("setBal", Util.displayCurrency(player.getMoney(), ess))); + if (sender != null) + { + sender.sendMessage(_("setBalOthers", player.getDisplayName(), Util.displayCurrency(player.getMoney(), ess))); + } } private enum EcoCommands { - GIVE, TAKE, RESET + GIVE, TAKE, SET, RESET } -} +} \ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandenchant.java b/Essentials/src/com/earth2me/essentials/commands/Commandenchant.java index 51a909d29c..f95b777a24 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandenchant.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandenchant.java @@ -2,9 +2,14 @@ import com.earth2me.essentials.Enchantments; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.MetaItemStack; import com.earth2me.essentials.User; import com.earth2me.essentials.Util; -import java.util.*; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; @@ -22,7 +27,7 @@ public Commandenchant() protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { final ItemStack stack = user.getItemInHand(); - if (stack == null) + if (stack == null || stack.getType() == Material.AIR) { throw new Exception(_("nothingInHand")); } @@ -32,7 +37,7 @@ protected void run(final Server server, final User user, final String commandLab for (Map.Entry entry : Enchantments.entrySet()) { final String enchantmentName = entry.getValue().getName().toLowerCase(Locale.ENGLISH); - if (enchantmentslist.contains(enchantmentName) || user.isAuthorized("essentials.enchant." + enchantmentName)) + if (enchantmentslist.contains(enchantmentName) || (user.isAuthorized("essentials.enchantments." + enchantmentName) && entry.getValue().canEnchantItem(stack))) { enchantmentslist.add(entry.getKey()); //enchantmentslist.add(enchantmentName); @@ -40,6 +45,7 @@ protected void run(final Server server, final User user, final String commandLab } throw new NotEnoughArgumentsException(_("enchantments", Util.joinList(enchantmentslist.toArray()))); } + int level = -1; if (args.length > 1) { @@ -52,20 +58,14 @@ protected void run(final Server server, final User user, final String commandLab level = -1; } } - final Enchantment enchantment = getEnchantment(args[0], user); - if (level < 0 || level > enchantment.getMaxLevel()) - { - level = enchantment.getMaxLevel(); - } - if (level == 0) - { - stack.removeEnchantment(enchantment); - } - else - { - stack.addEnchantment(enchantment, level); - } - user.getInventory().setItemInHand(stack); + + final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments() && user.isAuthorized("essentials.enchantments.allowunsafe"); + + final MetaItemStack metaStack = new MetaItemStack(stack); + final Enchantment enchantment = metaStack.getEnchantment(user, args[0]); + metaStack.addEnchantment(user, allowUnsafe, enchantment, level); + user.getInventory().setItemInHand(metaStack.getItemStack()); + user.updateInventory(); final String enchantmentName = enchantment.getName().toLowerCase(Locale.ENGLISH); if (level == 0) @@ -77,20 +77,4 @@ protected void run(final Server server, final User user, final String commandLab user.sendMessage(_("enchantmentApplied", enchantmentName.replace('_', ' '))); } } - - public static Enchantment getEnchantment(final String name, final User user) throws Exception - { - - final Enchantment enchantment = Enchantments.getByName(name); - if (enchantment == null) - { - throw new Exception(_("enchantmentNotFound")); - } - final String enchantmentName = enchantment.getName().toLowerCase(Locale.ENGLISH); - if (user != null && !user.isAuthorized("essentials.enchant." + enchantmentName)) - { - throw new Exception(_("enchantmentPerm", enchantmentName)); - } - return enchantment; - } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandenderchest.java b/Essentials/src/com/earth2me/essentials/commands/Commandenderchest.java new file mode 100644 index 0000000000..d256e97863 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandenderchest.java @@ -0,0 +1,30 @@ +package com.earth2me.essentials.commands; + +import com.earth2me.essentials.User; +import org.bukkit.Server; + + +public class Commandenderchest extends EssentialsCommand +{ + public Commandenderchest() + { + super("enderchest"); + } + + @Override + protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + { + if (args.length > 0 && user.isAuthorized("essentials.enderchest.others")) + { + final User invUser = getPlayer(server, user, args, 0); + user.openInventory(invUser.getEnderChest()); + user.setEnderSee(true); + } + else + { + user.openInventory(user.getEnderChest()); + user.setEnderSee(false); + } + + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java index 2a89dcd42d..5bb7e6ac0b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java @@ -1,22 +1,22 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.User; +import com.earth2me.essentials.UserMap; import com.earth2me.essentials.Util; import com.earth2me.essentials.metrics.Metrics; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; +import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; - +// This command has 4 undocumented behaviours #EasterEgg public class Commandessentials extends EssentialsCommand { public Commandessentials() @@ -29,7 +29,8 @@ public Commandessentials() @Override public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - if (args.length == 0) { + if (args.length == 0) + { run_disabled(server, sender, commandLabel, args); } else if (args[0].equalsIgnoreCase("debug")) @@ -44,122 +45,120 @@ else if (args[0].equalsIgnoreCase("moo")) { run_moo(server, sender, commandLabel, args); } + else if (args[0].equalsIgnoreCase("reset")) + { + run_reset(server, sender, commandLabel, args); + } else if (args[0].equalsIgnoreCase("opt-out")) { run_optout(server, sender, commandLabel, args); } - else { + else if (args[0].equalsIgnoreCase("cleanup")) + { + run_cleanup(server, sender, commandLabel, args); + } + else + { run_reload(server, sender, commandLabel, args); } } - + + //If you do not supply an argument this command will list 'overridden' commands. private void run_disabled(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - sender.sendMessage("Essentials " + ess.getDescription().getVersion()); sender.sendMessage("/ "); - + final StringBuilder disabledCommands = new StringBuilder(); for (Map.Entry entry : ess.getAlternativeCommandsHandler().disabledCommands().entrySet()) { - if (disabledCommands.length() > 0) { + if (disabledCommands.length() > 0) + { disabledCommands.append(", "); } disabledCommands.append(entry.getKey()).append(" => ").append(entry.getValue()); } - if (disabledCommands.length() > 0) { + if (disabledCommands.length() > 0) + { sender.sendMessage(_("blockList")); sender.sendMessage(disabledCommands.toString()); } } - + + private void run_reset(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception + { + if (args.length < 2) + { + throw new Exception("/ reset "); + } + final User user = getPlayer(server, args, 1, true, true); + user.reset(); + sender.sendMessage("Reset Essentials userdata for player: " + user.getDisplayName()); + } + private void run_debug(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { ess.getSettings().setDebug(!ess.getSettings().isDebug()); sender.sendMessage("Essentials " + ess.getDescription().getVersion() + " debug mode " + (ess.getSettings().isDebug() ? "enabled" : "disabled")); } - + private void run_reload(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { ess.reload(); sender.sendMessage(_("essentialsReload", ess.getDescription().getVersion())); } - + private void run_nya(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - final Map noteMap = new HashMap(); - noteMap.put("1F#", (byte)0x0); - noteMap.put("1G", (byte)0x1); - noteMap.put("1G#", (byte)0x2); - noteMap.put("1A", (byte)0x3); - noteMap.put("1A#", (byte)0x4); - noteMap.put("1B", (byte)0x5); - noteMap.put("1C", (byte)0x6); - noteMap.put("1C#", (byte)0x7); - noteMap.put("1D", (byte)0x8); - noteMap.put("1D#", (byte)0x9); - noteMap.put("1E", (byte)0xA); - noteMap.put("1F", (byte)0xB); - noteMap.put("2F#", (byte)(0x0 + 0xC)); - noteMap.put("2G", (byte)(0x1 + 0xC)); - noteMap.put("2G#", (byte)(0x2 + 0xC)); - noteMap.put("2A", (byte)(0x3 + 0xC)); - noteMap.put("2A#", (byte)(0x4 + 0xC)); - noteMap.put("2B", (byte)(0x5 + 0xC)); - noteMap.put("2C", (byte)(0x6 + 0xC)); - noteMap.put("2C#", (byte)(0x7 + 0xC)); - noteMap.put("2D", (byte)(0x8 + 0xC)); - noteMap.put("2D#", (byte)(0x9 + 0xC)); - noteMap.put("2E", (byte)(0xA + 0xC)); - noteMap.put("2F", (byte)(0xB + 0xC)); - if (!noteBlocks.isEmpty()) - { - return; - } - final String tuneStr = "1D#,1E,2F#,,2A#,1E,1D#,1E,2F#,2B,2D#,2E,2D#,2A#,2B,,2F#,,1D#,1E,2F#,2B,2C#,2A#,2B,2C#,2E,2D#,2E,2C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1B,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1B,,"; - final String[] tune = tuneStr.split(","); - for (Player player : server.getOnlinePlayers()) + final Map noteMap = new HashMap(); + noteMap.put("1F#", 0.5f); + noteMap.put("1G", 0.53f); + noteMap.put("1G#", 0.56f); + noteMap.put("1A", 0.6f); + noteMap.put("1A#", 0.63f); + noteMap.put("1B", 0.67f); + noteMap.put("1C", 0.7f); + noteMap.put("1C#", 0.76f); + noteMap.put("1D", 0.8f); + noteMap.put("1D#", 0.84f); + noteMap.put("1E", 0.9f); + noteMap.put("1F", 0.94f); + noteMap.put("2F#", 1.0f); + noteMap.put("2G", 1.06f); + noteMap.put("2G#", 1.12f); + noteMap.put("2A", 1.18f); + noteMap.put("2A#", 1.26f); + noteMap.put("2B", 1.34f); + noteMap.put("2C", 1.42f); + noteMap.put("2C#", 1.5f); + noteMap.put("2D", 1.6f); + noteMap.put("2D#", 1.68f); + noteMap.put("2E", 1.78f); + noteMap.put("2F", 1.88f); + final String tuneStr = "1D#,1E,2F#,,2A#,1E,1D#,1E,2F#,2B,2D#,2E,2D#,2A#,2B,,2F#,,1D#,1E,2F#,2B,2C#,2A#,2B,2C#,2E,2D#,2E,2C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1B,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1B,,"; + final String[] tune = tuneStr.split(","); + taskid = ess.scheduleSyncRepeatingTask(new Runnable() + { + int i = 0; + + @Override + public void run() { - final Location loc = player.getLocation(); - loc.add(0, 3, 0); - while (loc.getBlockY() < player.getLocation().getBlockY() + 10 && loc.getBlock().getTypeId() != 0) + final String note = tune[i]; + i++; + if (i >= tune.length) { - loc.add(0, 1, 0); + Commandessentials.this.stopTune(); } - if (loc.getBlock().getTypeId() == 0) + if (note.isEmpty() || note == null) { - noteBlocks.put(player, loc.getBlock()); - loc.getBlock().setType(Material.NOTE_BLOCK); + return; } - } - taskid = ess.scheduleSyncRepeatingTask(new Runnable() - { - int i = 0; - - @Override - public void run() + for (Player onlinePlayer : server.getOnlinePlayers()) { - final String note = tune[i]; - i++; - if (i >= tune.length) - { - Commandessentials.this.stopTune(); - } - if (note.isEmpty()) - { - return; - } - Map noteBlocks = Commandessentials.this.noteBlocks; - for (Player onlinePlayer : server.getOnlinePlayers()) - { - final Block block = noteBlocks.get(onlinePlayer); - if (block == null || block.getType() != Material.NOTE_BLOCK) - { - continue; - } - onlinePlayer.playNote(block.getLocation(), (byte)0, noteMap.get(note)); - } + onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.NOTE_PIANO, 1, noteMap.get(note)); } - }, 20, 2); + } + }, 20, 2); } private void stopTune() @@ -174,24 +173,39 @@ private void stopTune() } noteBlocks.clear(); } - + private void run_moo(final Server server, final CommandSender sender, final String command, final String args[]) { - if(sender instanceof ConsoleCommandSender) - sender.sendMessage(new String[]{" (__)", " (oo)", " /------\\/", " / | ||", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..." } ); + if (sender instanceof ConsoleCommandSender) + { + sender.sendMessage(new String[] + { + " (__)", " (oo)", " /------\\/", " / | ||", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..." + }); + } else - sender.sendMessage(new String[]{" (__)", " (oo)", " /------\\/", " / | | |", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..." } ); + { + sender.sendMessage(new String[] + { + " (__)", " (oo)", " /------\\/", " / | | |", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..." + }); + final Player player = (Player)sender; + player.playSound(player.getLocation(), Sound.COW_IDLE, 1, 1.0f); + } } - + private void run_optout(final Server server, final CommandSender sender, final String command, final String args[]) { final Metrics metrics = ess.getMetrics(); try { sender.sendMessage("Essentials collects simple metrics to highlight which features to concentrate work on in the future."); - if (metrics.isOptOut()) { - metrics.enable(); - } else { + if (metrics.isOptOut()) + { + metrics.enable(); + } + else + { metrics.disable(); } sender.sendMessage("Anonymous Metrics are now: " + (metrics.isOptOut() ? "disabled" : "enabled")); @@ -201,4 +215,59 @@ private void run_optout(final Server server, final CommandSender sender, final S sender.sendMessage("Unable to modify 'plugins/PluginMetrics/config.yml': " + ex.getMessage()); } } + + private void run_cleanup(final Server server, final CommandSender sender, final String command, final String args[]) throws Exception + { + if (args.length < 2 || !Util.isInt(args[1])) + { + sender.sendMessage("This sub-command will delete users who havent logged in in the last days."); + sender.sendMessage("Optional parameters define the minium amount required to prevent deletion."); + throw new Exception("/ cleanup [money] [homes] [ban count]"); + } + sender.sendMessage(_("cleaning")); + + final long daysArg = Long.parseLong(args[1]); + final double moneyArg = args.length >= 3 ? Double.parseDouble(args[2].replaceAll("[^0-9\\.]", "")) : 0; + final int homesArg = args.length >= 4 && Util.isInt(args[3]) ? Integer.parseInt(args[3]) : 0; + final int bansArg = args.length >= 5 && Util.isInt(args[4]) ? Integer.parseInt(args[4]) : 0; + final UserMap userMap = ess.getUserMap(); + + ess.runTaskAsynchronously(new Runnable() + { + @Override + public void run() + { + for (String u : userMap.getAllUniqueUsers()) + { + final User user = ess.getUserMap().getUser(u); + if (user == null) + { + continue; + } + + int ban = user.getBanReason().equals("") ? 0 : 1; + long lastLog = user.getLastLogout(); + long timeDiff = System.currentTimeMillis() - lastLog; + long milliDays = daysArg * 24L * 60L * 60L * 1000L; + int homeCount = user.getHomes().size(); + double moneyCount = user.getMoney(); + + if ((lastLog == 0) || (ban > bansArg) || (timeDiff < milliDays) + || (homeCount > homesArg) || (moneyCount > moneyArg)) + { + continue; + } + + if (ess.getSettings().isDebug()) + { + ess.getLogger().info("Deleting user: " + user.getName() + " Money: " + moneyCount + " Homes: " + homeCount + " Last seen: " + Util.formatDateDiff(lastLog)); + } + + user.reset(); + } + sender.sendMessage(_("cleaned")); + } + }); + + } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandexp.java b/Essentials/src/com/earth2me/essentials/commands/Commandexp.java index de4727fa02..89ea456e71 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandexp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandexp.java @@ -4,6 +4,8 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.Util; import com.earth2me.essentials.craftbukkit.SetExpFix; +import java.util.List; +import java.util.Locale; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -45,21 +47,40 @@ else if (args[0].equalsIgnoreCase("give") && user.isAuthorized("essentials.exp.g setExp(user, user, args[1], true); } } - else + else if (args[0].equalsIgnoreCase("show")) { - String match = args[0].trim(); - if (args.length == 2) + if (args.length >= 2 && user.isAuthorized("essentials.exp.others")) { - match = args[1].trim(); + String match = args[1].trim(); + showMatch(server, user, match); } - if (match.equalsIgnoreCase("show") || !user.isAuthorized("essentials.exp.others")) + else { showExp(user, user); } - else + } + else + { + if (args.length >= 1 && Util.isInt(args[0].toLowerCase(Locale.ENGLISH).replace("l", "")) && user.isAuthorized("essentials.exp.give")) { + if (args.length >= 2 && user.isAuthorized("essentials.exp.give.others")) + { + expMatch(server, user, args[1], args[0], true); + } + else + { + setExp(user, user, args[0], true); + } + } + else if (args.length >= 1 && user.isAuthorized("essentials.exp.others")) + { + String match = args[0].trim(); showMatch(server, user, match); } + else + { + showExp(user, user); + } } } @@ -81,9 +102,14 @@ else if (args.length > 2 && args[0].equalsIgnoreCase("give")) else { String match = args[0].trim(); - if (args.length == 2) + if (args.length >= 2 && Util.isInt(args[0].toLowerCase(Locale.ENGLISH).replace("l", ""))) { match = args[1].trim(); + expMatch(server, sender, match, args[0], true); + } + else if (args.length == 1) + { + match = args[0].trim(); } showMatch(server, sender, match); } @@ -91,12 +117,18 @@ else if (args.length > 2 && args[0].equalsIgnoreCase("give")) private void showMatch(final Server server, final CommandSender sender, final String match) throws NotEnoughArgumentsException { + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); boolean foundUser = false; - for (Player matchPlayer : server.matchPlayer(match)) + final List matchedPlayers = server.matchPlayer(match); + for (Player matchPlayer : matchedPlayers) { + final User player = ess.getUser(matchPlayer); + if (skipHidden && player.isHidden()) + { + continue; + } foundUser = true; - final User target = ess.getUser(matchPlayer); - showExp(sender, target); + showExp(sender, player); } if (!foundUser) { @@ -104,14 +136,19 @@ private void showMatch(final Server server, final CommandSender sender, final St } } - private void expMatch(final Server server, final CommandSender sender, final String match, final String amount, final boolean toggle) throws NotEnoughArgumentsException + private void expMatch(final Server server, final CommandSender sender, final String match, String amount, final boolean give) throws NotEnoughArgumentsException { boolean foundUser = false; - for (Player matchPlayer : server.matchPlayer(match)) + final List matchedPlayers = server.matchPlayer(match); + for (Player matchPlayer : matchedPlayers) { - final User target = ess.getUser(matchPlayer); - setExp(sender, target, amount, toggle); + final User player = ess.getUser(matchPlayer); + if (player.isHidden()) + { + continue; + } foundUser = true; + setExp(sender, player, amount, give); } if (!foundUser) { @@ -121,14 +158,34 @@ private void expMatch(final Server server, final CommandSender sender, final Str private void showExp(final CommandSender sender, final User target) { - final int totalExp = SetExpFix.getTotalExperience(target); - final int expLeft = (int)Util.roundDouble(((((3.5 * target.getLevel()) + 6.7) - (totalExp - ((1.75 * (target.getLevel() * target.getLevel())) + (5.00 * target.getLevel())))) + 1)); - sender.sendMessage(_("exp", target.getDisplayName(), SetExpFix.getTotalExperience(target), target.getLevel(), expLeft)); + sender.sendMessage(_("exp", target.getDisplayName(), SetExpFix.getTotalExperience(target), target.getLevel(), SetExpFix.getExpUntilNextLevel(target))); } - private void setExp(final CommandSender sender, final User target, final String strAmount, final boolean give) + //TODO: Limit who can give negative exp? + private void setExp(final CommandSender sender, final User target, String strAmount, final boolean give) throws NotEnoughArgumentsException { - Long amount = Long.parseLong(strAmount); + long amount; + strAmount = strAmount.toLowerCase(Locale.ENGLISH); + if (strAmount.contains("l")) + { + strAmount = strAmount.replaceAll("l", ""); + int neededLevel = Integer.parseInt(strAmount); + if (give) + { + neededLevel += target.getLevel(); + } + amount = (long)SetExpFix.getExpToLevel(neededLevel); + SetExpFix.setTotalExperience(target, 0); + } + else + { + amount = Long.parseLong(strAmount); + if (amount > Integer.MAX_VALUE || amount < Integer.MIN_VALUE) + { + throw new NotEnoughArgumentsException(); + } + } + if (give) { amount += SetExpFix.getTotalExperience(target); @@ -137,7 +194,11 @@ private void setExp(final CommandSender sender, final User target, final String { amount = (long)Integer.MAX_VALUE; } - SetExpFix.setTotalExperience(target, amount.intValue()); + if (amount < 0l) + { + amount = 0l; + } + SetExpFix.setTotalExperience(target, (int)amount); sender.sendMessage(_("expSet", target.getDisplayName(), amount)); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandext.java b/Essentials/src/com/earth2me/essentials/commands/Commandext.java index 3855e7b681..552f74db29 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandext.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandext.java @@ -2,6 +2,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -40,10 +41,23 @@ public void run(final Server server, final User user, final String commandLabel, private void extinguishPlayers(final Server server, final CommandSender sender, final String name) throws Exception { - for (Player matchPlayer : server.matchPlayer(name)) + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); + boolean foundUser = false; + final List matchedPlayers = server.matchPlayer(name); + for (Player matchPlayer : matchedPlayers) { + final User player = ess.getUser(matchPlayer); + if (skipHidden && player.isHidden()) + { + continue; + } + foundUser = true; matchPlayer.setFireTicks(0); sender.sendMessage(_("extinguishOthers", matchPlayer.getDisplayName())); } + if (!foundUser) + { + throw new NotEnoughArgumentsException(_("playerNotFound")); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandfeed.java b/Essentials/src/com/earth2me/essentials/commands/Commandfeed.java index 0c1579835e..4644e6c3ac 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandfeed.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandfeed.java @@ -20,7 +20,7 @@ protected void run(final Server server, final User user, final String commandLab { if (args.length > 0 && user.isAuthorized("essentials.feed.others")) { - feedOtherPlayers(server,user,args[0]); + feedOtherPlayers(server, user, args[0]); } else { @@ -29,24 +29,27 @@ protected void run(final Server server, final User user, final String commandLab user.sendMessage(_("feed")); } } - - private void feedOtherPlayers(final Server server, final CommandSender sender, final String name) + + private void feedOtherPlayers(final Server server, final CommandSender sender, final String name) throws NotEnoughArgumentsException { - final List players = server.matchPlayer(name); - if (players.isEmpty()) - { - sender.sendMessage(_("playerNotFound")); - return; - } - for (Player player : players) + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); + boolean foundUser = false; + final List matchedPlayers = server.matchPlayer(name); + for (Player matchPlayer : matchedPlayers) { - if (ess.getUser(player).isHidden()) + final User player = ess.getUser(matchPlayer); + if (skipHidden && player.isHidden()) { continue; } - player.setFoodLevel(20); - player.setSaturation(10); - sender.sendMessage(_("feedOther", player.getDisplayName())); + foundUser = true; + matchPlayer.setFoodLevel(20); + matchPlayer.setSaturation(10); + sender.sendMessage(_("feedOther", matchPlayer.getDisplayName())); + } + if (!foundUser) + { + throw new NotEnoughArgumentsException(_("playerNotFound")); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandfireball.java b/Essentials/src/com/earth2me/essentials/commands/Commandfireball.java index 671d0f72b8..f1aae3ca7c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandfireball.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandfireball.java @@ -2,8 +2,7 @@ import com.earth2me.essentials.User; import org.bukkit.Server; -import org.bukkit.entity.Fireball; -import org.bukkit.entity.SmallFireball; +import org.bukkit.entity.*; import org.bukkit.util.Vector; @@ -18,12 +17,43 @@ public Commandfireball() protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { boolean small = false; - if (args.length > 0 && args[0].equalsIgnoreCase("small")) + Class type = Fireball.class; + Projectile projectile; + int speed = 2; + if (args.length > 0) { - small = true; + if (args[0].equalsIgnoreCase("small")) + { + type = SmallFireball.class; + } + else if (args[0].equalsIgnoreCase("arrow")) + { + type = Arrow.class; + } + else if (args[0].equalsIgnoreCase("skull")) + { + type = WitherSkull.class; + } + else if (args[0].equalsIgnoreCase("egg")) + { + type = Egg.class; + } + else if(args[0].equalsIgnoreCase("snowball")) + { + type = Snowball.class; + } + else if(args[0].equalsIgnoreCase("expbottle")) + { + type = ThrownExpBottle.class; + } + else if(args[0].equalsIgnoreCase("large")) + { + type = LargeFireball.class; + } } - final Vector direction = user.getEyeLocation().getDirection().multiply(2); - Fireball fireball = user.getWorld().spawn(user.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), small ? SmallFireball.class : Fireball.class); - fireball.setShooter(user.getBase()); + final Vector direction = user.getEyeLocation().getDirection().multiply(speed); + projectile = (Projectile)user.getWorld().spawn(user.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), type); + projectile.setShooter(user.getBase()); + projectile.setVelocity(direction); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandfirework.java b/Essentials/src/com/earth2me/essentials/commands/Commandfirework.java new file mode 100644 index 0000000000..41a844fbd1 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandfirework.java @@ -0,0 +1,153 @@ +package com.earth2me.essentials.commands; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.MetaItemStack; +import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; +import java.util.regex.Pattern; +import org.bukkit.FireworkEffect; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Firework; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.util.Vector; + +//This command has quite a complicated syntax, in theory it has 4 seperate syntaxes which are all variable: +// +//1: /firework clear - This clears all of the effects on a firework stack +// +//2: /firework power - This changes the base power of a firework +// +//3: /firework fire - This 'fires' a copy of the firework held. +//3: /firework fire - This 'fires' a number of copies of the firework held. +//3: /firework fire - This 'fires' a copy of the firework held, in the direction you are looking, #easteregg +// +//4: /firework [meta] - This will add an effect to the firework stack held +//4: /firework color: - The minimum you need to set an effect is 'color' +//4: Full Syntax: color: [fade:] [shape:] [effect:] +//4: Possible Shapes: star, ball, large, creeper, burst +//4: Possible Effects trail, twinkle + +public class Commandfirework extends EssentialsCommand +{ + private final transient Pattern splitPattern = Pattern.compile("[:+',;.]"); + + public Commandfirework() + { + super("firework"); + } + + @Override + protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + { + final ItemStack stack = user.getItemInHand(); + if (stack.getType() == Material.FIREWORK) + { + if (args.length > 0) + { + if (args[0].equalsIgnoreCase("clear")) + { + FireworkMeta fmeta = (FireworkMeta)stack.getItemMeta(); + fmeta.clearEffects(); + stack.setItemMeta(fmeta); + user.sendMessage(_("fireworkEffectsCleared")); + } + else if (args.length > 1 && (args[0].equalsIgnoreCase("power") || (args[0].equalsIgnoreCase("p")))) + { + FireworkMeta fmeta = (FireworkMeta)stack.getItemMeta(); + try + { + int power = Integer.parseInt(args[1]); + fmeta.setPower(power > 3 ? 4 : power); + } + catch (NumberFormatException e) + { + throw new Exception(_("invalidFireworkFormat", args[1], args[0])); + } + stack.setItemMeta(fmeta); + } + else if ((args[0].equalsIgnoreCase("fire") || (args[0].equalsIgnoreCase("f"))) + && user.isAuthorized("essentials.firework.fire")) + { + int amount = 1; + boolean direction = false; + if (args.length > 1) + { + if (Util.isInt(args[1])) + { + final int serverLimit = ess.getSettings().getSpawnMobLimit(); + amount = Integer.parseInt(args[1]); + if (amount > serverLimit) + { + amount = serverLimit; + user.sendMessage(_("mobSpawnLimit")); + } + } + else + { + direction = true; + } + } + for (int i = 0; i < amount; i++) + { + Firework firework = (Firework)user.getWorld().spawnEntity(user.getLocation(), EntityType.FIREWORK); + FireworkMeta fmeta = (FireworkMeta)stack.getItemMeta(); + if (direction) + { + final Vector vector = user.getEyeLocation().getDirection().multiply(0.070); + if (fmeta.getPower() > 1) + { + fmeta.setPower(1); + } + firework.setVelocity(vector); + } + firework.setFireworkMeta(fmeta); + } + } + else + { + final MetaItemStack mStack = new MetaItemStack(stack); + for (String arg : args) + { + try + { + mStack.addFireworkMeta(user, true, arg, ess); + } + catch (Exception e) + { + user.sendMessage(_("fireworkSyntax")); + throw e; + } + } + + if (mStack.isValidFirework()) + { + FireworkMeta fmeta = (FireworkMeta)mStack.getItemStack().getItemMeta(); + FireworkEffect effect = mStack.getFireworkBuilder().build(); + if (fmeta.getEffects().size() > 0 && !user.isAuthorized("essentials.firework.multiple")) + { + throw new Exception(_("multipleCharges")); + } + fmeta.addEffect(effect); + stack.setItemMeta(fmeta); + } + else + { + user.sendMessage(_("fireworkSyntax")); + throw new Exception(_("fireworkColor")); + } + } + } + else + { + throw new NotEnoughArgumentsException(); + } + } + else + { + throw new Exception(_("holdFirework")); + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandfly.java b/Essentials/src/com/earth2me/essentials/commands/Commandfly.java index 86347d3e97..1d5353fb1c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandfly.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandfly.java @@ -2,6 +2,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -28,29 +29,51 @@ protected void run(final Server server, final CommandSender sender, final String @Override protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (args.length > 0 && args[0].trim().length() > 2 && user.isAuthorized("essentials.fly.others")) + if (args.length == 1) + { + if (args[0].equalsIgnoreCase("on") || args[0].startsWith("ena") || args[0].equalsIgnoreCase("1")) + { + user.setAllowFlight(true); + } + else if (args[0].equalsIgnoreCase("off") || args[0].startsWith("dis") || args[0].equalsIgnoreCase("0")) + { + user.setAllowFlight(false); + } + else if (user.isAuthorized("essentials.fly.others")) + { + flyOtherPlayers(server, user, args); + return; + } + } + else if (args.length == 2 && user.isAuthorized("essentials.fly.others")) { flyOtherPlayers(server, user, args); return; } - user.setAllowFlight(!user.getAllowFlight()); - if (!user.getAllowFlight()) + else { - user.setFlying(false); + user.setAllowFlight(!user.getAllowFlight()); + if (!user.getAllowFlight()) + { + user.setFlying(false); + } } user.sendMessage(_("flyMode", _(user.getAllowFlight() ? "enabled" : "disabled"), user.getDisplayName())); } - private void flyOtherPlayers(final Server server, final CommandSender sender, final String[] args) + private void flyOtherPlayers(final Server server, final CommandSender sender, final String[] args) throws NotEnoughArgumentsException { - for (Player matchPlayer : server.matchPlayer(args[0])) + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); + boolean foundUser = false; + final List matchedPlayers = server.matchPlayer(args[0]); + for (Player matchPlayer : matchedPlayers) { final User player = ess.getUser(matchPlayer); - if (player.isHidden()) + if (skipHidden && player.isHidden()) { continue; } - + foundUser = true; if (args.length > 1) { if (args[1].contains("on") || args[1].contains("ena") || args[1].equalsIgnoreCase("1")) @@ -73,5 +96,9 @@ private void flyOtherPlayers(final Server server, final CommandSender sender, fi } sender.sendMessage(_("flyMode", _(player.getAllowFlight() ? "enabled" : "disabled"), player.getDisplayName())); } + if (!foundUser) + { + throw new NotEnoughArgumentsException(_("playerNotFound")); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgamemode.java b/Essentials/src/com/earth2me/essentials/commands/Commandgamemode.java index 5fdc69d68e..9707c8403c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgamemode.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgamemode.java @@ -2,6 +2,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import java.util.List; import java.util.Locale; import org.bukkit.GameMode; import org.bukkit.Server; @@ -19,53 +20,118 @@ public Commandgamemode() @Override protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - if (args.length < 1) + GameMode gameMode; + if (args.length == 0) { throw new NotEnoughArgumentsException(); } + else if (args.length == 1) + { + gameMode = matchGameMode(commandLabel); + gamemodeOtherPlayers(server, sender, gameMode, args[0]); + } + else if (args.length == 2) + { + gameMode = matchGameMode(args[0].toLowerCase(Locale.ENGLISH)); + gamemodeOtherPlayers(server, sender, gameMode, args[1]); + } - gamemodeOtherPlayers(server, sender, args); } @Override protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (args.length > 0 && args[0].trim().length() > 2 && user.isAuthorized("essentials.gamemode.others")) + GameMode gameMode; + if (args.length == 0) + { + gameMode = matchGameMode(commandLabel); + } + 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; } - - user.setGameMode(user.getGameMode() == GameMode.SURVIVAL ? GameMode.CREATIVE : GameMode.SURVIVAL); - user.sendMessage(_("gameMode", _(user.getGameMode().toString().toLowerCase(Locale.ENGLISH)), user.getDisplayName())); - } - - private void gamemodeOtherPlayers(final Server server, final CommandSender sender, final String[] args) - { - for (Player matchPlayer : server.matchPlayer(args[0])) + else { - final User player = ess.getUser(matchPlayer); - if (player.isHidden()) + try { - continue; + gameMode = matchGameMode(args[0].toLowerCase(Locale.ENGLISH)); } - - if (args.length > 1) + catch (NotEnoughArgumentsException e) { - if (args[1].contains("creat") || args[1].equalsIgnoreCase("1")) - { - player.setGameMode(GameMode.CREATIVE); - } - else + if (user.isAuthorized("essentials.gamemode.others")) { - player.setGameMode(GameMode.SURVIVAL); + gameMode = matchGameMode(commandLabel); + gamemodeOtherPlayers(server, user, gameMode, args[0]); + return; } + throw new NotEnoughArgumentsException(); } - else + } + if (gameMode == null) + { + gameMode = user.getGameMode() == GameMode.SURVIVAL ? GameMode.CREATIVE : user.getGameMode() == GameMode.CREATIVE ? GameMode.ADVENTURE : GameMode.SURVIVAL; + } + user.setGameMode(gameMode); + user.sendMessage(_("gameMode", _(user.getGameMode().toString().toLowerCase(Locale.ENGLISH)), user.getDisplayName())); + } + + private void gamemodeOtherPlayers(final Server server, final CommandSender sender, final GameMode gameMode, final String name) throws NotEnoughArgumentsException + { + //TODO: TL this + if (name.trim().length() < 2 || gameMode == null) + { + throw new NotEnoughArgumentsException("You need to specify a valid player/mode."); + } + + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); + boolean foundUser = false; + final List matchedPlayers = server.matchPlayer(name); + for (Player matchPlayer : matchedPlayers) + { + final User player = ess.getUser(matchPlayer); + if (skipHidden && player.isHidden()) { - player.setGameMode(player.getGameMode() == GameMode.SURVIVAL ? GameMode.CREATIVE : GameMode.SURVIVAL); + continue; } + foundUser = true; + player.setGameMode(gameMode); sender.sendMessage(_("gameMode", _(player.getGameMode().toString().toLowerCase(Locale.ENGLISH)), player.getDisplayName())); } + if (!foundUser) + { + throw new NotEnoughArgumentsException(_("playerNotFound")); + } + } + + private GameMode matchGameMode(String modeString) throws NotEnoughArgumentsException + { + GameMode mode = null; + if (modeString.equalsIgnoreCase("gmc") || modeString.equalsIgnoreCase("egmc") + || modeString.contains("creat") || modeString.equalsIgnoreCase("1") || modeString.equalsIgnoreCase("c")) + { + mode = GameMode.CREATIVE; + } + else if (modeString.equalsIgnoreCase("gms") || modeString.equalsIgnoreCase("egms") + || modeString.contains("survi") || modeString.equalsIgnoreCase("0") || modeString.equalsIgnoreCase("s")) + { + mode = GameMode.SURVIVAL; + } + else if (modeString.equalsIgnoreCase("gma") || modeString.equalsIgnoreCase("egma") + || modeString.contains("advent") || modeString.equalsIgnoreCase("2") || modeString.equalsIgnoreCase("a")) + { + mode = GameMode.ADVENTURE; + } + else if (modeString.equalsIgnoreCase("gmt") || modeString.equalsIgnoreCase("egmt") + || modeString.contains("toggle") || modeString.contains("cycle") || modeString.equalsIgnoreCase("t")) + { + mode = null; + } + else + { + throw new NotEnoughArgumentsException(); + } + return mode; } -} +} \ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgc.java b/Essentials/src/com/earth2me/essentials/commands/Commandgc.java index d9b08b50f0..71851f8833 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgc.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgc.java @@ -1,6 +1,9 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.Util; +import java.lang.management.ManagementFactory; +import java.util.List; import org.bukkit.ChatColor; import org.bukkit.Server; import org.bukkit.World; @@ -17,13 +20,13 @@ public Commandgc() @Override protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - float tps = ess.getTimer().getAverageTPS(); + double tps = ess.getTimer().getAverageTPS(); ChatColor color; - if (tps >= 18) + if (tps >= 18.0) { color = ChatColor.GREEN; } - else if (tps >= 15) + else if (tps >= 15.0) { color = ChatColor.YELLOW; } @@ -31,17 +34,28 @@ else if (tps >= 15) { color = ChatColor.RED; } + + sender.sendMessage(_("uptime", Util.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime()))); sender.sendMessage(_("tps", "" + color + tps)); sender.sendMessage(_("gcmax", (Runtime.getRuntime().maxMemory() / 1024 / 1024))); sender.sendMessage(_("gctotal", (Runtime.getRuntime().totalMemory() / 1024 / 1024))); sender.sendMessage(_("gcfree", (Runtime.getRuntime().freeMemory() / 1024 / 1024))); - for (World w : server.getWorlds()) + List worlds = server.getWorlds(); + for (World w : worlds) { - sender.sendMessage( - (w.getEnvironment() == World.Environment.NETHER ? "Nether" : "World") + " \"" + w.getName() + "\": " - + w.getLoadedChunks().length + _("gcchunks") - + w.getEntities().size() + _("gcentities")); + String worldType = "World"; + switch (w.getEnvironment()) + { + case NETHER: + worldType = "Nether"; + break; + case THE_END: + worldType = "The End"; + break; + } + + sender.sendMessage(_("gcWorld", worldType, w.getName(), w.getLoadedChunks().length, w.getEntities().size())); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java b/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java index c985ef7257..6e6dfcee77 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java @@ -1,5 +1,6 @@ package com.earth2me.essentials.commands; +import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; import org.bukkit.Location; import org.bukkit.Server; @@ -18,7 +19,7 @@ public void run(final Server server, final User user, final String commandLabel, { if (args.length > 0 && user.isAuthorized("essentials.getpos.others")) { - final User otherUser = getPlayer(server, args, 0); + final User otherUser = getPlayer(server, args, 0, true, false); if (!otherUser.isHidden() || user.isAuthorized("essentials.list.hidden")) { outputPosition(user, otherUser.getLocation(), user.getLocation()); @@ -36,22 +37,21 @@ protected void run(final Server server, final CommandSender sender, final String { throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0); + final User user = getPlayer(server, args, 0, true, false); outputPosition(sender, user.getLocation(), null); } - //TODO: Translate private void outputPosition(final CommandSender sender, final Location coords, final Location distance) { - sender.sendMessage("§7World: " + coords.getWorld().getName()); - sender.sendMessage("§7X: " + coords.getBlockX() + " (+East <-> -West)"); - sender.sendMessage("§7Y: " + coords.getBlockY() + " (+Up <-> -Down)"); - sender.sendMessage("§7Z: " + coords.getBlockZ() + " (+South <-> -North)"); - sender.sendMessage("§7Yaw: " + (coords.getYaw() + 180 + 360) % 360 + " (Rotation)"); - sender.sendMessage("§7Pitch: " + coords.getPitch() + " (Head angle)"); + sender.sendMessage(_("currentWorld", coords.getWorld().getName())); + sender.sendMessage(_("posX", coords.getBlockX())); + sender.sendMessage(_("posY", coords.getBlockY())); + sender.sendMessage(_("posZ", coords.getBlockZ())); + sender.sendMessage(_("posYaw", (coords.getYaw() + 180 + 360) % 360)); + sender.sendMessage(_("posPitch", coords.getPitch())); if (distance != null && coords.getWorld().equals(distance.getWorld())) { - sender.sendMessage("§7Distance: " + coords.distance(distance)); + sender.sendMessage(_("distance", coords.distance(distance))); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgive.java b/Essentials/src/com/earth2me/essentials/commands/Commandgive.java index 21903e98b6..d7c6feaa9b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgive.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgive.java @@ -1,15 +1,14 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.craftbukkit.InventoryWorkaround; +import com.earth2me.essentials.MetaItemStack; import com.earth2me.essentials.User; import com.earth2me.essentials.Util; +import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import java.util.Locale; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.command.CommandSender; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -29,14 +28,14 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - final ItemStack stack = ess.getItemDb().get(args[1]); + ItemStack stack = ess.getItemDb().get(args[1]); final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); if (sender instanceof Player && (ess.getSettings().permissionBasedItemSpawn() - ? (!ess.getUser(sender).isAuthorized("essentials.give.item-all") - && !ess.getUser(sender).isAuthorized("essentials.give.item-" + itemname) - && !ess.getUser(sender).isAuthorized("essentials.give.item-" + stack.getTypeId())) + ? (!ess.getUser(sender).isAuthorized("essentials.itemspawn.item-all") + && !ess.getUser(sender).isAuthorized("essentials.itemspawn.item-" + itemname) + && !ess.getUser(sender).isAuthorized("essentials.itemspawn.item-" + stack.getTypeId())) : (!ess.getUser(sender).isAuthorized("essentials.itemspawn.exempt") && !ess.getUser(sender).canSpawnItem(stack.getTypeId())))) { @@ -45,45 +44,43 @@ public void run(final Server server, final CommandSender sender, final String co final User giveTo = getPlayer(server, args, 0); - if (args.length > 3 && Util.isInt(args[2]) && Util.isInt(args[3])) - { - stack.setAmount(Integer.parseInt(args[2])); - stack.setDurability(Short.parseShort(args[3])); - } - else if (args.length > 2 && Integer.parseInt(args[2]) > 0) + try { - stack.setAmount(Integer.parseInt(args[2])); - } - else if (ess.getSettings().getDefaultStackSize() > 0) - { - stack.setAmount(ess.getSettings().getDefaultStackSize()); + if (args.length > 3 && Util.isInt(args[2]) && Util.isInt(args[3])) + { + stack.setAmount(Integer.parseInt(args[2])); + stack.setDurability(Short.parseShort(args[3])); + } + else if (args.length > 2 && Integer.parseInt(args[2]) > 0) + { + stack.setAmount(Integer.parseInt(args[2])); + } + else if (ess.getSettings().getDefaultStackSize() > 0) + { + stack.setAmount(ess.getSettings().getDefaultStackSize()); + } + else if (ess.getSettings().getOversizedStackSize() > 0 && giveTo.isAuthorized("essentials.oversizedstacks")) + { + stack.setAmount(ess.getSettings().getOversizedStackSize()); + } } - else if (ess.getSettings().getOversizedStackSize() > 0 && giveTo.isAuthorized("essentials.oversizedstacks")) + catch (NumberFormatException e) { - stack.setAmount(ess.getSettings().getOversizedStackSize()); + throw new NotEnoughArgumentsException(); } if (args.length > 3) { - for (int i = Util.isInt(args[3]) ? 4 : 3; i < args.length; i++) + MetaItemStack metaStack = new MetaItemStack(stack); + boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments(); + if (allowUnsafe && sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.enchantments.allowunsafe")) { - final String[] split = args[i].split("[:+',;.]", 2); - if (split.length < 1) - { - continue; - } - final Enchantment enchantment = Commandenchant.getEnchantment(split[0], sender instanceof Player ? ess.getUser(sender) : null); - int level; - if (split.length > 1) - { - level = Integer.parseInt(split[1]); - } - else - { - level = enchantment.getMaxLevel(); - } - stack.addEnchantment(enchantment, level); + allowUnsafe = false; } + + metaStack.parseStringMeta(sender, allowUnsafe, args, Util.isInt(args[3]) ? 4 : 3, ess); + + stack = metaStack.getItemStack(); } if (stack.getType() == Material.AIR) @@ -91,16 +88,15 @@ else if (ess.getSettings().getOversizedStackSize() > 0 && giveTo.isAuthorized("e throw new Exception(_("cantSpawnItem", "Air")); } - //TODO: TL this. final String itemName = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace('_', ' '); - sender.sendMessage(ChatColor.BLUE + "Giving " + stack.getAmount() + " of " + itemName + " to " + giveTo.getDisplayName() + "."); + sender.sendMessage(_("giveSpawn", stack.getAmount(), itemName, giveTo.getDisplayName())); if (giveTo.isAuthorized("essentials.oversizedstacks")) { - InventoryWorkaround.addItem(giveTo.getInventory(), true, ess.getSettings().getOversizedStackSize(), stack); + InventoryWorkaround.addOversizedItems(giveTo.getInventory(), ess.getSettings().getOversizedStackSize(), stack); } else { - InventoryWorkaround.addItem(giveTo.getInventory(), true, stack); + InventoryWorkaround.addItems(giveTo.getInventory(), stack); } giveTo.updateInventory(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgod.java b/Essentials/src/com/earth2me/essentials/commands/Commandgod.java index 5ca2aad9ac..a77648c864 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgod.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgod.java @@ -2,6 +2,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -33,44 +34,57 @@ protected void run(final Server server, final User user, final String commandLab godOtherPlayers(server, user, args); return; } - user.setGodModeEnabled(!user.isGodModeEnabled()); + godPlayer(user, !user.isGodModeEnabled()); user.sendMessage(_("godMode", (user.isGodModeEnabled() ? _("enabled") : _("disabled")))); } - private void godOtherPlayers(final Server server, final CommandSender sender, final String[] args) + private void godPlayer(User player, boolean enabled) { - for (Player matchPlayer : server.matchPlayer(args[0])) + player.setGodModeEnabled(enabled); + if (enabled && player.getHealth() != 0) + { + player.setHealth(player.getMaxHealth()); + player.setFoodLevel(20); + } + } + + private void godOtherPlayers(final Server server, final CommandSender sender, final String[] args) throws NotEnoughArgumentsException + { + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); + boolean foundUser = false; + final List matchedPlayers = server.matchPlayer(args[0]); + for (Player matchPlayer : matchedPlayers) { final User player = ess.getUser(matchPlayer); - if (player.isHidden()) + if (skipHidden && player.isHidden()) { continue; } - + foundUser = true; + boolean enabled; if (args.length > 1) { if (args[1].contains("on") || args[1].contains("ena") || args[1].equalsIgnoreCase("1")) { - player.setGodModeEnabled(true); + enabled = true; } else { - player.setGodModeEnabled(false); + enabled = false; } } else { - player.setGodModeEnabled(!player.isGodModeEnabled()); - } - - final boolean enabled = player.isGodModeEnabled(); - if (enabled) - { - player.setFoodLevel(20); + enabled = !player.isGodModeEnabled(); } + godPlayer(player, enabled); player.sendMessage(_("godMode", (enabled ? _("enabled") : _("disabled")))); sender.sendMessage(_("godMode", _(enabled ? "godEnabledFor" : "godDisabledFor", matchPlayer.getDisplayName()))); } + if (!foundUser) + { + throw new NotEnoughArgumentsException(_("playerNotFound")); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhat.java b/Essentials/src/com/earth2me/essentials/commands/Commandhat.java index 5dd0fbb747..0b28ef1e3f 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhat.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhat.java @@ -31,7 +31,7 @@ protected void run(final Server server, final User user, final String commandLab { final ItemStack air = new ItemStack(Material.AIR); inv.setHelmet(air); - InventoryWorkaround.addItem(user.getInventory(), true, head); + InventoryWorkaround.addItems(user.getInventory(), head); user.sendMessage(_("hatRemoved")); } } @@ -44,7 +44,6 @@ protected void run(final Server server, final User user, final String commandLab { final PlayerInventory inv = user.getInventory(); final ItemStack head = inv.getHelmet(); - inv.removeItem(hand); inv.setHelmet(hand); inv.setItemInHand(head); user.sendMessage(_("hatPlaced")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandheal.java b/Essentials/src/com/earth2me/essentials/commands/Commandheal.java index 82678c96e7..e1495bdc6b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandheal.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandheal.java @@ -6,6 +6,7 @@ import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; public class Commandheal extends EssentialsCommand @@ -33,9 +34,7 @@ public void run(final Server server, final User user, final String commandLabel, { user.healCooldown(); } - user.setHealth(20); - user.setFoodLevel(20); - user.sendMessage(_("heal")); + healPlayer(user); } @Override @@ -49,24 +48,41 @@ public void run(final Server server, final CommandSender sender, final String co healOtherPlayers(server, sender, args[0]); } - private void healOtherPlayers(final Server server, final CommandSender sender, final String name) + private void healOtherPlayers(final Server server, final CommandSender sender, final String name) throws Exception { - final List players = server.matchPlayer(name); - if (players.isEmpty()) + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); + boolean foundUser = false; + final List matchedPlayers = server.matchPlayer(name); + for (Player matchPlayer : matchedPlayers) { - sender.sendMessage(_("playerNotFound")); - return; - } - for (Player p : players) - { - if (ess.getUser(p).isHidden()) + final User player = ess.getUser(matchPlayer); + if (skipHidden && player.isHidden()) { continue; } - p.setHealth(20); - p.setFoodLevel(20); - p.sendMessage(_("heal")); - sender.sendMessage(_("healOther", p.getDisplayName())); + foundUser = true; + healPlayer(matchPlayer); + sender.sendMessage(_("healOther", matchPlayer.getDisplayName())); + } + if (!foundUser) + { + throw new NotEnoughArgumentsException(_("playerNotFound")); + } + } + + private void healPlayer(final Player player) throws Exception + { + if (player.getHealth() == 0) + { + throw new Exception(_("healDead")); + } + player.setHealth(player.getMaxHealth()); + player.setFoodLevel(20); + player.setFireTicks(0); + player.sendMessage(_("heal")); + for (PotionEffect effect : player.getActivePotionEffects()) + { + player.removePotionEffect(effect.getType()); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java index 2c91a06c9d..a13616dc08 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.Locale; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -23,7 +22,6 @@ public Commandhome() public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { final Trade charge = new Trade(this.getName(), ess); - charge.isAffordableFor(user); User player = user; String homeName = ""; String[] nameParts; @@ -36,7 +34,7 @@ public void run(final Server server, final User user, final String commandLabel, } else { - player = getPlayer(server, nameParts, 0, true); + player = getPlayer(server, nameParts, 0, true, true); if (nameParts.length > 1) { homeName = nameParts[1]; @@ -45,38 +43,32 @@ public void run(final Server server, final User user, final String commandLabel, } try { - if ("bed".equalsIgnoreCase(homeName)) + if ("bed".equalsIgnoreCase(homeName) && user.isAuthorized("essentials.home.bed")) { final Location bed = player.getBedSpawnLocation(); - if (bed != null && bed.getBlock().getType() == Material.BED_BLOCK) + if (bed != null) { user.getTeleport().teleport(bed, charge, TeleportCause.COMMAND); throw new NoChargeException(); } + else + { + throw new Exception(_("bedMissing")); + } } goHome(user, player, homeName.toLowerCase(Locale.ENGLISH), charge); } catch (NotEnoughArgumentsException e) { Location bed = player.getBedSpawnLocation(); - if (bed != null && bed.getBlock().getType() != Material.BED_BLOCK) - { - bed = null; - } final List homes = player.getHomes(); if (homes.isEmpty() && player.equals(user)) { - if (bed != null) - { - user.getTeleport().teleport(bed, charge, TeleportCause.COMMAND); - throw new NoChargeException(); - } user.getTeleport().respawn(charge, TeleportCause.COMMAND); - } else if (homes.isEmpty()) { - throw new Exception(player == user ? _("noHomeSet") : _("noHomeSetPlayer")); + throw new Exception(_("noHomeSetPlayer")); } else if (homes.size() == 1 && player.equals(user)) { @@ -84,9 +76,16 @@ else if (homes.size() == 1 && player.equals(user)) } else { - if (bed != null) + if (user.isAuthorized("essentials.home.bed")) { - homes.add("bed"); + if (bed != null) + { + homes.add(_("bed")); + } + else + { + homes.add(_("bedNull")); + } } user.sendMessage(_("homes", Util.joinList(homes))); } @@ -102,9 +101,9 @@ private void goHome(final User user, final User player, final String home, final throw new NotEnoughArgumentsException(); } if (user.getWorld() != loc.getWorld() && ess.getSettings().isWorldHomePermissions() - && !user.isAuthorized("essentials.world." + loc.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + loc.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + loc.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + loc.getWorld().getName())); } user.getTeleport().home(loc, charge); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandignore.java b/Essentials/src/com/earth2me/essentials/commands/Commandignore.java index 8f160e9bae..090903c969 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandignore.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandignore.java @@ -22,7 +22,7 @@ protected void run(final Server server, final User user, final String commandLab User player; try { - player = getPlayer(server, args, 0); + player = getPlayer(server, args, 0, true, true); } catch (NoSuchFieldException ex) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java index a4a659e97c..1528dc3539 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java @@ -1,10 +1,8 @@ package com.earth2me.essentials.commands; -import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; -import java.util.Arrays; import org.bukkit.Server; -import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Inventory; public class Commandinvsee extends EssentialsCommand @@ -13,6 +11,8 @@ public Commandinvsee() { super("invsee"); } + + //This method has a hidden param, which if given will display the equip slots. #easteregg @Override protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception @@ -21,8 +21,20 @@ protected void run(final Server server, final User user, final String commandLab { throw new NotEnoughArgumentsException(); } - final User invUser = getPlayer(server, args, 0); + + final User invUser = getPlayer(server, user, args, 0); + Inventory inv; + + if (args.length > 1 && user.isAuthorized("essentials.invsee.equip")) + { + inv = server.createInventory(invUser, 9, "Equipped"); + inv.setContents(invUser.getInventory().getArmorContents()); + } + else + { + inv = invUser.getInventory(); + } + user.openInventory(inv); user.setInvSee(true); - user.openInventory(invUser.getInventory()); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanditem.java b/Essentials/src/com/earth2me/essentials/commands/Commanditem.java index 0e35dda719..09a56ebd93 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanditem.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanditem.java @@ -1,12 +1,12 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.MetaItemStack; import com.earth2me.essentials.User; +import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import java.util.Locale; import org.bukkit.Material; import org.bukkit.Server; -import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; @@ -24,7 +24,7 @@ public void run(final Server server, final User user, final String commandLabel, { throw new NotEnoughArgumentsException(); } - final ItemStack stack = ess.getItemDb().get(args[0]); + ItemStack stack = ess.getItemDb().get(args[0]); final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); if (ess.getSettings().permissionBasedItemSpawn() @@ -50,33 +50,21 @@ else if (ess.getSettings().getOversizedStackSize() > 0 && user.isAuthorized("ess { stack.setAmount(ess.getSettings().getOversizedStackSize()); } - if (args.length > 2) - { - for (int i = 2; i < args.length; i++) - { - final String[] split = args[i].split("[:+',;.]", 2); - if (split.length < 1) - { - continue; - } - final Enchantment enchantment = Commandenchant.getEnchantment(split[0], user); - int level; - if (split.length > 1) - { - level = Integer.parseInt(split[1]); - } - else - { - level = enchantment.getMaxLevel(); - } - stack.addEnchantment(enchantment, level); - } - } } catch (NumberFormatException e) { throw new NotEnoughArgumentsException(); } + if (args.length > 2) + { + MetaItemStack metaStack = new MetaItemStack(stack); + final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments() && user.isAuthorized("essentials.enchantments.allowunsafe"); + + metaStack.parseStringMeta(user, allowUnsafe, args, 2, ess); + + stack = metaStack.getItemStack(); + } + if (stack.getType() == Material.AIR) { @@ -87,11 +75,11 @@ else if (ess.getSettings().getOversizedStackSize() > 0 && user.isAuthorized("ess user.sendMessage(_("itemSpawn", stack.getAmount(), displayName)); if (user.isAuthorized("essentials.oversizedstacks")) { - InventoryWorkaround.addItem(user.getInventory(), true, ess.getSettings().getOversizedStackSize(), stack); + InventoryWorkaround.addOversizedItems(user.getInventory(), ess.getSettings().getOversizedStackSize(), stack); } else { - InventoryWorkaround.addItem(user.getInventory(), true, stack); + InventoryWorkaround.addItems(user.getInventory(), stack); } user.updateInventory(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java b/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java index 8a408924db..11d633286d 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java @@ -19,10 +19,12 @@ public Commanditemdb() protected void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception { ItemStack itemStack = null; + boolean itemHeld = false; if (args.length < 1) { if (sender instanceof Player) { + itemHeld = true; itemStack = ((Player)sender).getItemInHand(); } if (itemStack == null) @@ -34,9 +36,9 @@ protected void run(Server server, CommandSender sender, String commandLabel, Str { itemStack = ess.getItemDb().get(args[0]); } - sender.sendMessage(itemStack.getType().toString() + "- " + itemStack.getTypeId() + ":" + Integer.toString(itemStack.getData().getData())); - - if (itemStack.getType() != Material.AIR) + sender.sendMessage(_("itemType", itemStack.getType().toString(), itemStack.getTypeId() + ":" + Integer.toString(itemStack.getDurability()))); + + if (itemHeld && itemStack.getType() != Material.AIR) { int maxuses = itemStack.getType().getMaxDurability(); int durability = ((maxuses + 1) - itemStack.getDurability()); @@ -44,6 +46,11 @@ protected void run(Server server, CommandSender sender, String commandLabel, Str { sender.sendMessage(_("durability", Integer.toString(durability))); } - } + } + final String itemNameList = ess.getItemDb().names(itemStack); + if (itemNameList != null) + { + sender.sendMessage(_("itemNames", ess.getItemDb().names(itemStack))); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandjump.java b/Essentials/src/com/earth2me/essentials/commands/Commandjump.java index ab73c6e012..073c20dce0 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandjump.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandjump.java @@ -8,7 +8,7 @@ import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; - +// This method contains an undocumented sub command #EasterEgg public class Commandjump extends EssentialsCommand { public Commandjump() @@ -19,6 +19,21 @@ public Commandjump() @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { + if (args.length > 0 && args[0].contains("lock") && user.isAuthorized("essentials.jump.lock")) + { + if (user.isFlyClickJump()) + { + user.setRightClickJump(false); + user.sendMessage("Flying wizard mode disabled"); + } + else + { + user.setRightClickJump(true); + user.sendMessage("Enabling flying wizard mode"); + } + return; + } + Location loc; final Location cloc = user.getLocation(); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkick.java b/Essentials/src/com/earth2me/essentials/commands/Commandkick.java index 3e2e08b508..18884964b2 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkick.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkick.java @@ -3,6 +3,8 @@ import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; +import java.util.logging.Level; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -23,21 +25,35 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0); - if (sender instanceof Player && user.isAuthorized("essentials.kick.exempt")) + final User target = getPlayer(server, args, 0, true, false); + if (sender instanceof Player) { - throw new Exception(_("kickExempt")); + User user = ess.getUser(sender); + if (target.isHidden() && !user.isAuthorized("essentials.vanish.interact")) + { + throw new PlayerNotFoundException(); + } + + if (target.isAuthorized("essentials.kick.exempt")) + { + throw new Exception(_("kickExempt")); + } } - final String kickReason = args.length > 1 ? getFinalArg(args, 1) : _("kickDefault"); - user.kickPlayer(kickReason); + + String kickReason = args.length > 1 ? getFinalArg(args, 1) : _("kickDefault"); + kickReason = Util.replaceFormat(kickReason.replace("\\n", "\n").replace("|", "\n")); + + target.kickPlayer(kickReason); final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; + server.getLogger().log(Level.INFO, _("playerKicked", senderName, target.getName(), kickReason)); + for (Player onlinePlayer : server.getOnlinePlayers()) { User player = ess.getUser(onlinePlayer); if (player.isAuthorized("essentials.kick.notify")) { - onlinePlayer.sendMessage(_("playerKicked", senderName, user.getName(), kickReason)); + onlinePlayer.sendMessage(_("playerKicked", senderName, target.getName(), kickReason)); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkickall.java b/Essentials/src/com/earth2me/essentials/commands/Commandkickall.java index 4722b7d68e..6944823f31 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkickall.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkickall.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.Util; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -16,6 +17,9 @@ public Commandkickall() @Override public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { + String kickReason = args.length > 0 ? getFinalArg(args, 0) : _("kickDefault"); + kickReason = Util.replaceFormat(kickReason.replace("\\n", "\n").replace("|", "\n")); + for (Player onlinePlayer : server.getOnlinePlayers()) { if (sender instanceof Player && onlinePlayer.getName().equalsIgnoreCase(((Player)sender).getName())) @@ -24,7 +28,7 @@ public void run(final Server server, final CommandSender sender, final String co } else { - onlinePlayer.kickPlayer(args.length > 0 ? getFinalArg(args, 0) : _("kickDefault")); + onlinePlayer.kickPlayer(kickReason); } } sender.sendMessage(_("kickedAll")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkill.java b/Essentials/src/com/earth2me/essentials/commands/Commandkill.java index 77994f156f..88086900aa 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkill.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkill.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; +import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -22,16 +23,32 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - for (Player matchPlayer : server.matchPlayer(args[0])) + //TODO: TL this + if (args[0].trim().length() < 2) { + throw new NotEnoughArgumentsException("You need to specify a player to kill."); + } + + final List matchedPlayers = server.matchPlayer(args[0]); + for (Player matchPlayer : matchedPlayers) + { + if (ess.getUser(matchPlayer).isAuthorized("essentials.kill.exempt") && !ess.getUser(sender).isAuthorized("essentials.kill.force")) + { + throw new Exception(_("killExempt", matchPlayer.getDisplayName())); + } final EntityDamageEvent ede = new EntityDamageEvent(matchPlayer, sender instanceof Player && ((Player)sender).getName().equals(matchPlayer.getName()) ? EntityDamageEvent.DamageCause.SUICIDE : EntityDamageEvent.DamageCause.CUSTOM, Short.MAX_VALUE); server.getPluginManager().callEvent(ede); - if (ede.isCancelled() && !sender.hasPermission("essentials.kill.force")) + if (ede.isCancelled() && sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.kill.force")) { continue; + } + matchPlayer.damage(Short.MAX_VALUE); + + if (matchPlayer.getHealth() > 0) + { + matchPlayer.setHealth(0); } - matchPlayer.damage(Short.MAX_VALUE); sender.sendMessage(_("kill", matchPlayer.getDisplayName())); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkillall.java b/Essentials/src/com/earth2me/essentials/commands/Commandkillall.java index d918eeffb9..854ed252cd 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkillall.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkillall.java @@ -1,28 +1,16 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.Mob; import static com.earth2me.essentials.I18n._; -import java.util.Collections; +import com.earth2me.essentials.Mob; +import java.util.ArrayList; import java.util.Locale; import org.bukkit.Chunk; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Animals; -import org.bukkit.entity.ComplexLivingEntity; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Flying; -import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Monster; -import org.bukkit.entity.NPC; -import org.bukkit.entity.Ocelot; -import org.bukkit.entity.Player; -import org.bukkit.entity.Slime; -import org.bukkit.entity.Snowman; -import org.bukkit.entity.WaterMob; -import org.bukkit.entity.Wolf; +import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.inventory.ItemStack; public class Commandkillall extends EssentialsCommand @@ -65,6 +53,10 @@ else if (args.length > 1) throw new Exception(_("numberRequired"), e); } } + if (args.length > 2) + { + world = ess.getWorld(args[2]); + } } else { @@ -122,7 +114,7 @@ else if (args.length == 1) continue; } } - if(entity instanceof Ocelot) + if (entity instanceof Ocelot) { if (((Ocelot)entity).isTamed()) { @@ -133,7 +125,7 @@ else if (args.length == 1) { if (entity instanceof Animals || entity instanceof NPC || entity instanceof Snowman || entity instanceof WaterMob) { - EntityDeathEvent event = new EntityDeathEvent((LivingEntity)entity, Collections.EMPTY_LIST); + EntityDeathEvent event = new EntityDeathEvent((LivingEntity)entity, new ArrayList(0)); ess.getServer().getPluginManager().callEvent(event); entity.remove(); numKills++; @@ -143,7 +135,7 @@ else if (monster) { if (entity instanceof Monster || entity instanceof ComplexLivingEntity || entity instanceof Flying || entity instanceof Slime) { - EntityDeathEvent event = new EntityDeathEvent((LivingEntity)entity, Collections.EMPTY_LIST); + EntityDeathEvent event = new EntityDeathEvent((LivingEntity)entity, new ArrayList(0)); ess.getServer().getPluginManager().callEvent(event); entity.remove(); numKills++; @@ -151,14 +143,14 @@ else if (monster) } else if (all) { - EntityDeathEvent event = new EntityDeathEvent((LivingEntity)entity, Collections.EMPTY_LIST); + EntityDeathEvent event = new EntityDeathEvent((LivingEntity)entity, new ArrayList(0)); ess.getServer().getPluginManager().callEvent(event); entity.remove(); numKills++; } else if (entityClass != null && entityClass.isAssignableFrom(entity.getClass())) { - EntityDeathEvent event = new EntityDeathEvent((LivingEntity)entity, Collections.EMPTY_LIST); + EntityDeathEvent event = new EntityDeathEvent((LivingEntity)entity, new ArrayList(0)); ess.getServer().getPluginManager().callEvent(event); entity.remove(); numKills++; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java index baa8ba0147..1c9bec8d39 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java @@ -1,8 +1,13 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.*; import static com.earth2me.essentials.I18n._; -import java.util.*; +import com.earth2me.essentials.Kit; +import com.earth2me.essentials.Trade; +import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; +import java.util.List; +import java.util.Locale; +import java.util.Map; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -25,13 +30,13 @@ public void run(final Server server, final User user, final String commandLabel, } 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 User userTo = getPlayer(server, user, args, 1); + 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); } } @@ -47,24 +52,30 @@ public void run(final Server server, final CommandSender sender, final String co } else { - final User userTo = getPlayer(server, args, 1, true); + final User userTo = getPlayer(server, args, 1, true, false); final String kitName = args[0].toLowerCase(Locale.ENGLISH); final Map kit = ess.getSettings().getKit(kitName); final List items = Kit.getItems(userTo, kit); Kit.expandItems(ess, userTo, items); - sender.sendMessage(_("kitGive", kitName)); + sender.sendMessage(_("kitGiveTo", kitName, userTo.getDisplayName())); + userTo.sendMessage(_("kitReceive", kitName)); } } private void giveKit(User userTo, User userFrom, String kitName) throws Exception - { + { + if (kitName.isEmpty()) + { + throw new Exception(_("kitError2")); + } + final Map kit = ess.getSettings().getKit(kitName); - if (!userFrom.isAuthorized("essentials.kit." + kitName)) + if (!userFrom.isAuthorized("essentials.kits." + kitName)) { - throw new Exception(_("noKitPermission", "essentials.kit." + kitName)); + throw new Exception(_("noKitPermission", "essentials.kits." + kitName)); } final List items = Kit.getItems(userTo, kit); @@ -77,6 +88,7 @@ private void giveKit(User userTo, User userFrom, String kitName) throws Exceptio Kit.expandItems(ess, userTo, items); charge.charge(userFrom); - userTo.sendMessage(_("kitGive", kitName)); + userFrom.sendMessage(_("kitGiveTo", kitName, userTo.getDisplayName())); + userTo.sendMessage(_("kitReceive", kitName)); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkittycannon.java b/Essentials/src/com/earth2me/essentials/commands/Commandkittycannon.java index 9db608235e..da22235701 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkittycannon.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkittycannon.java @@ -7,7 +7,7 @@ import org.bukkit.Server; import org.bukkit.entity.Ocelot; - +// This command is not documented on the wiki #EasterEgg public class Commandkittycannon extends EssentialsCommand { private static Random random = new Random(); @@ -29,6 +29,7 @@ protected void run(final Server server, final User user, final String commandLab final int i = random.nextInt(Ocelot.Type.values().length); ocelot.setCatType(Ocelot.Type.values()[i]); ocelot.setTamed(true); + ocelot.setBaby(); ocelot.setVelocity(user.getEyeLocation().getDirection().multiply(2)); ess.scheduleSyncDelayedTask(new Runnable() { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandlightning.java b/Essentials/src/com/earth2me/essentials/commands/Commandlightning.java index 5d72d0b55c..449c949304 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandlightning.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandlightning.java @@ -2,6 +2,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.LightningStrike; @@ -30,11 +31,6 @@ public void run(final Server server, final CommandSender sender, final String co } } - if (server.matchPlayer(args[0]).isEmpty()) - { - throw new Exception(_("playerNotFound")); - } - int power = 5; if (args.length > 1) { @@ -47,12 +43,13 @@ public void run(final Server server, final CommandSender sender, final String co } } - for (Player matchPlayer : server.matchPlayer(args[0])) + final List matchedPlayers = server.matchPlayer(args[0]); + for (Player matchPlayer : matchedPlayers) { sender.sendMessage(_("lightningUse", matchPlayer.getDisplayName())); final LightningStrike strike = matchPlayer.getWorld().strikeLightningEffect(matchPlayer.getLocation()); - + if (!ess.getUser(matchPlayer).isGodModeEnabled()) { matchPlayer.damage(power, strike); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandlist.java b/Essentials/src/com/earth2me/essentials/commands/Commandlist.java index c981f45c19..d4f75df14e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandlist.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandlist.java @@ -19,18 +19,28 @@ public Commandlist() @Override public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - boolean showhidden = false; + boolean showHidden = true; if (sender instanceof Player) { - if (ess.getUser(sender).isAuthorized("essentials.list.hidden")) - { - showhidden = true; - } + showHidden = ess.getUser(sender).isAuthorized("essentials.list.hidden"); + } + + sender.sendMessage(listSummary(server, showHidden)); + Map> playerList = getPlayerLists(server, showHidden); + + if (args.length > 0) + { + sender.sendMessage(listGroupUsers(playerList, args[0].toLowerCase())); } else { - showhidden = true; + sendGroupedList(sender, commandLabel, playerList); } + } + + // Produce a user summary: There are 5 out of maximum 10 players online. + private String listSummary(final Server server, final boolean showHidden) + { int playerHidden = 0; for (Player onlinePlayer : server.getOnlinePlayers()) { @@ -41,7 +51,7 @@ public void run(final Server server, final CommandSender sender, final String co } String online; - if (showhidden && playerHidden > 0) + if (showHidden && playerHidden > 0) { online = _("listAmountHidden", server.getOnlinePlayers().length - playerHidden, playerHidden, server.getMaxPlayers()); } @@ -49,101 +59,212 @@ public void run(final Server server, final CommandSender sender, final String co { online = _("listAmount", server.getOnlinePlayers().length - playerHidden, server.getMaxPlayers()); } - sender.sendMessage(online); + return online; + } - if (ess.getSettings().getSortListByGroups()) + // Build the basic player list, divided by groups. + private Map> getPlayerLists(final Server server, final boolean showHidden) + { + Map> playerList = new HashMap>(); + for (Player onlinePlayer : server.getOnlinePlayers()) { - Map> sort = new HashMap>(); - for (Player OnlinePlayer : server.getOnlinePlayers()) + final User onlineUser = ess.getUser(onlinePlayer); + if (onlineUser.isHidden() && !showHidden) { - final User player = ess.getUser(OnlinePlayer); - if (player.isHidden() && !showhidden) - { - continue; - } - final String group = player.getGroup(); - List list = sort.get(group); - if (list == null) - { - list = new ArrayList(); - sort.put(group, list); - } - list.add(player); + continue; + } + final String group = Util.stripFormat(onlineUser.getGroup().toLowerCase()); + List list = playerList.get(group); + if (list == null) + { + list = new ArrayList(); + playerList.put(group, list); } - final String[] groups = sort.keySet().toArray(new String[0]); - Arrays.sort(groups, String.CASE_INSENSITIVE_ORDER); - for (String group : groups) + list.add(onlineUser); + } + return playerList; + } + + // Output a playerlist of just a single group, /list + private String listGroupUsers(final Map> playerList, final String groupName) throws Exception + { + final List users = getMergedList(playerList, groupName); + + List groupUsers = playerList.get(groupName); + if (groupUsers != null && !groupUsers.isEmpty()) + { + users.addAll(groupUsers); + } + if (users == null || users.isEmpty()) + { + throw new Exception(_("groupDoesNotExist")); + } + + return outputFormat(groupName, listUsers(users)); + } + + // Handle the merging of groups + private List getMergedList(final Map> playerList, final String groupName) + { + Set configGroups = ess.getSettings().getListGroupConfig().keySet(); + final List users = new ArrayList(); + + for (String configGroup : configGroups) + { + if (configGroup.equalsIgnoreCase(groupName)) { - final StringBuilder groupString = new StringBuilder(); - groupString.append(_("listGroupTag", Util.replaceFormat(group))); - final List users = sort.get(group); - Collections.sort(users); - boolean first = true; - for (User user : users) + String[] groupValues = ess.getSettings().getListGroupConfig().get(configGroup).toString().trim().split(" "); + for (String groupValue : groupValues) { - if (!first) + if (groupValue == null || groupValue.equals("")) { - groupString.append(", "); + continue; } - else + List u = playerList.get(groupValue.trim()); + if (u == null || u.isEmpty()) { - first = false; + continue; } - if (user.isAfk()) + playerList.remove(groupValue); + users.addAll(u); + } + } + } + return users; + } + + // Output the standard /list output, when no group is specified + private void sendGroupedList(CommandSender sender, String commandLabel, Map> playerList) + { + Set configGroups = ess.getSettings().getListGroupConfig().keySet(); + List asterisk = new ArrayList(); + + // Loop through the custom defined groups and display them + for (String oConfigGroup : configGroups) + { + String groupValue = ess.getSettings().getListGroupConfig().get(oConfigGroup).toString().trim(); + String configGroup = oConfigGroup.toLowerCase(); + + // If the group value is an asterisk, then skip it, and handle it later + if (groupValue.equals("*")) + { + asterisk.add(oConfigGroup); + continue; + } + + // If the group value is hidden, we don't need to display it + if (groupValue.equalsIgnoreCase("hidden")) + { + playerList.remove(groupValue); + continue; + } + + List outputUserList = new ArrayList(); + List matchedList = playerList.get(configGroup); + + // If the group value is an int, then we might need to truncate it + if (Util.isInt(groupValue)) + { + if (matchedList != null && !matchedList.isEmpty()) + { + playerList.remove(configGroup); + outputUserList.addAll(matchedList); + int limit = Integer.parseInt(groupValue); + if (matchedList.size() > limit) { - groupString.append(_("listAfkTag")); + sender.sendMessage(outputFormat(oConfigGroup, _("groupNumber", matchedList.size(), commandLabel, Util.stripFormat(configGroup)))); } - if (user.isHidden()) + else { - groupString.append(_("listHiddenTag")); + sender.sendMessage(outputFormat(oConfigGroup, listUsers(outputUserList))); } - user.setDisplayNick(); - groupString.append(user.getDisplayName()); - groupString.append("§f"); + continue; } - sender.sendMessage(groupString.toString()); } + + outputUserList = getMergedList(playerList, configGroup); + + // If we have no users, than we don't need to continue parsing this group + if (outputUserList == null || outputUserList.isEmpty()) + { + continue; + } + + sender.sendMessage(outputFormat(oConfigGroup, listUsers(outputUserList))); } - else + + String[] onlineGroups = playerList.keySet().toArray(new String[0]); + Arrays.sort(onlineGroups, String.CASE_INSENSITIVE_ORDER); + + // If we have an asterisk group, then merge all remaining groups + if (!asterisk.isEmpty()) { - final List users = new ArrayList(); - for (Player OnlinePlayer : server.getOnlinePlayers()) + List asteriskUsers = new ArrayList(); + for (String onlineGroup : onlineGroups) { - final User player = ess.getUser(OnlinePlayer); - if (player.isHidden() && !showhidden) - { - continue; - } - users.add(player); + asteriskUsers.addAll(playerList.get(onlineGroup)); } - Collections.sort(users); + for (String key : asterisk) + { + playerList.put(key, asteriskUsers); + } + onlineGroups = asterisk.toArray(new String[0]); + } - final StringBuilder onlineUsers = new StringBuilder(); - onlineUsers.append(_("connectedPlayers")); - boolean first = true; - for (User user : users) + // If we have any groups remaining after the custom groups loop through and display them + for (String onlineGroup : onlineGroups) + { + List users = playerList.get(onlineGroup); + String groupName = asterisk.isEmpty() ? users.get(0).getGroup() : onlineGroup; + + if (ess.getPermissionsHandler().getName().equals("ConfigPermissions")) { - if (!first) - { - onlineUsers.append(", "); - } - else - { - first = false; - } - if (user.isAfk()) - { - onlineUsers.append(_("listAfkTag")); - } - if (user.isHidden()) - { - onlineUsers.append(_("listHiddenTag")); - } - user.setDisplayNick(); - onlineUsers.append(user.getDisplayName()); - onlineUsers.append("§f"); + groupName = _("connectedPlayers"); + } + if (users == null || users.isEmpty()) + { + continue; + } + + sender.sendMessage(outputFormat(groupName, listUsers(users))); + } + } + + // Cosmetic list formatting + private String listUsers(List users) + { + final StringBuilder groupString = new StringBuilder(); + Collections.sort(users); + boolean needComma = false; + for (User user : users) + { + if (needComma) + { + groupString.append(", "); + } + needComma = true; + if (user.isAfk()) + { + groupString.append(_("listAfkTag")); + } + if (user.isHidden()) + { + groupString.append(_("listHiddenTag")); } - sender.sendMessage(onlineUsers.toString()); + user.setDisplayNick(); + groupString.append(user.getDisplayName()); + groupString.append("§f"); } + return groupString.toString(); + } + + // Build the output string + private String outputFormat(String group, String message) + { + final StringBuilder outputString = new StringBuilder(); + outputString.append(_("listGroupTag", Util.replaceFormat(group))); + outputString.append(message); + outputString.setCharAt(0, Character.toTitleCase(outputString.charAt(0))); + return outputString.toString(); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java index 60306c2721..e6c4cd8ab3 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java @@ -6,17 +6,19 @@ import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; public class Commandmail extends EssentialsCommand { + private static int mailsPerMinute = 0; + private static long timestamp = 0; + public Commandmail() { super("mail"); } - //TODO: Tidy this up + //TODO: Tidy this up / TL these errors. @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { @@ -42,24 +44,29 @@ public void run(final Server server, final User user, final String commandLabel, throw new Exception(_("noPerm", "essentials.mail.send")); } - Player player = server.getPlayer(args[1]); - User u; - if (player != null) - { - u = ess.getUser(player); - } - else - { - u = ess.getOfflineUser(args[1]); - } + User u = ess.getUser(args[1]); if (u == null) { throw new Exception(_("playerNeverOnServer", args[1])); } if (!u.isIgnoredPlayer(user)) { - final String mail = Util.sanitizeString(Util.stripFormat(getFinalArg(args, 2))); - u.addMail(user.getName() + ": " + mail); + final String mail = user.getName() + ": " + Util.sanitizeString(Util.stripFormat(getFinalArg(args, 2))); + if (mail.length() > 1000) + { + throw new Exception("Mail message too long. Try to keep it below 1000"); + } + if (Math.abs(System.currentTimeMillis() - timestamp) > 60000) + { + timestamp = System.currentTimeMillis(); + mailsPerMinute = 0; + } + mailsPerMinute++; + if (mailsPerMinute > ess.getSettings().getMailsPerMinute()) + { + throw new Exception("Too many mails have been send within the last minute. Maximum: " + ess.getSettings().getMailsPerMinute()); + } + u.addMail(mail); } user.sendMessage(_("mailSent")); return; @@ -70,7 +77,7 @@ public void run(final Server server, final User user, final String commandLabel, { throw new Exception(_("noPerm", "essentials.mail.sendall")); } - ess.scheduleAsyncDelayedTask(new SendAll(user.getName() + ": " + Util.stripFormat(getFinalArg(args, 1)))); + ess.runTaskAsynchronously(new SendAll(user.getName() + ": " + Util.stripFormat(getFinalArg(args, 1)))); user.sendMessage(_("mailSent")); return; } @@ -96,16 +103,7 @@ else if (args.length >= 1 && "clear".equalsIgnoreCase(args[0])) } else if (args.length >= 3 && "send".equalsIgnoreCase(args[0])) { - Player player = server.getPlayer(args[1]); - User u; - if (player != null) - { - u = ess.getUser(player); - } - else - { - u = ess.getOfflineUser(args[1]); - } + User u = ess.getUser(args[1]); if (u == null) { throw new Exception(_("playerNeverOnServer", args[1])); @@ -116,21 +114,14 @@ else if (args.length >= 3 && "send".equalsIgnoreCase(args[0])) } else if (args.length >= 1 && "sendall".equalsIgnoreCase(args[0])) { - ess.scheduleAsyncDelayedTask(new SendAll("Server: " + getFinalArg(args, 2))); + ess.runTaskAsynchronously(new SendAll("Server: " + getFinalArg(args, 2))); + sender.sendMessage(_("mailSent")); + return; } else if (args.length >= 2) { //allow sending from console without "send" argument, since it's the only thing the console can do - Player player = server.getPlayer(args[0]); - User u; - if (player != null) - { - u = ess.getUser(player); - } - else - { - u = ess.getOfflineUser(args[0]); - } + User u = ess.getUser(args[0]); if (u == null) { throw new Exception(_("playerNeverOnServer", args[0])); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandme.java b/Essentials/src/com/earth2me/essentials/commands/Commandme.java index 4322592d48..6120caaf20 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandme.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandme.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.Util; import org.bukkit.Server; +import org.bukkit.command.CommandSender; public class Commandme extends EssentialsCommand @@ -32,4 +33,18 @@ public void run(Server server, User user, String commandLabel, String[] args) th user.setDisplayNick(); ess.broadcastMessage(user, _("action", user.getDisplayName(), message)); } + + @Override + public void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception + { + if (args.length < 1) + { + throw new NotEnoughArgumentsException(); + } + + String message = getFinalArg(args, 0); + message = Util.replaceFormat(message); + + ess.getServer().broadcastMessage(_("action", "@", message)); + } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmore.java b/Essentials/src/com/earth2me/essentials/commands/Commandmore.java index 3fce3110c9..e50e21e454 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmore.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmore.java @@ -25,7 +25,7 @@ public void run(final Server server, final User user, final String commandLabel, if (stack.getAmount() >= ((user.isAuthorized("essentials.oversizedstacks")) ? ess.getSettings().getOversizedStackSize() : stack.getMaxStackSize())) { - throw new NoChargeException(); + throw new Exception(_("fullStack")); } final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); if (ess.getSettings().permissionBasedItemSpawn() diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java index fe39a1c047..585bb5b29a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java @@ -21,11 +21,11 @@ public Commandmsg() @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(); } - + String message = getFinalArg(args, 1); if (sender instanceof Player) { @@ -56,38 +56,38 @@ public void run(Server server, CommandSender sender, String commandLabel, String return; } + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); + boolean foundUser = false; final List matchedPlayers = server.matchPlayer(args[0]); - if (matchedPlayers.isEmpty()) + for (Player matchPlayer : matchedPlayers) { - throw new Exception(_("playerNotFound")); - } + final User matchedUser = ess.getUser(matchPlayer); - int i = 0; - for (Player matchedPlayer : matchedPlayers) - { - final User u = ess.getUser(matchedPlayer); - if (u.isHidden()) + if (skipHidden && matchedUser.isHidden()) { - i++; + continue; + } + foundUser = true; + if (matchedUser.isAfk()) + { + sender.sendMessage(_("userAFK", matchPlayer.getDisplayName())); } - } - if (i == matchedPlayers.size()) - { - throw new Exception(_("playerNotFound")); - } - for (Player matchedPlayer : matchedPlayers) - { - sender.sendMessage(_("msgFormat", translatedMe, matchedPlayer.getDisplayName(), message)); - final User matchedUser = ess.getUser(matchedPlayer); - if (sender instanceof Player && (matchedUser.isIgnoredPlayer(ess.getUser(sender)) || matchedUser.isHidden())) + sender.sendMessage(_("msgFormat", translatedMe, matchPlayer.getDisplayName(), message)); + if (sender instanceof Player && matchedUser.isIgnoredPlayer(ess.getUser(sender))) { continue; } - matchedPlayer.sendMessage(_("msgFormat", senderName, translatedMe, message)); - replyTo.setReplyTo(ess.getUser(matchedPlayer)); - ess.getUser(matchedPlayer).setReplyTo(sender); + + matchPlayer.sendMessage(_("msgFormat", senderName, translatedMe, message)); + replyTo.setReplyTo(matchedUser); + ess.getUser(matchPlayer).setReplyTo(sender); + } + + if (!foundUser) + { + throw new Exception(_("playerNotFound")); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmute.java b/Essentials/src/com/earth2me/essentials/commands/Commandmute.java index fa86a8a025..6e7f80b587 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmute.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmute.java @@ -5,6 +5,7 @@ import com.earth2me.essentials.Util; import org.bukkit.Server; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; public class Commandmute extends EssentialsCommand @@ -22,8 +23,8 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - final User player = getPlayer(server, args, 0, true); - if (!player.isMuted() && player.isAuthorized("essentials.mute.exempt")) + final User player = getPlayer(server, args, 0, true, true); + if (sender instanceof Player && !player.isMuted() && player.isAuthorized("essentials.mute.exempt")) { throw new Exception(_("muteExempt")); } @@ -41,17 +42,31 @@ public void run(final Server server, final CommandSender sender, final String co } player.setMuteTimeout(muteTimestamp); final boolean muted = player.getMuted(); - sender.sendMessage( - muted - ? (muteTimestamp > 0 - ? _("mutedPlayerFor", player.getDisplayName(), Util.formatDateDiff(muteTimestamp)) - : _("mutedPlayer", player.getDisplayName())) - : _("unmutedPlayer", player.getDisplayName())); - player.sendMessage( - muted - ? (muteTimestamp > 0 - ? _("playerMutedFor", Util.formatDateDiff(muteTimestamp)) - : _("playerMuted")) - : _("playerUnmuted")); + if (muted) + { + if (muteTimestamp > 0) + { + sender.sendMessage(_("mutedPlayerFor", player.getDisplayName(), Util.formatDateDiff(muteTimestamp))); + player.sendMessage(_("playerMutedFor", Util.formatDateDiff(muteTimestamp))); + } + else + { + sender.sendMessage(_("mutedPlayer", player.getDisplayName())); + player.sendMessage(_("playerMuted")); + } + for (Player onlinePlayer : server.getOnlinePlayers()) + { + final User user = ess.getUser(onlinePlayer); + if (onlinePlayer != sender && user.isAuthorized("essentials.mute.notify")) + { + onlinePlayer.sendMessage(_("muteNotify", sender.getName(), player.getName())); + } + } + } + else + { + sender.sendMessage(_("unmutedPlayer", player.getDisplayName())); + player.sendMessage(_("playerUnmuted")); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnear.java b/Essentials/src/com/earth2me/essentials/commands/Commandnear.java index c13c1489d9..294939f8f6 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandnear.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandnear.java @@ -32,7 +32,7 @@ protected void run(final Server server, final User user, final String commandLab { try { - otherUser = getPlayer(server, args, 0); + otherUser = getPlayer(server, user, args, 0); } catch (Exception ex) { @@ -66,7 +66,7 @@ protected void run(final Server server, final CommandSender sender, final String { throw new NotEnoughArgumentsException(); } - final User otherUser = getPlayer(server, args, 0); + final User otherUser = getPlayer(server, args, 0, true, false); long radius = 200; if (args.length > 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java index 808e0be70d..b7cf4b32d2 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java @@ -33,7 +33,7 @@ public void run(final Server server, final User user, final String commandLabel, { throw new Exception(_("nickOthersPermission")); } - setNickname(server, getPlayer(server, args, 0), formatNickname(user, args[1])); + setNickname(server, getPlayer(server, user, args, 0), formatNickname(user, args[1])); user.sendMessage(_("nickChanged")); return; } @@ -57,7 +57,7 @@ public void run(final Server server, final CommandSender sender, final String co } else { - setNickname(server, getPlayer(server, args, 0), formatNickname(null, args[1])); + setNickname(server, getPlayer(server, args, 0, true, false), formatNickname(null, args[1])); } sender.sendMessage(_("nickChanged")); } @@ -94,7 +94,13 @@ private void setNickname(final Server server, final User target, final String ni { throw new Exception(_("nickNamesAlpha")); } - else if ("off".equalsIgnoreCase(nick) || target.getName().equalsIgnoreCase(nick)) + else if (target.getName().equalsIgnoreCase(nick)) + { + target.setNickname(nick); + target.setDisplayNick(); + target.sendMessage(_("nickNoMore")); + } + else if ("off".equalsIgnoreCase(nick)) { target.setNickname(null); target.setDisplayNick(); @@ -102,16 +108,16 @@ else if ("off".equalsIgnoreCase(nick) || target.getName().equalsIgnoreCase(nick) } else { - for (Player p : server.getOnlinePlayers()) + for (Player onlinePlayer : server.getOnlinePlayers()) { - if (target.getBase() == p) + if (target.getBase() == onlinePlayer) { continue; } - String dn = p.getDisplayName().toLowerCase(Locale.ENGLISH); - String n = p.getName().toLowerCase(Locale.ENGLISH); - String nk = nick.toLowerCase(Locale.ENGLISH); - if (nk.equals(dn) || nk.equals(n)) + String displayName = onlinePlayer.getDisplayName().toLowerCase(Locale.ENGLISH); + String name = onlinePlayer.getName().toLowerCase(Locale.ENGLISH); + String lowerNick = nick.toLowerCase(Locale.ENGLISH); + if (lowerNick.equals(displayName) || lowerNick.equals(name)) { throw new Exception(_("nickInUse")); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java index fde9be58a7..60b9baa662 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java @@ -3,6 +3,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; +import java.util.List; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -21,25 +22,28 @@ public void run(Server server, User user, String commandLabel, String[] args) th { 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."); } double amount = Double.parseDouble(args[1].replaceAll("[^0-9\\.]", "")); + boolean skipHidden = !user.isAuthorized("essentials.vanish.interact"); boolean foundUser = false; - for (Player p : server.matchPlayer(args[0])) + final List matchedPlayers = server.matchPlayer(args[0]); + for (Player matchPlayer : matchedPlayers) { - User u = ess.getUser(p); - if (u.isHidden()) + User player = ess.getUser(matchPlayer); + if (skipHidden && player.isHidden()) { continue; } - user.payUser(u, amount); - Trade.log("Command", "Pay", "Player", user.getName(), new Trade(amount, ess), u.getName(), new Trade(amount, ess), user.getLocation(), ess); foundUser = true; + user.payUser(player, amount); + Trade.log("Command", "Pay", "Player", user.getName(), new Trade(amount, ess), player.getName(), new Trade(amount, ess), user.getLocation(), ess); } if (!foundUser) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandping.java b/Essentials/src/com/earth2me/essentials/commands/Commandping.java index 43aa18d5f6..0b1df5bf5e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandping.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandping.java @@ -5,7 +5,7 @@ import org.bukkit.Server; import org.bukkit.command.CommandSender; - +// This command can be used to echo messages to the users screen, mostly useless but also an #EasterEgg public class Commandping extends EssentialsCommand { public Commandping() diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpotion.java b/Essentials/src/com/earth2me/essentials/commands/Commandpotion.java new file mode 100644 index 0000000000..1e0937e6fc --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpotion.java @@ -0,0 +1,93 @@ +package com.earth2me.essentials.commands; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.MetaItemStack; +import com.earth2me.essentials.Potions; +import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + + +public class Commandpotion extends EssentialsCommand +{ + public Commandpotion() + { + super("potion"); + } + + @Override + protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + { + final ItemStack stack = user.getItemInHand(); + + if (args.length == 0) + { + final Set potionslist = new TreeSet(); + for (Map.Entry entry : Potions.entrySet()) + { + final String potionName = entry.getValue().getName().toLowerCase(Locale.ENGLISH); + if (potionslist.contains(potionName) || (user.isAuthorized("essentials.potion." + potionName))) + { + potionslist.add(entry.getKey()); + } + } + throw new NotEnoughArgumentsException(_("potions", Util.joinList(potionslist.toArray()))); + } + + if (stack.getType() == Material.POTION) + { + PotionMeta pmeta = (PotionMeta)stack.getItemMeta(); + if (args.length > 0) + { + if (args[0].equalsIgnoreCase("clear")) + { + pmeta.clearCustomEffects(); + stack.setItemMeta(pmeta); + } + else if (args[0].equalsIgnoreCase("apply") && user.isAuthorized("essentials.potion.apply")) + { + for (PotionEffect effect : pmeta.getCustomEffects()) + { + effect.apply(user); + } + } + else if (args.length < 3) + { + throw new NotEnoughArgumentsException(); + } + else + { + final MetaItemStack mStack = new MetaItemStack(stack); + for (String arg : args) + { + mStack.addPotionMeta(user, true, arg, ess); + } + if (mStack.completePotion()) + { + pmeta = (PotionMeta)mStack.getItemStack().getItemMeta(); + stack.setItemMeta(pmeta); + } + else + { + user.sendMessage(_("invalidPotion")); + throw new NotEnoughArgumentsException(); + } + } + } + + } + else + { + throw new Exception(_("holdPotion")); + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpowertool.java b/Essentials/src/com/earth2me/essentials/commands/Commandpowertool.java index d1d0fb582f..d72744ae32 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandpowertool.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpowertool.java @@ -8,6 +8,7 @@ import java.util.Locale; import org.bukkit.Material; import org.bukkit.Server; +import org.bukkit.command.CommandSender; import org.bukkit.inventory.ItemStack; @@ -21,17 +22,35 @@ public Commandpowertool() @Override protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - String command = getFinalArg(args, 0); + final String command = getFinalArg(args, 0); + final ItemStack itemStack = user.getItemInHand(); + powertool(server, user, user, commandLabel, itemStack, command); + } + @Override + protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception + { + if (args.length < 3) //running from console means inserting a player and item before the standard syntax + { + throw new Exception("When running from console, usage is: /" + commandLabel + " "); + } + + final User user = getPlayer(server, args, 0, true, true); + final ItemStack itemStack = ess.getItemDb().get(args[1]); + final String command = getFinalArg(args, 2); + powertool(server, sender, user, commandLabel, itemStack, command); + } + + protected void powertool(final Server server, final CommandSender sender, final User user, final String commandLabel, final ItemStack itemStack, String command) throws Exception + { // check to see if this is a clear all command if (command != null && command.equalsIgnoreCase("d:")) { user.clearAllPowertools(); - user.sendMessage(_("powerToolClearAll")); + sender.sendMessage(_("powerToolClearAll")); return; } - final ItemStack itemStack = user.getItemInHand(); if (itemStack == null || itemStack.getType() == Material.AIR) { throw new Exception(_("powerToolAir")); @@ -49,7 +68,7 @@ protected void run(final Server server, final User user, final String commandLab } else { - user.sendMessage(_("powerToolList", Util.joinList(powertools), itemName)); + sender.sendMessage(_("powerToolList", Util.joinList(powertools), itemName)); } throw new NoChargeException(); } @@ -62,13 +81,13 @@ protected void run(final Server server, final User user, final String commandLab } powertools.remove(command); - user.sendMessage(_("powerToolRemove", command, itemName)); + sender.sendMessage(_("powerToolRemove", command, itemName)); } else { if (command.startsWith("a:")) { - if (!user.isAuthorized("essentials.powertool.append")) + if (sender instanceof User && !((User)sender).isAuthorized("essentials.powertool.append")) { throw new Exception(_("noPerm", "essentials.powertool.append")); } @@ -89,7 +108,7 @@ else if (powertools != null && !powertools.isEmpty()) } powertools.add(command); - user.sendMessage(_("powerToolAttach", Util.joinList(powertools), itemName)); + sender.sendMessage(_("powerToolAttach", Util.joinList(powertools), itemName)); } } else @@ -98,7 +117,7 @@ else if (powertools != null && !powertools.isEmpty()) { powertools.clear(); } - user.sendMessage(_("powerToolRemoveAll", itemName)); + sender.sendMessage(_("powerToolRemoveAll", itemName)); } if (!user.arePowerToolsEnabled()) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandptime.java b/Essentials/src/com/earth2me/essentials/commands/Commandptime.java index 866846733a..46548c57c6 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandptime.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandptime.java @@ -46,7 +46,7 @@ public void run(final Server server, final CommandSender sender, final String co } User user = ess.getUser(sender); - if ((!users.contains(user) || users.size() > 1) && user != null && !user.isAuthorized("essentials.ptime.others")) + if (user != null && (!users.contains(user) || users.size() > 1)&& !user.isAuthorized("essentials.ptime.others")) { user.sendMessage(_("pTimeOthersPermission")); return; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpweather.java b/Essentials/src/com/earth2me/essentials/commands/Commandpweather.java new file mode 100644 index 0000000000..6a7ab954ae --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpweather.java @@ -0,0 +1,185 @@ +package com.earth2me.essentials.commands; + +import com.earth2me.essentials.DescParseTickFormat; +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.User; +import java.util.*; +import org.bukkit.Server; +import org.bukkit.WeatherType; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + + +public class Commandpweather extends EssentialsCommand +{ + public static final Set getAliases = new HashSet(); + public static final Map weatherAliases = new HashMap(); + + static + { + getAliases.add("get"); + getAliases.add("list"); + getAliases.add("show"); + getAliases.add("display"); + weatherAliases.put("sun", WeatherType.CLEAR); + weatherAliases.put("clear", WeatherType.CLEAR); + weatherAliases.put("storm", WeatherType.DOWNFALL); + weatherAliases.put("thunder", WeatherType.DOWNFALL); + } + + public Commandpweather() + { + super("pweather"); + } + + @Override + public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception + { + // Which Players(s) / Users(s) are we interested in? + String userSelector = null; + if (args.length == 2) + { + userSelector = args[1]; + } + Set users = getUsers(server, sender, userSelector); + + if (args.length == 0) + { + getUsersWeather(sender, users); + return; + } + + if (getAliases.contains(args[0])) + { + getUsersWeather(sender, users); + return; + } + + User user = ess.getUser(sender); + if (user != null && (!users.contains(user) || users.size() > 1)&& !user.isAuthorized("essentials.pweather.others")) + { + user.sendMessage(_("pWeatherOthersPermission")); + return; + } + + setUsersWeather(sender, users, args[0].toLowerCase()); + } + + /** + * Used to get the time and inform + */ + private void getUsersWeather(final CommandSender sender, final Collection users) + { + if (users.size() > 1) + { + sender.sendMessage(_("pWeatherPlayers")); + } + + for (User user : users) + { + if (user.getPlayerWeather() == null) + { + sender.sendMessage(_("pWeatherNormal", user.getName())); + } + else + { + sender.sendMessage(_("pWeatherCurrent", user.getName(), user.getPlayerWeather().toString().toLowerCase(Locale.ENGLISH))); + } + } + } + + /** + * Used to set the time and inform of the change + */ + private void setUsersWeather(final CommandSender sender, final Collection users, final String weatherType ) throws Exception + { + + final StringBuilder msg = new StringBuilder(); + for (User user : users) + { + if (msg.length() > 0) + { + msg.append(", "); + } + + msg.append(user.getName()); + } + + if (weatherType.equalsIgnoreCase("reset")) + { + for (User user : users) + { + user.resetPlayerWeather(); + } + + sender.sendMessage(_("pWeatherReset", msg)); + } + else + { + if (!weatherAliases.containsKey(weatherType)) + { + throw new NotEnoughArgumentsException(_("pWeatherInvalidAlias")); + } + + for (User user : users) + { + user.setPlayerWeather(weatherAliases.get(weatherType)); + } + sender.sendMessage(_("pWeatherSet", weatherType, msg.toString())); + } + } + + /** + * Used to parse an argument of the type "users(s) selector" + */ + private Set getUsers(final Server server, final CommandSender sender, final String selector) throws Exception + { + final Set users = new TreeSet(new UserNameComparator()); + // If there is no selector we want the sender itself. Or all users if sender isn't a user. + if (selector == null) + { + final User user = ess.getUser(sender); + if (user == null) + { + for (Player player : server.getOnlinePlayers()) + { + users.add(ess.getUser(player)); + } + } + else + { + users.add(user); + } + return users; + } + + // Try to find the user with name = selector + User user = null; + final List matchedPlayers = server.matchPlayer(selector); + if (!matchedPlayers.isEmpty()) + { + user = ess.getUser(matchedPlayers.get(0)); + } + + if (user != null) + { + users.add(user); + } + // If that fails, Is the argument something like "*" or "all"? + else if (selector.equalsIgnoreCase("*") || selector.equalsIgnoreCase("all")) + { + for (Player player : server.getOnlinePlayers()) + { + users.add(ess.getUser(player)); + } + } + // We failed to understand the world target... + else + { + throw new Exception(_("playerNotFound")); + } + + return users; + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java b/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java index c990182113..dac1c6eaba 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java @@ -24,6 +24,7 @@ protected void run(final Server server, final CommandSender sender, final String throw new NotEnoughArgumentsException(); } final String whois = args[0].toLowerCase(Locale.ENGLISH); + boolean foundUser = false; for (Player onlinePlayer : server.getOnlinePlayers()) { final User u = ess.getUser(onlinePlayer); @@ -33,13 +34,15 @@ protected void run(final Server server, final CommandSender sender, final String } u.setDisplayNick(); final String displayName = Util.stripFormat(u.getDisplayName()).toLowerCase(Locale.ENGLISH); - if (!whois.equals(displayName) - && !displayName.equals(Util.stripFormat(ess.getSettings().getNicknamePrefix()) + whois) - && !whois.equalsIgnoreCase(u.getName())) + if (displayName.contains(whois)) { - continue; + foundUser = true; + sender.sendMessage(u.getDisplayName() + " " + _("is") + " " + u.getName()); } - sender.sendMessage(u.getDisplayName() + " " + _("is") + " " + u.getName()); + } + if (!foundUser) + { + throw new NoSuchFieldException(_("playerNotFound")); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrecipe.java b/Essentials/src/com/earth2me/essentials/commands/Commandrecipe.java new file mode 100755 index 0000000000..7f40a062c7 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandrecipe.java @@ -0,0 +1,191 @@ +package com.earth2me.essentials.commands; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.*; + + +public class Commandrecipe extends EssentialsCommand +{ + public Commandrecipe() + { + super("recipe"); + } + + @Override + public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception + { + if (args.length < 1) + { + throw new NotEnoughArgumentsException(); + } + + final ItemStack itemType = ess.getItemDb().get(args[0]); + int recipeNo = 0; + + if (args.length > 1) + { + if (Util.isInt(args[1])) + { + recipeNo = Integer.parseInt(args[1]) - 1; + } + else + { + throw new Exception(_("invalidNumber")); + } + } + + final List recipesOfType = ess.getServer().getRecipesFor(itemType); + if (recipesOfType.size() < 1) + { + throw new Exception(_("recipeNone", getMaterialName(itemType))); + } + + if (recipeNo < 0 || recipeNo >= recipesOfType.size()) + { + throw new Exception(_("recipeBadIndex")); + } + + final Recipe selectedRecipe = recipesOfType.get(recipeNo); + sender.sendMessage(_("recipe", getMaterialName(itemType), recipeNo + 1, recipesOfType.size())); + + if (selectedRecipe instanceof FurnaceRecipe) + { + furnaceRecipe(sender, (FurnaceRecipe)selectedRecipe); + } + else if (selectedRecipe instanceof ShapedRecipe) + { + shapedRecipe(sender, (ShapedRecipe)selectedRecipe); + } + else if (selectedRecipe instanceof ShapelessRecipe) + { + shapelessRecipe(sender, (ShapelessRecipe)selectedRecipe); + } + + if (recipesOfType.size() > 1 && args.length == 1) + { + sender.sendMessage(_("recipeMore", commandLabel, args[0], getMaterialName(itemType))); + } + } + + public void furnaceRecipe(final CommandSender sender, final FurnaceRecipe recipe) + { + sender.sendMessage(_("recipeFurnace", getMaterialName(recipe.getInput()))); + } + + public void shapedRecipe(final CommandSender sender, final ShapedRecipe recipe) + { + final Map recipeMap = recipe.getIngredientMap(); + + if (sender instanceof Player) + { + final User user = ess.getUser(sender); + user.setRecipeSee(true); + final InventoryView view = user.openWorkbench(null, true); + final String[] recipeShape = recipe.getShape(); + final Map ingredientMap = recipe.getIngredientMap(); + for (int j = 0; j < recipeShape.length; j++) + { + for (int k = 0; k < recipeShape[j].length(); k++) + { + final ItemStack item = ingredientMap.get(recipeShape[j].toCharArray()[k]); + if(item == null) + { + continue; + } + item.setAmount(0); + view.getTopInventory().setItem(j * 3 + k + 1, item); + } + } + } + else + { + final HashMap colorMap = new HashMap(); + int i = 1; + for (Character c : "abcdefghi".toCharArray()) + { + ItemStack item = recipeMap.get(c); + if (!colorMap.containsKey(item == null ? null : item.getType())) + { + colorMap.put(item == null ? null : item.getType(), String.valueOf(i++)); + } + } + final Material[][] materials = new Material[3][3]; + for (int j = 0; j < recipe.getShape().length; j++) + { + for (int k = 0; k < recipe.getShape()[j].length(); k++) + { + ItemStack item = recipe.getIngredientMap().get(recipe.getShape()[j].toCharArray()[k]); + materials[j][k] = item == null ? null : item.getType(); + } + } + sender.sendMessage(_("recipeGrid", colorMap.get(materials[0][0]), colorMap.get(materials[0][1]), colorMap.get(materials[0][2]))); + sender.sendMessage(_("recipeGrid", colorMap.get(materials[1][0]), colorMap.get(materials[1][1]), colorMap.get(materials[1][2]))); + sender.sendMessage(_("recipeGrid", colorMap.get(materials[2][0]), colorMap.get(materials[2][1]), colorMap.get(materials[2][2]))); + + StringBuilder s = new StringBuilder(); + for (Material items : colorMap.keySet().toArray(new Material[colorMap.size()])) + { + s.append(_("recipeGridItem", colorMap.get(items), getMaterialName(items))); + } + sender.sendMessage(_("recipeWhere", s.toString())); + } + } + + public void shapelessRecipe(final CommandSender sender, final ShapelessRecipe recipe) + { + final List ingredients = recipe.getIngredientList(); + if (sender instanceof Player) + { + final User user = ess.getUser(sender); + user.setRecipeSee(true); + final InventoryView view = user.openWorkbench(null, true); + for (int i = 0; i < ingredients.size(); i++) + { + view.setItem(i + 1, ingredients.get(i)); + } + + } + else + { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < ingredients.size(); i++) + { + s.append(getMaterialName(ingredients.get(i))); + if (i != ingredients.size() - 1) + { + s.append(","); + } + s.append(" "); + } + sender.sendMessage(_("recipeShapeless", s.toString())); + } + } + + public String getMaterialName(final ItemStack stack) + { + if (stack == null) + { + return _("recipeNothing"); + } + return getMaterialName(stack.getType()); + } + + public String getMaterialName(final Material type) + { + if (type == null) + { + return _("recipeNothing"); + } + return type.toString().replace("_", " ").toLowerCase(Locale.ENGLISH); + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandremove.java b/Essentials/src/com/earth2me/essentials/commands/Commandremove.java index 0957a79899..dc1119242b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandremove.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandremove.java @@ -25,7 +25,8 @@ private enum ToRemove BOATS, MINECARTS, XP, - PAINTINGS + PAINTINGS, + ITEMFRAMES } @Override @@ -36,10 +37,10 @@ protected void run(final Server server, final User user, final String commandLab throw new NotEnoughArgumentsException(); } ToRemove toRemove; - final World world = user.getWorld(); + World world = user.getWorld(); int radius = 0; - if (args.length < 2) + if (args.length >= 2) { try { @@ -51,13 +52,25 @@ protected void run(final Server server, final User user, final String commandLab } } + if (args.length >= 3) + { + world = ess.getWorld(args[2]); + } + try { toRemove = ToRemove.valueOf(args[0].toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException e) { - throw new NotEnoughArgumentsException(e); //TODO: translate and list types + try + { + toRemove = ToRemove.valueOf(args[0].concat("S").toUpperCase(Locale.ENGLISH)); + } + catch (IllegalArgumentException ee) + { + throw new NotEnoughArgumentsException(ee); //TODO: translate and list types + } } removeEntities(user, world, toRemove, radius); @@ -70,13 +83,8 @@ protected void run(final Server server, final CommandSender sender, final String { throw new NotEnoughArgumentsException(); } - World world; - world = ess.getWorld(args[1]); + World world = ess.getWorld(args[1]); - if (world == null) - { - throw new Exception(_("invalidWorld")); - } ToRemove toRemove; try { @@ -84,7 +92,14 @@ protected void run(final Server server, final CommandSender sender, final String } catch (IllegalArgumentException e) { - throw new NotEnoughArgumentsException(e); //TODO: translate and list types + try + { + toRemove = ToRemove.valueOf(args[0].concat("S").toUpperCase(Locale.ENGLISH)); + } + catch (IllegalArgumentException ee) + { + throw new NotEnoughArgumentsException(ee); //TODO: translate and list types + } } removeEntities(sender, world, toRemove, 0); } @@ -155,6 +170,14 @@ else if (toRemove == ToRemove.PAINTINGS) removed++; } } + else if (toRemove == ToRemove.ITEMFRAMES) + { + if (e instanceof Painting) + { + e.remove(); + removed++; + } + } } } sender.sendMessage(_("removed", removed)); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrepair.java b/Essentials/src/com/earth2me/essentials/commands/Commandrepair.java index d621109f72..708e535869 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandrepair.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandrepair.java @@ -28,7 +28,7 @@ public void run(final Server server, final User user, final String commandLabel, if (args[0].equalsIgnoreCase("hand")) { final ItemStack item = user.getItemInHand(); - if (item == null) + if (item == null || item.getType().isBlock() || item.getDurability() == 0) { throw new Exception(_("repairInvalidType")); } @@ -41,7 +41,7 @@ public void run(final Server server, final User user, final String commandLabel, } final String itemName = item.getType().toString().toLowerCase(Locale.ENGLISH); - final Trade charge = new Trade("repair-" + itemName.replace('_', '-'), ess); + final Trade charge = new Trade("repair-" + itemName.replace('_', '-'), new Trade("repair-" + item.getTypeId(), new Trade("repair-item", ess), ess), ess); charge.isAffordableFor(user); @@ -100,12 +100,12 @@ private void repairItems(final ItemStack[] items, final IUser user, final List 0 + ? Util.formatDateDiff(user.getJailTimeout()) + : _("true")))); + } + if (user.isMuted()) + { + sender.sendMessage(_("whoisMuted", (user.getMuteTimeout() > 0 + ? Util.formatDateDiff(user.getMuteTimeout()) + : _("true")))); + } + if (extra) + { + sender.sendMessage(_("whoisIPAddress", user.getAddress().getAddress().toString())); + final String location = user.getGeoLocation(); + if (location != null && (!(sender instanceof Player) || ess.getUser(sender).isAuthorized("essentials.geoip.show"))) + { + sender.sendMessage(_("whoisGeoLocation", location)); + } + + } + } + + private void seenOffline(final Server server, final CommandSender sender, User user, final boolean showBan, final boolean extra) throws Exception + { + user.setDisplayNick(); + if (user.getLastLogout() > 0) + { + sender.sendMessage(_("seenOffline", user.getName(), Util.formatDateDiff(user.getLastLogout()))); + } + else + { + sender.sendMessage(_("userUnknown", user.getName())); + } + if (user.isBanned()) + { + sender.sendMessage(_("whoisBanned", showBan ? user.getBanReason() : _("true"))); + } + if (extra) + { + if (!user.getLastLoginAddress().isEmpty()) + { + sender.sendMessage(_("whoisIPAddress", user.getLastLoginAddress())); } - player.setDisplayNick(); - sender.sendMessage(_("seenOffline", player.getName(), Util.formatDateDiff(player.getLastLogout()))); - if (player.isBanned()) + final String location = user.getGeoLocation(); + if (location != null && (!(sender instanceof Player) || ess.getUser(sender).isAuthorized("essentials.geoip.show"))) { - sender.sendMessage(_("whoisBanned", showBan ? player.getBanReason() : _("true"))); + sender.sendMessage(_("whoisGeoLocation", location)); } - if (extra) + final Location loc = user.getLogoutLocation(); + if (loc != null) { - sender.sendMessage(_("whoisIPAddress", player.getLastLoginAddress())); - final Location loc = player.getLastLocation(); - if (loc != null) { - sender.sendMessage(_("whoisLocation", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); - } + sender.sendMessage(_("whoisLocation", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); } } } + + private void seenIP(final Server server, final CommandSender sender, final String ipAddress) throws Exception + { + final UserMap userMap = ess.getUserMap(); + sender.sendMessage(_("runningPlayerMatch", ipAddress)); + + ess.runTaskAsynchronously(new Runnable() + { + @Override + public void run() + { + final List matches = new ArrayList(); + for (final String u : userMap.getAllUniqueUsers()) + { + final User user = ess.getUserMap().getUser(u); + if (user == null) + { + continue; + } + + final String uIPAddress = user.getLastLoginAddress(); + + if (!uIPAddress.isEmpty() && uIPAddress.equalsIgnoreCase(ipAddress)) + { + matches.add(user.getName()); + } + } + + if (matches.size() > 0) + { + sender.sendMessage(_("matchingIPAddress")); + sender.sendMessage(Util.joinList(matches)); + } + else + { + sender.sendMessage(_("noMatchingPlayers")); + } + + } + }); + + } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsell.java b/Essentials/src/com/earth2me/essentials/commands/Commandsell.java index 5958a5c0f3..a7b1ae32de 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsell.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsell.java @@ -1,7 +1,6 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; import com.earth2me.essentials.Util; @@ -22,6 +21,8 @@ public Commandsell() @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { + double totalWorth = 0.0; + String type = ""; if (args.length < 1) { throw new NotEnoughArgumentsException(); @@ -41,12 +42,16 @@ else if (args[0].equalsIgnoreCase("inventory") || args[0].equalsIgnoreCase("inve } try { - sellItem(user, stack, args, true); + totalWorth += sellItem(user, stack, args, true); } catch (Exception e) { } } + if (totalWorth > 0) + { + user.sendMessage(_("totalWorthAll", type, Util.displayCurrency(totalWorth, ess))); + } return; } else if (args[0].equalsIgnoreCase("blocks")) @@ -59,12 +64,16 @@ else if (args[0].equalsIgnoreCase("blocks")) } try { - sellItem(user, stack, args, true); + totalWorth += sellItem(user, stack, args, true); } catch (Exception e) { } } + if (totalWorth > 0) + { + user.sendMessage(_("totalWorthBlocks", type, Util.displayCurrency(totalWorth, ess))); + } return; } if (is == null) @@ -74,7 +83,7 @@ else if (args[0].equalsIgnoreCase("blocks")) sellItem(user, is, args, false); } - private void sellItem(User user, ItemStack is, String[] args, boolean isBulkSell) throws Exception + private double sellItem(User user, ItemStack is, String[] args, boolean isBulkSell) throws Exception { if (is == null || is.getType() == Material.AIR) { @@ -107,19 +116,7 @@ private void sellItem(User user, ItemStack is, String[] args, boolean isBulkSell int max = 0; for (ItemStack s : user.getInventory().getContents()) { - if (s == null) - { - continue; - } - if (s.getTypeId() != is.getTypeId()) - { - continue; - } - if (s.getDurability() != is.getDurability()) - { - continue; - } - if (!s.getEnchantments().equals(is.getEnchantments())) + if (s == null || !s.isSimilar(is)) { continue; } @@ -149,19 +146,23 @@ private void sellItem(User user, ItemStack is, String[] args, boolean isBulkSell } else { - return; + return worth * amount; } } //TODO: Prices for Enchantments final ItemStack ris = is.clone(); ris.setAmount(amount); - InventoryWorkaround.removeItem(user.getInventory(), true, true, ris); + if (!user.getInventory().containsAtLeast(ris, amount)) { + // This should never happen. + throw new IllegalStateException("Trying to remove more items than are available."); + } + user.getInventory().removeItem(ris); user.updateInventory(); Trade.log("Command", "Sell", "Item", user.getName(), new Trade(ris, ess), user.getName(), new Trade(worth * amount, ess), user.getLocation(), ess); user.giveMoney(worth * amount); user.sendMessage(_("itemSold", Util.displayCurrency(worth * amount, ess), amount, is.getType().toString().toLowerCase(Locale.ENGLISH), Util.displayCurrency(worth, ess))); logger.log(Level.INFO, _("itemSoldConsole", user.getDisplayName(), is.getType().toString().toLowerCase(Locale.ENGLISH), Util.displayCurrency(worth * amount, ess), amount, Util.displayCurrency(worth, ess))); - + return worth * amount; } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java index f622094d28..1e27e7e3b8 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java @@ -2,7 +2,9 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.Locale; +import org.bukkit.Location; import org.bukkit.Server; @@ -16,6 +18,10 @@ public Commandsethome() @Override public void run(final Server server, final User user, final String commandLabel, String[] args) throws Exception { + User usersHome = user; + String name = "home"; + final Location location = user.getLocation(); + if (args.length > 0) { //Allowing both formats /sethome khobbits house | /sethome khobbits:house @@ -27,59 +33,52 @@ public void run(final Server server, final User user, final String commandLabel, if (args.length < 2) { - if (user.isAuthorized("essentials.sethome.multiple")) - { - if ("bed".equals(args[0].toLowerCase(Locale.ENGLISH))) - { - throw new NotEnoughArgumentsException(); - } - if ((user.isAuthorized("essentials.sethome.multiple.unlimited")) || (user.getHomes().size() < ess.getSettings().getHomeLimit(user)) - || (user.getHomes().contains(args[0].toLowerCase(Locale.ENGLISH)))) - { - user.setHome(args[0].toLowerCase(Locale.ENGLISH)); - } - else - { - throw new Exception(_("maxHomes", ess.getSettings().getHomeLimit(user))); - } - - } - else - { - throw new Exception(_("maxHomes", 1)); - } + name = args[0].toLowerCase(Locale.ENGLISH); } else { if (user.isAuthorized("essentials.sethome.others")) { - User usersHome = ess.getUser(ess.getServer().getPlayer(args[0])); + usersHome = ess.getUser(args[0]); if (usersHome == null) { - usersHome = ess.getOfflineUser(args[0]); - } - if (usersHome == null) - { - throw new Exception(_("playerNotFound")); - } - String name = args[1].toLowerCase(Locale.ENGLISH); - if (!user.isAuthorized("essentials.sethome.multiple")) - { - name = "home"; - } - if ("bed".equals(name.toLowerCase(Locale.ENGLISH))) - { - throw new NotEnoughArgumentsException(); + throw new NoSuchFieldException(_("playerNotFound")); } - usersHome.setHome(name, user.getLocation()); + name = args[1].toLowerCase(Locale.ENGLISH); } } } - else + if (checkHomeLimit(user, usersHome, name)) + { + name = "home"; + } + if ("bed".equals(name) || Util.isInt(name)) { - user.setHome(); + throw new NoSuchFieldException(_("invalidHomeName")); } + usersHome.setHome(name, location); user.sendMessage(_("homeSet", user.getLocation().getWorld().getName(), user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ())); } + + private boolean checkHomeLimit(final User user, final User usersHome, String name) throws Exception + { + if (!user.isAuthorized("essentials.sethome.multiple.unlimited")) + { + int limit = ess.getSettings().getHomeLimit(user); + if (usersHome.getHomes().size() == limit && usersHome.getHomes().contains(name)) + { + return false; + } + if (usersHome.getHomes().size() >= limit) + { + throw new Exception(_("maxHomes", ess.getSettings().getHomeLimit(user))); + } + if (limit == 1) + { + return true; + } + } + return false; + } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java b/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java index 42da62b856..542299c13e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java @@ -22,9 +22,10 @@ public void run(final Server server, final User user, final String commandLabel, { throw new NotEnoughArgumentsException(); } - - if (args[0].matches("[0-9]+")) { - throw new NotEnoughArgumentsException(); + + if (Util.isInt(args[0]) || args[0].isEmpty()) + { + throw new NoSuchFieldException(_("invalidWarpName")); } final Location loc = user.getLocation(); @@ -39,7 +40,7 @@ public void run(final Server server, final User user, final String commandLabel, { } - if (warpLoc == null || user.isAuthorized("essentials.warp.overwrite." + Util.sanitizeFileName(args[0]))) + if (warpLoc == null || user.isAuthorized("essentials.warp.overwrite." + Util.safeString(args[0]))) { warps.setWarp(args[0], loc); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsocialspy.java b/Essentials/src/com/earth2me/essentials/commands/Commandsocialspy.java index 6080642a13..e5985a2fa5 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsocialspy.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsocialspy.java @@ -2,6 +2,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import org.bukkit.command.CommandSender; import org.bukkit.Server; @@ -15,6 +16,28 @@ public Commandsocialspy() @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - user.sendMessage("§7SocialSpy " + (user.toggleSocialSpy() ? _("enabled") : _("disabled"))); + if (args.length > 0 && user.isAuthorized("essentials.socialspy.others")) + { + User target = getPlayer(server, user, args, 0); + user.sendMessage(_("socialSpy", target.getDisplayName(), target.toggleSocialSpy() ? _("enabled") : _("disabled"))); + } + else + { + user.sendMessage(_("socialSpy", user.getDisplayName(), user.toggleSocialSpy() ? _("enabled") : _("disabled"))); + } + } + + @Override + public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception + { + if (args.length > 0) + { + User target = getPlayer(server, args, 0, true, false); + sender.sendMessage(_("socialSpy", target.getDisplayName(), target.toggleSocialSpy() ? _("enabled") : _("disabled"))); + } + else + { + throw new NotEnoughArgumentsException(); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java index d2b50137dd..a01f42f01a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java @@ -1,13 +1,15 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.*; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.Mob; +import com.earth2me.essentials.Trade; +import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.Locale; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.block.CreatureSpawner; -import org.bukkit.entity.EntityType; public class Commandspawner extends EssentialsCommand @@ -32,6 +34,7 @@ protected void run(final Server server, final User user, final String commandLab } String name = args[0]; + int delay = 0; Mob mob = null; mob = Mob.fromName(name); @@ -47,11 +50,20 @@ protected void run(final Server server, final User user, final String commandLab { throw new Exception(_("noPermToSpawnMob")); } + if (args.length > 1) + { + if (Util.isInt(args[1])) + { + delay = Integer.parseInt(args[1]); + } + } final Trade charge = new Trade("spawner-" + mob.name.toLowerCase(Locale.ENGLISH), ess); charge.isAffordableFor(user); try { - ((CreatureSpawner)target.getBlock().getState()).setSpawnedType(mob.getType()); + CreatureSpawner spawner = (CreatureSpawner)target.getBlock().getState(); + spawner.setSpawnedType(mob.getType()); + spawner.setDelay(delay); } catch (Throwable ex) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java index 2546a76dd3..706a3f84b7 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java @@ -2,17 +2,12 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Mob; -import com.earth2me.essentials.Mob.MobException; +import com.earth2me.essentials.SpawnMob; import com.earth2me.essentials.User; import com.earth2me.essentials.Util; -import java.util.*; -import org.bukkit.DyeColor; -import org.bukkit.Location; +import java.util.List; import org.bukkit.Server; -import org.bukkit.block.Block; -import org.bukkit.entity.*; -import org.bukkit.entity.Villager.Profession; -import org.bukkit.material.Colorable; +import org.bukkit.command.CommandSender; public class Commandspawnmob extends EssentialsCommand @@ -21,262 +16,54 @@ public Commandspawnmob() { super("spawnmob"); } - + @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { - final Set mobList = Mob.getMobList(); - final Set availableList = new HashSet(); - for (String mob : mobList) - { - if (user.isAuthorized("essentials.spawnmob." + mob.toLowerCase())) - { - availableList.add(mob); - } - } - if (availableList.isEmpty()) - { - availableList.add(_("none")); - } - throw new NotEnoughArgumentsException(_("mobsAvailable", Util.joinList(availableList))); - } - - - final String[] mountparts = args[0].split(","); - String[] parts = mountparts[0].split(":"); - String mobType = parts[0]; - String mobData = null; - if (parts.length == 2) - { - mobData = parts[1]; - } - String mountType = null; - String mountData = null; - if (mountparts.length > 1) - { - parts = mountparts[1].split(":"); - mountType = parts[0]; - if (parts.length == 2) - { - mountData = parts[1]; - } - } - - - Entity spawnedMob = null; - Mob mob = null; - Entity spawnedMount = null; - Mob mobMount = null; - - mob = Mob.fromName(mobType); - if (mob == null) - { - throw new Exception(_("invalidMob")); - } - - if (ess.getSettings().getProtectPreventSpawn(mob.getType().toString().toLowerCase(Locale.ENGLISH))) - { - throw new Exception(_("disabledToSpawnMob")); + final String mobList = SpawnMob.mobList(user); + throw new NotEnoughArgumentsException(_("mobsAvailable", mobList)); } - if (!user.isAuthorized("essentials.spawnmob." + mob.name.toLowerCase())) + + List mobParts = SpawnMob.mobParts(args[0]); + List mobData = SpawnMob.mobData(args[0]); + + int mobCount = 1; + if (args.length >= 2) { - throw new Exception(_("noPermToSpawnMob")); + mobCount = Integer.parseInt(args[1]); } - - final Block block = Util.getTarget(user).getBlock(); - if (block == null) + + if (mobParts.size() > 1 && !user.isAuthorized("essentials.spawnmob.stack")) { - throw new Exception(_("unableToSpawnMob")); + throw new Exception(_("cannotStackMob")); } - User otherUser = null; + if (args.length >= 3) { - otherUser = getPlayer(ess.getServer(), args, 2); - } - final Location loc = (otherUser == null) ? block.getLocation() : otherUser.getLocation(); - final Location sloc = Util.getSafeDestination(loc); - try - { - spawnedMob = mob.spawn(user, server, sloc); - } - catch (MobException e) - { - throw new Exception(_("unableToSpawnMob"), e); - } - - if (mountType != null) - { - mobMount = Mob.fromName(mountType); - if (mobMount == null) - { - user.sendMessage(_("invalidMob")); - return; - } - - if (ess.getSettings().getProtectPreventSpawn(mobMount.getType().toString().toLowerCase(Locale.ENGLISH))) - { - throw new Exception(_("disabledToSpawnMob")); - } - if (!user.isAuthorized("essentials.spawnmob." + mobMount.name.toLowerCase())) - { - throw new Exception(_("noPermToSpawnMob")); - } - try - { - spawnedMount = mobMount.spawn(user, server, loc); - } - catch (MobException e) - { - throw new Exception(_("unableToSpawnMob"), e); - } - spawnedMob.setPassenger(spawnedMount); - } - if (mobData != null) - { - changeMobData(mob.getType(), spawnedMob, mobData, user); - } - if (spawnedMount != null && mountData != null) - { - changeMobData(mobMount.getType(), spawnedMount, mountData, user); - } - if (args.length >= 2) - { - int mobCount = Integer.parseInt(args[1]); - int serverLimit = ess.getSettings().getSpawnMobLimit(); - if (mobCount > serverLimit) - { - mobCount = serverLimit; - user.sendMessage(_("mobSpawnLimit")); - } - - try - { - for (int i = 1; i < mobCount; i++) - { - spawnedMob = mob.spawn(user, server, loc); - if (mobMount != null) - { - try - { - spawnedMount = mobMount.spawn(user, server, loc); - } - catch (MobException e) - { - throw new Exception(_("unableToSpawnMob"), e); - } - spawnedMob.setPassenger(spawnedMount); - } - if (mobData != null) - { - changeMobData(mob.getType(), spawnedMob, mobData, user); - } - if (spawnedMount != null && mountData != null) - { - changeMobData(mobMount.getType(), spawnedMount, mountData, user); - } - } - user.sendMessage(mobCount + " " + mob.name.toLowerCase(Locale.ENGLISH) + mob.suffix + " " + _("spawned")); - } - catch (MobException e1) - { - throw new Exception(_("unableToSpawnMob"), e1); - } - catch (NumberFormatException e2) - { - throw new Exception(_("numberRequired"), e2); - } - catch (NullPointerException np) - { - throw new Exception(_("soloMob"), np); - } - } - else - { - user.sendMessage(mob.name + " " + _("spawned")); + final User target = getPlayer(ess.getServer(), user, args, 2); + SpawnMob.spawnmob(ess, server, user, target, mobParts, mobData, mobCount); + return; } + + SpawnMob.spawnmob(ess, server, user, mobParts, mobData, mobCount); } - - private void changeMobData(final EntityType type, final Entity spawned, String data, final User user) throws Exception + + @Override + public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - data = data.toLowerCase(Locale.ENGLISH); - - if (spawned instanceof Slime) - { - try - { - ((Slime)spawned).setSize(Integer.parseInt(data)); - } - catch (Exception e) - { - throw new Exception(_("slimeMalformedSize"), e); - } - } - if (spawned instanceof Ageable && data.contains("baby")) - { - ((Ageable)spawned).setBaby(); - return; - } - if (spawned instanceof Colorable) - { - final String color = data.toUpperCase(Locale.ENGLISH).replace("BABY", ""); - try - { - if (color.equals("RANDOM")) - { - final Random rand = new Random(); - ((Colorable)spawned).setColor(DyeColor.values()[rand.nextInt(DyeColor.values().length)]); - } - else - { - ((Colorable)spawned).setColor(DyeColor.valueOf(color)); - } - } - catch (Exception e) - { - throw new Exception(_("sheepMalformedColor"), e); - } - } - if (spawned instanceof Tameable && data.contains("tamed")) - { - final Tameable tameable = ((Tameable)spawned); - tameable.setTamed(true); - tameable.setOwner(user.getBase()); - } - if (type == EntityType.WOLF - && data.contains("angry")) - { - ((Wolf)spawned).setAngry(true); - } - if (type == EntityType.CREEPER && data.contains("powered")) - { - ((Creeper)spawned).setPowered(true); - } - if (type == EntityType.OCELOT) - { - if (data.contains("siamese")) - { - ((Ocelot)spawned).setCatType(Ocelot.Type.SIAMESE_CAT); - } - else if (data.contains("red")) - { - ((Ocelot)spawned).setCatType(Ocelot.Type.RED_CAT); - } - else if (data.contains("black")) - { - ((Ocelot)spawned).setCatType(Ocelot.Type.BLACK_CAT); - } - } - if (type == EntityType.VILLAGER) - { - for (Profession prof : Villager.Profession.values()) - { - if (data.contains(prof.toString().toLowerCase(Locale.ENGLISH))) - { - ((Villager)spawned).setProfession(prof); - } - } - } + if (args.length < 3) + { + final String mobList = Util.joinList(Mob.getMobList()); + throw new NotEnoughArgumentsException(_("mobsAvailable", mobList)); + } + + List mobParts = SpawnMob.mobParts(args[0]); + List mobData = SpawnMob.mobData(args[0]); + int mobCount = Integer.parseInt(args[1]); + + final User target = getPlayer(ess.getServer(), args, 2, true, false); + SpawnMob.spawnmob(ess, server, sender, target, mobParts, mobData, mobCount); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspeed.java b/Essentials/src/com/earth2me/essentials/commands/Commandspeed.java new file mode 100644 index 0000000000..591ea638e4 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspeed.java @@ -0,0 +1,174 @@ +package com.earth2me.essentials.commands; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.User; +import java.util.List; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + + +public class Commandspeed extends EssentialsCommand +{ + public Commandspeed() + { + super("speed"); + } + + @Override + protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception + { + if (args.length < 2) + { + throw new NotEnoughArgumentsException(); + } + final boolean isFly = isFlyMode(args[0]); + final float speed = getMoveSpeed(args[1]); + speedOtherPlayers(server, sender, isFly, true, speed, args[2]); + } + + @Override + protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + { + if (args.length < 1) + { + throw new NotEnoughArgumentsException(); + } + + boolean isFly; + float speed; + boolean isBypass = user.isAuthorized("essentials.speed.bypass"); + if (args.length == 1) + { + isFly = flyPermCheck(user, user.isFlying()); + speed = getMoveSpeed(args[0]); + } + else + { + isFly = flyPermCheck(user, isFlyMode(args[0])); + speed = getMoveSpeed(args[1]); + if (args.length > 2 && user.isAuthorized("essentials.speed.others")) + { + speedOtherPlayers(server, user, isFly, isBypass, speed, args[2]); + return; + } + } + + if (isFly) + { + user.setFlySpeed(getRealMoveSpeed(speed, isFly, isBypass)); + user.sendMessage(_("moveSpeed", _("flying"), speed, user.getDisplayName())); + } + else + { + user.setWalkSpeed(getRealMoveSpeed(speed, isFly, isBypass)); + user.sendMessage(_("moveSpeed", _("walking"), speed, user.getDisplayName())); + } + } + + private void speedOtherPlayers(final Server server, final CommandSender sender, final boolean isFly, final boolean isBypass, final float speed, final String name) throws NotEnoughArgumentsException + { + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.vanish.interact"); + boolean foundUser = false; + final List matchedPlayers = server.matchPlayer(name); + for (Player matchPlayer : matchedPlayers) + { + final User player = ess.getUser(matchPlayer); + if (skipHidden && player.isHidden()) + { + continue; + } + foundUser = true; + if (isFly) + { + matchPlayer.setFlySpeed(getRealMoveSpeed(speed, isFly, isBypass)); + sender.sendMessage(_("moveSpeed", _("flying"), speed, matchPlayer.getDisplayName())); + } + else + { + matchPlayer.setWalkSpeed(getRealMoveSpeed(speed, isFly, isBypass)); + sender.sendMessage(_("moveSpeed", _("walking"), speed, matchPlayer.getDisplayName())); + } + } + if (!foundUser) + { + throw new NotEnoughArgumentsException(_("playerNotFound")); + } + } + + private Boolean flyPermCheck(User user, boolean input) throws Exception + { + boolean canFly = user.isAuthorized("essentials.speed.fly"); + boolean canWalk = user.isAuthorized("essentials.speed.walk"); + if (input && canFly || !input && canWalk || !canFly && !canWalk) + { + return input; + } + else if (canWalk) + { + return false; + } + return true; + } + + private boolean isFlyMode(final String modeString) throws NotEnoughArgumentsException + { + boolean isFlyMode; + if (modeString.contains("fly") || modeString.equalsIgnoreCase("f")) + { + isFlyMode = true; + } + else if (modeString.contains("walk") || modeString.contains("run") + || modeString.equalsIgnoreCase("w") || modeString.equalsIgnoreCase("r")) + { + isFlyMode = false; + } + else + { + throw new NotEnoughArgumentsException(); + } + return isFlyMode; + } + + private float getMoveSpeed(final String moveSpeed) throws NotEnoughArgumentsException + { + float userSpeed; + try + { + userSpeed = Float.parseFloat(moveSpeed); + if (userSpeed > 10f) + { + userSpeed = 10f; + } + else if (userSpeed < 0f) + { + userSpeed = 0f; + } + } + catch (NumberFormatException e) + { + throw new NotEnoughArgumentsException(); + } + return userSpeed; + } + + private float getRealMoveSpeed(final float userSpeed, final boolean isFly, final boolean isBypass) + { + final float defaultSpeed = isFly ? 0.1f : 0.2f; + float maxSpeed = 1f; + if (!isBypass) + { + maxSpeed = (float)(isFly ? ess.getSettings().getMaxFlySpeed() : ess.getSettings().getMaxWalkSpeed()); + } + + if (userSpeed < 1f) + { + return defaultSpeed * userSpeed; + } + else + { + float ratio = ((userSpeed - 1) / 9) * (maxSpeed - defaultSpeed); + return ratio + defaultSpeed; + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsudo.java b/Essentials/src/com/earth2me/essentials/commands/Commandsudo.java index 23083fa3d8..2d91657d6a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsudo.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsudo.java @@ -2,10 +2,13 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; -import com.earth2me.essentials.Util; +import java.util.Locale; +import java.util.logging.Level; +import java.util.logging.Logger; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; +import org.bukkit.entity.Player; public class Commandsudo extends EssentialsCommand @@ -14,6 +17,7 @@ public Commandsudo() { super("sudo"); } + private static final Logger LOGGER = Logger.getLogger("Minecraft"); @Override public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception @@ -23,7 +27,16 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0, false); + final User user = getPlayer(server, args, 0, true, false); + if(args[1].toLowerCase(Locale.ENGLISH).startsWith("c:")) + { + if (user.isAuthorized("essentials.sudo.exempt") && sender instanceof Player) + { + throw new Exception(_("sudoExempt")); + } + user.chat(getFinalArg(args, 1).substring(2)); + return; + } final String command = args[1]; final String[] arguments = new String[args.length - 2]; if (arguments.length > 0) @@ -31,7 +44,7 @@ public void run(final Server server, final CommandSender sender, final String co System.arraycopy(args, 2, arguments, 0, args.length - 2); } - if (user.isAuthorized("essentials.sudo.exempt")) + if (user.isAuthorized("essentials.sudo.exempt") && sender instanceof Player) { throw new Exception(_("sudoExempt")); } @@ -41,8 +54,19 @@ public void run(final Server server, final CommandSender sender, final String co final PluginCommand execCommand = ess.getServer().getPluginCommand(command); if (execCommand != null) { - execCommand.execute(user.getBase(), command, arguments); + ess.scheduleSyncDelayedTask( + new Runnable() + { + @Override + public void run() + { + LOGGER.log(Level.INFO, String.format("[Sudo] %s issued server command: /%s %s", user.getName(), command, getFinalArg(arguments, 0))); + execCommand.execute(user.getBase(), command, arguments); + } + }); + } + else { + sender.sendMessage(_("errorCallingCommand", command)); } - } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java index 84c9fc4896..6cae113d9a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java @@ -19,8 +19,12 @@ public void run(final Server server, final User user, final String commandLabel, EntityDamageEvent ede = new EntityDamageEvent(user.getBase(), EntityDamageEvent.DamageCause.SUICIDE, Short.MAX_VALUE); server.getPluginManager().callEvent(ede); user.damage(Short.MAX_VALUE); + if (user.getHealth() > 0) + { + user.setHealth(0); + } user.sendMessage(_("suicideMessage")); user.setDisplayNick(); - ess.broadcastMessage(user,_("suicideSuccess", user.getDisplayName())); + ess.broadcastMessage(user, _("suicideSuccess", user.getDisplayName())); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java b/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java index 0549e9c0d1..b0384d5d02 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java @@ -4,6 +4,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; import com.earth2me.essentials.Util; +import java.util.GregorianCalendar; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -23,7 +24,7 @@ public void run(final Server server, final CommandSender sender, final String co { throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0, true); + final User user = getPlayer(server, args, 0, true, true); if (!user.isOnline()) { if (sender instanceof Player @@ -35,7 +36,7 @@ public void run(final Server server, final CommandSender sender, final String co } else { - if (user.isAuthorized("essentials.tempban.exempt")) + if (user.isAuthorized("essentials.tempban.exempt") && sender instanceof Player) { sender.sendMessage(_("tempbanExempt")); return; @@ -44,6 +45,13 @@ public void run(final Server server, final CommandSender sender, final String co final String time = getFinalArg(args, 1); final long banTimestamp = Util.parseDateDiff(time, true); + final long maxBanLength = ess.getSettings().getMaxTempban() * 1000; + if (maxBanLength > 0 && ((banTimestamp - GregorianCalendar.getInstance().getTimeInMillis()) > maxBanLength) && !(ess.getUser(sender).isAuthorized("essentials.tempban.unlimited"))) + { + sender.sendMessage(_("oversizedTempban")); + throw new NoChargeException(); + } + final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; final String banReason = _("tempBanned", Util.formatDateDiff(banTimestamp), senderName); user.setBanReason(banReason); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtime.java b/Essentials/src/com/earth2me/essentials/commands/Commandtime.java index 8e5b7c017a..92d5643911 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtime.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtime.java @@ -20,10 +20,16 @@ public Commandtime() @Override public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { + boolean add = false; final List argList = new ArrayList(Arrays.asList(args)); - if ((argList.remove("set") || argList.remove("add")) && Util.isInt(argList.get(0))) + if (argList.remove("set") && !argList.isEmpty() && Util.isInt(argList.get(0))) { - ess.getLogger().info("debug edited 0" + argList.get(0).toString()); + argList.set(0, argList.get(0) + "t"); + } + if (argList.remove("add") && !argList.isEmpty() && Util.isInt(argList.get(0))) + { + add = true; + argList.set(0, argList.get(0) + "t"); } final String[] validArgs = argList.toArray(new String[0]); @@ -34,12 +40,27 @@ public void run(final Server server, final CommandSender sender, final String co worldSelector = validArgs[1]; } final Set worlds = getWorlds(server, sender, worldSelector); + final String setTime; // If no arguments we are reading the time if (validArgs.length == 0) { - getWorldsTime(sender, worlds); - return; + if (commandLabel.equalsIgnoreCase("day") || commandLabel.equalsIgnoreCase("eday")) + { + setTime = "day"; + } + else if (commandLabel.equalsIgnoreCase("night") || commandLabel.equalsIgnoreCase("enight")) + { + setTime = "night"; + } + else + { + getWorldsTime(sender, worlds); + return; + } + } + else { + setTime = validArgs[0]; } final User user = ess.getUser(sender); @@ -53,14 +74,14 @@ public void run(final Server server, final CommandSender sender, final String co long ticks; try { - ticks = DescParseTickFormat.parse(validArgs[0]); + ticks = DescParseTickFormat.parse(setTime); } catch (NumberFormatException e) { throw new NotEnoughArgumentsException(e); } - setWorldsTime(sender, worlds, ticks); + setWorldsTime(sender, worlds, ticks, add); } /** @@ -84,14 +105,17 @@ private void getWorldsTime(final CommandSender sender, final Collection w /** * Used to set the time and inform of the change */ - private void setWorldsTime(final CommandSender sender, final Collection worlds, final long ticks) + private void setWorldsTime(final CommandSender sender, final Collection worlds, final long ticks, final boolean add) { // Update the time for (World world : worlds) { long time = world.getTime(); - time -= time % 24000; - world.setTime(time + 24000 + ticks); + if (!add) + { + time -= time % 24000; + } + world.setTime(time + (add ? 0 : 24000) + ticks); } final StringBuilder output = new StringBuilder(); @@ -159,4 +183,4 @@ public int compare(final World a, final World b) { return a.getName().compareTo(b.getName()); } -} +} \ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java b/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java index 3240b73a90..70a922b7c4 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java @@ -23,7 +23,7 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - final User player = getPlayer(server, args, 0, true); + final User player = getPlayer(server, args, 0, true, true); if (args.length >= 2 && !player.isJailed()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtop.java b/Essentials/src/com/earth2me/essentials/commands/Commandtop.java index e91d0984ad..89c5c6f8f0 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtop.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtop.java @@ -20,8 +20,10 @@ public void run(final Server server, final User user, final String commandLabel, { final int topX = user.getLocation().getBlockX(); final int topZ = user.getLocation().getBlockZ(); - final int topY = user.getWorld().getHighestBlockYAt(topX, topZ); - user.getTeleport().teleport(new Location(user.getWorld(), user.getLocation().getX(), topY + 1, user.getLocation().getZ()), new Trade(this.getName(), ess), TeleportCause.COMMAND); + final float pitch = user.getLocation().getPitch(); + final float yaw = user.getLocation().getYaw(); + final Location location = new Location(user.getWorld(), topX, user.getWorld().getMaxHeight(), topZ, yaw, pitch); + user.getTeleport().teleport(location, new Trade(this.getName(), ess), TeleportCause.COMMAND); user.sendMessage(_("teleportTop")); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtp.java b/Essentials/src/com/earth2me/essentials/commands/Commandtp.java index d6d6b76f98..efaf32f65b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtp.java @@ -4,6 +4,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; +import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -31,22 +32,43 @@ public void run(final Server server, final User user, final String commandLabel, throw new Exception(_("teleportDisabled", player.getDisplayName())); } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + player.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + player.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + player.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + player.getWorld().getName())); } user.sendMessage(_("teleporting")); final Trade charge = new Trade(this.getName(), ess); charge.isAffordableFor(user); user.getTeleport().teleport(player, charge, TeleportCause.COMMAND); throw new NoChargeException(); - - default: + case 4: if (!user.isAuthorized("essentials.tp.others")) { throw new Exception(_("noPerm", "essentials.tp.others")); } + final User target2 = getPlayer(server, args, 0); + final double x = args[1].startsWith("~") ? target2.getLocation().getX() + Integer.parseInt(args[1].substring(1)) : Integer.parseInt(args[1]); + final double y = args[2].startsWith("~") ? target2.getLocation().getY() + Integer.parseInt(args[2].substring(1)) : Integer.parseInt(args[2]); + final double z = args[3].startsWith("~") ? target2.getLocation().getZ() + Integer.parseInt(args[3].substring(1)) : Integer.parseInt(args[3]); + if (x > 30000000 || y > 30000000 || z > 30000000 || x < -30000000 || y < -30000000 || z < -30000000) + { + throw new NotEnoughArgumentsException("Value of coordinates cannot be over 30000000"); //TODO: I18n + } + final Location location = new Location(target2.getWorld(), x, y, z, target2.getLocation().getYaw(), target2.getLocation().getPitch()); + if (!target2.isTeleportEnabled()) + { + throw new Exception(_("teleportDisabled", target2.getDisplayName())); + } + target2.getTeleport().now(location, false, TeleportCause.COMMAND); user.sendMessage(_("teleporting")); + target2.sendMessage(_("teleporting")); + break; + case 2: + default: + if (!user.isAuthorized("essentials.tp.others")) + { + throw new Exception(_("noPerm", "essentials.tp.others")); + } final User target = getPlayer(server, args, 0); final User toPlayer = getPlayer(server, args, 1); if (!target.isTeleportEnabled()) @@ -58,11 +80,12 @@ public void run(final Server server, final User user, final String commandLabel, throw new Exception(_("teleportDisabled", toPlayer.getDisplayName())); } if (target.getWorld() != toPlayer.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + toPlayer.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + toPlayer.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + toPlayer.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + toPlayer.getWorld().getName())); } target.getTeleport().now(toPlayer, false, TeleportCause.COMMAND); + user.sendMessage(_("teleporting")); target.sendMessage(_("teleportAtoB", user.getDisplayName(), toPlayer.getDisplayName())); break; } @@ -76,10 +99,28 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - sender.sendMessage(_("teleporting")); final User target = getPlayer(server, args, 0); - final User toPlayer = getPlayer(server, args, 1); - target.getTeleport().now(toPlayer, false, TeleportCause.COMMAND); - target.sendMessage(_("teleportAtoB", Console.NAME, toPlayer.getDisplayName())); + if (args.length == 2) + { + final User toPlayer = getPlayer(server, args, 1); + target.getTeleport().now(toPlayer, false, TeleportCause.COMMAND); + target.sendMessage(_("teleportAtoB", Console.NAME, toPlayer.getDisplayName())); + } + else if (args.length > 3) + { + final double x = args[1].startsWith("~") ? target.getLocation().getX() + Integer.parseInt(args[1].substring(1)) : Integer.parseInt(args[1]); + final double y = args[2].startsWith("~") ? target.getLocation().getY() + Integer.parseInt(args[2].substring(1)) : Integer.parseInt(args[2]); + final double z = args[3].startsWith("~") ? target.getLocation().getZ() + Integer.parseInt(args[3].substring(1)) : Integer.parseInt(args[3]); + if (x > 30000000 || y > 30000000 || z > 30000000 || x < -30000000 || y < -30000000 || z < -30000000) + { + throw new NotEnoughArgumentsException("Value of coordinates cannot be over 30000000"); //TODO: I18n + } + final Location location = new Location(target.getWorld(), x, y, z, target.getLocation().getYaw(), target.getLocation().getPitch()); + target.getTeleport().now(location, false, TeleportCause.COMMAND); + target.sendMessage(_("teleporting")); + } else { + throw new NotEnoughArgumentsException(); + } + sender.sendMessage(_("teleporting")); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java index d94f0aca52..6603896943 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java @@ -26,9 +26,9 @@ public void run(Server server, User user, String commandLabel, String[] args) th throw new Exception(_("teleportDisabled", player.getDisplayName())); } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + player.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + player.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + player.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + player.getWorld().getName())); } if (!player.isIgnoredPlayer(user)) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java index 7af445c514..8f77441ecb 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java @@ -46,7 +46,7 @@ private void teleportAAllPlayers(final Server server, final CommandSender sender continue; } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + user.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + user.getWorld().getName())) { continue; } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java index 9203f9015c..7c950ae969 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java @@ -1,5 +1,6 @@ package com.earth2me.essentials.commands; +import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; @@ -27,14 +28,14 @@ public void run(final Server server, final User user, final String commandLabel, if (user.isTpRequestHere() && ((!target.isAuthorized("essentials.tpahere") && !target.isAuthorized("essentials.tpaall")) || (user.getWorld() != target.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + user.getWorld().getName())))) + && !user.isAuthorized("essentials.worlds." + user.getWorld().getName())))) { throw new Exception(_("noPendingRequest")); } if (!user.isTpRequestHere() && (!target.isAuthorized("essentials.tpa") || (user.getWorld() != target.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + target.getWorld().getName())))) + && !user.isAuthorized("essentials.worlds." + target.getWorld().getName())))) { throw new Exception(_("noPendingRequest")); } @@ -52,25 +53,26 @@ public void run(final Server server, final User user, final String commandLabel, } final Trade charge = new Trade(this.getName(), ess); - if (user.isTpRequestHere()) - { - charge.isAffordableFor(user); - } - else - { - charge.isAffordableFor(target); - } user.sendMessage(_("requestAccepted")); target.sendMessage(_("requestAcceptedFrom", user.getDisplayName())); - if (user.isTpRequestHere()) + try { - user.getTeleport().teleport(target, charge, TeleportCause.COMMAND); + if (user.isTpRequestHere()) + { + target.getTeleport().teleportToMe(user, charge, TeleportCause.COMMAND); + } + else + { + target.getTeleport().teleport(user, charge, TeleportCause.COMMAND); + } } - else + catch (ChargeException ex) { - target.getTeleport().teleport(user, charge, TeleportCause.COMMAND); + user.sendMessage(_("pendingTeleportCancelled")); + ess.showError(target, ex, commandLabel); } user.requestTeleport(null, false); + throw new NoChargeException(); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java index 9d389ecac0..e130949ad2 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java @@ -26,13 +26,14 @@ public void run(final Server server, final User user, final String commandLabel, throw new Exception(_("teleportDisabled", player.getDisplayName())); } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + user.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + user.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + user.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + user.getWorld().getName())); } player.requestTeleport(user, true); player.sendMessage(_("teleportHereRequest", user.getDisplayName())); player.sendMessage(_("typeTpaccept")); + player.sendMessage(_("typeTpdeny")); if (ess.getSettings().getTpaAcceptCancellation() != 0) { player.sendMessage(_("teleportRequestTimeoutInfo", ess.getSettings().getTpaAcceptCancellation())); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpall.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpall.java index 6335a4a54f..e94e91d42a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpall.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpall.java @@ -43,7 +43,7 @@ private void teleportAllPlayers(Server server, CommandSender sender, User user) continue; } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + user.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + user.getWorld().getName())) { continue; } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java index 92eb87226b..76041ca6c9 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java @@ -23,11 +23,11 @@ public void run(final Server server, final User user, final String commandLabel, throw new Exception(_("teleportDisabled", player.getDisplayName())); } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + user.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + user.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + user.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + user.getWorld().getName())); } - player.getTeleport().teleport(user, new Trade(this.getName(), ess), TeleportCause.COMMAND); + user.getTeleport().teleportToMe(player, new Trade(this.getName(), ess), TeleportCause.COMMAND); user.sendMessage(_("teleporting")); player.sendMessage(_("teleporting")); throw new NoChargeException(); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java index 4d7ced4784..50c239c389 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java @@ -22,15 +22,15 @@ public void run(final Server server, final User user, final String commandLabel, throw new NotEnoughArgumentsException(); case 1: - final User player = getPlayer(server, args, 0, true); - if (!player.isOnline() || (player.isHidden() && !user.isAuthorized("essentials.teleport.hidden"))) + final User player = getPlayer(server, args, 0, true, false); + if (player.isHidden() && !user.isAuthorized("essentials.teleport.hidden")) { throw new NoSuchFieldException(_("playerNotFound")); } if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + player.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + player.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + player.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + player.getWorld().getName())); } user.sendMessage(_("teleporting")); user.getTeleport().now(player, false, TeleportCause.COMMAND); @@ -42,19 +42,18 @@ public void run(final Server server, final User user, final String commandLabel, throw new Exception(_("noPerm", "essentials.tp.others")); } user.sendMessage(_("teleporting")); - final User target = getPlayer(server, args, 0, true); - final User toPlayer = getPlayer(server, args, 1, true); + final User target = getPlayer(server, args, 0, true, false); + final User toPlayer = getPlayer(server, args, 1, true, false); - if (!target.isOnline() || !toPlayer.isOnline() - || ((target.isHidden() || toPlayer.isHidden()) && !user.isAuthorized("essentials.teleport.hidden"))) + if ((target.isHidden() || toPlayer.isHidden()) && !user.isAuthorized("essentials.teleport.hidden")) { throw new NoSuchFieldException(_("playerNotFound")); } if (target.getWorld() != toPlayer.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + toPlayer.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + toPlayer.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + toPlayer.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + toPlayer.getWorld().getName())); } target.getTeleport().now(toPlayer, false, TeleportCause.COMMAND); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java index 880c4e3629..50f4d74fe2 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java @@ -22,18 +22,12 @@ public void run(final Server server, final User user, final String commandLabel, } //Just basically the old tphere command - final User player = getPlayer(server, args, 0, true); - - // Check if user is offline - if (!player.isOnline()) - { - throw new NoSuchFieldException(_("playerNotFound")); - } + final User player = getPlayer(server, args, 0, true, false); if (user.getWorld() != player.getWorld() && ess.getSettings().isWorldTeleportPermissions() - && !user.isAuthorized("essentials.world." + user.getWorld().getName())) + && !user.isAuthorized("essentials.worlds." + user.getWorld().getName())) { - throw new Exception(_("noPerm", "essentials.world." + user.getWorld().getName())); + throw new Exception(_("noPerm", "essentials.worlds." + user.getWorld().getName())); } // Verify permission diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java b/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java index 75910cd856..b1a41fc4c4 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java @@ -24,10 +24,10 @@ public void run(final Server server, final User user, final String commandLabel, throw new NotEnoughArgumentsException(); } - final int x = Integer.parseInt(args[0]); - final int y = Integer.parseInt(args[1]); - final int z = Integer.parseInt(args[2]); - final Location location = new Location(user.getWorld(), x, y, z); + final double x = args[0].startsWith("~") ? user.getLocation().getX() + Integer.parseInt(args[0].substring(1)) : Integer.parseInt(args[0]); + final double y = args[1].startsWith("~") ? user.getLocation().getY() + Integer.parseInt(args[1].substring(1)) : Integer.parseInt(args[1]); + final double z = args[2].startsWith("~") ? user.getLocation().getZ() + Integer.parseInt(args[2].substring(1)) : Integer.parseInt(args[2]); + final Location location = new Location(user.getWorld(), x, y, z, user.getLocation().getYaw(), user.getLocation().getPitch()); if (args.length > 3) { location.setYaw((Float.parseFloat(args[3]) + 180 + 360) % 360); @@ -36,6 +36,10 @@ public void run(final Server server, final User user, final String commandLabel, { location.setPitch(Float.parseFloat(args[4])); } + if (x > 30000000 || y > 30000000 || z > 30000000 || x < -30000000 || y < -30000000 || z < -30000000) + { + throw new NotEnoughArgumentsException("Value of coordinates cannot be over 30000000"); //TODO: I18n + } final Trade charge = new Trade(this.getName(), ess); charge.isAffordableFor(user); user.sendMessage(_("teleporting")); @@ -51,11 +55,11 @@ public void run(final Server server, final CommandSender sender, final String co throw new NotEnoughArgumentsException(); } - User user = ess.getUser(server.getPlayer(args[0])); - final int x = Integer.parseInt(args[1]); - final int y = Integer.parseInt(args[2]); - final int z = Integer.parseInt(args[3]); - final Location location = new Location(user.getWorld(), x, y, z); + User user = getPlayer(server, args, 0, true, false); + final double x = args[1].startsWith("~") ? user.getLocation().getX() + Integer.parseInt(args[1].substring(1)) : Integer.parseInt(args[1]); + final double y = args[2].startsWith("~") ? user.getLocation().getY() + Integer.parseInt(args[2].substring(1)) : Integer.parseInt(args[2]); + final double z = args[3].startsWith("~") ? user.getLocation().getZ() + Integer.parseInt(args[3].substring(1)) : Integer.parseInt(args[3]); + final Location location = new Location(user.getWorld(), x, y, z, user.getLocation().getYaw(), user.getLocation().getPitch()); if (args.length > 4) { location.setYaw((Float.parseFloat(args[4]) + 180 + 360) % 360); @@ -64,8 +68,13 @@ public void run(final Server server, final CommandSender sender, final String co { location.setPitch(Float.parseFloat(args[5])); } + if (x > 30000000 || y > 30000000 || z > 30000000 || x < -30000000 || y < -30000000 || z < -30000000) + { + throw new NotEnoughArgumentsException("Value of coordinates cannot be over 30000000"); //TODO: I18n + } sender.sendMessage(_("teleporting")); user.sendMessage(_("teleporting")); user.getTeleport().teleport(location, null, TeleportCause.COMMAND); + } -} \ No newline at end of file +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java b/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java index 1fc4c2aa4e..948ead3914 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java @@ -2,7 +2,10 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import java.util.List; import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; public class Commandtptoggle extends EssentialsCommand @@ -12,11 +15,67 @@ public Commandtptoggle() super("tptoggle"); } + @Override + public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception + { + if (args.length < 1) + { + throw new NotEnoughArgumentsException(); + } + + toggleOtherPlayers(server, sender, args); + } + @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - user.sendMessage(user.toggleTeleportEnabled() - ? _("teleportationEnabled") - : _("teleportationDisabled")); + if (args.length > 0 && args[0].trim().length() > 2 && user.isAuthorized("essentials.tptoggle.others")) + { + toggleOtherPlayers(server, user, args); + return; + } + + user.sendMessage(user.toggleTeleportEnabled() ? _("teleportationEnabled") : _("teleportationDisabled")); + } + + private void toggleOtherPlayers(final Server server, final CommandSender sender, final String[] args) throws NotEnoughArgumentsException + { + boolean skipHidden = sender instanceof Player && !ess.getUser(sender).isAuthorized("essentials.teleport.hidden"); + boolean foundUser = false; + final List matchedPlayers = server.matchPlayer(args[0]); + for (Player matchPlayer : matchedPlayers) + { + final User player = ess.getUser(matchPlayer); + if (skipHidden && player.isHidden()) + { + continue; + } + foundUser = true; + if (args.length > 1) + { + if (args[1].contains("on") || args[1].contains("ena") || args[1].equalsIgnoreCase("1")) + { + player.setTeleportEnabled(true); + } + else + { + player.setTeleportEnabled(false); + } + } + else + { + player.toggleTeleportEnabled(); + } + + final boolean enabled = player.isTeleportEnabled(); + + + player.sendMessage(enabled ? _("teleportationEnabled") : _("teleportationDisabled")); + sender.sendMessage(enabled ? _("teleportationEnabledFor", matchPlayer.getDisplayName()) : _("teleportationDisabledFor", matchPlayer.getDisplayName())); + } + if (!foundUser) + { + throw new NotEnoughArgumentsException(_("playerNotFound")); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunban.java b/Essentials/src/com/earth2me/essentials/commands/Commandunban.java index dda1475d0f..718f7f2edb 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandunban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandunban.java @@ -1,9 +1,13 @@ 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.OfflinePlayer; import org.bukkit.Server; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; public class Commandunban extends EssentialsCommand @@ -20,16 +24,35 @@ public void run(final Server server, final CommandSender sender, final String co { throw new NotEnoughArgumentsException(); } - + String name; try { - final User player = getPlayer(server, args, 0, true); - player.setBanned(false); - sender.sendMessage(_("unbannedPlayer")); + final User user = getPlayer(server, args, 0, true, true); + name = user.getName(); + user.setBanned(false); + user.setBanTimeout(0); } catch (NoSuchFieldException e) { - throw new Exception(_("playerNotFound"), e); + final OfflinePlayer player = server.getOfflinePlayer(args[0]); + name = player.getName(); + if (!player.isBanned()) + { + throw new Exception(_("playerNotFound"), e); + } + player.setBanned(false); + } + + final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; + server.getLogger().log(Level.INFO, _("playerUnbanned", senderName, name)); + + for (Player onlinePlayer : server.getOnlinePlayers()) + { + final User onlineUser = ess.getUser(onlinePlayer); + if (onlinePlayer == sender || onlineUser.isAuthorized("essentials.ban.notify")) + { + onlinePlayer.sendMessage(_("playerUnbanned", senderName, name)); + } } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java index c539a596c7..15bb8f5c26 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java @@ -1,9 +1,13 @@ package com.earth2me.essentials.commands; +import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; +import java.util.logging.Level; import org.bukkit.Server; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; public class Commandunbanip extends EssentialsCommand @@ -20,15 +24,32 @@ public void run(final Server server, final CommandSender sender, final String co { throw new NotEnoughArgumentsException(); } - try + String ipAddress; + if (Util.validIP(args[0])) { - final User user = getPlayer(server, args, 0, true); - ess.getServer().unbanIP(user.getLastLoginAddress()); + ipAddress = args[0]; } - catch (Exception ex) + else { + final User user = getPlayer(server, args, 0, true, true); + ipAddress = user.getLastLoginAddress(); + if (ipAddress.isEmpty()) + { + throw new PlayerNotFoundException(); + } + } + + ess.getServer().unbanIP(ipAddress); + final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; + server.getLogger().log(Level.INFO, _("playerUnbanIpAddress", senderName, ipAddress)); + + for (Player onlinePlayer : server.getOnlinePlayers()) + { + final User onlineUser = ess.getUser(onlinePlayer); + if (onlinePlayer == sender || onlineUser.isAuthorized("essentials.ban.notify")) + { + onlinePlayer.sendMessage(_("playerUnbanIpAddress", senderName, ipAddress)); + } } - ess.getServer().unbanIP(args[0]); - sender.sendMessage(_("unbannedIP")); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunlimited.java b/Essentials/src/com/earth2me/essentials/commands/Commandunlimited.java index 585fec3b3a..c70490c3f8 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandunlimited.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandunlimited.java @@ -1,7 +1,6 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.User; import java.util.List; import java.util.Locale; @@ -29,7 +28,7 @@ public void run(final Server server, final User user, final String commandLabel, if (args.length > 1 && user.isAuthorized("essentials.unlimited.others")) { - target = getPlayer(server, args, 1); + target = getPlayer(server, user, args, 1); } if (args[0].equalsIgnoreCase("list")) @@ -103,7 +102,7 @@ private Boolean toggleUnlimited(final User user, final User target, final String { message = "enableUnlimited"; enableUnlimited = true; - if (!InventoryWorkaround.containsItem(target.getInventory(), true, true, stack)) + if (!target.getInventory().containsAtLeast(stack, stack.getAmount())) { target.getInventory().addItem(stack); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java b/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java index 84df12900a..dab972b26d 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java @@ -37,14 +37,11 @@ public void run(final Server server, final User user, final String commandLabel, } if (args.length > 0) { + //TODO: Remove 'otherplayers' permission. User otherUser = null; - if (args.length == 2 && user.isAuthorized("essentials.warp.otherplayers")) + if (args.length == 2 && (user.isAuthorized("essentials.warp.otherplayers") || user.isAuthorized("essentials.warp.others"))) { - otherUser = ess.getUser(server.getPlayer(args[1])); - if (otherUser == null) - { - throw new Exception(_("playerNotFound")); - } + otherUser = getPlayer(server, args, 1, user.isAuthorized("essentials.teleport.hidden"), false); warpUser(user, otherUser, args[0]); throw new NoChargeException(); } @@ -56,16 +53,12 @@ public void run(final Server server, final User user, final String commandLabel, @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(); } - User otherUser = ess.getUser(server.getPlayer(args[1])); - if (otherUser == null) - { - throw new Exception(_("playerNotFound")); - } + User otherUser = getPlayer(server, args, 1, true, false); otherUser.getTeleport().warp(args[0], null, TeleportCause.COMMAND); throw new NoChargeException(); @@ -87,14 +80,14 @@ private void warpList(final CommandSender sender, final String[] args) throws Ex while (iterator.hasNext()) { final String warpName = iterator.next(); - if (ess.getSettings().getPerWarpPermission() && !((User)sender).isAuthorized("essentials.warp." + warpName)) + if (ess.getSettings().getPerWarpPermission() && !((User)sender).isAuthorized("essentials.warps." + warpName)) { iterator.remove(); } } } int page = 1; - if (args.length > 0) + if (args.length > 0 && Util.isInt(args[0])) { page = Integer.parseInt(args[0]); } @@ -105,7 +98,7 @@ private void warpList(final CommandSender sender, final String[] args) throws Ex if (warpNameList.size() > WARPS_PER_PAGE) { sender.sendMessage(_("warpsCount", warpNameList.size(), page, (int)Math.ceil(warpNameList.size() / (double)WARPS_PER_PAGE))); - sender.sendMessage(warpList); + sender.sendMessage(_("warpList", warpList)); } else { @@ -120,10 +113,10 @@ private void warpUser(final User owner, final User user, final String name) thro final double fullCharge = chargeWarp.getCommandCost(user) + chargeCmd.getCommandCost(user); final Trade charge = new Trade(fullCharge, ess); charge.isAffordableFor(owner); - if (ess.getSettings().getPerWarpPermission() && !owner.isAuthorized("essentials.warp." + name)) + if (ess.getSettings().getPerWarpPermission() && !owner.isAuthorized("essentials.warps." + name)) { throw new Exception(_("warpUsePermission")); } user.getTeleport().warp(name, charge, TeleportCause.COMMAND); } -} \ No newline at end of file +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandweather.java b/Essentials/src/com/earth2me/essentials/commands/Commandweather.java index 1229c9ee44..dc9f767d57 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandweather.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandweather.java @@ -18,12 +18,27 @@ public Commandweather() @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { + final boolean isStorm; if (args.length < 1) { - throw new NotEnoughArgumentsException(); + if (commandLabel.equalsIgnoreCase("sun") || commandLabel.equalsIgnoreCase("esun")) + { + isStorm = false; + } + else if (commandLabel.equalsIgnoreCase("storm") || commandLabel.equalsIgnoreCase("estorm") + || commandLabel.equalsIgnoreCase("rain") || commandLabel.equalsIgnoreCase("erain")) + { + isStorm = true; + } + else + { + throw new NotEnoughArgumentsException(); + } + } + else + { + isStorm = args[0].equalsIgnoreCase("storm"); } - - final boolean isStorm = args[0].equalsIgnoreCase("storm"); final World world = user.getWorld(); if (args.length > 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandworkbench.java b/Essentials/src/com/earth2me/essentials/commands/Commandworkbench.java new file mode 100644 index 0000000000..265c519ab7 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandworkbench.java @@ -0,0 +1,20 @@ +package com.earth2me.essentials.commands; + +import com.earth2me.essentials.User; +import org.bukkit.Server; + + +public class Commandworkbench extends EssentialsCommand +{ + public Commandworkbench() + { + super("workbench"); + } + + + @Override + public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + { + user.openWorkbench(null, true); + } +} \ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandworld.java b/Essentials/src/com/earth2me/essentials/commands/Commandworld.java index 647115d664..b0559a4a09 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandworld.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandworld.java @@ -54,9 +54,9 @@ protected void run(final Server server, final User user, final String commandLab } } - if (ess.getSettings().isWorldTeleportPermissions() && !user.isAuthorized("essentials.world." + world.getName())) + if (ess.getSettings().isWorldTeleportPermissions() && !user.isAuthorized("essentials.worlds." + world.getName())) { - throw new Exception(_("noPerm", "essentials.world." + world.getName())); + throw new Exception(_("noPerm", "essentials.worlds." + world.getName())); } double factor; diff --git a/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java index 6bc0649e90..0573c02d81 100644 --- a/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java @@ -45,10 +45,15 @@ public String getName() protected User getPlayer(final Server server, final String[] args, final int pos) throws NoSuchFieldException, NotEnoughArgumentsException { - return getPlayer(server, args, pos, false); + return getPlayer(server, args, pos, false, false); + } + + protected User getPlayer(final Server server, final User user, final String[] args, final int pos) throws NoSuchFieldException, NotEnoughArgumentsException + { + return getPlayer(server, args, pos, user.isAuthorized("essentials.vanish.interact"), false); } - protected User getPlayer(final Server server, final String[] args, final int pos, final boolean getOffline) throws NoSuchFieldException, NotEnoughArgumentsException + protected User getPlayer(final Server server, final String[] args, final int pos, boolean getHidden, final boolean getOffline) throws NoSuchFieldException, NotEnoughArgumentsException { if (args.length <= pos) { @@ -56,14 +61,18 @@ protected User getPlayer(final Server server, final String[] args, final int pos } if (args[pos].isEmpty()) { - throw new NoSuchFieldException(_("playerNotFound")); + throw new PlayerNotFoundException(); } final User user = ess.getUser(args[pos]); if (user != null) { - if (!getOffline && (!user.isOnline() || user.isHidden())) + if (!getOffline && !user.isOnline()) + { + throw new PlayerNotFoundException(); + } + if (!getHidden && user.isHidden()) { - throw new NoSuchFieldException(_("playerNotFound")); + throw new PlayerNotFoundException(); } return user; } @@ -74,18 +83,18 @@ protected User getPlayer(final Server server, final String[] args, final int pos for (Player player : matches) { final User userMatch = ess.getUser(player); - if (userMatch.getDisplayName().startsWith(args[pos]) && (getOffline || !userMatch.isHidden())) + if (userMatch.getDisplayName().startsWith(args[pos]) && (getHidden || !userMatch.isHidden())) { return userMatch; } } final User userMatch = ess.getUser(matches.get(0)); - if (getOffline || !userMatch.isHidden()) + if (getHidden || !userMatch.isHidden()) { return userMatch; } } - throw new NoSuchFieldException(_("playerNotFound")); + throw new PlayerNotFoundException(); } @Override diff --git a/Essentials/src/com/earth2me/essentials/commands/PlayerNotFoundException.java b/Essentials/src/com/earth2me/essentials/commands/PlayerNotFoundException.java new file mode 100644 index 0000000000..c33e875227 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/PlayerNotFoundException.java @@ -0,0 +1,11 @@ +package com.earth2me.essentials.commands; + +import static com.earth2me.essentials.I18n._; + +public class PlayerNotFoundException extends NoSuchFieldException +{ + public PlayerNotFoundException() + { + super(_("playerNotFound")); + } +} diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/FakeInventory.java b/Essentials/src/com/earth2me/essentials/craftbukkit/FakeInventory.java deleted file mode 100644 index 8456c956e6..0000000000 --- a/Essentials/src/com/earth2me/essentials/craftbukkit/FakeInventory.java +++ /dev/null @@ -1,243 +0,0 @@ -package com.earth2me.essentials.craftbukkit; - -import java.util.HashMap; -import java.util.List; -import java.util.ListIterator; -import org.bukkit.Material; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; - - -public class FakeInventory implements Inventory -{ - ItemStack[] items; - - public FakeInventory(ItemStack[] items) - { - this.items = new ItemStack[items.length]; - for (int i = 0; i < items.length; i++) - { - if (items[i] == null) - { - continue; - } - this.items[i] = items[i].clone(); - } - } - - @Override - public int getSize() - { - return items.length; - } - - @Override - public String getName() - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public ItemStack getItem(int i) - { - return items[i]; - } - - @Override - public void setItem(int i, ItemStack is) - { - items[i] = is; - } - - @Override - public HashMap addItem(ItemStack... iss) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public HashMap removeItem(ItemStack... iss) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public ItemStack[] getContents() - { - return items; - } - - @Override - public void setContents(ItemStack[] iss) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean contains(int i) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean contains(Material mtrl) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean contains(ItemStack is) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean contains(int i, int i1) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean contains(Material mtrl, int i) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean contains(ItemStack is, int i) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public HashMap all(int i) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public HashMap all(Material mtrl) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public HashMap all(ItemStack is) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int first(int i) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int first(Material mtrl) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int first(ItemStack is) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int firstEmpty() - { - for (int i = 0; i < items.length; i++) - { - if (items[i] == null || items[i].getTypeId() == 0) { - return i; - } - } - return -1; - } - - @Override - public void remove(int i) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void remove(Material mtrl) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void remove(ItemStack is) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void clear(int i) - { - items[i] = null; - } - - @Override - public void clear() - { - for (int i = 0; i < items.length; i++) - { - items[i] = null; - } - } - - @Override - public List getViewers() - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public String getTitle() - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public InventoryType getType() - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public InventoryHolder getHolder() - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public ListIterator iterator() - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int getMaxStackSize() - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void setMaxStackSize(int size) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public ListIterator iterator(int index) - { - throw new UnsupportedOperationException("Not supported yet."); - } -} diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/FakeWorld.java b/Essentials/src/com/earth2me/essentials/craftbukkit/FakeWorld.java index ce617fcd56..df7a237fac 100644 --- a/Essentials/src/com/earth2me/essentials/craftbukkit/FakeWorld.java +++ b/Essentials/src/com/earth2me/essentials/craftbukkit/FakeWorld.java @@ -669,4 +669,76 @@ public void setWaterAnimalSpawnLimit(int arg0) { throw new UnsupportedOperationException("Not supported yet."); } + + @Override + public Entity spawnEntity(Location lctn, EntityType et) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isChunkInUse(int x, int z) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public FallingBlock spawnFallingBlock(Location location, Material material, byte data) throws IllegalArgumentException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public FallingBlock spawnFallingBlock(Location location, int blockId, byte blockData) throws IllegalArgumentException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void playSound(Location arg0, Sound arg1, float arg2, float arg3) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getAmbientSpawnLimit() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setAmbientSpawnLimit(int i) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String[] getGameRules() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getGameRuleValue(String string) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean setGameRuleValue(String string, String string1) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isGameRule(String string) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean createExplosion(double d, double d1, double d2, float f, boolean bln, boolean bln1) + { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/InventoryWorkaround.java b/Essentials/src/com/earth2me/essentials/craftbukkit/InventoryWorkaround.java index fc9cbb74b2..2e05f5c43f 100644 --- a/Essentials/src/com/earth2me/essentials/craftbukkit/InventoryWorkaround.java +++ b/Essentials/src/com/earth2me/essentials/craftbukkit/InventoryWorkaround.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.Map; +import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -15,49 +16,17 @@ private InventoryWorkaround() { } - public static int first(final Inventory inventory, final ItemStack item, final boolean enforceDurability, final boolean enforceAmount, final boolean enforceEnchantments) - { - return next(inventory, item, 0, enforceDurability, enforceAmount, enforceEnchantments); - } - - public static int next(final Inventory cinventory, final ItemStack item, final int start, final boolean enforceDurability, final boolean enforceAmount, final boolean enforceEnchantments) - { - final ItemStack[] inventory = cinventory.getContents(); - for (int i = start; i < inventory.length; i++) - { - final ItemStack cItem = inventory[i]; - if (cItem == null) - { - continue; - } - if (item.getTypeId() == cItem.getTypeId() && (!enforceAmount || item.getAmount() == cItem.getAmount()) && (!enforceDurability || cItem.getDurability() == item.getDurability()) && (!enforceEnchantments || cItem.getEnchantments().equals(item.getEnchantments()))) - { - return i; - } - } - return -1; - } - - public static int firstPartial(final Inventory cinventory, final ItemStack item, final boolean enforceDurability) - { - return firstPartial(cinventory, item, enforceDurability, item.getType().getMaxStackSize()); - } - - public static int firstPartial(final Inventory cinventory, final ItemStack item, final boolean enforceDurability, final int maxAmount) + private static int firstPartial(final Inventory inventory, final ItemStack item, final int maxAmount) { if (item == null) { return -1; } - final ItemStack[] inventory = cinventory.getContents(); - for (int i = 0; i < inventory.length; i++) + final ItemStack[] stacks = inventory.getContents(); + for (int i = 0; i < stacks.length; i++) { - final ItemStack cItem = inventory[i]; - if (cItem == null) - { - continue; - } - if (item.getTypeId() == cItem.getTypeId() && cItem.getAmount() < maxAmount && (!enforceDurability || cItem.getDurability() == item.getDurability()) && cItem.getEnchantments().equals(item.getEnchantments())) + final ItemStack cItem = stacks[i]; + if (cItem != null && cItem.getAmount() < maxAmount && cItem.isSimilar(item)) { return i; } @@ -65,26 +34,24 @@ public static int firstPartial(final Inventory cinventory, final ItemStack item, return -1; } - public static boolean addAllItems(final Inventory cinventory, final boolean enforceDurability, final ItemStack... items) + public static boolean addAllItems(final Inventory inventory, final ItemStack... items) { - final Inventory fake = new FakeInventory(cinventory.getContents()); - if (addItem(fake, enforceDurability, items).isEmpty()) + final Inventory fakeInventory = Bukkit.getServer().createInventory(null, inventory.getType()); + fakeInventory.setContents(inventory.getContents()); + if (addItems(fakeInventory, items).isEmpty()) { - addItem(cinventory, enforceDurability, items); + addItems(inventory, items); return true; } - else - { - return false; - } + return false; } - public static Map addItem(final Inventory cinventory, final boolean forceDurability, final ItemStack... items) + public static Map addItems(final Inventory inventory, final ItemStack... items) { - return addItem(cinventory, forceDurability, 0, items); + return addOversizedItems(inventory, 0, items); } - public static Map addItem(final Inventory cinventory, final boolean enforceDurability, final int oversizedStacks, final ItemStack... items) + public static Map addOversizedItems(final Inventory inventory, final int oversizedStacks, final ItemStack... items) { final Map leftover = new HashMap(); @@ -95,7 +62,7 @@ public static Map addItem(final Inventory cinventory, final // combine items - ItemStack[] combined = new ItemStack[items.length]; + final ItemStack[] combined = new ItemStack[items.length]; for (int i = 0; i < items.length; i++) { if (items[i] == null || items[i].getAmount() < 1) @@ -109,7 +76,7 @@ public static Map addItem(final Inventory cinventory, final combined[j] = items[i].clone(); break; } - if (combined[j].getTypeId() == items[i].getTypeId() && (!enforceDurability || combined[j].getDurability() == items[i].getDurability()) && combined[j].getEnchantments().equals(items[i].getEnchantments())) + if (combined[j].isSimilar(items[i])) { combined[j].setAmount(combined[j].getAmount() + items[i].getAmount()); break; @@ -130,13 +97,13 @@ public static Map addItem(final Inventory cinventory, final { // Do we already have a stack of it? final int maxAmount = oversizedStacks > item.getType().getMaxStackSize() ? oversizedStacks : item.getType().getMaxStackSize(); - final int firstPartial = firstPartial(cinventory, item, enforceDurability, maxAmount); + final int firstPartial = firstPartial(inventory, item, maxAmount); // Drat! no partial stack if (firstPartial == -1) { // Find a free spot! - final int firstFree = cinventory.firstEmpty(); + final int firstFree = inventory.firstEmpty(); if (firstFree == -1) { @@ -151,13 +118,13 @@ public static Map addItem(final Inventory cinventory, final { final ItemStack stack = item.clone(); stack.setAmount(maxAmount); - cinventory.setItem(firstFree, stack); + inventory.setItem(firstFree, stack); item.setAmount(item.getAmount() - maxAmount); } else { // Just store it - cinventory.setItem(firstFree, item); + inventory.setItem(firstFree, item); break; } } @@ -165,7 +132,7 @@ public static Map addItem(final Inventory cinventory, final else { // So, apparently it might only partially fit, well lets do just that - final ItemStack partialItem = cinventory.getItem(firstPartial); + final ItemStack partialItem = inventory.getItem(firstPartial); final int amount = item.getAmount(); final int partialAmount = partialItem.getAmount(); @@ -185,138 +152,4 @@ public static Map addItem(final Inventory cinventory, final } return leftover; } - - public static Map removeItem(final Inventory cinventory, final boolean enforceDurability, final boolean enforceEnchantments, final ItemStack... items) - { - final Map leftover = new HashMap(); - - // TODO: optimization - - for (int i = 0; i < items.length; i++) - { - final ItemStack item = items[i]; - if (item == null) - { - continue; - } - int toDelete = item.getAmount(); - - while (true) - { - - // Bail when done - if (toDelete <= 0) - { - break; - } - - // get first Item, ignore the amount - final int first = first(cinventory, item, enforceDurability, false, enforceEnchantments); - - // Drat! we don't have this type in the inventory - if (first == -1) - { - item.setAmount(toDelete); - leftover.put(i, item); - break; - } - else - { - final ItemStack itemStack = cinventory.getItem(first); - final int amount = itemStack.getAmount(); - - if (amount <= toDelete) - { - toDelete -= amount; - // clear the slot, all used up - cinventory.clear(first); - } - else - { - // split the stack and store - itemStack.setAmount(amount - toDelete); - cinventory.setItem(first, itemStack); - toDelete = 0; - } - } - } - } - return leftover; - } - - public static boolean containsItem(final Inventory cinventory, final boolean enforceDurability, final boolean enforceEnchantments, final ItemStack... items) - { - final Map leftover = new HashMap(); - - // TODO: optimization - - // combine items - - ItemStack[] combined = new ItemStack[items.length]; - for (int i = 0; i < items.length; i++) - { - if (items[i] == null) - { - continue; - } - for (int j = 0; j < combined.length; j++) - { - if (combined[j] == null) - { - combined[j] = items[i].clone(); - break; - } - if (combined[j].getTypeId() == items[i].getTypeId() && (!enforceDurability || combined[j].getDurability() == items[i].getDurability()) && (!enforceEnchantments || combined[j].getEnchantments().equals(items[i].getEnchantments()))) - { - combined[j].setAmount(combined[j].getAmount() + items[i].getAmount()); - break; - } - } - } - - for (int i = 0; i < combined.length; i++) - { - final ItemStack item = combined[i]; - if (item == null) - { - continue; - } - int mustHave = item.getAmount(); - int position = 0; - - while (true) - { - // Bail when done - if (mustHave <= 0) - { - break; - } - - final int slot = next(cinventory, item, position, enforceDurability, false, enforceEnchantments); - - // Drat! we don't have this type in the inventory - if (slot == -1) - { - leftover.put(i, item); - break; - } - else - { - final ItemStack itemStack = cinventory.getItem(slot); - final int amount = itemStack.getAmount(); - - if (amount <= mustHave) - { - mustHave -= amount; - } - else - { - mustHave = 0; - } - position = slot + 1; - } - } - } - return leftover.isEmpty(); - } } diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/SetExpFix.java b/Essentials/src/com/earth2me/essentials/craftbukkit/SetExpFix.java index b788fa7ee7..e484ebfe1c 100644 --- a/Essentials/src/com/earth2me/essentials/craftbukkit/SetExpFix.java +++ b/Essentials/src/com/earth2me/essentials/craftbukkit/SetExpFix.java @@ -16,13 +16,13 @@ public static void setTotalExperience(final Player player, final int exp) player.setExp(0); player.setLevel(0); player.setTotalExperience(0); - + //This following code is technically redundant now, as bukkit now calulcates levels more or less correctly //At larger numbers however... player.getExp(3000), only seems to give 2999, putting the below calculations off. int amount = exp; while (amount > 0) { - final int expToLevel = getExpToLevel(player); + final int expToLevel = getExpAtLevel(player); amount -= expToLevel; if (amount >= 0) { @@ -39,27 +39,64 @@ public static void setTotalExperience(final Player player, final int exp) } } - private static int getExpToLevel(final Player player) - { - return getExpToLevel(player.getLevel()); + private static int getExpAtLevel(final Player player) + { + return getExpAtLevel(player.getLevel()); } - - private static int getExpToLevel(final int level) - { - return 7 + (level * 7 >> 1); + + public static int getExpAtLevel(final int level) + { + if (level > 29) + { + return 62 + (level - 30) * 7; + } + if (level > 15) + { + return 17 + (level - 15) * 3; + } + return 17; } + public static int getExpToLevel(final int level) + { + int currentLevel = 0; + int exp = 0; + + while (currentLevel < level) + { + exp += getExpAtLevel(currentLevel); + currentLevel++; + } + if (exp < 0) + { + exp = Integer.MAX_VALUE; + } + return exp; + } + //This method is required because the bukkit player.getTotalExperience() method, shows exp that has been 'spent'. //Without this people would be able to use exp and then still sell it. public static int getTotalExperience(final Player player) { - int exp = (int)Math.round(getExpToLevel(player) * player.getExp()); + int exp = (int)Math.round(getExpAtLevel(player) * player.getExp()); int currentLevel = player.getLevel(); - - while (currentLevel > 0) { + + while (currentLevel > 0) + { currentLevel--; - exp += getExpToLevel(currentLevel); + exp += getExpAtLevel(currentLevel); + } + if (exp < 0) + { + exp = Integer.MAX_VALUE; } return exp; } + + public static int getExpUntilNextLevel(final Player player) + { + int exp = (int)Math.round(getExpAtLevel(player) * player.getExp()); + int nextLevel = player.getLevel(); + return getExpAtLevel(nextLevel) - exp; + } } diff --git a/Essentials/src/com/earth2me/essentials/metrics/Metrics.java b/Essentials/src/com/earth2me/essentials/metrics/Metrics.java index f361e4f506..77e68a9d6d 100644 --- a/Essentials/src/com/earth2me/essentials/metrics/Metrics.java +++ b/Essentials/src/com/earth2me/essentials/metrics/Metrics.java @@ -35,6 +35,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.scheduler.BukkitTask; /** @@ -51,7 +52,7 @@ public class Metrics /** * The current revision number */ - private final static int REVISION = 5; + private final static int REVISION = 6; /** * The base url of the metrics domain */ @@ -60,10 +61,6 @@ public class Metrics * The url used to report a server's status */ private static final String REPORT_URL = "/report/%s"; - /** - * The file where guid and opt out is stored in - */ - private static final String CONFIG_FILE = "plugins/PluginMetrics/config.yml"; /** * The separator to use for custom data. This MUST NOT change unless you are hosting your own version of metrics and * want to change it. @@ -97,14 +94,18 @@ public class Metrics * Unique server id */ private final String guid; + /** + * Debug mode + */ + private final boolean debug; /** * Lock for synchronization */ private final Object optOutLock = new Object(); /** - * Id of the scheduled task + * The scheduled task */ - private volatile int taskId = -1; + private volatile BukkitTask task = null; public Metrics(final Plugin plugin) throws IOException { @@ -116,29 +117,31 @@ public Metrics(final Plugin plugin) throws IOException this.plugin = plugin; // load the config - configurationFile = new File(CONFIG_FILE); + configurationFile = getConfigFile(); configuration = YamlConfiguration.loadConfiguration(configurationFile); // add some defaults configuration.addDefault("opt-out", false); configuration.addDefault("guid", UUID.randomUUID().toString()); + configuration.addDefault("debug", false); // Do we need to create the file? if (configuration.get("guid", null) == null) { - configuration.options().header("http://metrics.griefcraft.com").copyDefaults(true); + configuration.options().header("http://mcstats.org").copyDefaults(true); configuration.save(configurationFile); } // Load the guid then guid = configuration.getString("guid"); + debug = configuration.getBoolean("debug", false); } /** * Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics * website. Plotters can be added to the graph object returned. * - * @param name + * @param name The name of the graph * @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given */ public Graph createGraph(final String name) @@ -161,7 +164,7 @@ public Graph createGraph(final String name) /** * Adds a custom data plotter to the default graph * - * @param plotter + * @param plotter The plotter to use to plot custom data */ public void addCustomData(final Plotter plotter) { @@ -193,7 +196,7 @@ public void start() } // Begin hitting the server with glorious data - taskId = plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() + task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() { private boolean firstPost = true; @@ -205,10 +208,15 @@ public void run() synchronized (optOutLock) { // Disable Task, if it is running and the server owner decided to opt-out - if (isOptOut() && taskId > 0) + if (isOptOut() && task != null) { - plugin.getServer().getScheduler().cancelTask(taskId); - taskId = -1; + task.cancel(); + task = null; + // Tell all plotters to stop gathering information. + for (Graph graph : graphs) + { + graph.onOptOut(); + } } } @@ -223,7 +231,10 @@ public void run() } catch (IOException e) { - Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage()); + if (debug) + { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage()); + } } } }, 0, PING_INTERVAL * 1200); @@ -233,7 +244,7 @@ public void run() /** * Has the server owner denied plugin metrics? * - * @return + * @return true if metrics should be opted out of it */ public boolean isOptOut() { @@ -242,16 +253,22 @@ public boolean isOptOut() try { // Reload the metrics file - configuration.load(CONFIG_FILE); + configuration.load(getConfigFile()); } catch (IOException ex) { - Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + if (debug) + { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + } return true; } catch (InvalidConfigurationException ex) { - Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + if (debug) + { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + } return true; } return configuration.getBoolean("opt-out", false); @@ -276,7 +293,7 @@ public void enable() throws IOException } // Enable Task, if it is not running - if (taskId < 0) + if (task == null) { start(); } @@ -297,35 +314,81 @@ public void disable() throws IOException if (!isOptOut()) { configuration.set("opt-out", true); - final File file = new File(CONFIG_FILE); - configuration.save(file); + configuration.save(configurationFile); } // Disable Task, if it is running - if (taskId >= 0) + if (task != null) { - this.plugin.getServer().getScheduler().cancelTask(taskId); - taskId = -1; + task.cancel(); + task = null; } } } + /** + * Gets the File object of the config file that should be used to store data such as the GUID and opt-out status + * + * @return the File object for the config file + */ + public File getConfigFile() + { + // I believe the easiest way to get the base folder (e.g craftbukkit set via -P) for plugins to use + // is to abuse the plugin object we already have + // plugin.getDataFolder() => base/plugins/PluginA/ + // pluginsFolder => base/plugins/ + // The base is not necessarily relative to the startup directory. + File pluginsFolder = plugin.getDataFolder().getParentFile(); + + // return => base/plugins/PluginMetrics/config.yml + return new File(new File(pluginsFolder, "PluginMetrics"), "config.yml"); + } + /** * Generic method that posts a plugin to the metrics website */ private void postPlugin(final boolean isPing) throws IOException { - // The plugin's description file containg all of the plugin data such as name, version, author, etc - final PluginDescriptionFile description = plugin.getDescription(); + // Server software specific section + PluginDescriptionFile description = plugin.getDescription(); + String pluginName = description.getName(); + boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled + String pluginVersion = description.getVersion(); + String serverVersion = Bukkit.getVersion(); + int playersOnline = Bukkit.getServer().getOnlinePlayers().length; + + // END server software specific section -- all code below does not use any code outside of this class / Java // Construct the post data final StringBuilder data = new StringBuilder(); + + // The plugin's description file containg all of the plugin data such as name, version, author, etc data.append(encode("guid")).append('=').append(encode(guid)); - encodeDataPair(data, "version", description.getVersion()); - encodeDataPair(data, "server", Bukkit.getVersion()); - encodeDataPair(data, "players", Integer.toString(Bukkit.getServer().getOnlinePlayers().length)); + encodeDataPair(data, "version", pluginVersion); + encodeDataPair(data, "server", serverVersion); + encodeDataPair(data, "players", Integer.toString(playersOnline)); encodeDataPair(data, "revision", String.valueOf(REVISION)); + // New data as of R6 + String osname = System.getProperty("os.name"); + String osarch = System.getProperty("os.arch"); + String osversion = System.getProperty("os.version"); + String java_version = System.getProperty("java.version"); + int coreCount = Runtime.getRuntime().availableProcessors(); + + // normalize os arch .. amd64 -> x86_64 + if (osarch.equals("amd64")) + { + osarch = "x86_64"; + } + + encodeDataPair(data, "osname", osname); + encodeDataPair(data, "osarch", osarch); + encodeDataPair(data, "osversion", osversion); + encodeDataPair(data, "cores", Integer.toString(coreCount)); + encodeDataPair(data, "online-mode", Boolean.toString(onlineMode)); + encodeDataPair(data, "java_version", java_version); + // If we're pinging, append it if (isPing) { @@ -342,10 +405,6 @@ private void postPlugin(final boolean isPing) throws IOException { final Graph graph = iter.next(); - // Because we have a lock on the graphs set already, it is reasonable to assume - // that our lock transcends down to the individual plotters in the graphs also. - // Because our methods are private, no one but us can reasonably access this list - // without reflection so this is a safe assumption without adding more code. for (Plotter plotter : graph.getPlotters()) { // The key name to send to the metrics server @@ -364,7 +423,7 @@ private void postPlugin(final boolean isPing) throws IOException } // Create the url - final URL url = new URL(BASE_URL + String.format(REPORT_URL, description.getName())); + URL url = new URL(BASE_URL + String.format(REPORT_URL, encode(pluginName))); // Connect to the website URLConnection connection; @@ -420,13 +479,12 @@ private void postPlugin(final boolean isPing) throws IOException } } } - //if (response.startsWith("OK")) - We should get "OK" followed by an optional description if everything goes right } /** * Check if mineshafter is present. If it is, we need to bypass it to send POST requests * - * @return + * @return true if mineshafter is installed on the server */ private boolean isMineshafterPresent() { @@ -450,10 +508,9 @@ private boolean isMineshafterPresent() * encodeDataPair(data, "version", description.getVersion()); * * - * @param buffer - * @param key - * @param value - * @return + * @param buffer the stringbuilder to append the data pair onto + * @param key the key value + * @param value the value */ private static void encodeDataPair(final StringBuilder buffer, final String key, final String value) throws UnsupportedEncodingException { @@ -463,8 +520,8 @@ private static void encodeDataPair(final StringBuilder buffer, final String key, /** * Encode text as UTF-8 * - * @param text - * @return + * @param text the text to encode + * @return the encoded text, as UTF-8 */ private static String encode(final String text) throws UnsupportedEncodingException { @@ -495,7 +552,7 @@ private Graph(final String name) /** * Gets the graph's name * - * @return + * @return the Graph's name */ public String getName() { @@ -505,7 +562,7 @@ public String getName() /** * Add a plotter to the graph, which will be used to plot entries * - * @param plotter + * @param plotter the plotter to add to the graph */ public void addPlotter(final Plotter plotter) { @@ -515,7 +572,7 @@ public void addPlotter(final Plotter plotter) /** * Remove a plotter from the graph * - * @param plotter + * @param plotter the plotter to remove from the graph */ public void removePlotter(final Plotter plotter) { @@ -525,7 +582,7 @@ public void removePlotter(final Plotter plotter) /** * Gets an unmodifiable set of the plotter objects in the graph * - * @return + * @return an unmodifiable {@link Set} of the plotter objects */ public Set getPlotters() { @@ -549,6 +606,13 @@ public boolean equals(final Object object) final Graph graph = (Graph)object; return graph.name.equals(name); } + + /** + * Called when the server owner decides to opt-out of Metrics while the server is running. + */ + protected void onOptOut() + { + } } @@ -573,7 +637,7 @@ public Plotter() /** * Construct a plotter with a specific plot name * - * @param name + * @param name the name of the plotter to use, which will show up on the website */ public Plotter(final String name) { @@ -581,9 +645,11 @@ public Plotter(final String name) } /** - * Get the current value for the plotted point + * Get the current value for the plotted point. Since this function defers to an external function it may or may + * not return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called + * from any thread so care should be taken when accessing resources that need to be synchronized. * - * @return + * @return the current value for the point to be plotted. */ public abstract int getValue(); @@ -607,7 +673,7 @@ public void reset() @Override public int hashCode() { - return getColumnName().hashCode() + getValue(); + return getColumnName().hashCode(); } @Override diff --git a/Essentials/src/com/earth2me/essentials/metrics/MetricsListener.java b/Essentials/src/com/earth2me/essentials/metrics/MetricsListener.java index 4af8f9173e..695426529b 100644 --- a/Essentials/src/com/earth2me/essentials/metrics/MetricsListener.java +++ b/Essentials/src/com/earth2me/essentials/metrics/MetricsListener.java @@ -4,7 +4,6 @@ import com.earth2me.essentials.User; import java.util.logging.Level; import org.bukkit.Server; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -34,7 +33,7 @@ public void onPlayerJoin(final PlayerJoinEvent event) player.sendMessage("To opt out, run /essentials opt-out"); ess.getLogger().log(Level.INFO, "[Metrics] Admin join - Starting 5 minute opt-out period."); ess.getSettings().setMetricsEnabled(true); - ess.getScheduler().scheduleAsyncDelayedTask(ess, starter, 5 * 1200); + ess.runTaskLaterAsynchronously(starter, 5 * 1200); } } } diff --git a/Essentials/src/com/earth2me/essentials/metrics/MetricsStarter.java b/Essentials/src/com/earth2me/essentials/metrics/MetricsStarter.java index 0ea692cc9f..b22e8470d4 100644 --- a/Essentials/src/com/earth2me/essentials/metrics/MetricsStarter.java +++ b/Essentials/src/com/earth2me/essentials/metrics/MetricsStarter.java @@ -5,8 +5,10 @@ import com.earth2me.essentials.metrics.Metrics.Plotter; import com.earth2me.essentials.register.payment.Method; import com.earth2me.essentials.register.payment.methods.VaultEco; +import com.earth2me.essentials.signs.EssentialsSign; import java.util.Locale; import java.util.logging.Level; +import org.bukkit.configuration.ConfigurationSection; public class MetricsStarter implements Runnable @@ -18,6 +20,7 @@ public class MetricsStarter implements Runnable private enum Modules { Essentials, + EssentialsAntiBuild, EssentialsAntiCheat, EssentialsChat, EssentialsSpawn, @@ -99,7 +102,12 @@ public int getValue() @Override public int getValue() { - return ess.getSettings().getKits().getKeys(false).size(); + ConfigurationSection kits = ess.getSettings().getKits(); + if (kits == null) + { + return 0; + } + return kits.getKeys(false).size(); } }); featureGraph.addPlotter(new Plotter("Warps") @@ -122,7 +130,7 @@ public int getValue() { enabledGraph.addPlotter(new SimplePlotter("Jails")); } - if (ess.getSettings().getKits().getKeys(false).size() > 0) + if (ess.getSettings().getKits() != null && ess.getSettings().getKits().getKeys(false).size() > 0) { enabledGraph.addPlotter(new SimplePlotter("Kits")); } @@ -130,6 +138,14 @@ public int getValue() { enabledGraph.addPlotter(new SimplePlotter("Warps")); } + if (ess.getSettings().getTeleportCooldown() > 0) + { + enabledGraph.addPlotter(new SimplePlotter("TeleportCooldown")); + } + if (ess.getSettings().getTeleportDelay() > 0) + { + enabledGraph.addPlotter(new SimplePlotter("TeleportDelay")); + } if (!ess.getSettings().areSignsDisabled()) { enabledGraph.addPlotter(new SimplePlotter("Signs")); @@ -138,6 +154,14 @@ public int getValue() { enabledGraph.addPlotter(new SimplePlotter("AutoAFK")); } + if (ess.getSettings().changePlayerListName()) + { + enabledGraph.addPlotter(new SimplePlotter("PlayerListName")); + } + if (ess.getSettings().getOperatorColor() != null) + { + enabledGraph.addPlotter(new SimplePlotter("OpColour")); + } if (ess.getSettings().changeDisplayName()) { enabledGraph.addPlotter(new SimplePlotter("DisplayName")); @@ -169,6 +193,12 @@ public int getValue() } depGraph.addPlotter(new SimplePlotter(ess.getPermissionsHandler().getName())); + final Graph signGraph = metrics.createGraph("Signs"); + for (EssentialsSign sign : ess.getSettings().enabledSigns()) + { + signGraph.addPlotter(new SimplePlotter(sign.getName())); + } + metrics.start(); } diff --git a/Essentials/src/com/earth2me/essentials/perm/BPermissions2Handler.java b/Essentials/src/com/earth2me/essentials/perm/BPermissions2Handler.java index f4122bf539..791ffbe92b 100644 --- a/Essentials/src/com/earth2me/essentials/perm/BPermissions2Handler.java +++ b/Essentials/src/com/earth2me/essentials/perm/BPermissions2Handler.java @@ -1,9 +1,6 @@ package com.earth2me.essentials.perm; import de.bananaco.bpermissions.api.ApiLayer; -import de.bananaco.bpermissions.api.World; -import de.bananaco.bpermissions.api.WorldManager; -import de.bananaco.bpermissions.api.util.Calculable; import de.bananaco.bpermissions.api.util.CalculableType; import java.util.Arrays; import java.util.List; @@ -38,13 +35,13 @@ public List getGroups(final Player base) @Override public boolean inGroup(final Player base, final String group) { - return ApiLayer.hasGroup(base.getWorld().getName(), CalculableType.USER, base.getName(), group); + return ApiLayer.hasGroupRecursive(base.getWorld().getName(), CalculableType.USER, base.getName(), group); } @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 diff --git a/Essentials/src/com/earth2me/essentials/perm/BPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/BPermissionsHandler.java index fea268f908..a542c3d666 100644 --- a/Essentials/src/com/earth2me/essentials/perm/BPermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/BPermissionsHandler.java @@ -56,7 +56,7 @@ public boolean inGroup(final Player base, final String group) @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 diff --git a/Essentials/src/com/earth2me/essentials/perm/ConfigPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/ConfigPermissionsHandler.java index fad479444f..9396bd4ad2 100644 --- a/Essentials/src/com/earth2me/essentials/perm/ConfigPermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/ConfigPermissionsHandler.java @@ -1,12 +1,11 @@ package com.earth2me.essentials.perm; import com.earth2me.essentials.IEssentials; -import java.util.List; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -public class ConfigPermissionsHandler implements IPermissionsHandler +public class ConfigPermissionsHandler extends SuperpermsHandler { private final transient IEssentials ess; @@ -15,47 +14,17 @@ public ConfigPermissionsHandler(final Plugin ess) this.ess = (IEssentials)ess; } - @Override - public String getGroup(final Player base) - { - return null; - } - - @Override - public List getGroups(final Player base) - { - return null; - } - @Override public boolean canBuild(final Player base, final String group) { return true; } - @Override - public boolean inGroup(final Player base, final String group) - { - return false; - } - @Override public boolean hasPermission(final Player base, final String node) { final String[] cmds = node.split("\\.", 2); - return !ess.getSettings().isCommandRestricted(cmds[cmds.length - 1]) - && ess.getSettings().isPlayerCommand(cmds[cmds.length - 1]); + return ess.getSettings().isPlayerCommand(cmds[cmds.length - 1]) || super.hasPermission(base, node); } - @Override - public String getPrefix(final Player base) - { - return null; - } - - @Override - public String getSuffix(final Player base) - { - return null; - } } diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsBukkitHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsBukkitHandler.java index aef6401d9f..771a4c7193 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PermissionsBukkitHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsBukkitHandler.java @@ -78,6 +78,6 @@ public boolean inGroup(final Player base, final String group) @Override public boolean canBuild(Player base, String group) { - return hasPermission(base, "essentials.build") || hasPermission(base, "permissions.build"); + return false; } } diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsExHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsExHandler.java index 5d8e62232a..68dc3fe504 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PermissionsExHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsExHandler.java @@ -8,7 +8,7 @@ import ru.tehkode.permissions.bukkit.PermissionsEx; -public class PermissionsExHandler implements IPermissionsHandler +public class PermissionsExHandler extends SuperpermsHandler { private final transient PermissionManager manager; @@ -45,10 +45,10 @@ public boolean canBuild(final Player base, final String group) final PermissionUser user = manager.getUser(base.getName()); if (user == null) { - return true; + return false; } - return user.getOptionBoolean("build", base.getWorld().getName(), true); + return user.getOptionBoolean("build", base.getWorld().getName(), false); } @Override @@ -66,7 +66,7 @@ public boolean inGroup(final Player base, final String group) @Override public boolean hasPermission(final Player base, final String node) { - return manager.has(base.getName(), node, base.getWorld().getName()); + return super.hasPermission(base, node); } @Override diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java index e1bf13d109..c5653b0ad1 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java @@ -134,6 +134,17 @@ public void checkPermissions() return; } + final Plugin simplyPermsPlugin = pluginManager.getPlugin("SimplyPerms"); + if (simplyPermsPlugin != null && simplyPermsPlugin.isEnabled()) + { + if (!(handler instanceof SimplyPermsHandler)) + { + LOGGER.log(Level.INFO, "Essentials: Using SimplyPerms based permissions."); + handler = new SimplyPermsHandler(simplyPermsPlugin); + } + return; + } + final Plugin privPlugin = pluginManager.getPlugin("Privileges"); if (privPlugin != null && privPlugin.isEnabled()) { @@ -200,7 +211,8 @@ public void checkPermissions() { if (!(handler instanceof ConfigPermissionsHandler)) { - LOGGER.log(Level.INFO, "Essentials: Using config based permissions. Enable superperms in config."); + LOGGER.log(Level.INFO, "Essentials: Using config file enhanced permissions."); + LOGGER.log(Level.INFO, "Permissions listed in as player-commands will be given to all users."); handler = new ConfigPermissionsHandler(plugin); } } diff --git a/Essentials/src/com/earth2me/essentials/perm/PrivilegesHandler.java b/Essentials/src/com/earth2me/essentials/perm/PrivilegesHandler.java index 6cc97f30e3..03db3502b7 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PrivilegesHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PrivilegesHandler.java @@ -55,7 +55,7 @@ public boolean inGroup(final Player base, final String group) @Override public boolean canBuild(Player base, String group) { - return hasPermission(base, "essentials.build") || hasPermission(base, "privileges.build"); + return hasPermission(base, "privileges.build"); } } diff --git a/Essentials/src/com/earth2me/essentials/perm/SimplyPermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/SimplyPermsHandler.java new file mode 100644 index 0000000000..ee9dc7148a --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/perm/SimplyPermsHandler.java @@ -0,0 +1,56 @@ +package com.earth2me.essentials.perm; + +import java.util.List; +import net.crystalyx.bukkit.simplyperms.SimplyAPI; +import net.crystalyx.bukkit.simplyperms.SimplyPlugin; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public class SimplyPermsHandler extends SuperpermsHandler +{ + + private final transient SimplyAPI api; + + public SimplyPermsHandler(final Plugin plugin) + { + this.api = ((SimplyPlugin) plugin).getAPI(); + } + + @Override + public String getGroup(final Player base) + { + final List groups = api.getPlayerGroups(base.getName()); + if (groups == null || groups.isEmpty()) + { + return null; + } + return groups.get(0); + } + + @Override + public List getGroups(final Player base) + { + return api.getPlayerGroups(base.getName()); + } + + @Override + public boolean inGroup(final Player base, final String group) + { + final List groups = api.getPlayerGroups(base.getName()); + for (String group1 : groups) + { + if (group1.equalsIgnoreCase(group)) + { + return true; + } + } + return false; + } + + @Override + public boolean canBuild(Player base, String group) + { + return hasPermission(base, "essentials.build") || hasPermission(base, "permissions.allow.build"); + } + +} diff --git a/Essentials/src/com/earth2me/essentials/perm/SuperpermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/SuperpermsHandler.java index 2e767cb724..0b4b930583 100644 --- a/Essentials/src/com/earth2me/essentials/perm/SuperpermsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/SuperpermsHandler.java @@ -21,7 +21,7 @@ public List getGroups(final Player base) @Override public boolean canBuild(final Player base, final String group) { - return hasPermission(base, "essentials.build"); + return false; } @Override @@ -31,25 +31,26 @@ public boolean inGroup(final Player base, final String group) } @Override - public boolean hasPermission(final Player base, final String node) + public boolean hasPermission(final Player base, String node) { - if (base.hasPermission("-" + node)) + String permCheck = node; + int index; + while (true) { - return false; - } - final String[] parts = node.split("\\."); - final StringBuilder builder = new StringBuilder(node.length()); - for (String part : parts) - { - builder.append('*'); - if (base.hasPermission(builder.toString())) + if (base.isPermissionSet(permCheck)) { - return true; + return base.hasPermission(permCheck); } - builder.deleteCharAt(builder.length() - 1); - builder.append(part).append('.'); + + index = node.lastIndexOf('.'); + if (index < 1) + { + return base.hasPermission("*"); + } + + node = node.substring(0, index); + permCheck = node + ".*"; } - return base.hasPermission(node); } @Override diff --git a/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java b/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java index f0a8171f39..b1863c4871 100644 --- a/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java +++ b/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java @@ -1,13 +1,11 @@ package com.earth2me.essentials.register.payment.methods; +import com.earth2me.essentials.register.payment.Method; import net.milkbowl.vault.Vault; import net.milkbowl.vault.economy.Economy; - import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; -import com.earth2me.essentials.register.payment.Method; - public class VaultEco implements Method { diff --git a/Essentials/src/com/earth2me/essentials/settings/Backup.java b/Essentials/src/com/earth2me/essentials/settings/Backup.java deleted file mode 100644 index f43af47c01..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/Backup.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/Chat.java b/Essentials/src/com/earth2me/essentials/settings/Chat.java deleted file mode 100644 index 623228c4e6..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/Chat.java +++ /dev/null @@ -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}"; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/Commands.java b/Essentials/src/com/earth2me/essentials/settings/Commands.java deleted file mode 100644 index 08efc881c5..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/Commands.java +++ /dev/null @@ -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 overwritten = new ArrayList(); - @ListType - @Comment("Disabled commands will be completelly unavailable on the server.") - private List disabled = new ArrayList(); -} diff --git a/Essentials/src/com/earth2me/essentials/settings/Economy.java b/Essentials/src/com/earth2me/essentials/settings/Economy.java deleted file mode 100644 index 5872dada9c..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/Economy.java +++ /dev/null @@ -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 commandCosts = new HashMap(); - @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(); -} diff --git a/Essentials/src/com/earth2me/essentials/settings/General.java b/Essentials/src/com/earth2me/essentials/settings/General.java deleted file mode 100644 index a7cf537bb9..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/General.java +++ /dev/null @@ -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!"; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/GroupOptions.java b/Essentials/src/com/earth2me/essentials/settings/GroupOptions.java deleted file mode 100644 index 7b16a471bf..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/GroupOptions.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/Groups.java b/Essentials/src/com/earth2me/essentials/settings/Groups.java deleted file mode 100644 index 5e67db8903..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/Groups.java +++ /dev/null @@ -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 groups = new LinkedHashMap(); -} diff --git a/Essentials/src/com/earth2me/essentials/settings/Locations.java b/Essentials/src/com/earth2me/essentials/settings/Locations.java deleted file mode 100644 index 7e7f1a63d4..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/Locations.java +++ /dev/null @@ -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 jails = new HashMap(); - @MapValueType(Location.class) - Map warps = new HashMap(); - @MapValueType(Location.class) - Map spawns = new HashMap(); -} diff --git a/Essentials/src/com/earth2me/essentials/settings/Settings.java b/Essentials/src/com/earth2me/essentials/settings/Settings.java deleted file mode 100644 index 4c2ff2dd9b..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/Settings.java +++ /dev/null @@ -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(); -} diff --git a/Essentials/src/com/earth2me/essentials/settings/Worth.java b/Essentials/src/com/earth2me/essentials/settings/Worth.java deleted file mode 100644 index 707f907cf4..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/Worth.java +++ /dev/null @@ -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 sell = new HashMap(); - @MapKeyType(MaterialData.class) - @MapValueType(Double.class) - private Map buy = new HashMap(); - @MapKeyType(EnchantmentLevel.class) - @MapValueType(Double.class) - private Map enchantmentMultiplier = new HashMap(); - - public Worth() - { - sell.put(new MaterialData(Material.APPLE, (byte)0), 1.0); - } -} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Afk.java b/Essentials/src/com/earth2me/essentials/settings/commands/Afk.java deleted file mode 100644 index 80cae7e8a4..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/commands/Afk.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/God.java b/Essentials/src/com/earth2me/essentials/settings/commands/God.java deleted file mode 100644 index a6f5dbfc31..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/commands/God.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Help.java b/Essentials/src/com/earth2me/essentials/settings/commands/Help.java deleted file mode 100644 index 0b47874718..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/commands/Help.java +++ /dev/null @@ -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., 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; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Home.java b/Essentials/src/com/earth2me/essentials/settings/commands/Home.java deleted file mode 100644 index 8b3a0ca820..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/commands/Home.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Kit.java b/Essentials/src/com/earth2me/essentials/settings/commands/Kit.java deleted file mode 100644 index 87aa42d3c5..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/commands/Kit.java +++ /dev/null @@ -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 kits = new HashMap(); -} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/KitObject.java b/Essentials/src/com/earth2me/essentials/settings/commands/KitObject.java deleted file mode 100644 index fe0353be94..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/commands/KitObject.java +++ /dev/null @@ -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 items = new ArrayList(); - private Double delay; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Lightning.java b/Essentials/src/com/earth2me/essentials/settings/commands/Lightning.java deleted file mode 100644 index e40e645da4..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/commands/Lightning.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Spawnmob.java b/Essentials/src/com/earth2me/essentials/settings/commands/Spawnmob.java deleted file mode 100644 index 37d41c296a..0000000000 --- a/Essentials/src/com/earth2me/essentials/settings/commands/Spawnmob.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java b/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java index 389effc64a..3e3e095c58 100644 --- a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java +++ b/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java @@ -17,6 +17,7 @@ public class EssentialsSign { private static final Set EMPTY_SET = new HashSet(); + protected transient final String signName; public EssentialsSign(final String signName) @@ -66,6 +67,10 @@ public String getTemplateName() { return _("signFormatTemplate", this.signName); } + + public String getName() { + return this.signName; + } private String getUsername(final User user) { @@ -82,8 +87,8 @@ public final boolean onSignInteract(final Block block, final Player player, fina } try { - return (user.isAuthorized("essentials.signs." + signName.toLowerCase(Locale.ENGLISH) + ".use") - || user.isAuthorized("essentials.signs.use." + signName.toLowerCase(Locale.ENGLISH))) + return (!user.isDead() && (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) @@ -258,6 +263,11 @@ public Set getBlocks() { return EMPTY_SET; } + + public boolean areHeavyEventRequired() + { + return false; + } protected final void validateTrade(final ISign sign, final int index, final IEssentials ess) throws SignException { @@ -412,6 +422,7 @@ protected final Trade getTrade(final ISign sign, final int index, final int decr if (item.equalsIgnoreCase("times")) { sign.setLine(index, (quantity - decrement) + " times"); + sign.updateSign(); return new Trade(signName.toLowerCase(Locale.ENGLISH) + "sign", ess); } else if (item.equalsIgnoreCase("exp") || item.equalsIgnoreCase("xp")) @@ -437,11 +448,13 @@ static class EventSign implements ISign { private final transient SignChangeEvent event; private final transient Block block; + private final transient Sign sign; - public EventSign(final SignChangeEvent event) + EventSign(final SignChangeEvent event) { this.event = event; this.block = event.getBlock(); + this.sign = (Sign)block.getState(); } @Override @@ -454,6 +467,8 @@ public final String getLine(final int index) public final void setLine(final int index, final String text) { event.setLine(index, text); + sign.setLine(index, text); + updateSign(); } @Override @@ -465,6 +480,7 @@ public Block getBlock() @Override public void updateSign() { + sign.update(); } } @@ -474,7 +490,7 @@ static class BlockSign implements ISign private final transient Sign sign; private final transient Block block; - public BlockSign(final Block block) + BlockSign(final Block block) { this.block = block; this.sign = (Sign)block.getState(); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignBlockListener.java b/Essentials/src/com/earth2me/essentials/signs/SignBlockListener.java index c159510c75..fce49958ee 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignBlockListener.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignBlockListener.java @@ -32,6 +32,7 @@ public void onBlockBreak(final BlockBreakEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } @@ -43,6 +44,13 @@ public void onBlockBreak(final BlockBreakEvent event) public boolean protectSignsAndBlocks(final Block block, final Player player) { + // 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; + } + final int mat = block.getTypeId(); if (mat == SIGN_POST || mat == WALL_SIGN) { @@ -57,15 +65,10 @@ public boolean protectSignsAndBlocks(final Block block, final Player player) } } } - // 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 (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (sign.getBlocks().contains(block.getType()) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockBreak(block, player, ess)) { LOGGER.log(Level.INFO, "A block was protected by a sign."); @@ -75,11 +78,12 @@ public boolean protectSignsAndBlocks(final Block block, final Player player) return false; } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onSignChange(final SignChangeEvent event) + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onSignChange2(final SignChangeEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } User user = ess.getUser(event.getPlayer()); @@ -89,9 +93,28 @@ public void onSignChange(final SignChangeEvent event) event.setLine(i, Util.formatString(user, "essentials.signs", event.getLine(i))); } + final String topLine = event.getLine(0); for (Signs signs : Signs.values()) { final EssentialsSign sign = signs.getSign(); + if (topLine.equalsIgnoreCase(sign.getSuccessName())) + { + event.setLine(0, Util.stripFormat(topLine)); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onSignChange(final SignChangeEvent event) + { + if (ess.getSettings().areSignsDisabled()) + { + event.getHandlers().unregister(this); + return; + } + + for (EssentialsSign sign : ess.getSettings().enabledSigns()) + { if (event.getLine(0).equalsIgnoreCase(sign.getSuccessName())) { event.setCancelled(true); @@ -111,6 +134,7 @@ public void onBlockPlace(final BlockPlaceEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } @@ -128,10 +152,9 @@ public void onBlockPlace(final BlockPlaceEvent event) { return; } - for (Signs signs : Signs.values()) + for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - final EssentialsSign sign = signs.getSign(); - if (sign.getBlocks().contains(block.getType()) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockPlace(block, event.getPlayer(), ess)) { event.setCancelled(true); @@ -145,6 +168,7 @@ public void onBlockBurn(final BlockBurnEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } @@ -159,7 +183,7 @@ public void onBlockBurn(final BlockBurnEvent event) } for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (sign.getBlocks().contains(block.getType()) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockBurn(block, ess)) { event.setCancelled(true); @@ -173,6 +197,7 @@ public void onBlockIgnite(final BlockIgniteEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } @@ -187,7 +212,7 @@ public void onBlockIgnite(final BlockIgniteEvent event) } for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (sign.getBlocks().contains(block.getType()) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockIgnite(block, ess)) { event.setCancelled(true); @@ -201,6 +226,7 @@ public void onBlockPistonExtend(final BlockPistonExtendEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } @@ -216,7 +242,7 @@ public void onBlockPistonExtend(final BlockPistonExtendEvent event) } for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (sign.getBlocks().contains(block.getType()) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockPush(block, ess)) { event.setCancelled(true); @@ -231,6 +257,7 @@ public void onBlockPistonRetract(final BlockPistonRetractEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } @@ -247,7 +274,7 @@ public void onBlockPistonRetract(final BlockPistonRetractEvent event) } for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (sign.getBlocks().contains(block.getType()) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockPush(block, ess)) { event.setCancelled(true); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignBuy.java b/Essentials/src/com/earth2me/essentials/signs/SignBuy.java index aa4e414261..d675a598cc 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignBuy.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignBuy.java @@ -29,7 +29,7 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri charge.isAffordableFor(player); if (!items.pay(player, false)) { - throw new ChargeException("Inventory full"); + throw new ChargeException("Inventory full"); //TODO: TL } charge.charge(player); Trade.log("Sign", "Buy", "Interact", username, charge, username, items, sign.getBlock().getLocation(), ess); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignEnchant.java b/Essentials/src/com/earth2me/essentials/signs/SignEnchant.java index a50ce967ae..c0079fc635 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignEnchant.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignEnchant.java @@ -1,14 +1,8 @@ package com.earth2me.essentials.signs; -import com.earth2me.essentials.ChargeException; -import com.earth2me.essentials.Enchantments; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.Trade; -import com.earth2me.essentials.craftbukkit.InventoryWorkaround; +import com.earth2me.essentials.*; import java.util.Locale; -import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; @@ -23,15 +17,26 @@ public SignEnchant() @Override protected boolean onSignCreate(final ISign sign, final User 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 ItemStack stack; + try + { + stack = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess); + } + catch (SignException e) + { + sign.setLine(1, "§c"); + throw e; + } final String[] enchantLevel = sign.getLine(2).split(":"); if (enchantLevel.length != 2) { + sign.setLine(2, "§c"); throw new SignException(_("invalidSignLine", 3)); } final Enchantment enchantment = Enchantments.getByName(enchantLevel[0]); if (enchantment == null) { + sign.setLine(2, "§c"); throw new SignException(_("enchantmentNotFound")); } int level; @@ -41,9 +46,11 @@ protected boolean onSignCreate(final ISign sign, final User player, final String } catch (NumberFormatException ex) { + sign.setLine(2, "§c"); throw new SignException(ex.getMessage(), ex); } - if (level < 1 || level > enchantment.getMaxLevel()) + final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments() && player.isAuthorized("essentials.enchantments.allowunsafe"); + if (level < 0 || (!allowUnsafe && level > enchantment.getMaxLevel())) { level = enchantment.getMaxLevel(); sign.setLine(2, enchantLevel[0] + ":" + level); @@ -52,7 +59,14 @@ protected boolean onSignCreate(final ISign sign, final User player, final String { if (stack != null) { - stack.addEnchantment(enchantment, level); + if (allowUnsafe) + { + stack.addUnsafeEnchantment(enchantment, level); + } + else + { + stack.addEnchantment(enchantment, level); + } } } catch (Throwable ex) @@ -106,13 +120,37 @@ protected boolean onSignInteract(ISign sign, User player, String username, IEsse final ItemStack toEnchant = playerHand; try { - toEnchant.addEnchantment(enchantment, level); + if (level == 0) + { + toEnchant.removeEnchantment(enchantment); + } + else + { + if (ess.getSettings().allowUnsafeEnchantments()) + { + toEnchant.addUnsafeEnchantment(enchantment, level); + } + else + { + toEnchant.addEnchantment(enchantment, level); + } + } } catch (Exception ex) { throw new SignException(ex.getMessage(), ex); } + final String enchantmentName = enchantment.getName().toLowerCase(Locale.ENGLISH); + if (level == 0) + { + player.sendMessage(_("enchantmentRemoved", enchantmentName.replace('_', ' '))); + } + else + { + player.sendMessage(_("enchantmentApplied", enchantmentName.replace('_', ' '))); + } + charge.charge(player); Trade.log("Sign", "Enchant", "Interact", username, charge, username, charge, sign.getBlock().getLocation(), ess); player.updateInventory(); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignEntityListener.java b/Essentials/src/com/earth2me/essentials/signs/SignEntityListener.java index edc5b856dc..fbbd1cd8c5 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignEntityListener.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignEntityListener.java @@ -24,6 +24,7 @@ public void onEntityExplode(final EntityExplodeEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } @@ -39,7 +40,7 @@ public void onEntityExplode(final EntityExplodeEvent event) } for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (sign.getBlocks().contains(block.getType())) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType())) { event.setCancelled(!sign.onBlockExplode(block, ess)); return; @@ -53,6 +54,7 @@ public void onEntityChangeBlock(final EntityChangeBlockEvent event) { if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } @@ -67,7 +69,7 @@ public void onEntityChangeBlock(final EntityChangeBlockEvent event) } for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (sign.getBlocks().contains(block.getType()) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockBreak(block, ess)) { event.setCancelled(true); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignFree.java b/Essentials/src/com/earth2me/essentials/signs/SignFree.java index 24ce481ffe..b5dd3fa73a 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignFree.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignFree.java @@ -4,9 +4,7 @@ import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; -import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import org.bukkit.Material; -import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -21,7 +19,14 @@ public SignFree() @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException { - getItemStack(sign.getLine(1), 1, ess); + try { + getItemStack(sign.getLine(1), 1, ess); + } + catch (SignException ex) + { + sign.setLine(1, "§c"); + throw new SignException(ex.getMessage(), ex); + } return true; } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignGameMode.java b/Essentials/src/com/earth2me/essentials/signs/SignGameMode.java index 37a9fb1b80..686e304f34 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignGameMode.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignGameMode.java @@ -7,6 +7,7 @@ import com.earth2me.essentials.User; import java.util.Locale; import org.bukkit.GameMode; +import org.bukkit.entity.Player; public class SignGameMode extends EssentialsSign @@ -19,19 +20,54 @@ public SignGameMode() @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException { - validateTrade(sign, 1, ess); + final String gamemode = sign.getLine(1); + if (gamemode.isEmpty()) + { + sign.setLine(1, "Survival"); + } + + validateTrade(sign, 2, ess); + return true; } @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException { - final Trade charge = getTrade(sign, 1, ess); + final Trade charge = getTrade(sign, 2, ess); + final String mode = sign.getLine(1).trim(); + + if (mode.isEmpty()) + { + throw new SignException(_("invalidSignLine", 2)); + } + charge.isAffordableFor(player); - player.setGameMode(player.getGameMode() == GameMode.SURVIVAL ? GameMode.CREATIVE : GameMode.SURVIVAL); + performSetMode(mode.toLowerCase(Locale.ENGLISH), player); player.sendMessage(_("gameMode", _(player.getGameMode().toString().toLowerCase(Locale.ENGLISH)), player.getDisplayName())); + Trade.log("Sign", "gameMode", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); charge.charge(player); return true; } + + private void performSetMode(String mode, Player player) throws SignException + { + if (mode.contains("survi") || mode.equalsIgnoreCase("0")) + { + player.setGameMode(GameMode.SURVIVAL); + } + else if (mode.contains("creat") || mode.equalsIgnoreCase("1")) + { + player.setGameMode(GameMode.CREATIVE); + } + else if (mode.contains("advent") || mode.equalsIgnoreCase("2")) + { + player.setGameMode(GameMode.ADVENTURE); + } + else + { + throw new SignException(_("invalidSignLine", 2)); + } + } } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignHeal.java b/Essentials/src/com/earth2me/essentials/signs/SignHeal.java index be8b7ba1df..3005610b41 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignHeal.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignHeal.java @@ -24,6 +24,10 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException { + if (player.getHealth() == 0) + { + throw new SignException(_("healDead")); + } final Trade charge = getTrade(sign, 1, ess); charge.isAffordableFor(player); player.setHealth(20); @@ -31,6 +35,7 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri player.setFireTicks(0); player.sendMessage(_("youAreHealed")); charge.charge(player); + Trade.log("Sign", "Heal", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); return true; } } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignInfo.java b/Essentials/src/com/earth2me/essentials/signs/SignInfo.java new file mode 100644 index 0000000000..fa79f9c632 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/signs/SignInfo.java @@ -0,0 +1,55 @@ +package com.earth2me.essentials.signs; + +import com.earth2me.essentials.ChargeException; +import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.Trade; +import com.earth2me.essentials.User; +import com.earth2me.essentials.textreader.IText; +import com.earth2me.essentials.textreader.KeywordReplacer; +import com.earth2me.essentials.textreader.TextInput; +import com.earth2me.essentials.textreader.TextPager; +import java.io.IOException; + + +public class SignInfo extends EssentialsSign +{ + public SignInfo() + { + super("Info"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 3, ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 3, ess); + charge.isAffordableFor(player); + + String chapter = sign.getLine(1); + String page = sign.getLine(2); + + final IText input; + try + { + input = new TextInput(player, "info", true, ess); + final IText output = new KeywordReplacer(input, player, ess); + final TextPager pager = new TextPager(output); + pager.showPage(chapter, page, null, player); + + } + catch (IOException ex) + { + throw new SignException(ex.getMessage(), ex); + } + + charge.charge(player); + Trade.log("Sign", "Info", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); + return true; + } +} diff --git a/Essentials/src/com/earth2me/essentials/signs/SignKit.java b/Essentials/src/com/earth2me/essentials/signs/SignKit.java index c1a4cd0fd5..391b23407a 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignKit.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignKit.java @@ -1,6 +1,8 @@ package com.earth2me.essentials.signs; +import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.*; +import com.earth2me.essentials.commands.NoChargeException; import java.util.List; import java.util.Locale; import java.util.Map; @@ -18,7 +20,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String { 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()) { @@ -47,10 +49,10 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @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)))) + || (group.isEmpty() && (player.isAuthorized("essentials.kits." + kitName)))) { final Trade charge = getTrade(sign, 3, ess); charge.isAffordableFor(player); @@ -61,6 +63,11 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri final List items = Kit.getItems(player, kit); Kit.expandItems(ess, player, items); charge.charge(player); + Trade.log("Sign", "Kit", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); + } + catch (NoChargeException ex) + { + return false; } catch (Exception ex) { @@ -68,6 +75,9 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri } return true; } - return false; + else + { + throw new SignException(_("noKitPermission", "essentials.kits." + kitName)); + } } } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignPlayerListener.java b/Essentials/src/com/earth2me/essentials/signs/SignPlayerListener.java index d415ef6a82..b447ed9ddf 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignPlayerListener.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.IEssentials; +import java.util.logging.Level; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; @@ -20,14 +21,43 @@ public SignPlayerListener(final IEssentials ess) this.ess = ess; } - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + //This following code below listens to cancelled events to fix a bukkit issue + //Right clicking signs with a block in hand, can now fire cancelled events. + //This is because when the block place is cancelled (for example not enough space for the block to be placed), + //the event will be marked as cancelled, thus preventing 30% of sign purchases. + @EventHandler(priority = EventPriority.LOW) public void onPlayerInteract(final PlayerInteractEvent event) { - if (ess.getSettings().areSignsDisabled() || event.getAction() != Action.RIGHT_CLICK_BLOCK) + if (ess.getSettings().areSignsDisabled()) { + event.getHandlers().unregister(this); return; } - final Block block = event.getClickedBlock(); + if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) + { + return; + } + final Block block; + if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) + { + Block targetBlock = null; + try + { + targetBlock = event.getPlayer().getTargetBlock(null, 5); + } + catch (IllegalStateException ex) + { + if (ess.getSettings().isDebug()) + { + ess.getLogger().log(Level.WARNING, ex.getMessage(), ex); + } + } + block = targetBlock; + } + else + { + block = event.getClickedBlock(); + } if (block == null) { return; @@ -36,10 +66,10 @@ public void onPlayerInteract(final PlayerInteractEvent event) final int mat = block.getTypeId(); if (mat == Material.SIGN_POST.getId() || mat == Material.WALL_SIGN.getId()) { - final Sign csign = (Sign)block.getState(); + final String csign = ((Sign)block.getState()).getLine(0); for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (csign.getLine(0).equalsIgnoreCase(sign.getSuccessName())) + if (csign.equalsIgnoreCase(sign.getSuccessName())) { sign.onSignInteract(block, event.getPlayer(), ess); event.setCancelled(true); @@ -51,7 +81,7 @@ public void onPlayerInteract(final PlayerInteractEvent event) { for (EssentialsSign sign : ess.getSettings().enabledSigns()) { - if (sign.getBlocks().contains(block.getType()) + if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockInteract(block, event.getPlayer(), ess)) { event.setCancelled(true); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignProtection.java b/Essentials/src/com/earth2me/essentials/signs/SignProtection.java index 2f2d25c463..b5a679324d 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignProtection.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignProtection.java @@ -1,11 +1,7 @@ package com.earth2me.essentials.signs; -import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; -import com.earth2me.essentials.Util; +import com.earth2me.essentials.*; import java.util.*; import org.bukkit.Location; import org.bukkit.Material; @@ -14,7 +10,7 @@ import org.bukkit.block.Sign; import org.bukkit.inventory.ItemStack; - +@Deprecated // This sign will be removed soon public class SignProtection extends EssentialsSign { private final transient Set protectedBlocks = EnumSet.noneOf(Material.class); @@ -245,6 +241,12 @@ public Set getBlocks() { return protectedBlocks; } + + @Override + public boolean areHeavyEventRequired() + { + return true; + } @Override protected boolean onBlockPlace(final Block block, final User player, final String username, final IEssentials ess) throws SignException diff --git a/Essentials/src/com/earth2me/essentials/signs/SignRepair.java b/Essentials/src/com/earth2me/essentials/signs/SignRepair.java new file mode 100644 index 0000000000..f09d945368 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/signs/SignRepair.java @@ -0,0 +1,59 @@ +package com.earth2me.essentials.signs; + +import com.earth2me.essentials.ChargeException; +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.Trade; +import com.earth2me.essentials.User; +import com.earth2me.essentials.commands.Commandrepair; + + +public class SignRepair extends EssentialsSign +{ + public SignRepair() + { + super("Repair"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + { + final String repairTarget = sign.getLine(1); + if (repairTarget.isEmpty()) + { + sign.setLine(1, "Hand"); + } + else if (!repairTarget.equalsIgnoreCase("all") && !repairTarget.equalsIgnoreCase("hand")) + { + sign.setLine(1, "§c"); + throw new SignException(_("invalidSignLine", 2)); + } + validateTrade(sign, 2, ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 2, ess); + charge.isAffordableFor(player); + + Commandrepair command = new Commandrepair(); + command.setEssentials(ess); + String[] args = new String[] + { + sign.getLine(1) + }; + try + { + command.run(ess.getServer(), player, "repair", args); + } + catch (Exception ex) + { + throw new SignException(ex.getMessage(), ex); + } + charge.charge(player); + Trade.log("Sign", "Repair", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); + return true; + } +} diff --git a/Essentials/src/com/earth2me/essentials/signs/SignSpawnmob.java b/Essentials/src/com/earth2me/essentials/signs/SignSpawnmob.java index 7c4cfcd54d..e112a80214 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignSpawnmob.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignSpawnmob.java @@ -1,10 +1,7 @@ package com.earth2me.essentials.signs; -import com.earth2me.essentials.ChargeException; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; -import com.earth2me.essentials.commands.Commandspawnmob; +import com.earth2me.essentials.*; +import java.util.List; public class SignSpawnmob extends EssentialsSign @@ -27,21 +24,20 @@ protected boolean onSignInteract(ISign sign, User player, String username, IEsse { 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); + List mobParts = SpawnMob.mobParts(sign.getLine(2)); + List mobData = SpawnMob.mobData(sign.getLine(2)); + SpawnMob.spawnmob(ess, ess.getServer(), player, player, mobParts, mobData, Integer.parseInt(sign.getLine(1))); } catch (Exception ex) { throw new SignException(ex.getMessage(), ex); } + charge.charge(player); + Trade.log("Sign", "Spawnmob", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); return true; } } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignTime.java b/Essentials/src/com/earth2me/essentials/signs/SignTime.java index 99c579ff4c..c618133c3b 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignTime.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignTime.java @@ -44,12 +44,14 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri { player.getWorld().setTime(time + 24000); charge.charge(player); + Trade.log("Sign", "TimeDay", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); return true; } if ("§2Night".equalsIgnoreCase(timeString)) { player.getWorld().setTime(time + 37700); charge.charge(player); + Trade.log("Sign", "TimeNight", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); return true; } throw new SignException(_("onlyDayNight")); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignTrade.java b/Essentials/src/com/earth2me/essentials/signs/SignTrade.java index 41f9fb2a53..58d62e5cc4 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignTrade.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignTrade.java @@ -1,10 +1,11 @@ package com.earth2me.essentials.signs; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.Trade.TradeType; import com.earth2me.essentials.*; import org.bukkit.inventory.ItemStack; -//TODO: Sell Enchantment on Trade signs? +//TODO: TL exceptions public class SignTrade extends EssentialsSign { @@ -18,11 +19,15 @@ protected boolean onSignCreate(final ISign sign, final User player, final String { validateTrade(sign, 1, false, ess); validateTrade(sign, 2, true, ess); - final Trade charge = getTrade(sign, 2, true, true, ess); - charge.isAffordableFor(player); + final Trade trade = getTrade(sign, 2, true, true, ess); + final Trade charge = getTrade(sign, 1, true, false, ess); + if (trade.getType() == charge.getType() && (trade.getType() != TradeType.ITEM || trade.getItemStack().getType().equals(charge.getItemStack().getType()))) { + throw new SignException("You cannot trade for the same item type."); + } + trade.isAffordableFor(player); sign.setLine(3, "§8" + username); - charge.charge(player); - Trade.log("Sign", "Trade", "Create", username, charge, username, null, sign.getBlock().getLocation(), ess); + trade.charge(player); + Trade.log("Sign", "Trade", "Create", username, trade, username, null, sign.getBlock().getLocation(), ess); return true; } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignWarp.java b/Essentials/src/com/earth2me/essentials/signs/SignWarp.java index 76e8e730b9..ef52ceb604 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignWarp.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignWarp.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; +import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; @@ -22,8 +23,8 @@ protected boolean onSignCreate(final ISign sign, final User player, final String if (warpName.isEmpty()) { - sign.setLine(1, "§dWarp name!"); - return false; + sign.setLine(1, "§c"); + throw new SignException(_("invalidSignLine", 1)); } else { @@ -52,12 +53,13 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri if ((!group.isEmpty() && ("§2Everyone".equals(group) || player.inGroup(group))) - || (group.isEmpty() && (!ess.getSettings().getPerWarpPermission() || player.isAuthorized("essentials.warp." + warpName)))) + || (group.isEmpty() && (!ess.getSettings().getPerWarpPermission() || player.isAuthorized("essentials.warps." + warpName)))) { final Trade charge = getTrade(sign, 3, ess); try { player.getTeleport().warp(warpName, charge, TeleportCause.PLUGIN); + Trade.log("Sign", "Warp", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); } catch (Exception ex) { diff --git a/Essentials/src/com/earth2me/essentials/signs/SignWeather.java b/Essentials/src/com/earth2me/essentials/signs/SignWeather.java index 559fcc2e30..527e9fcf83 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignWeather.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignWeather.java @@ -29,6 +29,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String sign.setLine(1, "§2Storm"); return true; } + sign.setLine(1, "§c"); throw new SignException(_("onlySunStorm")); } @@ -42,12 +43,14 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri { player.getWorld().setStorm(false); charge.charge(player); + Trade.log("Sign", "WeatherSun", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); return true; } if ("§2Storm".equalsIgnoreCase(weatherString)) { player.getWorld().setStorm(true); charge.charge(player); + Trade.log("Sign", "WeatherStorm", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess); return true; } throw new SignException(_("onlySunStorm")); diff --git a/Essentials/src/com/earth2me/essentials/signs/Signs.java b/Essentials/src/com/earth2me/essentials/signs/Signs.java index 2cf05ee775..41de479d34 100644 --- a/Essentials/src/com/earth2me/essentials/signs/Signs.java +++ b/Essentials/src/com/earth2me/essentials/signs/Signs.java @@ -10,9 +10,11 @@ public enum Signs FREE(new SignFree()), GAMEMODE(new SignGameMode()), HEAL(new SignHeal()), + INFO(new SignInfo()), KIT(new SignKit()), MAIL(new SignMail()), PROTECTION(new SignProtection()), + REPAIR(new SignRepair()), SELL(new SignSell()), SPAWNMOB(new SignSpawnmob()), TIME(new SignTime()), diff --git a/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileReader.java b/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileReader.java index 83452884b3..2baa680c08 100644 --- a/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileReader.java +++ b/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileReader.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.util.logging.Level; import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; public abstract class AbstractDelayedYamlFileReader implements Runnable @@ -21,7 +20,7 @@ public AbstractDelayedYamlFileReader(final IEssentials ess, final File file, fin this.file = file; this.clazz = clazz; this.plugin = ess; - ess.scheduleAsyncDelayedTask(this); + ess.runTaskAsynchronously(this); } public abstract void onStart(); diff --git a/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileWriter.java b/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileWriter.java index e8b3992ae9..6a3ea836a2 100644 --- a/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileWriter.java +++ b/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileWriter.java @@ -15,7 +15,7 @@ public abstract class AbstractDelayedYamlFileWriter implements Runnable public AbstractDelayedYamlFileWriter(IEssentials ess, File file) { this.file = file; - ess.scheduleAsyncDelayedTask(this); + ess.runTaskAsynchronously(this); } public abstract StorageObject getObject(); diff --git a/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java b/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java index b651dd40ba..39ab28bd90 100644 --- a/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java +++ b/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java @@ -89,7 +89,7 @@ public void onReload() private class StorageObjectDataWriter extends AbstractDelayedYamlFileWriter { - public StorageObjectDataWriter() + StorageObjectDataWriter() { super(ess, getStorageFile()); } @@ -112,7 +112,7 @@ public void onFinish() private class StorageObjectDataReader extends AbstractDelayedYamlFileReader { - public StorageObjectDataReader() + StorageObjectDataReader() { super(ess, getStorageFile(), clazz); } diff --git a/Essentials/src/com/earth2me/essentials/storage/BukkitConstructor.java b/Essentials/src/com/earth2me/essentials/storage/BukkitConstructor.java index 5070be5520..d313a11b78 100644 --- a/Essentials/src/com/earth2me/essentials/storage/BukkitConstructor.java +++ b/Essentials/src/com/earth2me/essentials/storage/BukkitConstructor.java @@ -1,13 +1,10 @@ package com.earth2me.essentials.storage; -import java.beans.IntrospectionException; +import com.earth2me.essentials.Util; import java.lang.reflect.Field; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Pattern; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -16,22 +13,21 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.java.JavaPluginLoader; import org.yaml.snakeyaml.TypeDescription; import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor; import org.yaml.snakeyaml.error.YAMLException; import org.yaml.snakeyaml.introspector.Property; import org.yaml.snakeyaml.nodes.*; -public class BukkitConstructor extends Constructor +public class BukkitConstructor extends CustomClassLoaderConstructor { - private final transient Pattern NUMPATTERN = Pattern.compile("\\d+"); private final transient Plugin plugin; public BukkitConstructor(final Class clazz, final Plugin plugin) { - super(clazz); + super(clazz, plugin.getClass().getClassLoader()); this.plugin = plugin; yamlClassConstructors.put(NodeId.scalar, new ConstructBukkitScalar()); yamlClassConstructors.put(NodeId.mapping, new ConstructBukkitMapping()); @@ -47,7 +43,7 @@ public Object construct(final Node node) { final String val = (String)constructScalar((ScalarNode)node); Material mat; - if (NUMPATTERN.matcher(val).matches()) + if (Util.isInt(val)) { final int typeId = Integer.parseInt(val); mat = Material.getMaterial(typeId); @@ -71,7 +67,7 @@ public Object construct(final Node node) return null; } Material mat; - if (NUMPATTERN.matcher(split[0]).matches()) + if (Util.isInt(split[0])) { final int typeId = Integer.parseInt(split[0]); mat = Material.getMaterial(typeId); @@ -85,7 +81,7 @@ public Object construct(final Node node) return null; } byte data = 0; - if (split.length == 2 && NUMPATTERN.matcher(split[1]).matches()) + if (split.length == 2 && Util.isInt(split[1])) { data = Byte.parseByte(split[1]); } @@ -109,7 +105,7 @@ public Object construct(final Node node) return null; } Material mat; - if (NUMPATTERN.matcher(split2[0]).matches()) + if (Util.isInt(split2[0])) { final int typeId = Integer.parseInt(split2[0]); mat = Material.getMaterial(typeId); @@ -123,12 +119,12 @@ public Object construct(final Node node) return null; } short data = 0; - if (split2.length == 2 && NUMPATTERN.matcher(split2[1]).matches()) + if (split2.length == 2 && Util.isInt(split2[1])) { data = Short.parseShort(split2[1]); } int size = mat.getMaxStackSize(); - if (split1.length > 1 && NUMPATTERN.matcher(split1[1]).matches()) + if (split1.length > 1 && Util.isInt(split1[1])) { size = Integer.parseInt(split1[1]); } @@ -143,7 +139,7 @@ public Object construct(final Node node) continue; } Enchantment enchantment; - if (NUMPATTERN.matcher(split3[0]).matches()) + if (Util.isInt(split3[0])) { final int enchantId = Integer.parseInt(split3[0]); enchantment = Enchantment.getById(enchantId); @@ -157,7 +153,7 @@ public Object construct(final Node node) continue; } int level = enchantment.getStartLevel(); - if (split3.length == 2 && NUMPATTERN.matcher(split3[1]).matches()) + if (split3.length == 2 && Util.isInt(split3[1])) { level = Integer.parseInt(split3[1]); } @@ -187,7 +183,7 @@ public Object construct(final Node node) return null; } Enchantment enchant; - if (NUMPATTERN.matcher(split[0]).matches()) + if (Util.isInt(split[0])) { final int typeId = Integer.parseInt(split[0]); enchant = Enchantment.getById(typeId); @@ -201,7 +197,7 @@ public Object construct(final Node node) return null; } int level = enchant.getStartLevel(); - if (split.length == 2 && NUMPATTERN.matcher(split[1]).matches()) + if (split.length == 2 && Util.isInt(split[1])) { level = Integer.parseInt(split[1]); } @@ -279,6 +275,7 @@ public Object construct(final Node node) return super.construct(node); } + @Override protected Object constructJavaBean2ndStep(final MappingNode node, final Object object) { Map, TypeDescription> typeDefinitions; @@ -287,7 +284,8 @@ protected Object constructJavaBean2ndStep(final MappingNode node, final Object o final Field typeDefField = Constructor.class.getDeclaredField("typeDefinitions"); typeDefField.setAccessible(true); typeDefinitions = (Map, TypeDescription>)typeDefField.get((Constructor)BukkitConstructor.this); - if (typeDefinitions == null) { + if (typeDefinitions == null) + { throw new NullPointerException(); } } @@ -405,29 +403,4 @@ else if (property.getType().isAssignableFrom(Map.class)) return object; } } - - @Override - protected Class getClassForNode(final Node node) - { - Class clazz; - final String name = node.getTag().getClassName(); - if (plugin == null) - { - clazz = super.getClassForNode(node); - } - else - { - final JavaPluginLoader jpl = (JavaPluginLoader)plugin.getPluginLoader(); - clazz = jpl.getClassByName(name); - } - - if (clazz == null) - { - throw new YAMLException("Class not found: " + name); - } - else - { - return clazz; - } - } } diff --git a/Essentials/src/com/earth2me/essentials/storage/IStorageObjectHolder.java b/Essentials/src/com/earth2me/essentials/storage/IStorageObjectHolder.java index f48e54002e..4e860bd8c2 100644 --- a/Essentials/src/com/earth2me/essentials/storage/IStorageObjectHolder.java +++ b/Essentials/src/com/earth2me/essentials/storage/IStorageObjectHolder.java @@ -1,7 +1,5 @@ package com.earth2me.essentials.storage; -import com.earth2me.essentials.user.UserData; - public interface IStorageObjectHolder { diff --git a/Essentials/src/com/earth2me/essentials/textreader/ArrayListInput.java b/Essentials/src/com/earth2me/essentials/textreader/ArrayListInput.java deleted file mode 100644 index 0da83f3b48..0000000000 --- a/Essentials/src/com/earth2me/essentials/textreader/ArrayListInput.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.earth2me.essentials.textreader; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - - -public class ArrayListInput implements IText -{ - private final transient List lines = new ArrayList(); - - @Override - public List getLines() - { - return lines; - } - - @Override - public List getChapters() - { - return Collections.emptyList(); - } - - @Override - public Map getBookmarks() - { - return Collections.emptyMap(); - } - -} diff --git a/Essentials/src/com/earth2me/essentials/textreader/BookInput.java b/Essentials/src/com/earth2me/essentials/textreader/BookInput.java new file mode 100644 index 0000000000..b0fedbf868 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/textreader/BookInput.java @@ -0,0 +1,128 @@ +package com.earth2me.essentials.textreader; + +import com.earth2me.essentials.IEssentials; +import java.io.*; +import java.lang.ref.SoftReference; +import java.util.*; + + +public class BookInput implements IText +{ + private final transient List lines; + private final transient List chapters; + private final transient Map bookmarks; + private final transient long lastChange; + private final static HashMap> cache = new HashMap>(); + + public BookInput(final String filename, final boolean createFile, final IEssentials ess) throws IOException + { + + File file = null; + if (file == null || !file.exists()) + { + file = new File(ess.getDataFolder(), filename + ".txt"); + } + if (!file.exists()) + { + if (createFile) + { + final InputStream input = ess.getResource(filename + ".txt"); + final OutputStream output = new FileOutputStream(file); + try + { + final byte[] buffer = new byte[1024]; + int length = input.read(buffer); + while (length > 0) + { + output.write(buffer, 0, length); + length = input.read(buffer); + } + } + finally + { + output.close(); + input.close(); + } + ess.getLogger().info("File " + filename + ".txt does not exist. Creating one for you."); + } + } + if (!file.exists()) + { + lastChange = 0; + lines = Collections.emptyList(); + chapters = Collections.emptyList(); + bookmarks = Collections.emptyMap(); + throw new FileNotFoundException("Could not create " + filename + ".txt"); + } + else + { + lastChange = file.lastModified(); + boolean readFromfile; + synchronized (cache) + { + final SoftReference inputRef = cache.get(file.getName()); + BookInput input; + if (inputRef == null || (input = inputRef.get()) == null || input.lastChange < lastChange) + { + lines = new ArrayList(); + chapters = new ArrayList(); + bookmarks = new HashMap(); + cache.put(file.getName(), new SoftReference(this)); + readFromfile = true; + } + else + { + lines = Collections.unmodifiableList(input.getLines()); + chapters = Collections.unmodifiableList(input.getChapters()); + bookmarks = Collections.unmodifiableMap(input.getBookmarks()); + readFromfile = false; + } + } + if (readFromfile) + { + final BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + try + { + int lineNumber = 0; + while (bufferedReader.ready()) + { + final String line = bufferedReader.readLine(); + if (line == null) + { + break; + } + if (line.length() > 0 && line.charAt(0) == '#') + { + bookmarks.put(line.substring(1).toLowerCase(Locale.ENGLISH).replaceAll("&[0-9a-fk]", ""), lineNumber); + chapters.add(line.substring(1).replace('&', '§').replace("§§", "&")); + } + lines.add(line.replace('&', '§').replace("§§", "&")); + lineNumber++; + } + } + finally + { + bufferedReader.close(); + } + } + } + } + + @Override + public List getLines() + { + return lines; + } + + @Override + public List getChapters() + { + return chapters; + } + + @Override + public Map getBookmarks() + { + return bookmarks; + } +} diff --git a/Essentials/src/com/earth2me/essentials/textreader/BookPager.java b/Essentials/src/com/earth2me/essentials/textreader/BookPager.java new file mode 100644 index 0000000000..3f974fe328 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/textreader/BookPager.java @@ -0,0 +1,111 @@ +package com.earth2me.essentials.textreader; + +import static com.earth2me.essentials.I18n._; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; + + +public class BookPager +{ + private final transient IText text; + + public BookPager(final IText text) + { + this.text = text; + } + + public List getPages(final String pageStr) throws Exception + { + List lines = text.getLines(); + List chapters = text.getChapters(); + List pageLines = new ArrayList(); + Map bookmarks = text.getBookmarks(); + + //This checks to see if we have the chapter in the index + if (!bookmarks.containsKey(pageStr.toLowerCase(Locale.ENGLISH))) + { + throw new Exception(_("infoUnknownChapter")); + } + + //Since we have a valid chapter, count the number of lines in the chapter + final int chapterstart = bookmarks.get(pageStr.toLowerCase(Locale.ENGLISH)) + 1; + int chapterend; + for (chapterend = chapterstart; chapterend < lines.size(); chapterend++) + { + final String line = lines.get(chapterend); + if (line.length() > 0 && line.charAt(0) == '#') + { + break; + } + } + + for (int lineNo = chapterstart; lineNo < chapterend; lineNo += 1) + { + String pageLine = "\u00a70" + lines.get(lineNo); + String tempLine; + final double max = 18; + final int lineLength = pageLine.length(); + double length = 0; + int pointer = 0; + int start = 0; + double weight = 1; + + while (pointer < lineLength) + { + Character letter = pageLine.charAt(pointer); + + if (length >= max || (letter == '\u00a7' && length + 1 >= max)) + { + tempLine = pageLine.substring(start, pointer); + pageLines.add(tempLine); + start = pointer; + length = 0; + } + + if (letter == '\u00a7' && pointer + 1 < lineLength) + { + Character nextLetter = pageLine.charAt(pointer + 1); + if (nextLetter == 'l' || nextLetter == 'L') + { + weight = 1.25; + } + else + { + weight = 1; + } + pointer++; + } + else if (letter == ' ') + { + length += (0.7 * weight); + } + else + { + length += weight; + } + pointer++; + } + if (length > 0) + { + tempLine = pageLine.substring(start, lineLength); + pageLines.add(tempLine); + } + } + + List pages = new ArrayList(); + for (int count = 0; count < pageLines.size(); count += 12) + { + StringBuilder newPage = new StringBuilder(); + for (int i = count; i < count + 12 && i < pageLines.size(); i++) + { + newPage.append("\n").append(pageLines.get(i)); + } + + pages.add(newPage.toString()); + } + + return pages; + } +} diff --git a/Essentials/src/com/earth2me/essentials/textreader/HelpInput.java b/Essentials/src/com/earth2me/essentials/textreader/HelpInput.java index 4efb6c43fe..b091e2135e 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/HelpInput.java +++ b/Essentials/src/com/earth2me/essentials/textreader/HelpInput.java @@ -47,6 +47,7 @@ public HelpInput(final User user, final String match, final IEssentials ess) thr newLines.clear(); lines.add(_("helpFrom", p.getDescription().getName())); } + final boolean isOnWhitelist = user.isAuthorized("essentials.help." + pluginNameLow); for (Map.Entry> k : cmds.entrySet()) { @@ -81,7 +82,7 @@ else if (value.containsKey(PERMISSIONS)) { permissions = value.get(PERMISSIONS); } - if (user.isAuthorized("essentials.help." + pluginNameLow)) + if (isOnWhitelist || user.isAuthorized("essentials.help." + pluginNameLow + "." + k.getKey())) { pluginLines.add(_("helpLine", k.getKey(), value.get(DESCRIPTION))); } diff --git a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java index d8e590300a..2a95d4d84b 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java +++ b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.DescParseTickFormat; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; @@ -40,9 +41,9 @@ private void replaceKeywords(final CommandSender sender) user.setDisplayNick(); displayName = user.getDisplayName(); userName = user.getName(); - ipAddress = user.getAddress().getAddress().toString(); - address = user.getAddress().toString(); - balance = Double.toString(user.getMoney()); + ipAddress = user.getAddress() == null || user.getAddress().getAddress() == null ? "" : user.getAddress().getAddress().toString(); + address = user.getAddress() == null ? "" : user.getAddress().toString(); + balance = Util.displayCurrency(user.getMoney(), ess); mails = Integer.toString(user.getMails().size()); world = user.getLocation() == null || user.getLocation().getWorld() == null ? "" : user.getLocation().getWorld().getName(); worldTime12 = DescParseTickFormat.format12(user.getWorld() == null ? 0 : user.getWorld().getTime()); diff --git a/Essentials/src/com/earth2me/essentials/textreader/SimpleTextInput.java b/Essentials/src/com/earth2me/essentials/textreader/SimpleTextInput.java index a9f9e14809..f15ce6df56 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/SimpleTextInput.java +++ b/Essentials/src/com/earth2me/essentials/textreader/SimpleTextInput.java @@ -1,19 +1,26 @@ package com.earth2me.essentials.textreader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; public class SimpleTextInput implements IText { private final transient List lines = new ArrayList(); - - public SimpleTextInput (final String input) { - lines.add(input); + + public SimpleTextInput(final String input) + { + lines.addAll(Arrays.asList(input.split("\\n"))); + } + + public SimpleTextInput(final List input) + { + lines.addAll(input); } - + + public SimpleTextInput() + { + } + @Override public List getLines() { @@ -31,5 +38,4 @@ public Map getBookmarks() { return Collections.emptyMap(); } - } diff --git a/Essentials/src/com/earth2me/essentials/textreader/SimpleTextPager.java b/Essentials/src/com/earth2me/essentials/textreader/SimpleTextPager.java index ea1b787d5f..5376abbd2c 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/SimpleTextPager.java +++ b/Essentials/src/com/earth2me/essentials/textreader/SimpleTextPager.java @@ -1,5 +1,6 @@ package com.earth2me.essentials.textreader; +import java.util.List; import org.bukkit.command.CommandSender; @@ -20,7 +21,12 @@ public void showPage(final CommandSender sender) } } - public String getString(int line) + public List getLines() + { + return text.getLines(); + } + + public String getLine(int line) { if (text.getLines().size() < line) { diff --git a/Essentials/src/com/earth2me/essentials/textreader/TextPager.java b/Essentials/src/com/earth2me/essentials/textreader/TextPager.java index cb70839ddb..d03762ded4 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/TextPager.java +++ b/Essentials/src/com/earth2me/essentials/textreader/TextPager.java @@ -30,58 +30,13 @@ public void showPage(final String pageStr, final String chapterPageStr, final St List chapters = text.getChapters(); Map bookmarks = text.getBookmarks(); - if (bookmarks.isEmpty()) - { - int page = 1; - try - { - page = Integer.parseInt(pageStr); - } - catch (Exception ex) - { - page = 1; - } - if (page < 1) - { - page = 1; - } - - final int start = onePage ? 0 : (page - 1) * 9; - final int pages = lines.size() / 9 + (lines.size() % 9 > 0 ? 1 : 0); - if (!onePage) - { - StringBuilder content = new StringBuilder(); - final String[] title = commandName.split(" ", 2); - if (title.length > 1) - { - content.append(I18n.capitalCase(title[0])).append(": "); - content.append(title[1]); - } - else if (chapterPageStr != null) - { - content.append(I18n.capitalCase(commandName)).append(": "); - content.append(chapterPageStr); - } - else - { - content.append(I18n.capitalCase(commandName)); - } - sender.sendMessage(_("infoPages", page, pages, content)); - } - for (int i = start; i < lines.size() && i < start + (onePage ? 20 : 9); i++) - { - sender.sendMessage(lines.get(i)); - } - if (!onePage && page < pages) - { - sender.sendMessage(_("readNextPage", commandName, page + 1)); - } - return; - } - + //This code deals with the initial chapter. We use this to display the initial output or contents. + //We also use this code to display some extra information if we don't intend to use chapters if (pageStr == null || pageStr.isEmpty() || pageStr.matches("[0-9]+")) { - if (lines.get(0).startsWith("#")) + //If an info file starts with a chapter title, list the chapters + //If not display the text up until the first chapter. + if (!lines.isEmpty() && lines.get(0).startsWith("#")) { if (onePage) { @@ -130,16 +85,32 @@ else if (chapterPageStr != null) } int pages = end / 9 + (end % 9 > 0 ? 1 : 0); - if (!onePage) + if (!onePage && commandName != null) { - sender.sendMessage(_("infoPages", page, pages, I18n.capitalCase(commandName))); + StringBuilder content = new StringBuilder(); + final String[] title = commandName.split(" ", 2); + if (title.length > 1) + { + content.append(I18n.capitalCase(title[0])).append(": "); + content.append(title[1]); + } + else if (chapterPageStr != null) + { + content.append(I18n.capitalCase(commandName)).append(": "); + content.append(chapterPageStr); + } + else + { + content.append(I18n.capitalCase(commandName)); + } + sender.sendMessage(_("infoPages", page, pages, content)); } for (int i = start; i < end && i < start + (onePage ? 20 : 9); i++) { - sender.sendMessage(lines.get(i)); + sender.sendMessage("§r" + lines.get(i)); } - if (!onePage && page < pages) + if (!onePage && page < pages && commandName != null) { sender.sendMessage(_("readNextPage", commandName, page + 1)); } @@ -147,6 +118,7 @@ else if (chapterPageStr != null) } } + //If we have a chapter, check to see if we have a page number int chapterpage = 0; if (chapterPageStr != null) { @@ -164,11 +136,14 @@ else if (chapterPageStr != null) } } + //This checks to see if we have the chapter in the index if (!bookmarks.containsKey(pageStr.toLowerCase(Locale.ENGLISH))) { sender.sendMessage(_("infoUnknownChapter")); return; } + + //Since we have a valid chapter, count the number of lines in the chapter final int chapterstart = bookmarks.get(pageStr.toLowerCase(Locale.ENGLISH)) + 1; int chapterend; for (chapterend = chapterstart; chapterend < lines.size(); chapterend++) @@ -179,19 +154,20 @@ else if (chapterPageStr != null) break; } } + + //Display the chapter from the starting position final int start = chapterstart + (onePage ? 0 : chapterpage * 9); - final int page = chapterpage + 1; final int pages = (chapterend - chapterstart) / 9 + ((chapterend - chapterstart) % 9 > 0 ? 1 : 0); - if (!onePage) + if (!onePage && commandName != null) { sender.sendMessage(_("infoChapterPages", pageStr, page, pages)); } for (int i = start; i < chapterend && i < start + (onePage ? 20 : 9); i++) { - sender.sendMessage(lines.get(i)); + sender.sendMessage("§r" + lines.get(i)); } - if (!onePage && page < pages) + if (!onePage && page < pages && commandName != null) { sender.sendMessage(_("readNextPage", commandName, pageStr + " " + (page + 1))); } diff --git a/Essentials/src/com/earth2me/essentials/user/Ban.java b/Essentials/src/com/earth2me/essentials/user/Ban.java deleted file mode 100644 index ba1c223339..0000000000 --- a/Essentials/src/com/earth2me/essentials/user/Ban.java +++ /dev/null @@ -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; -} diff --git a/Essentials/src/com/earth2me/essentials/user/IOfflinePlayer.java b/Essentials/src/com/earth2me/essentials/user/IOfflinePlayer.java deleted file mode 100644 index 4cdee715ba..0000000000 --- a/Essentials/src/com/earth2me/essentials/user/IOfflinePlayer.java +++ /dev/null @@ -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); -} \ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/user/IOfflineUser.java b/Essentials/src/com/earth2me/essentials/user/IOfflineUser.java deleted file mode 100644 index d6266df496..0000000000 --- a/Essentials/src/com/earth2me/essentials/user/IOfflineUser.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.earth2me.essentials.user; - -import com.earth2me.essentials.storage.IStorageObjectHolder; - - -public interface IOfflineUser extends IStorageObjectHolder, IOfflinePlayer -{ - -} diff --git a/Essentials/src/com/earth2me/essentials/user/Inventory.java b/Essentials/src/com/earth2me/essentials/user/Inventory.java deleted file mode 100644 index 0812f54a09..0000000000 --- a/Essentials/src/com/earth2me/essentials/user/Inventory.java +++ /dev/null @@ -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 items = new HashMap(); - - public Inventory() - { - items.put(1, new ItemStack(Material.APPLE, 64)); - } -} diff --git a/Essentials/src/com/earth2me/essentials/user/User.java b/Essentials/src/com/earth2me/essentials/user/User.java deleted file mode 100644 index 589e267378..0000000000 --- a/Essentials/src/com/earth2me/essentials/user/User.java +++ /dev/null @@ -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; - } -} diff --git a/Essentials/src/com/earth2me/essentials/user/UserBase.java b/Essentials/src/com/earth2me/essentials/user/UserBase.java deleted file mode 100644 index 587ed084b0..0000000000 --- a/Essentials/src/com/earth2me/essentials/user/UserBase.java +++ /dev/null @@ -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 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()); - } -} diff --git a/Essentials/src/com/earth2me/essentials/user/UserData.java b/Essentials/src/com/earth2me/essentials/user/UserData.java deleted file mode 100644 index 4586d06274..0000000000 --- a/Essentials/src/com/earth2me/essentials/user/UserData.java +++ /dev/null @@ -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 homes = new HashMap(); - @ListType(Material.class) - private Set unlimited = new HashSet(); - @MapValueType(List.class) - @MapKeyType(Material.class) - private Map> powerTools = new HashMap>(); - private Location lastLocation; - @MapValueType(Long.class) - private Map timestamps; - private String jail; - @ListType - private List mails; - private Inventory inventory; - private boolean teleportEnabled; - @ListType - private Set 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")); - } -} diff --git a/Essentials/src/com/earth2me/essentials/user/UserMap.java b/Essentials/src/com/earth2me/essentials/user/UserMap.java deleted file mode 100644 index 821ee4c8ff..0000000000 --- a/Essentials/src/com/earth2me/essentials/user/UserMap.java +++ /dev/null @@ -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 implements IConf -{ - private final transient IEssentials ess; - private final transient Cache users = CacheBuilder.newBuilder().softValues().build(this); - private final transient ConcurrentSkipListSet keys = new ConcurrentSkipListSet(); - - 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 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"); - } -} diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index cea97aa92a..e5b2f330ae 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -7,16 +7,11 @@ # If you want to use special characters in this document, such as accented letters, you MUST save the file as UTF-8, not ANSI. # If you receive an error when Essentials loads, ensure that: # - No tabs are present: YAML only allows spaces -# - Indents are correct: YAML heirarchy is based entirely on indentation -# - You have "escaped" all apostrophes in your text: If you want to write "don't", for example, write "don''t" instead (note the doubled apostrphe) -# - List items are prefixed with a hyphen and indented: -# lists: -# - look like this -# not: -# - like this +# - Indents are correct: YAML hierarchy is based entirely on indentation +# - You have "escaped" all apostrophes in your text: If you want to write "don't", for example, write "don''t" instead (note the doubled apostrophe) # - Text with symbols is enclosed in single or double quotation marks -# - CraftBukkit and Permissions have been updated: CraftBukkit and Essentials almost always line up, but sometimes other plugins fall behind CraftBukkit's multiple daily updates -# - You have saved the document as UTF-8, NOT the default, ANSI + +# If you have problems join the Essentials help support channel: http://tiny.cc/EssentialsChat ############################################################ # +------------------------------------------------------+ # @@ -25,7 +20,7 @@ ############################################################ # A color code between 0-9 or a-f. Set to 'none' to disable. -ops-name-color: 'c' +ops-name-color: '4' # The character(s) to prefix all nicknames, so that you know they are not true usernames. nickname-prefix: '~' @@ -37,11 +32,10 @@ change-displayname: true # The value of change-displayname (above) has to be true. #change-playerlist: true -# Adds the prefix and suffix to the displayname of the player, so it will be displayed in messages and lists. -# The prefix/suffix can be set using Permissions, Group Manager or PermissionsEx. +# When essentialschat.jar isn't used, force essentials to add the prefix and suffix from permission plugins to displayname. +# This setting is ignored if essentialschat.jar is used, and defaults to 'true'. # The value of change-displayname (above) has to be true. -# If you don't set this, it will default to true if essentials chat is installed. -# Don't forget to remove the # infront of the line +# Do not edit this setting unless you know what you are doing! #add-prefix-suffix: false # The delay, in seconds, required between /home, /tp, etc. @@ -50,18 +44,18 @@ teleport-cooldown: 0 # The delay, in seconds, before a user actually teleports. If the user moves or gets attacked in this timeframe, the teleport never occurs. teleport-delay: 0 -# The delay, in seconds, a player can't be attacked by other players after he has been teleported by a command -# This will also prevent that the player can attack other players -teleport-invulnerability: 2 +# The delay, in seconds, a player can't be attacked by other players after they have been teleported by a command. +# This will also prevent the player attacking other players. +teleport-invulnerability: 4 -# The delay, in seconds, required between /heal attempts +# The delay, in seconds, required between /heal attempts. heal-cooldown: 60 -# What to prevent from /i /give +# What to prevent from /i /give. # e.g item-spawn-blacklist: 46,11,10 item-spawn-blacklist: -# Set this to true if you want permission based item spawn rules +# Set this to true if you want permission based item spawn rules. # Note: The blacklist above will be ignored then. # Permissions: # - essentials.itemspawn.item-all @@ -70,43 +64,76 @@ item-spawn-blacklist: # - essentials.give.item-all # - essentials.give.item-[itemname] # - essentials.give.item-[itemid] +# For more information, visit http://wiki.ess3.net/wiki/Command_Reference/ICheat#Item.2FGive permission-based-item-spawn: false -# Mob limit on spawnmob +# Mob limit on the /spawnmob command per execution. spawnmob-limit: 10 -# Shall we notify users when using /lightning +# Shall we notify users when using /lightning? warn-on-smite: true -# motd and rules are now configured in the files motd.txt and rules.txt +# motd and rules are now configured in the files motd.txt and rules.txt. + +# When a command conflicts with another plugin, by default, Essentials will try to force the OTHER plugin to take priority. +# Commands in this list, will tell Essentials to 'not give up' the command to other plugins. +# In this state, which plugin 'wins' appears to be almost random. +# +# If you have two plugin with the same command and you wish to force Essentials to take over, you need an alias. +# To force essentials to take 'god' alias 'god' to 'egod'. +# See http://wiki.bukkit.org/Bukkit.yml#aliases for more information -# 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. overridden-commands: - - god +# - god +# - info -# Disabled commands will be completely unavailable on the server. +# Disabling commands here will prevent Essentials handling the command, this will not affect command conflicts. +# Commands should fallback to the vanilla versions if available. +# You should not have to disable commands used in other plugins, they will automatically get priority. disabled-commands: -# - nick +# - nick +# - clear -# Restricted commands have been removed. -# Now we have a whitelist, all commands not on this list are only available to ops. -# These will have NO EFFECT if you have Permissions installed! -# They are here only if you want something simpler than Permissions. +# These commands will be shown to players with socialSpy enabled. +# You can add commands from other plugins you may want to track or +# remove commands that are used for something you dont want to spy on. +socialspy-commands: + - msg + - w + - r + - mail + - m + - t + - whisper + - emsg + - tell + - er + - reply + - ereply + - email + - action + - describe + - eme + - eaction + - edescribe + - etell + - ewhisper + - pm + +# If you do not wish to use a permission system, you can define a list of 'player perms' below. +# This list has no effect if you are using a supported permissions system. +# If you are using an unsupported permissions system, simply delete this section. +# Whitelist the commands and permissions you wish to give players by default (everything else is op only). # These are the permissions without the "essentials." part. player-commands: - afk + - afk.auto - back - back.ondeath - balance - balance.others - balancetop + - build - chat.color - chat.format - chat.shout @@ -125,7 +152,7 @@ player-commands: - info - itemdb - kit - - kit.tools + - kits.tools - list - mail - mail.send @@ -137,8 +164,6 @@ player-commands: - near - pay - ping - - powertool - - powertooltoggle - protect - r - rules @@ -156,11 +181,13 @@ player-commands: - signs.use.disposal - signs.use.enchant - signs.use.free - - signs.use.gamemode + - signs.use.gamemode - signs.use.heal + - signs.use.info - signs.use.kit - signs.use.mail - signs.use.protection + - signs.use.repair - signs.use.sell - signs.use.time - signs.use.trade @@ -181,33 +208,50 @@ player-commands: # Note: All items MUST be followed by a quantity! # All kit names should be lower case, and will be treated as lower in permissions/costs. -# Syntax: - itemID[:DataValue] Amount [Enchantment:Level].. +# Syntax: - itemID[:DataValue/Durability] Amount [Enchantment:Level].. [itemmeta:value]... +# For Item meta information visit http://wiki.ess3.net/wiki/Item_Meta # 'delay' refers to the cooldown between how often you can use each kit, measured in seconds. +# For more information, visit http://wiki.ess3.net/wiki/Kits kits: - dtools: - delay: 10 - items: - - 277 1 efficiency:1 - - 278 1 - - 279:780 1 tools: delay: 10 items: - 272 1 - - 273 1 + - 273 1 - 274 1 - 275 1 + dtools: + delay: 600 + items: + - 278 1 efficiency:1 durability:1 fortune:1 name:&4Gigadrill lore:The_drill_that_&npierces|the_heavens + - 277 1 digspeed:3 name:Dwarf lore:Diggy|Diggy|Hole + - 298 1 color:255,255,255 name:Top_Hat lore:Good_day,_Good_day + - 279:780 1 + notch: + delay: 6000 + items: + - 397:3 1 player:Notch + color: + delay: 6000 + items: + - 387 1 title:&4Book_&9o_&6Colors author:KHobbits lore:Ingame_color_codes book:Colors + firework: + delay: 6000 + items: + - 401 1 name:Angry_Creeper color:red fade:green type:creeper power:1 + - 401 1 name:StarryNight color:yellow,orange fade:blue type:star effect:trail,twinkle power:1 + - 401 2 name:SolarWind color:yellow,orange fade:red shape:large effect:twinkle color:yellow,orange fade:red shape:ball effect:trail color:red,purple fade:pink shape:star effect:trail power:1 # Essentials Sign Control -# See http://ess.khhq.net/wiki/Sign_Tutorial for instructions on how to use these. +# See http://wiki.ess3.net/wiki/Sign_Tutorial for instructions on how to use these. # To enable signs, remove # symbol. To disable all signs, comment/remove each sign. # Essentials Colored sign support will be enabled when any sign types are enabled. -# We recommend not enabling chest protection signs if you don't intend to use them, (or are using LWC/Lockette). +# Color is not an actual sign, it's for enabling using color codes on signs, when the correct permissions are given. enabledSigns: #- color #- balance - #- buy + #- buy #- sell #- trade #- free @@ -218,20 +262,20 @@ enabledSigns: #- enchant #- gamemode #- heal + #- info #- spawnmob + #- repair #- time #- weather - #- protection - -# How many times per second can Essentials signs be interacted with. -# Values should be between 1-20, 20 being virtually no lag protection.s -# Lower numbers will reduce the possiblity of lag, but may annoy players. +# How many times per second can Essentials signs be interacted with per player. +# Values should be between 1-20, 20 being virtually no lag protection. +# Lower numbers will reduce the possibility of lag, but may annoy players. sign-use-per-second: 4 -# Backup runs a command while saving is disabled +# Backup runs a batch/bash command while saving is disabled. backup: - # Interval in minutes + # Interval in minutes. interval: 30 # Unless you add a valid backup command or script here, this feature will be useless. # Use 'save-all' to simply force regular world saving without backup. @@ -240,31 +284,42 @@ backup: # Set this true to enable permission per warp. per-warp-permission: false -# Sort output of /list command by groups -sort-list-by-groups: false - -# More output to the console +# Sort output of /list command by groups. +# You can hide and merge the groups displayed in /list by defining the desired behaviour here. +# Detailed instructions and examples can be found on the wiki: http://wiki.ess3.net/wiki/List +list: + # To merge groups, list the groups you wish to merge + #Staff: owner admin moderator + Admins: owner admin + # To limit groups, set a max user limit + #builder: 20 + # To hide groups, set the group as hidden + #default: hidden + # Uncomment the line below to simply list all players with no grouping + #Players: '*' + +# More output to the console. debug: false -# Set the locale for all messages +# Set the locale for all messages. # If you don't set this, the default locale of the server will be used. -# Don't forget to remove the # infront of the line -#locale: de_DE +# For example, to set language to English, set locale to en, to use the file "messages_en.properties". +# Don't forget to remove the # in front of the line. +# For more information, visit http://wiki.ess3.net/wiki/Locale +#locale: en -# Turn off god mode when people exit +# Turn off god mode when people exit. remove-god-on-disconnect: false -# Use the permission system of bukkit -# This only works if no other permission plugins are installed -use-bukkit-permissions: false - # Auto-AFK # After this timeout in seconds, the user will be set as afk. +# This feature requires the player to have essentials.afk.auto node. # Set to -1 for no timeout. auto-afk: 300 # Auto-AFK Kick # After this timeout in seconds, the user will be kicked from the server. +# essentials.afk.kickexempt node overrides this feature. # Set to -1 for no timeout. auto-afk-kick: -1 @@ -278,66 +333,86 @@ freeze-afk-players: false # Enable this, when you don't want people idling in mob traps. disable-item-pickup-while-afk: false +# This setting controls if a player is marked as active on interaction. +# When this setting is false, you will need to manually un-AFK using the /afk command. +cancel-afk-on-interact: true + # Should we automatically remove afk status when the player moves? -# Player will be removed from afk on chat/command reguardless of this setting. +# Player will be removed from AFK on chat/command regardless of this setting. # Disable this to reduce server lag. cancel-afk-on-move: true -# You can disable the death messages of minecraft here +# You can disable the death messages of Minecraft here. death-messages: true -# Add worlds to this list, if you want to automatically disable god mode there +# Add worlds to this list, if you want to automatically disable god mode there. no-god-in-worlds: # - world_nether -# Set to true to enable per-world permissions for teleporting between worlds with essentials commands +# Set to true to enable per-world permissions for teleporting between worlds with essentials commands. # This applies to /world, /back, /tp[a|o][here|all], but not warps. -# Give someone permission to teleport to a world with essentials.world. +# Give someone permission to teleport to a world with essentials.worlds. +# This does not affect the /home command, there is a separate toggle below for this. world-teleport-permissions: false # The number of items given if the quantity parameter is left out in /item or /give. -# If this number is below 1, the maximum stack size size is given. If oversized stacks -# is not enabled, any number higher then the maximum stack size results in more than one stack. +# If this number is below 1, the maximum stack size size is given. If over-sized stacks. +# are not enabled, any number higher than the maximum stack size results in more than one stack. default-stack-size: -1 -# Oversized stacks are stacks that ignore the normal max stacksize. +# Over-sized stacks are stacks that ignore the normal max stack size. # They can be obtained using /give and /item, if the player has essentials.oversizedstacks permission. -# How many items should be in a oversized stack? +# How many items should be in an over-sized stack? oversized-stacksize: 64 -# Do you allow to repair enchanted weapons and armor? -# If you set this to false, you can still allow it for certain players using the permission +# Allow repair of enchanted weapons and armor. +# If you set this to false, you can still allow it for certain players using the permission. # essentials.repair.enchanted repair-enchanted: true +# Allow 'unsafe' enchantments in kits and item spawning. +# Warning: Mixing and overleveling some enchantments can cause issues with clients, servers and plugins. +unsafe-enchantments: false + #Do you want essentials to keep track of previous location for /back in the teleport listener? #If you set this to true any plugin that uses teleport will have the previous location registered. register-back-in-listener: false -#Delay to wait before people can cause attack damage after logging in +#Delay to wait before people can cause attack damage after logging in. login-attack-delay: 5 +#Set the max fly speed, values range from 0.1 to 1.0 +max-fly-speed: 0.8 + +#Set the max walk speed, values range from 0.1 to 1.0 +max-walk-speed: 0.8 + +#Set the maximum amount of mail that can be sent within a minute. +mails-per-minute: 1000 + +# Set the maximum time /tempban can be used for in seconds. +# Set to -1 to disable, and essentials.tempban.unlimited can be used to override. +max-tempban-time: -1 + ############################################################ # +------------------------------------------------------+ # # | EssentialsHome | # # +------------------------------------------------------+ # ############################################################ -# If no home is set, send players to spawn when /home is used -spawn-if-no-home: true - -# Allows people to set their bed at daytime +# Allows people to set their bed at daytime. update-bed-at-daytime: true -# Set to true to enable per-world permissions for using homes to teleport between worlds +# Set to true to enable per-world permissions for using homes to teleport between worlds. # This applies to the /home only. -# Give someone permission to teleport to a world with essentials.world. +# Give someone permission to teleport to a world with essentials.worlds. world-home-permissions: false # Allow players to have multiple homes. -# Players need essentials.sethome.multiple before they can have more than 1 home, default to 'default' below. +# Players need essentials.sethome.multiple before they can have more than 1 home, defaults to 'default' below. # Define different amounts of multiple homes for different permissions, e.g. essentials.sethome.multiple.vip # People with essentials.sethome.multiple.unlimited are not limited by these numbers. +# For more information, visit http://wiki.ess3.net/wiki/Multihome sethome-multiple: default: 3 # essentials.sethome.multiple.vip @@ -346,8 +421,8 @@ sethome-multiple: staff: 10 # Set timeout in seconds for players to accept tpa before request is cancelled. -# Set to 0 for no timeout -tpa-accept-cancellation: 0 +# Set to 0 for no timeout. +tpa-accept-cancellation: 120 ############################################################ # +------------------------------------------------------+ # @@ -355,13 +430,16 @@ tpa-accept-cancellation: 0 # +------------------------------------------------------+ # ############################################################ +# For more information, visit http://wiki.ess3.net/wiki/Essentials_Economy + # Defines the balance with which new players begin. Defaults to 0. starting-balance: 0 # worth-# defines the value of an item when it is sold to the server via /sell. # These are now defined in worth.yml -# Defines the cost to use the given commands PER USE +# Defines the cost to use the given commands PER USE. +# Some commands like /repair have sub-costs, check the wiki for more information. command-costs: # /example costs $1000 PER USE #example: 1000 @@ -371,15 +449,15 @@ command-costs: # Set this to a currency symbol you want to use. currency-symbol: '$' -# 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 +# Set the maximum amount of money a player can have. +# The amount is always limited to 10 trillion because of the limitations of a java double. max-money: 10000000000000 -# Set the minimum amount of money a player can have (must be above the negitive of max-money). +# Set the minimum amount of money a player can have (must be above the negative of max-money). # Setting this to 0, will disable overdrafts/loans completely. Users need 'essentials.eco.loan' perm to go below 0. min-money: -10000 -# Enable this to log all interactions with trade/buy/sell signs and sell command +# Enable this to log all interactions with trade/buy/sell signs and sell command. economy-log-enabled: false ############################################################ @@ -388,13 +466,13 @@ economy-log-enabled: false # +------------------------------------------------------+ # ############################################################ -# Show other plugins commands in help +# Show other plugins commands in help. non-ess-in-help: true -# Hide plugins which dont give a permission +# Hide plugins which do not give a permission. # 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., anyone with essentials.* or '*' will see all help this setting reguardless. -# You can use negitive permissions to remove access to just a single plugins help if the following is enabled. +# The individual permission is: essentials.help., anyone with essentials.* or '*' will see all help regardless. +# You can use negative permissions to remove access to just a single plugins help if the following is enabled. hide-permissionless-help: true ############################################################ @@ -408,23 +486,23 @@ chat: # 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 (?) + # Users 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." radius: 0 - # Chat formatting can be done in two ways, you can either define a standard format for all chat + # Chat formatting can be done in two ways, you can either define a standard format for all chat. # Or you can give a group specific chat format, to give some extra variation. # If set to the default chat format which "should" be compatible with ichat. - # For more information of chat formatting, check out the wiki: http://ess.khhq.net/wiki/Chat_Formatting + # For more information of chat formatting, check out the wiki: http://wiki.ess3.net/wiki/Chat_Formatting format: '<{DISPLAYNAME}> {MESSAGE}' - #format: '&7[{GROUP}]&f {DISPLAYNAME}&7:&f {MESSAGE}' + #format: '&7[{GROUP}]&r {DISPLAYNAME}&7:&r {MESSAGE}' group-formats: - # Default: '{WORLDNAME} {DISPLAYNAME}&7:&f {MESSAGE}' - # Admins: '{WORLDNAME} &c[{GROUP}]&f {DISPLAYNAME}&7:&c {MESSAGE}' + # Default: '{WORLDNAME} {DISPLAYNAME}&7:&r {MESSAGE}' + # Admins: '{WORLDNAME} &c[{GROUP}]&r {DISPLAYNAME}&7:&c {MESSAGE}' - # If your using group formats make sure to remove the '#' to allow the setting to be read. + # If you are using group formats make sure to remove the '#' to allow the setting to be read. ############################################################ # +------------------------------------------------------+ # @@ -433,42 +511,8 @@ chat: ############################################################ protect: - # Database settings for sign/rail protection - - # mysql or sqlite - # We strongly recommend against using mysql here, unless you have a good reason. - # Sqlite seems to be faster in almost all cases, and in some cases mysql can be much slower. - datatype: 'sqlite' - - # If you specified MySQL above, you MUST enter the appropriate details here. - # If you specified SQLite above, these will be IGNORED. - username: 'root' - 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 + + # General physics/behavior modifications. prevent: lava-flow: false water-flow: false @@ -480,19 +524,25 @@ protect: portal-creation: false tnt-explosion: false tnt-playerdamage: false + tnt-minecart-explosion: false + tnt-minecart-playerdamage: false fireball-explosion: false fireball-fire: false fireball-playerdamage: false + witherskull-explosion: false + witherskull-playerdamage: false + wither-spawnexplosion: false + wither-blockreplace: false creeper-explosion: false creeper-playerdamage: false creeper-blockdamage: false enderdragon-blockdamage: true enderman-pickup: false villager-death: false - # Monsters won't follow players - # permission essentials.protect.entitytarget.bypass disables this + # Monsters won't follow players. + # permission essentials.protect.entitytarget.bypass disables this. entitytarget: false - # Prevent the spawning of creatures + # Prevent the spawning of creatures. spawn: creeper: false skeleton: false @@ -510,7 +560,7 @@ protect: ender_dragon: false pig: false sheep: false - cow: false + cow: false chicken: false squid: false wolf: false @@ -519,32 +569,16 @@ protect: ocelot: false iron_golem: false villager: false - + wither: false + bat: false + witch: false + # Maximum height the creeper should explode. -1 allows them to explode everywhere. # Set prevent.creeper-explosion to true, if you want to disable creeper explosions. creeper: max-height: -1 - # Protect various blocks. - protect: - # Protect all signs - signs: true - - # Prevent users from destroying rails - rails: true - - # 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. - # This only has an effect if "rails" or "signs" is also enabled. - block-below: true - - # Prevent placing blocks above protected rails, this is to stop a potential griefing - prevent-block-on-rails: false - - # Store blocks / signs in memory before writing - memstore: false - - # Disable various default physics and behaviors + # Disable various default physics and behaviors. disable: # Should fall damage be disabled? fall: false @@ -554,14 +588,14 @@ protect: pvp: false # Should drowning damage be disabled? - # (Split into two behaviors; generally, you want both set to the same value) + # (Split into two behaviors; generally, you want both set to the same value.) drown: false suffocate: false # Should damage via lava be disabled? Items that fall into lava will still burn to a crisp. ;) lavadmg: false - # Should arrow damage be disabled + # Should arrow damage be disabled? projectiles: false # This will disable damage from touching cacti. @@ -572,23 +606,62 @@ protect: # Should the damage after hit by a lightning be disabled? lightning: false + + # Should Wither damage be disabled? + wither: false + + # Disable weather options? + weather: + storm: false + thunder: false + lightning: false + +############################################################ +# +------------------------------------------------------+ # +# | EssentialsAntiBuild | # +# +------------------------------------------------------+ # +############################################################ + + # Disable various default physics and behaviors + # For more information, visit http://wiki.ess3.net/wiki/AntiBuild - # Should people with build: false in permissions be allowed to build - # Set true to disable building for those people + # Should people with build: false in permissions be allowed to build? + # Set true to disable building for those people. + # Setting to false means EssentialsAntiBuild will never prevent you from building. build: true - # Should people with build: false in permissions be allowed to use items - # Set true to disable using for those people + # Should people with build: false in permissions be allowed to use items? + # Set true to disable using for those people. + # Setting to false means EssentialsAntiBuild will never prevent you from using. use: true - # Should we tell people they are not allowed to build + # Should we tell people they are not allowed to build? warn-on-build-disallow: true - # Disable weather options - weather: - storm: false - thunder: false - lightning: false + # 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: + + # Which blocks should not be dispensed by dispensers + dispenser: ############################################################ # +------------------------------------------------------+ # @@ -606,15 +679,15 @@ newbies: # When we spawn for the first time, which spawnpoint do we use? # Set to "none" if you want to use the spawn point of the world. spawnpoint: newbies - + # Do we want to give users anything on first join? Set to '' to disable - # This kit will be given reguardless of cost, and permissions. + # This kit will be given regardless of cost, and permissions. #kit: '' kit: tools -# Set this to lowest, if you want Multiverse to handle the respawning -# Set this to high, if you want EssentialsSpawn to handle the respawning -# Set this to highest, if you want to force EssentialsSpawn to handle the respawning +# Set this to lowest, if you want Multiverse to handle the respawning. +# Set this to high, if you want EssentialsSpawn to handle the respawning. +# Set this to highest, if you want to force EssentialsSpawn to handle the respawning. respawn-listener-priority: high # When users die, should they respawn at their first home or bed, instead of the spawnpoint? diff --git a/Essentials/src/info.txt b/Essentials/src/info.txt index cfc0370404..fbd433843d 100644 --- a/Essentials/src/info.txt +++ b/Essentials/src/info.txt @@ -25,28 +25,30 @@ when he does not select a chapter. #Colors Minecraft colors: -&0 &&0 &1 &&1 &2 &&2 &3 &&3 -&4 &&4 &5 &&5 &6 &&6 &7 &&7 -&8 &&8 &9 &&9 &a &&a &b &&b -&c &&c &d &&d &e &&e &f &&f -&&k &k Magic! +&0 &&0 &1 &&1 &2 &&2 &3 &&3 +&4 &&4 &5 &&5 &6 &&6 &7 &&7 +&8 &&8 &9 &&9 &a &&a &b &&b +&c &&c &d &&d &e &&e &f &&f +&0 +&&k &kMagic&r &&l &lBold +&&m &mStrike&r &&n &nUline +&&o &oItalic&r &&r &rReset #Tags -PLAYER: {PLAYER} -USERNAME: {PLAYER} -IP: {IP} -ADDRESS: {ADDRESS} -BALANCE: {BALANCE} -MAILS: {MAILS} -WORLD: {WORLD} -WORLDS: {WORLDS} -ONLINE: {ONLINE} -UNIQUE: {UNIQUE} -PLAYERLIST: {PLAYERLIST} -TIME: {TIME} -DATE: {DATE} -WORLDTIME12: {WORLDTIME12} -WORLDTIME24: {WORLDTIME24} -WORLDDATE: {WORLDDATE} -PLUGINS: {PLUGINS} -VERSION: {VERSION} \ No newline at end of file +&6Player name:&r {PLAYER} +&6IP:&r {IP} +&6Address:&r {ADDRESS} +&6Balance:&r {BALANCE} +&6Unread mails:&r {MAILS} +&6Current world:&r {WORLD} +&6Worlds list:&r {WORLDS} +&6Number of online players:&r {ONLINE} +&6Number of unique players who joined the server:&r {UNIQUE} +&6Player list:&r {PLAYERLIST} +&6Time of server:&r {TIME} +&6Date of server:&r {DATE} +&6Time of world PM/AM:&r {WORLDTIME12} +&6Time of world:&r {WORLDTIME24} +&6Date of world:&r {WORLDDATE} +&6Plugin list:&r {PLUGINS} +&6Version of Craftbukkit:&r {VERSION} \ No newline at end of file diff --git a/Essentials/src/items.csv b/Essentials/src/items.csv index 4589998272..7227bd5071 100644 --- a/Essentials/src/items.csv +++ b/Essentials/src/items.csv @@ -1,4 +1,4 @@ -#version: teamcity +#version: TeamCity #If you change this file, it will not be automatically updated after the next release, #item,id,metadata stone,1,0 @@ -7,10 +7,15 @@ smoothstone,1,0 rock,1,0 grass,2,0 greendirt,2,0 +greenearth,2,0 +greenland,2,0 dirt,3,0 +earth,3,0 +land,3,0 cobblestone,4,0 cstone,4,0 cobble,4,0 +wood,5,0 plank,5,0 woodenplank,5,0 woodplank,5,0 @@ -18,6 +23,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 @@ -32,6 +51,20 @@ dwplank,5,1 dplankwooden,5,1 dplankwood,5,1 dplankw,5,1 +spruceplank,5,1 +sprucewoodenplank,5,1 +sprucewoodplank,5,1 +sprucewplank,5,1 +spruceplankwooden,5,1 +spruceplankwood,5,1 +spruceplankw,5,1 +splank,5,1 +swoodenplank,5,1 +swoodplank,5,1 +swplank,5,1 +splankwooden,5,1 +splankwood,5,1 +splankw,5,1 pineplank,5,1 pinewoodenplank,5,1 pinewoodplank,5,1 @@ -53,13 +86,13 @@ lightwplank,5,2 lightplankwooden,5,2 lightplankwood,5,2 lightplankw,5,2 -liteplank,5,2 -litewoodenplank,5,2 -litewoodplank,5,2 -litewplank,5,2 -liteplankwooden,5,2 -liteplankwood,5,2 -liteplankw,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 @@ -74,6 +107,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 @@ -88,6 +134,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 @@ -97,216 +157,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 -normaltreesap,6,0 -normallogsap,6,0 -normaltrunksap,6,0 -normalwoodsap,6,0 -osap,6,0 -otreesap,6,0 -ologsap,6,0 -otrunksap,6,0 -owoodsap,6,0 -nsap,6,0 -ntreesap,6,0 -nlogsap,6,0 -ntrunksap,6,0 -nwoodsap,6,0 -redsapling,6,1 -redtreesapling,6,1 -redlogsapling,6,1 -redtrunksapling,6,1 -redwoodsapling,6,1 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 -pinesapling,6,1 -pinetreesapling,6,1 -pinelogsapling,6,1 -pinetrunksapling,6,1 -pinewoodsapling,6,1 sprucesapling,6,1 sprucetreesapling,6,1 sprucelogsapling,6,1 sprucetrunksapling,6,1 sprucewoodsapling,6,1 -rsapling,6,1 -rtreesapling,6,1 -rlogsapling,6,1 -rtrunksapling,6,1 -rwoodsapling,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 -psapling,6,1 -ptreesapling,6,1 -plogsapling,6,1 -ptrunksapling,6,1 -pwoodsapling,6,1 ssapling,6,1 streesapling,6,1 slogsapling,6,1 strunksapling,6,1 swoodsapling,6,1 -redsap,6,1 -redtreesap,6,1 -redlogsap,6,1 -redtrunksap,6,1 -redwoodsap,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 -rsap,6,1 -rtreesap,6,1 -rlogsap,6,1 -rtrunksap,6,1 -rwoodsap,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 -psap,6,1 -ptreesap,6,1 -plogsap,6,1 -ptrunksap,6,1 -pwoodsap,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 -pandasapling,6,2 -pandatreesapling,6,2 -pandalogsapling,6,2 -pandatrunksapling,6,2 -pandawoodsapling,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 -pandasap,6,2 -pandatreesap,6,2 -pandalogsap,6,2 -pandatrunksap,6,2 -pandawoodsap,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 @@ -347,200 +282,274 @@ core,16,0 tree,17,0 log,17,0 trunk,17,0 -wood,17,0 +oak,17,0 oaktree,17,0 oaklog,17,0 oaktrunk,17,0 oakwood,17,0 -normaltree,17,0 -normallog,17,0 -normaltrunk,17,0 -normalwood,17,0 otree,17,0 olog,17,0 otrunk,17,0 owood,17,0 -ntree,17,0 -nlog,17,0 -ntrunk,17,0 -nwood,17,0 -redtree,17,1 -redlog,17,1 -redtrunk,17,1 -redwood,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 -pine,17,1 -pinetree,17,1 -pinelog,17,1 -pinetrunk,17,1 -pinewood,17,1 spruce,17,1 sprucetree,17,1 sprucelog,17,1 sprucetrunk,17,1 sprucewood,17,1 -rtree,17,1 -rlog,17,1 -rtrunk,17,1 -rwood,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 -ptree,17,1 -plog,17,1 -ptrunk,17,1 -pwood,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 -pandatree,17,2 -pandalog,17,2 -pandatrunk,17,2 -pandawood,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 +lighttree,17,2 +lightlog,17,2 +lighttrunk,17,2 +lightwood,17,2 btree,17,2 blog,17,2 btrunk,17,2 bwood,17,2 -patree,17,2 -palog,17,2 -patrunk,17,2 -pawood,17,2 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 -leaves,18,4 -leaf,18,4 -treeleaves,18,4 -logleaves,18,4 -trunkleaves,18,4 -woodleaves,18,4 -oaktreeleaves,18,4 -oaklogleaves,18,4 -oaktrunkleaves,18,4 -oakwoodleaves,18,4 -normaltreeleaves,18,4 -normallogleaves,18,4 -normaltrunkleaves,18,4 -normalwoodleaves,18,4 -otreeleaves,18,4 -ologleaves,18,4 -otrunkleaves,18,4 -owoodleaves,18,4 -ntreeleaves,18,4 -nlogleaves,18,4 -ntrunkleaves,18,4 -nwoodleaves,18,4 -treeleaf,18,4 -logleaf,18,4 -trunkleaf,18,4 -woodleaf,18,4 -oaktreeleaf,18,4 -oaklogleaf,18,4 -oaktrunkleaf,18,4 -oakwoodleaf,18,4 -normaltreeleaf,18,4 -normallogleaf,18,4 -normaltrunkleaf,18,4 -normalwoodleaf,18,4 -otreeleaf,18,4 -ologleaf,18,4 -otrunkleaf,18,4 -owoodleaf,18,4 -ntreeleaf,18,4 -nlogleaf,18,4 -ntrunkleaf,18,4 -nwoodleaf,18,4 -pineleaves,18,5 -pineleaf,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 -pitreeleaves,18,5 -pilogleaves,18,5 -pitrunkleaves,18,5 -piwoodleaves,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 -pitreeleaf,18,5 -pilogleaf,18,5 -pitrunkleaf,18,5 -piwoodleaf,18,5 -birchleaves,18,6 -birchleaf,18,6 -birchtreeleaves,18,6 -birchlogleaves,18,6 -birchtrunkleaves,18,6 -birchwoodleaves,18,6 -btreeleaves,18,6 -blogleaves,18,6 -btrunkleaves,18,6 -bwoodleaves,18,6 -bitreeleaves,18,6 -bilogleaves,18,6 -bitrunkleaves,18,6 -biwoodleaves,18,6 -birchtreeleaf,18,6 -birchlogleaf,18,6 -birchtrunkleaf,18,6 -birchwoodleaf,18,6 -btreeleaf,18,6 -blogleaf,18,6 -btrunkleaf,18,6 -bwoodleaf,18,6 -bitreeleaf,18,6 -bilogleaf,18,6 -bitrunkleaf,18,6 -biwoodleaf,18,6 -jungleleaves,18,7 -jleaves,18,7 -jleaf,18,7 -jungleleaf,18,7 -monkeyleaf,18,7 -monkeyleaves,18,7 +jtrunk,17,3 +jwood,17,3 +ftree,17,3 +flog,17,3 +ftrunk,17,3 +fwood,17,3 +leaves,18,0 +leaf,18,0 +treeleaves,18,0 +logleaves,18,0 +trunkleaves,18,0 +woodleaves,18,0 +oakleaves,18,0 +oakleaf,18,0 +oleaves,18,0 +oleaf,18,0 +oaktreeleaves,18,0 +oaklogleaves,18,0 +oaktrunkleaves,18,0 +oakwoodleaves,18,0 +otreeleaves,18,0 +ologleaves,18,0 +otrunkleaves,18,0 +owoodleaves,18,0 +treeleaf,18,0 +logleaf,18,0 +trunkleaf,18,0 +woodleaf,18,0 +oaktreeleaf,18,0 +oaklogleaf,18,0 +oaktrunkleaf,18,0 +oakwoodleaf,18,0 +otreeleaf,18,0 +ologleaf,18,0 +otrunkleaf,18,0 +owoodleaf,18,0 +spruceleaves,18,1 +spruceleaf,18,1 +sleaves,18,1 +sleaf,18,1 +sprucetreeleaves,18,1 +sprucelogleaves,18,1 +sprucetrunkleaves,18,1 +sprucewoodleaves,18,1 +streeleaves,18,1 +slogleaves,18,1 +strunkleaves,18,1 +swoodleaves,18,1 +pineleaves,18,1 +pineleaf,18,1 +pleaves,18,1 +pleaf,18,1 +pinetreeleaves,18,1 +pinelogleaves,18,1 +pinetrunkleaves,18,1 +pinewoodleaves,18,1 +ptreeleaves,18,1 +plogleaves,18,1 +ptrunkleaves,18,1 +pwoodleaves,18,1 +darkleaves,18,1 +darkleaf,18,1 +dleaves,18,1 +dleaf,18,1 +darktreeleaves,18,1 +darklogleaves,18,1 +darktrunkleaves,18,1 +darkwoodleaves,18,1 +dtreeleaves,18,1 +dlogleaves,18,1 +dtrunkleaves,18,1 +dwoodleaves,18,1 +sprucetreeleaf,18,1 +sprucelogleaf,18,1 +sprucetrunkleaf,18,1 +sprucewoodleaf,18,1 +streeleaf,18,1 +slogleaf,18,1 +strunkleaf,18,1 +swoodleaf,18,1 +pinetreeleaf,18,1 +pinelogleaf,18,1 +pinetrunkleaf,18,1 +pinewoodleaf,18,1 +ptreeleaf,18,1 +plogleaf,18,1 +ptrunkleaf,18,1 +pwoodleaf,18,1 +darktreeleaf,18,1 +darklogleaf,18,1 +darktrunkleaf,18,1 +darkwoodleaf,18,1 +dtreeleaf,18,1 +dlogleaf,18,1 +dtrunkleaf,18,1 +dwoodleaf,18,1 +birchleaves,18,2 +birchleaf,18,2 +bleaves,18,2 +bleaf,18,2 +birchtreeleaves,18,2 +birchlogleaves,18,2 +birchtrunkleaves,18,2 +birchwoodleaves,18,2 +btreeleaves,18,2 +blogleaves,18,2 +btrunkleaves,18,2 +bwoodleaves,18,2 +lightleaves,18,2 +lightleaf,18,2 +lleaves,18,2 +lleaf,18,2 +lighttreeleaves,18,2 +lightlogleaves,18,2 +lighttrunkleaves,18,2 +lightwoodleaves,18,2 +ltreeleaves,18,2 +llogleaves,18,2 +ltrunkleaves,18,2 +lwoodleaves,18,2 +whiteleaves,18,2 +whiteleaf,18,2 +wleaves,18,2 +wleaf,18,2 +whitetreeleaves,18,2 +whitelogleaves,18,2 +whitetrunkleaves,18,2 +whitewoodleaves,18,2 +wtreeleaves,18,2 +wlogleaves,18,2 +wtrunkleaves,18,2 +wwoodleaves,18,2 +birchtreeleaf,18,2 +birchlogleaf,18,2 +birchtrunkleaf,18,2 +birchwoodleaf,18,2 +btreeleaf,18,2 +blogleaf,18,2 +btrunkleaf,18,2 +bwoodleaf,18,2 +lighttreeleaf,18,2 +lightlogleaf,18,2 +lighttrunkleaf,18,2 +lightwoodleaf,18,2 +ltreeleaf,18,2 +llogleaf,18,2 +ltrunkleaf,18,2 +lwoodleaf,18,2 +whitetreeleaf,18,2 +whitelogleaf,18,2 +whitetrunkleaf,18,2 +whitewoodleaf,18,2 +wtreeleaf,18,2 +wlogleaf,18,2 +wtrunkleaf,18,2 +wwoodleaf,18,2 +jungleleaves,18,3 +jungleleaf,18,3 +jleaves,18,3 +jleaf,18,3 +jungletreeleaves,18,3 +junglelogleaves,18,3 +jungletrunkleaves,18,3 +junglewoodleaves,18,3 +jtreeleaves,18,3 +jlogleaves,18,3 +jtrunkleaves,18,3 +jwoodleaves,18,3 +forestleaves,18,3 +forestleaf,18,3 +fleaves,18,3 +fleaf,18,3 +foresttreeleaves,18,3 +forestlogleaves,18,3 +foresttrunkleaves,18,3 +forestwoodleaves,18,3 +ftreeleaves,18,3 +flogleaves,18,3 +ftrunkleaves,18,3 +fwoodleaves,18,3 +jungletreeleaf,18,3 +junglelogleaf,18,3 +jungletrunkleaf,18,3 +junglewoodleaf,18,3 +jtreeleaf,18,3 +jlogleaf,18,3 +jtrunkleaf,18,3 +jwoodleaf,18,3 +foresttreeleaf,18,3 +forestlogleaf,18,3 +foresttrunkleaf,18,3 +forestwoodleaf,18,3 +ftreeleaf,18,3 +flogleaf,18,3 +ftrunkleaf,18,3 +fwoodleaf,18,3 sponge,19,0 glass,20,0 lapislazuliore,21,0 @@ -558,7 +567,7 @@ blocklapislazuli,22,0 lapisblock,22,0 blocklapis,22,0 lblock,22,0 -blockl,22,9 +blockl,22,0 dispenser,23,0 dispense,23,0 sandstone,24,0 @@ -590,97 +599,95 @@ nblock,25,0 mblock,25,0 bedblock,26,0 poweredtrack,27,0 +poweredrails,27,0 poweredrail,27,0 boostertrack,27,0 +boosterrails,27,0 boosterrail,27,0 powertrack,27,0 +powerrails,27,0 powerrail,27,0 boosttrack,27,0 +boostrails,27,0 boostrail,27,0 ptrack,27,0 +prails,27,0 prail,27,0 btrack,27,0 +brails,27,0 brail,27,0 detectortrack,28,0 +detectorrails,28,0 detectorrail,28,0 detectingtrack,28,0 +detectingrails,28,0 detectingrail,28,0 detecttrack,28,0 +detectrails,28,0 detectrail,28,0 dtrack,28,0 +drails,28,0 drail,28,0 -stickypistonbase,29,7 -stickypiston,29,7 -stickpistonbase,29,7 -stickpiston,29,7 -stickyp,29,7 -spistonbase,29,7 -spiston,29,7 -pistonstickybase,29,7 -pistonsticky,29,7 -pistonstickbase,29,7 -pistonstick,29,7 -pistonsbase,29,7 -pistons,29,7 -psticky,29,7 -pstick,29,7 +stickypistonbase,29,0 +stickypiston,29,0 +stickpistonbase,29,0 +stickpiston,29,0 +stickyp,29,0 +spistonbase,29,0 +spiston,29,0 +pistonstickybase,29,0 +pistonsticky,29,0 +pistonstickbase,29,0 +pistonstick,29,0 +pistonsbase,29,0 +pistons,29,0 +psticky,29,0 +pstick,29,0 spiderweb,30,0 sweb,30,0 web,30,0 -longgrass,31,0 -tallgrass,31,0 -wildgrass,31,0 -grasslong,31,0 -grasstall,31,0 -grasswild,31,0 -lgrass,31,0 -tgrass,31,0 -wgrass,31,0 -grassl,31,0 -grasst,31,0 -grassw,31,0 +longgrass,31,1 +tallgrass,31,1 +wildgrass,31,1 +grasslong,31,1 +grasstall,31,1 +grasswild,31,1 +lgrass,31,1 +tgrass,31,1 +wgrass,31,1 +fern,31,2 +bush,31,2 deadshrub,32,0 -shrubdead,32,0 dshrub,32,0 -shrubd,32,0 -normalpistonbase,33,7 -normalpiston,33,7 -normpistonbase,33,7 -normpiston,33,7 -npistonbase,33,7 -npiston,33,7 -pistonnormalbase,33,7 -pistonnormal,33,7 -pistonnormbase,33,7 -pistonnorm,33,7 -pistonnbase,33,7 -pistonn,33,7 -pistonbase,33,7 -piston,33,7 -pistonblock,33,7 +deadbush,32,0 +dbush,32,0 +deadsapling,32,0 +normalpistonbase,33,0 +normalpiston,33,0 +normpistonbase,33,0 +normpiston,33,0 +npistonbase,33,0 +npiston,33,0 +pistonnormalbase,33,0 +pistonnormal,33,0 +pistonnormbase,33,0 +pistonnorm,33,0 +pistonnbase,33,0 +pistonn,33,0 +pistonbase,33,0 +piston,33,0 +pistonblock,33,0 pistonextensionnormal,34,0 -pistonextensionnorm,34,0 -pistonextensionn,34,0 pistonextension,34,0 pistonextnormal,34,0 -pistonextnorm,34,0 -pistonextn,34,0 pistonext,34,0 pistonenormal,34,0 -pistonenorm,34,0 -pistonen,34,0 pistone,34,0 extensionpistonnormal,34,0 -extensionpistonnorm,34,0 -extensionpistonn,34,0 extensionpiston,34,0 extpistonnormal,34,0 -extpistonnorm,34,0 -extpistonn,34,0 extpiston,34,0 epistonnormal,34,0 -epistonnorm,34,0 -epistonn,34,0 episton,34,0 whitecloth,35,0 whitewool,35,0 @@ -733,12 +740,30 @@ 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 picloth,35,6 piwool,35,6 picotton,35,6 +darkgraycloth,35,7 +darkgraywool,35,7 +darkgraycotton,35,7 +dgraycloth,35,7 +dgraywool,35,7 +dgraycotton,35,7 +darkgracloth,35,7 +darkgrawool,35,7 +darkgracotton,35,7 +dgracloth,35,7 +dgrawool,35,7 +dgracotton,35,7 graycloth,35,7 graywool,35,7 graycotton,35,7 @@ -757,6 +782,12 @@ lightgracotton,35,8 lgracloth,35,8 lgrawool,35,8 lgracotton,35,8 +silvercloth,35,8 +silverwool,35,8 +silvercotton,35,8 +sicloth,35,8 +siawool,35,8 +siacotton,35,8 cyancloth,35,9 cyanwool,35,9 cyancotton,35,9 @@ -823,12 +854,16 @@ rose,38,0 redflower,38,0 rflower,38,0 brownmushroom,39,0 +brownshroom,39,0 brownmush,39,0 bmushroom,39,0 +bshroom,39,0 bmush,39,0 redmushroom,40,0 +redshroom,40,0 redmush,40,0 rmushroom,40,0 +rshroom,40,0 rmush,40,0 goldblock,41,0 blockgold,41,0 @@ -842,58 +877,33 @@ iblock,42,0 stblock,42,0 blocki,42,0 blockst,42,0 -smoothstonedoublestep,43,0 -smoothstonedstep,43,0 stonedoublestep,43,0 stonedstep,43,0 sdoublestep,43,0 sdstep,43,0 -doublesmoothstonestep,43,0 -dsmoothstonestep,43,0 doublestonestep,43,0 dstonestep,43,0 doublesstep,43,0 doublestep,43,0 dstep,43,0 -smoothstonedoubleslab,43,0 -smoothstonedslab,43,0 stonedoubleslab,43,0 stonedslab,43,0 sdoubleslab,43,0 sdslab,43,0 -doublesmoothstoneslab,43,0 -dsmoothstoneslab,43,0 doublestoneslab,43,0 dstoneslab,43,0 doublesslab,43,0 doubleslab,43,0 dslab,43,0 -smoothstonedoublehalfblock,43,0 -smoothstonedhalfblock,43,0 stonedoublehalfblock,43,0 stonedhalfblock,43,0 sdoublehalfblock,43,0 sdhalfblock,43,0 -doublesmoothstonehalfblock,43,0 -dsmoothstonehalfblock,43,0 doublestonehalfblock,43,0 dstonehalfblock,43,0 doubleshalfblock,43,0 doublehalfblock,43,0 dhalfblock,43,0 -smoothstonedoublehblock,43,0 -smoothstonedhblock,43,0 -stonedoublehblock,43,0 -stonedhblock,43,0 -sdoublehblock,43,0 -sdhblock,43,0 -doublesmoothstonehblock,43,0 -dsmoothstonehblock,43,0 -doublestonehblock,43,0 -dstonehblock,43,0 -doubleshblock,43,0 -doublehblock,43,0 -dhblock,43,0 sandstonedoublestep,43,1 sandstonedstep,43,1 sstonedoublestep,43,1 @@ -930,194 +940,90 @@ doublesstonehalfblock,43,1 dsstonehalfblock,43,1 doublesshalfblock,43,1 dsshalfblock,43,1 -sandstonedoublehblock,43,1 -sandstonedhblock,43,1 -sstonedoublehblock,43,1 -sstonedhblock,43,1 -ssdoublehblock,43,1 -ssdhblock,43,1 -doublesandstonehblock,43,1 -dsandstonehblock,43,1 -doublesstonehblock,43,1 -dsstonehblock,43,1 -doublesshblock,43,1 -dsshblock,43,1 -woodenplankdoublehalfblock,43,2 -woodenplankdhalfblock,43,2 -woodplankdoublehalfblock,43,2 -woodplankdhalfblock,43,2 -wplankdoublehalfblock,43,2 -wplankdhalfblock,43,2 -plankdoublehalfblock,43,2 -plankdhalfblock,43,2 -woodenpdoublehalfblock,43,2 -woodenpdhalfblock,43,2 -woodpdoublehalfblock,43,2 -woodpdhalfblock,43,2 -wpdoublehalfblock,43,2 -wpdhalfblock,43,2 -pdoublehalfblock,43,2 -pdhalfblock,43,2 -woodendoublehalfblock,43,2 -woodendhalfblock,43,2 -wooddoublehalfblock,43,2 -wooddhalfblock,43,2 -wdoublehalfblock,43,2 -wdhalfblock,43,2 -doublewoodenplankhalfblock,43,2 -dwoodenplankhalfblock,43,2 -doublewoodplankhalfblock,43,2 -dwoodplankhalfblock,43,2 -doublewplankhalfblock,43,2 -dwplankhalfblock,43,2 -doubleplankhalfblock,43,2 -dplankhalfblock,43,2 -doublewoodenphalfblock,43,2 -dwoodenphalfblock,43,2 -doublewoodphalfblock,43,2 -dwoodphalfblock,43,2 -doublewphalfblock,43,2 -dwphalfblock,43,2 -doublephalfblock,43,2 -dphalfblock,43,2 -doublewoodenhalfblock,43,2 -dwoodenhalfblock,43,2 -doublewoodhalfblock,43,2 -dwoodhalfblock,43,2 -doublewhalfblock,43,2 -dwhalfblock,43,2 -woodenplankdoublehblock,43,2 -woodenplankdhblock,43,2 -woodplankdoublehblock,43,2 -woodplankdhblock,43,2 -wplankdoublehblock,43,2 -wplankdhblock,43,2 -plankdoublehblock,43,2 -plankdhblock,43,2 -woodenpdoublehblock,43,2 -woodenpdhblock,43,2 -woodpdoublehblock,43,2 -woodpdhblock,43,2 -wpdoublehblock,43,2 -wpdhblock,43,2 -pdoublehblock,43,2 -pdhblock,43,2 -woodendoublehblock,43,2 -woodendhblock,43,2 -wooddoublehblock,43,2 -wooddhblock,43,2 -wdoublehblock,43,2 -wdhblock,43,2 -doublewoodenplankhblock,43,2 -dwoodenplankhblock,43,2 -doublewoodplankhblock,43,2 -dwoodplankhblock,43,2 -doublewplankhblock,43,2 -dwplankhblock,43,2 -doubleplankhblock,43,2 -dplankhblock,43,2 -doublewoodenphblock,43,2 -dwoodenphblock,43,2 -doublewoodphblock,43,2 -dwoodphblock,43,2 -doublewphblock,43,2 -dwphblock,43,2 -doublewoodenhblock,43,2 -dwoodenhblock,43,2 -doublewoodhblock,43,2 -dwoodhblock,43,2 -doublewhblock,43,2 -dwhblock,43,2 -doublephblock,43,2 -dphblock,43,2 -woodenplankdoublestep,43,2 -woodenplankdstep,43,2 -woodplankdoublestep,43,2 -woodplankdstep,43,2 -wplankdoublestep,43,2 -wplankdstep,43,2 -plankdoublestep,43,2 -plankdstep,43,2 -woodenpdoublestep,43,2 -woodenpdstep,43,2 -woodpdoublestep,43,2 -woodpdstep,43,2 -wpdoublestep,43,2 -wpdstep,43,2 -pdoublestep,43,2 -pdstep,43,2 -woodendoublestep,43,2 -woodendstep,43,2 -wooddoublestep,43,2 -wooddstep,43,2 -wdoublestep,43,2 -wdstep,43,2 -doublewoodenplankstep,43,2 -dwoodenplankstep,43,2 -doublewoodplankstep,43,2 -dwoodplankstep,43,2 -doublewplankstep,43,2 -dwplankstep,43,2 -doubleplankstep,43,2 -dplankstep,43,2 -doublewoodenpstep,43,2 -dwoodenpstep,43,2 -doublewoodpstep,43,2 -dwoodpstep,43,2 -doublewpstep,43,2 -dwpstep,43,2 -doublepstep,43,2 -dpstep,43,2 -doublewoodenstep,43,2 -dwoodenstep,43,2 -doublewoodstep,43,2 -dwoodstep,43,2 -doublewstep,43,2 -dwstep,43,2 -woodenplankdoubleslab,43,2 -woodenplankdslab,43,2 -woodplankdoubleslab,43,2 -woodplankdslab,43,2 -wplankdoubleslab,43,2 -wplankdslab,43,2 -plankdoubleslab,43,2 -plankdslab,43,2 -woodenpdoubleslab,43,2 -woodenpdslab,43,2 -woodpdoubleslab,43,2 -woodpdslab,43,2 -wpdoubleslab,43,2 -wpdslab,43,2 -pdoubleslab,43,2 -pdslab,43,2 -woodendoubleslab,43,2 -woodendslab,43,2 -wooddoubleslab,43,2 -wooddslab,43,2 -wdoubleslab,43,2 -wdslab,43,2 -doublewoodenplankslab,43,2 -dwoodenplankslab,43,2 -doublewoodplankslab,43,2 -dwoodplankslab,43,2 -doublewplankslab,43,2 -dwplankslab,43,2 -doubleplankslab,43,2 -dplankslab,43,2 -doublewoodenpslab,43,2 -dwoodenpslab,43,2 -doublewoodpslab,43,2 -dwoodpslab,43,2 -doublewpslab,43,2 -dwpslab,43,2 -doublewoodenslab,43,2 -dwoodenslab,43,2 -doublewoodslab,43,2 -dwoodslab,43,2 -doublewslab,43,2 -dwslab,43,2 -doublepslab,43,2 -dpslab,43,2 +woodenplankstonedoublehalfblock,43,2 +woodenplankstonedhalfblock,43,2 +woodplankstonedoublehalfblock,43,2 +woodplankstonedhalfblock,43,2 +wplankstonedoublehalfblock,43,2 +wplankstonedhalfblock,43,2 +plankstonedoublehalfblock,43,2 +planstonekdhalfblock,43,2 +woodenstonedoublehalfblock,43,2 +woodenstonedhalfblock,43,2 +woodstonedoublehalfblock,43,2 +woodstonedhalfblock,43,2 +wstonedoublehalfblock,43,2 +wstonedhalfblock,43,2 +doublewoodenplankstonehalfblock,43,2 +dwoodenplankstonehalfblock,43,2 +doublewoodplankstonehalfblock,43,2 +dwoodplankstonehalfblock,43,2 +doublewplankstonehalfblock,43,2 +dwplankstonehalfblock,43,2 +doubleplankstonehalfblock,43,2 +dplankstonehalfblock,43,2 +doublewoodenstonehalfblock,43,2 +dwoodenstonehalfblock,43,2 +doublewoodstonehalfblock,43,2 +dwoodstonehalfblock,43,2 +doublewstonehalfblock,43,2 +dwstonehalfblock,43,2 +woodenplankstonedoublestep,43,2 +woodenplankstonedstep,43,2 +woodplankstonedoublestep,43,2 +woodplankstonedstep,43,2 +wplankstonedoublestep,43,2 +wplankstonedstep,43,2 +plankstonedoublestep,43,2 +plankstonedstep,43,2 +woodenstonedoublestep,43,2 +woodenstonedstep,43,2 +woodstonedoublestep,43,2 +woodstonedstep,43,2 +wstonedoublestep,43,2 +wstonedstep,43,2 +doublewoodenplankstonestep,43,2 +dwoodenplankstonestep,43,2 +doublewoodplankstonestep,43,2 +dwoodplankstonestep,43,2 +doublewplankstonestep,43,2 +dwplankstonestep,43,2 +doubleplankstonestep,43,2 +dplankstonestep,43,2 +doublewoodenstonestep,43,2 +dwoodenstonestep,43,2 +doublewoodstonestep,43,2 +dwoodstonestep,43,2 +doublewstonestep,43,2 +dwstonestep,43,2 +woodenplankstonedoubleslab,43,2 +woodenplankstonedslab,43,2 +woodplankstonedoubleslab,43,2 +woodplankstonedslab,43,2 +wplankstonedoubleslab,43,2 +wplankstonedslab,43,2 +plankstonedoubleslab,43,2 +plankstonedslab,43,2 +woodenstonedoubleslab,43,2 +woodenstonedslab,43,2 +woodstonedoubleslab,43,2 +woodstonedslab,43,2 +wstonedoubleslab,43,2 +wstonedslab,43,2 +doublewoodenplankstoneslab,43,2 +dwoodenplankstoneslab,43,2 +doublewoodplankstoneslab,43,2 +dwoodplankstoneslab,43,2 +doublewplankstoneslab,43,2 +dwplankstoneslab,43,2 +doubleplankstoneslab,43,2 +dplankstoneslab,43,2 +doublewoodenstoneslab,43,2 +dwoodenstoneslab,43,2 +doublewoodstoneslab,43,2 +dwoodstoneslab,43,2 +doublewstoneslab,43,2 +dwstoneslab,43,2 cobblestonedoublestep,43,3 cobblestonedstep,43,3 cobbledoublestep,43,3 @@ -1166,22 +1072,6 @@ doublecstonehalfblock,43,3 dcstonehalfblock,43,3 doublecshalfblock,43,3 dcshalfblock,43,3 -cobblestonedoublehblock,43,3 -cobblestonedhblock,43,3 -cobbledoublehblock,43,3 -cobbledhblock,43,3 -cstonedoublehblock,43,3 -cstonedhblock,43,3 -csdoublehblock,43,3 -csdhblock,43,3 -doublecobblestonehblock,43,3 -dcobblestonehblock,43,3 -doublecobblehblock,43,3 -dcobblehblock,43,3 -doublecstonehblock,43,3 -dcstonehblock,43,3 -doublecshblock,43,3 -dcshblock,43,3 brickblockdoublestep,43,4 brickblockdstep,43,4 brickbdoublestep,43,4 @@ -1222,14 +1112,6 @@ brickdoublehalfblock,43,4 brickdhalfblock,43,4 bdoublehalfblock,43,4 bdhalfblock,43,4 -brickblockdoublehblock,43,4 -brickblockdhblock,43,4 -brickbdoublehblock,43,4 -brickbdhblock,43,4 -brickdoublehblock,43,4 -brickdhblock,43,4 -bdoublehblock,43,4 -bdhblock,43,4 doublebrickblockhalfblock,43,4 dbrickblockhalfblock,43,4 doublebrickbhalfblock,43,4 @@ -1238,14 +1120,6 @@ doublebrickhalfblock,43,4 dbrickhalfblock,43,4 doublebhalfblock,43,4 dbhalfblock,43,4 -doublebrickblockhblock,43,4 -dbrickblockhblock,43,4 -doublebrickbhblock,43,4 -dbrickbhblock,43,4 -doublebrickhblock,43,4 -dbrickhblock,43,4 -doublebhblock,43,4 -dbhblock,43,4 stonebrickdoublestep,43,5 stonebrickdstep,43,5 stonebdoublestep,43,5 @@ -1286,14 +1160,6 @@ sbrickdoublehalfblock,43,5 sbrickdhalfblock,43,5 sbdoublehalfblock,43,5 sbdhalfblock,43,5 -stonebrickdoublehblock,43,5 -stonebrickdhblock,43,5 -stonebdoublehblock,43,5 -stonebdhblock,43,5 -sbrickdoublehblock,43,5 -sbrickdhblock,43,5 -sbdoublehblock,43,5 -sbdhblock,43,5 doublestonebrickhalfblock,43,5 dstonebrickhalfblock,43,5 doublestonebhalfblock,43,5 @@ -1302,17 +1168,312 @@ doublesbrickhalfblock,43,5 dsbrickhalfblock,43,5 doublesbhalfblock,43,5 dsbhalfblock,43,5 -doublestonebrickhblock,43,5 -dstonebrickhblock,43,5 -doublestonebhblock,43,5 -dstonebhblock,43,5 -doublesbrickhblock,43,5 -dsbrickdhblock,43,5 -doublesbhblock,43,5 -dsbhblock,43,5 -adminslab,43,6 -magicslab,43,6 -adslab,43,6 +netherbrickdoubleslab,43,6 +hellbrickdoubleslab,43,6 +nbrickdoubleslab,43,6 +hbrickdoubleslab,43,6 +netherdoubleslab,43,6 +helldoubleslab,43,6 +nbdoubleslab,43,6 +hbdoubleslab,43,6 +hdoubleslab,43,6 +ndoubleslab,43,6 +netherbrickdoublestep,43,6 +hellbrickdoublestep,43,6 +nbrickdoublestep,43,6 +hbrickdoublestep,43,6 +netherdoublestep,43,6 +helldoublestep,43,6 +nbdoublestep,43,6 +hbdoublestep,43,6 +ndoublestep,43,6 +hdoublestep,43,6 +netherbrickdoublehalfblock,43,6 +hellbrickdoublehalfblock,43,6 +nbrickdoublehalfblock,43,6 +hbrickdoublehalfblock,43,6 +netherdoublehalfblock,43,6 +helldoublehalfblock,43,6 +nbdoublehalfblock,43,6 +hbdoublehalfblock,43,6 +ndoublehalfblock,43,6 +hdoublehalfblock,43,6 +netherbrickdslab,43,6 +hellbrickdslab,43,6 +nbrickdslab,43,6 +hbrickdslab,43,6 +netherdslab,43,6 +helldslab,43,6 +nbdslab,43,6 +hbdslab,43,6 +hdslab,43,6 +ndslab,43,6 +netherbrickdstep,43,6 +hellbrickdstep,43,6 +nbrickdstep,43,6 +hbrickdstep,43,6 +netherdstep,43,6 +helldstep,43,6 +nbdstep,43,6 +hbdstep,43,6 +ndstep,43,6 +hdstep,43,6 +netherbrickdhalfblock,43,6 +hellbrickdhalfblock,43,6 +nbrickdhalfblock,43,6 +hbrickdhalfblock,43,6 +netherdhalfblock,43,6 +helldhalfblock,43,6 +nbdhalfblock,43,6 +hbdhalfblock,43,6 +ndhalfblock,43,6 +hdhalfblock,43,6 +doublenetherbrickslab,43,6 +doublehellbrickslab,43,6 +doublenbrickslab,43,6 +doublehbrickslab,43,6 +doublenetherslab,43,6 +doublehellslab,43,6 +doublenbslab,43,6 +doublehbslab,43,6 +doublehslab,43,6 +doublenslab,43,6 +doublenetherbrickstep,43,6 +doublehellbrickstep,43,6 +doublenbrickstep,43,6 +doublehbrickstep,43,6 +doublenetherstep,43,6 +doublehellstep,43,6 +doublenbstep,43,6 +doublehbstep,43,6 +doublenstep,43,6 +doublehstep,43,6 +doublenetherbrickhalfblock,43,6 +doublehellbrickhalfblock,43,6 +doublenbrickhalfblock,43,6 +doublehbrickhalfblock,43,6 +doublenetherhalfblock,43,6 +doublehellhalfblock,43,6 +doublenbhalfblock,43,6 +doublehbhalfblock,43,6 +doublenhalfblock,43,6 +doublehhalfblock,43,6 +dnetherbrickslab,43,6 +dhellbrickslab,43,6 +dnbrickslab,43,6 +dhbrickslab,43,6 +dnetherslab,43,6 +dhellslab,43,6 +dnbslab,43,6 +dhbslab,43,6 +dhslab,43,6 +dnslab,43,6 +dnetherbrickstep,43,6 +dhellbrickstep,43,6 +dnbrickstep,43,6 +dhbrickstep,43,6 +dnetherstep,43,6 +dhellstep,43,6 +dnbstep,43,6 +dhbstep,43,6 +dnstep,43,6 +dhstep,43,6 +dnetherbrickhalfblock,43,6 +dhellbrickhalfblock,43,6 +dnbrickhalfblock,43,6 +dhbrickhalfblock,43,6 +dnetherhalfblock,43,6 +dhellhalfblock,43,6 +dnbhalfblock,43,6 +dhbhalfblock,43,6 +dnhalfblock,43,6 +dhhalfblock,43,6 +netherquartzdoubleslab,43,7 +hellquartzdoubleslab,43,7 +deathquartzdoubleslab,43,7 +nquartzdoubleslab,43,7 +hquartzdoubleslab,43,7 +dquartzdoubleslab,43,7 +quartzdoubleslab,43,7 +nqdoubleslab,43,7 +hqdoubleslab,43,7 +dqdoubleslab,43,7 +qdoubleslab,43,7 +netherquartzdoublestep,43,7 +hellquartzdoublestep,43,7 +deathquartzdoublestep,43,7 +nquartzdoublestep,43,7 +hquartzdoublestep,43,7 +dquartzdoublestep,43,7 +quartzdoublestep,43,7 +nqdoublestep,43,7 +hqdoublestep,43,7 +dqdoublestep,43,7 +qdoublestep,43,7 +netherquartzdoublehalfblock,43,7 +hellquartzdoublehalfblock,43,7 +deathquartzdoublehalfblock,43,7 +nquartzdoublehalfblock,43,7 +hquartzdoublehalfblock,43,7 +dquartzdoublehalfblock,43,7 +quartzdoublehalfblock,43,7 +nqdoublehalfblock,43,7 +hqdoublehalfblock,43,7 +dqdoublehalfblock,43,7 +qdoublehalfblock,43,7 +netherquartzdslab,43,7 +hellquartzdslab,43,7 +deathquartzdslab,43,7 +nquartzdslab,43,7 +hquartzdslab,43,7 +dquartzdslab,43,7 +quartzdslab,43,7 +nqdslab,43,7 +hqdslab,43,7 +dqdslab,43,7 +qdslab,43,7 +netherquartzdstep,43,7 +hellquartzdstep,43,7 +deathquartzdstep,43,7 +nquartzdstep,43,7 +hquartzdstep,43,7 +dquartzdstep,43,7 +quartzdstep,43,7 +nqdstep,43,7 +hqdstep,43,7 +dqdstep,43,7 +qdstep,43,7 +netherquartzdhalfblock,43,7 +hellquartzdhalfblock,43,7 +deathquartzdhalfblock,43,7 +nquartzdhalfblock,43,7 +hquartzdhalfblock,43,7 +dquartzdhalfblock,43,7 +quartzdhalfblock,43,7 +nqdhalfblock,43,7 +hqdhalfblock,43,7 +dqdhalfblock,43,7 +qdhalfblock,43,7 +doublenetherquartzslab,43,7 +doublehellquartzslab,43,7 +doubledeathquartzslab,43,7 +doublenquartzslab,43,7 +doublehquartzslab,43,7 +doubledquartzslab,43,7 +doublequartzslab,43,7 +doublenqslab,43,7 +doublehqslab,43,7 +doubledqslab,43,7 +doubleqslab,43,7 +doublenetherquartzstep,43,7 +doublehellquartzstep,43,7 +doubledeathquartzstep,43,7 +doublenquartzstep,43,7 +doublehquartzstep,43,7 +doubledquartzstep,43,7 +doublequartzstep,43,7 +doublenqstep,43,7 +doublehqstep,43,7 +doubledqstep,43,7 +doubleqstep,43,7 +doublenetherquartzhalfblock,43,7 +doublehellquartzhalfblock,43,7 +doubledeathquartzhalfblock,43,7 +doublenquartzhalfblock,43,7 +doublehquartzhalfblock,43,7 +doubledquartzhalfblock,43,7 +doublequartzhalfblock,43,7 +doublenqhalfblock,43,7 +doublehqhalfblock,43,7 +doubledqhalfblock,43,7 +doubleqhalfblock,43,7 +dnetherquartzslab,43,7 +dhellquartzslab,43,7 +ddeathquartzslab,43,7 +dnquartzslab,43,7 +dhquartzslab,43,7 +ddquartzslab,43,7 +dnqslab,43,7 +dhqslab,43,7 +ddqslab,43,7 +dnetherquartzstep,43,7 +dhellquartzstep,43,7 +ddeathquartzstep,43,7 +dnquartzstep,43,7 +dhquartzstep,43,7 +ddquartzstep,43,7 +dnqstep,43,7 +dhqstep,43,7 +ddqstep,43,7 +dnetherquartzhalfblock,43,7 +dhellquartzhalfblock,43,7 +ddeathquartzhalfblock,43,7 +dnquartzhalfblock,43,7 +dhquartzhalfblock,43,7 +ddquartzhalfblock,43,7 +dnqhalfblock,43,7 +dhqhalfblock,43,7 +ddqhalfblock,43,7 +smoothstonedoubleslab,43,8 +smoothstonedoublestep,43,8 +smoothstonedoublehalfblock,43,8 +smoothstonedslab,43,8 +smoothstonedstep,43,8 +smoothstonedhalfblock,43,8 +doublesmoothstoneslab,43,8 +doublesmoothstonestep,43,8 +doublesmoothstonehalfblock,43,8 +dsmoothstoneslab,43,8 +dsmoothstonestep,43,8 +dsmoothstonehalfblock,43,8 +smoothsandstonedoubleslab,43,9 +ssandstonedoubleslab,43,9 +ssstonedoubleslab,43,9 +sssdoubleslab,43,9 +smoothsandstonedoublestep,43,9 +ssandstonedoublestep,43,9 +ssstonedoublestep,43,9 +sssdoublestep,43,9 +smoothsandstonedoublehalfblock,43,9 +ssandstonedoublehalfblock,43,9 +ssstonedoublehalfblock,43,9 +sssdoublehalfblock,43,9 +smoothsandstonedslab,43,9 +ssandstonedslab,43,9 +ssstonedslab,43,9 +sssdslab,43,9 +smoothsandstonedstep,43,9 +ssandstonedstep,43,9 +ssstonedstep,43,9 +sssdstep,43,9 +smoothsandstonedhalfblock,43,9 +ssandstonedhalfblock,43,9 +ssstonedhalfblock,43,9 +sssdhalfblock,43,9 +doublesmoothsandstoneslab,43,9 +doublessandstoneslab,43,9 +doublessstoneslab,43,9 +doublesssslab,43,9 +doublesmoothsandstonestep,43,9 +doublessandstonestep,43,9 +doublessstonestep,43,9 +doublesssstep,43,9 +doublesmoothsandstonehalfblock,43,9 +doublessandstonehalfblock,43,9 +doublessstonehalfblock,43,9 +doublessshalfblock,43,9 +dsmoothsandstoneslab,43,9 +dssandstoneslab,43,9 +dssstoneslab,43,9 +dsssslab,43,9 +dsmoothsandstonestep,43,9 +dssandstonestep,43,9 +dssstonestep,43,9 +dsssstep,43,9 +dsmoothsandstonehalfblock,43,9 +dssandstonehalfblock,43,9 +dssstonehalfblock,43,9 +dssshalfblock,43,9 smoothstonestep,44,0 stonestep,44,0 sstep,44,0 @@ -1325,64 +1486,36 @@ smoothstonehalfblock,44,0 stonehalfblock,44,0 shalfblock,44,0 halfblock,44,0 -smoothstonehblock,44,0 -stonehblock,44,0 -shblock,44,0 -hblock,44,0 -sanddstonestep,44,1 +sandstonestep,44,1 sstonestep,44,1 ssstep,44,1 -sanddstoneslab,44,1 +sandstoneslab,44,1 sstoneslab,44,1 ssslab,44,1 -sanddstonehalfblock,44,1 +sandstonehalfblock,44,1 sstonehalfblock,44,1 sshalfblock,44,1 -sanddstonehblock,44,1 -sstonehblock,44,1 -sshblock,44,1 -woodenplankstep,44,2 -woodplankstep,44,2 -wplankstep,44,2 -plankstep,44,2 -woodenpstep,44,2 -woodpstep,44,2 -wpstep,44,2 -woodenstep,44,2 -woodstep,44,2 -wstep,44,2 -pstep,44,2 -woodplankslab,44,2 -wplankslab,44,2 -plankslab,44,2 -woodenpslab,44,2 -woodpslab,44,2 -wpslab,44,2 -woodenslab,44,2 -woodslab,44,2 -wslab,44,2 -pslab,44,2 -woodenplankhalfblock,44,2 -woodplankhalfblock,44,2 -wplankhalfblock,44,2 -plankhalfblock,44,2 -woodenphalfblock,44,2 -woodphalfblock,44,2 -wphalfblock,44,2 -woodenhalfblock,44,2 -woodhalfblock,44,2 -whalfblock,44,2 -phalfblock,44,2 -woodplankhblock,44,2 -wplankhblock,44,2 -plankhblock,44,2 -woodenphblock,44,2 -woodphblock,44,2 -wphblock,44,2 -woodenhblock,44,2 -woodhblock,44,2 -whblock,44,2 -phblock,44,2 +woodenplankstonestep,44,2 +woodplankstonestep,44,2 +wplankstonestep,44,2 +plankstonestep,44,2 +woodenstonestep,44,2 +woodstonestep,44,2 +wstonestep,44,2 +woodenplankstoneslab,44,2 +woodplankstoneslab,44,2 +wplankstoneslab,44,2 +plankstoneslab,44,2 +woodenstoneslab,44,2 +woodstoneslab,44,2 +wstoneslab,44,2 +woodenplankstonehalfblock,44,2 +woodplankstonehalfblock,44,2 +wplankstonehalfblock,44,2 +plankstonehalfblock,44,2 +woodenstonehalfblock,44,2 +woodstonehalfblock,44,2 +wstonehalfblock,44,2 cobblestonestep,44,3 cobblestep,44,3 cstonestep,44,3 @@ -1395,10 +1528,6 @@ cobblestonehalfblock,44,3 cobblehalfblock,44,3 cstonehalfblock,44,3 cshalfblock,44,3 -cobblestonehblock,44,3 -cobblehblock,44,3 -cstonehblock,44,3 -cshblock,44,3 brickblockstep,44,4 brickbstep,44,4 brickstep,44,4 @@ -1411,10 +1540,6 @@ brickblockhalfblock,44,4 brickbhalfblock,44,4 brickhalfblock,44,4 bhalfblock,44,4 -brickblockhblock,44,4 -brickbhblock,44,4 -brickhblock,44,4 -bhblock,44,4 stonebrickstep,44,5 stonebstep,44,5 sbrickstep,44,5 @@ -1427,10 +1552,68 @@ stonebrickhalfblock,44,5 stonebhalfblock,44,5 sbrickhalfblock,44,5 sbhalfblock,44,5 -stonebrickhblock,44,5 -stonebhblock,44,5 -sbrickhblock,44,5 -sbhblock,44,5 +hellbrickslab,44,6 +nbrickslab,44,6 +hbrickslab,44,6 +netherslab,44,6 +hellslab,44,6 +nbslab,44,6 +hbslab,44,6 +hslab,44,6 +nslab,44,6 +netherbrickstep,44,6 +hellbrickstep,44,6 +nbrickstep,44,6 +hbrickstep,44,6 +netherstep,44,6 +hellstep,44,6 +nbstep,44,6 +hbstep,44,6 +nstep,44,6 +hstep,44,6 +netherbrickhalfblock,44,6 +hellbrickhalfblock,44,6 +nbrickhalfblock,44,6 +hbrickhalfblock,44,6 +netherhalfblock,44,6 +hellhalfblock,44,6 +nbhalfblock,44,6 +hbhalfblock,44,6 +nhalfblock,44,6 +hhalfblock,44,6 +netherquartzslab,44,7 +hellquartzslab,44,7 +deathquartzslab,44,7 +nquartzslab,44,7 +hquartzslab,44,7 +dquartzslab,44,7 +quartzslab,44,7 +nqslab,44,7 +hqslab,44,7 +dqslab,44,7 +qslab,44,7 +netherquartzstep,44,7 +hellquartzstep,44,7 +deathquartzstep,44,7 +nquartzstep,44,7 +hquartzstep,44,7 +dquartzstep,44,7 +quartzstep,44,7 +nqstep,44,7 +hqstep,44,7 +dqstep,44,7 +qstep,44,7 +netherquartzhalfblock,44,7 +hellquartzhalfblock,44,7 +deathquartzhalfblock,44,7 +nquartzhalfblock,44,7 +hquartzhalfblock,44,7 +dquartzhalfblock,44,7 +quartzhalfblock,44,7 +nqhalfblock,44,7 +hqhalfblock,44,7 +dqhalfblock,44,7 +qhalfblock,44,7 brickblock,45,0 blockbrick,45,0 bblock,45,0 @@ -1456,10 +1639,15 @@ 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 torch,50,0 +burningstick,50,0 +burnstick,50,0 fire,51,0 flame,51,0 flames,51,0 @@ -1477,13 +1665,8 @@ wstairs,53,0 woodenstair,53,0 woodstair,53,0 wstair,53,0 -stairswooden,53,0 -stairswood,53,0 -stairsw,53,0 -stairwooden,53,0 -stairwood,53,0 -stairw,53,0 chest,54,0 +container,54,0 redstonewireblock,55,0 rstonewireblock,55,0 redswireblock,55,0 @@ -1542,12 +1725,16 @@ wooddoorblock,64,0 wdoorblock,64,0 ladder,65,0 minecarttrack,66,0 +minecartrails,66,0 minecartrail,66,0 mcarttrack,66,0 +mcartrails,66,0 mcartrail,66,0 mctrack,66,0 +mcrails,66,0 mcrail,66,0 track,66,0 +rails,66,0 rail,66,0 cobblestonestairs,67,0 cstonestairs,67,0 @@ -1563,20 +1750,6 @@ cobblestair,67,0 csstair,67,0 sstair,67,0 cstair,67,0 -stairscobblestone,67,0 -stairscstone,67,0 -stairsstone,67,0 -stairscobble,67,0 -stairscs,67,0 -stairss,67,0 -stairsc,67,0 -staircobblestone,67,0 -staircstone,67,0 -stairstone,67,0 -staircobble,67,0 -staircs,67,0 -stairs,67,0 -stairc,67,0 wallsign,68,0 wsign,68,0 lever,69,0 @@ -1688,6 +1861,10 @@ snowcovering,78,0 snowcover,78,0 scover,78,0 ice,79,0 +frozenwater,79,0 +waterfrozen,79,0 +freezewater,79,0 +waterfreeze,79,0 snowblock,80,0 blocksnow,80,0 sblock,80,0 @@ -1799,14 +1976,61 @@ tdoor,96,0 doort,96,0 trapd,96,0 dtrap,96,0 -silverstone,97,0 +silverfish,97,0 +monsteregg,97,0 +monstereggsmoothstone,97,0 +monstereggsstone,97,0 +meggsmoothstone,97,0 +meggsstone,97,0 +mesmoothstone,97,0 +messtone,97,0 +silverfishsmoothstone,97,0 +silverfishsstone,97,0 silverfishstone,97,0 -silverfishs,97,0 -sfstone,97,0 -stonesilverfish,97,0 +sfishsmoothstone,97,0 +sfishsstone,97,0 +sfishstone,97,0 +fishsmoothstone,97,0 +fishsstone,97,0 fishstone,97,0 +sfsmoothstone,97,0 +sfsstone,97,0 +sfstone,97,0 +trapsmoothstone,97,0 +trapsstone,97,0 trapstone,97,0 -silverfish,97,0 +monstereggcobblestone,97,1 +monstereggcstone,97,1 +meggcobblestone,97,1 +meggcstone,97,1 +mecobblestone,97,1 +mecstone,97,1 +silverfishcobblestone,97,1 +silverfishcstone,97,1 +sfishcobblestone,97,1 +sfishcstone,97,1 +fishcobblestone,97,1 +fishcstone,97,1 +sfcobblestone,97,1 +sfcstone,97,1 +trapcobblestone,97,1 +trapcstone,97,1 +monstereggstonebrick,97,2 +monstereggsbrick,97,2 +meggstonebrick,97,2 +meggsbrick,97,2 +mestonebrick,97,2 +mesbrick,97,2 +silverfishstonebrick,97,2 +silverfishsbrick,97,2 +sfishstonebrick,97,2 +sfishsbrick,97,2 +fishstonebrick,97,2 +fishsbrick,97,2 +sfstonebrick,97,2 +sfsbrick,97,2 +trapstonebrick,97,2 +trapsbrick,97,2 stonebrick,98,0 stonebricks,98,0 stonebrickblock,98,0 @@ -1816,41 +2040,105 @@ mossystonebrick,98,1 mossystonebricks,98,1 mossystonebrickblock,98,1 mossystonebb,98,1 +mossstonebrick,98,1 +mossstonebricks,98,1 +mossstonebrickblock,98,1 +mossstonebb,98,1 +mstonebrick,98,1 +mstonebricks,98,1 +mstonebrickblock,98,1 +mstonebb,98,1 +mosssbrick,98,1 +mosssbricks,98,1 +mosssbrickblock,98,1 +mosssbb,98,1 +msbrick,98,1 +msbricks,98,1 +msbrickblock,98,1 +crackedstone,98,2 crackedstonebrick,98,2 crackedstonebricks,98,2 crackedstonebrickblock,98,2 crackedstonebb,98,2 +crackstonebrick,98,2 +crackstonebricks,98,2 +crackstonebrickblock,98,2 +crackstonebb,98,2 +crstonebrick,98,2 +crstonebricks,98,2 +crstonebrickblock,98,2 +crstonebb,98,2 +cracksbrick,98,2 +cracksbricks,98,2 +cracksbrickblock,98,2 +cracksbb,98,2 +crsbrick,98,2 +crsbricks,98,2 +crsbrickblock,98,2 +circlestone,98,3 circlestonebrick,98,3 +circlestonebricks,98,3 +circlestonebrickblock,98,3 circlestonebb,98,3 -circlestone,98,3 +cistonebrick,98,3 +cistonebricks,98,3 +cistonebrickblock,98,3 +cistonebb,98,3 +circlesbrick,98,3 +circlesbricks,98,3 +circlesbrickblock,98,3 circlesbb,98,3 +cisbrick,98,3 +cisbricks,98,3 +cisbrickblock,98,3 +giantredmushroom,99,0 hugeredmushroom,99,0 bigredmushroom,99,0 -brmushroom,99,0 -giantredmushroom,99,0 +gredmushroom,99,0 +hredmushroom,99,0 +bredmushroom,99,0 +giantrmushroom,99,0 +hugermushroom,99,0 +bigrmushroom,99,0 grmushroom,99,0 +hrmushroom,99,0 +brmushroom,99,0 +giantbrownmushroom,100,0 hugebrownmushroom,100,0 bigbrownmushroom,100,0 -bbmushroom,100,0 -giantbrownmushroom,100,0 +gbrownmushroom,100,0 +hbrownmushroom,100,0 +bbrownmushroom,100,0 +giantbmushroom,100,0 +hugebmushroom,100,0 +bigbmushroom,100,0 gbmushroom,100,0 +hbmushroom,100,0 +bbmushroom,100,0 ironbars,101,0 ironbarsb,101,0 ironbarsblock,101,0 -metalbarsblock,101,0 -metalbarsb,101,0 +ironfence,101,0 metalbars,101,0 -jailbarsblock,101,0 -jailbarsb,101,0 +metalbarsb,101,0 +metalbarsblock,101,0 +metalfence,101,0 jailbars,101,0 -mbarsblock,101,0 -mbarsb,101,0 +jailbarsb,101,0 +jailbarsblock,101,0 +jailfence,101,0 mbars,101,0 -jbarsblock,101,0 -jbarsb,101,0 +mbarsb,101,0 +mbarsblock,101,0 +mfence,101,0 jbars,101,0 +jbarsb,101,0 +jbarsblock,101,0 +jfence,101,0 +ibars,101,0 ibarsb,101,0 ibarsblock,101,0 +ifence,101,0 glasspane,102,0 glassp,102,0 paneglass,102,0 @@ -1918,19 +2206,6 @@ redbstair,108,0 rbrickstair,108,0 bstair,108,0 redstair,108,0 -stairsbrick,108,0 -stairsredbrick,108,0 -stairsredb,108,0 -stairsrbrick,108,0 -stairsb,108,0 -stairsred,108,0 -stairbrick,108,0 -stairredbrick,108,0 -stairredb,108,0 -stairrbrick,108,0 -stairb,108,0 -stairred,108,0 -stairsstonebrick,109,0 stonebrickstairs,109,0 stonebstairs,109,0 sbstairs,109,0 @@ -1955,54 +2230,54 @@ lily,111,0 swamppad,111,0 lpad,111,0 wlily,111,0 -netherbrick,112,0 -nbrick,112,0 -hellbrick,112,0 -deathbrick,112,0 -dbrick,112,0 -hbrick,112,0 +netherbrickblock,112,0 +nbrickblock,112,0 +hellbrickblock,112,0 +deathbrickblock,112,0 +dbrickblock,112,0 +hbrickblock,112,0 +blocknetherbrick,112,0 +blocknbrick,112,0 +blockhellbrick,112,0 +blockdeathbrick,112,0 +blockdbrick,112,0 +blockhbrick,112,0 +netherbrickfence,113,0 +hellbrickfence,113,0 +nbrickfence,113,0 +hbrickfence,113,0 +netherbfence,113,0 +hellbfence,113,0 netherfence,113,0 -nfence,113,0 hellfence,113,0 -deathfence,113,0 -dfence,113,0 +nbfence,113,0 +hbfence,113,0 +nfence,113,0 hfence,113,0 netherbrickstairs,114,0 -nbrickstairs,114,0 hellbrickstairs,114,0 -deathbrickstairs,114,0 -dbrickstairs,114,0 +nbrickstairs,114,0 hbrickstairs,114,0 -dstairs,114,0 -hstairs,114,0 -hellstairs,114,0 -deathstairs,114,0 -nstairs,114,0 -netherstairs,114,0 -dbstairs,114,0 -hbstairs,114,0 +netherbstairs,114,0 hellbstairs,114,0 -deathbstairs,114,0 +netherstairs,114,0 +hellstairs,114,0 nbstairs,114,0 -netherbstairs,114,0 +hbstairs,114,0 +nstairs,114,0 +hstairs,114,0 netherbrickstair,114,0 -nbrickstair,114,0 hellbrickstair,114,0 -deathbrickstair,114,0 -dbrickstair,114,0 +nbrickstair,114,0 hbrickstair,114,0 -dstair,114,0 -hstair,114,0 -hellstair,114,0 -deathstair,114,0 -nstair,114,0 -netherstair,114,0 -dbstair,114,0 -hbstair,114,0 +netherbstair,114,0 hellbstair,114,0 -deathbstair,114,0 +netherstair,114,0 +hellstair,114,0 nbstair,114,0 -netherbstair,114,0 +hbstair,114,0 +nstair,114,0 +hstair,114,0 netherwarts,115,0 netherwart,115,0 netherplant,115,0 @@ -2028,17 +2303,23 @@ dwart,115,0 dplant,115,0 dcrop,115,0 enchantmenttable,116,0 -magictable,116,0 +enchantingtable,116,0 +enchanttable,116,0 etable,116,0 -booktable,116,0 -magicdesk,116,0 +magicaltable,116,0 +magictable,116,0 +mtable,116,0 enchantmentdesk,116,0 +enchantingdesk,116,0 +enchantdesk,116,0 edesk,116,0 +magicaldesk,116,0 +magicdesk,116,0 +mdesk,116,0 +booktable,116,0 bookdesk,116,0 btable,116,0 bdesk,116,0 -mtable,116,0 -mdesk,116,0 brewingstandblock,117,0 brewerblock,117,0 potionstandblock,117,0 @@ -2065,12 +2346,16 @@ endgooframe,120,0 endergooframe,120,0 egooframe,120,0 eportalframe,120,0 +enderframe,120,0 +endframe,120,0 enderstone,121,0 endstone,121,0 endrock,121,0 enderrock,121,0 erock,121,0 estone,121,0 +enderdragonegg,122,0 +endegg,122,0 dragonegg,122,0 degg,122,0 bossegg,122,0 @@ -2084,6 +2369,1409 @@ rslampoff,123,0 redstonelampon,124,0 redlampon,124,0 rslampon,124,0 +woodenplankdoublehalfblock,125,0 +woodenplankdhalfblock,125,0 +woodplankdoublehalfblock,125,0 +woodplankdhalfblock,125,0 +wplankdoublehalfblock,125,0 +wplankdhalfblock,125,0 +plankdoublehalfblock,125,0 +plankdhalfblock,125,0 +woodendoublehalfblock,125,0 +woodendhalfblock,125,0 +wooddoublehalfblock,125,0 +wooddhalfblock,125,0 +wdoublehalfblock,125,0 +wdhalfblock,125,0 +doublewoodenplankhalfblock,125,0 +dwoodenplankhalfblock,125,0 +doublewoodplankhalfblock,125,0 +dwoodplankhalfblock,125,0 +doublewplankhalfblock,125,0 +dwplankhalfblock,125,0 +doubleplankhalfblock,125,0 +dplankhalfblock,125,0 +doublewoodenhalfblock,125,0 +dwoodenhalfblock,125,0 +doublewoodhalfblock,125,0 +dwoodhalfblock,125,0 +doublewhalfblock,125,0 +dwhalfblock,125,0 +woodenplankdoublestep,125,0 +woodenplankdstep,125,0 +woodplankdoublestep,125,0 +woodplankdstep,125,0 +wplankdoublestep,125,0 +wplankdstep,125,0 +plankdoublestep,125,0 +plankdstep,125,0 +woodendoublestep,125,0 +woodendstep,125,0 +wooddoublestep,125,0 +wooddstep,125,0 +wdoublestep,125,0 +wdstep,125,0 +doublewoodenplankstep,125,0 +dwoodenplankstep,125,0 +doublewoodplankstep,125,0 +dwoodplankstep,125,0 +doublewplankstep,125,0 +dwplankstep,125,0 +doubleplankstep,125,0 +dplankstep,125,0 +doublewoodenstep,125,0 +dwoodenstep,125,0 +doublewoodstep,125,0 +dwoodstep,125,0 +doublewstep,125,0 +dwstep,125,0 +woodenplankdoubleslab,125,0 +woodenplankdslab,125,0 +woodplankdoubleslab,125,0 +woodplankdslab,125,0 +wplankdoubleslab,125,0 +wplankdslab,125,0 +plankdoubleslab,125,0 +plankdslab,125,0 +woodendoubleslab,125,0 +woodendslab,125,0 +wooddoubleslab,125,0 +wooddslab,125,0 +wdoubleslab,125,0 +wdslab,125,0 +doublewoodenplankslab,125,0 +dwoodenplankslab,125,0 +doublewoodplankslab,125,0 +dwoodplankslab,125,0 +doublewplankslab,125,0 +dwplankslab,125,0 +doubleplankslab,125,0 +dplankslab,125,0 +doublewoodenslab,125,0 +dwoodenslab,125,0 +doublewoodslab,125,0 +dwoodslab,125,0 +doublewslab,125,0 +dwslab,125,0 +oakwoodenplankdoublehalfblock,125,0 +oakwoodenplankdhalfblock,125,0 +oakwoodplankdoublehalfblock,125,0 +oakwoodplankdhalfblock,125,0 +oakwplankdoublehalfblock,125,0 +oakwplankdhalfblock,125,0 +oakplankdoublehalfblock,125,0 +oakplankdhalfblock,125,0 +oakwoodendoublehalfblock,125,0 +oakwoodendhalfblock,125,0 +oakwooddoublehalfblock,125,0 +oakwooddhalfblock,125,0 +oakwdoublehalfblock,125,0 +oakwdhalfblock,125,0 +oakdoublewoodenplankhalfblock,125,0 +oakdwoodenplankhalfblock,125,0 +oakdoublewoodplankhalfblock,125,0 +oakdwoodplankhalfblock,125,0 +oakdoublewplankhalfblock,125,0 +oakdwplankhalfblock,125,0 +oakdoubleplankhalfblock,125,0 +oakdplankhalfblock,125,0 +oakdoublewoodenhalfblock,125,0 +oakdwoodenhalfblock,125,0 +oakdoublewoodhalfblock,125,0 +oakdwoodhalfblock,125,0 +oakdoublewhalfblock,125,0 +oakdwhalfblock,125,0 +oakdoublehalfblock,125,0 +oakdhalfblock,125,0 +oakwoodenplankdoublestep,125,0 +oakwoodenplankdstep,125,0 +oakwoodplankdoublestep,125,0 +oakwoodplankdstep,125,0 +oakwplankdoublestep,125,0 +oakwplankdstep,125,0 +oakplankdoublestep,125,0 +oakplankdstep,125,0 +oakwoodendoublestep,125,0 +oakwoodendstep,125,0 +oakwooddoublestep,125,0 +oakwooddstep,125,0 +oakwdoublestep,125,0 +oakwdstep,125,0 +oakdoublewoodenplankstep,125,0 +oakdwoodenplankstep,125,0 +oakdoublewoodplankstep,125,0 +oakdwoodplankstep,125,0 +oakdoublewplankstep,125,0 +oakdwplankstep,125,0 +oakdoubleplankstep,125,0 +oakdplankstep,125,0 +oakdoublewoodenstep,125,0 +oakdwoodenstep,125,0 +oakdoublewoodstep,125,0 +oakdwoodstep,125,0 +oakdoublewstep,125,0 +oakdwstep,125,0 +oakdoublestep,125,0 +oakdstep,125,0 +oakwoodenplankdoubleslab,125,0 +oakwoodenplankdslab,125,0 +oakwoodplankdoubleslab,125,0 +oakwoodplankdslab,125,0 +oakwplankdoubleslab,125,0 +oakwplankdslab,125,0 +oakplankdoubleslab,125,0 +oakplankdslab,125,0 +oakwoodendoubleslab,125,0 +oakwoodendslab,125,0 +oakwooddoubleslab,125,0 +oakwooddslab,125,0 +oakwdoubleslab,125,0 +oakwdslab,125,0 +oakdoublewoodenplankslab,125,0 +oakdwoodenplankslab,125,0 +oakdoublewoodplankslab,125,0 +oakdwoodplankslab,125,0 +oakdoublewplankslab,125,0 +oakdwplankslab,125,0 +oakdoubleplankslab,125,0 +oakdplankslab,125,0 +oakdoublewoodenslab,125,0 +oakdwoodenslab,125,0 +oakdoublewoodslab,125,0 +oakdwoodslab,125,0 +oakdoublewslab,125,0 +oakdwslab,125,0 +oakdoubleslab,125,0 +oakdslab,125,0 +sprucewoodenplankdoublehalfblock,125,1 +sprucewoodenplankdhalfblock,125,1 +sprucewoodplankdoublehalfblock,125,1 +sprucewoodplankdhalfblock,125,1 +sprucewplankdoublehalfblock,125,1 +sprucewplankdhalfblock,125,1 +spruceplankdoublehalfblock,125,1 +spruceplankdhalfblock,125,1 +sprucewoodendoublehalfblock,125,1 +sprucewoodendhalfblock,125,1 +sprucewooddoublehalfblock,125,1 +sprucewooddhalfblock,125,1 +sprucewdoublehalfblock,125,1 +sprucewdhalfblock,125,1 +sprucedoublewoodenplankhalfblock,125,1 +sprucedwoodenplankhalfblock,125,1 +sprucedoublewoodplankhalfblock,125,1 +sprucedwoodplankhalfblock,125,1 +sprucedoublewplankhalfblock,125,1 +sprucedwplankhalfblock,125,1 +sprucedoubleplankhalfblock,125,1 +sprucedplankhalfblock,125,1 +sprucedoublewoodenhalfblock,125,1 +sprucedwoodenhalfblock,125,1 +sprucedoublewoodhalfblock,125,1 +sprucedwoodhalfblock,125,1 +sprucedoublewhalfblock,125,1 +sprucedwhalfblock,125,1 +sprucedoublehalfblock,125,1 +sprucedhalfblock,125,1 +sprucewoodenplankdoublestep,125,1 +sprucewoodenplankdstep,125,1 +sprucewoodplankdoublestep,125,1 +sprucewoodplankdstep,125,1 +sprucewplankdoublestep,125,1 +sprucewplankdstep,125,1 +spruceplankdoublestep,125,1 +spruceplankdstep,125,1 +sprucewoodendoublestep,125,1 +sprucewoodendstep,125,1 +sprucewooddoublestep,125,1 +sprucewooddstep,125,1 +sprucewdoublestep,125,1 +sprucewdstep,125,1 +sprucedoublewoodenplankstep,125,1 +sprucedwoodenplankstep,125,1 +sprucedoublewoodplankstep,125,1 +sprucedwoodplankstep,125,1 +sprucedoublewplankstep,125,1 +sprucedwplankstep,125,1 +sprucedoubleplankstep,125,1 +sprucedplankstep,125,1 +sprucedoublewoodenstep,125,1 +sprucedwoodenstep,125,1 +sprucedoublewoodstep,125,1 +sprucedwoodstep,125,1 +sprucedoublewstep,125,1 +sprucedwstep,125,1 +sprucedoublestep,125,1 +sprucedstep,125,1 +sprucewoodenplankdoubleslab,125,1 +sprucewoodenplankdslab,125,1 +sprucewoodplankdoubleslab,125,1 +sprucewoodplankdslab,125,1 +sprucewplankdoubleslab,125,1 +sprucewplankdslab,125,1 +spruceplankdoubleslab,125,1 +spruceplankdslab,125,1 +sprucewoodendoubleslab,125,1 +sprucewoodendslab,125,1 +sprucewooddoubleslab,125,1 +sprucewooddslab,125,1 +sprucewdoubleslab,125,1 +sprucewdslab,125,1 +sprucedoublewoodenplankslab,125,1 +sprucedwoodenplankslab,125,1 +sprucedoublewoodplankslab,125,1 +sprucedwoodplankslab,125,1 +sprucedoublewplankslab,125,1 +sprucedwplankslab,125,1 +sprucedoubleplankslab,125,1 +sprucedplankslab,125,1 +sprucedoublewoodenslab,125,1 +sprucedwoodenslab,125,1 +sprucedoublewoodslab,125,1 +sprucedwoodslab,125,1 +sprucedoublewslab,125,1 +sprucedwslab,125,1 +sprucedoubleslab,125,1 +sprucedslab,125,1 +darkwoodenplankdoublehalfblock,125,1 +darkwoodenplankdhalfblock,125,1 +darkwoodplankdoublehalfblock,125,1 +darkwoodplankdhalfblock,125,1 +darkwplankdoublehalfblock,125,1 +darkwplankdhalfblock,125,1 +darkplankdoublehalfblock,125,1 +darkplankdhalfblock,125,1 +darkwoodendoublehalfblock,125,1 +darkwoodendhalfblock,125,1 +darkwooddoublehalfblock,125,1 +darkwooddhalfblock,125,1 +darkwdoublehalfblock,125,1 +darkwdhalfblock,125,1 +darkdoublewoodenplankhalfblock,125,1 +darkdwoodenplankhalfblock,125,1 +darkdoublewoodplankhalfblock,125,1 +darkdwoodplankhalfblock,125,1 +darkdoublewplankhalfblock,125,1 +darkdwplankhalfblock,125,1 +darkdoubleplankhalfblock,125,1 +darkdplankhalfblock,125,1 +darkdoublewoodenhalfblock,125,1 +darkdwoodenhalfblock,125,1 +darkdoublewoodhalfblock,125,1 +darkdwoodhalfblock,125,1 +darkdoublewhalfblock,125,1 +darkdwhalfblock,125,1 +darkdoublehalfblock,125,1 +darkdhalfblock,125,1 +darkwoodenplankdoublestep,125,1 +darkwoodenplankdstep,125,1 +darkwoodplankdoublestep,125,1 +darkwoodplankdstep,125,1 +darkwplankdoublestep,125,1 +darkwplankdstep,125,1 +darkplankdoublestep,125,1 +darkplankdstep,125,1 +darkwoodendoublestep,125,1 +darkwoodendstep,125,1 +darkwooddoublestep,125,1 +darkwooddstep,125,1 +darkwdoublestep,125,1 +darkwdstep,125,1 +darkdoublewoodenplankstep,125,1 +darkdwoodenplankstep,125,1 +darkdoublewoodplankstep,125,1 +darkdwoodplankstep,125,1 +darkdoublewplankstep,125,1 +darkdwplankstep,125,1 +darkdoubleplankstep,125,1 +darkdplankstep,125,1 +darkdoublewoodenstep,125,1 +darkdwoodenstep,125,1 +darkdoublewoodstep,125,1 +darkdwoodstep,125,1 +darkdoublewstep,125,1 +darkdwstep,125,1 +darkdoublestep,125,1 +darkdstep,125,1 +darkwoodenplankdoubleslab,125,1 +darkwoodenplankdslab,125,1 +darkwoodplankdoubleslab,125,1 +darkwoodplankdslab,125,1 +darkwplankdoubleslab,125,1 +darkwplankdslab,125,1 +darkplankdoubleslab,125,1 +darkplankdslab,125,1 +darkwoodendoubleslab,125,1 +darkwoodendslab,125,1 +darkwooddoubleslab,125,1 +darkwooddslab,125,1 +darkwdoubleslab,125,1 +darkwdslab,125,1 +darkdoublewoodenplankslab,125,1 +darkdwoodenplankslab,125,1 +darkdoublewoodplankslab,125,1 +darkdwoodplankslab,125,1 +darkdoublewplankslab,125,1 +darkdwplankslab,125,1 +darkdoubleplankslab,125,1 +darkdplankslab,125,1 +darkdoublewoodenslab,125,1 +darkdwoodenslab,125,1 +darkdoublewoodslab,125,1 +darkdwoodslab,125,1 +darkdoublewslab,125,1 +darkdwslab,125,1 +darkdoubleslab,125,1 +darkdslab,125,1 +birchwoodenplankdoublehalfblock,125,2 +birchwoodenplankdhalfblock,125,2 +birchwoodplankdoublehalfblock,125,2 +birchwoodplankdhalfblock,125,2 +birchwplankdoublehalfblock,125,2 +birchwplankdhalfblock,125,2 +birchplankdoublehalfblock,125,2 +birchplankdhalfblock,125,2 +birchwoodendoublehalfblock,125,2 +birchwoodendhalfblock,125,2 +birchwooddoublehalfblock,125,2 +birchwooddhalfblock,125,2 +birchwdoublehalfblock,125,2 +birchwdhalfblock,125,2 +birchdoublewoodenplankhalfblock,125,2 +birchdwoodenplankhalfblock,125,2 +birchdoublewoodplankhalfblock,125,2 +birchdwoodplankhalfblock,125,2 +birchdoublewplankhalfblock,125,2 +birchdwplankhalfblock,125,2 +birchdoubleplankhalfblock,125,2 +birchdplankhalfblock,125,2 +birchdoublewoodenhalfblock,125,2 +birchdwoodenhalfblock,125,2 +birchdoublewoodhalfblock,125,2 +birchdwoodhalfblock,125,2 +birchdoublewhalfblock,125,2 +birchdwhalfblock,125,2 +birchdoublehalfblock,125,2 +birchdhalfblock,125,2 +birchwoodenplankdoublestep,125,2 +birchwoodenplankdstep,125,2 +birchwoodplankdoublestep,125,2 +birchwoodplankdstep,125,2 +birchwplankdoublestep,125,2 +birchwplankdstep,125,2 +birchplankdoublestep,125,2 +birchplankdstep,125,2 +birchwoodendoublestep,125,2 +birchwoodendstep,125,2 +birchwooddoublestep,125,2 +birchwooddstep,125,2 +birchwdoublestep,125,2 +birchwdstep,125,2 +birchdoublewoodenplankstep,125,2 +birchdwoodenplankstep,125,2 +birchdoublewoodplankstep,125,2 +birchdwoodplankstep,125,2 +birchdoublewplankstep,125,2 +birchdwplankstep,125,2 +birchdoubleplankstep,125,2 +birchdplankstep,125,2 +birchdoublewoodenstep,125,2 +birchdwoodenstep,125,2 +birchdoublewoodstep,125,2 +birchdwoodstep,125,2 +birchdoublewstep,125,2 +birchdwstep,125,2 +birchdoublestep,125,2 +birchdstep,125,2 +birchwoodenplankdoubleslab,125,2 +birchwoodenplankdslab,125,2 +birchwoodplankdoubleslab,125,2 +birchwoodplankdslab,125,2 +birchwplankdoubleslab,125,2 +birchwplankdslab,125,2 +birchplankdoubleslab,125,2 +birchplankdslab,125,2 +birchwoodendoubleslab,125,2 +birchwoodendslab,125,2 +birchwooddoubleslab,125,2 +birchwooddslab,125,2 +birchwdoubleslab,125,2 +birchwdslab,125,2 +birchdoublewoodenplankslab,125,2 +birchdwoodenplankslab,125,2 +birchdoublewoodplankslab,125,2 +birchdwoodplankslab,125,2 +birchdoublewplankslab,125,2 +birchdwplankslab,125,2 +birchdoubleplankslab,125,2 +birchdplankslab,125,2 +birchdoublewoodenslab,125,2 +birchdwoodenslab,125,2 +birchdoublewoodslab,125,2 +birchdwoodslab,125,2 +birchdoublewslab,125,2 +birchdwslab,125,2 +birchdoubleslab,125,2 +birchdslab,125,2 +lightwoodenplankdoublehalfblock,125,2 +lightwoodenplankdhalfblock,125,2 +lightwoodplankdoublehalfblock,125,2 +lightwoodplankdhalfblock,125,2 +lightwplankdoublehalfblock,125,2 +lightwplankdhalfblock,125,2 +lightplankdoublehalfblock,125,2 +lightplankdhalfblock,125,2 +lightwoodendoublehalfblock,125,2 +lightwoodendhalfblock,125,2 +lightwooddoublehalfblock,125,2 +lightwooddhalfblock,125,2 +lightwdoublehalfblock,125,2 +lightwdhalfblock,125,2 +lightdoublewoodenplankhalfblock,125,2 +lightdwoodenplankhalfblock,125,2 +lightdoublewoodplankhalfblock,125,2 +lightdwoodplankhalfblock,125,2 +lightdoublewplankhalfblock,125,2 +lightdwplankhalfblock,125,2 +lightdoubleplankhalfblock,125,2 +lightdplankhalfblock,125,2 +lightdoublewoodenhalfblock,125,2 +lightdwoodenhalfblock,125,2 +lightdoublewoodhalfblock,125,2 +lightdwoodhalfblock,125,2 +lightdoublewhalfblock,125,2 +lightdwhalfblock,125,2 +lightdoublehalfblock,125,2 +lightdhalfblock,125,2 +lightwoodenplankdoublestep,125,2 +lightwoodenplankdstep,125,2 +lightwoodplankdoublestep,125,2 +lightwoodplankdstep,125,2 +lightwplankdoublestep,125,2 +lightwplankdstep,125,2 +lightplankdoublestep,125,2 +lightplankdstep,125,2 +lightwoodendoublestep,125,2 +lightwoodendstep,125,2 +lightwooddoublestep,125,2 +lightwooddstep,125,2 +lightwdoublestep,125,2 +lightwdstep,125,2 +lightdoublewoodenplankstep,125,2 +lightdwoodenplankstep,125,2 +lightdoublewoodplankstep,125,2 +lightdwoodplankstep,125,2 +lightdoublewplankstep,125,2 +lightdwplankstep,125,2 +lightdoubleplankstep,125,2 +lightdplankstep,125,2 +lightdoublewoodenstep,125,2 +lightdwoodenstep,125,2 +lightdoublewoodstep,125,2 +lightdwoodstep,125,2 +lightdoublewstep,125,2 +lightdwstep,125,2 +lightdoublestep,125,2 +lightdstep,125,2 +lightwoodenplankdoubleslab,125,2 +lightwoodenplankdslab,125,2 +lightwoodplankdoubleslab,125,2 +lightwoodplankdslab,125,2 +lightwplankdoubleslab,125,2 +lightwplankdslab,125,2 +lightplankdoubleslab,125,2 +lightplankdslab,125,2 +lightwoodendoubleslab,125,2 +lightwoodendslab,125,2 +lightwooddoubleslab,125,2 +lightwooddslab,125,2 +lightwdoubleslab,125,2 +lightwdslab,125,2 +lightdoublewoodenplankslab,125,2 +lightdwoodenplankslab,125,2 +lightdoublewoodplankslab,125,2 +lightdwoodplankslab,125,2 +lightdoublewplankslab,125,2 +lightdwplankslab,125,2 +lightdoubleplankslab,125,2 +lightdplankslab,125,2 +lightdoublewoodenslab,125,2 +lightdwoodenslab,125,2 +lightdoublewoodslab,125,2 +lightdwoodslab,125,2 +lightdoublewslab,125,2 +lightdwslab,125,2 +lightdoubleslab,125,2 +lightdslab,125,2 +junglewoodenplankdoublehalfblock,125,3 +junglewoodenplankdhalfblock,125,3 +junglewoodplankdoublehalfblock,125,3 +junglewoodplankdhalfblock,125,3 +junglewplankdoublehalfblock,125,3 +junglewplankdhalfblock,125,3 +jungleplankdoublehalfblock,125,3 +jungleplankdhalfblock,125,3 +junglewoodendoublehalfblock,125,3 +junglewoodendhalfblock,125,3 +junglewooddoublehalfblock,125,3 +junglewooddhalfblock,125,3 +junglewdoublehalfblock,125,3 +junglewdhalfblock,125,3 +jungledoublewoodenplankhalfblock,125,3 +jungledwoodenplankhalfblock,125,3 +jungledoublewoodplankhalfblock,125,3 +jungledwoodplankhalfblock,125,3 +jungledoublewplankhalfblock,125,3 +jungledwplankhalfblock,125,3 +jungledoubleplankhalfblock,125,3 +jungledplankhalfblock,125,3 +jungledoublewoodenhalfblock,125,3 +jungledwoodenhalfblock,125,3 +jungledoublewoodhalfblock,125,3 +jungledwoodhalfblock,125,3 +jungledoublewhalfblock,125,3 +jungledwhalfblock,125,3 +jungledoublehalfblock,125,3 +jungledhalfblock,125,3 +junglewoodenplankdoublestep,125,3 +junglewoodenplankdstep,125,3 +junglewoodplankdoublestep,125,3 +junglewoodplankdstep,125,3 +junglewplankdoublestep,125,3 +junglewplankdstep,125,3 +jungleplankdoublestep,125,3 +jungleplankdstep,125,3 +junglewoodendoublestep,125,3 +junglewoodendstep,125,3 +junglewooddoublestep,125,3 +junglewooddstep,125,3 +junglewdoublestep,125,3 +junglewdstep,125,3 +jungledoublewoodenplankstep,125,3 +jungledwoodenplankstep,125,3 +jungledoublewoodplankstep,125,3 +jungledwoodplankstep,125,3 +jungledoublewplankstep,125,3 +jungledwplankstep,125,3 +jungledoubleplankstep,125,3 +jungledplankstep,125,3 +jungledoublewoodenstep,125,3 +jungledwoodenstep,125,3 +jungledoublewoodstep,125,3 +jungledwoodstep,125,3 +jungledoublewstep,125,3 +jungledwstep,125,3 +jungledoublestep,125,3 +jungledstep,125,3 +junglewoodenplankdoubleslab,125,3 +junglewoodenplankdslab,125,3 +junglewoodplankdoubleslab,125,3 +junglewoodplankdslab,125,3 +junglewplankdoubleslab,125,3 +junglewplankdslab,125,3 +jungleplankdoubleslab,125,3 +jungleplankdslab,125,3 +junglewoodendoubleslab,125,3 +junglewoodendslab,125,3 +junglewooddoubleslab,125,3 +junglewooddslab,125,3 +junglewdoubleslab,125,3 +junglewdslab,125,3 +jungledoublewoodenplankslab,125,3 +jungledwoodenplankslab,125,3 +jungledoublewoodplankslab,125,3 +jungledwoodplankslab,125,3 +jungledoublewplankslab,125,3 +jungledwplankslab,125,3 +jungledoubleplankslab,125,3 +jungledplankslab,125,3 +jungledoublewoodenslab,125,3 +jungledwoodenslab,125,3 +jungledoublewoodslab,125,3 +jungledwoodslab,125,3 +jungledoublewslab,125,3 +jungledwslab,125,3 +jungledoubleslab,125,3 +jungledslab,125,3 +forestwoodenplankdoublehalfblock,125,3 +forestwoodenplankdhalfblock,125,3 +forestwoodplankdoublehalfblock,125,3 +forestwoodplankdhalfblock,125,3 +forestwplankdoublehalfblock,125,3 +forestwplankdhalfblock,125,3 +forestplankdoublehalfblock,125,3 +forestplankdhalfblock,125,3 +forestwoodendoublehalfblock,125,3 +forestwoodendhalfblock,125,3 +forestwooddoublehalfblock,125,3 +forestwooddhalfblock,125,3 +forestwdoublehalfblock,125,3 +forestwdhalfblock,125,3 +forestdoublewoodenplankhalfblock,125,3 +forestdwoodenplankhalfblock,125,3 +forestdoublewoodplankhalfblock,125,3 +forestdwoodplankhalfblock,125,3 +forestdoublewplankhalfblock,125,3 +forestdwplankhalfblock,125,3 +forestdoubleplankhalfblock,125,3 +forestdplankhalfblock,125,3 +forestdoublewoodenhalfblock,125,3 +forestdwoodenhalfblock,125,3 +forestdoublewoodhalfblock,125,3 +forestdwoodhalfblock,125,3 +forestdoublewhalfblock,125,3 +forestdwhalfblock,125,3 +forestdoublehalfblock,125,3 +forestdhalfblock,125,3 +forestwoodenplankdoublestep,125,3 +forestwoodenplankdstep,125,3 +forestwoodplankdoublestep,125,3 +forestwoodplankdstep,125,3 +forestwplankdoublestep,125,3 +forestwplankdstep,125,3 +forestplankdoublestep,125,3 +forestplankdstep,125,3 +forestwoodendoublestep,125,3 +forestwoodendstep,125,3 +forestwooddoublestep,125,3 +forestwooddstep,125,3 +forestwdoublestep,125,3 +forestwdstep,125,3 +forestdoublewoodenplankstep,125,3 +forestdwoodenplankstep,125,3 +forestdoublewoodplankstep,125,3 +forestdwoodplankstep,125,3 +forestdoublewplankstep,125,3 +forestdwplankstep,125,3 +forestdoubleplankstep,125,3 +forestdplankstep,125,3 +forestdoublewoodenstep,125,3 +forestdwoodenstep,125,3 +forestdoublewoodstep,125,3 +forestdwoodstep,125,3 +forestdoublewstep,125,3 +forestdwstep,125,3 +forestdoublestep,125,3 +forestdstep,125,3 +forestwoodenplankdoubleslab,125,3 +forestwoodenplankdslab,125,3 +forestwoodplankdoubleslab,125,3 +forestwoodplankdslab,125,3 +forestwplankdoubleslab,125,3 +forestwplankdslab,125,3 +forestplankdoubleslab,125,3 +forestplankdslab,125,3 +forestwoodendoubleslab,125,3 +forestwoodendslab,125,3 +forestwooddoubleslab,125,3 +forestwooddslab,125,3 +forestwdoubleslab,125,3 +forestwdslab,125,3 +forestdoublewoodenplankslab,125,3 +forestdwoodenplankslab,125,3 +forestdoublewoodplankslab,125,3 +forestdwoodplankslab,125,3 +forestdoublewplankslab,125,3 +forestdwplankslab,125,3 +forestdoubleplankslab,125,3 +forestdplankslab,125,3 +forestdoublewoodenslab,125,3 +forestdwoodenslab,125,3 +forestdoublewoodslab,125,3 +forestdwoodslab,125,3 +forestdoublewslab,125,3 +forestdwslab,125,3 +forestdoubleslab,125,3 +forestdslab,125,3 +woodenplankstep,126,0 +woodplankstep,126,0 +wplankstep,126,0 +plankstep,126,0 +woodenstep,126,0 +woodstep,126,0 +wstep,126,0 +woodenplankslab,126,0 +woodplankslab,126,0 +wplankslab,126,0 +plankslab,126,0 +woodenslab,126,0 +woodslab,126,0 +wslab,126,0 +woodenplankhalfblock,126,0 +woodplankhalfblock,126,0 +wplankhalfblock,126,0 +plankhalfblock,126,0 +woodenhalfblock,126,0 +woodhalfblock,126,0 +whalfblock,126,0 +oakwoodenplankstep,126,0 +oakwoodplankstep,126,0 +oakwplankstep,126,0 +oakplankstep,126,0 +oakwoodenstep,126,0 +oakwoodstep,126,0 +oakwstep,126,0 +oakstep,126,0 +oakwoodenplankslab,126,0 +oakwoodplankslab,126,0 +oakwplankslab,126,0 +oakplankslab,126,0 +oakwoodenslab,126,0 +oakwoodslab,126,0 +oakwslab,126,0 +oakslab,126,0 +oakwoodenplankhalfblock,126,0 +oakwoodplankhalfblock,126,0 +oakwplankhalfblock,126,0 +oakplankhalfblock,126,0 +oakwoodenhalfblock,126,0 +oakwoodhalfblock,126,0 +oakwhalfblock,126,0 +oakhalfblock,126,0 +sprucewoodenplankstep,126,1 +sprucewoodplankstep,126,1 +sprucewplankstep,126,1 +spruceplankstep,126,1 +sprucewoodenstep,126,1 +sprucewoodstep,126,1 +sprucewstep,126,1 +sprucestep,126,1 +sprucewoodenplankslab,126,1 +sprucewoodplankslab,126,1 +sprucewplankslab,126,1 +spruceplankslab,126,1 +sprucewoodenslab,126,1 +sprucewoodslab,126,1 +sprucewslab,126,1 +spruceslab,126,1 +sprucewoodenplankhalfblock,126,1 +sprucewoodplankhalfblock,126,1 +sprucewplankhalfblock,126,1 +spruceplankhalfblock,126,1 +sprucewoodenhalfblock,126,1 +sprucewoodhalfblock,126,1 +sprucewhalfblock,126,1 +sprucehalfblock,126,1 +darkwoodenplankstep,126,1 +darkwoodplankstep,126,1 +darkwplankstep,126,1 +darkplankstep,126,1 +darkwoodenstep,126,1 +darkwoodstep,126,1 +darkwstep,126,1 +darkstep,126,1 +darkwoodenplankslab,126,1 +darkwoodplankslab,126,1 +darkwplankslab,126,1 +darkplankslab,126,1 +darkwoodenslab,126,1 +darkwoodslab,126,1 +darkwslab,126,1 +darkslab,126,1 +darkwoodenplankhalfblock,126,1 +darkwoodplankhalfblock,126,1 +darkwplankhalfblock,126,1 +darkplankhalfblock,126,1 +darkwoodenhalfblock,126,1 +darkwoodhalfblock,126,1 +darkwhalfblock,126,1 +darkhalfblock,126,1 +birchwoodenplankstep,126,2 +birchwoodplankstep,126,2 +birchwplankstep,126,2 +birchplankstep,126,2 +birchwoodenstep,126,2 +birchwoodstep,126,2 +birchwstep,126,2 +birchstep,126,2 +birchwoodenplankslab,126,2 +birchwoodplankslab,126,2 +birchwplankslab,126,2 +birchplankslab,126,2 +birchwoodenslab,126,2 +birchwoodslab,126,2 +birchwslab,126,2 +birchslab,126,2 +birchwoodenplankhalfblock,126,2 +birchwoodplankhalfblock,126,2 +birchwplankhalfblock,126,2 +birchplankhalfblock,126,2 +birchwoodenhalfblock,126,2 +birchwoodhalfblock,126,2 +birchwhalfblock,126,2 +birchhalfblock,126,2 +lightwoodenplankstep,126,2 +lightwoodplankstep,126,2 +lightwplankstep,126,2 +lightplankstep,126,2 +lightwoodenstep,126,2 +lightwoodstep,126,2 +lightwstep,126,2 +lightstep,126,2 +lightwoodenplankslab,126,2 +lightwoodplankslab,126,2 +lightwplankslab,126,2 +lightplankslab,126,2 +lightwoodenslab,126,2 +lightwoodslab,126,2 +lightwslab,126,2 +lightslab,126,2 +lightwoodenplankhalfblock,126,2 +lightwoodplankhalfblock,126,2 +lightwplankhalfblock,126,2 +lightplankhalfblock,126,2 +lightwoodenhalfblock,126,2 +lightwoodhalfblock,126,2 +lightwhalfblock,126,2 +lighthalfblock,126,2 +junglewoodenplankstep,126,3 +junglewoodplankstep,126,3 +junglewplankstep,126,3 +jungleplankstep,126,3 +junglewoodenstep,126,3 +junglewoodstep,126,3 +junglewstep,126,3 +junglestep,126,3 +junglewoodenplankslab,126,3 +junglewoodplankslab,126,3 +junglewplankslab,126,3 +jungleplankslab,126,3 +junglewoodenslab,126,3 +junglewoodslab,126,3 +junglewslab,126,3 +jungleslab,126,3 +junglewoodenplankhalfblock,126,3 +junglewoodplankhalfblock,126,3 +junglewplankhalfblock,126,3 +jungleplankhalfblock,126,3 +junglewoodenhalfblock,126,3 +junglewoodhalfblock,126,3 +junglewhalfblock,126,3 +junglehalfblock,126,3 +forestwoodenplankstep,126,3 +forestwoodplankstep,126,3 +forestwplankstep,126,3 +forestplankstep,126,3 +forestwoodenstep,126,3 +forestwoodstep,126,3 +forestwstep,126,3 +foreststep,126,3 +forestwoodenplankslab,126,3 +forestwoodplankslab,126,3 +forestwplankslab,126,3 +forestplankslab,126,3 +forestwoodenslab,126,3 +forestwoodslab,126,3 +forestwslab,126,3 +forestslab,126,3 +forestwoodenplankhalfblock,126,3 +forestwoodplankhalfblock,126,3 +forestwplankhalfblock,126,3 +forestplankhalfblock,126,3 +forestwoodenhalfblock,126,3 +forestwoodhalfblock,126,3 +forestwhalfblock,126,3 +foresthalfblock,126,3 +cocoaplant,127,0 +cocoplant,127,0 +cplant,127,0 +cocoafruit,127,0 +cocofruit,127,0 +cfruit,127,0 +cocoapod,127,0 +cocopod,127,0 +cpod,127,0 +sandstairs,128,0 +sandstonestairs,128,0 +sandsstairs,128,0 +sstonestairs,128,0 +ssstairs,128,0 +sandstair,128,0 +sandstonestair,128,0 +sandsstair,128,0 +sstonestair,128,0 +ssstair,128,0 +emeraldore,129,0 +eore,129,0 +oreemerald,129,0 +oree,129,0 +enderchest,130,0 +endchest,130,0 +echest,130,0 +chestender,130,0 +chestend,130,0 +cheste,130,0 +endercontainer,130,0 +endcontainer,130,0 +econtainer,130,0 +tripwirehook,131,0 +tripwire,131,0 +trip,131,0 +tripwirelever,131,0 +triphook,131,0 +tripwireblock,132,0 +tripblock,132,0 +blocktrip,132,0 +blocktripwire,132,0 +emeraldblock,133,0 +blockemerald,133,0 +eblock,133,0 +blocke,133,0 +sprucewoodenplankstairs,134,0 +sprucewoodplankstairs,134,0 +sprucewplankstairs,134,0 +spruceplankstairs,134,0 +sprucewoodenstairs,134,0 +sprucewoodstairs,134,0 +sprucewstairs,134,0 +sprucestairs,134,0 +darkwoodenplankstairs,134,0 +darkwoodplankstairs,134,0 +darkwplankstairs,134,0 +darkplankstairs,134,0 +darkwoodenstairs,134,0 +darkwoodstairs,134,0 +darkwstairs,134,0 +darkstairs,134,0 +sprucewoodenplankstair,134,0 +sprucewoodplankstair,134,0 +sprucewplankstair,134,0 +spruceplankstair,134,0 +sprucewoodenstair,134,0 +sprucewoodstair,134,0 +sprucewstair,134,0 +sprucestair,134,0 +darkwoodenplankstair,134,0 +darkwoodplankstair,134,0 +darkwplankstair,134,0 +darkplankstair,134,0 +darkwoodenstair,134,0 +darkwoodstair,134,0 +darkwstair,134,0 +darkstair,134,0 +birchwoodenplankstairs,135,0 +birchwoodplankstairs,135,0 +birchwplankstairs,135,0 +birchplankstairs,135,0 +birchwoodenstairs,135,0 +birchwoodstairs,135,0 +birchwstairs,135,0 +birchstairs,135,0 +lightwoodenplankstairs,135,0 +lightwoodplankstairs,135,0 +lightwplankstairs,135,0 +lightplankstairs,135,0 +lightwoodenstairs,135,0 +lightwoodstairs,135,0 +lightwstairs,135,0 +lightstairs,135,0 +birchwoodenplankstair,135,0 +birchwoodplankstair,135,0 +birchwplankstair,135,0 +birchplankstair,135,0 +birchwoodenstair,135,0 +birchwoodstair,135,0 +birchwstair,135,0 +birchstair,135,0 +lightwoodenplankstair,135,0 +lightwoodplankstair,135,0 +lightwplankstair,135,0 +lightplankstair,135,0 +lightwoodenstair,135,0 +lightwoodstair,135,0 +lightwstair,135,0 +lightstair,135,0 +junglewoodenplankstairs,136,0 +junglewoodplankstairs,136,0 +junglewplankstairs,136,0 +jungleplankstairs,136,0 +junglewoodenstairs,136,0 +junglewoodstairs,136,0 +junglewstairs,136,0 +junglestairs,136,0 +forestwoodenplankstairs,136,0 +forestwoodplankstairs,136,0 +forestwplankstairs,136,0 +forestplankstairs,136,0 +forestwoodenstairs,136,0 +forestwoodstairs,136,0 +forestwstairs,136,0 +foreststairs,136,0 +junglewoodenplankstair,136,0 +junglewoodplankstair,136,0 +junglewplankstair,136,0 +jungleplankstair,136,0 +junglewoodenstair,136,0 +junglewoodstair,136,0 +junglewstair,136,0 +junglestair,136,0 +forestwoodenplankstair,136,0 +forestwoodplankstair,136,0 +forestwplankstair,136,0 +forestplankstair,136,0 +forestwoodenstair,136,0 +forestwoodstair,136,0 +forestwstair,136,0 +foreststair,136,0 +commandblock,137,0 +blockcommand,137,0 +cmdblock,137,0 +blockcmd,137,0 +macroblock,137,0 +blockmacro,137,0 +beacon,138,0 +beaconblock,138,0 +cobblestonewall,139,0 +cstonewall,139,0 +cobblewall,139,0 +cobblestonefence,139,0 +cstonefence,139,0 +cobblefence,139,0 +mosscobblestonewall,139,1 +mosscstonewall,139,1 +mosscobblewall,139,1 +mcobblestonewall,139,1 +mcstonewall,139,1 +mcobblewall,139,1 +mosscobblestonefence,139,1 +mosscstonefence,139,1 +mosscobblefence,139,1 +mcobblestonefence,139,1 +mcstonefence,139,1 +mcobblefence,139,1 +emptyflowerpot,140,0 +emptypot,140,0 +flowerpotblock,140,0 +potblock,140,0 +roseflowerpot,140,1 +rosepot,140,1 +dandelionflowerpot,140,2 +dandelionpot,140,2 +oaksaplingflowerpot,140,3 +saplingflowerpot,140,3 +oakflowerpot,140,3 +oaksaplingpot,140,3 +saplingpot,140,3 +oakpot,140,3 +sprucesaplingflowerpot,140,4 +spruceflowerpot,140,4 +darksaplingflowerpot,140,4 +darkflowerpot,140,4 +pinesaplingflowerpot,140,4 +pineflowerpot,140,4 +sprucesaplingpot,140,4 +sprucepot,140,4 +darksaplingpot,140,4 +darkpot,140,4 +pinesaplingpot,140,4 +pinepot,140,4 +birchsaplingflowerpot,140,5 +birchflowerpot,140,5 +lightsaplingflowerpot,140,5 +lightflowerpot,140,5 +whitesaplingflowerpot,140,5 +whiteflowerpot,140,5 +birchsaplingpot,140,5 +birchpot,140,5 +lightsaplingpot,140,5 +lightpot,140,5 +whitesaplingpot,140,5 +whitepot,140,5 +forestsaplingflowerpot,140,6 +forestflowerpot,140,6 +junglesaplingflowerpot,140,6 +jungleflowerpot,140,6 +forestsaplingpot,140,6 +forestpot,140,6 +junglesaplingpot,140,6 +junglepot,140,6 +redmushroomflowerpot,140,7 +redshroomflowerpot,140,7 +redmushflowerpot,140,7 +rmushroomflowerpot,140,7 +rshroomflowerpot,140,7 +rmushflowerpot,140,7 +redmushroompot,140,7 +redshroompot,140,7 +redmushpot,140,7 +rmushroompot,140,7 +rshroompot,140,7 +rmushpot,140,7 +brownmushroomflowerpot,140,8 +brownshroomflowerpot,140,8 +brownmushflowerpot,140,8 +bmushroomflowerpot,140,8 +bshroomflowerpot,140,7 +bmushflowerpot,140,8 +brownmushroompot,140,8 +brownshroompot,140,8 +brownmushpot,140,8 +bmushroompot,140,8 +bshroompot,140,8 +bmushpot,140,8 +cactusflowerpot,140,9 +cactuspot,140,9 +deadbushflowerpot,140,10 +dbushflowerpot,140,10 +deadsaplingflowerpot,140,10 +dsaplingflowerpot,140,10 +deadshrubflowerpot,140,10 +dshrubflowerpot,140,10 +deadbushpot,140,10 +dbushpot,140,10 +deadsaplingpot,140,10 +dsaplingpot,140,10 +deadshrubpot,140,10 +dshrubpot,140,10 +fernflowerpot,140,11 +bushflowerpot,140,11 +fernpot,140,11 +bushpot,140,11 +carrots,141,0 +plantedcarrot,141,0 +plantcarrot,141,0 +growingcarrot,141,0 +potatoes,142,0 +plantedpotato,142,0 +plantpotato,142,0 +growingpotato,142,0 +woodenplankbutton,143,0 +woodplankbutton,143,0 +wplankbutton,143,0 +plankbutton,143,0 +woodenbutton,143,0 +woodbutton,143,0 +wbutton,143,0 +headblock,144,0 +anvil,145,0 +slightlydamagedanvil,145,1 +slightdamageanvil,145,1 +damagedanvil,145,1 +verydamagedanvil,145,2 +trappedchest,146,0 +trapchest,146,0 +chesttrapped,146,0 +chesttrap,146,0 +weightedgoldpressureplate,147,0 +weightgoldpressureplate,147,0 +wgoldpressureplate,147,0 +goldpressureplate,147,0 +weightedgoldpressplate,147,0 +weightgoldpressplate,147,0 +wgoldpressplate,147,0 +goldpressplate,147,0 +weightedgoldpplate,147,0 +weightgoldpplate,147,0 +wgoldpplate,147,0 +goldpplate,147,0 +weightedgoldplate,147,0 +weightgoldplate,147,0 +wgoldplate,147,0 +goldplate,147,0 +weightedgpressureplate,147,0 +weightgpressureplate,147,0 +wgpressureplate,147,0 +gpressureplate,147,0 +weightedgpressplate,147,0 +weightgpressplate,147,0 +wgpressplate,147,0 +gpressplate,147,0 +weightedgpplate,147,0 +weightgpplate,147,0 +wgpplate,147,0 +gpplate,147,0 +weightedgplate,147,0 +weightgplate,147,0 +wgplate,147,0 +gplate,147,0 +weightedironpressureplate,148,0 +weightironpressureplate,148,0 +wironpressureplate,148,0 +ironpressureplate,148,0 +weightedironpressplate,148,0 +weightironpressplate,148,0 +wironpressplate,148,0 +ironpressplate,148,0 +weightedironpplate,148,0 +weightironpplate,148,0 +wironpplate,148,0 +ironpplate,148,0 +weightedironplate,148,0 +weightironplate,148,0 +wironplate,148,0 +ironplate,148,0 +weightedipressureplate,148,0 +weightipressureplate,148,0 +wipressureplate,148,0 +ipressureplate,148,0 +weightedipressplate,148,0 +weightipressplate,148,0 +wipressplate,148,0 +ipressplate,148,0 +weightedipplate,148,0 +weightipplate,148,0 +wipplate,148,0 +ipplate,148,0 +weightediplate,148,0 +weightiplate,148,0 +wiplate,148,0 +iplate,148,0 +redstonecomparatorblockoff,149,0 +redstonecompererblockoff,149,0 +redstonecompareblockoff,149,0 +rstonecomparatorblockoff,149,0 +rstonecompererblockoff,149,0 +rstonecompareblockoff,149,0 +redscomparatorblockoff,149,0 +redscompererblockoff,149,0 +redscompareblockoff,149,0 +rscomparatorblockoff,149,0 +rscompererblockoff,149,0 +rscompareblockoff,149,0 +comparatorblockoff,149,0 +compererblockoff,149,0 +compareblockoff,149,0 +redstonecomparatoroff,149,0 +redstonecompereroff,149,0 +redstonecompareoff,149,0 +rstonecomparatoroff,149,0 +rstonecompereroff,149,0 +rstonecompareoff,149,0 +redscomparatoroff,149,0 +redscompereroff,149,0 +redscompareoff,149,0 +rscomparatoroff,149,0 +rscompereroff,149,0 +rscompareoff,149,0 +comparatoroff,149,0 +compereroff,149,0 +compareoff,149,0 +redstonecomparatorblockon,150,0 +redstonecompererblockon,150,0 +redstonecompareblockon,150,0 +rstonecomparatorblockon,150,0 +rstonecompererblockon,150,0 +rstonecompareblockon,150,0 +redscomparatorblockon,150,0 +redscompererblockon,150,0 +redscompareblockon,150,0 +rscomparatorblockon,150,0 +rscompererblockon,150,0 +rscompareblockon,150,0 +comparatorblockon,150,0 +compererblockon,150,0 +compareblockon,150,0 +redstonecomparatoron,150,0 +redstonecompereron,150,0 +redstonecompareon,150,0 +rstonecomparatoron,150,0 +rstonecompereron,150,0 +rstonecompareon,150,0 +redscomparatoron,150,0 +redscompereron,150,0 +redscompareon,150,0 +rscomparatoron,150,0 +rscompereron,150,0 +rscompareon,150,0 +comparatoron,150,0 +compereron,150,0 +compareon,150,0 +daylightsensor,151,0 +daylightsense,151,0 +lightsensor,151,0 +lightsense,151,0 +daysensor,151,0 +daysense,151,0 +timesensor,151,0 +timesense,151,0 +redstoneblock,152,0 +rstoneblock,152,0 +redsblock,152,0 +rsblock,152,0 +blockredstone,152,0 +blockrstone,152,0 +blockreds,152,0 +blockrs,152,0 +netherquartzore,153,0 +hellquartzore,153,0 +deathquartzore,153,0 +nquartzore,153,0 +hquartzore,153,0 +dquartzore,153,0 +quartzore,153,0 +netherqore,153,0 +hellqore,153,0 +deathqore,153,0 +nqore,153,0 +hqore,153,0 +dqore,153,0 +qore,153,0 +hopper,154,0 +chestpuller,154,0 +chestpull,154,0 +cheststorer,154,0 +cheststore,154,0 +itempuller,154,0 +itempull,154,0 +itemstorer,154,0 +itemstore,154,0 +normalquartzblock,155,0 +nquartzblock,155,0 +quartzblock,155,0 +normalqblock,155,0 +nqblock,155,0 +qblock,155,0 +blocknormalquartz,155,0 +blocknquartz,155,0 +blockquartz,155,0 +blocknormalq,155,0 +blocknq,155,0 +blockq,155,0 +chiseledquartzblock,155,1 +chiselquartzblock,155,1 +cquartzblock,155,1 +chiseledqblock,155,1 +chiselqblock,155,1 +cqblock,155,1 +blockchiseledquartz,155,1 +blockchiselquartz,155,1 +blockcquartz,155,1 +blockchiseledq,155,1 +blockchiselq,155,1 +blockcq,155,1 +pillarquartzblock,155,2 +pquartzblock,155,2 +pillarqblock,155,2 +pqblock,155,2 +blockpillarquartz,155,2 +blockpquartz,155,2 +blockpillarq,155,2 +blockpq,155,2 +quartzstairs,156,0 +qstairs,156,0 +quartzstair,156,0 +qstair,156,0 +activatorrails,157,0 +activaterails,157,0 +triggerrails,157,0 +arails,157,0 +trails,157,0 +activatorrail,157,0 +activaterail,157,0 +triggerrail,157,0 +arail,157,0 +trail,157,0 +activatortrack,157,0 +activatetrack,157,0 +triggertrack,157,0 +atrack,157,0 +ttrack,157,0 +dropper,158,0 +drop,158,0 +chestdispenser,158,0 +chestdispense,158,0 +chestdropper,158,0 +chestdrop,158,0 ironshovel,256,0 ironspade,256,0 ishovel,256,0 @@ -2110,6 +3798,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 @@ -2231,6 +3921,8 @@ diamondaxe,279,0 crystalaxe,279,0 daxe,279,0 stick,280,0 +twig,280,0 +branch,280,0 bowl,281,0 mushroomsoup,282,0 mrsoup,282,0 @@ -2278,17 +3970,21 @@ bread,297,0 leatherhelmet,298,0 leatherhelm,298,0 leatherhat,298,0 +leathercoif,298,0 lhelmet,298,0 lhelm,298,0 lhat,298,0 +lcoif,298,0 leatherchestplate,299,0 leatherplatebody,299,0 leatherplate,299,0 leathershirt,299,0 +leathertunic,299,0 lchestplate,299,0 lplatebody,299,0 lplate,299,0 lshirt,299,0 +ltunic,299,0 leatherleggings,300,0 leatherlegs,300,0 leatherpants,300,0 @@ -2302,38 +3998,48 @@ lshoes,301,0 chainmailhelmet,302,0 chainmailhelm,302,0 chainmailhat,302,0 +chainmailcoif,302,0 chainmhelmet,302,0 chainmhelm,302,0 chainmhat,302,0 +chainmcoif,302,0 cmailhelmet,302,0 cmailhelm,302,0 cmailhat,302,0 +cmailcoif,302,0 chainhelmet,302,0 chainhelm,302,0 chainhat,302,0 +chaincoif,302,0 cmhelmet,302,0 cmhelm,302,0 cmhat,302,0 +cmcoif,302,0 chainmailchestplate,303,0 chainmailplatebody,303,0 chainmailplate,303,0 chainmailshirt,303,0 +chainmailtunic,303,0 chainmchestplate,303,0 chainmplatebody,303,0 chainmplate,303,0 chainmshirt,303,0 +chainmtunic,303,0 cmailchestplate,303,0 cmailplatebody,303,0 cmailplate,303,0 cmailshirt,303,0 +cmailtunic,303,0 chainchestplate,303,0 chainplatebody,303,0 chainplate,303,0 chainshirt,303,0 +chaintunic,303,0 cmchestplate,303,0 cmplatebody,303,0 cmplate,303,0 cmshirt,303,0 +cmtunic,303,0 chainmailleggings,304,0 chainmaillegs,304,0 chainmailpants,304,0 @@ -2362,30 +4068,36 @@ cmshoes,305,0 ironhelmet,306,0 ironhelm,306,0 ironhat,306,0 +ironcoif,306,0 ihelmet,306,0 ihelm,306,0 ihat,306,0 +icoif,306,0 steelhelmet,306,0 steelhelm,306,0 steelhat,306,0 +steelcoif,306,0 shelmet,306,0 shelm,306,0 shat,306,0 +scoif,306,0 ironchestplate,307,0 ironplatebody,307,0 -ironplate,307,0 ironshirt,307,0 +irontunic,307,0 ichestplate,307,0 iplatebody,307,0 -iplate,307,0 ishirt,307,0 +itunic,307,0 steelchestplate,307,0 steelplatebody,307,0 steelplate,307,0 steelshirt,307,0 +steeltunic,307,0 schestplate,307,0 splatebody,307,0 sshirt,307,0 +stunic,307,0 ironleggings,308,0 ironlegs,308,0 ironpants,308,0 @@ -2409,31 +4121,39 @@ sshoes,309,0 diamondhelmet,310,0 diamondhelm,310,0 diamondhat,310,0 +diamondcoif,310,0 dhelmet,310,0 dhelm,310,0 dhat,310,0 +dcoif,310,0 crystalhelmet,310,0 crystalhelm,310,0 crystalhat,310,0 +crystalcoif,310,0 chelmet,310,0 chelm,310,0 chat,310,0 +ccoif,310,0 diamondchestplate,311,0 diamondplatebody,311,0 diamondplate,311,0 diamondshirt,311,0 +diamondtunic,311,0 dchestplate,311,0 dplatebody,311,0 dplate,311,0 dshirt,311,0 +dtunic,311,0 crystalchestplate,311,0 crystalplatebody,311,0 crystalplate,311,0 crystalshirt,311,0 +crystaltunic,311,0 cchestplate,311,0 cplatebody,311,0 cplate,311,0 cshirt,311,0 +ctunic,311,0 diamondleggings,312,0 diamondlegs,312,0 diamondpants,312,0 @@ -2457,17 +4177,20 @@ cshoes,313,0 goldhelmet,314,0 goldhelm,314,0 goldhat,314,0 +goldcoif,314,0 ghelmet,314,0 ghelm,314,0 ghat,314,0 +gcoif,314,0 goldchestplate,315,0 goldplatebody,315,0 -goldplate,315,0 goldshirt,315,0 +goldtunic,315,0 gchestplate,315,0 gplatebody,315,0 gplateplate,315,0 gshirt,315,0 +gtunic,315,0 goldleggings,316,0 goldlegs,316,0 goldpants,316,0 @@ -2480,22 +4203,55 @@ gboots,317,0 gshoes,317,0 flint,318,0 pork,319,0 +porkchop,319,0 rawpork,319,0 rpork,319,0 +rawporkchop,319,0 +rporkchop,319,0 grilledpork,320,0 grillpork,320,0 gpork,320,0 cookedpork,320,0 +cookpork,320,0 +cpork,320,0 +grilledporkchop,320,0 +grillporkchop,320,0 +gporkchop,320,0 +cookedporkchop,320,0 +cookporkchop,320,0 +cporkchop,320,0 bacon,320,0 painting,321,0 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 wdoor,324,0 +door,324,0 bucket,325,0 bukkit,325,0 waterbucket,326,0 @@ -2528,6 +4284,7 @@ redsdust,331,0 reddust,331,0 rsdust,331,0 rdust,331,0 +snow,332,0 snowball,332,0 snball,332,0 boat,333,0 @@ -2712,12 +4469,16 @@ greencactusdye,351,2 greencolour,351,2 greencolor,351,2 greendye,351,2 +cocoabeans,351,3 +cocoabean,351,3 cocobeans,351,3 cocobean,351,3 cbeans,351,3 cbean,351,3 beans,351,3 bean,351,3 +browncocoabeans,351,3 +browncocoabean,351,3 browncocobeans,351,3 browncocobean,351,3 browncbeans,351,3 @@ -2725,12 +4486,16 @@ browncbean,351,3 brownbeans,351,3 brownbean,351,3 brownb,351,3 +cocoabeanscolour,351,3 +cocoabeancolour,351,3 cocobeanscolour,351,3 cocobeancolour,351,3 cbeanscolour,351,3 cbeancolour,351,3 beanscolour,351,3 beancolour,351,3 +browncocoabeanscolour,351,3 +browncocoabeancolour,351,3 browncocobeanscolour,351,3 browncocobeancolour,351,3 browncbeanscolour,351,3 @@ -2738,12 +4503,16 @@ browncbeancolour,351,3 brownbeanscolour,351,3 brownbeancolour,351,3 brownbcolour,351,3 +cocoabeanscolor,351,3 +cocoabeancolor,351,3 cocobeanscolor,351,3 cocobeancolor,351,3 cbeanscolor,351,3 cbeancolor,351,3 beanscolor,351,3 beancolor,351,3 +browncocoabeanscolor,351,3 +browncocoabeancolor,351,3 browncocobeanscolor,351,3 browncocobeancolor,351,3 browncbeanscolor,351,3 @@ -2751,12 +4520,16 @@ browncbeancolor,351,3 brownbeanscolor,351,3 brownbeancolor,351,3 brownbcolor,351,3 +cocoabeansdye,351,3 +cocoabeandye,351,3 cocobeansdye,351,3 cocobeandye,351,3 cbeansdye,351,3 cbeandye,351,3 beansdye,351,3 beandye,351,3 +browncocoabeansdye,351,3 +browncocoabeandye,351,3 browncocobeansdye,351,3 browncocobeandye,351,3 browncbeansdye,351,3 @@ -2819,6 +4592,15 @@ lightgraydye,351,7 lgraycolour,351,7 lgraycolor,351,7 lgraydye,351,7 +silvercolour,351,7 +silvercolor,351,7 +silverdye,351,7 +darkgraycolour,351,8 +darkgraycolor,351,8 +darkgraydye,351,8 +dgraycolour,351,8 +dgraycolor,351,8 +dgraydye,351,8 graycolour,351,8 graycolor,351,8 graydye,351,8 @@ -2891,10 +4673,30 @@ sugar,353,0 whitedust,353,0 cake,354,0 bed,355,0 -sleepingtable,355,0 -sleeptable,355,0 -tablesleeping,355,0 -tablesleep,355,0 +redstonerepeater,356,0 +redstonerepeat,356,0 +redstonedelayer,356,0 +redstonedelay,356,0 +redstonedioder,356,0 +redstonediode,356,0 +rstonerepeater,356,0 +rstonerepeat,356,0 +rstonedelayer,356,0 +rstonedelay,356,0 +rstonedioder,356,0 +rstonediode,356,0 +redsrepeater,356,0 +redsrepeat,356,0 +redsdelayer,356,0 +redsdelay,356,0 +redsdioder,356,0 +redsdiode,356,0 +rsrepeater,356,0 +rsrepeat,356,0 +rsdelayer,356,0 +rsdelay,356,0 +rsdioder,356,0 +rsdiode,356,0 repeater,356,0 repeat,356,0 delayer,356,0 @@ -2902,8 +4704,23 @@ delay,356,0 dioder,356,0 diode,356,0 cookie,357,0 -map,358,0 chart,358,0 +map0,358,0 +map1,358,1 +map2,358,2 +map3,358,3 +map4,358,4 +map5,358,5 +map6,358,6 +map7,358,7 +map8,358,8 +map9,358,9 +map10,358,10 +map11,358,11 +map12,358,12 +map13,358,13 +map14,358,14 +map15,358,15 shears,359,0 shear,359,0 sheers,359,0 @@ -2965,6 +4782,7 @@ badflesh,367,0 poisonflesh,367,0 zombieremains,367,0 enderpearl,368,0 +endpearl,368,0 pearl,368,0 epearl,368,0 bluepearl,368,0 @@ -3012,6 +4830,1295 @@ hstalk,372,0 potion,373,0 mixture,373,0 potions,373,0 +waterbottle,373,0 +fullbottle,373,0 +watervase,373,0 +fullvase,373,0 +clearpotion,373,6 +clearpot,373,6 +clearextendedpotion,373,7 +clearexpotion,373,7 +clear2potion,373,7 +clearextendedpot,373,7 +clearexpot,373,7 +clear2pot,373,7 +diffusepotion,373,11 +diffusepot,373,11 +artlesspotion,373,13 +artlesspot,373,13 +thinpotion,373,14 +thinpot,373,14 +thinextendedpotion,373,15 +thinexpotion,373,15 +thin2potion,373,15 +thinextendedpot,373,15 +thinexpot,373,15 +thin2pot,373,15 +awkwardpotion,373,16 +awkwardpot,373,16 +bunglingpotion,373,22 +bunglingpot,373,22 +bunglingextendedpotion,373,23 +bunglingexpotion,373,23 +bungling2potion,373,23 +bunglingextendedpot,373,23 +bunglingexpot,373,23 +bungling2pot,373,23 +smoothpotion,373,27 +smoothpot,373,27 +suavepotion,373,29 +suavepot,373,29 +debonairpotion,373,30 +debonairpot,373,30 +debonairextendedpotion,373,31 +debonairexpotion,373,31 +debonair2potion,373,31 +debonairextendedpot,373,31 +debonairexpot,373,31 +debonair2pot,373,31 +thickpotion,373,32 +thickpot,373,32 +charmingpotion,373,38 +charmingpot,373,38 +charmingextendedpotion,373,39 +charmingexpotion,373,39 +charming2potion,373,39 +charmingextendedpot,373,39 +charmingexpot,373,39 +charming2pot,373,39 +refinedpotion,373,43 +refinedpot,373,43 +cordialpotion,373,45 +cordialpot,373,45 +sparklingpotion,373,46 +sparklingpot,373,46 +sparklingextendedpotion,373,47 +sparklingexpotion,373,47 +sparkling2potion,373,47 +sparklingextendedpot,373,47 +sparklingexpot,373,47 +sparkling2pot,373,47 +potentpotion,373,48 +potentpot,373,48 +rankpotion,373,54 +rankpot,373,54 +rankextendedpotion,373,55 +rankexpotion,373,55 +rank2potion,373,55 +rankextendedpot,373,55 +rankexpot,373,55 +rank2pot,373,55 +acridpotion,373,59 +acridpot,373,59 +grosspotion,373,61 +grosspot,373,61 +stinkypotion,373,62 +stinkypot,373,62 +stinkyextendedpotion,373,63 +stinkyexpotion,373,63 +stinky2potion,373,63 +stinkyextendedpot,373,63 +stinkyexpot,373,63 +stinky2pot,373,63 +mundaneextendedpotion,373,64 +mundaneexpotion,373,64 +mundane2potion,373,64 +mundaneextendedpot,373,64 +mundaneexpot,373,64 +mundane2pot,373,64 +mundanepotion,373,8192 +mundanepot,373,8192 +regenerationpotion,373,8193 +regeneratepotion,373,8193 +regenpotion,373,8193 +regenerationpot,373,8193 +regeneratepot,373,8193 +regenpot,373,8193 +rpot,373,8193 +swiftnesspotion,373,8194 +swiftpotion,373,8194 +speedpotion,373,8194 +swiftnesspot,373,8194 +swiftpot,373,8194 +speedpot,373,8194 +swpot,373,8194 +fireresistancepotion,373,8195 +fireresistpotion,373,8195 +firerespotion,373,8195 +fireresistancepot,373,8195 +fireresistpot,373,8195 +firerespot,373,8195 +fpot,373,8195 +poisonpotion,373,8196 +acidpotion,373,8196 +poisonpot,373,8196 +acidpot,373,8196 +ppot,373,8196 +healingpotion,373,8197 +healpotion,373,8197 +lifepotion,373,8197 +healingpot,373,8197 +healpot,373,8197 +lifepot,373,8197 +hpot,373,8197 +nightvisionpotion,373,8198 +nvisionpotion,373,8198 +nightvpotion,373,8198 +darkvisionpotion,373,8198 +dvisionpotion,373,8198 +darkvpotion,373,8198 +nightvisionpot,373,8198 +nvisionpot,373,8198 +nightvpot,373,8198 +darkvisionpot,373,8198 +dvisionpot,373,8198 +darkvpot,373,8198 +npot,373,8198 +weaknesspotion,373,8200 +weakpotion,373,8200 +weaknesspot,373,8200 +weakpot,373,8200 +wpot,373,8200 +strengthpotion,373,8201 +strongpotion,373,8201 +strpotion,373,8201 +strengthpot,373,8201 +strongpot,373,8201 +strpot,373,8201 +stpot,373,8201 +slownesspotion,373,8202 +slowpotion,373,8202 +slownesspot,373,8202 +slowpot,373,8202 +slpot,373,8202 +harmingpotion,373,8204 +damagepotion,373,8204 +dmgpotion,373,8204 +harmingpot,373,8204 +damagepot,373,8204 +dmgpot,373,8204 +dpot,373,8204 +invisibilitypotion,373,8206 +invisiblepotion,373,8206 +invpotion,373,8206 +invisibilitypot,373,8206 +invisiblepot,373,8206 +invpot,373,8206 +ipot,373,8206 +regenerationleveliipotion,373,8225 +regenerateleveliipotion,373,8225 +regenleveliipotion,373,8225 +regenerationlevel2potion,373,8225 +regeneratelevel2potion,373,8225 +regenlevel2potion,373,8225 +regenerationiipotion,373,8225 +regenerateiipotion,373,8225 +regeniipotion,373,8225 +regenerationleveliipot,373,8225 +regenerateleveliipot,373,8225 +regenleveliipot,373,8225 +regenerationlevel2pot,373,8225 +regeneratelevel2pot,373,8225 +regenlevel2pot,373,8225 +regenerationiipot,373,8225 +regenerateiipot,373,8225 +regeniipot,373,8225 +r2pot,373,8225 +swiftnessleveliipotion,373,8226 +swiftleveliipotion,373,8226 +speedleveliipotion,373,8226 +swiftnesslevel2potion,373,8226 +swiftlevel2potion,373,8226 +speedlevel2potion,373,8226 +swiftnessiipotion,373,8226 +swiftiipotion,373,8226 +speediipotion,373,8226 +swiftnessleveliipot,373,8226 +swiftleveliipot,373,8226 +speedleveliipot,373,8226 +swiftnesslevel2pot,373,8226 +swiftlevel2pot,373,8226 +speedlevel2pot,373,8226 +swiftnessiipot,373,8226 +swiftiipot,373,8226 +speediipot,373,8226 +sw2pot,373,8226 +poisonleveliipotion,373,8228 +acidleveliipotion,373,8228 +poisonlevel2potion,373,8228 +acidlevel2potion,373,8228 +poisoniipotion,373,8228 +acidiipotion,373,8228 +poisonleveliipot,373,8228 +acidleveliipot,373,8228 +poisonlevel2pot,373,8228 +acidlevel2pot,373,8228 +poisoniipot,373,8228 +acidiipot,373,8228 +p2pot,373,8228 +healingleveliipotion,373,8229 +healleveliipotion,373,8229 +healinglevel2potion,373,8229 +heallevel2potion,373,8229 +healingiipotion,373,8229 +healiipotion,373,8229 +healingleveliipot,373,8229 +healleveliipot,373,8229 +healinglevel2pot,373,8229 +heallevel2pot,373,8229 +healingiipot,373,8229 +healiipot,373,8229 +h2pot,373,8229 +strengthleveliipotion,373,8233 +strongleveliipotion,373,8233 +strleveliipotion,373,8233 +strengthlevel2potion,373,8233 +stronglevel2potion,373,8233 +strlevel2potion,373,8233 +strengthiipotion,373,8233 +strongiipotion,373,8233 +striipotion,373,8233 +strengthleveliipot,373,8233 +strongleveliipot,373,8233 +strleveliipot,373,8233 +strengthlevel2pot,373,8233 +stronglevel2pot,373,8233 +strlevel2pot,373,8233 +strengthiipot,373,8233 +strongiipot,373,8233 +striipot,373,8233 +st2pot,373,8233 +harmingleveliipotion,373,8236 +damageleveliipotion,373,8236 +dmgleveliipotion,373,8236 +harminglevel2potion,373,8236 +damagelevel2potion,373,8236 +dmglevel2potion,373,8236 +harmingiipotion,373,8236 +damageiipotion,373,8236 +dmgiipotion,373,8236 +harmingleveliipot,373,8236 +damageleveliipot,373,8236 +dmgleveliipot,373,8236 +harminglevel2pot,373,8236 +damagelevel2pot,373,8236 +dmglevel2pot,373,8236 +harmingiipot,373,8236 +damageiipot,373,8236 +dmgiipot,373,8236 +d2pot,373,8236 +regenerationextendedpotion,373,8257 +regenerateextendedpotion,373,8257 +regenextendepotion,373,8257 +regenerationexpotion,373,8257 +regenerateexpotion,373,8257 +regenexpotion,373,8257 +regenerationextendedpot,373,8257 +regenerateextendedpot,373,8257 +regenextendepot,373,8257 +regenerationexpot,373,8257 +regenerateexpot,373,8257 +regenexpot,373,8257 +repot,373,8257 +swiftnessextendedpotion,373,8258 +swiftextendedpotion,373,8258 +speedextendedpotion,373,8258 +swiftnessexpotion,373,8258 +swiftexpotion,373,8258 +speedexpotion,373,8258 +swiftnessextendedpot,373,8258 +swiftextendedpot,373,8258 +speedextendedpot,373,8258 +swiftnessexpot,373,8258 +swiftexpot,373,8258 +speedexpot,373,8258 +swepot,373,8258 +fireresistanceextendedpotion,373,8259 +fireresistextendedpotion,373,8259 +fireresextendedpotion,373,8259 +fireresistanceexpotion,373,8259 +fireresistexpotion,373,8259 +fireresexpotion,373,8259 +fireresistanceextendedpot,373,8259 +fireresistextendedpot,373,8259 +fireresextendedpot,373,8259 +fireresistanceexpot,373,8259 +fireresistexpot,373,8259 +fireresexpot,373,8259 +fepot,373,8259 +poisonextendedpotion,373,8260 +acidextendedpotion,373,8260 +poisonexpotion,373,8260 +acidexpotion,373,8260 +poisonextendedpot,373,8260 +acidextendedpot,373,8260 +poisonexpot,373,8260 +acidexpot,373,8260 +pepot,373,8260 +nightvisionextendedpotion,373,8262 +nvisionextendedpotion,373,8262 +nightvextendedpotion,373,8262 +darkvisionextendedpotion,373,8262 +dvisionextendedpotion,373,8262 +darkvextendedpotion,373,8262 +nightvisionexpotion,373,8262 +nvisionexpotion,373,8262 +nightvexpotion,373,8262 +darkvisionexpotion,373,8262 +dvisionexpotion,373,8262 +darkvexpotion,373,8262 +nightvisionextendedpot,373,8262 +nvisionextendedpot,373,8262 +nightvextendedpot,373,8262 +darkvisionextendedpot,373,8262 +dvisionextendedpot,373,8262 +darkvextendedpot,373,8262 +nightvisionexpot,373,8262 +nvisionexpot,373,8262 +nightvexpot,373,8262 +darkvisionexpot,373,8262 +dvisionexpot,373,8262 +darkvexpot,373,8262 +nepot,373,8262 +weaknessextendedpotion,373,8264 +weakextendedpotion,373,8264 +weaknessexpotion,373,8264 +weakexpotion,373,8264 +weaknessextendedpot,373,8264 +weakextendedpot,373,8264 +weaknessexpot,373,8264 +weakexpot,373,8264 +wepot,373,8264 +strengthextendedpotion,373,8265 +strongextendedpotion,373,8265 +strextendedpotion,373,8265 +strengthexpotion,373,8265 +strongexpotion,373,8265 +strexpotion,373,8265 +strengthextendedpot,373,8265 +strongextendedpot,373,8265 +strextendedpot,373,8265 +strengthexpot,373,8265 +strongexpot,373,8265 +strexpot,373,8265 +stepot,373,8265 +slownessextendedpotion,373,8266 +slowextenedpotion,373,8266 +slownessexpotion,373,8266 +slowexpotion,373,8266 +slownessextendedpot,373,8266 +slowextenedpot,373,8266 +slownessexpot,373,8266 +slowexpot,373,8266 +slepot,373,8266 +invisibilityextendedpotion,373,8270 +invisibleextendedpotion,373,8270 +invextendedpotion,373,8270 +invisibilityexpotion,373,8270 +invisibleexpotion,373,8270 +invexpotion,373,8270 +invisibilityextendedpot,373,8270 +invisibleextendedpot,373,8270 +invextendedpot,373,8270 +invisibilityexpot,373,8270 +invisibleexpot,373,8270 +invexpot,373,8270 +iepot,373,8270 +regenerationdualbitpotion,373,8289 +regeneratedualbitpotion,373,8289 +regendualbitpotion,373,8289 +regenerationdbpotion,373,8289 +regeneratedbpotion,373,8289 +regendbpotion,373,8289 +regenerationdualbitpot,373,8289 +regeneratedualbitpot,373,8289 +regendualbitpot,373,8289 +regenerationdbpot,373,8289 +regeneratedbpot,373,8289 +regendbpot,373,8289 +rdbpot,373,8289 +swiftnessdualbitpotion,373,8290 +swiftdualbitpotion,373,8290 +speeddualbitpotion,373,8290 +swiftnessdualbitpot,373,8290 +swiftdualbitpot,373,8290 +speeddualbitpot,373,8290 +swiftnessdbpotion,373,8290 +swiftdbpotion,373,8290 +speeddbpotion,373,8290 +swiftnessdbpot,373,8290 +swiftdbpot,373,8290 +speeddbpot,373,8290 +swdbpot,373,8290 +poisondualbitpotion,373,8292 +aciddualbitpotion,373,8292 +poisondualbitpot,373,8292 +aciddualbitpot,373,8292 +poisondbpotion,373,8292 +aciddbpotion,373,8292 +poisondbpot,373,8292 +aciddbpot,373,8292 +pdbpot,373,8292 +strengthdualbitpotion,373,8297 +strongdualbitpotion,373,8297 +strdualbitpotion,373,8297 +strengthdualbitpot,373,8297 +strongdualbitpot,373,8297 +strdualbitpot,373,8297 +strengthdbpotion,373,8297 +strongdbpotion,373,8297 +strdbpotion,373,8297 +strengthdbpot,373,8297 +strongdbpot,373,8297 +strdbpot,373,8297 +stdbpot,373,8297 +splashmundanepotion,373,16384 +splmundanepotion,373,16384 +splashregenerationpotion,373,16385 +splashregeneratepotion,373,16385 +splashregenpotion,373,16385 +splashregenerationpot,373,16385 +splashregeneratepot,373,16385 +splashregenpot,373,16385 +regenerationsplashpotion,373,16385 +regeneratesplashpotion,373,16385 +regensplashpotion,373,16385 +splregenerationpotion,373,16385 +splregeneratepotion,373,16385 +splregenpotion,373,16385 +splregenerationpot,373,16385 +splregeneratepot,373,16385 +splregenpot,373,16385 +sprpot,373,16385 +splashswiftnesspotion,373,16386 +splashswiftpotion,373,16386 +splashspeedpotion,373,16386 +splashswiftnesspot,373,16386 +splashswiftpot,373,16386 +splashspeedpot,373,16386 +splswiftnesspotion,373,16386 +splswiftpotion,373,16386 +splspeedpotion,373,16386 +splswiftnesspot,373,16386 +splswiftpot,373,16386 +splspeedpot,373,16386 +spswpot,373,16386 +splashfireresistancepotion,373,16387 +splashfireresistpotion,373,16387 +splashfirerespotion,373,16387 +splashfireresistancepot,373,16387 +splashfireresistpot,373,16387 +splashfirerespot,373,16387 +splfireresistancepotion,373,16387 +splfireresistpotion,373,16387 +splfirerespotion,373,16387 +splfireresistancepot,373,16387 +splfireresistpot,373,16387 +splfirerespot,373,16387 +spfpot,373,16387 +splashpoisonpotion,373,16388 +splashacidpotion,373,16388 +splashpoisonpot,373,16388 +splashacidpot,373,16388 +splpoisonpotion,373,16388 +splacidpotion,373,16388 +splpoisonpot,373,16388 +splacidpot,373,16388 +spppot,373,16388 +splashhealingpotion,373,16389 +splashhealpotion,373,16389 +splashlifepotion,373,16389 +splashhealingpot,373,16389 +splashhealpot,373,16389 +splashlifepot,373,16389 +splhealingpotion,373,16389 +splhealpotion,373,16389 +spllifepotion,373,16389 +splhealingpot,373,16389 +splhealpot,373,16389 +spllifepot,373,16389 +sphpot,373,16389 +splashclearpotion,373,16390 +splashclearpot,373,16390 +splclearpotion,373,16390 +splclearpot,373,16390 +splashnightvisionpotion,373,16390 +splashnvisionpotion,373,16390 +splashnightvpotion,373,16390 +splashdarkvisionpotion,373,16390 +splashdvisionpotion,373,16390 +splashdarkvpotion,373,16390 +splashnightvisionpot,373,16390 +splashnvisionpot,373,16390 +splashnightvpot,373,16390 +splashdarkvisionpot,373,16390 +splashdvisionpot,373,16390 +splashdarkvpot,373,16390 +splnightvisionpotion,373,16390 +splnvisionpotion,373,16390 +splnightvpotion,373,16390 +spldarkvisionpotion,373,16390 +spldvisionpotion,373,16390 +spldarkvpotion,373,16390 +splnightvisionpot,373,16390 +splnvisionpot,373,16390 +splnightvpot,373,16390 +spldarkvisionpot,373,16390 +spldvisionpot,373,16390 +spldarkvpot,373,16390 +spnpot,373,16390 +splashclearextendedpotion,373,16391 +splashclearexpotion,373,16391 +splashclear2potion,373,16391 +splashclearextendedpot,373,16391 +splashclearexpot,373,16391 +splashclear2pot,373,16391 +splclearextendedpotion,373,16391 +splclearexpotion,373,16391 +splclear2potion,373,16391 +splclearextendedpot,373,16391 +splclearexpot,373,16391 +splclear2pot,373,16391 +splashweaknesspotion,373,16392 +splashweakpotion,373,16392 +splashweaknesspot,373,16392 +splashweakpot,373,16392 +splweaknesspotion,373,16392 +splweakpotion,373,16392 +splweaknesspot,373,16392 +splweakpot,373,16392 +spwpot,373,16392 +splashstrengthpotion,373,16393 +splashstrongpotion,373,16393 +splashstrpotion,373,16393 +splashstrengthpot,373,16393 +splashstrongpot,373,16393 +splashstrpot,373,16393 +splstrengthpotion,373,16393 +splstrongpotion,373,16393 +splstrpotion,373,16393 +splstrengthpot,373,16393 +splstrongpot,373,16393 +splstrpot,373,16393 +spstpot,373,16393 +splashslownesspotion,373,16394 +splashslowpotion,373,16394 +splashslownesspot,373,16394 +splashslowpot,373,16394 +splslownesspotion,373,16394 +splslowpotion,373,16394 +splslownesspot,373,16394 +splslowpot,373,16394 +spslpot,373,16394 +splashdiffusepotion,373,16395 +splashdiffusepot,373,16395 +spldiffusepotion,373,16395 +spldiffusepot,373,16395 +splashharmingpotion,373,16396 +splashdamagepotion,373,16396 +splashdmgpotion,373,16396 +splashharmingpot,373,16396 +splashdamagepot,373,16396 +splashdmgpot,373,16396 +splharmingpotion,373,16396 +spldamagepotion,373,16396 +spldmgpotion,373,16396 +splharmingpot,373,16396 +spldamagepot,373,16396 +spldmgpot,373,16396 +spdpot,373,16396 +splashartlesspotion,373,16397 +splashartlesspot,373,16397 +splartlesspotion,373,16397 +splartlesspot,373,16397 +splashthinpotion,373,16398 +splashthinpot,373,16398 +splthinpotion,373,16398 +splthinpot,373,16398 +splashinvisibilitypotion,373,16398 +splashinvisiblepotion,373,16398 +splashinvpotion,373,16398 +splashinvisibilitypot,373,16398 +splashinvisiblepot,373,16398 +splashinvpot,373,16398 +splinvisibilitypotion,373,16398 +splinvisiblepotion,373,16398 +splinvpotion,373,16398 +splinvisibilitypot,373,16398 +splinvisiblepot,373,16398 +splinvpot,373,16398 +spipot,373,16398 +splashthinextendedpotion,373,16399 +splashthinexpotion,373,16399 +splashthin2potion,373,16399 +splashthinextendedpot,373,16399 +splashthinexpot,373,16399 +splashthin2pot,373,16399 +splthinextendedpotion,373,16399 +splthinexpotion,373,16399 +splthin2potion,373,16399 +splthinextendedpot,373,16399 +splthinexpot,373,16399 +splthin2pot,373,16399 +splashawkwardpotion,373,16400 +splashawkwardpot,373,16400 +splawkwardpotion,373,16400 +splawkwardpot,373,16400 +splashbunglingpotion,373,16406 +splashbunglingpot,373,16406 +splbunglingpotion,373,16406 +splbunglingpot,373,16406 +splashbunglingextendedpotion,373,16407 +splashbunglingexpotion,373,16407 +splashbungling2potion,373,16407 +splashbunglingextendedpot,373,16407 +splashbunglingexpot,373,16407 +splashbungling2pot,373,16407 +splbunglingextendedpotion,373,16407 +splbunglingexpotion,373,16407 +splbungling2potion,373,16407 +splbunglingextendedpot,373,16407 +splbunglingexpot,373,16407 +splbungling2pot,373,16407 +splashsmoothpotion,373,16411 +splashsmoothpot,373,16411 +splsmoothpotion,373,16411 +splsmoothpot,373,16411 +splashsuavepotion,373,16413 +splashsuavepot,373,16413 +splsuavepotion,373,16413 +splsuavepot,373,16413 +splashdebonairpotion,373,16414 +splashdebonairpot,373,16414 +spldebonairpotion,373,16414 +spldebonairpot,373,16414 +splashdebonairextendedpotion,373,16415 +splashdebonairexpotion,373,16415 +splashdebonair2potion,373,16415 +splashdebonairextendedpot,373,16415 +splashdebonairexpot,373,16415 +splashdebonair2pot,373,16415 +spldebonairextendedpotion,373,16415 +spldebonairexpotion,373,16415 +spldebonair2potion,373,16415 +spldebonairextendedpot,373,16415 +spldebonairexpot,373,16415 +spldebonair2pot,373,16415 +splashthickpotion,373,16416 +splashthickpot,373,16416 +splthickpotion,373,16416 +splthickpot,373,16416 +splashregenerationleveliipotion,373,16417 +splashregenerateleveliipotion,373,16417 +splashregenleveliipotion,373,16417 +splashregenerationlevel2potion,373,16417 +splashregeneratelevel2potion,373,16417 +splashregenlevel2potion,373,16417 +splashregenerationiipotion,373,16417 +splashregenerateiipotion,373,16417 +splashregeniipotion,373,16417 +splashregenerationleveliipot,373,16417 +splashregenerateleveliipot,373,16417 +splashregenleveliipot,373,16417 +splashregenerationlevel2pot,373,16417 +splashregeneratelevel2pot,373,16417 +splashregenlevel2pot,373,16417 +splashregenerationiipot,373,16417 +splashregenerateiipot,373,16417 +splashregeniipot,373,16417 +splregenerationleveliipotion,373,16417 +splregenerateleveliipotion,373,16417 +splregenleveliipotion,373,16417 +splregenerationlevel2potion,373,16417 +splregeneratelevel2potion,373,16417 +splregenlevel2potion,373,16417 +splregenerationiipotion,373,16417 +splregenerateiipotion,373,16417 +splregeniipotion,373,16417 +splregenerationleveliipot,373,16417 +splregenerateleveliipot,373,16417 +splregenleveliipot,373,16417 +splregenerationlevel2pot,373,16417 +splregeneratelevel2pot,373,16417 +splregenlevel2pot,373,16417 +splregenerationiipot,373,16417 +splregenerateiipot,373,16417 +splregeniipot,373,16417 +spr2pot,373,16417 +splashswiftnessleveliipotion,373,16418 +splashswiftleveliipotion,373,16418 +splashspeedleveliipotion,373,16418 +splashswiftnesslevel2potion,373,16418 +splashswiftlevel2potion,373,16418 +splashspeedlevel2potion,373,16418 +splashswiftnessiipotion,373,16418 +splashswiftiipotion,373,16418 +splashspeediipotion,373,16418 +splashswiftnessleveliipot,373,16418 +splashswiftleveliipot,373,16418 +splashspeedleveliipot,373,16418 +splashswiftnesslevel2pot,373,16418 +splashswiftlevel2pot,373,16418 +splashspeedlevel2pot,373,16418 +splashswiftnessiipot,373,16418 +splashswiftiipot,373,16418 +splashspeediipot,373,16418 +splswiftnessleveliipotion,373,16418 +splswiftleveliipotion,373,16418 +splspeedleveliipotion,373,16418 +splswiftnesslevel2potion,373,16418 +splswiftlevel2potion,373,16418 +splspeedlevel2potion,373,16418 +splswiftnessiipotion,373,16418 +splswiftiipotion,373,16418 +splspeediipotion,373,16418 +splswiftnessleveliipot,373,16418 +splswiftleveliipot,373,16418 +splspeedleveliipot,373,16418 +splswiftnesslevel2pot,373,16418 +splswiftlevel2pot,373,16418 +splspeedlevel2pot,373,16418 +splswiftnessiipot,373,16418 +splswiftiipot,373,16418 +splspeediipot,373,16418 +spsw2pot,373,16418 +splashpoisonleveliipotion,373,16420 +splashacidleveliipotion,373,16420 +splashpoisonlevel2potion,373,16420 +splashacidlevel2potion,373,16420 +splashpoisoniipotion,373,16420 +splashacidiipotion,373,16420 +splashpoisonleveliipot,373,16420 +splashacidleveliipot,373,16420 +splashpoisonlevel2pot,373,16420 +splashacidlevel2pot,373,16420 +splashpoisoniipot,373,16420 +splashacidiipot,373,16420 +splpoisonleveliipotion,373,16420 +splacidleveliipotion,373,16420 +splpoisonlevel2potion,373,16420 +splcidlevel2potion,373,16420 +splpoisoniipotion,373,16420 +splacidiipotion,373,16420 +splpoisonleveliipot,373,16420 +splacidleveliipot,373,16420 +splpoisonlevel2pot,373,16420 +splacidlevel2pot,373,16420 +splpoisoniipot,373,16420 +splacidiipot,373,16420 +spp2pot,373,16420 +splashhealingleveliipotion,373,16421 +splashhealleveliipotion,373,16421 +splashhealinglevel2potion,373,16421 +splashheallevel2potion,373,16421 +splashhealingiipotion,373,16421 +splashhealiipotion,373,16421 +splashhealingleveliipot,373,16421 +splashhealleveliipot,373,16421 +splashhealinglevel2pot,373,16421 +splashheallevel2pot,373,16421 +splashhealingiipot,373,16421 +splashhealiipot,373,16421 +splhealingleveliipotion,373,16421 +splhealleveliipotion,373,16421 +splhealinglevel2potion,373,16421 +splheallevel2potion,373,16421 +splhealingiipotion,373,16421 +splhealiipotion,373,16421 +splhealingleveliipot,373,16421 +splhealleveliipot,373,16421 +splhealinglevel2pot,373,16421 +splheallevel2pot,373,16421 +splhealingiipot,373,16421 +splhealiipot,373,16421 +sph2pot,373,16421 +splashcharmingpotion,373,16422 +splashcharmingpot,373,16422 +splcharmingpotion,373,16422 +splcharmingpot,373,16422 +splashcharmingextendedpotion,373,16423 +splashcharmingexpotion,373,16423 +splashcharming2potion,373,16423 +splashcharmingextendedpot,373,16423 +splashcharmingexpot,373,16423 +splashcharming2pot,373,16423 +splcharmingextendedpotion,373,16423 +splcharmingexpotion,373,16423 +splcharming2potion,373,16423 +splcharmingextendedpot,373,16423 +splcharmingexpot,373,16423 +splcharming2pot,373,16423 +splashstrengthleveliipotion,373,16425 +splashstrongleveliipotion,373,16425 +splashstrleveliipotion,373,16425 +splashstrengthlevel2potion,373,16425 +splashstronglevel2potion,373,16425 +splashstrlevel2potion,373,16425 +splashstrengthiipotion,373,16425 +splashstrongiipotion,373,16425 +splashstriipotion,373,16425 +splashstrengthleveliipot,373,16425 +splashstrongleveliipot,373,16425 +splashstrleveliipot,373,16425 +splashstrengthlevel2pot,373,16425 +splashstronglevel2pot,373,16425 +splashstrlevel2pot,373,16425 +splashstrengthiipot,373,16425 +splashstrongiipot,373,16425 +splashstriipot,373,16425 +splstrengthleveliipotion,373,16425 +splstrongleveliipotion,373,16425 +splstrleveliipotion,373,16425 +splstrengthlevel2potion,373,16425 +splstronglevel2potion,373,16425 +splstrlevel2potion,373,16425 +splstrengthiipotion,373,16425 +splstrongiipotion,373,16425 +splstriipotion,373,16425 +splstrengthleveliipot,373,16425 +splstrongleveliipot,373,16425 +splstrleveliipot,373,16425 +splstrengthlevel2pot,373,16425 +splstronglevel2pot,373,16425 +splstrlevel2pot,373,16425 +splstrengthiipot,373,16425 +splstrongiipot,373,16425 +splstriipot,373,16425 +spst2pot,373,16425 +splashrefinedpotion,373,16427 +splashrefinedpot,373,16427 +splrefinedpotion,373,16427 +splrefinedpot,373,16427 +splashharmingleveliipotion,373,16428 +splashdamageleveliipotion,373,16428 +splashdmgleveliipotion,373,16428 +splashharminglevel2potion,373,16428 +splashdamagelevel2potion,373,16428 +splashdmglevel2potion,373,16428 +splashharmingiipotion,373,16428 +splashdamageiipotion,373,16428 +splashdmgiipotion,373,16428 +splashharmingleveliipot,373,16428 +splashdamageleveliipot,373,16428 +splashdmgleveliipot,373,16428 +splashharminglevel2pot,373,16428 +splashdamagelevel2pot,373,16428 +splashdmglevel2pot,373,16428 +splashharmingiipot,373,16428 +splashdamageiipot,373,16428 +splashdmgiipot,373,16428 +splharmingleveliipotion,373,16428 +spldamageleveliipotion,373,16428 +spldmgleveliipotion,373,16428 +splharminglevel2potion,373,16428 +spldamagelevel2potion,373,16428 +spldmglevel2potion,373,16428 +splharmingiipotion,373,16428 +spldamageiipotion,373,16428 +spldmgiipotion,373,16428 +splharmingleveliipot,373,16428 +spldamageleveliipot,373,16428 +spldmgleveliipot,373,16428 +splharminglevel2pot,373,16428 +spldamagelevel2pot,373,16428 +spldmglevel2pot,373,16428 +splharmingiipot,373,16428 +spldamageiipot,373,16428 +spldmgiipot,373,16428 +spd2pot,373,16428 +splashcordialpotion,373,16429 +splashcordialpot,373,16429 +splcordialpotion,373,16429 +splcordialpot,373,16429 +splashsparklingpotion,373,16430 +splashsparklingpot,373,16430 +splsparklingpotion,373,16430 +splsparklingpot,373,16430 +splashsparklingextendedpotion,373,16431 +splashsparklingexpotion,373,16431 +splashsparkling2potion,373,16431 +splashsparklingextendedpot,373,16431 +splashsparklingexpot,373,16431 +splashsparkling2pot,373,16431 +splsparklingextendedpotion,373,16431 +splsparklingexpotion,373,16431 +splsparkling2potion,373,16431 +splsparklingextendedpot,373,16431 +splsparklingexpot,373,16431 +splsparkling2pot,373,16431 +splashpotentpotion,373,16432 +splashpotentpot,373,16432 +splpotentpotion,373,16432 +splpotentpot,373,16432 +splashrankpotion,373,16438 +splashrankpot,373,16438 +splrankpotion,373,16438 +splrankpot,373,16438 +splashrankextendedpotion,373,16439 +splashrankexpotion,373,16439 +splashrank2potion,373,16439 +splashrankextendedpot,373,16439 +splashrankexpot,373,16439 +splashrank2pot,373,16439 +splrankextendedpotion,373,16439 +splrankexpotion,373,16439 +splrank2potion,373,16439 +splrankextendedpot,373,16439 +splrankexpot,373,16439 +splrank2pot,373,16439 +splashacridpotion,373,16443 +splashacridpot,373,16443 +splacridpotion,373,16443 +splacridpot,373,16443 +splashgrosspotion,373,16445 +splashgrosspot,373,16445 +splgrosspotion,373,16445 +splgrosspot,373,16445 +splashstinkypotion,373,16446 +splashstinkypot,373,16446 +splstinkypotion,373,16446 +splstinkypot,373,16446 +splashstinkyextendedpotion,373,16447 +splashstinkyexpotion,373,16447 +splashstinky2potion,373,16447 +splashstinkyextendedpot,373,16447 +splashstinkyexpot,373,16447 +splashstinky2pot,373,16447 +splstinkyextendedpotion,373,16447 +splstinkyexpotion,373,16447 +splstinky2potion,373,16447 +splstinkyextendedpot,373,16447 +splstinkyexpot,373,16447 +splstinky2pot,373,16447 +splashmundaneextendedpotion,373,16448 +splashmundaneexpotion,373,16448 +splashmundane2potion,373,16448 +splashmundaneextendedpot,373,16448 +splashmundaneexpot,373,16448 +splashmundane2pot,373,16448 +splmundaneextendedpotion,373,16448 +splmundaneexpotion,373,16448 +splmundane2potion,373,16448 +splmundaneextendedpot,373,16448 +splmundaneexpot,373,16448 +splmundane2pot,373,16448 +splashregenerationextendedpotion,373,16449 +splashregenerateextendedpotion,373,16449 +splashregenextendepotion,373,16449 +splashregenerationexpotion,373,16449 +splashregenerateexpotion,373,16449 +splashregenexpotion,373,16449 +splashregenerationextendedpot,373,16449 +splashregenerateextendedpot,373,16449 +splashregenextendepot,373,16449 +splashregenerationexpot,373,16449 +splashregenerateexpot,373,16449 +splashregenexpot,373,16449 +splregenerationextendedpotion,373,16449 +splregenerateextendedpotion,373,16449 +splregenextendepotion,373,16449 +splregenerationexpotion,373,16449 +splregenerateexpotion,373,16449 +splregenexpotion,373,16449 +splregenerationextendedpot,373,16449 +splregenerateextendedpot,373,16449 +splregenextendepot,373,16449 +splregenerationexpot,373,16449 +splregenerateexpot,373,16449 +splregenexpot,373,16449 +sprepot,373,16449 +splashswiftnessextendedpotion,373,16450 +splashswiftextendedpotion,373,16450 +splashspeedextendedpotion,373,16450 +splashswiftnessexpotion,373,16450 +splashswiftexpotion,373,16450 +splashspeedexpotion,373,16450 +splashswiftnessextendedpot,373,16450 +splashswiftextendedpot,373,16450 +splashspeedextendedpot,373,16450 +splashswiftnessexpot,373,16450 +splashswiftexpot,373,16450 +splashspeedexpot,373,16450 +splswiftnessextendedpotion,373,16450 +splswiftextendedpotion,373,16450 +splspeedextendedpotion,373,16450 +splswiftnessexpotion,373,16450 +splswiftexpotion,373,16450 +splspeedexpotion,373,16450 +splswiftnessextendedpot,373,16450 +splswiftextendedpot,373,16450 +splspeedextendedpot,373,16450 +splswiftnessexpot,373,16450 +splswiftexpot,373,16450 +splspeedexpot,373,16450 +spswepot,373,16450 +splashfireresistanceextendedpotion,373,16451 +splashfireresistextendedpotion,373,16451 +splashfireresextendedpotion,373,16451 +splashfireresistanceexpotion,373,16451 +splashfireresistexpotion,373,16451 +splashfireresexpotion,373,16451 +splashfireresistanceextendedpot,373,16451 +splashfireresistextendedpot,373,16451 +splashfireresextendedpot,373,16451 +splashfireresistanceexpot,373,16451 +splashfireresistexpot,373,16451 +splashfireresexpot,373,16451 +splfireresistanceextendedpotion,373,16451 +splfireresistextendedpotion,373,16451 +splfireresextendedpotion,373,16451 +splfireresistanceexpotion,373,16451 +splfireresistexpotion,373,16451 +splfireresexpotion,373,16451 +splfireresistanceextendedpot,373,16451 +splfireresistextendedpot,373,16451 +splfireresextendedpot,373,16451 +splfireresistanceexpot,373,16451 +splfireresistexpot,373,16451 +splfireresexpot,373,16451 +spfepot,373,16451 +splashpoisonextendedpotion,373,16452 +splashacidextendedpotion,373,16452 +splashpoisonexpotion,373,16452 +splashacidexpotion,373,16452 +splashpoisonextendedpot,373,16452 +splashacidextendedpot,373,16452 +splashpoisonexpot,373,16452 +splashacidexpot,373,16452 +splpoisonextendedpotion,373,16452 +splacidextendedpotion,373,16452 +splpoisonexpotion,373,16452 +splacidexpotion,373,16452 +splpoisonextendedpot,373,16452 +splacidextendedpot,373,16452 +splpoisonexpot,373,16452 +splacidexpot,373,16452 +sppepot,373,16452 +splashnightvisionextendedpotion,373,16454 +splashnvisionextendedpotion,373,16454 +splashnightvextendedpotion,373,16454 +splashdarkvisionextendedpotion,373,16454 +splashdvisionextendedpotion,373,16454 +splashdarkvextendedpotion,373,16454 +splashnightvisionextendedpot,373,16454 +splashnvisionextendedpot,373,16454 +splashnightvextendedpot,373,16454 +splashdarkvisionextendedpot,373,16454 +splashdvisionextendedpot,373,16454 +splashdarkvextendedpot,373,16454 +splashnightvisionexpotion,373,16454 +splashnvisionexpotion,373,16454 +splashnightvexpotion,373,16454 +splashdarkvisionexpotion,373,16454 +splashdvisionexpotion,373,16454 +splashdarkvexpotion,373,16454 +splashnightvisionexpot,373,16454 +splashnvisionexpot,373,16454 +splashnightvexpot,373,16454 +splashdarkvisionexpot,373,16454 +splashdvisionexpot,373,16454 +splashdarkvexpot,373,16454 +splnightvisionextendedpotion,373,16454 +splnvisionextendedpotion,373,16454 +splnightvextendedpotion,373,16454 +spldarkvisionextendedpotion,373,16454 +spldvisionextendedpotion,373,16454 +spldarkvextendedpotion,373,16454 +splnightvisionextendedpot,373,16454 +splnvisionextendedpot,373,16454 +splnightvextendedpot,373,16454 +spldarkvisionextendedpot,373,16454 +spldvisionextendedpot,373,16454 +spldarkvextendedpot,373,16454 +splnightvisionexpotion,373,16454 +splnvisionexpotion,373,16454 +splnightvexpotion,373,16454 +spldarkvisionexpotion,373,16454 +spldvisionexpotion,373,16454 +spldarkvexpotion,373,16454 +splnightvisionexpot,373,16454 +splnvisionexpot,373,16454 +splnightvexpot,373,16454 +spldarkvisionexpot,373,16454 +spldvisionexpot,373,16454 +spldarkvexpot,373,16454 +spnepot,373,16454 +splashweaknessextendedpotion,373,16456 +splashweakextendedpotion,373,16456 +splashweaknessexpotion,373,16456 +splashweakexpotion,373,16456 +splashweaknessextendedpot,373,16456 +splashweakextendedpot,373,16456 +splashweaknessexpot,373,16456 +splashweakexpot,373,16456 +splweaknessextendedpotion,373,16456 +sphweakextendedpotion,373,16456 +splweaknessexpotion,373,16456 +splweakexpotion,373,16456 +splweaknessextendedpot,373,16456 +splweakextendedpot,373,16456 +splweaknessexpot,373,16456 +splweakexpot,373,16456 +spwepot,373,16456 +splashstrengthextendedpotion,373,16457 +splashstrongextendedpotion,373,16457 +splashstrextendedpotion,373,16457 +splashstrengthexpotion,373,16457 +splashstrongexpotion,373,16457 +splashstrexpotion,373,16457 +splashstrengthextendedpot,373,16457 +splashstrongextendedpot,373,16457 +splashstrextendedpot,373,16457 +splashstrengthexpot,373,16457 +splashstrongexpot,373,16457 +splashstrexpot,373,16457 +splstrengthextendedpotion,373,16457 +splstrongextendedpotion,373,16457 +splstrextendedpotion,373,16457 +splstrengthexpotion,373,16457 +splstrongexpotion,373,16457 +splstrexpotion,373,16457 +splstrengthextendedpot,373,16457 +splstrongextendedpot,373,16457 +splstrextendedpot,373,16457 +splstrengthexpot,373,16457 +splstrongexpot,373,16457 +splstrexpot,373,16457 +spstepot,373,16457 +splashslownessextendedpotion,373,16458 +splashslowextenedpotion,373,16458 +splashslownessexpotion,373,16458 +splashslowexpotion,373,16458 +splashslownessextendedpot,373,16458 +splashslowextenedpot,373,16458 +splashslownessexpot,373,16458 +splashslowexpot,373,16458 +splslownessextendedpotion,373,16458 +splslowextenedpotion,373,16458 +splslownessexpotion,373,16458 +splslowexpotion,373,16458 +splslownessextendedpot,373,16458 +splslowextenedpot,373,16458 +splslownessexpot,373,16458 +splslowexpot,373,16458 +spslepot,373,16458 +splashinvisibilityextendedpotion,373,16462 +splashinvisibleextendedpotion,373,16462 +splashinvextendedpotion,373,16462 +splashinvisibilityextendedpot,373,16462 +splashinvisibleextendedpot,373,16462 +splashinvextendedpot,373,16462 +splashinvisibilityexpotion,373,16462 +splashinvisibleexpotion,373,16462 +splashinvexpotion,373,16462 +splashinvisibilityexpot,373,16462 +splashinvisibleexpot,373,16462 +splashinvexpot,373,16462 +splinvisibilityextendedpotion,373,16462 +splinvisibleextendedpotion,373,16462 +splinvextendedpotion,373,16462 +splinvisibilityextendedpot,373,16462 +splinvisibleextendedpot,373,16462 +splinvextendedpot,373,16462 +splinvisibilityexpotion,373,16462 +splinvisibleexpotion,373,16462 +splinvexpotion,373,16462 +splinvisibilityexpot,373,16462 +splinvisibleexpot,373,16462 +splinvexpot,373,16462 +spiepot,373,16462 +splashregenerationdualbitpotion,373,16481 +splashregeneratedualbitpotion,373,16481 +splashregendualbitpotion,373,16481 +splashregenerationdualbitpot,373,16481 +splashregeneratedualbitpot,373,16481 +splashregendualbitpot,373,16481 +splregenerationdualbitpotion,373,16481 +splregeneratedualbitpotion,373,16481 +splregendualbitpotion,373,16481 +splregenerationdualbitpot,373,16481 +splregeneratedualbitpot,373,16481 +splregendualbitpot,373,16481 +splashregenerationdbpotion,373,16481 +splashregeneratedbpotion,373,16481 +splashregendbpotion,373,16481 +splashregenerationdbpot,373,16481 +splashregeneratedbpot,373,16481 +splashregendbpot,373,16481 +splregenerationdbpotion,373,16481 +splregeneratedbpotion,373,16481 +splregendbpotion,373,16481 +splregenerationdbpot,373,16481 +splregeneratedbpot,373,16481 +splregendbpot,373,16481 +sprdbpot,373,16481 +splashswiftnessdualbitpotion,373,16482 +splashswiftdualbitpotion,373,16482 +splashspeeddualbitpotion,373,16482 +splashswiftnessdualbitpot,373,16482 +splashswiftdualbitpot,373,16482 +splashspeeddualbitpot,373,16482 +splswiftnessdualbitpotion,373,16482 +splswiftdualbitpotion,373,16482 +splspeeddualbitpotion,373,16482 +splswiftnessdualbitpot,373,16482 +splswiftdualbitpot,373,16482 +splspeeddualbitpot,373,16482 +splashswiftnessdbpotion,373,16482 +splashswiftdbpotion,373,16482 +splashspeeddbpotion,373,16482 +splashswiftnessdbpot,373,16482 +splashswiftdbpot,373,16482 +splashspeeddbpot,373,16482 +splswiftnessdbpotion,373,16482 +splswiftdbpotion,373,16482 +splspeeddbpotion,373,16482 +splswiftnessdbpot,373,16482 +splswiftdbpot,373,16482 +splspeeddbpot,373,16482 +spswdbpot,373,16482 +splashpoisondualbitpotion,373,16484 +splashaciddualbitpotion,373,16484 +splashpoisondualbitpot,373,16484 +splashaciddualbitpot,373,16484 +splpoisondualbitpotion,373,16484 +splaciddualbitpotion,373,16484 +splpoisondualbitpot,373,16484 +splaciddualbitpot,373,16484 +splashpoisondbpotion,373,16484 +splashaciddbpotion,373,16484 +splashpoisondbpot,373,16484 +splashaciddbpot,373,16484 +splpoisondbpotion,373,16484 +splaciddbpotion,373,16484 +splpoisondbpot,373,16484 +splaciddbpot,373,16484 +sppdbpot,373,16484 +splashstrengthdualbitpotion,373,16489 +splashstrongdualbitpotion,373,16489 +splashstrdualbitpotion,373,16489 +splashstrengthdualbitpot,373,16489 +splashstrongdualbitpot,373,16489 +splashstrdualbitpot,373,16489 +splstrengthdualbitpotion,373,16489 +splstrongdualbitpotion,373,16489 +splstrdualbitpotion,373,16489 +splstrengthdualbitpot,373,16489 +splstrongdualbitpot,373,16489 +splstrdualbitpot,373,16489 +splashstrengthdbpotion,373,16489 +splashstrongdbpotion,373,16489 +splashstrdbpotion,373,16489 +splashstrengthdbpot,373,16489 +splashstrongdbpot,373,16489 +splashstrdbpot,373,16489 +splstrengthdbpotion,373,16489 +splstrongdbpotion,373,16489 +splstrdbpotion,373,16489 +splstrengthdbpot,373,16489 +splstrongdbpot,373,16489 +splstrdbpot,373,16489 +spstdbpot,373,16489 glassbottle,374,0 bottle,374,0 gbottle,374,0 @@ -3075,6 +6182,7 @@ icauldronitem,380,0 scauldronitem,380,0 eyeofender,381,0 endereye,381,0 +endeye,381,0 evilendereye,381,0 evileyeofender,381,0 evilenderpearl,381,0 @@ -3140,6 +6248,10 @@ egglavaslime,383,62 egglavacube,383,62 eggmagmacube,383,62 eggmagmaslime,383,62 +bategg,383,65 +eggbat,383,65 +witchegg,383,66 +eggwitch,383,66 pigegg,383,90 eggpig,383,90 sheepegg,383,91 @@ -3172,9 +6284,180 @@ bottleofenchanting,384,0 enchantingbottle,384,0 expbottle,384,0 xpbottle,384,0 +bottleexp,384,0 +bottlexp,384,0 +enchantbottle,384,0 +bottleenchanting,384,0 +bottleenchant,384,0 +bottleoenchanting,384,0 firecharge,385,0 fireball,385,0 grenade,385,0 +bookandquill,386,0 +booknquill,386,0 +bookandfeather,386,0 +booknfeather,386,0 +writeablebook,386,0 +writtenbook,387,0 +readablebook,387,0 +sealedbook,387,0 +diary,387,0 +ownedbook,387,0 +emerald,388,0 +itemframe,389,0 +pictureframe,389,0 +iframe,389,0 +pframe,389,0 +flowerpot,390,0 +pot,390,0 +carrot,391,0 +potato,392,0 +bakedpotato,393,0 +roastedpotato,393,0 +cookedpotato,393,0 +bakepotato,393,0 +roastpotato,393,0 +cookpotato,393,0 +poisonouspotato,394,0 +poisonpotato,394,0 +ppotato,394,0 +emptymap,395,0 +map,395,0 +goldencarrot,396,0 +goldcarrot,396,0 +gcarrot,396,0 +head,397,0 +skeletonhead,397,0 +headskeleton,397,0 +skeletonskull,397,0 +skullskeleton,397,0 +witherhead,397,1 +witherskeletonhead,397,1 +wskeletionhead,397,1 +headwither,397,1 +headwitherskeleton,397,1 +headwskeletion,397,1 +witherskull,397,1 +witherskeletonskull,397,1 +wskeletionskull,397,1 +skullwither,397,1 +skullwitherskeleton,397,1 +skullwskeletion,397,1 +zombiehead,397,2 +headzombie,397,2 +zombieskull,397,2 +skullzombie,397,2 +playerhead,397,3 +humanhead,397,3 +stevehead,397,3 +headplayer,397,3 +headhuman,397,3 +headsteve,397,3 +playerskull,397,3 +humanskull,397,3 +steveskull,397,3 +skullplayer,397,3 +skullhuman,397,3 +skullsteve,397,3 +creeperhead,397,4 +headcreeper,397,4 +creeperskull,397,4 +skullcreeper,397,4 +carrotonastick,398,0 +carrotonstick,398,0 +netherstar,399,0 +hellstar,399,0 +nstar,399,0 +hstar,399,0 +star,399,0 +pumpkinpie,400,0 +pumpkincake,400,0 +ppie,400,0 +pcake,400,0 +pie,400,0 +fireworkrocket,401,0 +fireworkmissle,401,0 +firework,401,0 +fworkrocket,401,0 +fworkmissle,401,0 +fwork,401,0 +fwrocket,401,0 +fwmissle,401,0 +fireworkstar,402,0 +fworkstar,402,0 +fwstar,402,0 +fireworkball,402,0 +fworkball,402,0 +fwball,402,0 +fireworkpowder,402,0 +fworkpowder,402,0 +fwpowder,402,0 +fireworkcharge,402,0 +fworkcharge,402,0 +fwcharge,402,0 +enchantmentbook,403,0 +enchantedbook,403,0 +enchantingbook,403,0 +enchantbook,403,0 +magicalbook,403,0 +magicbook,403,0 +ebook,403,0 +mbook,403,0 +redstonecomparator,404,0 +redstonecomperer,404,0 +redstonecompare,404,0 +rstonecomparator,404,0 +rstonecomperer,404,0 +rstonecompare,404,0 +redscomparator,404,0 +redscomperer,404,0 +redscompare,404,0 +rscomparator,404,0 +rscomperer,404,0 +rscompare,404,0 +comparator,404,0 +comperer,404,0 +compare,404,0 +netherbrick,405,0 +nbrick,405,0 +hellbrick,405,0 +deathbrick,405,0 +dbrick,405,0 +hbrick,405,0 +netherquartz,406,0 +deathquartz,406,0 +hellquartz,406,0 +nquartz,406,0 +dquartz,406,0 +hquartz,406,0 +quartz,406,0 +dynamiteminecart,407,0 +dynamitemcart,407,0 +dynamitecart,407,0 +bombminecart,407,0 +bombmcart,407,0 +bombcart,407,0 +tntminecart,407,0 +tntmcart,407,0 +tntcart,407,0 +dminecart,407,0 +dmcart,407,0 +dcart,407,0 +bminecart,407,0 +bmcart,407,0 +bcart,407,0 +tminecart,407,0 +tmcart,407,0 +tcart,407,0 +hopperminecart,408,0 +hoppermcart,408,0 +hoppercart,408,0 +hopminecart,408,0 +hopmcart,408,0 +hopcart,408,0 +hminecart,408,0 +hmcart,408,0 +hcart,408,0 goldmusicrecord,2256,0 goldmusicdisk,2256,0 goldmusicdisc,2256,0 @@ -3311,10 +6594,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 @@ -3323,10 +6606,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 @@ -3335,10 +6618,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 @@ -3418,7 +6701,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 @@ -3662,7 +6945,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 @@ -3714,4 +6997,4 @@ cd11,2266,0 11record,2266,0 11disk,2266,0 11disc,2266,0 -11cd,2266,0 \ No newline at end of file +11cd,2266,0 diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties index 6f0d479900..3956494263 100644 --- a/Essentials/src/messages.properties +++ b/Essentials/src/messages.properties @@ -2,443 +2,539 @@ # Single quotes have to be doubled: '' # Translations start here # by: -action=* {0} {1} +action=\u00a75* {0} \u00a75{1} addedToAccount=\u00a7a{0} has been added to your account. addedToOthersAccount=\u00a7a{0} added to {1}\u00a7a account. New balance: {2} +adventure= adventure alertBroke=broke: -alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} at: {3} +alertFormat=\u00a73[{0}] \u00a7r {1} \u00a76 {2} at: {3} alertPlaced=placed: alertUsed=used: +antiBuildBreak=\u00a74You are not permitted to break\u00a7c {0} \u00a74blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with\u00a7c {0}\u00a74. +antiBuildPlace=\u00a74You are not permitted to place\u00a7c {0} \u00a74here. +antiBuildUse=\u00a74You are not permitted to use\u00a7c {0}\u00a74. autoAfkKickReason=You have been kicked for idling more than {0} minutes. -backAfterDeath=\u00a77Use the /back command to return to your death point. -backUsageMsg=\u00a77Returning to previous location. -backupDisabled=An external backup script has not been configured. -backupFinished=Backup finished -backupStarted=Backup started -balance=\u00a77Balance: {0} -balanceTop=\u00a77Top balances ({0}) -banExempt=\u00a7cYou can not ban that player. -banIpAddress=\u00a77Banned IP address -bannedIpsFileError=Error reading banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt not found -bannedPlayersFileError=Error reading banned-players.txt -bannedPlayersFileNotFound=banned-players.txt not found -bigTreeFailure=\u00a7cBig tree generation failure. Try again on grass or dirt. -bigTreeSuccess= \u00a77Big tree spawned. -blockList=Essentials relayed the following commands to another plugin: -broadcast=[\u00a7cBroadcast\u00a7f]\u00a7a {0} -buildAlert=\u00a7cYou are not permitted to build +backAfterDeath=\u00a76Use the /back command to return to your death point. +backUsageMsg=\u00a76Returning to previous location. +backupDisabled=\u00a74An external backup script has not been configured. +backupFinished=\u00a76Backup finished. +backupStarted=\u00a76Backup started. +balance=\u00a7aBalance:\u00a7c {0} +balanceTop=\u00a76Top balances ({0}) +banExempt=\u00a74You can not ban that player. +banFormat=\u00a74Banned:\n\u00a7r{0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! +bigTreeFailure=\u00a74Big tree generation failure. Try again on grass or dirt. +bigTreeSuccess= \u00a76Big tree spawned. +blockList=\u00a76Essentials relayed the following commands to another plugin: +bookAuthorSet=\u00a76Author of the book set to {0}. +bookLocked=\u00a76This book is now locked. +bookTitleSet=\u00a76Title of the book set to {0}. +broadcast=\u00a7r\u00a76[\u00a74Broadcast\u00a76]\u00a7a {0} +buildAlert=\u00a74You are not permitted to build. bukkitFormatChanged=Bukkit version format changed. Version not checked. -burnMsg=\u00a77You set {0} on fire for {1} seconds. -canTalkAgain=\u00a77You can talk again +burnMsg=\u00a76You set\u00a7c {0} \u00a76on fire for\u00a7c {1} seconds\u00a76. +canTalkAgain=\u00a76You can now talk again. cantFindGeoIpDB=Can't find GeoIP database! cantReadGeoIpDB=Failed to read GeoIP database! -cantSpawnItem=\u00a7cYou are not allowed to spawn the item {0} -chatTypeLocal=[L] +cantSpawnItem=\u00a74You are not allowed to spawn the item\u00a7c {0}\u00a74. chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. commandFailed=Command {0} failed: -commandHelpFailedForPlugin=Error getting help for: {0} -commandNotLoaded=\u00a7cCommand {0} is improperly loaded. -compassBearing=\u00a77Bearing: {0} ({1} degrees). +commandHelpFailedForPlugin=Error getting help for plugin: {0} +commandNotLoaded=\u00a74Command {0} is improperly loaded. +compassBearing=\u00a76Bearing: {0} ({1} degrees). configFileMoveError=Failed to move config.yml to backup location. -configFileRenameError=Failed to rename temp file to config.yml -connectedPlayers=Connected players: +configFileRenameError=Failed to rename temp file to config.yml. +connectedPlayers=\u00a76Connected players\u00a7r connectionFailed=Failed to open connection. -cooldownWithMessage=\u00a7cCooldown: {0} +cooldownWithMessage=\u00a74Cooldown: {0} corruptNodeInConfig=\u00a74Notice: Your configuration file has a corrupt {0} node. -couldNotFindTemplate=Could not find template {0} +couldNotFindTemplate=\u00a74Could not find template {0} creatingConfigFromTemplate=Creating config from template: {0} creatingEmptyConfig=Creating empty config: {0} creative=creative currency={0}{1} -currentWorld=Current World: {0} +currentWorld=\u00a76Current World:\u00a7c {0} day=day days=days defaultBanReason=The Ban Hammer has spoken! deleteFileError=Could not delete file: {0} -deleteHome=\u00a77Home {0} has been removed. -deleteJail=\u00a77Jail {0} has been removed. -deleteWarp=\u00a77Warp {0} has been removed. -deniedAccessCommand={0} was denied access to command. -dependancyDownloaded=[Essentials] Dependancy {0} downloaded successfully. -dependancyException=[Essentials] An error occurred when trying to download a dependacy -dependancyNotFound=[Essentials] A required dependancy was not found, downloading now. -depth=\u00a77You are at sea level. -depthAboveSea=\u00a77You are {0} block(s) above sea level. -depthBelowSea=\u00a77You are {0} block(s) below sea level. -destinationNotSet=Destination not set -disableUnlimited=\u00a77Disabled unlimited placing of {0} for {1}. +deleteHome=\u00a76Home\u00a7c {0} \u00a76has been removed. +deleteJail=\u00a76Jail\u00a7c {0} \u00a76has been removed. +deleteWarp=\u00a76Warp\u00a7c {0} \u00a76has been removed. +deniedAccessCommand=\u00a7c{0} \u00a74was denied access to command. +denyBookEdit=\u00a74You cannot unlock this book. +denyChangeAuthor=\u00a74You cannot change the author of this book. +denyChangeTitle=\u00a74You cannot change the title of this book. +dependancyDownloaded=[Essentials] Dependency {0} downloaded successfully. +dependancyException=[Essentials] An error occurred when trying to download a dependency. +dependancyNotFound=[Essentials] A required dependency was not found, downloading now. +depth=\u00a76You are at sea level. +depthAboveSea=\u00a76You are\u00a7c {0} \u00a76block(s) above sea level. +depthBelowSea=\u00a76You are\u00a7c {0} \u00a76block(s) below sea level. +destinationNotSet=Destination not set! +disableUnlimited=\u00a76Disabled unlimited placing of\u00a7c {0} \u00a76for {1}. disabled=disabled -disabledToSpawnMob=Spawning this mob was disabled in the config file. -dontMoveMessage=\u00a77Teleportation will commence in {0}. Don''t move. -downloadingGeoIp=Downloading GeoIP database ... this might take a while (country: 0.6 MB, city: 20MB) -duplicatedUserdata=Duplicated userdata: {0} and {1} -durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left -enableUnlimited=\u00a77Giving unlimited amount of {0} to {1}. +disabledToSpawnMob=\u00a74Spawning this mob was disabled in the config file. +distance=\u00a76Distance: {0} +dontMoveMessage=\u00a76Teleportation will commence in\u00a7c {0}\u00a76. Don''t move. +downloadingGeoIp=Downloading GeoIP database... this might take a while (country: 0.6 MB, city: 20MB) +duplicatedUserdata=Duplicated userdata: {0} and {1}. +durability=\u00a76This tool has \u00a7c{0}\u00a76 uses left +editBookContents=\u00a7eYou may now edit the contents of this book. +enableUnlimited=\u00a76Giving unlimited amount of\u00a7c {0} \u00a76to {1}. enabled=enabled -enchantmentApplied = \u00a77The enchantment {0} has been applied to your item in hand. -enchantmentNotFound = \u00a7cEnchantment not found -enchantmentPerm = \u00a7cYou do not have the permission for {0} -enchantmentRemoved = \u00a77The enchantment {0} has been removed from your item in hand. -enchantments = \u00a77Enchantments: {0} +enchantmentApplied= \u00a76The enchantment\u00a7c {0} \u00a76has been applied to your item in hand. +enchantmentNotFound= \u00a74Enchantment not found! +enchantmentPerm= \u00a74You do not have the permission for\u00a7c {0}\u00a74. +enchantmentRemoved= \u00a76The enchantment\u00a7c {0} \u00a76has been removed from your item in hand. +enchantments= \u00a76Enchantments:\u00a7r {0} errorCallingCommand=Error calling command /{0} -errorWithMessage=\u00a7cError: {0} +errorWithMessage=\u00a7cError:\u00a74 {0} essentialsHelp1=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, go to http://tiny.cc/EssentialsChat essentialsHelp2=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, either type /essentialshelp in game or go to http://tiny.cc/EssentialsChat -essentialsReload=\u00a77Essentials Reloaded {0} -exp=\u00a7c{0} \u00a77has\u00a7c {1} \u00a77exp (level\u00a7c {2}\u00a77) and needs\u00a7c {3} \u00a77more exp to level up. -expSet=\u00a7c{0} \u00a77now has\u00a7c {1} \u00a77exp. -extinguish=\u00a77You extinguished yourself. -extinguishOthers=\u00a77You extinguished {0}. -failedToCloseConfig=Failed to close config {0} -failedToCreateConfig=Failed to create config {0} -failedToWriteConfig=Failed to write config {0} -false=\u00a74false\u00a7f -feed=\u00a77Your appetite was sated. -feedOther=\u00a77Satisfied {0}. -fileRenameError=Renaming file {0} failed -flyMode=\u00a77Set fly mode {0} for {1}. +essentialsReload=\u00a76Essentials Reloaded\u00a7c {0} +exp=\u00a7c{0} \u00a76has\u00a7c {1} \u00a76exp (level\u00a7c {2}\u00a76) and needs\u00a7c {3} \u00a76more exp to level up. +expSet=\u00a7c{0} \u00a76now has\u00a7c {1} \u00a76exp. +extinguish=\u00a76You extinguished yourself. +extinguishOthers=\u00a76You extinguished {0}\u00a76. +failedToCloseConfig=Failed to close config {0}. +failedToCreateConfig=Failed to create config {0}. +failedToWriteConfig=Failed to write config {0}. +false=\u00a74false\u00a7r +feed=\u00a76Your appetite was sated. +feedOther=\u00a76Satisfied {0}\u00a76. +fileRenameError=Renaming file {0} failed! +fireworkColor=\u00a74Invalid firework charge parameters inserted, must set a color first. +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle. +flyMode=\u00a76Set fly mode\u00a7c {0} \u00a76for {1}\u00a76. flying=flying -foreverAlone=\u00a7cYou have nobody to whom you can reply. +foreverAlone=\u00a74You have nobody to whom you can reply. freedMemory=Freed {0} MB. -gameMode=\u00a77Set game mode {0} for {1}. -gcchunks= chunks, -gcentities= entities -gcfree=Free memory: {0} MB -gcmax=Maximum memory: {0} MB -gctotal=Allocated memory: {0} MB +fullStack=\u00a74You already have a full stack. +gameMode=\u00a76Set game mode\u00a7c {0} \u00a76for {1}\u00a76. +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities. +gcfree=\u00a76Free memory:\u00a7c {0} MB. +gcmax=\u00a76Maximum memory:\u00a7c {0} MB. +gctotal=\u00a76Allocated memory:\u00a7c {0} MB. geoIpUrlEmpty=GeoIP download url is empty. geoIpUrlInvalid=GeoIP download url is invalid. -geoipJoinFormat=Player {0} comes from {1} -godDisabledFor=disabled for {0} -godEnabledFor=enabled for {0} -godMode=\u00a77God mode {0}. -hatArmor=\u00a7cError, you cannot use this item as a hat! -hatEmpty=\u00a7cYou are not wearing a hat. -hatFail=\u00a7cYou must have something to wear in your hand. -hatPlaced=\u00a7eEnjoy your new hat! -haveBeenReleased=\u00a77You have been released -heal=\u00a77You have been healed. -healOther=\u00a77Healed {0}. +geoipJoinFormat=\u00a76Player \u00a7c{0} \u00a76comes from \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. +godDisabledFor=\u00a74disabled\u00a76 for\u00a7c {0}. +godEnabledFor=\u00a7aenabled\u00a76 for\u00a7c {0}. +godMode=\u00a76God mode\u00a7c {0}\u00a76. +groupNumber=\u00a7c{0}\u00a7f online, for the full list:\u00a7c /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! +hatArmor=\u00a74You cannot use this item as a hat! +hatEmpty=\u00a74You are not wearing a hat. +hatFail=\u00a74You must have something to wear in your hand. +hatPlaced=\u00a76Enjoy your new hat! +hatRemoved=\u00a76Your hat has been removed. +haveBeenReleased=\u00a76You have been released. +heal=\u00a76You have been healed. +healDead=\u00a74You cannot heal someone who is dead! +healOther=\u00a76Healed\u00a7c {0}\u00a76. helpConsole=To view help from the console, type ?. -helpFrom=\u00a77Commands from {0}: -helpLine=\u00a76/{0}\u00a7f: {1} -helpMatching=\u00a77Commands matching "{0}": -helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} -helpPages=Page \u00a7c{0}\u00a7f of \u00a7c{1}\u00a7f: -helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} -holeInFloor=Hole in floor -homeSet=\u00a77Home set. -homeSetToBed=\u00a77Your home is now set to this bed. -homes=Homes: {0} +helpFrom=\u00a76Commands from {0}: +helpLine=\u00a76/{0}\u00a7r: {1} +helpMatching=\u00a76Commands matching "\u00a7c{0}\u00a76": +helpOp=\u00a74[HelpOp]\u00a7r \u00a76{0}:\u00a7r {1} +helpPages=\u00a76Page \u00a7c{0}\u00a76 of \u00a7c{1}\u00a76: +helpPlugin=\u00a74{0}\u00a7r: Plugin Help: /help {1} +holdBook=\u00a74You are not holding a writable book. +holdFirework=\u00a74You must be holding a firework to add effects. +holdPotion=\u00a74You must be holding a potion to apply effects to it. +holeInFloor=\u00a74Hole in floor! +homeSet=\u00a76Home set. +homeSetToBed=\u00a76Your home is now set to this bed. +homes=\u00a76Homes:\u00a7r {0} hour=hour hours=hours -ignorePlayer=You ignore player {0} from now on. +ignorePlayer=\u00a76You ignore player\u00a7c {0} \u00a76from now on. illegalDate=Illegal date format. infoChapter=Select chapter: -infoChapterPages=Chapter {0}, page \u00a7c{1}\u00a7f of \u00a7c{2}\u00a7f: +infoChapterPages=\u00a76Chapter {0}, page \u00a7c{1}\u00a76 of \u00a7c{2}\u00a76: infoFileDoesNotExist=File info.txt does not exist. Creating one for you. -infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Page \u00a74{0}\u00a76/\u00a74{1} \u00a7e---- +infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Page \u00a7c{0}\u00a76/\u00a7c{1} \u00a7e---- infoUnknownChapter=Unknown chapter. -invBigger=The other users inventory is bigger than yours. -invRestored=Your inventory has been restored. -invSee=You see the inventory of {0}. -invSeeHelp=Use /invsee to restore your inventory. -invalidCharge=\u00a7cInvalid charge. -invalidHome=Home {0} doesn''t exist +invBigger=\u00a74The other users inventory is bigger than yours. +invRestored=\u00a76Your inventory has been restored. +invSee=\u00a76You see the inventory of\u00a7c {0}\u00a76. +invSeeHelp=\u00a76Use /invsee to restore your inventory. +invalidCharge=\u00a74Invalid charge. +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1}\u00a76. +invalidHome=\u00a74Home\u00a7c {0} \u00a74doesn''t exist! +invalidHomeName=\u00a74Invalid home name! invalidMob=Invalid mob type. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Invalid server! -invalidSignLine=Line {0} on sign is invalid. -invalidWorld=\u00a7cInvalid world. -inventoryCleared=\u00a77Inventory Cleared. -inventoryClearedOthers=\u00a77Inventory of \u00a7c{0}\u00a77 cleared. +invalidSignLine=\u00a74Line\u00a7c {0} \u00a74on sign is invalid. +invalidWarpName=\u00a74Invalid warp name! +invalidWorld=\u00a74Invalid world. +inventoryCleared=\u00a76Inventory cleared. +inventoryClearedAll=\u00a76Cleared everyone's inventory. +inventoryClearedOthers=\u00a76Inventory of \u00a7c{0}\u00a76 cleared. is=is -itemCannotBeSold=That item cannot be sold to the server. -itemMustBeStacked=Item must be traded in stacks. A quantity of 2s would be two stacks, etc. -itemNotEnough1=\u00a7cYou do not have enough of that item to sell. -itemNotEnough2=\u00a77If you meant to sell all of your items of that type, use /sell itemname -itemNotEnough3=\u00a77/sell itemname -1 will sell all but one item, etc. +itemCannotBeSold=\u00a74That item cannot be sold to the server. +itemMustBeStacked=\u00a74Item must be traded in stacks. A quantity of 2s would be two stacks, etc. +itemNames=\u00a76Item short names:\u00a7r {0} +itemNotEnough1=\u00a74You do not have enough of that item to sell. +itemNotEnough2=\u00a76If you meant to sell all of your items of that type, use /sell itemname. +itemNotEnough3=\u00a76/sell itemname -1 will sell all but one item, etc. itemSellAir=You really tried to sell Air? Put an item in your hand. -itemSold=\u00a77Sold for \u00a7c{0} \u00a77({1} {2} at {3} each) -itemSoldConsole={0} sold {1} for \u00a77{2} \u00a77({3} items at {4} each) -itemSpawn=\u00a77Giving {0} of {1} -itemsCsvNotLoaded=Could not load items.csv. -jailAlreadyIncarcerated=\u00a7cPerson is already in jail: {0} -jailMessage=\u00a7cYou do the crime, you do the time. -jailNotExist=That jail does not exist. -jailReleased=\u00a77Player \u00a7e{0}\u00a77 unjailed. -jailReleasedPlayerNotify=\u00a77You have been released! -jailSentenceExtended=Jail time extend to: {0) -jailSet=\u00a77Jail {0} has been set -jumpError=That would hurt your computer's brain. -kickDefault=Kicked from server -kickExempt=\u00a7cYou can not kick that person. -kickedAll=\u00a7cKicked all players from server -kill=\u00a77Killed {0}. -kitError2=\u00a7cThat kit does not exist or is improperly defined. -kitError=\u00a7cThere are no valid kits. -kitErrorHelp=\u00a7cPerhaps an item is missing a quantity in the configuration? -kitGive=\u00a77Giving kit {0}. -kitInvFull=\u00a7cYour inventory was full, placing kit on the floor -kitTimed=\u00a7cYou can''t use that kit again for another {0}. -kits=\u00a77Kits: {0} -lightningSmited=\u00a77Thou hast been smitten -lightningUse=\u00a77Smiting {0} -listAfkTag = \u00a77[AFK]\u00a7f -listAmount = \u00a79There are \u00a7c{0}\u00a79 out of maximum \u00a7c{1}\u00a79 players online. -listAmountHidden = \u00a79There are \u00a7c{0}\u00a77/{1}\u00a79 out of maximum \u00a7c{2}\u00a79 players online. -listGroupTag={0}\u00a7f: -listHiddenTag = \u00a77[HIDDEN]\u00a7f -loadWarpError=Failed to load warp {0} -localFormat=Local: <{0}> {1} -mailClear=\u00a7cTo mark your mail as read, type /mail clear -mailCleared=\u00a77Mail Cleared! -mailSent=\u00a77Mail sent! -markMailAsRead=\u00a7cTo mark your mail as read, type /mail clear -markedAsAway=\u00a77You are now marked as away. -markedAsNotAway=\u00a77You are no longer marked as away. -maxHomes=You cannot set more than {0} homes. -mayNotJail=\u00a7cYou may not jail that person +itemSold=\u00a7aSold for \u00a7c{0} \u00a7a({1} {2} at {3} each). +itemSoldConsole=\u00a7a{0} \u00a7asold {1} for \u00a7a{2} \u00a7a({3} items at {4} each). +itemSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} +itemType=\u00a76Item:\u00a7c {0} \u00a76-\u00a7c {1} +itemsCsvNotLoaded=Could not load items.csv! +jailAlreadyIncarcerated=\u00a74Person is already in jail:\u00a7c {0} +jailMessage=\u00a74You do the crime, you do the time. +jailNotExist=\u00a74That jail does not exist. +jailReleased=\u00a76Player \u00a7c{0}\u00a76 unjailed. +jailReleasedPlayerNotify=\u00a76You have been released! +jailSentenceExtended=\u00a76Jail time extend to: {0} +jailSet=\u00a76Jail\u00a7c {0} \u00a76has been set. +jumpError=\u00a74That would hurt your computer's brain. +kickDefault=Kicked from server. +kickExempt=\u00a74You can not kick that person. +kickedAll=\u00a74Kicked all players from server. +kill=\u00a76Killed\u00a7c {0}\u00a76. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. +kitError=\u00a74There are no valid kits. +kitErrorHelp=\u00a74Perhaps an item is missing a quantity in the configuration? +kitGive=\u00a76Giving kit\u00a7c {0}\u00a76. +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. +kitInvFull=\u00a74Your inventory was full, placing kit on the floor. +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. +kitTimed=\u00a74You can''t use that kit again for another\u00a7c {0}\u00a74. +kits=\u00a76Kits:\u00a7r {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. +lightningSmited=\u00a76Thou hast been smitten! +lightningUse=\u00a76Smiting\u00a7c {0} +listAfkTag= \u00a77[AFK]\u00a7r +listAmount= \u00a76There are \u00a7c{0}\u00a76 out of maximum \u00a7c{1}\u00a76 players online. +listAmountHidden= \u00a76There are \u00a7c{0}\u00a76/{1}\u00a76 out of maximum \u00a7c{2}\u00a76 players online. +listGroupTag={0}\u00a7r: +listHiddenTag= \u00a77[HIDDEN]\u00a7r +loadWarpError=\u00a74Failed to load warp {0}. +localFormat=[L]<{0}> {1} +mailClear=\u00a76To mark your mail as read, type\u00a7c /mail clear. +mailCleared=\u00a76Mail Cleared! +mailSent=\u00a76Mail sent! +markMailAsRead=\u00a76To mark your mail as read, type\u00a7c /mail clear. +markedAsAway=\u00a76You are now marked as away. +markedAsNotAway=\u00a76You are no longer marked as away. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: +maxHomes=\u00a74You cannot set more than\u00a7c {0} \u00a74homes. +mayNotJail=\u00a74You may not jail that person! me=me +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minute minutes=minutes -missingItems=You do not have {0}x {1}. +missingItems=\u00a74You do not have {0}x {1}. missingPrefixSuffix=Missing a prefix or suffix for {0} -mobSpawnError=Error while changing mob spawner. -mobSpawnLimit=Mob quantity limited to server limit -mobSpawnTarget=Target block must be a mob spawner. -mobsAvailable=\u00a77Mobs: {0} -moneyRecievedFrom=\u00a7a{0} has been received from {1} -moneySentTo=\u00a7a{0} has been sent to {1} -moneyTaken={0} taken from your bank account. +mobSpawnError=\u00a74Error while changing mob spawner. +mobSpawnLimit=Mob quantity limited to server limit. +mobSpawnTarget=\u00a74Target block must be a mob spawner. +mobsAvailable=\u00a76Mobs:\u00a7r {0} +moneyRecievedFrom=\u00a7a{0} has been received from {1}. +moneySentTo=\u00a7a{0} has been sent to {1}. +moneyTaken=\u00a7a{0} taken from your bank account. month=month months=months -moreThanZero=Quantities must be greater than 0. -msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} -muteExempt=\u00a7cYou may not mute that player. -mutedPlayer=Player {0} muted. -mutedPlayerFor=Player {0} muted for {1}. +moreThanZero=\u00a74Quantities must be greater than 0. +moveSpeed=\u00a76Set {0} speed to\u00a7c {1} \u00a76for {2}\u00a76. +msgFormat=\u00a76[{0}\u00a76 -> {1}\u00a76] \u00a7r{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. +muteExempt=\u00a74You may not mute that player. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1}\u00a76. +mutedPlayer=\u00a76Player {0} \u00a76muted. +mutedPlayerFor=\u00a76Player {0} \u00a76muted for {1}. mutedUserSpeaks={0} tried to speak, but is muted. -nearbyPlayers=Players nearby: {0} -negativeBalanceError=User is not allowed to have a negative balance. -nickChanged=Nickname changed. -nickDisplayName=\u00a77You have to enable change-displayname in Essentials config. -nickInUse=\u00a7cThat name is already in use. -nickNamesAlpha=\u00a7cNicknames must be alphanumeric. -nickNoMore=\u00a77You no longer have a nickname. -nickOthersPermission=\u00a7cYou do not have permission to change the nickname of others -nickSet=\u00a77Your nickname is now \u00a7c{0} -noAccessCommand=\u00a7cYou do not have access to that command. -noAccessPermission=\u00a7cYou do not have permission to access that {0}. -noBreakBedrock=You are not allowed to destroy bedrock. -noDestroyPermission=\u00a7cYou do not have permission to destroy that {0}. -noDurability=\u00a7cThis item does not have a durability. -noGodWorldWarning=\u00a7cWarning! God mode in this world disabled. -noHelpFound=\u00a7cNo matching commands. -noHomeSet=You have not set a home. -noHomeSetPlayer=Player has not set a home. -noKitPermission=\u00a7cYou need the \u00a7c{0}\u00a7c permission to use that kit. -noKits=\u00a77There are no kits available yet -noMail=You do not have any mail -noMotd=\u00a7cThere is no message of the day. -noNewMail=\u00a77You have no new mail. -noPendingRequest=You do not have a pending request. -noPerm=\u00a7cYou do not have the \u00a7f{0}\u00a7c permission. -noPermToSpawnMob=\u00a7cYou don't have permission to spawn this mob. -noPlacePermission=\u00a7cYou do not have permission to place a block near that sign. -noPowerTools=You have no power tools assigned. -noRules=\u00a7cThere are no rules specified yet. -noWarpsDefined=No warps defined +nearbyPlayers=\u00a76Players nearby:\u00a7r {0} +negativeBalanceError=\u00a74User is not allowed to have a negative balance. +nickChanged=\u00a76Nickname changed. +nickDisplayName=\u00a74You have to enable change-displayname in Essentials config. +nickInUse=\u00a74That name is already in use. +nickNamesAlpha=\u00a74Nicknames must be alphanumeric. +nickNoMore=\u00a76You no longer have a nickname. +nickOthersPermission=\u00a74You do not have permission to change the nickname of others! +nickSet=\u00a76Your nickname is now \u00a7c{0} +noAccessCommand=\u00a74You do not have access to that command. +noAccessPermission=\u00a74You do not have permission to access that {0}. +noBreakBedrock=\u00a74You are not allowed to destroy bedrock. +noChapterMeta=\u00a74You do not have permission to create dynamic books. +noDestroyPermission=\u00a74You do not have permission to destroy that {0}. +noDurability=\u00a74This item does not have a durability. +noGodWorldWarning=\u00a74Warning! God mode in this world disabled. +noHelpFound=\u00a74No matching commands. +noHomeSet=\u00a74You have not set a home. +noHomeSetPlayer=\u00a76Player has not set a home. +noKitPermission=\u00a74You need the \u00a7c{0}\u00a74 permission to use that kit. +noKits=\u00a76There are no kits available yet. +noMail=\u00a76You do not have any mail. +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. +noMotd=\u00a76There is no message of the day. +noNewMail=\u00a76You have no new mail. +noPendingRequest=\u00a74You do not have a pending request. +noPerm=\u00a74You do not have the \u00a7c{0}\u00a74 permission. +noPermToSpawnMob=\u00a74You don't have permission to spawn this mob. +noPlacePermission=\u00a74You do not have permission to place a block near that sign. +noPowerTools=\u00a76You have no power tools assigned. +noRules=\u00a74There are no rules specified yet. +noWarpsDefined=\u00a76No warps defined. none=none -notAllowedToQuestion=\u00a7cYou are not authorized to use question. -notAllowedToShout=\u00a7cYou are not authorized to shout. -notEnoughExperience=You do not have enough experience. -notEnoughMoney=You do not have sufficient funds. +notAllowedToQuestion=\u00a74You are not authorized to use question. +notAllowedToShout=\u00a74You are not authorized to shout. +notEnoughExperience=\u00a74You do not have enough experience. +notEnoughMoney=\u00a74You do not have sufficient funds. notFlying=not flying -notRecommendedBukkit= * ! * Bukkit version is not the recommended build for Essentials. +notRecommendedBukkit= \u00a74* ! * Bukkit version is not the recommended build for Essentials. notSupportedYet=Not supported yet. -nothingInHand = \u00a7cYou have nothing in your hand. +nothingInHand=\u00a74You have nothing in your hand. now=now -nuke=May death rain upon them +nuke=\u00a75May death rain upon them. numberRequired=A number goes there, silly. onlyDayNight=/time only supports day/night. -onlyPlayers=Only in-game players can use {0}. -onlySunStorm=/weather only supports sun/storm. -orderBalances=Ordering balances of {0} users, please wait ... -pTimeCurrent=\u00a7e{0}''s\u00a7f time is {1}. -pTimeCurrentFixed=\u00a7e{0}''s\u00a7f time is fixed to {1}. -pTimeNormal=\u00a7e{0}''s\u00a7f time is normal and matches the server. -pTimeOthersPermission=\u00a7cYou are not authorized to set other players' time. -pTimePlayers=These players have their own time: -pTimeReset=Player time has been reset for: \u00a7e{0} -pTimeSet=Player time is set to \u00a73{0}\u00a7f for: \u00a7e{1} -pTimeSetFixed=Player time is fixed to \u00a73{0}\u00a7f for: \u00a7e{1} -parseError=Error parsing {0} on line {1} -pendingTeleportCancelled=\u00a7cPending teleportation request cancelled. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). +onlyPlayers=\u00a74Only in-game players can use {0}. +onlySunStorm=\u00a74/weather only supports sun/storm. +orderBalances=\u00a76Ordering balances of\u00a7c {0} \u00a76users, please wait... +oversizedTempban=\u00a74You may not ban a player for this period of time. +pTimeCurrent=\u00a7c{0}\u00a76''s time is\u00a7c {1}\u00a76. +pTimeCurrentFixed=\u00a7c{0}\u00a76''s time is fixed to\u00a7c {1}\u00a76. +pTimeNormal=\u00a7c{0}\u00a76''s time is normal and matches the server. +pTimeOthersPermission=\u00a74You are not authorized to set other players' time. +pTimePlayers=\u00a76These players have their own time:\u00a7r +pTimeReset=\u00a76Player time has been reset for: \u00a7c{0} +pTimeSet=\u00a76Player time is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pTimeSetFixed=\u00a76Player time is fixed to \u00a7c{0}\u00a76 for: \u00a7c{1}. +parseError=\u00a74Error parsing\u00a7c {0} \u00a76on line {1}. +pendingTeleportCancelled=\u00a74Pending teleportation request cancelled. permissionsError=Missing Permissions/GroupManager; chat prefixes/suffixes will be disabled. -playerBanned=\u00a7cPlayer {0} banned {1} for {2} -playerInJail=\u00a7cPlayer is already in jail {0}. -playerJailed=\u00a77Player {0} jailed. -playerJailedFor= \u00a77Player {0} jailed for {1}. -playerKicked=\u00a7cPlayer {0} kicked {1} for {2} -playerMuted=\u00a77You have been muted -playerMutedFor=\u00a77You have been muted for {0} -playerNeverOnServer=\u00a7cPlayer {0} was never on this server. -playerNotFound=\u00a7cPlayer not found. -playerUnmuted=\u00a77You have been unmuted +playerBanned=\u00a76Player\u00a7c {0} \u00a76banned {1} \u00a76for {2}. +playerInJail=\u00a74Player is already in jail\u00a7c {0}\u00a76. +playerJailed=\u00a76Player\u00a7c {0} \u00a76jailed. +playerJailedFor= \u00a76Player\u00a7c {0} \u00a76jailed for {1}. +playerKicked=\u00a76Player\u00a7c {0} \u00a76kicked {1} for {2}. +playerMuted=\u00a76You have been muted! +playerMutedFor=\u00a76You have been muted for\u00a7c {0}. +playerNeverOnServer=\u00a74Player\u00a7c {0} \u00a74was never on this server. +playerNotFound=\u00a74Player not found. +playerUnmuted=\u00a76You have been unmuted. pong=Pong! -possibleWorlds=\u00a77Possible worlds are the numbers 0 through {0}. -powerToolAir=Command can't be attached to air. -powerToolAlreadySet=Command \u00a7c{0}\u00a7f is already assigned to {1}. -powerToolAttach=\u00a7c{0}\u00a7f command assigned to {1}. -powerToolClearAll=All powertool commands have been cleared. -powerToolList={1} has the following commands: \u00a7c{0}\u00a7f. -powerToolListEmpty={0} has no commands assigned. -powerToolNoSuchCommandAssigned=Command \u00a7c{0}\u00a7f has not been assigned to {1}. -powerToolRemove=Command \u00a7c{0}\u00a7f removed from {1}. -powerToolRemoveAll=All commands removed from {0}. -powerToolsDisabled=All of your power tools have been disabled. -powerToolsEnabled=All of your power tools have been enabled. -protectionOwner=\u00a76[EssentialsProtect] Protection owner: {0} -questionFormat=\u00a77[Question]\u00a7f {0} -readNextPage=Type /{0} {1} to read the next page -reloadAllPlugins=\u00a77Reloaded all plugins. -removed=\u00a77Removed {0} entities. -repair=You have successfully repaired your: \u00a7e{0}. -repairAlreadyFixed=\u00a77This item does not need repairing. -repairEnchanted=\u00a77You are not allowed to repair enchanted items. -repairInvalidType=\u00a7cThis item cannot be repaired. -repairNone=There were no items that needing repairing. -requestAccepted=\u00a77Teleport request accepted. -requestAcceptedFrom=\u00a77{0} accepted your teleport request. -requestDenied=\u00a77Teleport request denied. -requestDeniedFrom=\u00a77{0} denied your teleport request. -requestSent=\u00a77Request sent to {0}\u00a77. -requestTimedOut=\u00a7cTeleport request has timed out -requiredBukkit= * ! * You need atleast build {0} of CraftBukkit, download it from http://dl.bukkit.org/downloads/craftbukkit/ -returnPlayerToJailError=Error occurred when trying to return player {0} to jail: {1} +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) +possibleWorlds=\u00a76Possible worlds are the numbers 0 through {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. +powerToolAir=\u00a74Command can't be attached to air. +powerToolAlreadySet=\u00a74Command \u00a7c{0}\u00a74 is already assigned to {1}. +powerToolAttach=\u00a7c{0}\u00a76 command assigned to {1}. +powerToolClearAll=\u00a76All powertool commands have been cleared. +powerToolList=\u00a76Item \u00a7c{1} \u00a76has the following commands: \u00a7c{0}\u00a76. +powerToolListEmpty=\u00a74Item \u00a7c{0} \u00a74has no commands assigned. +powerToolNoSuchCommandAssigned=\u00a74Command \u00a7c{0}\u00a74 has not been assigned to {1}. +powerToolRemove=\u00a76Command \u00a7c{0}\u00a76 removed from {1}. +powerToolRemoveAll=\u00a76All commands removed from {0}. +powerToolsDisabled=\u00a76All of your power tools have been disabled. +powerToolsEnabled=\u00a76All of your power tools have been enabled. +protectionOwner=\u00a76[EssentialsProtect] Protection owner:\u00a7r {0}. +questionFormat=\u00a72[Question]\u00a7r {0} +readNextPage=\u00a76Type\u00a7c /{0} {1} \u00a76to read the next page. +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number. +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2}\u00a76. +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} +reloadAllPlugins=\u00a76Reloaded all plugins. +removed=\u00a76Removed\u00a7c {0} \u00a76entities. +repair=\u00a76You have successfully repaired your: \u00a7c{0}. +repairAlreadyFixed=\u00a74This item does not need repairing. +repairEnchanted=\u00a74You are not allowed to repair enchanted items. +repairInvalidType=\u00a74This item cannot be repaired. +repairNone=\u00a74There were no items that needing repairing. +requestAccepted=\u00a76Teleport request accepted. +requestAcceptedFrom=\u00a7c{0} \u00a76accepted your teleport request. +requestDenied=\u00a76Teleport request denied. +requestDeniedFrom=\u00a7c{0} \u00a76denied your teleport request. +requestSent=\u00a76Request sent to\u00a7c {0}\u00a76. +requestTimedOut=\u00a74Teleport request has timed out. +requiredBukkit= \u00a76* ! * You need atleast build {0} of CraftBukkit, download it from http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76for all online players. +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76for all players. +returnPlayerToJailError=\u00a74Error occurred when trying to return player\u00a7c {0} \u00a74to jail: {1}! +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=second seconds=seconds -seenOffline=Player {0} is offline since {1} -seenOnline=Player {0} is online since {1} -serverFull=Server is full -serverTotal=Server Total: {0} -setSpawner=Changed spawner type to {0} -sheepMalformedColor=Malformed color. -shoutFormat=\u00a77[Shout]\u00a7f {0} +seenOffline=\u00a76Player\u00a7c {0} \u00a76is \u00a74offline\u00a76 since {1}. +seenOnline=\u00a76Player\u00a7c {0} \u00a76is \u00a7aonline\u00a76 since {1}. +serverFull=Server is full! +serverTotal=\u00a76Server Total:\u00a7c {0} +setSpawner=\u00a76Changed spawner type to\u00a7c {0} +sheepMalformedColor=\u00a74Malformed color. +shoutFormat=\u00a76[Shout]\u00a7r {0} signFormatFail=\u00a74[{0}] signFormatSuccess=\u00a71[{0}] signFormatTemplate=[{0}] signProtectInvalidLocation=\u00a74You are not allowed to create sign here. -similarWarpExist=A warp with a similar name already exists. -slimeMalformedSize=Malformed size. -soloMob=That mob likes to be alone -spawnSet=\u00a77Spawn location set for group {0}. +similarWarpExist=\u00a74A warp with a similar name already exists. +slimeMalformedSize=\u00a74Malformed size. +soloMob=\u00a74That mob likes to be alone. +spawnSet=\u00a76Spawn location set for group\u00a7c {0}\u00a76. spawned=spawned -sudoExempt=You cannot sudo this user -sudoRun=Forcing {0} to run: /{1} {2} -suicideMessage=\u00a77Goodbye Cruel World... -suicideSuccess= \u00a77{0} took their own life +sudoExempt=\u00a74You cannot sudo this user. +sudoRun=\u00a76Forcing\u00a7c {0} \u00a76to run:\u00a7r /{1} {2} +suicideMessage=\u00a76Goodbye cruel world... +suicideSuccess= \u00a76{0} \u00a76took their own life. survival=survival -takenFromAccount=\u00a7c{0} has been taken from your account. -takenFromOthersAccount=\u00a7c{0} taken from {1}\u00a7c account. New balance: {2} -teleportAAll=\u00a77Teleporting request sent to all players... -teleportAll=\u00a77Teleporting all players... -teleportAtoB=\u00a77{0}\u00a77 teleported you to {1}\u00a77. -teleportDisabled={0} has teleportation disabled. -teleportHereRequest=\u00a7c{0}\u00a7c has requested that you teleport to them. -teleportNewPlayerError=Failed to teleport new player -teleportRequest=\u00a7c{0}\u00a7c has requested to teleport to you. -teleportRequestTimeoutInfo=\u00a77This request will timeout after {0} seconds. -teleportTop=\u00a77Teleporting to top. -teleportationCommencing=\u00a77Teleportation commencing... -teleportationDisabled=\u00a77Teleportation disabled. -teleportationEnabled=\u00a77Teleportation enabled. -teleporting=\u00a77Teleporting... -teleportingPortal=\u00a77Teleporting via portal. -tempBanned=Temporarily banned from server for {0} -tempbanExempt=\u00a77You may not tempban that player -thunder= You {0} thunder in your world -thunderDuration=You {0} thunder in your world for {1} seconds. -timeBeforeHeal=Time before next heal: {0} -timeBeforeTeleport=Time before next teleport: {0} -timeFormat=\u00a73{0}\u00a7f or \u00a73{1}\u00a7f or \u00a73{2}\u00a7f +takenFromAccount=\u00a7a{0} has been taken from your account. +takenFromOthersAccount=\u00a7a{0} taken from {1}\u00a7a account. New balance: {2}. +teleportAAll=\u00a76Teleporting request sent to all players... +teleportAll=\u00a76Teleporting all players... +teleportAtoB=\u00a7c{0}\u00a76 teleported you to {1}\u00a76. +teleportDisabled=\u00a7c{0} \u00a74has teleportation disabled. +teleportHereRequest=\u00a7c{0}\u00a76 has requested that you teleport to them. +teleportNewPlayerError=\u00a74Failed to teleport new player! +teleportRequest=\u00a7c{0}\u00a76 has requested to teleport to you. +teleportRequestTimeoutInfo=\u00a76This request will timeout after\u00a7c {0} seconds\u00a76. +teleportTop=\u00a76Teleporting to top. +teleportationCommencing=\u00a76Teleportation commencing... +teleportationDisabled=\u00a76Teleportation disabled. +teleportationDisabledFor=\u00a76Teleportation disabled for {0}. +teleportationEnabled=\u00a76Teleportation enabled. +teleportationEnabledFor=\u00a76Teleportation enabled for {0}. +teleporting=\u00a76Teleporting... +teleportingPortal=\u00a76Teleporting via portal. +tempBanned=Temporarily banned from server for {0}. +tempbanExempt=\u00a74You may not tempban that player. +thunder= \u00a76You\u00a7c {0} \u00a76thunder in your world. +thunderDuration=\u00a76You\u00a7c {0} \u00a76thunder in your world for\u00a7c {1} \u00a76seconds. +timeBeforeHeal=\u00a76Time before next heal:\u00a7c {0}\u00a76. +timeBeforeTeleport=\u00a76Time before next teleport:\u00a7c {0} +timeFormat=\u00a7c{0}\u00a76 or \u00a7c{1}\u00a76 or \u00a7c{2}\u00a76. 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=Time set in all worlds. -timeSetPermission=\u00a7cYou are not authorized to set the time. -timeWorldCurrent=The current time in {0} is \u00a73{1} -timeWorldSet=The time was set to {0} in: \u00a7c{1} -tps=Current TPS = {0} -tradeCompleted=\u00a77Trade completed. -tradeSignEmpty=The trade sign has nothing available for you. -tradeSignEmptyOwner=There is nothing to collect from this trade sign. -treeFailure=\u00a7cTree generation failure. Try again on grass or dirt. -treeSpawned=\u00a77Tree spawned. -true=\u00a72true\u00a7f -typeTpaccept=\u00a77To teleport, type \u00a7c/tpaccept\u00a77. -typeTpdeny=\u00a77To deny this request, type \u00a7c/tpdeny\u00a77. -typeWorldName=\u00a77You can also type the name of a specific world. -unableToSpawnMob=Unable to spawn mob. -unbannedIP=Unbanned IP address. -unbannedPlayer=Unbanned player. -unignorePlayer=You are not ignoring player {0} anymore. -unknownItemId=Unknown item id: {0} -unknownItemInList=Unknown item {0} in {1} list. -unknownItemName=Unknown item name: {0} -unlimitedItemPermission=\u00a7cNo permission for unlimited item {0}. -unlimitedItems=Unlimited items: -unmutedPlayer=Player {0} unmuted. -unvanished=\u00a7aYou are once again visible. -unvanishedReload=\u00a7cA reload has forced you to become visible. -upgradingFilesError=Error while upgrading the files -userDoesNotExist=The user {0} does not exist. -userIsAway={0} is now AFK -userIsNotAway={0} is no longer AFK -userJailed=\u00a77You have been jailed +timeSet=\u00a76Time set in all worlds. +timeSetPermission=\u00a74You are not authorized to set the time. +timeWorldCurrent=\u00a76The current time in\u00a7c {0} \u00a76is \u00a7c{1}\u00a76. +timeWorldSet=\u00a76The time was set to\u00a7c {0} \u00a76in: \u00a7c{1}\u00a76. +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. +tps=\u00a76Current TPS = {0} +tradeCompleted=\u00a7aTrade completed. +tradeSignEmpty=\u00a74The trade sign has nothing available for you. +tradeSignEmptyOwner=\u00a74There is nothing to collect from this trade sign. +treeFailure=\u00a74Tree generation failure. Try again on grass or dirt. +treeSpawned=\u00a76Tree spawned. +true=\u00a7atrue\u00a7r +typeTpaccept=\u00a76To teleport, type \u00a7c/tpaccept\u00a76. +typeTpdeny=\u00a76To deny this request, type \u00a7c/tpdeny\u00a76. +typeWorldName=\u00a76You can also type the name of a specific world. +unableToSpawnMob=\u00a74Unable to spawn mob. +unignorePlayer=\u00a76You are not ignoring player\u00a7c {0} \u00a76anymore. +unknownItemId=\u00a74Unknown item id:\u00a7r {0}\u00a74. +unknownItemInList=\u00a74Unknown item {0} in {1} list. +unknownItemName=\u00a74Unknown item name: {0}. +unlimitedItemPermission=\u00a74No permission for unlimited item {0}. +unlimitedItems=\u00a76Unlimited items:\u00a7r +unmutedPlayer=\u00a76Player\u00a7c {0} \u00a76unmuted. +unvanished=\u00a76You are once again visible. +unvanishedReload=\u00a74A reload has forced you to become visible. +upgradingFilesError=Error while upgrading the files. +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond. +userDoesNotExist=\u00a74The user\u00a7c {0} \u00a74does not exist. +userIsAway=\u00a75{0} \u00a75is now AFK. +userIsNotAway=\u00a75{0} \u00a75is no longer AFK. +userJailed=\u00a76You have been jailed! +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} used an existing exit portal. -userdataMoveBackError=Failed to move userdata/{0}.tmp to userdata/{1} -userdataMoveError=Failed to move userdata/{0} to userdata/{1}.tmp +userdataMoveBackError=Failed to move userdata/{0}.tmp to userdata/{1}! +userdataMoveError=Failed to move userdata/{0} to userdata/{1}.tmp! usingTempFolderForTesting=Using temp folder for testing: -vanished=\u00a7aYou have now been vanished. -versionMismatch=Version mismatch! Please update {0} to the same version. -versionMismatchAll=Version mismatch! Please update all Essentials jars to the same version. -voiceSilenced=\u00a77Your voice has been silenced -warpDeleteError=Problem deleting the warp file. -warpListPermission=\u00a7cYou do not have Permission to list warps. -warpNotExist=That warp does not exist. -warpOverwrite=\u00a7cYou cannot overwrite that warp. -warpSet=\u00a77Warp {0} set. -warpUsePermission=\u00a7cYou do not have Permission to use that warp. -warpingTo=\u00a77Warping to {0}. -warps=Warps: {0} -warpsCount=\u00a77There are {0} warps. Showing page {1} of {2}. -weatherStorm=\u00a77You set the weather to storm in {0} -weatherStormFor=\u00a77You set the weather to storm in {0} for {1} seconds -weatherSun=\u00a77You set the weather to sun in {0} -weatherSunFor=\u00a77You set the weather to sun in {0} for {1} seconds -whoisAFK=\u00a76 - AFK:\u00a7f {0} -whoisBanned=\u00a76 - Banned:\u00a7f {0} -whoisExp=\u00a76 - Exp:\u00a7f {0} (Level {1}) -whoisFly=\u00a76 - Fly mode:\u00a7f {0} ({1}) -whoisGamemode=\u00a76 - Gamemode:\u00a7f {0} -whoisGeoLocation=\u00a76 - Location:\u00a7f {0} -whoisGod=\u00a76 - God mode:\u00a7f {0} -whoisHealth=\u00a76 - Health:\u00a7f {0}/20 -whoisIPAddress=\u00a76 - IP Address:\u00a7f {0} -whoisJail=\u00a76 - Jail:\u00a7f {0} -whoisLocation=\u00a76 - Location:\u00a7f ({0}, {1}, {2}, {3}) -whoisMoney=\u00a76 - Money:\u00a7f {0} -whoisMuted=\u00a76 - Muted:\u00a7f {0} -whoisNick=\u00a76 - Nick:\u00a7f {0} -whoisOp=\u00a76 - OP:\u00a7f {0} -whoisTop=\u00a76 ====== WhoIs:\u00a7f {0} \u00a76====== -worth=\u00a77Stack of {0} worth \u00a7c{1}\u00a77 ({2} item(s) at {3} each) -worthMeta=\u00a77Stack of {0} with metadata of {1} worth \u00a7c{2}\u00a77 ({3} item(s) at {4} each) -worthSet=Worth value set +vanished=\u00a76You are now completely invisible to normal users, and hidden from in-game commands. +versionMismatch=\u00a74Version mismatch! Please update {0} to the same version. +versionMismatchAll=\u00a74Version mismatch! Please update all Essentials jars to the same version. +voiceSilenced=\u00a76Your voice has been silenced! +walking=walking +warpDeleteError=\u00a74Problem deleting the warp file. +warpList={0} +warpListPermission=\u00a74You do not have Permission to list warps. +warpNotExist=\u00a74That warp does not exist. +warpOverwrite=\u00a74You cannot overwrite that warp. +warpSet=\u00a76Warp\u00a7c {0} \u00a76set. +warpUsePermission=\u00a74You do not have Permission to use that warp. +warpingTo=\u00a76Warping to\u00a7c {0}\u00a76. +warps=\u00a76Warps:\u00a7r {0} +warpsCount=\u00a76There are\u00a7c {0} \u00a76warps. Showing page {1} of {2}. +weatherStorm=\u00a76You set the weather to \u00a7cstorm\u00a76 in\u00a7c {0}\u00a76. +weatherStormFor=\u00a76You set the weather to \u00a7cstorm\u00a76 in\u00a7c {0} \u00a76for {1} seconds. +weatherSun=\u00a76You set the weather to \u00a7csun\u00a76 in\u00a7c {0}\u00a76. +weatherSunFor=\u00a76You set the weather to \u00a7csun\u00a76 in\u00a7c {0} \u00a76for {1} seconds. +whoisAFK=\u00a76 - AFK:\u00a7r {0} +whoisBanned=\u00a76 - Banned:\u00a7r {0} +whoisExp=\u00a76 - Exp:\u00a7r {0} (Level {1}) +whoisFly=\u00a76 - Fly mode:\u00a7r {0} ({1}) +whoisGamemode=\u00a76 - Gamemode:\u00a7r {0} +whoisGeoLocation=\u00a76 - Location:\u00a7r {0} +whoisGod=\u00a76 - God mode:\u00a7r {0} +whoisHealth=\u00a76 - Health:\u00a7r {0}/20 +whoisIPAddress=\u00a76 - IP Address:\u00a7r {0} +whoisJail=\u00a76 - Jail:\u00a7r {0} +whoisLocation=\u00a76 - Location:\u00a7r ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - Money:\u00a7r {0} +whoisMuted=\u00a76 - Muted:\u00a7r {0} +whoisNick=\u00a76 - Nick:\u00a7r {0} +whoisOp=\u00a76 - OP:\u00a7r {0} +whoisTop=\u00a76 ====== WhoIs:\u00a7c {0} \u00a76====== +worth=\u00a7aStack of {0} worth \u00a7c{1}\u00a7a ({2} item(s) at {3} each) +worthMeta=\u00a7aStack of {0} with metadata of {1} worth \u00a7c{2}\u00a7a ({3} item(s) at {4} each) +worthSet=\u00a76Worth value set year=year years=years -youAreHealed=\u00a77You have been healed. -youHaveNewMail=\u00a7cYou have {0} messages!\u00a7f Type \u00a77/mail read\u00a7f to view your mail. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +youAreHealed=\u00a76You have been healed. +youHaveNewMail=\u00a76You have\u00a7c {0} \u00a76messages! Type \u00a7c/mail read\u00a76 to view your mail. +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs. +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_cs.properties b/Essentials/src/messages_cs.properties index 1dbb58af05..da2ee53c4e 100644 --- a/Essentials/src/messages_cs.properties +++ b/Essentials/src/messages_cs.properties @@ -3,15 +3,22 @@ # Translations start here # 0.1 version: tomasara413 - Tento preklad neni 100% presny to se opravi v dalsich verzich prekladu # 0.2 version: optimized by mdojcar (modojcar@seznam.cz) - mirne fixy a trochu jsem preklad vylepsil -# nektere vyrazy jako "Kicknut" jsou v anglickem zneni (zni to mnohem prirozeneji) +# nektere vyrazy jako "Kicknut" jsou v anglickem zneni (zni to mnohem prirozeneji) # 0.3 tommymortago - Pro upravy kontaktujte na skype: tomasperzl/ Korektura: Sejsel action=* {0} {1} addedToAccount=\u00a7a{0} bylo pripsano na tvuj ucet. addedToOthersAccount=\u00a7a{0} bylo pripsano na {1}\u00a7a ucet. Nova hodnota: {2} +adventure = adventure alertBroke=zniceno: alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} v: {3} alertPlaced=polozeno: alertUsed=pouzito: +antiBuildBreak=\u00a74You are not permitted to break {0} blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with {0}. +antiBuildPlace=\u00a74You are not permitted to place {0} here. +antiBuildUse=\u00a74You are not permitted to use {0}. autoAfkKickReason=Byl jsi vyhozen za neaktivitu delsi nez {0} minut. backAfterDeath=\u00a77Pouzij /back, aby ses vratil na misto sve smrti. backUsageMsg=\u00a77Vracis se na svou minulou pozici. @@ -22,14 +29,16 @@ balance=\u00a77Ucet: {0} balanceTop=\u00a77Nejbohatsi hraci ({0}) banExempt=\u00a7cNemuzes zabanovat tohoto hrace. banFormat=Banned: {0} -banIpAddress=\u00a77IP Adresa byla zabanovana -bannedIpsFileError=Chyba pri nacitani banned-ips.txt -bannedIpsFileNotFound=Soubor banned-ips.txt nebyl nazen. -bannedPlayersFileError=Chyba pri nacitani banned-players.txt -bannedPlayersFileNotFound=Soubor banned-players.txt nebyl nalezen +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7cProblem pri vytvareni velkeho stromu. Zkuste znovu na trave nebo hline. bigTreeSuccess= \u00a77Velky strom vytvoren. blockList=Essentials prenechal nasledujici prikazy jinemu pluginu: +bookAuthorSet=\u00a76Author of the book set to {0} +bookLocked=\u00a7cThis book is now locked +bookTitleSet=\u00a76Title of the book set to {0} broadcast=[\u00a7cSdeleni\u00a7f]\u00a7a {0} buildAlert=\u00a7cNemas dovoleno stavet. bukkitFormatChanged=Format kontroly verze Bukkitu zmenen. Verze nebyla zkontrolovana. @@ -38,16 +47,18 @@ canTalkAgain=\u00a77Muzes opet mluvit. cantFindGeoIpDB=Nemohu najit GeoIP databazi! cantReadGeoIpDB=Nemohu precist GeoIP databazi! cantSpawnItem=\u00a7cNejsi dovoleny spawnout item: {0} -chatTypeLocal=[L] chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. commandFailed=Prikaz {0} selhal. commandHelpFailedForPlugin=Chyba pri ziskavani pomoci: {0} commandNotLoaded=\u00a7cPrikaz {0} je nespravne nacteny. compassBearing=\u00a77Zmena orientace: {0} ({1} stupnu). configFileMoveError=Chyba pri presouvani config.yml do slozky se zalohou. configFileRenameError=Chyba pri pokusu o prejmenovani docasneho souboru na config.yml -connectedPlayers=Pripojeni hraci: +connectedPlayers=\u00a77Pripojeni hraci\u00a7r connectionFailed=Pokus o otevreni spojeni selhal. cooldownWithMessage=\u00a7cOdpocet: {0} corruptNodeInConfig=\u00a74Pozor: Vas konfiguracni soubor ma chybnou {0} poznamku. @@ -65,20 +76,25 @@ deleteHome=\u00a77Domov {0} byl uspesne odstranen. deleteJail=\u00a77Jail {0} byl uspesne odstranen. deleteWarp=\u00a77Warp {0} byl uspesne odstranen. deniedAccessCommand=Hraci {0} byl zablokovan prikaz. -dependancyDownloaded=[Essentials] Zavislost {0} uspesne stazena. +denyBookEdit=\u00a74You cannot unlock this book +denyChangeAuthor=\u00a74You cannot change the author of this book +denyChangeTitle=\u00a74You cannot change the title of this book +dependancyDownloaded=[Essentials] Zavislost {0} uspesne stazena. dependancyException=[Essentials] Nastala chyba pri pokusu o stazeni zavilosti. dependancyNotFound=[Essentials] Pozadovana zavilost nenalezena, stahuji nyni. depth=\u00a77Jsi na urovni more. depthAboveSea=\u00a77Jsi {0} kostek nad urovni more. -depthBelowSea=\u00a77Jsi {0} kostek pod urovni more. +depthBelowSea=\u00a77Jsi {0} kostek pod urovni more. destinationNotSet=Destinace neni nastavena. -disableUnlimited=\u00a77Zablokovano neomezene pokladani {0} hraci {1}. +disableUnlimited=\u00a77Zablokovano neomezene pokladani {0} hraci {1}. disabled=zablokovano disabledToSpawnMob=Spawnuti tohoto moba je zakazno v configuracnim souboru. -dontMoveMessage=\u00a77Teleport bude zahajen za {0}. Nehybej se. +distance=\u00a76Distance: {0} +dontMoveMessage=\u00a77Teleport bude zahajen za {0}. Nehybej se. downloadingGeoIp=Stahuji GeoIP databazi ... muze to chvilku trvat (staty: 0.6 MB, mesta: 20MB) duplicatedUserdata=Duplikovane data hrace: {0} and {1} durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left +editBookContents=\u00a7eYou may now edit the contents of this book enableUnlimited=\u00a77Davam neomezene mnozstvi {0} hraci {1}. enabled=povoleno enchantmentApplied = \u00a77Enchant {0} byl aplikovan na tvuj nastroj v ruce. @@ -102,22 +118,28 @@ false=\u00a74false\u00a7f feed=\u00a77Nasytil jsi se. feedOther=\u00a77Nasytil jsi hrace {0}. fileRenameError=Prejmenovani souboru {0} selhalo. +fireworkColor=\u00a74You must apply a color to the firework to add an effect +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle flyMode=\u00a77Povolil jsi letani hraci {0} na {1}. flying=flying foreverAlone=\u00a7cNemas komu odepsat. freedMemory=Uvolneno {0} MB. +fullStack=\u00a74You already have a full stack gameMode=\u00a77Nastavil jsi herni mod z {0} na {1}. -gcchunks= chunky, -gcentities= entity +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities gcfree=Volna pamet: {0} MB gcmax=Dostupna pamet: {0} MB gctotal=Vyuzita pamet: {0} MB geoIpUrlEmpty=Odkaz na stazeni GeoIP je prazdny. geoIpUrlInvalid=Odkaz na stazeni GeoIP je chybny. -geoipJoinFormat=Hrac {0} prichazi z {1} +geoipJoinFormat=\u00a76Hrac \u00a7c{0} \u00a76prichazi z \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. godDisabledFor=zakazan pro {0} godEnabledFor=povolen pro {0} godMode=\u00a77God mode {0}. +groupNumber={0} online, for the full list type /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! hatArmor=\u00a7cError, you cannot use this item as a hat! hatEmpty=\u00a7cYou are not wearing a hat. hatFail=\u00a7cYou must have something to wear in your hand. @@ -125,6 +147,7 @@ hatPlaced=\u00a7eEnjoy your new hat! hatRemoved=\u00a7eYour hat has been removed. haveBeenReleased=\u00a77Byl jsi uvolnen heal=\u00a77Byl jsi uzdraven. +healDead=\u00a74You cannot heal someone who is dead! healOther=\u00a77Uzdravil jsi hrace {0}. helpConsole=Pokud chces videt napovedu z konzole, napis ?. helpFrom=\u00a77Prikazy od{0}: @@ -133,6 +156,9 @@ helpMatching=\u00a77Prikazy odpovidajici "{0}": helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} helpPages=Strana \u00a7c{0}\u00a7f z \u00a7c{1}\u00a7f: helpPlugin=\u00a74{0}\u00a7f: Napoveda pluginu: /help {1} +holdBook=\u00a74You are not holding a writable book +holdFirework=\u00a74You must be holding a firework to add effects +holdPotion=\u00a74You must be holding a potion to apply effects to it. holeInFloor=Dira v podlaze homeSet=\u00a77Domov nastaven. homeSetToBed=\u00a77Tvuj domov je nastaven na tuto postel. @@ -141,8 +167,8 @@ hour=hodina hours=hodiny ignorePlayer=Odted jsi zacal ignorovat hrace {0}. illegalDate=Nespravny format data. -infoChapter=Vyberte kapitolu: -infoChapterPages=Kapitola {0}, strana \u00a7c{1}\u00a7f z \u00a7c{2}\u00a7f: +infoChapter=Vyberte kapitolu: +infoChapterPages=Kapitola {0}, strana \u00a7c{1}\u00a7f z \u00a7c{2}\u00a7f: infoFileDoesNotExist=Soubor info.txt neexistuje. Vytvarim novy. infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Strana \u00a74{0}\u00a76/\u00a74{1} \u00a7e---- infoUnknownChapter=Neznama kapitola. @@ -151,16 +177,23 @@ invRestored=Tvuj inventar byl obnoven. invSee=Nyni mas inventar hrace {0}. invSeeHelp=Pouzij znovu /invsee aby jsi mel zpatky svuj inventar. invalidCharge=\u00a7cNeplatny poplatek. +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1} invalidHome=Domov {0} neexistuje. +invalidHomeName=\u00a74Invalid home name invalidMob=Nespravny typ moba. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Nespravny server! invalidSignLine=Radek {0} je chybne vyplnen. +invalidWarpName=\u00a74Invalid warp name invalidWorld=\u00a7cNespravny svet! inventoryCleared=\u00a77Inventar smazan. +inventoryClearedAll=\u00a76Cleared everyone's inventory. inventoryClearedOthers=\u00a77Inventar hrace \u00a7c{0}\u00a77 vymazan. is=je itemCannotBeSold=Tento item nelze prodat serveru. -itemMustBeStacked=Itemy musi byt vymeneny ve stacku. +itemMustBeStacked=Itemy musi byt vymeneny ve stacku. +itemNames=Item short names: {0} itemNotEnough1=\u00a7cNemas dostatek tohoto itemu, aby jsi jej mohl prodat. itemNotEnough2=\u00a77Pokud jsi chtel prodat vsechny itemy tohoto typu, pouzij /sell nazevitemu itemNotEnough3=\u00a77/sell nazevnitemu -1 proda vse ale pouze jeden item atd. @@ -168,32 +201,38 @@ itemSellAir=Vazne jsi se pokusil prodat Vzduch? Vezmi si neco do ruky. itemSold=\u00a77Prodal za \u00a7c{0} \u00a77({1} {2} za cenu {3} kus) itemSoldConsole={0} Prodal {1} za \u00a77{2} \u00a77({3} za cenu {4} kus) itemSpawn=\u00a77Davam {0} {1} +itemType=Item: {0} - {1} itemsCsvNotLoaded=Nelze nacist soubor items.csv. jailAlreadyIncarcerated=\u00a7cTento hrace ja jiz uveznen: {0} jailMessage=\u00a7cPorusil jsi pravidla, ted si to odsedis! jailNotExist=Toto vezeni neexistuje. jailReleased=\u00a77Hrac \u00a7e{0}\u00a77 byl propusten na svobodu. jailReleasedPlayerNotify=\u00a77Byl jsi propusten na svobodu! -jailSentenceExtended=Cas ve vezeni prodlouzen na: {0) +jailSentenceExtended=Cas ve vezeni prodlouzen na: {0} jailSet=\u00a77Vezeni {0} bylo vytvoreno. jumpError=Tohle by tvuj procesor nemusel rozdychat. kickDefault=Vyhozen ze serveru kickExempt=\u00a7cNemuzes vyhodit tuhle osobu. kickedAll=\u00a7cKicked all players from server kill=\u00a77Zabit {0}. -kitError2=\u00a7cTento kit neexistuje, nebo je chybne definovan. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitError=\u00a7cNejsou zadne validni kity. kitErrorHelp=\u00a7cPravdepodobne item nema vyplnene mnozstvi v configu? kitGive=\u00a77Davam kit {0}. +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. kitInvFull=\u00a7cMel jsi plny inventar, obsah kitu je na zemi. +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. kitTimed=\u00a7cNemuzes pouzit tento kit po dalsich {0}. kits=\u00a77Kity: {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. lightningSmited=\u00a77Byl jsi zasazen bleskem. lightningUse=\u00a77Zasadil jsi bleskem hrace {0} listAfkTag = \u00a77[AFK]\u00a7f listAmount = \u00a79Je tu \u00a7c{0}\u00a79 z maxima \u00a7c{1}\u00a79 hracu online. listAmountHidden = \u00a79Je tu \u00a7c{0}\u00a77/{1}\u00a79 z maxima \u00a7c{2}\u00a79 hracu online. -listGroupTag={0}\u00a7f: +listGroupTag={0}\u00a7f: listHiddenTag = \u00a77[HIDDEN]\u00a7f loadWarpError=Chyba pri nacitani warpu: {0} localFormat=Jazyk: <{0}> {1} @@ -203,9 +242,11 @@ mailSent=\u00a77Mail odeslan! markMailAsRead=\u00a7cPokud chces mail oznacit jako precteny, napis /mail clear markedAsAway=\u00a77Jsi oznacen jako "Pryc". markedAsNotAway=\u00a77Jiz nejsi oznacen jako "Pryc". +matchingIPAddress=\u00a76The following players previously logged in from that IP address: maxHomes=Nemuzes si nastavit vice nez {0} domovu. mayNotJail=\u00a7cNesmis uveznit tuto postavu me=ja +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minuta minutes=minuty missingItems=Nemas {0}x {1}. @@ -220,8 +261,12 @@ moneyTaken={0} bylo odebrano z tveho uctu. month=mesic months=mesice moreThanZero=Mnozstvi musi byt vetsi nez 0. +moveSpeed=\u00a77Set {0} speed to {1} for {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. muteExempt=\u00a7cTohoto hrace nemuzes umlcet. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1} mutedPlayer=Hrac {0} byl umlcen. mutedPlayerFor=Hrac {0} umlcen za {1}. mutedUserSpeaks={0} se pokusil promluvit, ale je umlcen. @@ -237,6 +282,7 @@ nickSet=\u00a77Nyni mas nickname: \u00a7c{0} noAccessCommand=\u00a7cNemas povoleni na tento prikaz. noAccessPermission=\u00a7cNemas povoleni k tomuto {0}. noBreakBedrock=Nemas opravneni nicit bedrock. +noChapterMeta=\u00a74You do not have permission to create dynamic books. noDestroyPermission=\u00a7cNemas povoleni nicit ten {0}. noDurability=\u00a7cThis item does not have a durability. noGodWorldWarning=\u00a7cVarovani! God-mode je v tomto svete zakazan. @@ -246,6 +292,9 @@ noHomeSetPlayer=Hrac nema nastaveny zadny domov. noKitPermission=\u00a7cPotrebujes \u00a7c{0}\u00a7c permission, aby jsi mohl pouzit tento kit. noKits=\u00a77Nejsou zadne dostupne kity. noMail=Nemas zadny mail. +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. noMotd=\u00a7cNeni zadna zprava dne. noNewMail=\u00a77Nemas zadny novy mail. noPendingRequest=Nemas zadne neuzavrene zadosti. @@ -268,9 +317,11 @@ now=nyni nuke=Prsi na tebe smrt :) numberRequired=Hlupaku, musis vyplnit cislo. onlyDayNight=/time podporuje pouze day/night. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). onlyPlayers=Pouze hraci ve hre mohou pouzit: {0}. onlySunStorm=/weather podporuje pouze sun/storm. orderBalances=Usporadavam bohatstvi {0} hracu, prosim vydrz ... +oversizedTempban=\u00a74You may not ban a player for this period of time. pTimeCurrent=\u00a7eCas hrace u00a7f je {1}. //??? pTimeCurrentFixed=\u00a7eCas hrace {0} u00a7f je nastaven na {1}. pTimeNormal=\u00a7eCas hrace {0}\u00a7f je normalni a souhlasi s casem serveru. @@ -293,9 +344,15 @@ playerNeverOnServer=\u00a7cHrac {0} nebyl nikdy na serveru. playerNotFound=\u00a7cHrac nenalezen. playerUnmuted=\u00a77Byl jsi odmlcen. pong=Pong! -possibleWorlds=\u00a77Mozne svety jsou cisla 0 az {0}. +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) +possibleWorlds=\u00a77Mozne svety jsou cisla 0 az {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. powerToolAir=Prikaz nemuze byt spojen se vzduchem. -powerToolAlreadySet=Prikaz \u00a7c{0}\u00a7f je jiz spojen s {1}. +powerToolAlreadySet=Prikaz \u00a7c{0}\u00a7f je jiz spojen s {1}. powerToolAttach=\u00a7c{0}\u00a7f prikaz pripsan k {1}. powerToolClearAll=Vsechny mocne nastroje byli smazany. powerToolList=Hrac {1} ma tyto prikazy: \u00a7c{0}\u00a7f. @@ -308,6 +365,16 @@ powerToolsEnabled=Vsechny tve mocne nastroje byli povoleny. protectionOwner=\u00a76[EssentialsProtect] Majitel ochrany: {0} questionFormat=\u00a77[Otazka]\u00a7f {0} readNextPage=Napis /{0} {1} pro precteni dalsi stranky. +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2} +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} reloadAllPlugins=\u00a77Znovu nacteny vsechny pluginy. removed=\u00a77Odstraneno {0} entitit. repair=Uspesne jsi opravil svuj nastroj: \u00a7e{0}. @@ -322,7 +389,10 @@ requestDeniedFrom=\u00a77{0} odmitl tvou zadost o teleport. requestSent=\u00a77Zadost odeslana hraci {0}\u00a77. requestTimedOut=\u00a7cZadost o teleportaci vyprsela. requiredBukkit= * ! * Potrebujete minimalne verzi {0} Bukkitu, stahnete si ji z http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all online players +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all players returnPlayerToJailError=Nastala chyba pri pokusu navraceni hrace {0} do vezeni: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=sekunda seconds=sekundy seenOffline=Hrac {0} je offline od {1} @@ -359,7 +429,9 @@ teleportRequestTimeoutInfo=\u00a77Tato zadost vyprsi za {0} sekund. teleportTop=\u00a77Teleportuji na vrch. teleportationCommencing=\u00a77Teleportace zahajena... teleportationDisabled=\u00a77Teleportace zakazana. +teleportationDisabledFor=\u00a76Teleportation disabled for {0} teleportationEnabled=\u00a77Teleportace povolena. +teleportationEnabledFor=\u00a76Teleportation enabled for {0} teleporting=\u00a77Teleportuji... teleportingPortal=\u00a77Teleportuji pres portal. tempBanned=Docasne zabanovany na dobu {0} @@ -374,6 +446,8 @@ timeSet=Cas nastaven ve vsech svetech. timeSetPermission=\u00a7cNejsi autorizovany ke zmene casu. timeWorldCurrent=Ve svete {0} je prave \u00a73{1} timeWorldSet=Cas byl nastaven na {0} ve: \u00a7c{1} +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. tps=Current TPS = {0} tradeCompleted=\u00a77Vymena kompletni. tradeSignEmpty=Tato cedule jiz nema dostupny material na vymenu. @@ -385,8 +459,6 @@ typeTpaccept=\u00a77Pro prijmuti zadosti napis \u00a7c/tpaccept\u00a77. typeTpdeny=\u00a77Pokud chces odmitnout zadost napis \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Muzes take napsat specificky nazev sveta. unableToSpawnMob=Nemozne spawnout moba. -unbannedIP=Unbanovana IP adresa. -unbannedPlayer=Hrac odbanovan. unignorePlayer=Prestal jsi ignorovat hrace {0}. unknownItemId=Nezname ID itemu: {0} unknownItemInList=Neznamy item {0} v {1} seznamu. @@ -397,10 +469,13 @@ unmutedPlayer=Hrac {0} byl umlcen. unvanished=\u00a7aYou are once again visible. unvanishedReload=\u00a7cA reload has forced you to become visible. upgradingFilesError=Chyba pri updatovani souboru. +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond userDoesNotExist=Uzivatel {0} neexistuje. userIsAway={0} je AFK. userIsNotAway={0} se vratil. userJailed=\u00a77Byl jsi uveznen. +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} pouzil portal pro vychod. userdataMoveBackError=Chyba pri pokusu o presun userdata/{0}.tmp do userdata/{1} userdataMoveError=Chyba pri pokusu o presun userdata/{0} do userdata/{1}.tmp @@ -409,7 +484,9 @@ vanished=\u00a7aYou have now been vanished. versionMismatch=Chyba verzi! Prosim updatuj {0} na stejnou verzi. versionMismatchAll=Chyba verzi! Prosim, updatuj vsechny Essentials .jar na stejnou verzi. voiceSilenced=\u00a77Byl jsi ztisen. +walking=walking warpDeleteError=Vyskytl se problem pri mazani warpu. +warpList={0} warpListPermission=\u00a7cNemas opravneni listovat warpami. warpNotExist=Tento warp neexistuje. warpOverwrite=\u00a7cNemuzes prepsat tento warp. @@ -445,3 +522,22 @@ year=rok years=roky youAreHealed=\u00a77Byl jsi uzdraven. youHaveNewMail=\u00a7cMas {0} zprav!\u00a7f Napis \u00a77/mail read\u00a7f aby jsi si precetl sve zpravy. +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_da.properties b/Essentials/src/messages_da.properties index 7316799613..b4d7a8854c 100644 --- a/Essentials/src/messages_da.properties +++ b/Essentials/src/messages_da.properties @@ -5,10 +5,17 @@ action=* {0} {1} addedToAccount=\u00a7a{0} er blevet tilf\u00f8jet til din konto. addedToOthersAccount=\u00a7a{0} added to {1}\u00a7a account. New balance: {2} +adventure = adventure alertBroke=\u00f8delagde: alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} ved: {3} alertPlaced=placerede: alertUsed=brugte: +antiBuildBreak=\u00a74You are not permitted to break {0} blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with {0}. +antiBuildPlace=\u00a74You are not permitted to place {0} here. +antiBuildUse=\u00a74You are not permitted to use {0}. autoAfkKickReason=Du er blevet kicked for at idle mere end {0} minutter. backAfterDeath=\u00a77Brug /back kommandoen for at teleportere til dit d\u00f8dspunkt. backUsageMsg=\u00a77Teleporterer til tidligere placering. @@ -18,14 +25,17 @@ backupStarted=Backup startet balance=\u00a77Saldo: {0} balanceTop=\u00a77Top saldoer ({0}) banExempt=\u00a7cDu kan ikke banne den p\u00e5g\u00e6ldende spiller. -banIpAddress=\u00a77Bannede IP addresse -bannedIpsFileError=Fejl i afl\u00e6sning af banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt ikke fundet -bannedPlayersFileError=Fejl i afl\u00e6sning af banned-players.txt -bannedPlayersFileNotFound=banned-players.txt ikke fundet +banFormat=Banned: {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7cFejl i generering af stort tr\u00e6. Pr\u00f8v igen p\u00e5 gr\u00e6s eller jord. bigTreeSuccess= \u00a77Stort tr\u00e6 bygget. blockList=Essentials relayed the following commands to another plugin: +bookAuthorSet=\u00a76Author of the book set to {0} +bookLocked=\u00a7cThis book is now locked +bookTitleSet=\u00a76Title of the book set to {0} broadcast=[\u00a7cMeddelelse\u00a7f]\u00a7a {0} buildAlert=\u00a7cDu har ikke tilladelse til at bygge bukkitFormatChanged=Bukkit versionsformat er \u00e6ndret. Versionen er ikke checket. @@ -34,16 +44,18 @@ canTalkAgain=\u00a77Du kan nu snakke igen. cantFindGeoIpDB=Kan ikke finde GeoIP database! cantReadGeoIpDB=Fejl ved afl\u00e6sning af GeoIP database! cantSpawnItem=\u00a7cDu har ikke tilladelse til at skabe tingen.{0} -chatTypeLocal=[L] chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. commandFailed=Kommandoen {0} fejlede: commandHelpFailedForPlugin=Fejl ved hentning af hj\u00e6lp til: {0} commandNotLoaded=\u00a7cKommando {0} er ikke indl\u00e6st korrekt. compassBearing=\u00a77B\u00e6rer: {0} ({1} grader). (Oversat korrekt?) configFileMoveError=Kunne ikke flytte config.yml til backup placering. configFileRenameError=Kunne ikke omd\u00f8be temp fil til config.yml -connectedPlayers=Tilsluttede spillere: +connectedPlayers=\u00a77Tilsluttede spillere\u00a7r connectionFailed=Kunne ikke \u00e5bne forbindelse. cooldownWithMessage=\u00a7cCooldown: {0} corruptNodeInConfig=\u00a74Notits: Din konfigurationsfil har en korrupt {0} linje. @@ -61,6 +73,9 @@ deleteHome=\u00a77Home {0} er blevet fjernet. deleteJail=\u00a77F\u00e6ngsel {0} er fjernet. deleteWarp=\u00a77Warp {0} er fjernet. deniedAccessCommand={0} blev n\u00e6gtet adgang til kommandoen. +denyBookEdit=\u00a74You cannot unlock this book +denyChangeAuthor=\u00a74You cannot change the author of this book +denyChangeTitle=\u00a74You cannot change the title of this book dependancyDownloaded=[Essentials] Dependancy {0} downloaded successfully. dependancyException=[Essentials] En fejl opstod ved fors\u00c3\u00b8g p\u00c3\u00a5 at downloade en N\u00c3\u0098DVENDIGHED?! dependancyNotFound=[Essentials] En p\u00c3\u00a5kr\u00c3\u00a6vet N\u00c3\u0098DVENDIGHED!? blev ikke fundet; downloader nu. @@ -71,10 +86,12 @@ destinationNotSet=Destination ikke sat disableUnlimited=\u00a77Deaktiverede ubergr\u00e6nset placering af {0} for {1}. disabled=deaktiveret disabledToSpawnMob=Skabelse af denne mob er deaktiveret i configfilen. +distance=\u00a76Distance: {0} dontMoveMessage=\u00a77Teleportering vil begynde om {0}. Bev\u00e6g dig ikke. downloadingGeoIp=Downloader GeoIP database... det her kan tage et stykke tid (land: 0.6 MB, by: 27MB) duplicatedUserdata=Duplikerede userdata: {0} og {1} durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left +editBookContents=\u00a7eYou may now edit the contents of this book enableUnlimited=\u00a77Giver ubegr\u00e6nset m\u00e6ngde af {0} til {1}. enabled=aktiveret enchantmentApplied = \u00a77Enchantment {0} er blevet tilf\u00c3\u00b8jet til tingen i din h\u00c3\u00a5nd. @@ -98,28 +115,36 @@ false=\u00a74false\u00a7f feed=\u00a77Your appetite was sated. feedOther=\u00a77Satisfied {0}. fileRenameError=Omd\u00c3\u00b8bning af fil {0} fejlede. +fireworkColor=\u00a74You must apply a color to the firework to add an effect +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle flyMode=\u00a77Set fly mode {0} for {1}. flying=flying foreverAlone=\u00a7cDu har ingen til hvem du kan svare. freedMemory=Frigjorde {0} MB. +fullStack=\u00a74You already have a full stack gameMode=\u00a77Satte game mode {0} for {1}. -gcchunks= chunks, -gcentities= entities +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities gcfree=Free memory: {0} MB gcmax=Maximum memory: {0} MB gctotal=Allocated memory: {0} MB geoIpUrlEmpty=GeoIP download url er tom. geoIpUrlInvalid=GeoIP download url er ugyldig. -geoipJoinFormat=Spilleren {0} kommer fra {1} +geoipJoinFormat=\u00a76Spilleren \u00a7c{0} \u00a76kommer fra \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. godDisabledFor=deaktiveret for {0} godEnabledFor=aktiveret for {0} godMode=\u00a77Gud mode {0}. +groupNumber={0} online, for the full list type /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! hatArmor=\u00a7cError, you cannot use this item as a hat! hatEmpty=\u00a7cYou are not wearing a hat. hatFail=\u00a7cYou must have something to wear in your hand. hatPlaced=\u00a7eEnjoy your new hat! +hatRemoved=\u00a7eYour hat has been removed. haveBeenReleased=\u00a77Du er blevet l\u00f8sladt heal=\u00a77Du er blevet healed. +healDead=\u00a74You cannot heal someone who is dead! healOther=\u00a77Healed {0}. helpConsole=For at se hj\u00e6lp fra konsolen, skriv ?. helpFrom=\u00a77Commands from {0}: @@ -128,6 +153,9 @@ helpMatching=\u00a77Commands matching "{0}": helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} helpPages=Side \u00a7c{0}\u00a7f af \u00a7c{1}\u00a7f: helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} +holdBook=\u00a74You are not holding a writable book +holdFirework=\u00a74You must be holding a firework to add effects +holdPotion=\u00a74You must be holding a potion to apply effects to it. holeInFloor=Hul i gulv homeSet=\u00a77Hjem sat. homeSetToBed=\u00a77Dit hjem er nu sat til denne seng. @@ -146,16 +174,23 @@ invRestored=Din inventory er blevet genoprettet. invSee=Du ser {0}''s inventory. invSeeHelp=Brug /invsee for at genoprette din inventory. invalidCharge=\u00a7cUgyldig opladning (korrekt oversat?). +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1} invalidHome=Home {0} doesn't exist +invalidHomeName=\u00a74Invalid home name invalidMob=Ugyldig mob type. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Ugyldig server! invalidSignLine=Linje {0} p\u00e5 skilt er ugyldig. +invalidWarpName=\u00a74Invalid warp name invalidWorld=\u00a7cUgyldig verden. inventoryCleared=\u00a77Inventory ryddet. +inventoryClearedAll=\u00a76Cleared everyone's inventory. inventoryClearedOthers=\u00a7c{0}\u00a77''s inventory ryddet. is=er itemCannotBeSold=Denne ting kan ikke s\u00e6lges til serveren. itemMustBeStacked=Tingen skal handles i stakke. En m\u00e6ngde af 2s ville v\u00e6re to stakke, osv. +itemNames=Item short names: {0} itemNotEnough1=\u00a7cDu har ikke nok af denne ting til at kunne s\u00e6lge. itemNotEnough2=\u00a77Hvis du mente, at du ville s\u00c3\u00a6lge alle ting af den type, brug da /sell tingens-navn itemNotEnough3=\u00a77/sell ting-navn -1 vil s\u00e6lge alle enheder, undtagen \u00c3\u00a9n, osv. @@ -163,32 +198,38 @@ itemSellAir=Fors\u00f8gte du virkelig at s\u00e6lge luft? Kom en ting i h\u00e5n itemSold=\u00a77Solgte til \u00a7c{0} \u00a77({1} {2} ting for {3} pr. stk.) itemSoldConsole={0} solgte {1} til \u00a77{2} \u00a77({3} ting for {4} pr. stk.) itemSpawn=\u00a77Giver {0} af {1} +itemType=Item: {0} - {1} itemsCsvNotLoaded=Kunne ikke loade items.csv. jailAlreadyIncarcerated=\u00a7cSpilleren er allerede i f\u00c3\u00a6ngsel: {0} jailMessage=\u00a7cDu bryder reglerne, du tager straffen. jailNotExist=Det f\u00e6ngsel eksisterer ikke. jailReleased=\u00a77Player \u00a7e{0}\u00a77 befriet fra f\u00c3\u00a6ngslet. jailReleasedPlayerNotify=\u00a77Du er blevet befriet fra f\u00c3\u00a6nglset! -jailSentenceExtended=F\u00c3\u00a6ngselsdom forl\u00c3\u00a6nget til: {0) +jailSentenceExtended=F\u00c3\u00a6ngselsdom forl\u00c3\u00a6nget til: {0} jailSet=\u00a77F\u00e6ngsel {0} er blevet sat. jumpError=Dette vil skade din computer''s hjerne. kickDefault=Kicked fra serveren. kickExempt=\u00a77Du kan ikke kicke denne spiller. kickedAll=\u00a7cKicked all players from server kill=\u00a77dr\u00e6bte {0}. -kitError2=\u00a7cDette kit eksisterer ikke eller er forkert defineret. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitError=\u00a7cDer er ikke nogen gyldige kits. kitErrorHelp=\u00a7cM\u00e5ske mangler en ting en m\u00e6ngde i konfigurationen? Eller m\u00c3\u00a5ske er der nisser p\u00c3\u00a5 spil? kitGive=\u00a77Giver kit til {0} (oversat korrekt?). +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. kitInvFull=\u00a7cDin inventory er fuld, placerer kit p\u00e5 gulvet. +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. kitTimed=\u00a7cDu kan ikke benytte dette kit igen i {0}. kits=\u00a77Kits: {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. lightningSmited=\u00a77Du er blevet ramt af Guds vrede (din admin) lightningUse=\u00a77Kaster lyn efter {0} listAfkTag = \u00a77[AFK]\u00a7f listAmount = \u00a79Der er \u00a7c{0}\u00a79 ud af maksimum\u00a7c{1}\u00a79 spillere online. listAmountHidden = \u00a79Der er \u00a7c{0}\u00a77/{1}\u00a79 ud af maksimum \u00a7c{2}\u00a79 spillere online. -listGroupTag={0}\u00a7f: +listGroupTag={0}\u00a7f: listHiddenTag = \u00a77[HIDDEN]\u00a7f loadWarpError=Kunne ikke l\u00c3\u00a6se warp {0} localFormat=Local: <{0}> {1} @@ -198,9 +239,11 @@ mailSent=\u00a77Flaskepot sendt! markMailAsRead=\u00a7cFor at markere din flaskepost som l\u00e6st, skriv /mail clear markedAsAway=\u00a77Du er nu markeret som v\u00c3\u00a6rende ikke tilstede. markedAsNotAway=\u00a77Du er ikke l\u00e6ngere markeret som v\u00c3\u00a6rende ikke tilstede. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: maxHomes=Du kan ikke have mere end {0} hjem. mayNotJail=\u00a7cDu kan ikke smide denne person i f\u00c3\u00a6ngsel. me=mig +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minut minutes=minutter missingItems=Du har ikke {0}x {1}. @@ -215,8 +258,12 @@ moneyTaken={0} blev taget fra din bankkonto. month=m\u00e5nede months=m\u00e5neder moreThanZero=M\u00e6ngder skal v\u00e6re st\u00f8rre end 0. +moveSpeed=\u00a77Set {0} speed to {1} for {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. muteExempt=\u00a7cDu kan ikke mute denne spiller. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1} mutedPlayer=Spiller {0} muted. mutedPlayerFor=Spiller {0} muted i {1}. mutedUserSpeaks={0} pr\u00f8vede at snakke, men er muted. @@ -232,6 +279,7 @@ nickSet=\u00a77Dit nickname er nu \u00a7c{0} noAccessCommand=\u00a7cDu har ikke adgang til denne kommando. noAccessPermission=\u00a7cDu har ikke tilladelse til at f\u00e5 adgang til {0}. noBreakBedrock=You are not allowed to destroy bedrock. +noChapterMeta=\u00a74You do not have permission to create dynamic books. noDestroyPermission=\u00a7cDu har ikke tilladelse til at \u00f8del\u00e6gge {0}. noDurability=\u00a7cThis item does not have a durability. noGodWorldWarning=\u00a7cAdvarsel! God mode er sl\u00c3\u00a5et fra i denne verden. @@ -241,6 +289,9 @@ noHomeSetPlayer=Spilleren har ikke sat et hjem. noKitPermission=\u00a7cDu har brug for \u00a7c{0}\u00a7c permission for at bruge dette kit. noKits=\u00a77Der er ikke nogen kits tilg\u00e6ngelige endnu noMail=Du har ikke noget flaskepost. +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. noMotd=\u00a7cDer er ingen Message of the day. noNewMail=\u00a77Du har ingen ny flaskepost. noPendingRequest=Du har ikke en ventende anmodning. @@ -263,9 +314,11 @@ now=nu nuke=May death rain upon them numberRequired=Et nummer skal v\u00e6re, din tardo. onlyDayNight=/time underst\u00f8tter kun day/night. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). onlyPlayers=Kun in-game spillere kan bruge {0}. onlySunStorm=/weather underst\u00c3\u00b8tter kun sun/storm. orderBalances=Tjekker saldoer af {0} spillere, vent venligst... +oversizedTempban=\u00a74You may not ban a player for this period of time. pTimeCurrent=\u00a7e{0}''s\u00a7f Tiden er {1}. pTimeCurrentFixed=\u00a7e{0}''s\u00a7f Tiden er fastsat til {1}. pTimeNormal=\u00a7e{0}''s\u00a7f Tiden er normal og matcher serveren. @@ -282,13 +335,19 @@ playerInJail=\u00a7cSpilleren er allerede i f\u00e6ngsel {0}. playerJailed=\u00a77Spilleren {0} f\u00e6ngslet. playerJailedFor= \u00a77Spilleren {0} f\u00e6ngslet i {1}. playerKicked=\u00a7cSpiller {0} kicked {1} for {2}. -playerMuted=\u00a77Du er blevet muted! +playerMuted=\u00a77Du er blevet muted! playerMutedFor=\u00a77Du er blevet muted som f\u00c3\u00b8lge af: {0} playerNeverOnServer=\u00a7cSpilleren {0} har aldrig v\u00c3\u00a6ret p\u00e5 denne server. playerNotFound=\u00a7cSpilleren ikke fundet. playerUnmuted=\u00a77Du er blevet unmuted. pong=Pong! +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) possibleWorlds=\u00a77Mulige verdener er numrene fra 0 til {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. powerToolAir=Kommando kan ikke blive p\u00c3\u00a5lagt luft. powerToolAlreadySet=Kommandoen \u00a7c{0}\u00a7f er allerede p\u00c3\u00a5lagt {1}. powerToolAttach=\u00a7c{0}\u00a7f kommando p\u00c3\u00a5lagt {1}. @@ -303,6 +362,16 @@ powerToolsEnabled= Alle dine power tools er blevet aktiveret. protectionOwner=\u00a76[EssentialsProtect] Protection owner: {0} questionFormat=\u00a77[Sp\u00f8rgsm\u00e5l]\u00a7f {0} readNextPage=Skriv /{0} {1} for at l\u00c3\u00a6se n\u00c3\u00a6ste side. +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2} +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} reloadAllPlugins=\u00a77Reload alle plugins. removed=\u00a77Removed {0} entities. repair=Du reparerede \u00a7e{0}. Du s\u00c3\u00a5'' dygtig! @@ -317,7 +386,10 @@ requestDeniedFrom=\u00a77{0} afviste din anmodning om teleport. requestSent=\u00a77Anmodning sendt til {0}\u00a77. requestTimedOut=\u00a7cTeleport request has timed out requiredBukkit= * ! * You need atleast build {0} of CraftBukkit, download it from http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all online players +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all players returnPlayerToJailError=Error occurred when trying to return player {0} to jail: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=sekund seconds=sekunder seenOffline=Spilleren {0} har v\u00c3\u00a6ret offline i {1} @@ -354,7 +426,9 @@ teleportRequestTimeoutInfo=\u00a77This request will timeout after {0} seconds. teleportTop=\u00a77Teleporterer til toppen. teleportationCommencing=\u00a77Teleport begynder... teleportationDisabled=\u00a77Teleport deaktiveret. +teleportationDisabledFor=\u00a76Teleportation disabled for {0} teleportationEnabled=\u00a77Teleport aktiveret. +teleportationEnabledFor=\u00a76Teleportation enabled for {0} teleporting=\u00a77Teleporterer... teleportingPortal=\u00a77Teleporterede via portal. tempBanned=Midlertidigt bannet fra serveren for {0} @@ -369,6 +443,8 @@ timeSet=Tid \u00c3\u00a6ndret i alle verdener. timeSetPermission=\u00a7cDu har ikke tilladelse til at \u00c3\u00a6ndre tiden. timeWorldCurrent=Tiden p\u00c3\u00a5 nuv\u00c3\u00a6rende tidspunkt i {0} er \u00a73{1} timeWorldSet=Tiden blev \u00c3\u00a6ndret til {0} i: \u00a7c{1} +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. tps=Current TPS = {0} tradeCompleted=\u00a77Handel gennemf\u00f8rt. tradeSignEmpty=Handelsskiltet har udsolgt! @@ -380,8 +456,6 @@ typeTpaccept=\u00a77For at teleportere, skriv \u00a7c/tpaccept\u00a77. typeTpdeny=\u00a77For at n\u00e6gte denne anmodning om teleport, skriv \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Du kan ogs\u00e5 skrive navnet p\u00e5 en specifik verden. unableToSpawnMob=Kunne ikke spawne mob. -unbannedIP=Tilgav IP addressen; er ikke l\u00e6ngere bannet. -unbannedPlayer=Tilgav spilleren; er ikke l\u00e6ngere bannet. unignorePlayer=Du ignorerer ikke spiller {0} mere. unknownItemId=Ukendt ting id: {0} unknownItemInList=Ukendt ting {0} i {1} listen. @@ -392,10 +466,13 @@ unmutedPlayer=Spilleren {0} unmuted. unvanished=\u00a7aYou are once again visible. unvanishedReload=\u00a7cA reload has forced you to become visible. upgradingFilesError=Fejl under opgradering af filerne. +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond userDoesNotExist=Brugeren {0} eksisterer ikke. userIsAway={0} er nu AFK. Skub ham i havet eller bur ham inde! userIsNotAway={0} er ikke l\u00e6ngere AFK. userJailed=\u00a77Du er blevet f\u00e6ngslet. +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} brugte en eksisterende udgangsportal. userdataMoveBackError=Kunne ikke flytte userdata/{0}.tmp til userdata/{1} userdataMoveError=Kunne ikke flytte userdata/{0} til userdata/{1}.tmp @@ -404,7 +481,9 @@ vanished=\u00a7aYou have now been vanished. versionMismatch=Versioner matcher ikke! Opdater venligst {0} til den nyeste version. versionMismatchAll=Versioner matcher ikke! Opdater venligst alle Essentials jar-filer til samme version. voiceSilenced=\u00a77Din stemme er blevet gjort stille. +walking=walking warpDeleteError=Ah, shit; kunne sgu ikke fjerne warp-filen. Jeg giver en \u00c3\u00b8l i lufthavnen. +warpList={0} warpListPermission=\u00a7cDu har ikke tilladelse til at vise listen over warps. warpNotExist=Den warp eksisterer ikke. warpOverwrite=\u00a7cYou cannot overwrite that warp. @@ -440,5 +519,22 @@ year=\u00e5r years=\u00e5r youAreHealed=\u00a77Du er blevet healed. Halleluja! youHaveNewMail=\u00a7cDu har {0} flaskeposter!\u00a7f Type \u00a77/mail read for at se din flaskepost. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_de.properties b/Essentials/src/messages_de.properties index b6e84fb66a..71964aa0ec 100644 --- a/Essentials/src/messages_de.properties +++ b/Essentials/src/messages_de.properties @@ -5,10 +5,17 @@ action=* {0} {1} addedToAccount=\u00a7a{0} wurden zu deiner Geldb\u00f6rse hinzugef\u00fcgt. addedToOthersAccount=\u00a7a{0} added to {1}\u00a7a account. New balance: {2} +adventure = adventure alertBroke=zerst\u00f6rt: alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} bei: {3} alertPlaced=platziert: alertUsed=benutzt: +antiBuildBreak=\u00a74You are not permitted to break {0} blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with {0}. +antiBuildPlace=\u00a74You are not permitted to place {0} here. +antiBuildUse=\u00a74You are not permitted to use {0}. autoAfkKickReason=Du wurdest gekickt, weil du f\u00fcr {0} Minuten inaktiv warst. backAfterDeath=\u00a77Benutze den Befehl /back um zu deinem Todespunkt zur\u00fcck zu kehren. backUsageMsg=\u00a77Kehre zur letzten Position zur\u00fcck. @@ -18,14 +25,17 @@ backupStarted=Backup gestartet balance=\u00a77Geldb\u00f6rse: {0} balanceTop=\u00a77Top Guthaben ({0}) banExempt=\u00a7cDu kannst diesen Spieler nicht sperren. -banIpAddress=\u00a77IP-Adresse gesperrt. -bannedIpsFileError=Fehler beim Lesen von banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt nicht gefunden -bannedPlayersFileError=Fehler beim Lesen von banned-players.txt -bannedPlayersFileNotFound=banned-players.txt nicht gefunden +banFormat=Banned: {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7cFehler beim Pflanzen eines grossen Baums. Versuch es auf Gras oder Dreck. bigTreeSuccess= \u00a77Grosser Baum gepflanzt. blockList=Essentials relayed the following commands to another plugin: +bookAuthorSet=\u00a76Author of the book set to {0} +bookLocked=\u00a7cThis book is now locked +bookTitleSet=\u00a76Title of the book set to {0} broadcast=[\u00a7cRundruf\u00a7f]\u00a7a {0} buildAlert=\u00a7cDu hast keine Rechte zum Bauen. bukkitFormatChanged=Bukkit-Versionsformat hat sich ge\u00e4ndert. Version nicht kontrolliert. @@ -34,16 +44,18 @@ canTalkAgain=\u00a77Du kannst wieder sprechen. cantFindGeoIpDB=Kann GeoIP-Datenbank nicht finden! cantReadGeoIpDB=Fehler beim Einlesen der GeoIP-Datenbank! cantSpawnItem=\u00a7cDu darfst {0} nicht erzeugen. -chatTypeLocal=[L] chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. commandFailed=Befehl {0} scheiterte: commandHelpFailedForPlugin=Fehler beim Abrufen der Hilfe f\u00fcr: {0} commandNotLoaded=\u00a7cBefehl {0} ist nicht richtig geladen. compassBearing=\u00a77Peilung: {0} ({1} Grad). configFileMoveError=Verschieben von config.yml in den Sicherheitskopien-Ordner gescheitert. configFileRenameError=Verschieben einer tempor\u00e4ren Datei nach config.yml gescheitert. -connectedPlayers=Verbundene Spieler: +connectedPlayers=\u00a77Verbundene Spieler\u00a77 connectionFailed=Fehler beim Verbindungsaufbau. cooldownWithMessage=\u00a7cBeschr\u00e4nkung: {0} corruptNodeInConfig=\u00a74Hinweis: Deine Konfigurationsdatei hat einen ung\u00fcltigen Knoten {0}. @@ -61,6 +73,9 @@ deleteHome=\u00a77Zuhause {0} wurde gel\u00f6scht. deleteJail=\u00a77Gef\u00e4ngnis {0} wurde gel\u00f6scht. deleteWarp=\u00a77Warp-Punkt {0} wurde gel\u00f6scht. deniedAccessCommand={0} hat keinen Zugriff auf diesen Befehl. +denyBookEdit=\u00a74You cannot unlock this book +denyChangeAuthor=\u00a74You cannot change the author of this book +denyChangeTitle=\u00a74You cannot change the title of this book dependancyDownloaded=[Essentials] Abh\u00e4ngigkeit {0} erfolgreich runtergeladen. dependancyException=[Essentials] W\u00e4hrend dem Download von einer Abh\u00e4ngigkeit ist ein Fehler aufgetreten. dependancyNotFound=[Essentials] Eine erforderliche Abh\u00e4ngigkeit wurde nicht gefunde, Download startet jetzt.. @@ -71,10 +86,12 @@ destinationNotSet=Ziel nicht gesetzt disableUnlimited=\u00a77Deaktiviere unendliches Platzieren von {0} f\u00fcr {1}. disabled=deaktiviert disabledToSpawnMob=Spawning this mob was disabled in the config file. +distance=\u00a76Distance: {0} dontMoveMessage=\u00a77Teleportvorgang startet in {0}. Beweg dich nicht. downloadingGeoIp=Lade GeoIP-Datenbank ... dies kann etwas dauern (country: 0.6 MB, city: 20MB) duplicatedUserdata=Doppelte Datei in userdata: {0} und {1} durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left +editBookContents=\u00a7eYou may now edit the contents of this book enableUnlimited=\u00a77Gebe {1} unendliche Mengen von {0}. enabled=aktiviert enchantmentApplied = \u00a77The enchantment {0} has been applied to your item in hand. @@ -98,28 +115,36 @@ false=\u00a74false\u00a7f feed=\u00a77Your appetite was sated. feedOther=\u00a77Satisfied {0}. fileRenameError=Umbenennen von {0} gescheitert. +fireworkColor=\u00a74You must apply a color to the firework to add an effect +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle flyMode=\u00a77Set fly mode {0} for {1}. flying=flying foreverAlone=\u00a7cDu hast niemanden, dem du antworten kannst. freedMemory={0} MB frei gemacht. +fullStack=\u00a74You already have a full stack gameMode=\u00a77Set game mode {0} for {1}. -gcchunks= Chunks, -gcentities= Einheiten +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities gcfree=Freier Speicher: {0} MB gcmax=Maximaler Speicher: {0} MB gctotal=Reservierter Speicher: {0} MB geoIpUrlEmpty=GeoIP Download-URL ist leer. geoIpUrlInvalid=GeoIP Download-URL ist ung\u00fcltig. -geoipJoinFormat=Spieler {0} kommt aus {1} +geoipJoinFormat=\u00a76Spieler \u00a7c{0} \u00a76kommt aus \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. godDisabledFor=deaktiviert f\u00fcr {0} godEnabledFor=aktiviert f\u00fcr {0} godMode=\u00a77Unsterblichkeit {0}. +groupNumber={0} online, for the full list type /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! hatArmor=\u00a7cError, you cannot use this item as a hat! hatEmpty=\u00a7cSie tragen keinen Hut. hatFail=\u00a7cYou must have something to wear in your hand. hatPlaced=\u00a7eEnjoy your new hat! +hatRemoved=\u00a7eYour hat has been removed. haveBeenReleased=\u00a77Du wurdest frei gelassen. heal=\u00a77Du wurdest geheilt. +healDead=\u00a74You cannot heal someone who is dead! healOther=\u00a77{0} geheilt. helpConsole=Um die Hilfe der Konsole zu sehen, schreibe ?. helpFrom=\u00a77Commands from {0}: @@ -128,6 +153,9 @@ helpMatching=\u00a77Commands matching "{0}": helpOp=\u00a7c[Hilfe]\u00a7f \u00a77{0}:\u00a7f {1} helpPages=Seite \u00a7c{0}\u00a7f von \u00a7c{1}\u00a7f: helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} +holdBook=\u00a74You are not holding a writable book +holdFirework=\u00a74You must be holding a firework to add effects +holdPotion=\u00a74You must be holding a potion to apply effects to it. holeInFloor=Loch im Boden homeSet=\u00a77Zuhause gesetzt. homeSetToBed=\u00a77Dein Zuhause ist nun an diesem Bett. @@ -146,16 +174,23 @@ invRestored=Dein Inventar wurde wieder hergestellt. invSee=Du siehst das Inventar von {0}. invSeeHelp=Benutze /invsee um dein Inventar wiederherzustellen. invalidCharge=\u00a7cUng\u00fcltige Verf\u00fcgung. +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1} invalidHome=Home {0} doesn't exist +invalidHomeName=\u00a74Invalid home name invalidMob=Ung\u00fcltiger Monstername. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Ung\u00fcltiger Server! invalidSignLine=Die Zeile {0} auf dem Schild ist falsch. +invalidWarpName=\u00a74Invalid warp name invalidWorld=\u00a7cUng\u00fcltige Welt. inventoryCleared=\u00a77Inventar geleert. +inventoryClearedAll=\u00a76Cleared everyone's inventory. inventoryClearedOthers=\u00a77Inventar von \u00a7c{0}\u00a77 geleert. is=ist itemCannotBeSold=Dieser Gegenstand kann nicht verkauft werden. itemMustBeStacked=Gegenstand muss als Stapel verkauft werden. Eine Anzahl von 2s verkauft 2 Stapel usw. +itemNames=Item short names: {0} itemNotEnough1=\u00a7cDu hast nicht genug Gegenst\u00e4nde zum Verkaufen. itemNotEnough2=\u00a77Wenn du alles verkaufen willst, nutze /sell itemname itemNotEnough3=\u00a77/sell itemname -1 verkauft alles bis auf eins usw. @@ -163,32 +198,38 @@ itemSellAir=Du versuchst Luft zu verkaufen? Nimm einen Gegenstand in die Hand. itemSold=\u00a77Verkauft f\u00fcr \u00a7c{0}\u00a77 ({1} {2} Einheiten je {3}) itemSoldConsole={0} verkauft {1} f\u00fcr \u00a77{2}\u00a77 ({3} Einheiten je {4}) itemSpawn=\u00a77Gebe {0}x {1} +itemType=Item: {0} - {1} itemsCsvNotLoaded=Konnte items.csv nicht laden. jailAlreadyIncarcerated=\u00a7cPerson is already in jail: {0} jailMessage=\u00a7cDu hast ein Verbrechen begangen, also hast du Zeit. jailNotExist=Dieses Gef\u00e4ngnis existiert nicht. jailReleased=\u00a77Spieler \u00a7e{0}\u00a77 wurde freigelassen. jailReleasedPlayerNotify=\u00a77Du wurdest freigelassen! -jailSentenceExtended=Gef\u00e4ngnisszeit erweitert auf: {0) +jailSentenceExtended=Gef\u00e4ngnisszeit erweitert auf: {0} jailSet=\u00a77Gef\u00e4ngnis {0} wurde erstellt. jumpError=Das w\u00fcrde deinen Computer \u00fcberlasten. kickDefault=Vom Server geworfen kickExempt=\u00a7cDu kannst diesen Spieler nicht rauswerfen. kickedAll=\u00a7cKicked all players from server kill=\u00a77{0} get\u00f6tet. -kitError2=\u00a7cDiese Ausr\u00fcstung existiert nicht oder ist ung\u00fcltig. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitError=\u00a7cEs gibt keine g\u00fcltigen Ausr\u00fcstungen. kitErrorHelp=\u00a7cEventuell fehlt bei einem Gegenstand die Menge? kitGive=\u00a77Gebe Ausr\u00fcstung {0}. +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. kitInvFull=\u00a7cDein Inventar ist voll, lege Ausr\u00fcstung auf den Boden +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. kitTimed=\u00a7cDu kannst diese Ausr\u00fcstung nicht innerhalb von {0} anfordern. kits=\u00a77Ausr\u00fcstungen: {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. lightningSmited=\u00a77Du wurdest gepeinigt. lightningUse=\u00a77Peinige {0} listAfkTag = \u00a77[Inaktiv]\u00a7f listAmount = \u00a79Es sind \u00a7c{0}\u00a79 von maximal \u00a7c{1}\u00a79 Spielern online. listAmountHidden = \u00a79Es sind \u00a7c{0}\u00a77/{1}\u00a79 von maximal \u00a7c{2}\u00a79 Spielern online. -listGroupTag={0}\u00a7f: +listGroupTag={0}\u00a7f: listHiddenTag = \u00a77[Versteckt]\u00a7f loadWarpError=Fehler beim Laden von Warp-Punkt {0} localFormat=Lokal: <{0}> {1} @@ -198,9 +239,11 @@ mailSent=\u00a77Nachricht gesendet! markMailAsRead=\u00a7cUm deine Nachrichten zu l\u00f6schen, schreibe /mail clear markedAsAway=\u00a77Du wirst als abwesend angezeigt. markedAsNotAway=\u00a77Du wirst nicht mehr als abwesend angezeigt. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: maxHomes=Du kannst nicht mehr als {0} Zuhause setzen. mayNotJail=\u00a7cDu kannst diese Person nicht einsperren. me=mir +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=Minute minutes=Minuten missingItems=Du ben\u00f6tigst {0}x {1}. @@ -215,8 +258,12 @@ moneyTaken={0} wurde aus deiner Geldb\u00f6rse genommen. month=Monat months=Monate moreThanZero=Anzahl muss gr\u00f6sser als 0 sein. +moveSpeed=\u00a77Set {0} speed to {1} for {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. muteExempt=\u00a7cDu darfst diesen Spieler nicht stumm machen. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1} mutedPlayer=Player {0} ist nun stumm. mutedPlayerFor=Player {0} ist nun stumm f\u00fcr {1}. mutedUserSpeaks={0} versuchte zu sprechen, aber ist stumm geschaltet. @@ -226,12 +273,13 @@ nickChanged=Nickname ge\u00e4ndert. nickDisplayName=\u00a77Du musst \u00a7fchange-displayname\u00a7c in der Essentials-Config aktivieren. nickInUse=\u00a7cDieser Name wird bereits verwendet. nickNamesAlpha=\u00a7cNicknamen d\u00fcrfen nur alphanumerische Zeichen enthalten. -nickNoMore=\u00a7Du hast keinen Nicknamen mehr. +nickNoMore=\u00a7cDu hast keinen Nicknamen mehr. nickOthersPermission=\u00a7cDu hast keine Rechte um den Nicknamen von anderen zu \u00e4ndern. nickSet=\u00a77Dein Nickname ist nun \u00a7c{0} noAccessCommand=\u00a7cDu hast keinen Zugriff auf diesen Befehl. noAccessPermission=\u00a7cDu hast keine Rechte, den Block {0} zu \u00f6ffnen. noBreakBedrock=You are not allowed to destroy bedrock. +noChapterMeta=\u00a74You do not have permission to create dynamic books. noDestroyPermission=\u00a7cDu hast keine Rechte, den Block {0} zu zerst\u00f6ren. noDurability=\u00a7cThis item does not have a durability. noGodWorldWarning=\u00a7cWarning! God mode in this world disabled. @@ -241,6 +289,9 @@ noHomeSetPlayer=Spieler hat kein Zuhause gesetzt. noKitPermission=\u00a7cDu brauchst die Berechtigung \u00a7c{0}\u00a7c um diese Ausr\u00fcstung anzufordern. noKits=\u00a77Es sind keine Ausr\u00fcstungen verf\u00fcgbar. noMail=Du hast keine Nachrichten +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. noMotd=\u00a7cEs existiert keine Willkommensnachricht. noNewMail=\u00a77Du hast keine Nachrichten. noPendingRequest=Du hast keine Teleportierungsanfragen. @@ -263,9 +314,11 @@ now=jetzt nuke=May death rain upon them numberRequired=Ein Zahl wird ben\u00f6tigt. onlyDayNight=/time unterst\u00fctzt nur day und night. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). onlyPlayers=Nur Spieler k\u00f6nnen {0} benutzen. onlySunStorm=/weather unterst\u00fctzt nur sun und storm. orderBalances=Ordering balances of {0} users, please wait ... +oversizedTempban=\u00a74You may not ban a player for this period of time. pTimeCurrent=\u00a7e{0}''s\u00a7f time is {1}. pTimeCurrentFixed=\u00a7e{0}''s\u00a7f Zeit wurde zu {1} gesetzt. pTimeNormal=\u00a7e{0}''s\u00a7f Zeit ist normal und entspricht der Serverzeit. @@ -288,7 +341,13 @@ playerNeverOnServer=\u00a7cSpieler {0} war niemals auf diesem Server. playerNotFound=\u00a7cSpieler nicht gefunden. playerUnmuted=\u00a77Du bist nicht mehr stumm. pong=Pong! +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) possibleWorlds=\u00a77M\u00f6gliche Welten sind nummeriet von 0 bis {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. powerToolAir=Befehl kann nicht mit Luft verbunden werden. powerToolAlreadySet=Befehl \u00a7c{0}\u00a7f ist bereits zu {1} hinzugef\u00fcgt. powerToolAttach=Befehl \u00a7c{0}\u00a7f erfolgreich zu {1} hinzugef\u00fcgt. @@ -303,6 +362,16 @@ powerToolsEnabled=Alle deine Powertools wurden aktiviert. protectionOwner=\u00a76[EssentialsProtect] Besitzer dieses Blocks: {0} questionFormat=\u00a77[Frage]\u00a7f {0} readNextPage=Type /{0} {1} to read the next page +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2} +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} reloadAllPlugins=\u00a77Alle plugins neu geladen. removed=\u00a77Removed {0} entities. repair=Du hast erfolgreich deine {0} repariert. @@ -317,7 +386,10 @@ requestDeniedFrom=\u00a77{0} hat deine Teleportierungsanfrage abgelehnt. requestSent=\u00a77Anfrage gesendet an {0}\u00a77. requestTimedOut=\u00a7cTeleport request has timed out requiredBukkit= * ! * You need atleast build {0} of CraftBukkit, download it from http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all online players +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all players returnPlayerToJailError=Error occurred when trying to return player {0} to jail: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=Sekunde seconds=Sekunden seenOffline=Spieler {0} ist offline seit {1} @@ -354,7 +426,9 @@ teleportRequestTimeoutInfo=\u00a77This request will timeout after {0} seconds. teleportTop=\u00a77Teleportiere nach oben. teleportationCommencing=\u00a77Teleportierung gestartet... teleportationDisabled=\u00a77Teleportierung deaktiviert. +teleportationDisabledFor=\u00a76Teleportation disabled for {0} teleportationEnabled=\u00a77Teleportierung aktiviert. +teleportationEnabledFor=\u00a76Teleportation enabled for {0} teleporting=\u00a77Teleportiere... teleportingPortal=\u00a77Teleportiere durch Portal. tempBanned=Zeitlich gesperrt vom Server f\u00fcr {0} @@ -369,6 +443,8 @@ timeSet=Zeit in allen Welten gesetzt. timeSetPermission=\u00a7cDu hast keine Berechtigung die Zeit zu \u00e4ndern. timeWorldCurrent=Die momentane Zeit in {0} ist \u00a73{1} timeWorldSet=Die Zeit in \u00a7c{1}\u00a7f wurde zu {0} gesetzt. +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. tps=Current TPS = {0} tradeCompleted=\u00a77Handel abgeschlossen. tradeSignEmpty=Der Bestand des Trade-Schild ist aufgebraucht. @@ -380,8 +456,6 @@ typeTpaccept=\u00a77Um zu teleportieren, schreibe \u00a7c/tpaccept\u00a77. typeTpdeny=\u00a77Um diese Anfrage abzulehnen, schreibe \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Du kannst auch den Namen der Welt eingeben. unableToSpawnMob=Fehler beim Erzeugen eines Monster. -unbannedIP=Verbannung von IP-Adresse r\u00fcckg\u00e4ngig gemacht. -unbannedPlayer=Verbannung von Spieler r\u00fcckg\u00e4ngig gemacht. unignorePlayer=Du ignorierst Spieler {0} nicht mehr. unknownItemId=Unbekannte Item-Id: {0} unknownItemInList=Unbekannter Gegenstand {0} in Liste {1}. @@ -392,10 +466,13 @@ unmutedPlayer=Spieler {0} ist nicht mehr stumm. unvanished=\u00a7aYou are once again visible. unvanishedReload=\u00a7cA reload has forced you to become visible. upgradingFilesError=Fehler beim Aktualisieren der Dateien +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond userDoesNotExist=Spieler {0} existiert nicht. userIsAway={0} ist abwesend. userIsNotAway={0} ist wieder da. userJailed=\u00a77Du wurdest eingesperrt. +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} benutzt ein vorhandenes Ausgangsportal. userdataMoveBackError=Verschieben von userdata/{0}.tmp nach userdata/{1} gescheitert. userdataMoveError=Verschieben von userdata/{0} nach userdata/{1}.tmp gescheitert. @@ -404,7 +481,9 @@ vanished=\u00a7aYou have now been vanished. versionMismatch=Versionen nicht identisch! Bitte aktualisiere {0}. versionMismatchAll=Versionen ungleich! Bitte aktualisiere alle Essentials jars auf die gleiche Version. voiceSilenced=\u00a77Du bist stumm +walking=walking warpDeleteError=Fehler beim L\u00f6schen der Warp-Datei. +warpList={0} warpListPermission=\u00a7cDu hast keine Berechtigung, die Warp-Punkte anzuzeigen. warpNotExist=Warp-Punkt existiert nicht. warpOverwrite=\u00a7cYou cannot overwrite that warp. @@ -440,5 +519,22 @@ year=Jahr years=Jahre youAreHealed=\u00a77Du wurdest geheilt. youHaveNewMail=\u00a7cDu hast {0} Nachrichten!\u00a7f Schreibe \u00a77/mail read\u00a7f um deine Nachrichten anzuzeigen. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_en.properties b/Essentials/src/messages_en.properties index 6f0d479900..3956494263 100644 --- a/Essentials/src/messages_en.properties +++ b/Essentials/src/messages_en.properties @@ -2,443 +2,539 @@ # Single quotes have to be doubled: '' # Translations start here # by: -action=* {0} {1} +action=\u00a75* {0} \u00a75{1} addedToAccount=\u00a7a{0} has been added to your account. addedToOthersAccount=\u00a7a{0} added to {1}\u00a7a account. New balance: {2} +adventure= adventure alertBroke=broke: -alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} at: {3} +alertFormat=\u00a73[{0}] \u00a7r {1} \u00a76 {2} at: {3} alertPlaced=placed: alertUsed=used: +antiBuildBreak=\u00a74You are not permitted to break\u00a7c {0} \u00a74blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with\u00a7c {0}\u00a74. +antiBuildPlace=\u00a74You are not permitted to place\u00a7c {0} \u00a74here. +antiBuildUse=\u00a74You are not permitted to use\u00a7c {0}\u00a74. autoAfkKickReason=You have been kicked for idling more than {0} minutes. -backAfterDeath=\u00a77Use the /back command to return to your death point. -backUsageMsg=\u00a77Returning to previous location. -backupDisabled=An external backup script has not been configured. -backupFinished=Backup finished -backupStarted=Backup started -balance=\u00a77Balance: {0} -balanceTop=\u00a77Top balances ({0}) -banExempt=\u00a7cYou can not ban that player. -banIpAddress=\u00a77Banned IP address -bannedIpsFileError=Error reading banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt not found -bannedPlayersFileError=Error reading banned-players.txt -bannedPlayersFileNotFound=banned-players.txt not found -bigTreeFailure=\u00a7cBig tree generation failure. Try again on grass or dirt. -bigTreeSuccess= \u00a77Big tree spawned. -blockList=Essentials relayed the following commands to another plugin: -broadcast=[\u00a7cBroadcast\u00a7f]\u00a7a {0} -buildAlert=\u00a7cYou are not permitted to build +backAfterDeath=\u00a76Use the /back command to return to your death point. +backUsageMsg=\u00a76Returning to previous location. +backupDisabled=\u00a74An external backup script has not been configured. +backupFinished=\u00a76Backup finished. +backupStarted=\u00a76Backup started. +balance=\u00a7aBalance:\u00a7c {0} +balanceTop=\u00a76Top balances ({0}) +banExempt=\u00a74You can not ban that player. +banFormat=\u00a74Banned:\n\u00a7r{0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! +bigTreeFailure=\u00a74Big tree generation failure. Try again on grass or dirt. +bigTreeSuccess= \u00a76Big tree spawned. +blockList=\u00a76Essentials relayed the following commands to another plugin: +bookAuthorSet=\u00a76Author of the book set to {0}. +bookLocked=\u00a76This book is now locked. +bookTitleSet=\u00a76Title of the book set to {0}. +broadcast=\u00a7r\u00a76[\u00a74Broadcast\u00a76]\u00a7a {0} +buildAlert=\u00a74You are not permitted to build. bukkitFormatChanged=Bukkit version format changed. Version not checked. -burnMsg=\u00a77You set {0} on fire for {1} seconds. -canTalkAgain=\u00a77You can talk again +burnMsg=\u00a76You set\u00a7c {0} \u00a76on fire for\u00a7c {1} seconds\u00a76. +canTalkAgain=\u00a76You can now talk again. cantFindGeoIpDB=Can't find GeoIP database! cantReadGeoIpDB=Failed to read GeoIP database! -cantSpawnItem=\u00a7cYou are not allowed to spawn the item {0} -chatTypeLocal=[L] +cantSpawnItem=\u00a74You are not allowed to spawn the item\u00a7c {0}\u00a74. chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. commandFailed=Command {0} failed: -commandHelpFailedForPlugin=Error getting help for: {0} -commandNotLoaded=\u00a7cCommand {0} is improperly loaded. -compassBearing=\u00a77Bearing: {0} ({1} degrees). +commandHelpFailedForPlugin=Error getting help for plugin: {0} +commandNotLoaded=\u00a74Command {0} is improperly loaded. +compassBearing=\u00a76Bearing: {0} ({1} degrees). configFileMoveError=Failed to move config.yml to backup location. -configFileRenameError=Failed to rename temp file to config.yml -connectedPlayers=Connected players: +configFileRenameError=Failed to rename temp file to config.yml. +connectedPlayers=\u00a76Connected players\u00a7r connectionFailed=Failed to open connection. -cooldownWithMessage=\u00a7cCooldown: {0} +cooldownWithMessage=\u00a74Cooldown: {0} corruptNodeInConfig=\u00a74Notice: Your configuration file has a corrupt {0} node. -couldNotFindTemplate=Could not find template {0} +couldNotFindTemplate=\u00a74Could not find template {0} creatingConfigFromTemplate=Creating config from template: {0} creatingEmptyConfig=Creating empty config: {0} creative=creative currency={0}{1} -currentWorld=Current World: {0} +currentWorld=\u00a76Current World:\u00a7c {0} day=day days=days defaultBanReason=The Ban Hammer has spoken! deleteFileError=Could not delete file: {0} -deleteHome=\u00a77Home {0} has been removed. -deleteJail=\u00a77Jail {0} has been removed. -deleteWarp=\u00a77Warp {0} has been removed. -deniedAccessCommand={0} was denied access to command. -dependancyDownloaded=[Essentials] Dependancy {0} downloaded successfully. -dependancyException=[Essentials] An error occurred when trying to download a dependacy -dependancyNotFound=[Essentials] A required dependancy was not found, downloading now. -depth=\u00a77You are at sea level. -depthAboveSea=\u00a77You are {0} block(s) above sea level. -depthBelowSea=\u00a77You are {0} block(s) below sea level. -destinationNotSet=Destination not set -disableUnlimited=\u00a77Disabled unlimited placing of {0} for {1}. +deleteHome=\u00a76Home\u00a7c {0} \u00a76has been removed. +deleteJail=\u00a76Jail\u00a7c {0} \u00a76has been removed. +deleteWarp=\u00a76Warp\u00a7c {0} \u00a76has been removed. +deniedAccessCommand=\u00a7c{0} \u00a74was denied access to command. +denyBookEdit=\u00a74You cannot unlock this book. +denyChangeAuthor=\u00a74You cannot change the author of this book. +denyChangeTitle=\u00a74You cannot change the title of this book. +dependancyDownloaded=[Essentials] Dependency {0} downloaded successfully. +dependancyException=[Essentials] An error occurred when trying to download a dependency. +dependancyNotFound=[Essentials] A required dependency was not found, downloading now. +depth=\u00a76You are at sea level. +depthAboveSea=\u00a76You are\u00a7c {0} \u00a76block(s) above sea level. +depthBelowSea=\u00a76You are\u00a7c {0} \u00a76block(s) below sea level. +destinationNotSet=Destination not set! +disableUnlimited=\u00a76Disabled unlimited placing of\u00a7c {0} \u00a76for {1}. disabled=disabled -disabledToSpawnMob=Spawning this mob was disabled in the config file. -dontMoveMessage=\u00a77Teleportation will commence in {0}. Don''t move. -downloadingGeoIp=Downloading GeoIP database ... this might take a while (country: 0.6 MB, city: 20MB) -duplicatedUserdata=Duplicated userdata: {0} and {1} -durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left -enableUnlimited=\u00a77Giving unlimited amount of {0} to {1}. +disabledToSpawnMob=\u00a74Spawning this mob was disabled in the config file. +distance=\u00a76Distance: {0} +dontMoveMessage=\u00a76Teleportation will commence in\u00a7c {0}\u00a76. Don''t move. +downloadingGeoIp=Downloading GeoIP database... this might take a while (country: 0.6 MB, city: 20MB) +duplicatedUserdata=Duplicated userdata: {0} and {1}. +durability=\u00a76This tool has \u00a7c{0}\u00a76 uses left +editBookContents=\u00a7eYou may now edit the contents of this book. +enableUnlimited=\u00a76Giving unlimited amount of\u00a7c {0} \u00a76to {1}. enabled=enabled -enchantmentApplied = \u00a77The enchantment {0} has been applied to your item in hand. -enchantmentNotFound = \u00a7cEnchantment not found -enchantmentPerm = \u00a7cYou do not have the permission for {0} -enchantmentRemoved = \u00a77The enchantment {0} has been removed from your item in hand. -enchantments = \u00a77Enchantments: {0} +enchantmentApplied= \u00a76The enchantment\u00a7c {0} \u00a76has been applied to your item in hand. +enchantmentNotFound= \u00a74Enchantment not found! +enchantmentPerm= \u00a74You do not have the permission for\u00a7c {0}\u00a74. +enchantmentRemoved= \u00a76The enchantment\u00a7c {0} \u00a76has been removed from your item in hand. +enchantments= \u00a76Enchantments:\u00a7r {0} errorCallingCommand=Error calling command /{0} -errorWithMessage=\u00a7cError: {0} +errorWithMessage=\u00a7cError:\u00a74 {0} essentialsHelp1=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, go to http://tiny.cc/EssentialsChat essentialsHelp2=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, either type /essentialshelp in game or go to http://tiny.cc/EssentialsChat -essentialsReload=\u00a77Essentials Reloaded {0} -exp=\u00a7c{0} \u00a77has\u00a7c {1} \u00a77exp (level\u00a7c {2}\u00a77) and needs\u00a7c {3} \u00a77more exp to level up. -expSet=\u00a7c{0} \u00a77now has\u00a7c {1} \u00a77exp. -extinguish=\u00a77You extinguished yourself. -extinguishOthers=\u00a77You extinguished {0}. -failedToCloseConfig=Failed to close config {0} -failedToCreateConfig=Failed to create config {0} -failedToWriteConfig=Failed to write config {0} -false=\u00a74false\u00a7f -feed=\u00a77Your appetite was sated. -feedOther=\u00a77Satisfied {0}. -fileRenameError=Renaming file {0} failed -flyMode=\u00a77Set fly mode {0} for {1}. +essentialsReload=\u00a76Essentials Reloaded\u00a7c {0} +exp=\u00a7c{0} \u00a76has\u00a7c {1} \u00a76exp (level\u00a7c {2}\u00a76) and needs\u00a7c {3} \u00a76more exp to level up. +expSet=\u00a7c{0} \u00a76now has\u00a7c {1} \u00a76exp. +extinguish=\u00a76You extinguished yourself. +extinguishOthers=\u00a76You extinguished {0}\u00a76. +failedToCloseConfig=Failed to close config {0}. +failedToCreateConfig=Failed to create config {0}. +failedToWriteConfig=Failed to write config {0}. +false=\u00a74false\u00a7r +feed=\u00a76Your appetite was sated. +feedOther=\u00a76Satisfied {0}\u00a76. +fileRenameError=Renaming file {0} failed! +fireworkColor=\u00a74Invalid firework charge parameters inserted, must set a color first. +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle. +flyMode=\u00a76Set fly mode\u00a7c {0} \u00a76for {1}\u00a76. flying=flying -foreverAlone=\u00a7cYou have nobody to whom you can reply. +foreverAlone=\u00a74You have nobody to whom you can reply. freedMemory=Freed {0} MB. -gameMode=\u00a77Set game mode {0} for {1}. -gcchunks= chunks, -gcentities= entities -gcfree=Free memory: {0} MB -gcmax=Maximum memory: {0} MB -gctotal=Allocated memory: {0} MB +fullStack=\u00a74You already have a full stack. +gameMode=\u00a76Set game mode\u00a7c {0} \u00a76for {1}\u00a76. +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities. +gcfree=\u00a76Free memory:\u00a7c {0} MB. +gcmax=\u00a76Maximum memory:\u00a7c {0} MB. +gctotal=\u00a76Allocated memory:\u00a7c {0} MB. geoIpUrlEmpty=GeoIP download url is empty. geoIpUrlInvalid=GeoIP download url is invalid. -geoipJoinFormat=Player {0} comes from {1} -godDisabledFor=disabled for {0} -godEnabledFor=enabled for {0} -godMode=\u00a77God mode {0}. -hatArmor=\u00a7cError, you cannot use this item as a hat! -hatEmpty=\u00a7cYou are not wearing a hat. -hatFail=\u00a7cYou must have something to wear in your hand. -hatPlaced=\u00a7eEnjoy your new hat! -haveBeenReleased=\u00a77You have been released -heal=\u00a77You have been healed. -healOther=\u00a77Healed {0}. +geoipJoinFormat=\u00a76Player \u00a7c{0} \u00a76comes from \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. +godDisabledFor=\u00a74disabled\u00a76 for\u00a7c {0}. +godEnabledFor=\u00a7aenabled\u00a76 for\u00a7c {0}. +godMode=\u00a76God mode\u00a7c {0}\u00a76. +groupNumber=\u00a7c{0}\u00a7f online, for the full list:\u00a7c /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! +hatArmor=\u00a74You cannot use this item as a hat! +hatEmpty=\u00a74You are not wearing a hat. +hatFail=\u00a74You must have something to wear in your hand. +hatPlaced=\u00a76Enjoy your new hat! +hatRemoved=\u00a76Your hat has been removed. +haveBeenReleased=\u00a76You have been released. +heal=\u00a76You have been healed. +healDead=\u00a74You cannot heal someone who is dead! +healOther=\u00a76Healed\u00a7c {0}\u00a76. helpConsole=To view help from the console, type ?. -helpFrom=\u00a77Commands from {0}: -helpLine=\u00a76/{0}\u00a7f: {1} -helpMatching=\u00a77Commands matching "{0}": -helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} -helpPages=Page \u00a7c{0}\u00a7f of \u00a7c{1}\u00a7f: -helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} -holeInFloor=Hole in floor -homeSet=\u00a77Home set. -homeSetToBed=\u00a77Your home is now set to this bed. -homes=Homes: {0} +helpFrom=\u00a76Commands from {0}: +helpLine=\u00a76/{0}\u00a7r: {1} +helpMatching=\u00a76Commands matching "\u00a7c{0}\u00a76": +helpOp=\u00a74[HelpOp]\u00a7r \u00a76{0}:\u00a7r {1} +helpPages=\u00a76Page \u00a7c{0}\u00a76 of \u00a7c{1}\u00a76: +helpPlugin=\u00a74{0}\u00a7r: Plugin Help: /help {1} +holdBook=\u00a74You are not holding a writable book. +holdFirework=\u00a74You must be holding a firework to add effects. +holdPotion=\u00a74You must be holding a potion to apply effects to it. +holeInFloor=\u00a74Hole in floor! +homeSet=\u00a76Home set. +homeSetToBed=\u00a76Your home is now set to this bed. +homes=\u00a76Homes:\u00a7r {0} hour=hour hours=hours -ignorePlayer=You ignore player {0} from now on. +ignorePlayer=\u00a76You ignore player\u00a7c {0} \u00a76from now on. illegalDate=Illegal date format. infoChapter=Select chapter: -infoChapterPages=Chapter {0}, page \u00a7c{1}\u00a7f of \u00a7c{2}\u00a7f: +infoChapterPages=\u00a76Chapter {0}, page \u00a7c{1}\u00a76 of \u00a7c{2}\u00a76: infoFileDoesNotExist=File info.txt does not exist. Creating one for you. -infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Page \u00a74{0}\u00a76/\u00a74{1} \u00a7e---- +infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Page \u00a7c{0}\u00a76/\u00a7c{1} \u00a7e---- infoUnknownChapter=Unknown chapter. -invBigger=The other users inventory is bigger than yours. -invRestored=Your inventory has been restored. -invSee=You see the inventory of {0}. -invSeeHelp=Use /invsee to restore your inventory. -invalidCharge=\u00a7cInvalid charge. -invalidHome=Home {0} doesn''t exist +invBigger=\u00a74The other users inventory is bigger than yours. +invRestored=\u00a76Your inventory has been restored. +invSee=\u00a76You see the inventory of\u00a7c {0}\u00a76. +invSeeHelp=\u00a76Use /invsee to restore your inventory. +invalidCharge=\u00a74Invalid charge. +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1}\u00a76. +invalidHome=\u00a74Home\u00a7c {0} \u00a74doesn''t exist! +invalidHomeName=\u00a74Invalid home name! invalidMob=Invalid mob type. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Invalid server! -invalidSignLine=Line {0} on sign is invalid. -invalidWorld=\u00a7cInvalid world. -inventoryCleared=\u00a77Inventory Cleared. -inventoryClearedOthers=\u00a77Inventory of \u00a7c{0}\u00a77 cleared. +invalidSignLine=\u00a74Line\u00a7c {0} \u00a74on sign is invalid. +invalidWarpName=\u00a74Invalid warp name! +invalidWorld=\u00a74Invalid world. +inventoryCleared=\u00a76Inventory cleared. +inventoryClearedAll=\u00a76Cleared everyone's inventory. +inventoryClearedOthers=\u00a76Inventory of \u00a7c{0}\u00a76 cleared. is=is -itemCannotBeSold=That item cannot be sold to the server. -itemMustBeStacked=Item must be traded in stacks. A quantity of 2s would be two stacks, etc. -itemNotEnough1=\u00a7cYou do not have enough of that item to sell. -itemNotEnough2=\u00a77If you meant to sell all of your items of that type, use /sell itemname -itemNotEnough3=\u00a77/sell itemname -1 will sell all but one item, etc. +itemCannotBeSold=\u00a74That item cannot be sold to the server. +itemMustBeStacked=\u00a74Item must be traded in stacks. A quantity of 2s would be two stacks, etc. +itemNames=\u00a76Item short names:\u00a7r {0} +itemNotEnough1=\u00a74You do not have enough of that item to sell. +itemNotEnough2=\u00a76If you meant to sell all of your items of that type, use /sell itemname. +itemNotEnough3=\u00a76/sell itemname -1 will sell all but one item, etc. itemSellAir=You really tried to sell Air? Put an item in your hand. -itemSold=\u00a77Sold for \u00a7c{0} \u00a77({1} {2} at {3} each) -itemSoldConsole={0} sold {1} for \u00a77{2} \u00a77({3} items at {4} each) -itemSpawn=\u00a77Giving {0} of {1} -itemsCsvNotLoaded=Could not load items.csv. -jailAlreadyIncarcerated=\u00a7cPerson is already in jail: {0} -jailMessage=\u00a7cYou do the crime, you do the time. -jailNotExist=That jail does not exist. -jailReleased=\u00a77Player \u00a7e{0}\u00a77 unjailed. -jailReleasedPlayerNotify=\u00a77You have been released! -jailSentenceExtended=Jail time extend to: {0) -jailSet=\u00a77Jail {0} has been set -jumpError=That would hurt your computer's brain. -kickDefault=Kicked from server -kickExempt=\u00a7cYou can not kick that person. -kickedAll=\u00a7cKicked all players from server -kill=\u00a77Killed {0}. -kitError2=\u00a7cThat kit does not exist or is improperly defined. -kitError=\u00a7cThere are no valid kits. -kitErrorHelp=\u00a7cPerhaps an item is missing a quantity in the configuration? -kitGive=\u00a77Giving kit {0}. -kitInvFull=\u00a7cYour inventory was full, placing kit on the floor -kitTimed=\u00a7cYou can''t use that kit again for another {0}. -kits=\u00a77Kits: {0} -lightningSmited=\u00a77Thou hast been smitten -lightningUse=\u00a77Smiting {0} -listAfkTag = \u00a77[AFK]\u00a7f -listAmount = \u00a79There are \u00a7c{0}\u00a79 out of maximum \u00a7c{1}\u00a79 players online. -listAmountHidden = \u00a79There are \u00a7c{0}\u00a77/{1}\u00a79 out of maximum \u00a7c{2}\u00a79 players online. -listGroupTag={0}\u00a7f: -listHiddenTag = \u00a77[HIDDEN]\u00a7f -loadWarpError=Failed to load warp {0} -localFormat=Local: <{0}> {1} -mailClear=\u00a7cTo mark your mail as read, type /mail clear -mailCleared=\u00a77Mail Cleared! -mailSent=\u00a77Mail sent! -markMailAsRead=\u00a7cTo mark your mail as read, type /mail clear -markedAsAway=\u00a77You are now marked as away. -markedAsNotAway=\u00a77You are no longer marked as away. -maxHomes=You cannot set more than {0} homes. -mayNotJail=\u00a7cYou may not jail that person +itemSold=\u00a7aSold for \u00a7c{0} \u00a7a({1} {2} at {3} each). +itemSoldConsole=\u00a7a{0} \u00a7asold {1} for \u00a7a{2} \u00a7a({3} items at {4} each). +itemSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} +itemType=\u00a76Item:\u00a7c {0} \u00a76-\u00a7c {1} +itemsCsvNotLoaded=Could not load items.csv! +jailAlreadyIncarcerated=\u00a74Person is already in jail:\u00a7c {0} +jailMessage=\u00a74You do the crime, you do the time. +jailNotExist=\u00a74That jail does not exist. +jailReleased=\u00a76Player \u00a7c{0}\u00a76 unjailed. +jailReleasedPlayerNotify=\u00a76You have been released! +jailSentenceExtended=\u00a76Jail time extend to: {0} +jailSet=\u00a76Jail\u00a7c {0} \u00a76has been set. +jumpError=\u00a74That would hurt your computer's brain. +kickDefault=Kicked from server. +kickExempt=\u00a74You can not kick that person. +kickedAll=\u00a74Kicked all players from server. +kill=\u00a76Killed\u00a7c {0}\u00a76. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. +kitError=\u00a74There are no valid kits. +kitErrorHelp=\u00a74Perhaps an item is missing a quantity in the configuration? +kitGive=\u00a76Giving kit\u00a7c {0}\u00a76. +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. +kitInvFull=\u00a74Your inventory was full, placing kit on the floor. +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. +kitTimed=\u00a74You can''t use that kit again for another\u00a7c {0}\u00a74. +kits=\u00a76Kits:\u00a7r {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. +lightningSmited=\u00a76Thou hast been smitten! +lightningUse=\u00a76Smiting\u00a7c {0} +listAfkTag= \u00a77[AFK]\u00a7r +listAmount= \u00a76There are \u00a7c{0}\u00a76 out of maximum \u00a7c{1}\u00a76 players online. +listAmountHidden= \u00a76There are \u00a7c{0}\u00a76/{1}\u00a76 out of maximum \u00a7c{2}\u00a76 players online. +listGroupTag={0}\u00a7r: +listHiddenTag= \u00a77[HIDDEN]\u00a7r +loadWarpError=\u00a74Failed to load warp {0}. +localFormat=[L]<{0}> {1} +mailClear=\u00a76To mark your mail as read, type\u00a7c /mail clear. +mailCleared=\u00a76Mail Cleared! +mailSent=\u00a76Mail sent! +markMailAsRead=\u00a76To mark your mail as read, type\u00a7c /mail clear. +markedAsAway=\u00a76You are now marked as away. +markedAsNotAway=\u00a76You are no longer marked as away. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: +maxHomes=\u00a74You cannot set more than\u00a7c {0} \u00a74homes. +mayNotJail=\u00a74You may not jail that person! me=me +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minute minutes=minutes -missingItems=You do not have {0}x {1}. +missingItems=\u00a74You do not have {0}x {1}. missingPrefixSuffix=Missing a prefix or suffix for {0} -mobSpawnError=Error while changing mob spawner. -mobSpawnLimit=Mob quantity limited to server limit -mobSpawnTarget=Target block must be a mob spawner. -mobsAvailable=\u00a77Mobs: {0} -moneyRecievedFrom=\u00a7a{0} has been received from {1} -moneySentTo=\u00a7a{0} has been sent to {1} -moneyTaken={0} taken from your bank account. +mobSpawnError=\u00a74Error while changing mob spawner. +mobSpawnLimit=Mob quantity limited to server limit. +mobSpawnTarget=\u00a74Target block must be a mob spawner. +mobsAvailable=\u00a76Mobs:\u00a7r {0} +moneyRecievedFrom=\u00a7a{0} has been received from {1}. +moneySentTo=\u00a7a{0} has been sent to {1}. +moneyTaken=\u00a7a{0} taken from your bank account. month=month months=months -moreThanZero=Quantities must be greater than 0. -msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} -muteExempt=\u00a7cYou may not mute that player. -mutedPlayer=Player {0} muted. -mutedPlayerFor=Player {0} muted for {1}. +moreThanZero=\u00a74Quantities must be greater than 0. +moveSpeed=\u00a76Set {0} speed to\u00a7c {1} \u00a76for {2}\u00a76. +msgFormat=\u00a76[{0}\u00a76 -> {1}\u00a76] \u00a7r{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. +muteExempt=\u00a74You may not mute that player. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1}\u00a76. +mutedPlayer=\u00a76Player {0} \u00a76muted. +mutedPlayerFor=\u00a76Player {0} \u00a76muted for {1}. mutedUserSpeaks={0} tried to speak, but is muted. -nearbyPlayers=Players nearby: {0} -negativeBalanceError=User is not allowed to have a negative balance. -nickChanged=Nickname changed. -nickDisplayName=\u00a77You have to enable change-displayname in Essentials config. -nickInUse=\u00a7cThat name is already in use. -nickNamesAlpha=\u00a7cNicknames must be alphanumeric. -nickNoMore=\u00a77You no longer have a nickname. -nickOthersPermission=\u00a7cYou do not have permission to change the nickname of others -nickSet=\u00a77Your nickname is now \u00a7c{0} -noAccessCommand=\u00a7cYou do not have access to that command. -noAccessPermission=\u00a7cYou do not have permission to access that {0}. -noBreakBedrock=You are not allowed to destroy bedrock. -noDestroyPermission=\u00a7cYou do not have permission to destroy that {0}. -noDurability=\u00a7cThis item does not have a durability. -noGodWorldWarning=\u00a7cWarning! God mode in this world disabled. -noHelpFound=\u00a7cNo matching commands. -noHomeSet=You have not set a home. -noHomeSetPlayer=Player has not set a home. -noKitPermission=\u00a7cYou need the \u00a7c{0}\u00a7c permission to use that kit. -noKits=\u00a77There are no kits available yet -noMail=You do not have any mail -noMotd=\u00a7cThere is no message of the day. -noNewMail=\u00a77You have no new mail. -noPendingRequest=You do not have a pending request. -noPerm=\u00a7cYou do not have the \u00a7f{0}\u00a7c permission. -noPermToSpawnMob=\u00a7cYou don't have permission to spawn this mob. -noPlacePermission=\u00a7cYou do not have permission to place a block near that sign. -noPowerTools=You have no power tools assigned. -noRules=\u00a7cThere are no rules specified yet. -noWarpsDefined=No warps defined +nearbyPlayers=\u00a76Players nearby:\u00a7r {0} +negativeBalanceError=\u00a74User is not allowed to have a negative balance. +nickChanged=\u00a76Nickname changed. +nickDisplayName=\u00a74You have to enable change-displayname in Essentials config. +nickInUse=\u00a74That name is already in use. +nickNamesAlpha=\u00a74Nicknames must be alphanumeric. +nickNoMore=\u00a76You no longer have a nickname. +nickOthersPermission=\u00a74You do not have permission to change the nickname of others! +nickSet=\u00a76Your nickname is now \u00a7c{0} +noAccessCommand=\u00a74You do not have access to that command. +noAccessPermission=\u00a74You do not have permission to access that {0}. +noBreakBedrock=\u00a74You are not allowed to destroy bedrock. +noChapterMeta=\u00a74You do not have permission to create dynamic books. +noDestroyPermission=\u00a74You do not have permission to destroy that {0}. +noDurability=\u00a74This item does not have a durability. +noGodWorldWarning=\u00a74Warning! God mode in this world disabled. +noHelpFound=\u00a74No matching commands. +noHomeSet=\u00a74You have not set a home. +noHomeSetPlayer=\u00a76Player has not set a home. +noKitPermission=\u00a74You need the \u00a7c{0}\u00a74 permission to use that kit. +noKits=\u00a76There are no kits available yet. +noMail=\u00a76You do not have any mail. +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. +noMotd=\u00a76There is no message of the day. +noNewMail=\u00a76You have no new mail. +noPendingRequest=\u00a74You do not have a pending request. +noPerm=\u00a74You do not have the \u00a7c{0}\u00a74 permission. +noPermToSpawnMob=\u00a74You don't have permission to spawn this mob. +noPlacePermission=\u00a74You do not have permission to place a block near that sign. +noPowerTools=\u00a76You have no power tools assigned. +noRules=\u00a74There are no rules specified yet. +noWarpsDefined=\u00a76No warps defined. none=none -notAllowedToQuestion=\u00a7cYou are not authorized to use question. -notAllowedToShout=\u00a7cYou are not authorized to shout. -notEnoughExperience=You do not have enough experience. -notEnoughMoney=You do not have sufficient funds. +notAllowedToQuestion=\u00a74You are not authorized to use question. +notAllowedToShout=\u00a74You are not authorized to shout. +notEnoughExperience=\u00a74You do not have enough experience. +notEnoughMoney=\u00a74You do not have sufficient funds. notFlying=not flying -notRecommendedBukkit= * ! * Bukkit version is not the recommended build for Essentials. +notRecommendedBukkit= \u00a74* ! * Bukkit version is not the recommended build for Essentials. notSupportedYet=Not supported yet. -nothingInHand = \u00a7cYou have nothing in your hand. +nothingInHand=\u00a74You have nothing in your hand. now=now -nuke=May death rain upon them +nuke=\u00a75May death rain upon them. numberRequired=A number goes there, silly. onlyDayNight=/time only supports day/night. -onlyPlayers=Only in-game players can use {0}. -onlySunStorm=/weather only supports sun/storm. -orderBalances=Ordering balances of {0} users, please wait ... -pTimeCurrent=\u00a7e{0}''s\u00a7f time is {1}. -pTimeCurrentFixed=\u00a7e{0}''s\u00a7f time is fixed to {1}. -pTimeNormal=\u00a7e{0}''s\u00a7f time is normal and matches the server. -pTimeOthersPermission=\u00a7cYou are not authorized to set other players' time. -pTimePlayers=These players have their own time: -pTimeReset=Player time has been reset for: \u00a7e{0} -pTimeSet=Player time is set to \u00a73{0}\u00a7f for: \u00a7e{1} -pTimeSetFixed=Player time is fixed to \u00a73{0}\u00a7f for: \u00a7e{1} -parseError=Error parsing {0} on line {1} -pendingTeleportCancelled=\u00a7cPending teleportation request cancelled. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). +onlyPlayers=\u00a74Only in-game players can use {0}. +onlySunStorm=\u00a74/weather only supports sun/storm. +orderBalances=\u00a76Ordering balances of\u00a7c {0} \u00a76users, please wait... +oversizedTempban=\u00a74You may not ban a player for this period of time. +pTimeCurrent=\u00a7c{0}\u00a76''s time is\u00a7c {1}\u00a76. +pTimeCurrentFixed=\u00a7c{0}\u00a76''s time is fixed to\u00a7c {1}\u00a76. +pTimeNormal=\u00a7c{0}\u00a76''s time is normal and matches the server. +pTimeOthersPermission=\u00a74You are not authorized to set other players' time. +pTimePlayers=\u00a76These players have their own time:\u00a7r +pTimeReset=\u00a76Player time has been reset for: \u00a7c{0} +pTimeSet=\u00a76Player time is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pTimeSetFixed=\u00a76Player time is fixed to \u00a7c{0}\u00a76 for: \u00a7c{1}. +parseError=\u00a74Error parsing\u00a7c {0} \u00a76on line {1}. +pendingTeleportCancelled=\u00a74Pending teleportation request cancelled. permissionsError=Missing Permissions/GroupManager; chat prefixes/suffixes will be disabled. -playerBanned=\u00a7cPlayer {0} banned {1} for {2} -playerInJail=\u00a7cPlayer is already in jail {0}. -playerJailed=\u00a77Player {0} jailed. -playerJailedFor= \u00a77Player {0} jailed for {1}. -playerKicked=\u00a7cPlayer {0} kicked {1} for {2} -playerMuted=\u00a77You have been muted -playerMutedFor=\u00a77You have been muted for {0} -playerNeverOnServer=\u00a7cPlayer {0} was never on this server. -playerNotFound=\u00a7cPlayer not found. -playerUnmuted=\u00a77You have been unmuted +playerBanned=\u00a76Player\u00a7c {0} \u00a76banned {1} \u00a76for {2}. +playerInJail=\u00a74Player is already in jail\u00a7c {0}\u00a76. +playerJailed=\u00a76Player\u00a7c {0} \u00a76jailed. +playerJailedFor= \u00a76Player\u00a7c {0} \u00a76jailed for {1}. +playerKicked=\u00a76Player\u00a7c {0} \u00a76kicked {1} for {2}. +playerMuted=\u00a76You have been muted! +playerMutedFor=\u00a76You have been muted for\u00a7c {0}. +playerNeverOnServer=\u00a74Player\u00a7c {0} \u00a74was never on this server. +playerNotFound=\u00a74Player not found. +playerUnmuted=\u00a76You have been unmuted. pong=Pong! -possibleWorlds=\u00a77Possible worlds are the numbers 0 through {0}. -powerToolAir=Command can't be attached to air. -powerToolAlreadySet=Command \u00a7c{0}\u00a7f is already assigned to {1}. -powerToolAttach=\u00a7c{0}\u00a7f command assigned to {1}. -powerToolClearAll=All powertool commands have been cleared. -powerToolList={1} has the following commands: \u00a7c{0}\u00a7f. -powerToolListEmpty={0} has no commands assigned. -powerToolNoSuchCommandAssigned=Command \u00a7c{0}\u00a7f has not been assigned to {1}. -powerToolRemove=Command \u00a7c{0}\u00a7f removed from {1}. -powerToolRemoveAll=All commands removed from {0}. -powerToolsDisabled=All of your power tools have been disabled. -powerToolsEnabled=All of your power tools have been enabled. -protectionOwner=\u00a76[EssentialsProtect] Protection owner: {0} -questionFormat=\u00a77[Question]\u00a7f {0} -readNextPage=Type /{0} {1} to read the next page -reloadAllPlugins=\u00a77Reloaded all plugins. -removed=\u00a77Removed {0} entities. -repair=You have successfully repaired your: \u00a7e{0}. -repairAlreadyFixed=\u00a77This item does not need repairing. -repairEnchanted=\u00a77You are not allowed to repair enchanted items. -repairInvalidType=\u00a7cThis item cannot be repaired. -repairNone=There were no items that needing repairing. -requestAccepted=\u00a77Teleport request accepted. -requestAcceptedFrom=\u00a77{0} accepted your teleport request. -requestDenied=\u00a77Teleport request denied. -requestDeniedFrom=\u00a77{0} denied your teleport request. -requestSent=\u00a77Request sent to {0}\u00a77. -requestTimedOut=\u00a7cTeleport request has timed out -requiredBukkit= * ! * You need atleast build {0} of CraftBukkit, download it from http://dl.bukkit.org/downloads/craftbukkit/ -returnPlayerToJailError=Error occurred when trying to return player {0} to jail: {1} +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) +possibleWorlds=\u00a76Possible worlds are the numbers 0 through {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. +powerToolAir=\u00a74Command can't be attached to air. +powerToolAlreadySet=\u00a74Command \u00a7c{0}\u00a74 is already assigned to {1}. +powerToolAttach=\u00a7c{0}\u00a76 command assigned to {1}. +powerToolClearAll=\u00a76All powertool commands have been cleared. +powerToolList=\u00a76Item \u00a7c{1} \u00a76has the following commands: \u00a7c{0}\u00a76. +powerToolListEmpty=\u00a74Item \u00a7c{0} \u00a74has no commands assigned. +powerToolNoSuchCommandAssigned=\u00a74Command \u00a7c{0}\u00a74 has not been assigned to {1}. +powerToolRemove=\u00a76Command \u00a7c{0}\u00a76 removed from {1}. +powerToolRemoveAll=\u00a76All commands removed from {0}. +powerToolsDisabled=\u00a76All of your power tools have been disabled. +powerToolsEnabled=\u00a76All of your power tools have been enabled. +protectionOwner=\u00a76[EssentialsProtect] Protection owner:\u00a7r {0}. +questionFormat=\u00a72[Question]\u00a7r {0} +readNextPage=\u00a76Type\u00a7c /{0} {1} \u00a76to read the next page. +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number. +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2}\u00a76. +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} +reloadAllPlugins=\u00a76Reloaded all plugins. +removed=\u00a76Removed\u00a7c {0} \u00a76entities. +repair=\u00a76You have successfully repaired your: \u00a7c{0}. +repairAlreadyFixed=\u00a74This item does not need repairing. +repairEnchanted=\u00a74You are not allowed to repair enchanted items. +repairInvalidType=\u00a74This item cannot be repaired. +repairNone=\u00a74There were no items that needing repairing. +requestAccepted=\u00a76Teleport request accepted. +requestAcceptedFrom=\u00a7c{0} \u00a76accepted your teleport request. +requestDenied=\u00a76Teleport request denied. +requestDeniedFrom=\u00a7c{0} \u00a76denied your teleport request. +requestSent=\u00a76Request sent to\u00a7c {0}\u00a76. +requestTimedOut=\u00a74Teleport request has timed out. +requiredBukkit= \u00a76* ! * You need atleast build {0} of CraftBukkit, download it from http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76for all online players. +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76for all players. +returnPlayerToJailError=\u00a74Error occurred when trying to return player\u00a7c {0} \u00a74to jail: {1}! +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=second seconds=seconds -seenOffline=Player {0} is offline since {1} -seenOnline=Player {0} is online since {1} -serverFull=Server is full -serverTotal=Server Total: {0} -setSpawner=Changed spawner type to {0} -sheepMalformedColor=Malformed color. -shoutFormat=\u00a77[Shout]\u00a7f {0} +seenOffline=\u00a76Player\u00a7c {0} \u00a76is \u00a74offline\u00a76 since {1}. +seenOnline=\u00a76Player\u00a7c {0} \u00a76is \u00a7aonline\u00a76 since {1}. +serverFull=Server is full! +serverTotal=\u00a76Server Total:\u00a7c {0} +setSpawner=\u00a76Changed spawner type to\u00a7c {0} +sheepMalformedColor=\u00a74Malformed color. +shoutFormat=\u00a76[Shout]\u00a7r {0} signFormatFail=\u00a74[{0}] signFormatSuccess=\u00a71[{0}] signFormatTemplate=[{0}] signProtectInvalidLocation=\u00a74You are not allowed to create sign here. -similarWarpExist=A warp with a similar name already exists. -slimeMalformedSize=Malformed size. -soloMob=That mob likes to be alone -spawnSet=\u00a77Spawn location set for group {0}. +similarWarpExist=\u00a74A warp with a similar name already exists. +slimeMalformedSize=\u00a74Malformed size. +soloMob=\u00a74That mob likes to be alone. +spawnSet=\u00a76Spawn location set for group\u00a7c {0}\u00a76. spawned=spawned -sudoExempt=You cannot sudo this user -sudoRun=Forcing {0} to run: /{1} {2} -suicideMessage=\u00a77Goodbye Cruel World... -suicideSuccess= \u00a77{0} took their own life +sudoExempt=\u00a74You cannot sudo this user. +sudoRun=\u00a76Forcing\u00a7c {0} \u00a76to run:\u00a7r /{1} {2} +suicideMessage=\u00a76Goodbye cruel world... +suicideSuccess= \u00a76{0} \u00a76took their own life. survival=survival -takenFromAccount=\u00a7c{0} has been taken from your account. -takenFromOthersAccount=\u00a7c{0} taken from {1}\u00a7c account. New balance: {2} -teleportAAll=\u00a77Teleporting request sent to all players... -teleportAll=\u00a77Teleporting all players... -teleportAtoB=\u00a77{0}\u00a77 teleported you to {1}\u00a77. -teleportDisabled={0} has teleportation disabled. -teleportHereRequest=\u00a7c{0}\u00a7c has requested that you teleport to them. -teleportNewPlayerError=Failed to teleport new player -teleportRequest=\u00a7c{0}\u00a7c has requested to teleport to you. -teleportRequestTimeoutInfo=\u00a77This request will timeout after {0} seconds. -teleportTop=\u00a77Teleporting to top. -teleportationCommencing=\u00a77Teleportation commencing... -teleportationDisabled=\u00a77Teleportation disabled. -teleportationEnabled=\u00a77Teleportation enabled. -teleporting=\u00a77Teleporting... -teleportingPortal=\u00a77Teleporting via portal. -tempBanned=Temporarily banned from server for {0} -tempbanExempt=\u00a77You may not tempban that player -thunder= You {0} thunder in your world -thunderDuration=You {0} thunder in your world for {1} seconds. -timeBeforeHeal=Time before next heal: {0} -timeBeforeTeleport=Time before next teleport: {0} -timeFormat=\u00a73{0}\u00a7f or \u00a73{1}\u00a7f or \u00a73{2}\u00a7f +takenFromAccount=\u00a7a{0} has been taken from your account. +takenFromOthersAccount=\u00a7a{0} taken from {1}\u00a7a account. New balance: {2}. +teleportAAll=\u00a76Teleporting request sent to all players... +teleportAll=\u00a76Teleporting all players... +teleportAtoB=\u00a7c{0}\u00a76 teleported you to {1}\u00a76. +teleportDisabled=\u00a7c{0} \u00a74has teleportation disabled. +teleportHereRequest=\u00a7c{0}\u00a76 has requested that you teleport to them. +teleportNewPlayerError=\u00a74Failed to teleport new player! +teleportRequest=\u00a7c{0}\u00a76 has requested to teleport to you. +teleportRequestTimeoutInfo=\u00a76This request will timeout after\u00a7c {0} seconds\u00a76. +teleportTop=\u00a76Teleporting to top. +teleportationCommencing=\u00a76Teleportation commencing... +teleportationDisabled=\u00a76Teleportation disabled. +teleportationDisabledFor=\u00a76Teleportation disabled for {0}. +teleportationEnabled=\u00a76Teleportation enabled. +teleportationEnabledFor=\u00a76Teleportation enabled for {0}. +teleporting=\u00a76Teleporting... +teleportingPortal=\u00a76Teleporting via portal. +tempBanned=Temporarily banned from server for {0}. +tempbanExempt=\u00a74You may not tempban that player. +thunder= \u00a76You\u00a7c {0} \u00a76thunder in your world. +thunderDuration=\u00a76You\u00a7c {0} \u00a76thunder in your world for\u00a7c {1} \u00a76seconds. +timeBeforeHeal=\u00a76Time before next heal:\u00a7c {0}\u00a76. +timeBeforeTeleport=\u00a76Time before next teleport:\u00a7c {0} +timeFormat=\u00a7c{0}\u00a76 or \u00a7c{1}\u00a76 or \u00a7c{2}\u00a76. 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=Time set in all worlds. -timeSetPermission=\u00a7cYou are not authorized to set the time. -timeWorldCurrent=The current time in {0} is \u00a73{1} -timeWorldSet=The time was set to {0} in: \u00a7c{1} -tps=Current TPS = {0} -tradeCompleted=\u00a77Trade completed. -tradeSignEmpty=The trade sign has nothing available for you. -tradeSignEmptyOwner=There is nothing to collect from this trade sign. -treeFailure=\u00a7cTree generation failure. Try again on grass or dirt. -treeSpawned=\u00a77Tree spawned. -true=\u00a72true\u00a7f -typeTpaccept=\u00a77To teleport, type \u00a7c/tpaccept\u00a77. -typeTpdeny=\u00a77To deny this request, type \u00a7c/tpdeny\u00a77. -typeWorldName=\u00a77You can also type the name of a specific world. -unableToSpawnMob=Unable to spawn mob. -unbannedIP=Unbanned IP address. -unbannedPlayer=Unbanned player. -unignorePlayer=You are not ignoring player {0} anymore. -unknownItemId=Unknown item id: {0} -unknownItemInList=Unknown item {0} in {1} list. -unknownItemName=Unknown item name: {0} -unlimitedItemPermission=\u00a7cNo permission for unlimited item {0}. -unlimitedItems=Unlimited items: -unmutedPlayer=Player {0} unmuted. -unvanished=\u00a7aYou are once again visible. -unvanishedReload=\u00a7cA reload has forced you to become visible. -upgradingFilesError=Error while upgrading the files -userDoesNotExist=The user {0} does not exist. -userIsAway={0} is now AFK -userIsNotAway={0} is no longer AFK -userJailed=\u00a77You have been jailed +timeSet=\u00a76Time set in all worlds. +timeSetPermission=\u00a74You are not authorized to set the time. +timeWorldCurrent=\u00a76The current time in\u00a7c {0} \u00a76is \u00a7c{1}\u00a76. +timeWorldSet=\u00a76The time was set to\u00a7c {0} \u00a76in: \u00a7c{1}\u00a76. +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. +tps=\u00a76Current TPS = {0} +tradeCompleted=\u00a7aTrade completed. +tradeSignEmpty=\u00a74The trade sign has nothing available for you. +tradeSignEmptyOwner=\u00a74There is nothing to collect from this trade sign. +treeFailure=\u00a74Tree generation failure. Try again on grass or dirt. +treeSpawned=\u00a76Tree spawned. +true=\u00a7atrue\u00a7r +typeTpaccept=\u00a76To teleport, type \u00a7c/tpaccept\u00a76. +typeTpdeny=\u00a76To deny this request, type \u00a7c/tpdeny\u00a76. +typeWorldName=\u00a76You can also type the name of a specific world. +unableToSpawnMob=\u00a74Unable to spawn mob. +unignorePlayer=\u00a76You are not ignoring player\u00a7c {0} \u00a76anymore. +unknownItemId=\u00a74Unknown item id:\u00a7r {0}\u00a74. +unknownItemInList=\u00a74Unknown item {0} in {1} list. +unknownItemName=\u00a74Unknown item name: {0}. +unlimitedItemPermission=\u00a74No permission for unlimited item {0}. +unlimitedItems=\u00a76Unlimited items:\u00a7r +unmutedPlayer=\u00a76Player\u00a7c {0} \u00a76unmuted. +unvanished=\u00a76You are once again visible. +unvanishedReload=\u00a74A reload has forced you to become visible. +upgradingFilesError=Error while upgrading the files. +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond. +userDoesNotExist=\u00a74The user\u00a7c {0} \u00a74does not exist. +userIsAway=\u00a75{0} \u00a75is now AFK. +userIsNotAway=\u00a75{0} \u00a75is no longer AFK. +userJailed=\u00a76You have been jailed! +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} used an existing exit portal. -userdataMoveBackError=Failed to move userdata/{0}.tmp to userdata/{1} -userdataMoveError=Failed to move userdata/{0} to userdata/{1}.tmp +userdataMoveBackError=Failed to move userdata/{0}.tmp to userdata/{1}! +userdataMoveError=Failed to move userdata/{0} to userdata/{1}.tmp! usingTempFolderForTesting=Using temp folder for testing: -vanished=\u00a7aYou have now been vanished. -versionMismatch=Version mismatch! Please update {0} to the same version. -versionMismatchAll=Version mismatch! Please update all Essentials jars to the same version. -voiceSilenced=\u00a77Your voice has been silenced -warpDeleteError=Problem deleting the warp file. -warpListPermission=\u00a7cYou do not have Permission to list warps. -warpNotExist=That warp does not exist. -warpOverwrite=\u00a7cYou cannot overwrite that warp. -warpSet=\u00a77Warp {0} set. -warpUsePermission=\u00a7cYou do not have Permission to use that warp. -warpingTo=\u00a77Warping to {0}. -warps=Warps: {0} -warpsCount=\u00a77There are {0} warps. Showing page {1} of {2}. -weatherStorm=\u00a77You set the weather to storm in {0} -weatherStormFor=\u00a77You set the weather to storm in {0} for {1} seconds -weatherSun=\u00a77You set the weather to sun in {0} -weatherSunFor=\u00a77You set the weather to sun in {0} for {1} seconds -whoisAFK=\u00a76 - AFK:\u00a7f {0} -whoisBanned=\u00a76 - Banned:\u00a7f {0} -whoisExp=\u00a76 - Exp:\u00a7f {0} (Level {1}) -whoisFly=\u00a76 - Fly mode:\u00a7f {0} ({1}) -whoisGamemode=\u00a76 - Gamemode:\u00a7f {0} -whoisGeoLocation=\u00a76 - Location:\u00a7f {0} -whoisGod=\u00a76 - God mode:\u00a7f {0} -whoisHealth=\u00a76 - Health:\u00a7f {0}/20 -whoisIPAddress=\u00a76 - IP Address:\u00a7f {0} -whoisJail=\u00a76 - Jail:\u00a7f {0} -whoisLocation=\u00a76 - Location:\u00a7f ({0}, {1}, {2}, {3}) -whoisMoney=\u00a76 - Money:\u00a7f {0} -whoisMuted=\u00a76 - Muted:\u00a7f {0} -whoisNick=\u00a76 - Nick:\u00a7f {0} -whoisOp=\u00a76 - OP:\u00a7f {0} -whoisTop=\u00a76 ====== WhoIs:\u00a7f {0} \u00a76====== -worth=\u00a77Stack of {0} worth \u00a7c{1}\u00a77 ({2} item(s) at {3} each) -worthMeta=\u00a77Stack of {0} with metadata of {1} worth \u00a7c{2}\u00a77 ({3} item(s) at {4} each) -worthSet=Worth value set +vanished=\u00a76You are now completely invisible to normal users, and hidden from in-game commands. +versionMismatch=\u00a74Version mismatch! Please update {0} to the same version. +versionMismatchAll=\u00a74Version mismatch! Please update all Essentials jars to the same version. +voiceSilenced=\u00a76Your voice has been silenced! +walking=walking +warpDeleteError=\u00a74Problem deleting the warp file. +warpList={0} +warpListPermission=\u00a74You do not have Permission to list warps. +warpNotExist=\u00a74That warp does not exist. +warpOverwrite=\u00a74You cannot overwrite that warp. +warpSet=\u00a76Warp\u00a7c {0} \u00a76set. +warpUsePermission=\u00a74You do not have Permission to use that warp. +warpingTo=\u00a76Warping to\u00a7c {0}\u00a76. +warps=\u00a76Warps:\u00a7r {0} +warpsCount=\u00a76There are\u00a7c {0} \u00a76warps. Showing page {1} of {2}. +weatherStorm=\u00a76You set the weather to \u00a7cstorm\u00a76 in\u00a7c {0}\u00a76. +weatherStormFor=\u00a76You set the weather to \u00a7cstorm\u00a76 in\u00a7c {0} \u00a76for {1} seconds. +weatherSun=\u00a76You set the weather to \u00a7csun\u00a76 in\u00a7c {0}\u00a76. +weatherSunFor=\u00a76You set the weather to \u00a7csun\u00a76 in\u00a7c {0} \u00a76for {1} seconds. +whoisAFK=\u00a76 - AFK:\u00a7r {0} +whoisBanned=\u00a76 - Banned:\u00a7r {0} +whoisExp=\u00a76 - Exp:\u00a7r {0} (Level {1}) +whoisFly=\u00a76 - Fly mode:\u00a7r {0} ({1}) +whoisGamemode=\u00a76 - Gamemode:\u00a7r {0} +whoisGeoLocation=\u00a76 - Location:\u00a7r {0} +whoisGod=\u00a76 - God mode:\u00a7r {0} +whoisHealth=\u00a76 - Health:\u00a7r {0}/20 +whoisIPAddress=\u00a76 - IP Address:\u00a7r {0} +whoisJail=\u00a76 - Jail:\u00a7r {0} +whoisLocation=\u00a76 - Location:\u00a7r ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - Money:\u00a7r {0} +whoisMuted=\u00a76 - Muted:\u00a7r {0} +whoisNick=\u00a76 - Nick:\u00a7r {0} +whoisOp=\u00a76 - OP:\u00a7r {0} +whoisTop=\u00a76 ====== WhoIs:\u00a7c {0} \u00a76====== +worth=\u00a7aStack of {0} worth \u00a7c{1}\u00a7a ({2} item(s) at {3} each) +worthMeta=\u00a7aStack of {0} with metadata of {1} worth \u00a7c{2}\u00a7a ({3} item(s) at {4} each) +worthSet=\u00a76Worth value set year=year years=years -youAreHealed=\u00a77You have been healed. -youHaveNewMail=\u00a7cYou have {0} messages!\u00a7f Type \u00a77/mail read\u00a7f to view your mail. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +youAreHealed=\u00a76You have been healed. +youHaveNewMail=\u00a76You have\u00a7c {0} \u00a76messages! Type \u00a7c/mail read\u00a76 to view your mail. +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs. +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_es.properties b/Essentials/src/messages_es.properties index 0e3bbd9bb7..7bf49b62fc 100644 --- a/Essentials/src/messages_es.properties +++ b/Essentials/src/messages_es.properties @@ -3,159 +3,194 @@ # Translations start here # by: action=* {0} {1} -addedToAccount=\u00a7a{0} ha sido agregado a tu cuenta. -addedToOthersAccount=\u00a7a{0} added to {1}\u00a7a account. New balance: {2} -alertBroke=roto: +addedToAccount=\u00a7a{0} han sido agregados a tu cuenta. +addedToOthersAccount=\u00a7a{0} han sidos agregados a la cuenta de {1}\u00a7a. Nuevo presupuesto: {2} +adventure = Aventura +alertBroke=Roto: alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} en: {3} -alertPlaced=situado: -alertUsed=usado: +alertPlaced=Situado: +alertUsed=Usado: +antiBuildBreak=\u00a74Tu no tines permitido romper {0} bloques aca. +antiBuildCraft=\u00a74No se le permite crear\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74No se le permite botar \u00a7c {0}\u00a74. +antiBuildInteract=\u00a74Tu no tienes permitido interactuar con {0}. +antiBuildPlace=\u00a74Tu no tienes permitido poner {0} aca. +antiBuildUse=\u00a74Tu no tienes permitido usar {0}. autoAfkKickReason=Has sido echado por ausentarte mas de {0} minutos. backAfterDeath=\u00a77Usa el comando /back para volver al punto en el que moriste. backUsageMsg=\u00a77Volviendo a la localizacion anterior. -backupDisabled=An external backup script has not been configured. -backupFinished=Copia de seguridad completada -backupStarted=Comenzando copia de seguridad +backupDisabled=Un codigo externo de recuperacion no ha sido configurado. +backupFinished=Copia de seguridad completada. +backupStarted=Comenzando copia de seguridad... balance=\u00a77Cantidad: {0} -balanceTop=\u00a77Top cantidades ({0}) -banExempt=\u00a7cNo puedes banear a ese jugador -banIpAddress=\u00a77Direccion IP baneada -bannedIpsFileError=Error leyendo banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt no encontrado -bannedPlayersFileError=Error leyendo banned-players.txt -bannedPlayersFileNotFound=banned-players.txt no encontrado +balanceTop=\u00a77Ranking de cantidades ({0}) +banExempt=\u00a7cNo puedes bannear a ese jugador. +banFormat=Banned: {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7cBig Generacion de arbol fallida. Prueba de nuevo en hierba o arena. bigTreeSuccess= \u00a77Big Arbol generado. -blockList=Essentials relayed the following commands to another plugin: -broadcast=[\u00a7cBroadcast\u00a7f]\u00a7a {0} -buildAlert=\u00a7cNo tienes permisos para construir +blockList=Essentials le ha cedido los siguientes comandos a otros plugins: +bookAuthorSet=\u00a76Author of the book set to {0} +bookLocked=\u00a7cThis book is now locked +bookTitleSet=\u00a76Title of the book set to {0} +broadcast=\u00a7c[\u00a76Broadcast\u00a7c]\u00a7a {0} +buildAlert=\u00a7cNo tienes permisos para construir. bukkitFormatChanged=Version de formato de Bukkit cambiado. Version no comprobada. burnMsg=\u00a77Has puesto {0} en fuego durante {1} segundos. -canTalkAgain=\u00a77Ya puedes hablar de nuevo -cantFindGeoIpDB=No se puede encontrar la bases de datos del Geo IP -cantReadGeoIpDB=Error al intentar leer la base de datos del Geo IP +canTalkAgain=\u00a77Ya puedes hablar de nuevo. +cantFindGeoIpDB=No se puede encontrar la base de datos del Geo IP. +cantReadGeoIpDB=Error al intentar leer la base de datos del Geo IP. cantSpawnItem=\u00a7cNo tienes acceso para producir este objeto {0} -chatTypeLocal=[L] -chatTypeAdmin=[A] -chatTypeSpy=[Spy] -commandFailed=Command {0} fallado: +chatTypeAdmin= +chatTypeLocal= +chatTypeSpy=[Espia] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. +commandFailed=Comando {0} fallado: commandHelpFailedForPlugin=Error obteniendo ayuda para: {0} -commandNotLoaded=\u00a7cCommand {0} esta cargado incorrectamente. +commandNotLoaded=\u00a7cComando {0} esta cargado incorrectamente. compassBearing=\u00a77Bearing: {0} ({1} grados). configFileMoveError=Error al mover config.yml para hacer una copia de seguridad de la localizacion. -configFileRenameError=Error al renombrar archivo temp a config.yml -connectedPlayers=Jugadores conectados: +configFileRenameError=Error al renombrar archivo temp a config.yml. +connectedPlayers=\u00a77Jugadores conectados\u00a7r connectionFailed=Error al abrir conexion. -cooldownWithMessage=\u00a7cCooldown: {0} +cooldownWithMessage=\u00a7cTiempo restante: {0} corruptNodeInConfig=\u00a74Notice: Tu archivo de configuracion tiene un nodo {0} incorrecto. couldNotFindTemplate=No se puede encontrar el template {0} creatingConfigFromTemplate=Creando configuracion desde el template: {0} creatingEmptyConfig=Creando configuracion vacia: {0} -creative=creative +creative=creativo currency={0}{1} -currentWorld=Current World: {0} +currentWorld=Mundo actual: {0} day=dia days=dias -defaultBanReason=Baneado por incumplir las normas! +defaultBanReason=Baneado por desobedecer las normas! deleteFileError=No se puede borrar el archivo: {0} deleteHome=\u00a77Home {0} ha sido borrado. deleteJail=\u00a77Jail {0} ha sido borrado. deleteWarp=\u00a77Warp {0} ha sido borrado. deniedAccessCommand={0} ha denegado el acceso al comando. +denyBookEdit=\u00a74You cannot unlock this book +denyChangeAuthor=\u00a74You cannot change the author of this book +denyChangeTitle=\u00a74You cannot change the title of this book dependancyDownloaded=[Essentials] Dependencia {0} descargada correctamente. dependancyException=[Essentials] Error al intentar descargar la dependencia. -dependancyNotFound=[Essentials] La dependencia necesitada no se encontro, descargandola... +dependancyNotFound=[Essentials] La dependencia necesitada no se encontro, descargando... depth=\u00a77Estas al nivel del mar. depthAboveSea=\u00a77Estas {0} bloque(s) por encima del mar. depthBelowSea=\u00a77Estas {0} bloque(s) por debajo del mar. destinationNotSet=Destino no establecido. disableUnlimited=\u00a77Desactivando colocacion ilimitada de {0} para {1}. disabled=desactivado -disabledToSpawnMob=Spawning this mob was disabled in the config file. +disabledToSpawnMob=El spawn de este mob esta deshabilitado en la configuracion. +distance=\u00a76Distancia: {0} dontMoveMessage=\u00a77Teletransporte comenzara en {0}. No te muevas. downloadingGeoIp=Descargando base de datos de GeoIP ... puede llevar un tiempo (pais: 0.6 MB, ciudad: 20MB) duplicatedUserdata=Datos de usuario duplicados: {0} y {1} -durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left +durability=\u00a77Esta herramienta tiene \u00a7c{0}\u00a77 usos restantes. +editBookContents=\u00a7eYou may now edit the contents of this book enableUnlimited=\u00a77Dando cantidad ilimitada de {0} a {1}. enabled=activado -enchantmentApplied = \u00a77The enchantment {0} has been applied to your item in hand. -enchantmentNotFound = \u00a7cEnchantment not found -enchantmentPerm = \u00a7cYou do not have the permission for {0} -enchantmentRemoved = \u00a77The enchantment {0} has been removed from your item in hand. -enchantments = \u00a77Enchantments: {0} +enchantmentApplied = \u00a77El encantamiento {0} fue aplicado al item en tu mano. +enchantmentNotFound = \u00a7cEncantamiento no encontrado. +enchantmentPerm = \u00a7cNo tienes permisos para {0} +enchantmentRemoved = \u00a77El encantamiento {0} fue removido del item en tu mano. +enchantments = \u00a77Encantamiento: {0} errorCallingCommand=Error al ejecutar el comando /{0} errorWithMessage=\u00a7cError: {0} -essentialsHelp1=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, go to http://tiny.cc/EssentialsChat -essentialsHelp2=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, either type /essentialshelp in game or go to http://tiny.cc/EssentialsChat +essentialsHelp1=Archivo corrompido, no es posible abrirlo. Essentials esta ahora desactivado. Si no puedes arreglar el archivo, ve a http://tiny.cc/EssentialsChat +essentialsHelp2=Archivo corrompido, no es posible abrirlo. Essentials esta ahora desactivado. Si no puedes arreglar el archivo, escribe /essentialshelp ingame o ve a http://tiny.cc/EssentialsChat essentialsReload=\u00a77Essentials Recargado {0} -exp=\u00a7c{0} \u00a77has\u00a7c {1} \u00a77exp (level\u00a7c {2}\u00a77) and needs\u00a7c {3} \u00a77more exp to level up. -expSet=\u00a7c{0} \u00a77now has\u00a7c {1} \u00a77exp. +exp=\u00a7c{0} \u00a77tiene\u00a7c {1} \u00a77 de exp. (nivel\u00a7c {2}\u00a77) y necesita\u00a7c {3} \u00a77de exp para subir su nivel. +expSet=\u00a7c{0} \u00a77ahora tiene\u00a7c {1} \u00a77de exp. extinguish=\u00a77Te has suicidado. extinguishOthers=\u00a77Has matado a {0}. failedToCloseConfig=Error al cerrar configuracion {0} failedToCreateConfig=Error al crear configuracion {0} failedToWriteConfig=Error al escribir configuracion {0} false=\u00a74false\u00a7f -feed=\u00a77Your appetite was sated. -feedOther=\u00a77Satisfied {0}. +feed=\u00a77Apetito satisfecho. +feedOther=\u00a77Satisfecho {0}. fileRenameError=Error al renombrar el archivo {0} -flyMode=\u00a77Set fly mode {0} for {1}. -flying=flying +fireworkColor=\u00a74You must apply a color to the firework to add an effect +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle +flyMode=\u00a77Modo de vuelo activado {0} para {1}. +flying=volando foreverAlone=\u00a7cNo tienes nadie a quien puedas responder. freedMemory= {0} MB libres. -gameMode=\u00a77Set game mode {0} for {1}. -gcchunks= pixeles, -gcentities= entidades +fullStack=\u00a74You already have a full stack +gameMode=\u00a77Modo de juego {0} activado para {1}. +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entidades gcfree=Memoria libre: {0} MB gcmax=Memoria maxima: {0} MB gctotal=Memoria localizada: {0} MB -geoIpUrlEmpty=Link para descargar GeoIP esta vacio. -geoIpUrlInvalid=Link para descargar GeoIP es invalido. -geoipJoinFormat=El jugador {0} viene de {1} -godDisabledFor=Desactivado para {0} -godEnabledFor=Activado para {0} -godMode=\u00a77Modo Dios {0}. -hatArmor=\u00a7cError, you cannot use this item as a hat! -hatEmpty=\u00a7cYou are not wearing a hat. -hatFail=\u00a7cYou must have something to wear in your hand. -hatPlaced=\u00a7eEnjoy your new hat! -haveBeenReleased=\u00a77Has sido liberado +geoIpUrlEmpty=El link para descargar GeoIP esta vacio. +geoIpUrlInvalid=El link para descargar GeoIP es invalido. +geoipJoinFormat=\u00a76El jugador \u00a7c{0} \u00a76viene de \u00a7c{1}\u00a76. +giveSpawn=\u00a76Se a dado\u00a7c {0} \u00a76de\u00a7c {1} a\u00a7c {2}\u00a76. +godDisabledFor=desactivado para {0} +godEnabledFor=activado para {0} +godMode=\u00a77Modo de dios {0}. +groupNumber={0} online, for the full list type /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! +hatArmor=\u00a7cNo puedes usar este item como sombrero! +hatEmpty=\u00a7cNo estas usando un sombrero. +hatFail=\u00a7cDebes tener un item en tu mano para usarlo de sombrero. +hatPlaced=\u00a7eDisfruta tu nuevo sombrero! +hatRemoved=\u00a7eTu sombrero a sido removido. +haveBeenReleased=\u00a77Has sido liberado. heal=\u00a77Has sido curado. +healDead=\u00a74You cannot heal someone who is dead! healOther=\u00a77Has curado a {0}. helpConsole=Para obtener ayuda de la consola, escribe ?. -helpFrom=\u00a77Commands from {0}: +helpFrom=\u00a77Comandos de {0}: helpLine=\u00a76/{0}\u00a7f: {1} -helpMatching=\u00a77Commands matching "{0}": -helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} +helpMatching=\u00a77Comandos que coinciden con "{0}": +helpOp=\u00a7c[AyudaOp]\u00a7f \u00a77{0}:\u00a7f {1} helpPages=Pagina \u00a7c{0}\u00a7f de \u00a7c{1}\u00a7f: -helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} -holeInFloor=Agujero en el suelo +helpPlugin=\u00a74{0}\u00a7f: Ayuda con los plugins: /help {1} +holdBook=\u00a74You are not holding a writable book +holdFirework=\u00a74You must be holding a firework to add effects +holdPotion=\u00a74You must be holding a potion to apply effects to it. +holeInFloor=Agujero en el suelo. homeSet=\u00a77Hogar establecido. -homeSetToBed=\u00a77Tu hogar esta ahora establecido a esta cama. +homeSetToBed=\u00a77Tu hogar esta ahora establecido en esta cama. homes=Hogares: {0} hour=hora hours=horas ignorePlayer=A partir de ahora ignoras al jugador {0}. illegalDate=Forma de fecha ilegal. infoChapter=Selecciona una seccion: -infoChapterPages=Seccion {0}, pagina \u00a7c{1}\u00a7f of \u00a7c{2}\u00a7f: +infoChapterPages=Seccion {0}, pagina \u00a7c{1}\u00a7f de \u00a7c{2}\u00a7f: infoFileDoesNotExist=El archivo info.txt no existe. Creando uno para ti. infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Pagina \u00a74{0}\u00a76/\u00a74{1} \u00a7e---- infoUnknownChapter=Seccion desconocida. -invBigger=El inventario del otro usuario es mas grande que el tuyo +invBigger=El inventario del otro usuario es mas grande que el tuyo. invRestored=Tu inventario ha sido recuperado. invSee=Estas viendo el inventario de {0}. invSeeHelp=Usa /invsee para recuperar tu inventario. invalidCharge=\u00a7cCargo invalido. -invalidHome=Home {0} doesn't exist +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1} +invalidHome=El hogar {0} no existe. +invalidHomeName=\u00a74Nombre de casa invalido invalidMob=Mob invalido. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Servidor invalido! invalidSignLine=Linea {0} en el signo es invalida. +invalidWarpName=\u00a74Nombre de warp invalido invalidWorld=\u00a7cMundo invalido. inventoryCleared=\u00a77Inventario limpiado. +inventoryClearedAll=\u00a76Cleared everyone's inventory. inventoryClearedOthers=\u00a77Inventario de \u00a7c{0}\u00a77 limpiado. is=es itemCannotBeSold=Ese objeto no puede ser vendido al servidor. itemMustBeStacked=El objeto tiene que ser intercambiado en pilas. Una cantidad de 2s seria de dos pilas, etc. +itemNames=Articulo nombres cortos: {0} itemNotEnough1=\u00a7cNo tienes suficientes ejemplares de ese objeto para venderlo. itemNotEnough2=\u00a77Si pensabas en vender todos tus objetos de ese tipo, usa /sell nombredeobjeto itemNotEnough3=\u00a77/sell nombredeobjeto -1 vendera todos excepto un objeto, etc. @@ -163,109 +198,127 @@ itemSellAir=Realmente has intentado vender Aire? Pon un objeto en tu mano! itemSold=\u00a77Vendido para \u00a7c {0} \u00a77 ({1} {2} a {3} cada uno) itemSoldConsole={0} Vendido {1} para\u00a77 {2} \u00a77({3} objetos a {4} cada uno) itemSpawn=\u00a77Dando {0} de {1} +itemType=Item: {0} - {1} itemsCsvNotLoaded=Error al leer items.csv. jailAlreadyIncarcerated=\u00a7cLa persona ya esta en la carcel: {0} jailMessage=\u00a7cPor hacer el mal, tiempo en la carcel estaras. jailNotExist=Esa carcel no existe. -jailReleased=\u00a77Player \u00a7e{0}\u00a77 liberado. +jailReleased=\u00a77Jugador \u00a7e{0}\u00a77 liberado. jailReleasedPlayerNotify=\u00a77 Has sido liberado!! -jailSentenceExtended=El tiempo en la carcel se alarga hasta: {0) -jailSet=\u00a77Carcel {0} ha sido puesta +jailSentenceExtended=El tiempo en la carcel se alarga hasta: {0} +jailSet=\u00a77La carcel {0} ha sido activada. jumpError=Eso es demasiado para tu ordenador! kickDefault=Echado del servidor. kickExempt=\u00a7cNo puedes echar a esa persona. -kickedAll=\u00a7cKicked all players from server +kickedAll=\u00a7cTodos los jugadores fueron kickeados. kill=\u00a77ha matado a {0}. -kitError2=\u00a7cEse kit no existe o esta mal escrito. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitError=\u00a7cNo hay ningun kit valido. -kitErrorHelp=\u00a7cPerhaps an item is missing a quantity in the configuration? +kitErrorHelp=\u00a7cLe falta especificar la cantidad a un item en la configuracion? kitGive=\u00a77Dando kit a {0}. -kitInvFull=\u00a7cTu inventario esta lleno, su kit se pondra en el suelo +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. +kitInvFull=\u00a7cTu inventario esta lleno, el kit se pondra en el suelo. +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. kitTimed=\u00a7c No puedes usar ese kit de nuevo para otro{0}. kits=\u00a77Kits: {0} -lightningSmited=\u00a77Acabas de ser golpeado +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. +lightningSmited=\u00a77Acabas de ser golpeado. lightningUse=\u00a77Golpeando a {0} -listAfkTag = \u00a77[AFK]\u00a7f -listAmount = \u00a79There are \u00a7c{0}\u00a79 out of maximum \u00a7c{1}\u00a79 players online. -listAmountHidden = \u00a79There are \u00a7c{0}\u00a77/{1}\u00a79 out of maximum \u00a7c{2}\u00a79 players online. -listGroupTag={0}\u00a7f: -listHiddenTag = \u00a77[HIDDEN]\u00a7f -loadWarpError=Error al cargar el tenetransporte {0} +listAfkTag = \u00a77[Lejos]\u00a7f +listAmount = \u00a79Hay \u00a7c{0}\u00a79 jugadores de un maximo de \u00a7c{1}\u00a79 jugadores online. +listAmountHidden = \u00a79Hay \u00a7c{0}\u00a79 jugadores de un maximo de \u00a7c{1}\u00a79 jugadores online. +listGroupTag={0}\u00a7f: +listHiddenTag = \u00a77[ESCONDIDO]\u00a7f +loadWarpError=Error al cargar el teletransporte {0} localFormat=Local: <{0}> {1} mailClear=\u00a7cPara marcar tu email como leido, escribe /mail clear mailCleared=\u00a77Email limpiado! mailSent=\u00a77Email enviado!! markMailAsRead=\u00a7cPara marcar tu email como leido, escribe /mail clear -markedAsAway=\u00a77Has sido puesto como AFK. +markedAsAway=\u00a77Has sido anunciado como AFK. markedAsNotAway=\u00a77Ya no estas AFK. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: maxHomes=No puedes establecer mas de {0} hogares. -mayNotJail=\u00a7cNo puedes encarcelar a esa persona +mayNotJail=\u00a7cNo puedes encarcelar a esa persona. me=yo +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minuto minutes=minutos missingItems=No tienes {0}x de {1}. missingPrefixSuffix=Falta un prefijo o un sufijo para {0} mobSpawnError=Error al cambiar la localizacion para el nacimiento de los mobs. -mobSpawnLimit=Cantidad de Mobs limitados al limite del server +mobSpawnLimit=Cantidad de Mobs limitados al limite del server. mobSpawnTarget=El block seleccionado sera el lugar donde van a nacer los mobs. mobsAvailable=\u00a77Mobs: {0} -moneyRecievedFrom=\u00a7a{0} ha sido recivido de {1} +moneyRecievedFrom=\u00a7a{0} ha sido recibido de {1} moneySentTo=\u00a7a{0} ha sido enviado a {1} moneyTaken={0} han sido sacados de tu cuenta bancaria. month=mes months=meses moreThanZero=Las cantidades han de ser mayores que 0. +moveSpeed=\u00a77Has puesto {0} velocidad a {1} por {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. muteExempt=\u00a7cNo puedes silenciar a ese jugador. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1} mutedPlayer=Player {0} silenciado. mutedPlayerFor=Player {0} silenciado durante {1}. mutedUserSpeaks={0} intento hablar, pero esta silenciado. -nearbyPlayers=Players nearby: {0} +nearbyPlayers=Jugadores cercanos: {0} negativeBalanceError=El usuario no tiene permitido tener un saldo negativo. nickChanged=Nombre de jugador cambiado. nickDisplayName=\u00a77Tienes que habilitar cambio de nombre de usuario en la configuracion de Essentials. nickInUse=\u00a7cEse nombre ya esta en uso. nickNamesAlpha=\u00a7cLos nombres tienen que ser alfanumericos. -nickNoMore=\u00a77Ya no tienes un nombre de usuario +nickNoMore=\u00a77Ya no tienes un nombre de usuario. nickOthersPermission=\u00a7cNo tienes permiso para cambiar el nombre de usuario de otros. -nickSet=\u00a77Tu nombre es ahora \u00a7c{0} +nickSet=\u00a77Tu nombre es ahora \u00a7c{0} . noAccessCommand=\u00a7cNo tienes acceso a ese comando. -noAccessPermission=\u00a7cNo tienes permisos para hacer eso {0}. -noBreakBedrock=You are not allowed to destroy bedrock. +noAccessPermission=\u00a7cNo tienes permisos para eso {0} . +noBreakBedrock=No puedes romper roca madre. +noChapterMeta=\u00a74You do not have permission to create dynamic books. noDestroyPermission=\u00a7cNo tienes permisos para destrozar eso {0}. -noDurability=\u00a7cThis item does not have a durability. -noGodWorldWarning=\u00a7cWarning! God mode in this world disabled. +noDurability=\u00a7cEste item no tiene durabilidad. +noGodWorldWarning=\u00a7cAdvertencia! El Modo de dios ha sido desactivado en este mundo. noHelpFound=\u00a7cNo hay comandos relacionados. noHomeSet=No has establecido un hogar. noHomeSetPlayer=El jugador no ha establecido un hogar. noKitPermission=\u00a7cNecesitas los \u00a7c{0}\u00a7c permisos para usar ese kit. -noKits=\u00a77No hay kits disponibles todavia -noMail=No tienes ningun email recivido +noKits=\u00a77No hay kits disponibles aun. +noMail=No has recibido ningun email. +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. noMotd=\u00a7cNo hay ningun mensaje del dia. noNewMail=\u00a77No tienes ningun correo nuevo. noPendingRequest=No tienes ninguna peticion pendiente. noPerm=\u00a7cNo tienes el permiso de \u00a7f{0}\u00a7c. -noPermToSpawnMob=\u00a7cYou don''t have permission to spawn this mob. +noPermToSpawnMob=\u00a7cNo tienes permisos para spawnear a este mob. noPlacePermission=\u00a7cNo tienes permiso para situar ese bloque en ese lugar. -noPowerTools=You have no power tools assigned. +noPowerTools=Usted no tiene ningunas herramientas el\u00c3\u00a9ctricas asignadas. noRules=\u00a7cNo hay reglas especificadas todavia. -noWarpsDefined=No hay teletransportes definidos aun +noWarpsDefined=No hay teletransportes definidos aun. none=ninguno -notAllowedToQuestion=\u00a7cYou estas autorizado para usar las preguntas. +notAllowedToQuestion=\u00a7cNo estas autorizado para usar las preguntas. notAllowedToShout=\u00a7cNo estas autorizado para gritar. -notEnoughExperience=You do not have enough experience. +notEnoughExperience=No tienes suficiente experiencia. notEnoughMoney=No tienes el dinero suficiente. -notFlying=not flying +notFlying=no volando notRecommendedBukkit=* ! * La version de bukkit no es la recomendada para esta version de Essentials. -notSupportedYet=No esta soportado aun. -nothingInHand = \u00a7cYou have nothing in your hand. +notSupportedYet=No tiene soporte por el momento. +nothingInHand = \u00a7cNo tienes nada en tu mano. now=ahora -nuke=May death rain upon them -numberRequired=Un numero es necesario, amigo. -onlyDayNight=/time solo soporta day/night. (dia/noche) +nuke=Que la muerta afecte al que no despierte. +numberRequired=Un numero es necesario, amigo . +onlyDayNight=/time solo se utiliza con los valores day o night. (dia/noche) +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). onlyPlayers=Solo los jugadores conectados pueden usar {0}. -onlySunStorm=/weather solo soporta sun/storm. (sol/tormenta) -orderBalances=Ordering balances of {0} users, please wait ... +onlySunStorm=/weather solo acepta los valores sun o storm. (sol/tormenta) +orderBalances=Creando un ranking de {0} usuarios segun su presupuesto, espera... +oversizedTempban=\u00a74You may not ban a player for this period of time. pTimeCurrent=\u00a7e{0}''s\u00a7f la hora es {1}. pTimeCurrentFixed=\u00a7e{0}''s\u00a7f la hora ha sido cambiada a {1}. pTimeNormal=\u00a7e{0}''s\u00a7f el tiempo es normal y coincide con el servidor. @@ -287,8 +340,14 @@ playerMutedFor=\u00a77Has sido silenciado durante {0} playerNeverOnServer=\u00a7cEl jugador {0} nunca estuvo en este servidor. playerNotFound=\u00a7cJugador no encontrado. playerUnmuted=\u00a77Has sido desmuteado. -pong=Tkm mi ninio! +pong=Te quiero mucho! +posPitch=\u00a76Tono: {0} (Angulo de cabeza) +posX=\u00a76X: {0} (+Este <-> -Oeste) +posY=\u00a76Y: {0} (+Arriba <-> -abajo) +posYaw=\u00a76gui\u00c3\u00b1ar: {0} (Rotacion) +posZ=\u00a76Z: {0} (+Sur <-> -Norte) possibleWorlds=\u00a77Los mundos posibles son desde el numero 0 hasta el {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. powerToolAir=El comando no se puede ejecutar en el aire. powerToolAlreadySet=El comando \u00a7c{0}\u00a7f ya esta asignado a {1}. powerToolAttach=\u00a7c{0}\u00a7f comando asignado a {1}. @@ -298,35 +357,48 @@ powerToolListEmpty={0} no tiene comandos asignados. powerToolNoSuchCommandAssigned=El comando \u00a7c{0}\u00a7f no ha sido asignado a {1}. powerToolRemove=Comando \u00a7c{0}\u00a7f borrado desde {1}. powerToolRemoveAll=Todos los comandos borrados desde {0}. -powerToolsDisabled=All of your power tools have been disabled. -powerToolsEnabled=All of your power tools have been enabled. -protectionOwner=\u00a76[EssentialsProtect] Dueño de la proteccion: {0} -questionFormat=\u00a77[Pregunta]\u00a7f {0} -readNextPage=Type /{0} {1} to read the next page +powerToolsDisabled=Todas tus herramientas de poder han sido desactivadas. +powerToolsEnabled=Todas tus herramientas de poder han sido activadas. +protectionOwner=\u00a76[EssentialsProtect] Dueno de la proteccion: {0} +questionFormat=\u00a7c[Pregunta]\u00a7f {0} +readNextPage=escribe /{0} {1} para leer la prox. pagina. +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2} +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} reloadAllPlugins=\u00a77Todos los plugins recargados. -removed=\u00a77Removed {0} entities. +removed=\u00a77{0} entidades removidas. repair=Has reparado satisfactoriamente tu: \u00a7e{0}. -repairAlreadyFixed=\u00a77Este objeto no necesita de reparado. -repairEnchanted=\u00a77You are not allowed to repair enchanted items. -repairInvalidType=\u00a7cEste objeto no puede ser reparado. -repairNone=No habia objetos que necesitasen ser reparados. +repairAlreadyFixed=\u00a77Este objeto no necesita ser reparado. +repairEnchanted=\u00a77No tienes permisos para reparar items encantados. +repairInvalidType=\u00a7cError: tipo de item invalido. +repairNone=No hay objetos que necesiten reparacion. requestAccepted=\u00a77Peticion de teletransporte aceptada. -requestAcceptedFrom=\u00a77{0} acepto tu peticion de teletransporte. +requestAcceptedFrom=\u00a77{0} ha aceptado tu peticion de teletransporte. requestDenied=\u00a77Peticion de teletransporte denegada. requestDeniedFrom=\u00a77{0} ha denegado tu peticion de teletransporte. requestSent=\u00a77Peticion enviada a {0}\u00a77. -requestTimedOut=\u00a7cTeleport request has timed out -requiredBukkit= * ! * You need atleast build {0} of CraftBukkit, download it from http://dl.bukkit.org/downloads/craftbukkit/ -returnPlayerToJailError=Error occurred when trying to return player {0} to jail: {1} +requestTimedOut=\u00a7cA la solicitud de teletransporte se le ha acabado el tiempo. +requiredBukkit= * ! * Necesitas al menos el build {0} de CraftBukkit, descargalo de http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all online players +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all players +returnPlayerToJailError=Error al intentar regresar a un jugador {0} a la carcel: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=segundo seconds=segundos seenOffline=El jugador {0} esta desconectado desde {1} -seenOnline=El jugador {0} lleva conectado desde {1} -serverFull=Servidor lleno +seenOnline=El jugador {0} esta conectado desde {1} +serverFull=Servidor lleno. serverTotal=Server Total: {0} -setSpawner=Cambiado tipo de lugar de nacimiento a {0} +setSpawner=Cambiado tipo de spawner a {0} sheepMalformedColor=Color malformado. -shoutFormat=\u00a77[Shout]\u00a7f {0} +shoutFormat=\u00a7a[Mundo]\u00a7f {0} signFormatFail=\u00a74[{0}] signFormatSuccess=\u00a71[{0}] signFormatTemplate=[{0}] @@ -336,13 +408,13 @@ slimeMalformedSize=Medidas malformadas. soloMob=A este mob le gusta estar solo spawnSet=\u00a77El lugar de nacimiento ha sido puesto para el grupo {0}. spawned=nacido -sudoExempt=You cannot sudo this user -sudoRun=Forcing {0} to run: /{1} {2} +sudoExempt=No puedes usar el comando sudo con este user. +sudoRun=Forzando {0} a ejecutar: /{1} {2} suicideMessage=\u00a77Adios mundo cruel... -suicideSuccess= \u00a77{0} se quito su propia vida -survival=survival -takenFromAccount=\u00a7c{0} ha sido sacado de tu cuenta. -takenFromOthersAccount=\u00a7c{0} taken from {1}\u00a7c account. New balance: {2} +suicideSuccess= \u00a77{0} se tiro desde un rascacielos. +survival=supervivencia +takenFromAccount=\u00a7c{0} han sido sacados de tu cuenta. +takenFromOthersAccount=\u00a7c{0} han sidos sacados de la cuenta de {1}\u00a7c . Nuevo presupuesto: {2} teleportAAll=\u00a77Peticion de teletransporte enviada a todos los jugadores... teleportAll=\u00a77Teletransportando a todos los jugadores... teleportAtoB=\u00a77{0}\u00a77 te teletransporto a {1}\u00a77. @@ -350,38 +422,40 @@ teleportDisabled={0} tiene desactivado los teletransportes. teleportHereRequest=\u00a7c{0}\u00a7c ha pedido que te teletransportes con el. teleportNewPlayerError=Error al teletransportar al nuevo jugador teleportRequest=\u00a7c{0}\u00a7c te ha pedido teletransportarse contigo. -teleportRequestTimeoutInfo=\u00a77This request will timeout after {0} seconds. +teleportRequestTimeoutInfo=\u00a77A esta solicitud se le acabara el tiempo despues de {0} segundos. teleportTop=\u00a77Teletransportandote a la cima. teleportationCommencing=\u00a77Comenzando teletransporte... teleportationDisabled=\u00a77Teletransporte desactivado. +teleportationDisabledFor=\u00a76Teleportation disabled for {0} teleportationEnabled=\u00a77Teletransporte activado. +teleportationEnabledFor=\u00a76Teleportation enabled for {0} teleporting=\u00a77Teletransportando... teleportingPortal=\u00a77Teletransportando via portal. tempBanned=Baneado temporalmente del servidor por {0} -tempbanExempt=\u00a77No puedes banear temporalmente a ese jugador +tempbanExempt=\u00a77No puedes banear temporalmente a ese jugador. thunder= Tu has {0} los truenos en tu mundo. thunderDuration=Tu has {0} los truenos en tu mundo durante {1} seconds. timeBeforeHeal=Tiempo antes de la siguiente curacion: {0} timeBeforeTeleport=Tiempo antes del proximo teletransporte: {0} -timeFormat=\u00a73{0}\u00a7f or \u00a73{1}\u00a7f or \u00a73{2}\u00a7f +timeFormat=\u00a73{0}\u00a7f o \u00a73{1}\u00a7f o \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=Time establecido en todos los mundos. +timeSet=Tiempo establecido en todos los mundos. timeSetPermission=\u00a7cNo estas autorizado para establecer la hora. timeWorldCurrent=La hora actual en {0} es \u00a73{1} -timeWorldSet=La hora ha sido establecido a {0} en: \u00a7c{1} -tps=Current TPS = {0} +timeWorldSet=La hora ha sido establecida a {0} en: \u00a7c{1} +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. +tps=TPS actual = {0} tradeCompleted=\u00a77Intercambio completado. tradeSignEmpty=Esta tienda no tiene nada disponible para ti. tradeSignEmptyOwner=No hay nada que recojer de esta tienda. treeFailure=\u00a7cError al generar arbol. Prueba de nuevo en tierra o hierba. -treeSpawned=\u00a77Arbol puesto. +treeSpawned=\u00a77Arbol generado. true=\u00a72true\u00a7f typeTpaccept=\u00a77Para teletransportarte, escribe \u00a7c/tpaccept\u00a77. typeTpdeny=\u00a77Para denegar esta peticion, escribe \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Tu tambien puedes escribir el nombre de un mundo especifico. unableToSpawnMob=No se puede generar Mobs. -unbannedIP=IP Adress desbaneada. -unbannedPlayer=Jugador desbaneado. unignorePlayer=Ya no estas ignorando al jugador {0}. unknownItemId=ID de objeto desconocido: {0} unknownItemInList=Objeto desconocido {0} en {1} lista. @@ -389,41 +463,46 @@ unknownItemName=Nombre de objeto desconocido: {0} unlimitedItemPermission=\u00a7cNo tienes permiso para objetos ilimitados {0}. unlimitedItems=Objetos ilimitados. unmutedPlayer=Jugador {0} desmuteado. -unvanished=\u00a7aYou are once again visible. -unvanishedReload=\u00a7cA reload has forced you to become visible. +unvanished=\u00a7aEres visible nuevamente. +unvanishedReload=\u00a7cUn reinicio te ha forzado a ser visible. upgradingFilesError=Error mientras se actualizaban los archivos +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond userDoesNotExist=El usuario {0} no existe userIsAway={0} esta ahora ausente! userIsNotAway={0} ya no esta ausente! userJailed=\u00a77Has sido encarcelado! +userUnknown=\u00a74Peligro: El jugador ''\u00a7c{0}\u00a74'' Nunca a ingresado a este servidor. userUsedPortal={0} uso un portal de salida existente. userdataMoveBackError=Error al mover userdata/{0}.tmp a userdata/{1} userdataMoveError=Error al mover userdata/{0} a userdata/{1}.tmp usingTempFolderForTesting=Usando carpeta temporal para pruebas: -vanished=\u00a7aYou have now been vanished. +vanished=\u00a7aHas desaparecido. versionMismatch=La version no coincide! Por favor actualiza {0} a la misma version. versionMismatchAll=La version no coincide! Por favor actualiza todos los jars de Essentials a la misma version. voiceSilenced=\u00a77Tu voz ha sido silenciada +walking=walking warpDeleteError=Problema al borrar el archivo de teletransporte. +warpList={0} warpListPermission=\u00a7cNo tienes permiso para listar esos teletransportes. warpNotExist=Ese teletransporte no existe. -warpOverwrite=\u00a7cYou cannot overwrite that warp. -warpSet=\u00a77Teletransporte {0} establecido. +warpOverwrite=\u00a7cNo puedes sobreescribir ese atajo. +warpSet=\u00a77Atajo {0} establecido. warpUsePermission=\u00a7cNo tienes permisos para usar ese teletransporte. warpingTo=\u00a77Teletransportandote a {0}. warps=Warps: {0} warpsCount=\u00a77Hay {0} teletransportes. Mostrando pagina {1} de {2}. -weatherStorm=\u00a77Has establecido el tiempo a tormenta en este mundo. -weatherStormFor=\u00a77Has establecido el tiempo a tormenta en este {1} durante {0} segundos. -weatherSun=\u00a77Has establecido el tiempo a sol en este mundo. -weatherSunFor=\u00a77Has establecido el tiempo a sol en este {1} durante {0} segundos. +weatherStorm=\u00a77Has establecido el tiempo como tormenta en este mundo. +weatherStormFor=\u00a77Has establecido el tiempo como tormenta en este {1} durante {0} segundos. +weatherSun=\u00a77Has establecido el tiempo como sol en este mundo. +weatherSunFor=\u00a77Has establecido el tiempo como sol en este {1} durante {0} segundos. whoisAFK=\u00a76 - AFK:\u00a7f {0} -whoisBanned=\u00a76 - Banned:\u00a7f {0} -whoisExp=\u00a76 - Exp:\u00a7f {0} (Level {1}) -whoisFly=\u00a76 - Fly mode:\u00a7f {0} ({1}) -whoisGamemode=\u00a76 - Gamemode:\u00a7f {0} +whoisBanned=\u00a76 - Baneado:\u00a7f {0} +whoisExp=\u00a76 - Exp:\u00a7f {0} (Nivel {1}) +whoisFly=\u00a76 - Modo de vuelo:\u00a7f {0} ({1}) +whoisGamemode=\u00a76 - Modo de juego:\u00a7f {0} whoisGeoLocation=\u00a76 - Localizacion:\u00a7f {0} -whoisGod=\u00a76 - God mode:\u00a7f {0} +whoisGod=\u00a76 - Modo de dios:\u00a7f {0} whoisHealth=\u00a76 - Salud:\u00a7f {0}/20 whoisIPAddress=\u00a76 - Direccion IP:\u00a7f {0} whoisJail=\u00a76 - Jail:\u00a7f {0} @@ -436,9 +515,26 @@ whoisTop=\u00a76 ====== WhoIs:\u00a7f {0} \u00a76====== worth=\u00a77Pila de {0} con valor de \u00a7c{1}\u00a77 ({2} objeto(s) a {3} cada uno) worthMeta=\u00a77Pila de {0} con metadata de {1} , con valor de \u00a7c{2}\u00a77 ({3} objeto(s) a {4} cada uno) worthSet=Establecer el valor de un valor -year=año -years=años +year=ano +years=anos youAreHealed=\u00a77Has sido curado. youHaveNewMail=\u00a7cTienes {0} mensajes!\u00a7f Pon \u00a77/mail read\u00a7f para ver tus emails no leidos!. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_fi.properties b/Essentials/src/messages_fi.properties index 4cb190c6fb..1f43ab94e0 100644 --- a/Essentials/src/messages_fi.properties +++ b/Essentials/src/messages_fi.properties @@ -5,10 +5,17 @@ action=* {0} {1} addedToAccount=\u00a7a{0} on lis\u00e4tty sinun tilillesi. addedToOthersAccount=\u00a7a{0} lis\u00e4tty {1}\u00a7a tilille. Uusi rahatilanne: {2} +adventure = adventure alertBroke=rikkoi: alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} sijainnissa: {3} alertPlaced=laittoi: alertUsed=k\u00e4ytti: +antiBuildBreak=\u00a74You are not permitted to break {0} blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with {0}. +antiBuildPlace=\u00a74You are not permitted to place {0} here. +antiBuildUse=\u00a74You are not permitted to use {0}. autoAfkKickReason=Sinut on potkittu, koska olit tekem\u00e4tt\u00e4 mit\u00e4\u00e4n {0} minuuttia. backAfterDeath=\u00a77K\u00e4yt\u00e4 /back komentoa p\u00e4\u00e4st\u00e4ksesi takaisin sijaintiin, jossa kuolit. backUsageMsg=\u00a77Palautetaan \u00e4skeiseen sijaintiin. @@ -18,14 +25,17 @@ backupStarted=Varmuuskopiointi aloitettu balance=\u00a77Rahatilanne: {0} balanceTop=\u00a77Top rahatilanteet ({0}) banExempt=\u00a7cEt voi bannia pelaajaa. -banIpAddress=\u00a77Bannattu IP osoite -bannedIpsFileError=Virhe luettaessa banned-ips.txt tiedostoa -bannedIpsFileNotFound=banned-ips.txt tiedostoa ei l\u00f6ydy -bannedPlayersFileError=Virhe luettaessa banned-players.txt tiedostoa -bannedPlayersFileNotFound=banned-players.txt ei l\u00f6ydy +banFormat=Banned: {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7cIson puun luominen ep\u00e4onnistui. Yrit\u00e4 uudelleen nurmikolla tai mullalla. bigTreeSuccess= \u00a77Iso puu luotu. blockList=Essentials siirsi seuraavat komennot muihin plugineihin: +bookAuthorSet=\u00a76Author of the book set to {0} +bookLocked=\u00a7cThis book is now locked +bookTitleSet=\u00a76Title of the book set to {0} broadcast=[\u00a7cIlmoitus\u00a7f]\u00a7a {0} buildAlert=\u00a7cSinulla ei ole oikeuksia rakentaa bukkitFormatChanged=Bukkitin versiomuoto muuttui. Versiota ei ole tarkistettu. @@ -34,15 +44,18 @@ canTalkAgain=\u00a77Voit taas puhua cantFindGeoIpDB=Ei l\u00f6ydetty GeoIP tietokantaa! cantReadGeoIpDB=Ei pystytty lukemaan GeoIP tietokantaa! cantSpawnItem=\u00a7cSinulla ei ole oikeutta luoda tavaraa {0} +chatTypeAdmin=[A] chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. commandFailed=Komento {0} ep\u00e4onnistui: commandHelpFailedForPlugin=Virhe haettaessa apua komennoista: {0} commandNotLoaded=\u00a7cKomento {0} on v\u00e4\u00e4rin ladattu. compassBearing=\u00a77Osoittaa: {0} ({1} astetta). configFileMoveError=Virhe siirrett\u00e4ess\u00e4 tiedostoa config.yml varmuuskopio sijaintiin. configFileRenameError=Virhe nimett\u00e4ess\u00e4 tiedostoa temp tiedostoon config.yml -connectedPlayers=Liittyneet pelaajat: +connectedPlayers=\u00a77Liittyneet pelaajat\u00a77r connectionFailed=Virhe avattaessa yhteytt\u00e4. cooldownWithMessage=\u00a7cJ\u00e4\u00e4htyminen: {0} corruptNodeInConfig=\u00a74Huom: Sinun konfigurointi tiedostossa on virhe {0}. @@ -60,6 +73,9 @@ deleteHome=\u00a77Koti {0} on poistettu. deleteJail=\u00a77Vankila {0} on poistettu. deleteWarp=\u00a77Warp {0} on poistettu. deniedAccessCommand={0} p\u00e4\u00e4sy komentoon ev\u00e4ttiin. +denyBookEdit=\u00a74You cannot unlock this book +denyChangeAuthor=\u00a74You cannot change the author of this book +denyChangeTitle=\u00a74You cannot change the title of this book dependancyDownloaded=[Essentials] Tarvittu tiedosto {0} ladattu onnistuneesti. dependancyException=[Essentials] Virhe ladattaessa tarvittua tiedostoa dependancyNotFound=[Essentials] Tarvittua tiedostoa ei l\u00f6ydy, ladataan nyt. @@ -70,10 +86,12 @@ destinationNotSet=Sijaintia ei ole m\u00e4\u00e4ritetty disableUnlimited=\u00a77Poistettu k\u00e4yt\u00f6st\u00e4 loputon laittaminen tavaralta "{0}", pelaajalta {1}. disabled=poissa k\u00e4yt\u00f6st\u00e4 disabledToSpawnMob=T\u00e4m\u00e4n mobin luominen on poistettu k\u00e4yt\u00f6st\u00e4 config tiedostossa. +distance=\u00a76Distance: {0} dontMoveMessage=\u00a77Teleportataan {0} kuluttua. \u00c4l\u00e4 liiku. downloadingGeoIp=Ladataan GeoIP tietokantaa ... t\u00e4m\u00e4 voi vied\u00e4 hetken (maa: 0.6 MB, kaupunki: 20MB) duplicatedUserdata=Kopioitu k\u00e4ytt\u00e4j\u00e4n tiedot: {0} ja {1} durability=\u00a77T\u00e4ll\u00e4 ty\u00f6kalulla on \u00a7c{0}\u00a77 k\u00e4ytt\u00f6kertaa j\u00e4ljell\u00e4 +editBookContents=\u00a7eYou may now edit the contents of this book enableUnlimited=\u00a77Annetaan loputon m\u00e4\u00e4r\u00e4 tavaraa "{0}" pelaajalle {1}. enabled=k\u00e4yt\u00f6ss\u00e4 enchantmentApplied = \u00a77Parannus "{0}" on lis\u00e4tty tavaraan k\u00e4dess\u00e4si. @@ -97,26 +115,36 @@ false=v\u00e4\u00e4r\u00e4 feed=\u00a77Ruokahalusi on tyydytetty. feedOther=\u00a77Tyydytit ruokahalun pelaajalta {0}. fileRenameError={0} uudelleen nime\u00e4minen ep\u00e4onnistui +fireworkColor=\u00a74You must apply a color to the firework to add an effect +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle flyMode=\u00a77Lento {0} pelaajalla {1}. +flying=flying foreverAlone=\u00a7cSinulla ei ole ket\u00e4\u00e4n kenelle vastata. freedMemory=Vapaata muistia {0} MB. +fullStack=\u00a74You already have a full stack gameMode=\u00a77Asetit pelimuodon "{0}" pelaajalle {1}. -gcchunks= chunkkia, -gcentities= kokonaisuutta +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities gcfree=Vapaa muisti: {0} MB gcmax=Maksimi muisti: {0} MB gctotal=Sallittu muisti: {0} MB geoIpUrlEmpty=GeoIP latausosoite on tyhj\u00e4. geoIpUrlInvalid=GeoIP latausosoite on viallinen. -geoipJoinFormat=Pelaaja {0} tulee maasta {1} +geoipJoinFormat=\u00a76Pelaaja \u00a7c{0} \u00a76tulee maasta \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. godDisabledFor=poistettu pelaajalta {0} godEnabledFor=laitettu pelaajalle {0} godMode=\u00a77God muoto {0}. +groupNumber={0} online, for the full list type /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! hatArmor=\u00a7cVirhe, et voi k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 tavaraa hattuna! +hatEmpty=\u00a7cYou are not wearing a hat. hatFail=\u00a7cSinulla tulee olla jotain k\u00e4dess\u00e4si, mit\u00e4 k\u00e4ytt\u00e4\u00e4 hattuna. hatPlaced=\u00a7eNauti uudesta hatustasi! +hatRemoved=\u00a7eYour hat has been removed. haveBeenReleased=\u00a77Sinut on vapautettu heal=\u00a77Sinut on parannettu. +healDead=\u00a74You cannot heal someone who is dead! healOther=\u00a77Paransit pelaajan {0}. helpConsole=Katsoaksesi apua konsolista, kirjoita ?. helpFrom=\u00a77Komennot {0}: @@ -125,6 +153,9 @@ helpMatching=\u00a77Komennot "{0}": helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} helpPages=Sivu \u00a7c{0}\u00a7f / \u00a7c{1}\u00a7f: helpPlugin=\u00a74{0}\u00a7f: Plugin apu: /help {1} +holdBook=\u00a74You are not holding a writable book +holdFirework=\u00a74You must be holding a firework to add effects +holdPotion=\u00a74You must be holding a potion to apply effects to it. holeInFloor=Reik\u00e4 lattiassa homeSet=\u00a77Koti asetettu. homeSetToBed=\u00a77Sinun koti on nyt asetettu t\u00e4h\u00e4n s\u00e4nkyyn. @@ -143,16 +174,23 @@ invRestored=Sinun reppusi on palautettu. invSee=N\u00e4et pelaajan {0} repun. invSeeHelp=K\u00e4yt\u00e4 /invsee kun haluat palauttaa oman reppusi. invalidCharge=\u00a7cMit\u00e4t\u00f6n m\u00e4\u00e4r\u00e4ys. +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1} invalidHome=Kotia {0} ei ole olemassa +invalidHomeName=\u00a74Invalid home name invalidMob=Kelvoton mobin tyyppi. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Kelvoton palvelin! invalidSignLine=Kyltin rivi {0} on viallinen. +invalidWarpName=\u00a74Invalid warp name invalidWorld=\u00a7cKelvoton maailma. inventoryCleared=\u00a77Reppu tyhjennetty. +inventoryClearedAll=\u00a76Cleared everyone's inventory. inventoryClearedOthers=\u00a77Pelaajan \u00a7c{0}\u00a77 reppu on tyhjennetty. is=on itemCannotBeSold=Tuota tavaraa ei voi myyd\u00e4 t\u00e4ll\u00e4 palvelimella. itemMustBeStacked=Tavara pit\u00e4\u00e4 vaihtaa pakattuina. M\u00e4\u00e4r\u00e4 2s olisi kaksi pakettia, jne. +itemNames=Item short names: {0} itemNotEnough1=\u00a7cSinulla ei ole tarpeeksi tavaraa jota myyd\u00e4. itemNotEnough2=\u00a77Jos haluat myyd\u00e4 kaikki tuon tyypin tavarat, k\u00e4yt\u00e4 /sell tavarannimi itemNotEnough3=\u00a77/sell itemname -1 myy kaiken paitsi yhden, jne. @@ -160,32 +198,38 @@ itemSellAir=Yritit myyd\u00e4 ilmaa? Laita tavara k\u00e4teesi ja yrit\u00e4 uud itemSold=\u00a77Myy \u00a7c{0} \u00a77({1} {2} hintaan {3} kpl) itemSoldConsole={0} sold {1} for \u00a77{2} \u00a77({3} items at {4} each) itemSpawn=\u00a77Annetaan {0} kpl {1} +itemType=Item: {0} - {1} itemsCsvNotLoaded=Ei voida ladata tiedostoa items.csv. jailAlreadyIncarcerated=\u00a7cPelaaja on jo vankilassa: {0} jailMessage=\u00a7cSin\u00e4 teet rikoksen, istut my\u00f6s sen mukaan. jailNotExist=Tuota vankilaa ei ole olemassa. jailReleased=\u00a77Pelaaja \u00a7e{0}\u00a77 vapautettu. jailReleasedPlayerNotify=\u00a77Sinut on vapautettu! -jailSentenceExtended=Vankila aika pidennetty: {0) +jailSentenceExtended=Vankila aika pidennetty: {0} jailSet=\u00a77Vankila {0} on asetettu jumpError=Tuo vahingoittaisi koneesi aivoja. kickDefault=Potkittu palvelimelta kickExempt=\u00a7cEt voi potkia h\u00e4nt\u00e4. kickedAll=\u00a7cPotkittu kaikki pelaajat palvelimelta kill=\u00a77Tappoi {0}. -kitError2=\u00a7cTuota pakkausta ei ole olemassa tai se on v\u00e4\u00e4rin muokattu. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitError=\u00a7cEi ole sopivia pakkauksia. kitErrorHelp=\u00a7cEhk\u00e4 tavaralle ei ole m\u00e4\u00e4ritetty m\u00e4\u00e4r\u00e4\u00e4 configissa? kitGive=\u00a77Annetaan pakkausta "{0}". +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. kitInvFull=\u00a7cSinun reppusi on t\u00e4ynn\u00e4, laitetaan tavarat maahan +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. kitTimed=\u00a7cAika, jota ennen et voi k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 pakkausta uudelleen: {0}. kits=\u00a77Pakkaukset: {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. lightningSmited=\u00a77Sinut on salamoitu lightningUse=\u00a77Salamoidaan {0} listAfkTag = \u00a77[AFK]\u00a7f listAmount = \u00a79Pelaajia palvelimella \u00a7c{0}\u00a79 / \u00a7c{1}\u00a79. listAmountHidden = \u00a79Pelaajia palvelimella \u00a7c{0}\u00a77/{1}\u00a79 / \u00a7c{2}\u00a79. -listGroupTag={0}\u00a7f: +listGroupTag={0}\u00a7f: listHiddenTag = \u00a77[HIDDEN]\u00a7f loadWarpError=Virhe ladattaessa warppia {0} localFormat=Paikallinen: <{0}> {1} @@ -195,9 +239,11 @@ mailSent=\u00a77Viesti l\u00e4hetetty! markMailAsRead=\u00a7cMerkitse viestit luetuiksi, kirjoita /mail clear markedAsAway=\u00a77Sinut on laitettu poissaolevaksi. markedAsNotAway=\u00a77Sinua ei ole en\u00e4\u00e4 laitettu poissaolevaksi. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: maxHomes=Voit asettaa maksimissaan {0} kotia. mayNotJail=\u00a7cEt voi laittaa tuota pelaajaa vankilaan me=min\u00e4 +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minuutti minutes=minuuttia missingItems=Sinulla ei ole {0}kpl {1}. @@ -212,8 +258,12 @@ moneyTaken={0} veloitettiin sinun tililt\u00e4si. month=kuukausi months=kuukaudet moreThanZero=M\u00e4\u00e4r\u00e4n pit\u00e4\u00e4 olla enemm\u00e4n kuin 0. +moveSpeed=\u00a77Set {0} speed to {1} for {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. muteExempt=\u00a7cEt voi hiljent\u00e4\u00e4 tuota pelaajaa. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1} mutedPlayer=Pelaaja {0} hiljennetty. mutedPlayerFor=Pelaaja {0} hiljennetty, koska {1}. mutedUserSpeaks={0} yritti puhua, mutta oli hiljennetty. @@ -229,6 +279,7 @@ nickSet=\u00a77Lempinimesi on nyt \u00a7c{0} noAccessCommand=\u00a7cSinulla ei ole oikeutta tuohon komentoon. noAccessPermission=\u00a7cSinulla ei ole oikeutta tuohon {0}. noBreakBedrock=Sinulla ei ole lupaa tuhota bedrock-palikoita. +noChapterMeta=\u00a74You do not have permission to create dynamic books. noDestroyPermission=\u00a7cSinulla ei ole lupaa tuhota sit\u00e4 {0}. noDurability=\u00a7cT\u00e4ll\u00e4 tavaralla ei ole kestoa. noGodWorldWarning=\u00a7cVaroitus! God muoto ei ole k\u00e4yt\u00f6ss\u00e4 t\u00e4ss\u00e4 maailmassa. @@ -238,6 +289,9 @@ noHomeSetPlayer=Pelaaja ei ole asettanut kotia. noKitPermission=\u00a7cTarvitset \u00a7c{0}\u00a7c oikeuden, jotta voit k\u00e4ytt\u00e4\u00e4 tuota pakkausta. noKits=\u00a77Ei pakkauksia saatavilla viel\u00e4 noMail=Ei uusia viestej\u00e4 +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. noMotd=\u00a7cEi ole p\u00e4iv\u00e4n viesti\u00e4. noNewMail=\u00a77Ei viestej\u00e4. noPendingRequest=Sinulla ei ole odottavia pyynt\u00f6j\u00e4. @@ -252,6 +306,7 @@ notAllowedToQuestion=\u00a7cSinulla ei ole lupaa k\u00e4ytt\u00e4\u00e4 kysymyst notAllowedToShout=\u00a7cSinulla ei ole lupaa huutaa. notEnoughExperience=Sinulla ei ole tarpeeksi kokemusta. notEnoughMoney=Sinulla ei ole riitt\u00e4v\u00e4sti rahaa. +notFlying=not flying notRecommendedBukkit= * ! * Bukkit versio ei ole suositeltu t\u00e4m\u00e4n Essentials version kanssa. notSupportedYet=Ei tueta viel\u00e4. nothingInHand = \u00a7cSinulla ei ole mit\u00e4\u00e4n k\u00e4dess\u00e4si. @@ -259,9 +314,11 @@ now=nyt nuke=Antaa kuoleman sateen kohdata heid\u00e4t numberRequired=Numero menee tuohon, h\u00f6lm\u00f6. onlyDayNight=/time tukee vain day/night. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). onlyPlayers=Vain peliss\u00e4 olevat pelaajat voivat k\u00e4ytt\u00e4\u00e4 {0}. onlySunStorm=/weather tukee vain sun/storm. orderBalances=J\u00e4rjestet\u00e4\u00e4n rahatilanteita {0}, odota... +oversizedTempban=\u00a74You may not ban a player for this period of time. pTimeCurrent=Pelaajan \u00a7e{0}\u00a7f aika on {1}. pTimeCurrentFixed=Pelaajan \u00a7e{0}\u00a7f aika on korjattu {1}. pTimeNormal=Pelaajan \u00a7e{0}\u00a7f aika on normaali ja vastaa palvelimen aikaa. @@ -284,7 +341,13 @@ playerNeverOnServer=\u00a7cPelaaja {0} ei ole koskaan ollut t\u00e4ll\u00e4 palv playerNotFound=\u00a7cPelaajaa ei l\u00f6ydetty. playerUnmuted=\u00a77Sin\u00e4 voit taas puhua pong=Pong! +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) possibleWorlds=\u00a77Mahdollisia maailmoja on numerot v\u00e4lilt\u00e4 0 - {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. powerToolAir=Komentoa ei voi liitt\u00e4\u00e4 k\u00e4teen. powerToolAlreadySet=Komento \u00a7c{0}\u00a7f on liitetty kohteeseen {1}. powerToolAttach=\u00a7c{0}\u00a7f komento liitetty kohteeseen {1}. @@ -299,6 +362,16 @@ powerToolsEnabled=Kaikki voimaty\u00f6alut on otettu k\u00e4ytt\u00f6\u00f6n. protectionOwner=\u00a76[EssentialsProtect] Suojauksen omistaja: {0} questionFormat=\u00a77[Question]\u00a7f {0} readNextPage=Kirjoita /{0} {1} lukeaksesi seuraavan sivun +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2} +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} reloadAllPlugins=\u00a77Kaikki pluginit uudelleen ladattu. removed=\u00a77Poistettu {0} kokonaisuutta. repair=Onnistuneesti korjasit ty\u00f6kalun: \u00a7e{0}. @@ -313,7 +386,10 @@ requestDeniedFrom=\u00a77{0} kielt\u00e4ytyi sinun teleportti pyynn\u00f6st\u00e requestSent=\u00a77Pyynt\u00f6 l\u00e4hetetty pelaajalle {0}\u00a77. requestTimedOut=\u00a7cTeleportti pyynt\u00f6 aikakatkaistiin requiredBukkit= * ! * Tarvitset v\u00e4hint\u00e4\u00e4n {0} version CraftBukkitista, lataa se osoitteesta http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all online players +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all players returnPlayerToJailError=Virhe laitettaessa pelaaja {0} takaisin vankilaan: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=sekunti seconds=sekuntia seenOffline=Pelaaja {0} on ollut offline jo {1} @@ -350,7 +426,9 @@ teleportRequestTimeoutInfo=\u00a77T\u00e4m\u00e4 pyynt\u00f6 aikakatkaistaan {0} teleportTop=\u00a77Teleportataan p\u00e4\u00e4lle. teleportationCommencing=\u00a77Teleportataan... teleportationDisabled=\u00a77Teleporttaus poistettu k\u00e4yt\u00f6st\u00e4. +teleportationDisabledFor=\u00a76Teleportation disabled for {0} teleportationEnabled=\u00a77Teleportation otettu k\u00e4ytt\u00f6\u00f6n. +teleportationEnabledFor=\u00a76Teleportation enabled for {0} teleporting=\u00a77Teleportataan... teleportingPortal=\u00a77Teleportataan portaalin kautta. tempBanned=Olet v\u00e4liaikaisesti bannattu palvelimelta, koska {0} @@ -365,6 +443,8 @@ timeSet=Aika asetettu kaikissa maailmoissa. timeSetPermission=\u00a7cSinulla ei ole lupaa vaihtaa aikaa. timeWorldCurrent=T\u00e4m\u00e4nhetkinen aika maailmassa {0} on \u00a73{1} timeWorldSet=Aika vaihdettiin {0} maailmassa: \u00a7c{1} +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. tps=T\u00e4m\u00e4nhetkinen TPS = {0} tradeCompleted=\u00a77Vaihto suoritettu. tradeSignEmpty=Vaihtokyltill\u00e4 ei ole mit\u00e4\u00e4n tarjolla sinulle. @@ -376,8 +456,6 @@ typeTpaccept=\u00a77Hyv\u00e4ksy\u00e4ksesi, kirjoita \u00a7c/tpaccept\u00a77. typeTpdeny=\u00a77Kielt\u00e4\u00e4ksesi, kirjoita \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Voit my\u00f6s laittaa maailman nimen. unableToSpawnMob=Ei voida luoda mobia. -unbannedIP=Unbanned IP osoite. -unbannedPlayer=Unbanned pelaaja. unignorePlayer=Otat taas huomioon pelaajan {0}. unknownItemId=Tuntematon tavaran ID: {0} unknownItemInList=Tuntematon tavara {0} listassa {1}. @@ -388,10 +466,13 @@ unmutedPlayer=Pelaajat {0} voi taas puhua. unvanished=\u00a7aOlet taas n\u00e4kyvill\u00e4. unvanishedReload=\u00a7cSinut on pakotettu taas n\u00e4kyv\u00e4ksi uudelleen latauksen vuoksi. upgradingFilesError=Virhe p\u00e4ivitett\u00e4ess\u00e4 tiedostoja +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond userDoesNotExist=Pelaajaa {0} ei ole olemassa. userIsAway={0} on nyt AFK userIsNotAway={0} ei ole en\u00e4\u00e4 AFK userJailed=\u00a77Sinut on laitettu vankilaan +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} k\u00e4ytti portaalia. userdataMoveBackError=Virhe siirrett\u00e4ess\u00e4 k\u00e4ytt\u00e4j\u00e4n tietoja/{0}.tmp k\u00e4ytt\u00e4j\u00e4n tietoihin/{1} userdataMoveError=Virhe siirrett\u00e4ess\u00e4 k\u00e4ytt\u00e4j\u00e4n tietoja/{0} k\u00e4ytt\u00e4j\u00e4n tietoihin/{1}.tmp @@ -400,7 +481,9 @@ vanished=\u00a7aOlet n\u00e4kym\u00e4t\u00f6n. versionMismatch=Versiot eiv\u00e4t t\u00e4sm\u00e4\u00e4! P\u00e4ivit\u00e4 {0} samaan versioon. versionMismatchAll=Versiot eiv\u00e4t t\u00e4sm\u00e4\u00e4! P\u00e4ivit\u00e4 kaikki Essentialsin jar tiedostot samaan versioon. voiceSilenced=\u00a77Sinun \u00e4\u00e4ni on hiljennetty +walking=walking warpDeleteError=Virhe poistettaessa warp tiedostoa. +warpList={0} warpListPermission=\u00a7cSinulla ei ole oikeuksia n\u00e4hd\u00e4 warp-listaa. warpNotExist=Tuota warppia ei ole olemassa. warpOverwrite=\u00a7cEt voi korvata tuota warppia. @@ -413,20 +496,22 @@ weatherStorm=\u00a77Laitoit myrskyn maailmaan {0} weatherStormFor=\u00a77Laitoit myrskyn maailmaan {0} {1} sekunniksi weatherSun=\u00a77Laitoit auringon paistamaan maailmaan {0} weatherSunFor=\u00a77Laitoit auringon paistamaan maailmaan {0} {1} sekunniksi -whoisBanned=\u00a79 - Bannattu: {0} -whoisExp=\u00a79 - Exp: {0} (Taso {1}) -whoisGamemode=\u00a79 - Pelimuoto: {0} -whoisGeoLocation=\u00a79 - Sijainti: {0} -whoisGod=\u00a79 - God muoto: {0} -whoisHealth=\u00a79 - Terveys: {0}/20 -whoisIPAddress=\u00a79 - IP Osoite: {0} -whoisIs={0} on {1} -whoisJail=\u00a79 - Vankila: {0} -whoisLocation=\u00a79 - Sijainti: ({0}, {1}, {2}, {3}) -whoisMoney=\u00a79 - Raha: {0} -whoisOP=\u00a79 - OP: {0} -whoisStatusAvailable=\u00a79 - Tilanne: Saatavilla -whoisStatusAway=\u00a79 - Tilanne: \u00a7cPoissa\u00a7f +whoisAFK=\u00a76 - AFK:\u00a7f {0} +whoisBanned=\u00a76 - Banned:\u00a7f {0} +whoisExp=\u00a76 - Exp:\u00a7f {0} (Level {1}) +whoisFly=\u00a76 - Fly mode:\u00a7f {0} ({1}) +whoisGamemode=\u00a76 - Gamemode:\u00a7f {0} +whoisGeoLocation=\u00a76 - Location:\u00a7f {0} +whoisGod=\u00a76 - God mode:\u00a7f {0} +whoisHealth=\u00a76 - Health:\u00a7f {0}/20 +whoisIPAddress=\u00a76 - IP Address:\u00a7f {0} +whoisJail=\u00a76 - Jail:\u00a7f {0} +whoisLocation=\u00a76 - Location:\u00a7f ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - Money:\u00a7f {0} +whoisMuted=\u00a76 - Muted:\u00a7f {0} +whoisNick=\u00a76 - Nick:\u00a7f {0} +whoisOp=\u00a76 - OP:\u00a7f {0} +whoisTop=\u00a76 ====== WhoIs:\u00a7f {0} \u00a76====== worth=\u00a77Pino tavaraa "{0}" on arvoltaan \u00a7c{1}\u00a77 ({2} tavara(a) = {3} kappale) worthMeta=\u00a77Pino tavaraa "{0}" metadatan kanssa {1} on arvoltaan \u00a7c{2}\u00a77 ({3} tavara(a) = {4} kappale) worthSet=Arvo asetettu @@ -434,5 +519,22 @@ year=vuosi years=vuosia youAreHealed=\u00a77Sinut on parannettu. youHaveNewMail=\u00a7cSinulla on {0} viesti(\u00e4)!\u00a7f Kirjoita \u00a77/mail read\u00a7f lukeaksesi viestit. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_fr.properties b/Essentials/src/messages_fr.properties index c74f68b3af..ada1a0a740 100644 --- a/Essentials/src/messages_fr.properties +++ b/Essentials/src/messages_fr.properties @@ -3,56 +3,68 @@ # Translations start here # by: L\u00e9a Gris action=* {0} {1} -addedToAccount=\u00a7a{0} a \u00e9t\u00e9 rajout\u00e9 \u00e0 votre compte. -addedToOthersAccount=\u00a7a{0} added to {1}\u00a7a account. New balance: {2} +addedToAccount=\u00a7a{0} ont \u00e9t\u00e9 ajout\u00e9 \u00e0 votre compte. +addedToOthersAccount=\u00a7a{0} ajout\u00e9s au compte de {1}\u00a7a. Nouveau solde : {2} +adventure = aventure alertBroke=a cass\u00e9 : alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} \u00e0:{3} alertPlaced=a plac\u00e9 : alertUsed=a utilis\u00e9 : +antiBuildBreak=\u00a74Vous n'\u00eates pas autoris\u00e9s \u00e0 casser des blocs de {0} ici. +antiBuildCraft=\u00a74Vous n'\u00eates pas autoris\u00e9s \u00e0 cr\u00e9er\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74Vous n'\u00eates pas autoris\u00e9s \u00e0 jeter\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74Vous n'\u00eates pas autoris\u00e9s \u00e0 interagir avec {0}. +antiBuildPlace=\u00a74Vous n'\u00eates pas autoris\u00e9s \u00e0 placer {0} ici. +antiBuildUse=\u00a74Vous n'\u00eates pas autoris\u00e9s \u00e0 utliser {0}. autoAfkKickReason=Vous avez \u00e9t\u00e9 \u00e9ject\u00e9 pour inactivit\u00e9e sup\u00e9rieure \u00e0 {0} minutes. backAfterDeath=\u00a77Utilisez la commande /back pour retourner \u00e0 l''endroit ou vous \u00eates mort. -backUsageMsg=\u00a77Retour \u00e0 votre emplacement pr\u00e9c\u00c3\u00a8dent. -backupDisabled=An external backup script has not been configured. +backUsageMsg=\u00a77Retour \u00e0 votre emplacement pr\u00e9c\u00e9dent. +backupDisabled=Aucun script de backup externe n'a \u00e9t\u00e9 configur\u00e9. backupFinished=Sauvegarde termin\u00e9 backupStarted=D\u00e9but de la sauvegarde... balance=\u00a77Solde : {0} balanceTop=\u00a77Meilleurs soldes au ({0}) banExempt=\u00a77Vous ne pouvez pas bannir ce joueur. -banIpAddress=\u00a77Adresse IP bannie. -bannedIpsFileError=Erreur de lecture de banned-ips.txt -bannedIpsFileNotFound=Fichier banned-ips.txt introuvable -bannedPlayersFileError=Erreur lors de la lecture de banned-players.txt -bannedPlayersFileNotFound=banned-players.txt introuvable. +banFormat=Banni : {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7c\u00c9chec de la g\u00e9n\u00e9ration du gros arbre. Essayez de nouveau sur de la terre ou de l'herbe. bigTreeSuccess=\u00a77Gros arbre cr\u00e9e. -blockList=Essentials relayed the following commands to another plugin: +blockList=Essentials a relay\u00e9 les commandes suivantes \u00e0 un autre plugin : +bookAuthorSet=\u00a76L''auteur du livre a \u00e9t\u00e9 modifi\u00e9 à {0}. +bookLocked=\u00a7cCe libre est maintenant sign\u00e9. +bookTitleSet=\u00a76Le titre du livre est maintenant {0}. broadcast=[\u00a7cMessage\u00a7f]\u00a7a {0} buildAlert=\u00a7cVous n'avez pas la permission de construire. bukkitFormatChanged=Le format de la version de Bukkit a \u00e9t\u00e9 chang\u00e9. La version n''a pas \u00e9t\u00e9 v\u00e9rifi\u00e9e. burnMsg=\u00a77Vous avez enflamm\u00e9 {0} pour {1} seconde(s). canTalkAgain=\u00a77Vous pouvez de nouveau parler. -cantFindGeoIpDB=N'arrive pas \u00e0 trouver la base de donn\u00e9es GeoIP! +cantFindGeoIpDB=Essentials n'arrive pas \u00e0 trouver la base de donn\u00e9es GeoIP! cantReadGeoIpDB=Echec de la lecture de la base de donn\u00e9es GeoIP! -cantSpawnItem=\u00a7cVous n''avez pas le droit de faire appara\u00c3\u00aetre {0} -chatTypeLocal=[L] +cantSpawnItem=\u00a7cVous n''avez pas le droit de faire appara\u00eetre {0} chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Fichiers joueurs nettoy\u00e9s. +cleaning=Nettoyage des fichiers joueurs... commandFailed=\u00c9chec de la commande {0} : commandHelpFailedForPlugin=Erreur d''obtention d''aide pour : {0} commandNotLoaded=\u00a7cLa commande {0} a \u00e9t\u00e9 mal charg\u00e9e. compassBearing=\u00a77Orientation : {0} ({1} degr\u00e9s). configFileMoveError=\u00c9chec du d\u00e9placement de config.yml vers l'emplacement de sauvegarde. configFileRenameError=\u00c9chec du changement de nom du fichier temporaire de config.yml -connectedPlayers=Joueurs connect\u00e9s : -connectionFailed=\u00c9chec de l'ouverture de la connexion. +connectedPlayers=\u00a77Joueurs connect\u00e9s\u00a7r +connectionFailed=\u00c9chec de la connexion. cooldownWithMessage=\u00a7cR\u00e9utilisation : {0} -corruptNodeInConfig=\u00a74Annonce : Votre fichier de configuration a un {0} n\u0153ud corrompu. -couldNotFindTemplate=Le mod\u00c3\u00a8le {0} est introuvable -creatingConfigFromTemplate=Cr\u00e9ation de la configuration \u00e0 partir du mod\u00c3\u00a8le : {0} +corruptNodeInConfig=\u00a74Annonce : votre fichier de configuration a un {0} n\u0153ud corrompu. +couldNotFindTemplate=Le mod\u00e8le {0} est introuvable +creatingConfigFromTemplate=Cr\u00e9ation de la configuration \u00e0 partir du mod\u00e8le : {0} creatingEmptyConfig=Cr\u00e9ation d''une configuration vierge : {0} creative=cr\u00e9atif currency={0}{1} -currentWorld=Current World: {0} +currentWorld=Monde actuel : {0} day=jour days=jours defaultBanReason=Le marteau du bannissement a frapp\u00e9 ! @@ -60,75 +72,91 @@ deleteFileError=Le fichier {0} n''a pas pu \u00eatre supprim\u00e9 deleteHome=\u00a77La r\u00e9sidence {0} a \u00e9t\u00e9 supprim\u00e9e. deleteJail=\u00a77La prison {0} a \u00e9t\u00e9 supprim\u00e9e. deleteWarp=\u00a77Warp {0} supprim\u00e9. -deniedAccessCommand=L''acc\u00c3\u00a8s \u00e0 la commande a \u00e9t\u00e9 refus\u00e9 pour {0}. +deniedAccessCommand=L''acc\u00e8s \u00e0 la commande a \u00e9t\u00e9 refus\u00e9 pour {0}. +denyBookEdit=\u00a74Vous ne pouvez pas \u00e9diter ce livre. +denyChangeAuthor=\u00a74Vous ne pouvez pas changer l'auteur de ce livre. +denyChangeTitle=\u00a74Vous ne pouvez pas changer le titre de ce livre. dependancyDownloaded=[Essentials] Fichier {0} correctement t\u00e9l\u00e9charg\u00e9. dependancyException=[Essentials] Une erreur est survenue lors de la tentative de t\u00e9l\u00e9chargement. dependancyNotFound=[Essentials] Une d\u00e9pendance requise n'a pas \u00e9t\u00e9 trouv\u00e9e, t\u00e9l\u00e9chargement en cours. depth=\u00a77Vous \u00eates au niveau de la mer. -depthAboveSea=\u00a77Vous \u00eates \u00e0 {0} bloc(s) au-dessus du niveau de la mer. -depthBelowSea=\u00a77Vous \u00eates \u00e0 {0} bloc(s) en-dessous du niveau de la mer. +depthAboveSea=\u00a77Vous \u00eates \u00e0 {0} bloc(s) au dessus du niveau de la mer. +depthBelowSea=\u00a77Vous \u00eates \u00e0 {0} bloc(s) en dessous du niveau de la mer. destinationNotSet=Destination non d\u00e9finie disableUnlimited=\u00a77D\u00e9sactivation du placement illimit\u00e9 de {0} pour {1}. disabled=d\u00e9sactiv\u00e9 -disabledToSpawnMob=Spawning this mob was disabled in the config file. +disabledToSpawnMob=L'invocation de ce monstre a \u00e9t\u00e9 d\u00e9sactiv\u00e9e dans le fichier de configuration. +distance=\u00a76Distance : {0} dontMoveMessage=\u00a77La t\u00e9l\u00e9portation commence dans {0}. Ne bougez pas. -downloadingGeoIp=T\u00e9l\u00e9chargement de la base de donn\u00e9es GeoIP ... Cela peut prendre un moment (Pays : 0.6 Mo, villes : 20Mo) -duplicatedUserdata=Donn\u00e9e utilisateur dupliqu\u00e9e : {0} et {1} -durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left +downloadingGeoIp=T\u00e9l\u00e9chargement de la base de donn\u00e9es GeoIP... Cela peut prendre un moment (Pays : 0.6 Mo, villes : 20 Mo) +duplicatedUserdata=Donn\u00e9es utilisateurs dupliqu\u00e9es : {0} et {1} +durability=\u00a77Cet outil a \u00a7c{0}\u00a77 usages restants. +editBookContents=\u00a7eVous pouvez maintenant \u00e9diter le contenu de ce livre. enableUnlimited=\u00a77Quantit\u00e9 illimit\u00e9e de {0} \u00e0 {1}. enabled=activ\u00e9 enchantmentApplied = \u00a77L''enchantement {0} a \u00e9t\u00e9 appliqu\u00e9 \u00e0 l''objet dans votre main. -enchantmentNotFound = \u00a7cEnchantement non-trouv\u00e9 +enchantmentNotFound = \u00a7cEnchantement non trouv\u00e9 enchantmentPerm = \u00a7cVous n''avez pas les droits pour {0}. -enchantmentRemoved = \u00a77The enchantment {0} has been removed from your item in hand. -enchantments = \u00a77Enchantments : {0} +enchantmentRemoved = \u00a77L'enchantement {0} de l'item dans votre main a \u00e9t\u00e9 supprim\u00e9. +enchantments = \u00a77Enchantements : {0} errorCallingCommand=Erreur en appelant la commande /{0} errorWithMessage=\u00a7cErreur : {0} -essentialsHelp1=Le fichier est corrompuet Essentials ne peut l'ouvrir. Essentials est maintenant d\u00e9sactiv\u00e9. Si vous ne pouvez corriger vous-m\u00eame, aller \u00e0 http://tiny.cc/EssentialsChat -essentialsHelp2=Le fichier est corrompuet Essentials ne peut l'ouvrir. Essentials est maintenant d\u00e9sactiv\u00e9. Si vous ne pouvez corriger vous-m\u00eame, tapez /essentialshelp ou aller \u00e0 http://tiny.cc/EssentialsChat -essentialsReload=\u00a77Essentials {0} a \u00e9t\u00e9 recharg\u00e9. -exp=\u00a7c{0} \u00a77has\u00a7c {1} \u00a77exp (level\u00a7c {2}\u00a77) and needs\u00a7c {3} \u00a77more exp to level up. -expSet=\u00a7c{0} \u00a77now has\u00a7c {1} \u00a77exp. +essentialsHelp1=Le fichier est corrompu et Essentials ne peut l'ouvrir. Essentials est maintenant d\u00e9sactiv\u00e9. Si vous ne pouvez corriger vous-m\u00eame, allez sur \u00e0 http://tiny.cc/EssentialsChat +essentialsHelp2=Le fichier est corrompu et Essentials ne peut l'ouvrir. Essentials est maintenant d\u00e9sactiv\u00e9. Si vous ne pouvez corriger vous-m\u00eame, tapez /help ou allez sur \u00e0 http://tiny.cc/EssentialsChat +essentialsReload=\u00a77Essentials {0} a \u00e9t\u00e9 recharg\u00e9. +exp=\u00a7c{0} \u00a77a\u00a7c {1} \u00a77exp (niveau\u00a7c {2}\u00a77) et a besoin de\u00a7c {3} \u00a77pour monter d''un niveau. +expSet=\u00a7c{0} \u00a77a maintenant\u00a7c {1} \u00a77exp. extinguish=\u00a77Vous cessez de br\u00fbler. -extinguishOthers=\u00a77Vous avez \u00e9teint la combustion de {0}. -failedToCloseConfig=Echec de la fermeture de la configuration {0} -failedToCreateConfig=Echec de la cr\u00e9ation de la configuration {0} -failedToWriteConfig=\u00c9chec de l''\u00e9criture de la configuration {0} -false=\u00a74false\u00a7f +extinguishOthers=\u00a77Vous avez \u00e9teint le feu sur {0}. +failedToCloseConfig=\u00c9chec de la fermeture de la configuration {0}. +failedToCreateConfig=\u00c9chec de la cr\u00e9ation de la configuration {0}. +failedToWriteConfig=\u00c9chec de l''\u00e9criture de la configuration {0}. +false=\u00a74faux\u00a7f feed=\u00a77Vous avez \u00e9t\u00e9 rassasi\u00e9. -feedOther=\u00a77 est rassasi\u00e9 {0}. -fileRenameError=Echec du changement de nom de {0} -flyMode=\u00a77Set fly mode {0} for {1}. +feedOther=\u00a77{0} est rassasi\u00e9. +fileRenameError=Echec du changement de nom de {0}. +fireworkColor=\u00a74Vous devez ajouter une couleur au feu d'artifice pour pouvoir lui ajouter un effet. +fireworkEffectsCleared=\u00a76Les effets ont \u00e9t\u00e9 retir\u00e9s. +fireworkSyntax=\u00a76Param\u00e8tres du feu d'artifice :\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76Pour utiliser plusieurs couleurs/effets, s\u00e9parez les valeurs avec des virgules : \u00a7cred,blue,pink\n\u00a76Shapes :\u00a7c star, ball, large, creeper, burst \u00a76Effects :\u00a7c trail, twinkle +flyMode=\u00a77Fly mode {0} pour {1} d\u00e9fini. flying=flying foreverAlone=\u00a7cVous n''avez personne \u00e0 qui r\u00e9pondre freedMemory=A lib\u00e9r\u00e9 {0} Mo. +fullStack=\u00a74Vous avez d\u00e9j\u00e0 un stack complet. gameMode=\u00a77Mode de jeu {0} pour {1}. -gcchunks=portions, -gcentities=entit\u00e9s +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 portions, \u00a7c{3}\u00a76 entit\u00e9s gcfree=M\u00e9moire libre : {0} Mo gcmax=M\u00e9moire maximale : {0} Mo gctotal=M\u00e9moire utilis\u00e9e : {0} Mo -geoIpUrlEmpty=L''URL de t\u00e9l\u00e9chargement de GeoIP est vide. -geoIpUrlInvalid=L''URL de t\u00e9l\u00e9chargement de GeoIP est invalide. -geoipJoinFormat=Joueur {0} vient de {1} +geoIpUrlEmpty=L'URL de t\u00e9l\u00e9chargement de GeoIP est vide. +geoIpUrlInvalid=L'URL de t\u00e9l\u00e9chargement de GeoIP est invalide. +geoipJoinFormat=\u00a76Joueur \u00a7c{0} \u00a76vient de \u00a7c{1}\u00a76. +giveSpawn=\u00a76Donne\u00a7c {0} \u00a76de\u00a7c {1} \u00a76\u00e0\u00a7c {2}\u00a76. godDisabledFor=d\u00e9sactiv\u00e9 pour {0} godEnabledFor=activ\u00e9 pour {0} godMode=\u00a77Mode Dieu {0}. -hatArmor=\u00a7cError, you cannot use this item as a hat! -hatEmpty=\u00a7cYou are not wearing a hat. -hatFail=\u00a7cYou must have something to wear in your hand. -hatPlaced=\u00a7eEnjoy your new hat! +groupNumber={0} en ligne, pour la liste compl\u00e8te, tapez /{1} {2} +groupDoesNotExist=\u00a74Il n'y a personne en ligne dans ce groupe ! +hatArmor=\u00a7cErreur, vous ne pouvez pas utliser cet item comme chapeau ! +hatEmpty=\u00a7cVous ne portez pas de chapeau. +hatFail=\u00a7cVous devez avoir quelque chose \u00e0 porter dans votre main. +hatPlaced=\u00a7eProfitez bien de votre nouveau chapeau ! +hatRemoved=\u00a7eVotre chapeau a \u00e9t\u00e9 retir\u00e9. haveBeenReleased=\u00a77Vous avez \u00e9t\u00e9 lib\u00e9r\u00e9. heal=\u00a77Vous avez \u00e9t\u00e9 soign\u00e9. +healDead=\u00a74Vous ne pouvez pas soigner quelqu'un qui est mort ! healOther=\u00a77{0} a \u00e9t\u00e9 soign\u00e9. -helpConsole=Pour voir l''aide tapez ? -helpFrom=\u00a77Commands from {0}: +helpConsole=Pour voir l'aide tapez ? +helpFrom=\u00a77Commandes de {0}: helpLine=\u00a76/{0}\u00a7f: {1} -helpMatching=\u00a77Commands matching "{0}": +helpMatching=\u00a77Commandes correspondant \u00e0 "{0}" : helpOp=\u00a7c[Aide Admin]\u00a7f \u00a77{0} : \u00a7f {1} helpPages=Page \u00a7c{0}\u00a7f sur \u00a7c{1}\u00a7f. -helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} -holeInFloor=Trou dans le Sol. +helpPlugin=\u00a74{0}\u00a7f: Aide Plugin : /help {1} +holdBook=\u00a74Vous ne tenez pas un livre dans lequel on peut \u00e9crire. +holdFirework=\u00a74Vous devez tenir un feu d'artifice pour lui ajouter des effets. +holdPotion=\u00a74Vous devez tenir une potion pour lui ajouter des effets. +holeInFloor=Trou dans le sol. homeSet=\u00a77R\u00e9sidence d\u00e9finie. homeSetToBed=\u00a77Votre r\u00e9sidence est d\u00e9sormais li\u00e9e \u00e0 ce lit. homes=R\u00e9sidences : {0} @@ -146,16 +174,23 @@ invRestored=Votre inventaire vous a \u00e9t\u00e9 rendu. invSee=Vous voyez l''inventaire de {0}. invSeeHelp=Utilisez /invsee pour revenir \u00e0 votre inventaire. invalidCharge=\u00a7cCharge invalide. -invalidHome=Home {0} doesn't exist -invalidMob=Mauvias type de cr\u00e9ature. -invalidServer=Serveur non valide. -invalidSignLine=La ligne {0} du panneau est invalide. +invalidFireworkFormat=\u00a76L''option \u00a74{0} \u00a76n''est pas une valeur correcte pour \u00a74{1} +invalidHome=La r\u00e9sidence {0} n''existe pas +invalidHomeName=\u00a74Nom de r\u00e9sindence invalide. +invalidMob=Mauvais type de cr\u00e9ature. +invalidNumber=\u00a74Nombre invalide. +invalidPotion=\u00a74Potion invalide. +invalidServer=\u00a74Serveur invalide. +invalidSignLine=\u00a74La ligne {0} du panneau est invalide. +invalidWarpName=\u00a74Nom de warp invalide. invalidWorld=\u00a7cMonde invalide. inventoryCleared=\u00a77Inventaire nettoy\u00e9. +inventoryClearedAll=\u00a76Inventaire de tous les joueurs nettoy\u00e9s. inventoryClearedOthers=\u00a77L''inventaire de \u00a7c{0}\u00a77 a \u00e9t\u00e9 nettoy\u00e9. is=est itemCannotBeSold=Cet objet ne peut \u00eatre vendu au serveur. itemMustBeStacked=Cet objet doit \u00eatre vendu par 64. Une quantit\u00e9 de 2 serait deux fois 64. +itemNames=Noms d''item courts : {0} itemNotEnough1=\u00a7cVous n'avez pas assez de cet objet pour le vendre. itemNotEnough2=\u00a77Si vous voulez vendre l'int\u00e9gralit\u00e9 de vos objets de ce type l\u00e0, utilisez /sell nomObjet itemNotEnough3=\u00a77/sell nomObjet -1 vendra tout sauf un objet, etc. @@ -163,62 +198,74 @@ itemSellAir=Vouliez-vous vraiment vendre de l'air ? Mettez un objet dans votre m itemSold=\u00a77Vendu pour \u00a7c{0} \u00a77({1} {2} \u00e0 {3} chacun) itemSoldConsole={0} vendu {1} pour \u00a77{2} \u00a77({3} objet(s) \u00e0 {4} chacun) itemSpawn=\u00a77Donne {0} de {1} -itemsCsvNotLoaded=N'a pas pu charger items.csv. +itemType=Item: {0} - {1} +itemsCsvNotLoaded=Essentials n'a pas pu charger items.csv. jailAlreadyIncarcerated=\u00a7cJoueur d\u00e9j\u00e0 emprisonn\u00e9 : {0} jailMessage=\u00a7cVous avez commis un crime, vous en payez le prix. jailNotExist=Cette prison n'existe pas. jailReleased=\u00a77Joueur \u00a7e{0}\u00a77 lib\u00e9r\u00e9. jailReleasedPlayerNotify=\u00a77Vous avez \u00e9t\u00e9 lib\u00e9r\u00e9 ! -jailSentenceExtended=Dur\u00e9e d''emprisonnement rallong\u00e9e de : {0) -jailSet=\u00a77La prison {0} a \u00e9t\u00e9 cr\u00e9\u00e9. +jailSentenceExtended=Dur\u00e9e d''emprisonnement rallong\u00e9e de : {0} +jailSet=\u00a77La prison {0} a \u00e9t\u00e9 cr\u00e9\u00e9e. jumpError=\u00c7a aurait pu faire mal au cerveau de votre ordinateur. -kickDefault=\u00c9ject\u00e9 du serveur +kickDefault=\u00c9ject\u00e9 du serveur. kickExempt=\u00a77Vous ne pouvez pas \u00e9jecter ce joueur. -kickedAll=\u00a7cKicked all players from server -kill=\u00a77Tu\u00e9 {0}. -kitError2=\u00a7cCe kit n'existe pas ou a \u00e9t\u00e9 mal d\u00e9fini. +kickedAll=\u00a7cTous les joueurs ont \u00e9t\u00e9 \u00e9ject\u00e9s. +kill=\u00a77{0} a \u00e9t\u00e9 tu\u00e9. +killExempt=\u00a74Vous ne pouvez pas tuer {0} +kitError2=\u00a74Ce kit est mal d\u00e9fini. Contactez un administrateur. kitError=\u00a7cIl n'y a pas de kits valides. kitErrorHelp=\u00a7cPeut-\u00eatre qu'un objet manque d'une quantit\u00e9 dans la configuration ? -kitGive=\u00a77Donner le kit {0}. -kitInvFull=\u00a7cVotre inventaire \u00e9tait plein, le kit est parre-terre. +kitGive=\u00a77Kit {0} donn\u00e9. +kitGiveTo=\u00a76Le kit\u00a7c {0}\u00a76 a \u00e9t\u00e9 donn\u00e9 \u00e0 {1}\u00a7. +kitInvFull=\u00a7cVotre inventaire \u00e9tait plein, le kit est par terre. +kitOnce=\u00a74Vous ne pouvez pas utiliser ce kit de nouveau. +kitReceive=\u00a76Kit\u00a7c {0}\u00a76 re\u00e7u. kitTimed=\u00a7cVous ne pouvez pas utiliser ce kit pendant encore {0}. kits=\u00a77Kits :{0} +leatherSyntax=\u00a76Syntaxe de la couleur du cuir : color:,, exemple : color:255,0,0. lightningSmited=\u00a77Vous venez d'\u00eatre foudroy\u00e9. lightningUse=\u00a77{0} a \u00e9t\u00e9 foudroy\u00e9. listAfkTag = \u00a77[AFK]\u00a7f listAmount = \u00a79Il y a \u00a7c{0}\u00a79 joueurs en ligne sur \u00a7c{1}\u00a79 au total. listAmountHidden = \u00a79Il y a \u00a7c{0}\u00a77/{1}\u00a79 sur un maximum de \u00a7c{2}\u00a79 joueurs en ligne. -listGroupTag={0}\u00a7f: +listGroupTag={0}\u00a7f: listHiddenTag = \u00a77[MASQU\u00c9]\u00a7f -loadWarpError=\u00c9chec du chargement du point de t\u00e9l\u00e9portation {0}. -localFormat=Locale : <{0}> {1} -mailClear=\u00a7cPour marquer votre courrier en tant que lu, entrez /mail clear +loadWarpError=\u00c9chec du chargement du warp {0}. +localFormat=Local : <{0}> {1} +mailClear=\u00a7cPour marquer votre courrier comme lu, entrez /mail clear mailCleared=\u00a77Courrier supprim\u00e9 ! mailSent=\u00a77Courrier envoy\u00e9 ! -markMailAsRead=\u00a7cPour marquer votre courrier en tant que lu, entrez /mail clear -markedAsAway=\u00a77Vous \u00eates d\u00e9sormais AFK. -markedAsNotAway=\u00a77Vous n'\u00eates d\u00e9sormais plus AFK. +markMailAsRead=\u00a7cPour marquer votre courrier comme lu, entrez /mail clear +markedAsAway=\u00a77Vous \u00eates d\u00e9sormais absent/AFK. +markedAsNotAway=\u00a77Vous n'\u00eates plus absent/AFK. +matchingIPAddress=\u00a76Les joueurs suivant ce sont d\u00e9j\u00e0 connect\u00e9s avec cette adresse : maxHomes=Vous ne pouvez pas cr\u00e9er plus de {0} r\u00e9sidences. mayNotJail=\u00a7cVous ne pouvez pas emprisonner cette personne. me=moi +messageTruncated=\u00a74Message tronqu\u00e9, pour le voir en entier, tapez :\u00a7c /{0} {1} minute=minute minutes=minutes missingItems=Vous n''avez pas {0} x {1}. -missingPrefixSuffix=Pr\u00e9fixe ou Suffixe manquant pour {0} +missingPrefixSuffix=Pr\u00e9fixe ou suffixe manquant pour {0}3 mobSpawnError=Erreur lors du changement du g\u00e9n\u00e9rateur de cr\u00e9atures. mobSpawnLimit=Quantit\u00e9 de cr\u00e9atures limit\u00e9 \u00e0 au maximum du serveur. mobSpawnTarget=Le bloc cible doit \u00eatre un g\u00e9n\u00e9rateur de cr\u00e9atures. mobsAvailable=\u00a77cr\u00e9atures : {0} -moneyRecievedFrom=\u00a7a{0} a \u00e9t\u00e9 re\u00e7u de {1} -moneySentTo=\u00a7a{0} a \u00e9t\u00e9 envoy\u00e9 \u00e0 {1} +moneyRecievedFrom=\u00a7a{0} a \u00e9t\u00e9 re\u00e7u de {1}. +moneySentTo=\u00a7a{0} ont \u00e9t\u00e9 envoy\u00e9s \u00e0 {1}. moneyTaken={0} pr\u00e9lev\u00e9(s) de votre compte. month=mois months=mois moreThanZero=Les quantit\u00e9s doivent \u00eatre sup\u00e9rieures \u00e0 z\u00e9ro. +moveSpeed=\u00a77La vitesse de {0} a \u00e9t\u00e9 modifi\u00e9e \u00e0 {1} pour {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74Vous ne pouvez pas appliquer plus d'une charge \u00e0 ce feu d'artifice. +multiplePotionEffects=\u00a74Vous ne pouvez pas appliquer plus d'un effet \u00e0 cette potion. muteExempt=\u00a7cVous ne pouvez pas r\u00e9duire ce joueur au silence. +muteNotify=\u00a74{0} \u00a76a rendu muet \u00a74{1} mutedPlayer=Le joueur {0} est d\u00e9sormais muet. -mutedPlayerFor={0} a \u00e9t\u00e9 muet pour {1}. +mutedPlayerFor={0} a \u00e9t\u00e9 rendu muet pour {1}. mutedUserSpeaks={0} a essay\u00e9 de parler mais est muet. nearbyPlayers=Joueurs dans les environs : {0} negativeBalanceError=L'utilisateur n'est pas autoris\u00e9 \u00e0 avoir un solde n\u00e9gatif. @@ -228,123 +275,148 @@ nickInUse=\u00a7cCe nom est d\u00e9j\u00e0 utilis\u00e9. nickNamesAlpha=\u00a7cLes surnoms doivent \u00eatre alphanum\u00e9riques. nickNoMore=\u00a7 Vous n'avez plus de surnom. nickOthersPermission=\u00a7cVous n'avez pas la permission de changer le surnom des autres. -nickSet=\u00a77Votre surnom est maintenant \u00a7c{0} -noAccessCommand=\u00a7cVous n'avez pas acc\u00c3\u00a8s \u00e0 cette commande. -noAccessPermission=\u00a7cVous n''avez pas la permissions d''acc\u00e9der \u00e0 cette {0} -noBreakBedrock=You are not allowed to destroy bedrock. +nickSet=\u00a77Votre surnom est maintenant \u00a7c{0}. +noAccessCommand=\u00a7cVous n'avez pas acc\u00e8s \u00e0 cette commande. +noAccessPermission=\u00a7cVous n''avez pas la permission d''acc\u00e9der \u00e0 cette {0}. +noBreakBedrock=Vous n'\u00eates pas autoris\u00e9s \u00e0 d\u00e9truire la bedrock. +noChapterMeta=\u00a74Vous n'avez pas la permission de cr\u00e9er des livres dynamiques. noDestroyPermission=\u00a7cVous n''avez pas la permission de d\u00e9truire ce {0}. -noDurability=\u00a7cThis item does not have a durability. -noGodWorldWarning=\u00a7cWarning! Le mode Dieu est d\u00e9sactiv\u00e9 dans ce monde. +noDurability=\u00a7cCet item n'a pas de durabilit\u00e9. +noGodWorldWarning=\u00a7cAttention ! Le mode dieu est d\u00e9sactiv\u00e9 dans ce monde. noHelpFound=\u00a7cAucune commande correspondante. noHomeSet=Vous n'avez pas d\u00e9fini de r\u00e9sidence. noHomeSetPlayer=Le joueur n'a pas d\u00e9fini sa r\u00e9sidence. noKitPermission=\u00a7cVous avez besoin de la permission \u00a7c{0}\u00a7c pour utiliser ce kit. noKits=\u00a77Il n'y a pas encore de kits disponibles. noMail=Vous n'avez pas de courrier -noMotd=\u00a7cIl n'y a pas de message su jour. +noMatchingPlayers=\u00a76Aucun joueur correspondant. +noMetaFirework=\u00a74Vous n'avez pas la permission d'appliquer des m\u00e9tadatas aux feux d'artifice. +noMetaPerm=\u00a74Vous n''avez pas la permission d''appliquer la m\u00e9tadata \u00a7c{0}\u00a74 \u00e0 cet item. +noMotd=\u00a7cIl n'y a pas de message du jour. noNewMail=\u00a77Vous n'avez pas de courrier. noPendingRequest=Vous n'avez pas de requ\u00eate non lue. noPerm=\u00a7cVous n''avez pas la permission \u00a7f{0}\u00a7c. noPermToSpawnMob=\u00a7cVous n'avez pas la permission d'invoquer cette cr\u00e9ature. -noPlacePermission=\u00a7cVous n'avez pas la permission de placer un bloc pr\u00c3\u00a8 de cette pancarte. +noPlacePermission=\u00a7cVous n'avez pas la permission de placer un bloc pr\u00e8s de cette pancarte. noPowerTools=Vous n'avez pas d'outil macro associ\u00e9. noRules=\u00a7cIl n'y a pas encore de r\u00e8gles d\u00e9finies. -noWarpsDefined=Aucun point de t\u00e9l\u00e9portation d\u00e9fini. +noWarpsDefined=Aucun warp d\u00e9fini. none=aucun notAllowedToQuestion=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 poser des questions. notAllowedToShout=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 crier. notEnoughExperience=Vous n'avez pas assez d'exp\u00e9rience. notEnoughMoney=Vous n'avez pas les fonds n\u00e9cessaires. notFlying=not flying -notRecommendedBukkit=* ! * La version de Bukkit n'est pas celle qui est recommand\u00e9 pour cette version de Essentials. +notRecommendedBukkit=* ! * Cette version de Bukkit n'est pas recommand\u00e9 pour cette version de Essentials. notSupportedYet=Pas encore pris en charge. nothingInHand = \u00a7cVous n'avez rien en main. now=maintenant nuke=Que la mort s'abatte sur eux ! -numberRequired=Il faut fournir un nombre ici. +numberRequired=Un nombre est requis ici. onlyDayNight=/time ne supporte que (jour) day/night (nuit). -onlyPlayers=Seulement les joueurs en jeu peuvent utiliser {0}. +onlyPlayerSkulls=\u00a74Vous ne pouvez changer le nom que d'une t\u00eate de joueur (397:3). +onlyPlayers=Seuls les joueurs en jeu peuvent utiliser {0}. onlySunStorm=/weather ne supporte que (soleil) sun/storm (temp\u00eate). -orderBalances=Classement des balance de {0} utilisateurs, patientez ... +orderBalances=Classement des soldes des {0} joueurs, patientez... +oversizedTempban=\u00a74Vous ne pouvez pas bannir un joueur pour cette p\u00e9riode. pTimeCurrent=Pour \u00a7e{0}\u00a7f l''heure est {1}. pTimeCurrentFixed=L''heure de \u00a7e{0}\u00a7f est fix\u00e9e \u00e0 {1}. -pTimeNormal=\u00a7fPour \u00a7e{0}\u00a7f l'heure est normale et correspond au server. -pTimeOthersPermission=\u00a7cVous n'etes pas autoris\u00e9 \u00e0 changer l'heure des autres joueurs. -pTimePlayers=Ces joueurs ont leur propre horraire : -pTimeReset=l''heure a \u00e9t\u00e9 r\u00e9initialis\u00e9e \u00e0 : \u00a7e{0} -pTimeSet=l''heure du joueur a \u00e9t\u00e9 r\u00e9egl\u00e9ee \u00e0 \u00a73{0}\u00a7f pour : \u00a7e{1} -pTimeSetFixed=l''heure du joueur a \u00e9t\u00e9 fix\u00e9e \u00e0 : \u00a7e{1} +pTimeNormal=\u00a7fPour \u00a7e{0}\u00a7f l''heure est normale et correspond au serveur. +pTimeOthersPermission=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 changer l'heure des autres joueurs. +pTimePlayers=Ces joueurs ont leur propre horaire : +pTimeReset=L''heure a \u00e9t\u00e9 r\u00e9initialis\u00e9e \u00e0 : \u00a7e{0} +pTimeSet=L''heure du joueur a \u00e9t\u00e9 r\u00e9egl\u00e9e \u00e0 \u00a73{0}\u00a7f pour : \u00a7e{1} +pTimeSetFixed=L''heure du joueur a \u00e9t\u00e9 fix\u00e9e \u00e0 : \u00a7e{1} parseError=Erreur de conversion {0} \u00e0 la ligne {1} pendingTeleportCancelled=\u00a7cRequete de t\u00e9l\u00e9portation annul\u00e9e. -permissionsError=Permissions/GroupManager manquant, les pr\u00e9fixes et suffixes ne seront pas affich\u00e9s. +permissionsError=Permissions/GroupManager manquant, les pr\u00e9fixes et suffixes ne seront pas affich\u00e9s. playerBanned=\u00a7cJoueur {0} banni {1} pour {2} -playerInJail=\u00a7cLe joueur est d\u00e9j\u00e0 dans la prison {0}. +playerInJail=\u00a7cLe joueur est d\u00e9j\u00e0 emprisonn\u00e9 dans {0}. playerJailed=\u00a77Le joueur {0} a \u00e9t\u00e9 emprisonn\u00e9. playerJailedFor=\u00a77{0} a \u00e9t\u00e9 emprisonn\u00e9 pour {1}. playerKicked=\u00a7c{0} a \u00e9t\u00e9 \u00e9ject\u00e9 {1} pour {2}. -playerMuted=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duis au silence. -playerMutedFor=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duis au silence pour {0} +playerMuted=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duit au silence. +playerMutedFor=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duit au silence pour {0} playerNeverOnServer=\u00a7cLe joueur {0} n''a jamais \u00e9t\u00e9 sur le serveur. playerNotFound=\u00a7cLe joueur est introuvable. playerUnmuted=\u00a77Vous avez de nouveau la parole. pong=Pong ! +posPitch=\u00a76Pitch : {0} (Angle de t\u00eate) +posX=\u00a76X: {0} (+Est <-> -Ouest) +posY=\u00a76Y: {0} (+Haut <-> -Bas) +posYaw=\u00a76Yaw : {0} (Rotation) +posZ=\u00a76Z: {0} (+Sud <-> -Nord) possibleWorlds=\u00a77Les mondes possibles sont les nombres de 0 \u00e0 {0}. +potions=\u00a76Potions :\u00a7r {0}\u00a76. powerToolAir=La commande ne peut pas \u00eatre assign\u00e9e \u00e0 l'air. powerToolAlreadySet=La commande \u00a7c{0}\u00a7f est d\u00e9j\u00e0 assign\u00e9e \u00e0 {1}. powerToolAttach=Commande \u00a7c{0}\u00a7f assign\u00e9e \u00e0 {1}. -powerToolClearAll=Toutes les commandes assign\u00e9es ont \u00e9et\u00e9e retir\u00e9ees. +powerToolClearAll=Toutes les commandes assign\u00e9es ont \u00e9t\u00e9 retir\u00e9es. powerToolList={1} assign\u00e9s aux commandes : \u00a7c{0}\u00a7f. powerToolListEmpty={0} n'a pas de commande assign\u00e9e. powerToolNoSuchCommandAssigned=La commande \u00a7c{0}\u00a7f n''a pas \u00e9t\u00e9 assign\u00e9e \u00e0 {1}. powerToolRemove=Commande \u00a7c{0}\u00a7f retir\u00e9e de {1}. powerToolRemoveAll=Toutes les commandes retir\u00e9es de {0}. -powerToolsDisabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 retir\u00e9es. +powerToolsDisabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 d\u00e9sactiv\u00e9es. powerToolsEnabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 activ\u00e9es. protectionOwner=\u00a76[EssentialsProtect] Propri\u00e9taire de la protection : {0} questionFormat=\u00a77[Question]\u00a7f {0} readNextPage=Utilisez /{0} {1} pour lire la page suivante. +recipe=\u00a76Rec\u00eate pour \u00a7c{0}\u00a76 ({1} of {2}). +recipeBadIndex=Il n'y a pas de rec\u00eate pour ce num\u00e9ro. +recipeFurnace=\u00a76Fondre \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76est \u00a7c{1} +recipeMore=\u00a76Tapez /{0} \u00a7c{1}\u00a76 pour voir les autres rec\u00eates pour \u00a7c{2} +recipeNone=Aucune rec\u00eate n''existe pour {0}. +recipeNothing=rien +recipeShapeless=\u00a76Combiner \u00a7c{0} +recipeWhere=\u00a76O\u00f9 : {0} reloadAllPlugins=\u00a77Toutes les extensions ont \u00e9t\u00e9 recharg\u00e9es. removed=\u00a77{0} entit\u00e9s supprim\u00e9es. repair=Vous avez r\u00e9par\u00e9 votre : \u00a7e{0}. repairAlreadyFixed=\u00a77Cet objet n'a pas besoin de r\u00e9paration. repairEnchanted=\u00a77Vous n'\u00eates pas autoris\u00e9 \u00e0 r\u00e9parer les objets enchant\u00e9s. repairInvalidType=\u00a7cCet objet ne peut \u00eatre r\u00e9par\u00e9. -repairNone=Aucun objet n'a besoin d'u00eatre r\u00e9par\u00e9. +repairNone=Aucun objet n'a besoin d'\u00eatre r\u00e9par\u00e9. requestAccepted=\u00a77Demande de t\u00e9l\u00e9portation accept\u00e9e. requestAcceptedFrom=\u00a77{0} a accept\u00e9 votre demande de t\u00e9l\u00e9portation. requestDenied=\u00a77Demande de t\u00e9l\u00e9portation refus\u00e9e. requestDeniedFrom=\u00a77{0} a refus\u00e9 votre demande de t\u00e9l\u00e9portation. requestSent=\u00a77Requ\u00eate envoy\u00e9e \u00e0 {0}\u00a77. -requestTimedOut=\u00a7cLa de mande de t\u00e9l\u00e9portation a expir\u00e9. -requiredBukkit=* ! * Vous avez besoin au moins de la version {0} de CraftBukkit. T\u00e9l\u00e9chargez-la ici http://dl.bukkit.org/downloads/craftbukkit/ -returnPlayerToJailError=Error occurred when trying to return player {0} to jail: {1} +requestTimedOut=\u00a7cLa demande de t\u00e9l\u00e9portation a expir\u00e9. +requiredBukkit=* ! * Vous avez au moins besoin de la version {0} de CraftBukkit. T\u00e9l\u00e9chargez-la ici http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Le solde a \u00e9t\u00e9 r\u00e9initialis\u00e9 \u00e0 \u00a7a{0} \u00a76 pour tous les joueurs en ligne. +resetBalAll=\u00a76Le solde a \u00e9t\u00e9 r\u00e9initialis\u00e9 \u00e0 \u00a7a{0} \u00a76 pour tous les joueurs. +returnPlayerToJailError=Une erreur est survenue en essayant de remettre le joueur {0} dans la prison {1}. +runningPlayerMatch=\u00a76Recherche en cours des joueurs ayant utilis\u00e9 l''IP ''\u00a7c{0}\u00a76'' (cette op\u00e9ration peut prendre un certain temps) second=seconde seconds=secondes -seenOffline=Le joueur {0} est hors ligne depuis {1} -seenOnline=Le joueur {0} est en ligne depuis {1} +seenOffline=Le joueur {0} est hors ligne depuis {1}. +seenOnline=Le joueur {0} est en ligne depuis {1}. serverFull=Le serveur est plein. -serverTotal=Server Total: {0} -setSpawner=Type de g\u00e9n\u00e9rateur chang\u00e9 en {0} -sheepMalformedColor=Couleur mal form\u00e9e. +serverTotal=Total du serveur : {0} +setSpawner=Type de g\u00e9n\u00e9rateur chang\u00e9 en {0}. +sheepMalformedColor=Couleur incorrecte. shoutFormat=\u00a77[Crie]\u00a7f {0} signFormatFail=\u00a74[{0}] signFormatSuccess=\u00a71[{0}] signFormatTemplate=[{0}] signProtectInvalidLocation=\u00a74Vous n'avez pas l'autorisation de cr\u00e9er une pancarte ici. -similarWarpExist=Un point de t\u00e9l\u00e9portation avec un nom similaire existe d\u00e9j\u00e0. -slimeMalformedSize=Taille mal form\u00e9e. -soloMob=Ce cr\u00e9ature aime \u00eatre seul. +similarWarpExist=Un warp avec un nom similaire existe d\u00e9j\u00e0. +slimeMalformedSize=Taille incorrecte. +soloMob=Cette cr\u00e9ature pr\u00e9f\u00e8re \u00eatre seule. spawnSet=\u00a77Le point de d\u00e9part a \u00e9t\u00e9 d\u00e9fini pour le groupe {0}. spawned=invoqu\u00e9(s) -sudoExempt=You cannot sudo this user -sudoRun=Forcing {0} to run: /{1} {2} +sudoExempt=Vous ne pouvez pas ex\u00e9cuter une commande de force \u00e0 la place de ce joueur. +sudoRun=Le joueur {0} ex\u00e9cute de force : /{1} {2} suicideMessage=\u00a77Au revoir monde cruel... suicideSuccess=\u00a77{0} s''est suicid\u00e9. survival=survie -takenFromAccount=\u00a7c{0} ont \u00e9t\u00e9 retir\u00e9 de votre compte. -takenFromOthersAccount=\u00a7c{0} taken from {1}\u00a7c account. New balance: {2} +takenFromAccount=\u00a7c{0} ont \u00e9t\u00e9 retir\u00e9s de votre compte. +takenFromOthersAccount=\u00a7c{0} retir\u00e9s du compte de {1}\u00a7c. Nouveau solde : {2} teleportAAll=\u00a77Demande de t\u00e9l\u00e9portation envoy\u00e9e \u00e0 tous les joueurs... -teleportAll=\u00a77T\u00e9l\u00e9poration de tous les joueurs. +teleportAll=\u00a77T\u00e9l\u00e9portation de tous les joueurs. teleportAtoB=\u00a77{0}\u00a77 vous a t\u00e9l\u00e9port\u00e9 \u00e0 {1}\u00a77. teleportDisabled={0} a la t\u00e9l\u00e9portation d\u00e9sactiv\u00e9. teleportHereRequest=\u00a7c{0}\u00a7c Vous a demand\u00e9 de vous t\u00e9l\u00e9porter \u00e0 lui/elle. @@ -353,92 +425,116 @@ teleportRequest=\u00a7c{0}\u00a7c vous demande s''il peut se t\u00e9l\u00e9porte teleportRequestTimeoutInfo=\u00a77Cette demande de t\u00e9l\u00e9portation expirera dans {0} secondes. teleportTop=\u00a77T\u00e9l\u00e9portation vers le haut. teleportationCommencing=\u00a77D\u00e9but de la t\u00e9l\u00e9portation... -teleportationDisabled=\u00a77T\u00e9l\u00e9poration d\u00e9sactiv\u00e9. +teleportationDisabled=\u00a77T\u00e9l\u00e9portation d\u00e9sactiv\u00e9. +teleportationDisabledFor=\u00a77T\u00e9l\u00e9portation d\u00e9sactiv\u00e9 pour {0}. teleportationEnabled=\u00a77T\u00e9l\u00e9portation activ\u00e9e. -teleporting=\u00a77T\u00e9l\u00e9poration en cours... +teleportationEnabledFor=\u00a76T\u00e9l\u00e9portation activ\u00e9 pour {0}. +teleporting=\u00a77T\u00e9l\u00e9portation en cours... teleportingPortal=\u00a77T\u00e9l\u00e9portation via portail. -tempBanned=Banni temporairement du serveur pour {0} +tempBanned=Banni temporairement du serveur pour {0}. tempbanExempt=\u00a77Vous ne pouvez pas bannir temporairement ce joueur. thunder=Vous avez {0} la foudre dans votre monde. -thunderDuration=Vous avez {0} la foudre dans le serveur pendant {1} secondes. +thunderDuration=Vous avez {0} la foudre dans le serveur pendant {1} seconde(s). timeBeforeHeal=Temps avant le prochain soin : {0} -timeBeforeTeleport=Temps avant prochaine t\u00e9l\u00e9portation {0} +timeBeforeTeleport=Temps avant la prochaine t\u00e9l\u00e9portation {0} timeFormat=\u00a73{0}\u00a7f ou \u00a73{1}\u00a7f ou \u00a73{2}\u00a7f timePattern=(?:([0-9]+)\\\\s*[ya][a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*mo[a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*(?:sem|w)[a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*[dj][a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*h[a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*m[a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*(?:s[a-z]*)?)? timeSet=Heure r\u00e9gl\u00e9e dans tous les mondes. timeSetPermission=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 r\u00e9gler l'heure. timeWorldCurrent=Il est \u00a73{1}\u00a77 dans \u00a7c{0}. timeWorldSet=L''heure a \u00e9t\u00e9 r\u00e9gl\u00e9e \u00e0 {0} dans : \u00a7c{1} -tps=Current TPS = {0} +totalWorthAll=\u00a7aTous les blocs et items ont \u00e9t\u00e9 vendus pour une valeur totale de \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aTous les blocs ont \u00e9t\u00e9 vendus pour une valeur totale de \u00a7c{1}\u00a7a. +tps=TPS actuellement = {0} tradeCompleted=\u00a77\u00c9change termin\u00e9. -tradeSignEmpty=Le panneau de vente n'as pas encore assez de stock. +tradeSignEmpty=Le panneau de vente n'a pas encore assez de stock. tradeSignEmptyOwner=Il n'y a rien \u00e0 collecter de cette pancarte d'\u00e9change commercial. -treeFailure=\u00a7cEchec de la g\u00e9n\u00e9ration de l'arbre. Essayez de nouveau sur de l'herbe ou de la terre. +treeFailure=\u00a7c\u00c9chec de la g\u00e9n\u00e9ration de l'arbre. Essayez de nouveau sur de l'herbe ou de la terre. treeSpawned=\u00a77Arbre cr\u00e9\u00e9. -true=\u00a72true\u00a7f -typeTpaccept=\u00a77Pour le t\u00e9l\u00e9porter, utilisez \u00a7c/tpaccept\u00a77. -typeTpdeny=\u00a77Pour d\u00e9cliner cette demande, utilisez \u00a7c/tpdeny\u00a77. +true=\u00a72vrai\u00a7f +typeTpaccept=\u00a77Pour le t\u00e9l\u00e9porter, utilisez \u00a7c/tpaccept\u00a77 \u00a77ou \u00a7c/tpyes\u00a77. +typeTpdeny=\u00a77Pour d\u00e9cliner cette demande, utilisez \u00a7c/tpdeny\u00a77 \u00a77ou \u00a7c/tpno\u00a77. typeWorldName=\u00a77Vous pouvez aussi taper le nom d'un monde sp\u00e9cifique. -unableToSpawnMob=Incapable d'invoquer un cr\u00e9ature. -unbannedIP=Adresse IP d\u00e9bannie. -unbannedPlayer=Joueur d\u00e9banni. +unableToSpawnMob=Incapable d'invoquer une cr\u00e9ature. unignorePlayer=Vous n''ignorez plus {0}. unknownItemId=Num\u00e9ro d''objet inconnu : {0} unknownItemInList=L''objet {0} est inconnu dans la liste {1}. unknownItemName=Nom d''objet inconnu : {0} unlimitedItemPermission=\u00a7cPas de permission pour l''objet illimit\u00e9 {0}. -unlimitedItems=Objets illimit\u00e9s: +unlimitedItems=Objets illimit\u00e9s : unmutedPlayer=Le joueur {0} n''est plus muet. -unvanished=\u00a7aYou are once again visible. -unvanishedReload=\u00a7cA reload has forced you to become visible. +unvanished=\u00a7aVous \u00eates de nouveau visible. +unvanishedReload=\u00a7cUn reload vous a rendu de nouveau visible. upgradingFilesError=Erreur durant la mise \u00e0 jour des fichiers. +uptime=\u00a76Dur\u00e9e de fonctionnement :\u00a7c {0} +userAFK=\u00a75{0} \u00a75est actuellement absent/AFK et peut ne pas r\u00e9pondre. userDoesNotExist=L''utilisateur {0} n''existe pas. -userIsAway={0} s'est mis en AFK -userIsNotAway={0} n'est plus AFK +userIsAway={0} est d\u00e9sormais AFK. +userIsNotAway={0} n''est plus AFK. userJailed=\u00a77Vous avez \u00e9t\u00e9 emprisonn\u00e9. +userUnknown=\u00a74Attention : le joueur \u00a7c{0}\u00a74 n''est jamais venu sur ce serveur. userUsedPortal={0} a utilis\u00e9 un portail existant. -userdataMoveBackError=Echec du d\u00e9placement de userdata/{0}.tmp vers userdata/{1} -userdataMoveError=Echec du d\u00e9placement de userdata/{0} vers userdata/{1}.tmp +userdataMoveBackError=\u00c9chec du d\u00e9placement de userdata/{0}.tmp vers userdata/{1} +userdataMoveError=\u00C9chec du d\u00e9placement de userdata/{0} vers userdata/{1}.tmp usingTempFolderForTesting=Utilise un fichier temporaire pour un test. -vanished=\u00a7aYou have now been vanished. -versionMismatch=Versions diff\u00e9rentes ! Mettez s''il vous plait {0} \u00e0 la m\u00eame version. -versionMismatchAll=Mauvaise version ! S'il vous plait mettez des jars Essentials de version identique. +vanished=\u00a7aVous \u00eates d\u00e9sormais invisible. +versionMismatch=Versions diff\u00e9rentes ! Veuillez mettre {0} \u00e0 la m\u00eame version. +versionMismatchAll=Mauvaise version ! Veuillez mettre des jars Essentials de m\u00eame version. voiceSilenced=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duit au silence. -warpDeleteError=Probl\u00c3\u00a8me concernant la suppression du fichier warp. +walking=en train de marcher +warpDeleteError=Probl\u00e8me concernant la suppression du fichier warp. +warpList={0} warpListPermission=\u00a7cVous n'avez pas la permission d'afficher la liste des points de t\u00e9l\u00e9portation. -warpNotExist=Ce point de t\u00e9l\u00e9portation n'existe pas. -warpOverwrite=\u00a7cYou cannot overwrite that warp. -warpSet=\u00a77Le point de t\u00e9l\u00e9portation {0} a \u00e9t\u00e9 cr\u00e9\u00e9. -warpUsePermission=\u00a7cVous n'avez pas la permission d'utiliser ce point de t\u00e9l\u00e9portation. +warpNotExist=Ce warp n'existe pas. +warpOverwrite=\u00a7cVous ne pouvez pas \u00e9craser ce warp. +warpSet=\u00a77Le warp {0} a \u00e9t\u00e9 cr\u00e9\u00e9. +warpUsePermission=\u00a7cVous n'avez pas la permission d'utiliser ce warp. warpingTo=\u00a77T\u00e9l\u00e9portation vers {0}. -warps=point de t\u00e9l\u00e9portations : {0} -warpsCount=\u00a77Il y a {0} points de t\u00e9l\u00e9portations. Page {1} sur {2}. -weatherStorm=\u00a77Vous avez programm\u00e9 l''orage dans {0} -weatherStormFor=\u00a77Vous avez programm\u00e9 l''orage dans {0} pour {1} secondes. -weatherSun=\u00a77Vous avez programm\u00e9 le beau temps dans {0} -weatherSunFor=\u00a77Vous avez programm\u00e9 le beau temps dans {0} pour {1} secondes. -whoisAFK=\u00a76 - AFK:\u00a7f {0} -whoisBanned=\u00a76 - Banni:\u00a7f {0} -whoisExp=\u00a76 - Exp:\u00a7f {0} (Level {1}) -whoisFly=\u00a76 - Fly mode:\u00a7f {0} ({1}) -whoisGamemode=\u00a76 - Mode de jeu:\u00a7f {0} -whoisGeoLocation=\u00a76 - Emplacement:\u00a7f {0} -whoisGod=\u00a76 - Mode Dieu:\u00a7f {0} -whoisHealth=\u00a76 - Sant\u00e9:\u00a7f {0} / 20 -whoisIPAddress=\u00a76 - Adresse IP:\u00a7f {0} -whoisJail=\u00a76 - Jail:\u00a7f {0} -whoisLocation=\u00a76 - Emplacement:\u00a7f ({0}, {1}, {2}, {3}) -whoisMoney=\u00a76 - Argent:\u00a7f {0} -whoisMuted=\u00a76 - Muted:\u00a7f {0} -whoisNick=\u00a76 - Nick:\u00a7f {0} -whoisOp=\u00a76 - OP:\u00a7f {0} +warps=warps : {0} +warpsCount=\u00a77Il y a {0} warp(s). Page {1} sur {2}. +weatherStorm=\u00a77Vous avez programm\u00e9 l''orage dans {0}. +weatherStormFor=\u00a77Vous avez programm\u00e9 l''orage dans {0} pour {1} seconde(s). +weatherSun=\u00a77Vous avez programm\u00e9 le beau temps dans {0}. +weatherSunFor=\u00a77Vous avez programm\u00e9 le beau temps dans {0} pour {1} seconde(s). +whoisAFK=\u00a76 - AFK :\u00a7f {0} +whoisBanned=\u00a76 - Banni :\u00a7f {0} +whoisExp=\u00a76 - Exp\u00e9rience :\u00a7f {0} (Niveau {1}) +whoisFly=\u00a76 - Fly mode :\u00a7f {0} ({1}) +whoisGamemode=\u00a76 - Mode de jeu :\u00a7f {0} +whoisGeoLocation=\u00a76 - Emplacement :\u00a7f {0} +whoisGod=\u00a76 - Mode Dieu :\u00a7f {0} +whoisHealth=\u00a76 - Sant\u00e9 :\u00a7f {0} / 20 +whoisIPAddress=\u00a76 - Adresse IP :\u00a7f {0} +whoisJail=\u00a76 - Prison :\u00a7f {0} +whoisLocation=\u00a76 - Position :\u00a7f ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - Argent :\u00a7f {0} +whoisMuted=\u00a76 - Muet :\u00a7f {0} +whoisNick=\u00a76 - Surnom :\u00a7f {0} +whoisOp=\u00a76 - OP :\u00a7f {0} whoisTop=\u00a76 ====== WhoIs:\u00a7f {0} \u00a76====== -worth=\u00a77Une pile de {0} vaut \u00a7c{1}\u00a77 ({2} objet(s) \u00e0 {3} chacun) -worthMeta=\u00a77Une pile de {0} avec la m\u00e9tadonn\u00e9e de {1} vaut \u00a7c{2}\u00a77 ({3} objet(s) \u00e0 {4} chacun) -worthSet=Valeur cr\u00e9e +worth=\u00a77Un stack de {0} vaut \u00a7c{1}\u00a77 ({2} objet(s) \u00e0 {3} chacun) +worthMeta=\u00a77Un stack de {0} de type {1} vaut \u00a7c{2}\u00a77 ({3} objet(s) \u00e0 {4} chacun) +worthSet=Valeur cr\u00e9\u00e9e. year=ann\u00e9e years=ann\u00e9es youAreHealed=\u00a77Vous avez \u00e9t\u00e9 soign\u00e9. -youHaveNewMail=\u00a7cVous avez {0} messages ! \u00a7fEntrez \u00a77/mail read\u00a7f pour voir votre courrier. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +youHaveNewMail=\u00a7cVous avez {0} message(s) ! \u00a7fEntrez \u00a77/mail read\u00a7f pour voir votre courrier. +playerUnbanned=\u00a7c{0} \u00a76a d\u00e9banni {1}. +playerUnbanIpAddress=\u00a7c{0} \u00a76a d\u00e9banni l''IP {1}. +playerBanIpAddress=\u00a7c{0} \u00a76a banni l''IP {1}\u00a76. +noPotionEffectPerm=\u00a74Vous n''avez pas la permission d''appliquer l''effet \u00a7c{0} \u00a74\u00e0 cette potion. +invalidPotionMeta=\u00a74M\u00e9tadata de potion invalide : \u00a7c{0}\u00a74. +balanceOther=\u00a7aSolde de {0}\u00a7a :\u00a7c {1} +pWeatherCurrent=Pour \u00a7e{0}\u00a7f la m\u00e9t\u00e9o est {1}. +pWeatherNormal=\u00a7fPour \u00a7e{0}\u00a7f la m\u00e9t\u00e9o est normale et correspond au serveur. +pWeatherOthersPermission=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 changer la m\u00e9t\u00e9o des autres joueurs. +pWeatherPlayers=Ces joueurs ont leur propre m\u00e9t\u00e9o : +pWeatherReset=La m\u00e9t\u00e9o a \u00e9t\u00e9 r\u00e9initialis\u00e9e \u00e0 : \u00a7e{0} +pWeatherSet=La m\u00e9t\u00e9o du joueur a \u00e9t\u00e9 r\u00e9egl\u00e9e \u00e0 \u00a73{0}\u00a7f pour : \u00a7e{1} +pWeatherInvalidAlias=\u00a74Type de m\u00e9t\u00e9o invalide. +cannotStackMob=\u00a74Vous n'avez pas la permission de stack plusieurs mobs. +kitNotFound=\u00a74Ce kit n'existe pas. +socialSpy=\u00a76SocialSpy pour {0} \u00a76: {1} +setBal=\u00a7aVotre solde a \u00e9t\u00e9 modifi\u00e9 \u00e0 {0}. +setBalOthers=\u00a7aVous avez modifi\u00e0 le solde de {0} \u00e0 {1}. +insufficientFunds=\u00a74Fonds insuffisants. diff --git a/Essentials/src/messages_it.properties b/Essentials/src/messages_it.properties index 16c419bf4c..45dbc74313 100644 --- a/Essentials/src/messages_it.properties +++ b/Essentials/src/messages_it.properties @@ -5,10 +5,17 @@ action=* {0} {1} addedToAccount=\u00a7a{0} e'' stato aggiunto al tuo account. addedToOthersAccount=\u00a7a{0} e'' stato aggiunto all''account {1}\u00a7a. Nuovo bilancio: {2} +adventure = adventure alertBroke=fallito: alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} a: {3} alertPlaced=collocato: alertUsed=usato: +antiBuildBreak=\u00a74You are not permitted to break {0} blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with {0}. +antiBuildPlace=\u00a74You are not permitted to place {0} here. +antiBuildUse=\u00a74You are not permitted to use {0}. autoAfkKickReason=Sei stato kickato per inattivita'' oltre i {0} minuti. backAfterDeath=\u00a77Digita il comando /back per tornare al punto dove sei morto. backUsageMsg=\u00a77Ritorna alla posizione precedente. @@ -18,14 +25,17 @@ backupStarted=Backup iniziato balance=\u00a77Bilancio: {0} balanceTop=\u00a77Top bilanci ({0}) banExempt=\u00a7cNon puoi bannare questo player. -banIpAddress=\u00a77IP address bannato -bannedIpsFileError=Errore di lettura banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt non trovato -bannedPlayersFileError=Errore di lettura banned-players.txt -bannedPlayersFileNotFound=banned-players.txt non trovato +banFormat=Banned: {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7cCreazione del grande albero fallita. Riprova sull''erba o sul terreno. bigTreeSuccess= \u00a77Grande albero creato. blockList=Essentials ha trasmesso i seguenti comandi ad un altro plugin: +bookAuthorSet=\u00a76Author of the book set to {0} +bookLocked=\u00a7cThis book is now locked +bookTitleSet=\u00a76Title of the book set to {0} broadcast=[\u00a7cBroadcast\u00a7f]\u00a7a {0} buildAlert=\u00a7cNon hai i permessi per costruire bukkitFormatChanged=Il formato della versione Bukkit e'' cambiato. Versione non controllata. @@ -34,16 +44,18 @@ canTalkAgain=\u00a77Ora puoi parlare di nuovo cantFindGeoIpDB=Non trovo il database GeoIP! cantReadGeoIpDB=Lettura fallita del database GeoIP! cantSpawnItem=\u00a7cNon sei abilitato a generare l''oggetto {0} -chatTypeLocal=[L] chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. commandFailed=Comando {0} fallito: commandHelpFailedForPlugin=Errore nella guida di: {0} commandNotLoaded=\u00a7cIl comando {0} non e'' stato caricato correttamente. compassBearing=\u00a77Bussola: {0} ({1} gradi). configFileMoveError=Impossibile spostare config.yml nel backup. configFileRenameError=Impossibile rinominare il file temporale in config.yml -connectedPlayers=Players connessi: +connectedPlayers=\u00a77Players connessi\u00a7r connectionFailed=Connessione fallita. cooldownWithMessage=\u00a7cIn esaurimento: {0} corruptNodeInConfig=\u00a74Avviso: errore nel tuo file di configurazione, nodo {0}. @@ -61,6 +73,9 @@ deleteHome=\u00a77La home {0} e'' stata rimossa. deleteJail=\u00a77La prigione {0} e'' stata rimossa. deleteWarp=\u00a77Il Warp {0} e'' stato rimosso. deniedAccessCommand={0} Accesso negato al comando. +denyBookEdit=\u00a74You cannot unlock this book +denyChangeAuthor=\u00a74You cannot change the author of this book +denyChangeTitle=\u00a74You cannot change the title of this book dependancyDownloaded=[Essentials] Dependancy {0} download effettuato con successo. dependancyException=[Essentials] Errore durante il download di una dependacy dependancyNotFound=[Essentials] Una dependancy necessaria non e'' stata trovata, sto effettuando il download.. @@ -71,10 +86,12 @@ destinationNotSet=Destinazione non impostata disableUnlimited=\u00a77Collocazione illimitata di {0} per {1} disabilitata. disabled=disabilitato disabledToSpawnMob=La creazione di questo mob e'' stata disabilitata nel file config. +distance=\u00a76Distance: {0} dontMoveMessage=\u00a77Il teletrasporto iniziera'' tra {0}. Attendi. downloadingGeoIp=Download del database GeoIP... potrebbe richiedere del tempo (nazione: 0.6 MB, citta'': 20MB) duplicatedUserdata=Dati dell''utente duplicati: {0} e {1} durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left +editBookContents=\u00a7eYou may now edit the contents of this book enableUnlimited=\u00a77Sto inviando una quantita'' illimitata di {0} a {1}. enabled=abilitato enchantmentApplied = \u00a77L''incantesimo {0} e'' stato applicato all''oggetto nelle tue mani. @@ -98,28 +115,36 @@ false=\u00a74false\u00a7f feed=\u00a77Ora sei sazio. feedOther=\u00a77{0} e''stato nutrito. fileRenameError=Rinomina del file {0} fallita +fireworkColor=\u00a74You must apply a color to the firework to add an effect +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle flyMode=\u00a77Modalita'' volo impostata {0} per {1}. flying=flying foreverAlone=\u00a7cNon c''e'' nessuno a cui rispondere. freedMemory=Liberati {0} MB. +fullStack=\u00a74You already have a full stack gameMode=\u00a77Modalita''di gioco {0} impostata per {1}. -gcchunks= blocchi, -gcentities= entita'' +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities gcfree=Memoria libera: {0} MB gcmax=Memoria massima: {0} MB gctotal=Memoria allocata: {0} MB geoIpUrlEmpty=L''url del download di GeoIP e'' vuoto. geoIpUrlInvalid=L''url del download di GeoIP non e'' valido. -geoipJoinFormat=Il Player {0} proviene da {1} +geoipJoinFormat=\u00a76Il Player \u00a7c{0} \u00a76proviene da \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. godDisabledFor=God disabilitato per {0} godEnabledFor=God abilitato per {0} godMode=\u00a77Modalita'' God {0}. +groupNumber={0} online, for the full list type /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! hatArmor=\u00a7cError, you cannot use this item as a hat! hatEmpty=\u00a7cYou are not wearing a hat. hatFail=\u00a7cYou must have something to wear in your hand. hatPlaced=\u00a7eEnjoy your new hat! +hatRemoved=\u00a7eYour hat has been removed. haveBeenReleased=\u00a77Sei stato scarcerato. heal=\u00a77Sei stato curato. +healDead=\u00a74You cannot heal someone who is dead! healOther=\u00a77{0} e'' stato curato. helpConsole=Digitare ? per la guida. helpFrom=\u00a77Comandi da {0}: @@ -128,6 +153,9 @@ helpMatching=\u00a77Corrispondenza comandi "{0}": helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} helpPages=Pagina \u00a7c{0}\u00a7f di \u00a7c{1}\u00a7f: helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} +holdBook=\u00a74You are not holding a writable book +holdFirework=\u00a74You must be holding a firework to add effects +holdPotion=\u00a74You must be holding a potion to apply effects to it. holeInFloor=Buco nel terreno homeSet=\u00a77Home impostata. homeSetToBed=\u00a77La tua home e'' ora assegnata a questo letto. @@ -146,16 +174,23 @@ invRestored=l tuo inventario e'' stato ripristinato. invSee=Stai guardando l''inventario di {0}. invSeeHelp=Digita /invsee per ripristinare il tuo inventario. invalidCharge=\u00a7cIIstruzione non corretta. +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1} invalidHome=La home {0} non esiste +invalidHomeName=\u00a74Invalid home name invalidMob=Tipo mob non valido. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Server non valido! invalidSignLine=Riga {0} non corretta. +invalidWarpName=\u00a74Invalid warp name invalidWorld=\u00a7cMondo incorretto. inventoryCleared=\u00a77Inventario cancellato. +inventoryClearedAll=\u00a76Cleared everyone's inventory. inventoryClearedOthers=\u00a77Inventario di \u00a7c{0}\u00a77 cancellato. is=e'' itemCannotBeSold=L''oggetto non puo'' essere venduto. itemMustBeStacked=L''oggetto deve essere commerciato in pile. 2 quantita'' equivalgono a 2 pile, etc. +itemNames=Item short names: {0} itemNotEnough1=\u00a7cNon hai abbastanza quantita'' di questo oggetto per venderlo. itemNotEnough2=\u00a77Se vuoi vendere tutti gli oggetti di quel tipo, digita /sell nomeoggetto itemNotEnough3=\u00a77/sell nomeoggetto -1 vende tutto tranne quell''oggetto, etc. @@ -163,32 +198,38 @@ itemSellAir=Stai cercando di vendere l''aria? Metti un oggetto nella tua mano. itemSold=\u00a77Venduto per \u00a7c{0} \u00a77({1} {2} a {3} l''uno) itemSoldConsole={0} venduto {1} per \u00a77{2} \u00a77({3} oggetti a {4} l''uno) itemSpawn=\u00a77Inviati {0} di {1} +itemType=Item: {0} - {1} itemsCsvNotLoaded=Impossibile caricare items.csv. jailAlreadyIncarcerated=\u00a7cPlayer gia'' in prigione: {0} jailMessage=\u00a7cAvrai tempo per riflettere..in prigione. jailNotExist=La prigione dichiarata non esiste. jailReleased=\u00a77Player \u00a7e{0}\u00a77 scarcerato. jailReleasedPlayerNotify=\u00a77Sei stato scarcerato! -jailSentenceExtended=Tempo di incarcerazione aumentato di: {0) +jailSentenceExtended=Tempo di incarcerazione aumentato di: {0} jailSet=\u00a77{0} e'' ora una prigione. jumpError=Cosi'' facendo danneggerai la cpu. kickDefault=Kickato dal server kickExempt=\u00a7cNon puoi kickare questo player. kickedAll=\u00a7cKicked all players from server kill=\u00a77Ucciso {0}. -kitError2=\u00a7cQuesto kit non esiste o non e'' definito. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitError=\u00a7cNon ci sono kit validi. kitErrorHelp=\u00a7cForse una quantita'' manca in un oggetto della configurazione? kitGive=\u00a77Kit inviato {0}. +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. kitInvFull=\u00a7cIl tuo inventario e'' pieno, il kit e'' ora per terra. +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. kitTimed=\u00a7cNon puoi usare il kit per altri {0}. kits=\u00a77Kits: {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. lightningSmited=\u00a77Sei stato folgorato! lightningUse=\u00a77{0} e'' stato folgorato! listAfkTag = \u00a77[AFK]\u00a7f listAmount = \u00a79Ci sono \u00a7c{0}\u00a79 players online su un massimo di \u00a7c{1}. listAmountHidden = \u00a79Ci sono \u00a7c{0}\u00a77/{1}\u00a79 players online su un massimo di \u00a7c{2}. -listGroupTag={0}\u00a7f: +listGroupTag={0}\u00a7f: listHiddenTag = \u00a77[HIDDEN]\u00a7f loadWarpError=Impossibile caricare il warp {0} localFormat=Formato locale: <{0}> {1} @@ -198,9 +239,11 @@ mailSent=\u00a77Mail inviata! markMailAsRead=\u00a7cPer contrassegnare la mail come gia'' letta, digita /mail read markedAsAway=\u00a77Il tuo stato ora e'' "Non al computer". markedAsNotAway=\u00a77Bentornato! +matchingIPAddress=\u00a76The following players previously logged in from that IP address: maxHomes=Non puoi assegnare piu'' di {0} home. mayNotJail=\u00a7cNon puoi imprigionare questo player. me=mi +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minuto minutes=minuti missingItems=Non hai {0}x {1}. @@ -215,8 +258,12 @@ moneyTaken={0} prelevati dal tuo conto in banca. month=mese months=mesi moreThanZero=La quantita'' deve essere maggiore di 0. +moveSpeed=\u00a77Set {0} speed to {1} for {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. muteExempt=\u00a7cNon puoi mutare questo player. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1} mutedPlayer=Player {0} mutato. mutedPlayerFor=Player {0} mutato per {1}. mutedUserSpeaks={0} ha provato a parlare, ma e'' mutato. @@ -232,6 +279,7 @@ nickSet=\u00a77Il tuo nickname e'' ora \u00a7c{0} noAccessCommand=\u00a7cNon hai accesso a questo comando. noAccessPermission=\u00a7cNon hai i permessi di accesso per {0}. noBreakBedrock=Non sei abilitato a distruggere la bedrock. +noChapterMeta=\u00a74You do not have permission to create dynamic books. noDestroyPermission=\u00a7cNon hai i permessi per distruggere {0}. noDurability=\u00a7cThis item does not have a durability. noGodWorldWarning=\u00a7cAttenzione! Modalita'' God disabilitata in questo mondo. @@ -241,6 +289,9 @@ noHomeSetPlayer=Il Player non ha stabilito una home. noKitPermission=\u00a7cHai bisogno del permesso \u00a7c{0}\u00a7c per usare questo kit. noKits=\u00a77Non ci sono ancora kit disponibili noMail=Non hai ricevuto nessuna mail +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. noMotd=\u00a7cNon c''e'' nessun messaggio del giorno. noNewMail=\u00a77Non hai ricevuto nuove mail. noPendingRequest=Non hai richieste in sospeso. @@ -263,9 +314,11 @@ now=adesso nuke=Un regalino.. radioattivo numberRequired=Che ne dici di metterci un numero?! onlyDayNight=/time supporta solo day/night. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). onlyPlayers=Solo i players durante il gioco possono usare {0}. onlySunStorm=/weather supporta solo sun/storm. orderBalances=Sto ordinando i bilanci di {0} utenti, attendere grazie... +oversizedTempban=\u00a74You may not ban a player for this period of time. pTimeCurrent=L''orario di \u00a7e{0}\u00a7f e'' {1}. pTimeCurrentFixed=L''orario di \u00a7e{0}\u00a7f e'' fissato alle {1}. pTimeNormal=L''orario di \u00a7e{0}\u00a7f e'' normale e corrisponde a quello del server. @@ -288,7 +341,13 @@ playerNeverOnServer=\u00a7cIl Player {0} non e'' mai stato su questo server. playerNotFound=\u00a7cPlayer non trovato. playerUnmuted=\u00a77Sei stato smutato pong=Pong! +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) possibleWorlds=\u00a77I mondi sono numerati da 0 a {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. powerToolAir=Il comando non puo'' essere collegato all''aria. powerToolAlreadySet=Il comando \u00a7c{0}\u00a7f e'' gia'' stato assegnato a {1}. powerToolAttach=Il comando \u00a7c{0}\u00a7f e'' stato assegnato a {1}. @@ -303,6 +362,16 @@ powerToolsEnabled=Tutti i tuoi attrezzi sono stati abilitati. protectionOwner=\u00a76[EssentialsProtect] Protetto dal proprietario: {0} questionFormat=\u00a77[Domanda]\u00a7f {0} readNextPage=Digita /{0} {1} per la pagina successiva +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2} +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} reloadAllPlugins=\u00a77Tutti i plugins ricaricati. removed=\u00a77Rimosse {0} entitita''. repair=Hai riparato con successo il tuo: \u00a7e{0}. @@ -317,7 +386,10 @@ requestDeniedFrom=\u00a77{0} ha rifiutato la tua richiesta di teletrasporto. requestSent=\u00a77Richiesta inviata a {0}\u00a77. requestTimedOut=\u00a7cRichiesta di teletrasporto scaduta. requiredBukkit=* ! * e'' necessaria la versione {0} o superiore di CraftBukkit, scaricabile da http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all online players +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all players returnPlayerToJailError=Riscontrato errore nell''invio del player {0} alla prigione: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=secondo seconds=secondi seenOffline=Il Player {0} e'' offline da {1} @@ -354,7 +426,9 @@ teleportRequestTimeoutInfo=\u00a77Questa richiesta scadra'' tra {0} secondi. teleportTop=\u00a77Teletrasporto in cima. teleportationCommencing=\u00a77Inizio teletrasporto... teleportationDisabled=\u00a77Teletrasporto disabilitato. +teleportationDisabledFor=\u00a76Teleportation disabled for {0} teleportationEnabled=\u00a77Teletrasporto abilitato. +teleportationEnabledFor=\u00a76Teleportation enabled for {0} teleporting=\u00a77Teletrasporto in corso... teleportingPortal=\u00a77Teletrasporto tramite portale. tempBanned=Bannato temporaneamente dal server per {0} @@ -369,6 +443,8 @@ timeSet=Orario definito in tutti i mondi. timeSetPermission=\u00a7cNon sei autorizzato a regolare l''orario. timeWorldCurrent=L''orario attuale in {0} e'' \u00a73{1} timeWorldSet=L''orario e'' stato regolato alle {0} in: \u00a7c{1} +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. tps=Current TPS = {0} tradeCompleted=\u00a77Affare concluso. tradeSignEmpty=L''insegna non dispone di forniture sufficienti. @@ -380,8 +456,6 @@ typeTpaccept=\u00a77Per accetare il teletrasprto, digita \u00a7c/tpaccept\u00a77 typeTpdeny=\u00a77Per rifiutare il teletrasporto, digita \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Puoi digitare anche il nome di un mondo. unableToSpawnMob=Impossibile generare il mob. -unbannedIP=IP address abilitato. -unbannedPlayer=Player abilitato. unignorePlayer=Non stai piu'' ignorando il player {0}. unknownItemId=ID oggetto sconosciuto: {0} unknownItemInList=Oggetto {0} sconosciuto nella lista {1}. @@ -392,10 +466,13 @@ unmutedPlayer=Player {0} smutato. unvanished=\u00a7aYou are once again visible. unvanishedReload=\u00a7cA reload has forced you to become visible. upgradingFilesError=Errore durante l''aggiornamento dei file +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond userDoesNotExist=L''utente {0} non esiste. userIsAway={0} e'' AFK userIsNotAway={0} non e'' piu'' AFK userJailed=\u00a77Sei stato messo in prigione +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} ha usato un portale. userdataMoveBackError=Errore durante lo spostamento di userdata/{0}.tmp a userdata/{1} userdataMoveError=Errore durante lo spostamento di userdata/{0} a userdata/{1}.tmp @@ -404,7 +481,9 @@ vanished=\u00a7aYou have now been vanished. versionMismatch=Versione incorretta! Aggiornare {0} alla stessa versione. versionMismatchAll=Versione incorretta! Aggiornare tutti i jar Essentials alla stessa versione. voiceSilenced=\u00a77La tua voce e'' stata silenziata +walking=walking warpDeleteError=Problema nell''eliminazione del file warp. +warpList={0} warpListPermission=\u00a7cNon hai i permessi per consultare la lista warps. warpNotExist=Questo warp non esiste. warpOverwrite=\u00a7cNon puoi sovrascrivere il warp. @@ -440,5 +519,22 @@ year=anno years=anni youAreHealed=\u00a77Sei stato curato. youHaveNewMail=\u00a7cHai {0} messaggi!\u00a7f digita \u00a77/mail read\u00a7f per consultare la tua mail. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_nl.properties b/Essentials/src/messages_nl.properties index 1937db5a26..4feaca70ba 100644 --- a/Essentials/src/messages_nl.properties +++ b/Essentials/src/messages_nl.properties @@ -5,10 +5,17 @@ action=* {0} {1} addedToAccount=\u00a7a{0} is gestort op je rekening. addedToOthersAccount=\u00a7a{0} toegevoegd aan {1}\u00a7a zijn rekening. Nieuw balans: {2} +adventure = adventure alertBroke=gebroken: alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} bij: {3} alertPlaced=geplaatst: alertUsed=gebruikt: +antiBuildBreak=\u00a74You are not permitted to break {0} blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with {0}. +antiBuildPlace=\u00a74You are not permitted to place {0} here. +antiBuildUse=\u00a74You are not permitted to use {0}. autoAfkKickReason=Je bent van de server afgeschopt omdat je niets hebt gedaan voor meer dan {0} minuten. backAfterDeath=\u00a77Gebruik het /back commando om terug te keren naar je sterfplaats. backUsageMsg=\u00a77Naar de vorige locatie aan het gaan. @@ -18,14 +25,17 @@ backupStarted=Backup gestart. balance=\u00a77Saldo: {0} balanceTop=\u00a77 Top saldo ({0}) banExempt=\u00a77Je kunt deze speler niet verbannen. -banIpAddress=\u00a77Verbannen IP-adres. -bannedIpsFileError=Fout bij het lezen van banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt werd niet gevonden. -bannedPlayersFileError=Fout bij het lezen van banned-players.txt -bannedPlayersFileNotFound=banned-players.txt werd niet gevonden. +banFormat=Banned: {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7cMaken van een grote boom is mislukt. Probeer het opnieuw op gras of dirt. bigTreeSuccess= \u00a77Grote boom gemaakt. blockList=Essentials heeft de volgende commandos doorgegeven naar een andere plugin: +bookAuthorSet=\u00a76Author of the book set to {0} +bookLocked=\u00a7cThis book is now locked +bookTitleSet=\u00a76Title of the book set to {0} broadcast=[\u00a7Uitzending\u00a7f]\u00a7a {0} buildAlert=\u00a7cJe bent niet bevoegd om te bouwen. bukkitFormatChanged=Bukkit versie formaat veranderd. Versie niet nagekeken. @@ -34,16 +44,18 @@ canTalkAgain=\u00a77Je kan weer praten. cantFindGeoIpDB=De GeoIP database kon niet gevonden worden! cantReadGeoIpDB=Fout bij het lezen van de GeoIP database! cantSpawnItem=\u00a7cJe bent niet bevoegd om {0} te spawnen. -chatTypeLocal=[L] chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Gebruikersbestanden opgeschoont. +cleaning=Opschonen van gebruikersbestanden. commandFailed=Opdracht {0} is mislukt: commandHelpFailedForPlugin=Fout bij het \u200b\u200bkrijgen van hulp voor: {0} commandNotLoaded=\u00a7cOpdracht {0} is fout geladen. compassBearing=\u00a77Ligging: {0} ({1} graden). configFileMoveError=Het verplaatsen van config.yml naar de backup locatie is mislukt. configFileRenameError=Fout bij het hernoemen van de tijdelijke map naar config.yml -connectedPlayers=Spelers online: +connectedPlayers=\u00a77Spelers online\u00a7r connectionFailed=Fout bij het verbinden. cooldownWithMessage=\u00a7cAfkoeltijd: {0} corruptNodeInConfig=\u00a74Waarschuwing: Het configuratiebestand bevat een fout {0}. @@ -61,6 +73,9 @@ deleteHome=\u00a77Huis {0} is verwijdered. deleteJail=\u00a77Gevangenis {0} is verwijderd. deleteWarp=\u00a77Warp {0} is verwijderd. deniedAccessCommand={0} was de toegang verboden tot het commando. +denyBookEdit=\u00a74You cannot unlock this book +denyChangeAuthor=\u00a74You cannot change the author of this book +denyChangeTitle=\u00a74You cannot change the title of this book dependancyDownloaded=[Essentials] Afhankelijkheid {0} succesvol gedownload. dependancyException=[Essentials] Er is een fout opgetreden bij het downloaden van de afhankelijkheid. dependancyNotFound=[Essentials] Een afhankelijkheid is niet gevonden. Start downloaden. @@ -71,10 +86,12 @@ destinationNotSet=Bestemming niet ingesteld. disableUnlimited=\u00a77Oneindig plaatsen van {0} uitgeschakeld voor {1}. disabled=uitgeschakeld disabledToSpawnMob=Het voortbrengen van mobs is uitgeschakeld in het configuratie bestand. +distance=\u00a76Distance: {0} dontMoveMessage=\u00a77Beginnen met teleporteren in {0}. Niet bewegen. downloadingGeoIp=Bezig met downloaden van GeoIP database ... Dit kan een tijdje duren (country: 0.6 MB, city: 20MB) duplicatedUserdata=Dubbele gebruikersdata: {0} en {1}. durability=\u00a77Dit gereedschap kan nog \u00a7c{0}\u00a77 gebruikt worden. +editBookContents=\u00a7eYou may now edit the contents of this book enableUnlimited=\u00a77Oneindig aantal {0} aan {1} gegeven. enabled=ingeschakeld enchantmentApplied = \u00a77De betovering {0} is toegepast aan het voorwerp in je hand. @@ -98,28 +115,36 @@ false=\u00a74Onjuist\u00a7f feed=\u00a77Jouw honger is verzadigd. feedOther=\u00a7Verzadigd {0}. fileRenameError=Hernoemen van {0} mislukt +fireworkColor=\u00a74You must apply a color to the firework to add an effect +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle flyMode=\u00a77Zet vlieg modus {0} voor {1}. flying=vliegen foreverAlone=\u00a7cJe hebt niemand waarnaar je kan reageren. freedMemory={0} MB gelost. +fullStack=\u00a74You already have a full stack gameMode=\u00a77Zet spel modus {0} voor {1}. -gcchunks= chunks, -gcentities= entiteiten +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities gcfree=Vrij geheugen: {0} MB gcmax=Maximaal geheugen: {0} MB gctotal=Gealloceerd geheugen: {0} MB geoIpUrlEmpty=GeoIP download url is leeg. geoIpUrlInvalid=GeoIP download url is ongeldig. -geoipJoinFormat=Speler {0} komt uit {1} +geoipJoinFormat=\u00a76Speler \u00a7c{0} \u00a76komt uit \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. godDisabledFor=uitgeschakeld voor {0} godEnabledFor=ingeschakeld voor {0} godMode=\u00a77God modus {0}. +groupNumber={0} on-line, voor de volledige lijst type /{1} {2}. +groupDoesNotExist=\u00a74Er is niemand on-line in deze groep! hatArmor=\u00a7cFout, je kunt dit voorwerp niet als hoed gebruiken. hatEmpty=\u00a7cJe draagt geen hoed. hatFail=\u00a7cJe hebt iets nodig om te dragen als hoed. hatPlaced=\u00a7eGeniet van je nieuwe hoed! +hatRemoved=\u00a7eYour hat has been removed. haveBeenReleased=\u00a77Je bent bevrijdt heal=\u00a77Je bent genezen. +healDead=\u00a74You cannot heal someone who is dead! healOther=\u00a77Je geneezde {0}. helpConsole=type ? om de consolehelp weer te geven. helpFrom=\u00a77Commands from {0}: @@ -128,6 +153,9 @@ helpMatching=\u00a77Commandos overeenkomen met "{0}": helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} helpPages=Pagina \u00a7c{0}\u00a7f van de \u00a7c{1}\u00a7f: helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} +holdBook=\u00a74You are not holding a writable book +holdFirework=\u00a74You must be holding a firework to add effects +holdPotion=\u00a74You must be holding a potion to apply effects to it. holeInFloor=Gat in de vloer homeSet=\u00a77Home ingesteld. homeSetToBed=\u00a77Je home is is nu verplaatst naar dit bed. @@ -146,16 +174,23 @@ invRestored=Je inventaris is hersteld. invSee=Je kijkt naar de inventory van {0}. invSeeHelp=Type /invsee om je inventaris te herstellen. invalidCharge=\u00a7cOngeldig te laden. +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1} invalidHome=Huis {0} Bestaat niet. +invalidHomeName=\u00a74Invalid home name invalidMob=Ongeldig mob type. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Ongeldige server! invalidSignLine=Regel {0} op het bordje is ongeldig. +invalidWarpName=\u00a74Invalid warp name invalidWorld=\u00a7cOngeldige wereld. inventoryCleared=\u00a7inventaris leeggemaakt. +inventoryClearedAll=\u00a76Cleared everyone's inventory. inventoryClearedOthers=\u00a7inventaris van \u00a7c{0}\u00a77 leeggemaakt. is=is itemCannotBeSold=Dat voorwerp kan niet aan de server worden verkocht. itemMustBeStacked=Voorwerp moet geruild worden als stapel. Een hoeveelheid van 2 moet dus geruild worden als twee stapels, etc. +itemNames=Item short names: {0} itemNotEnough1=\u00a7cJe hebt niet genoeg van dat voorwerp om te verkopen. itemNotEnough2=\u00a77Type /sell itemname Als je alles daarvan wilt verkopen itemNotEnough3=\u00a77/sell itemname -1 zorgt ervoor dat ze allemaal behalve 1 worden verkocht, etc. @@ -163,32 +198,38 @@ itemSellAir=Je wilde serieus lucht verkopen? Plaats een voorwerp in je hand. itemSold=\u00a77Verkocht voor \u00a7c{0} \u00a77({1} {2} voorwerpen voor {3} per stuk) itemSoldConsole={0} verkocht {1} voor \u00a77{2} \u00a77({3} voorwerpen voor {4} per stuk) itemSpawn=\u00a77Geeft {0} {1} +itemType=Item: {0} - {1} itemsCsvNotLoaded=De item kunnen niet geladen worden.csv. jailAlreadyIncarcerated=\u00a7cDeze persoon zit al in de gevangenis: {0} jailMessage=\u00a7cJij begaat het misdrijf, jij zit je tijd uit. jailNotExist=Die gevangenis bestaat niet. jailReleased=\u00a77Speler \u00a7e{0}\u00a77 vrijgelaten. jailReleasedPlayerNotify=\u00a77Je bent vrijgelaten! -jailSentenceExtended=Gevangenistijd verlengt tot: {0) +jailSentenceExtended=Gevangenistijd verlengt tot: {0} jailSet=\u00a77Gevangenis {0} is ingesteld jumpError=Dat zou je computers hersenen beschadigen. kickDefault=Je bent van de server afgeschopt. kickExempt=\u00a77Je kunt die speler niet van de server afschoppen. kickedAll=\u00a7cAlle spelers van de server afgeschopt. kill=\u00a77Jij doodde {0}. -kitError2=\u00a7cDie kit bestaat niet of is verkeerde beschreven. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitError=\u00a7cEr zijn geen geldige kits. kitErrorHelp=\u00a7cMisschien mist er een hoeveelheid van het item in de configuratie? kitGive=\u00a77Kit {0} wordt gegeven. +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. kitInvFull=\u00a7cJe inventaris was vol, de kit wordt op de grond geplaatst +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. kitTimed=\u00a7cJe kan die kit pas weer gebruiken over {0}. kits=\u00a77Kits: {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. lightningSmited=\u00a77Je bent zojuist verbrand lightningUse=\u00a77Brand {0} listAfkTag = \u00a77[AFK]\u00a7f listAmount = \u00a79Er zijn \u00a7c{0}\u00a79 van het maximum \u00a7c{1}\u00a79 spelers online. listAmountHidden = \u00a79Er zijn \u00a7c{0}\u00a77/{1}\u00a79 van het maximum \u00a7c{2}\u00a79 spelers online. -listGroupTag={0}\u00a7f: +listGroupTag={0}\u00a7f: listHiddenTag = \u00a77[VERBORGEN]\u00a7f loadWarpError=Fout bij het laden van warp {0} localFormat=Lokaal: <{0}> {1} @@ -198,9 +239,11 @@ mailSent=\u00a77Bericht verzonden! markMailAsRead=\u00a7cType /mail clear, om je berichten als gelezen te markeren markedAsAway=\u00a77Je staat nu als afwezig gemeld. markedAsNotAway=\u00a77Je staat niet meer als afwezig gemeld. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: maxHomes=Je kunt niet meer dan {0} huizen zetten. mayNotJail=\u00a7cJe mag die speler niet in de gevangenis zetten. me=me +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minuut minutes=minuten missingItems=Je hebt geen {0}x {1}. @@ -215,8 +258,12 @@ moneyTaken={0} van je rekening afgehaald. month=maand months=maanden moreThanZero=Het aantal moet groter zijn dan 0. +moveSpeed=\u00a77Set {0} speed to {1} for {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. muteExempt=\u00a7cJe kan deze speler niet dempen. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1} mutedPlayer=Speler {0} gedempt. mutedPlayerFor=Speler {0} is gedempt voor {1}. mutedUserSpeaks={0} probeerde te praten, maar is gedempt. @@ -232,6 +279,7 @@ nickSet=\u00a77Je bijnaam is nu \u00a7c{0} noAccessCommand=\u00a7cJe hebt geen toegang tot die opdracht. noAccessPermission=\u00a7cJe hebt hier geen toegang voor {0}. noBreakBedrock=Je bent niet toegestaan om grondgesteente te breken. +noChapterMeta=\u00a74You do not have permission to create dynamic books. noDestroyPermission=\u00a7cJe hebt geen toegang om dat te vernietigen {0}. noDurability=\u00a7cDit voorwerp heeft geen durabiliteit. noGodWorldWarning=\u00a7cWaarschuwing! God modus is uitgeschakeld in deze wereld. @@ -241,6 +289,9 @@ noHomeSetPlayer=Speler heeft geen huis. noKitPermission=\u00a7cJe hebt de \u00a7c{0}\u00a7c toestemming nodig om die kit te gebruiken. noKits=\u00a77Er zijn nog geen kits beschikbaar noMail=Je hebt geen berichten +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. noMotd=\u00a7cEr is geen bericht van de dag. noNewMail=\u00a77Je hebt geen nieuwe berichten. noPendingRequest=Je hebt geen aanvragen. @@ -263,9 +314,11 @@ now=nu nuke=Moge de dood op hen neerregenen. numberRequired=Er moet daar een nummer, grapjas. onlyDayNight=/time ondersteund alleen day/night. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). onlyPlayers=Alleen in-game spelers kunnen {0} gebruiken. onlySunStorm=/weather ondersteunt alleen sun/storm. orderBalances=Rekeningen bestellen van {0} gebruikers, Watch A.U.B ... +oversizedTempban=\u00a74You may not ban a player for this period of time. pTimeCurrent=\u00a7e{0}'s\u00a7f tijd is {1}. pTimeCurrentFixed=\u00a7e{0}'s\u00a7f tijd is vastgezet op {1}. pTimeNormal=\u00a7e{0}'s\u00a7f tijd is normaal en komt overeen met de server. @@ -288,7 +341,13 @@ playerNeverOnServer=\u00a7cSpeler {0} is nooit op deze server geweest. playerNotFound=\u00a7cSpeler niet gevonden. playerUnmuted=\u00a77Speler mag weer praten pong=Pong! +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) possibleWorlds=\u00a77Mogelijke werelden zijn de nummers 0 tot en met {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. powerToolAir=Commando kan niet worden bevestigd aan lucht. powerToolAlreadySet=Commando \u00a7c{0}\u00a7f is al toegewezen aan {1}. powerToolAttach=\u00a7c{0}\u00a7f commando toegewezen aan {1}. @@ -303,6 +362,16 @@ powerToolsEnabled=Al jouw powertools zijn ingeschakeld. protectionOwner=\u00a76[EssentialsProtect] Beschermingeigenaar: {0} questionFormat=\u00a77[Vraag]\u00a7f {0} readNextPage=Type /{0} {1} om de volgende pagina te lezen. +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2} +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} reloadAllPlugins=\u00a77Alle plugins zijn herladen. removed=\u00a77{0} entiteiten verwijderd. repair=Je hebt succesvol je \u00a7e{0} \u00a7fverwijderd. @@ -317,7 +386,10 @@ requestDeniedFrom=\u00a77{0} denied your teleport request. requestSent=\u00a77Aanvraag verstuurd naar {0}\u00a77. requestTimedOut=\u00a7cTeleportatie verzoek is verlopen. requiredBukkit=* ! * You need atleast build {0} of CraftBukkit, download it from http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all online players +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all players returnPlayerToJailError=Error occurred when trying to return player {0} to jail: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=seconde seconds=seconde seenOffline=Speler {0} is offline vanaf {1} @@ -354,7 +426,9 @@ teleportRequestTimeoutInfo=\u00a77Dit verzoekt verloopt over {0} seconden. teleportTop=\u00a77Bezig met teleporteren naar het hoogste punt. teleportationCommencing=\u00a77Aan het beginnen met teleporteren... teleportationDisabled=\u00a77Teleportatie uitgeschakeld. +teleportationDisabledFor=\u00a76Teleportation disabled for {0} teleportationEnabled=\u00a77Teleportatie ingeschakeld. +teleportationEnabledFor=\u00a76Teleportation enabled for {0} teleporting=\u00a77Bezig met teleporteren... teleportingPortal=\u00a77Bezig met teleporteren via de portal. tempBanned=Tijdelijk geband voor {0} @@ -369,6 +443,8 @@ timeSet=Tijd ingesteld in alle werelden. timeSetPermission=\u00a7cJe bent niet bevoegd om de tijd te veranderen. timeWorldCurrent=De actuele tijd in {0} is \u00a73{1} timeWorldSet=De tijd was veranderd naar {0} in: \u00a7c{1} +totalWorthAll=\u00a7aAlle spullen verkocht voor een totale waarde van \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aAlle blokken verkocht voor een totale waarde van \u00a7c{1}\u00a7a. tps=Huidige TPS = {0} tradeCompleted=\u00a77Ruil verricht. tradeSignEmpty=Dit handelsbord heeft een te kleine voorraad. @@ -380,8 +456,6 @@ typeTpaccept=\u00a77Om te accepteren, type \u00a7c/tpaccept\u00a77. typeTpdeny=\u00a77Om te weigeren, type \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Je kan ook de exacte naam van de wereld typen. unableToSpawnMob=De mob kan niet gespawned worden. -unbannedIP=IP adres ontbannen. -unbannedPlayer=Speler ontbannen. unignorePlayer=Je negeert {0} niet meer. unknownItemId=Onbekend voorwerp id: {0} unknownItemInList=Onbekend voorwerp {0} in {1} lijst. @@ -392,10 +466,13 @@ unmutedPlayer=Speler {0} mag weer spreken. unvanished=\u00a7aYou are once again visible. unvanishedReload=\u00a7cEen herlading heeft je geforceerd om zichtbaar te worden. upgradingFilesError=Fout tijdens het upgraden van de bestanden +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond userDoesNotExist=Speler {0} bestaat niet. -userIsAway={0} is nu afwezing. +userIsAway={0} is nu afwezig. userIsNotAway={0} is niet meer afwezig. userJailed=\u00a77Je bent in de gevangenis gezet. +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} gebruikte een bestaande uitgangs portal. userdataMoveBackError=Fout bij het verplaasten van userdata/{0}.tmp naar userdata/{1} userdataMoveError=Fout bij het verplaasten van userdata/{0} naar userdata/{1}.tmp @@ -404,7 +481,9 @@ vanished=\u00a7aJe bent nu verborgen. versionMismatch=Verkeerde versie! Update {0} naar dezelfde versie. versionMismatchAll=Verkeerde versie! Update alle Essentials jars naar dezelfde versie. voiceSilenced=\u00a77Je kan niet meer praten +walking=walking warpDeleteError=Fout bij het verwijderen van het warp bestand. +warpList={0} warpListPermission=\u00a7cJe hebt geen toegang om die warp te maken. warpNotExist=Die warp bestaat niet. warpOverwrite=\u00a7cJe kunt deze warp niet overschrijven. @@ -417,7 +496,7 @@ weatherStorm=\u00a77Je hebt het weer naar stormachtig gezet in de {0} weatherStormFor=\u00a77Je hebt het weer in de {0} naar stormachtig gezet voor {1} seconde weatherSun=\u00a77Je hebt het weer naar zonnig gezet in de {0} weatherSunFor=\u00a77Je hebt het weer in de {0} naar zonnig gezet voor {1} seconde -whoisAFK=\u00a76 - Afwezing:\u00a7f {0} +whoisAFK=\u00a76 - Afwezig:\u00a7f {0} whoisBanned=\u00a76 - Verbannen:\u00a7f {0} whoisExp=\u00a76 - Exp:\u00a7f {0} (Level {1}) whoisFly=\u00a76 - Vlieg modus:\u00a7f {0} ({1}) @@ -440,5 +519,22 @@ year=jaar years=jaren youAreHealed=\u00a77Je bent genezen. youHaveNewMail=\u00a7cJe hebt {0} berichten!\u00a7f Type \u00a77/mail read\u00a7f om je berichten te bekijken. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_pl.properties b/Essentials/src/messages_pl.properties index f263a8ae9b..419c650ef8 100644 --- a/Essentials/src/messages_pl.properties +++ b/Essentials/src/messages_pl.properties @@ -1,444 +1,540 @@ #version: TeamCity # Single quotes have to be doubled: '' # Translations start here -# by: losdamianos, edited by Rutr -action=* {0} {1} +# by: losdamianos, edited by Rutr & skmedix +action=\u00a75* {0} \u00a75{1} addedToAccount=\u00a7a{0} zostalo dodane do twojego konta. -addedToOthersAccount=\u00a7a{0} dodane do konta {1}\u00a7. Nowy stan konta: {2}. -alertBroke=broke: -alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} at: {3} +addedToOthersAccount=\u00a7a{0} zostalo dodane do konta {1}\u00a7. Nowy stan konta: {2}. +adventure=Przygoda +alertBroke=zniszczyl: +alertFormat=\u00a73[{0}] \u00a7f {1} \u00a77 {2} at: {3} alertPlaced=postawil: alertUsed=uzyl: +antiBuildBreak=\u00a74Nie masz uprawnien by zniszczyc blok {0} tutaj. +antiBuildCraft=\u00a74Nie masz uprawnien by stworzyc\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74Nie masz uprawnien by wyrzucic\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74Nie masz uprawnien by odzialywac z {0}. +antiBuildPlace=\u00a74Nie masz uprawnien by postawic {0} tutaj. +antiBuildUse=\u00a74Nie masz uprawnien by uzyc {0}. autoAfkKickReason=Zostales wyrzucony z serwera za nie ruszanie sie przez wiecej niz {0} minut. backAfterDeath=\u00a77Uzyj komendy /back aby powrocic na miejsce swojej smierci. -backUsageMsg=\u00a77Transportowanie do poprzedniej lokacji. -backupDisabled=Zewnetrzny skrypt backupu nie zostal skonfigurowany. -backupFinished=Backup zakonczony. -backupStarted=Backup rozpoczety. -balance=\u00a77Stan konta: {0} +backUsageMsg=\u00a77Transportowanio Cie do poprzedniej lokacji. +backupDisabled=\u00a74Zewnetrzny skrypt backupu nie zostal skonfigurowany. +backupFinished=\u00a77Backup zakonczony. +backupStarted=\u00a77Backup rozpoczety. +balance=\u00a7aStan konta:\u00a7c {0} balanceTop=\u00a77Najbogatsi gracze ({0}) -banExempt=\u00a7cNie mozesz zbanowac tego gracza. -banIpAddress=\u00a77Zbanowano adress IP -bannedIpsFileError=Blad odczytu banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt nie znaleziony -bannedPlayersFileError=Blad odczytu banned-players.txt -bannedPlayersFileNotFound=banned-players.txt nie znaleziony -bigTreeFailure=\u00a7cNie mozna tutaj postawic duzego drzewa. Sprobuj ponownie na ziemi lub trawie. -bigTreeSuccess= \u00a77Utworzono duze drzewo. -blockList=Essentials przekazuje nastepujace polecenie do innej wtyczki: -broadcast=[\u00a7cOgloszenie\u00a7f]\u00a7a {0} -buildAlert=\u00a7cNie mozesz tu budowac +banExempt=\u00a74Nie mozesz zbanowac tego gracza. +banFormat=\u00a74Zbanowany: {0} +bed=\u00a7olozko\u00a7r +bedMissing=\u00a74Twoje lozko nie jest ustawione, lub jest zablokowane. +bedNull=\u00a7mlozko\u00a7r +bedSet=\u00a77Spawn w lozku ustawiony! +bigTreeFailure=\u00a74Nie mozna tutaj postawic duzego drzewa. Sprobuj ponownie na ziemi lub trawie. +bigTreeSuccess= \u00a77Stworzono duze drzewo. +blockList=\u00a77Essentials przekazuje nastepujace polecenie do innej wtyczki: +bookAuthorSet=\u00a77Ustawiono autora ksiazki na {0} . +bookLocked=\u00a7cKsiazka jest teraz zablokowana. +bookTitleSet=\u00a77Ustawiono tytul ksiazki na {0} . +broadcast=\u00a7r\u00a77[\u00a74Ogloszenie\u00a77]\u00a7a {0} +buildAlert=\u00a74Nie mozesz tu budowac bukkitFormatChanged=Format wersji Bukkita jest zmieniony. Wersja nie jest sprawdzana. -burnMsg=\u00a77Podpaliles {0} na {1} sekund. +burnMsg=\u00a77Podpaliles\u00a7c {0} \u00a77na \u00a7c{1} sekund\u00a77. canTalkAgain=\u00a77Znow mozesz mowic. cantFindGeoIpDB=Nie mozna znalezc bazy danych GeoIP! cantReadGeoIpDB=Odczytywanie bazy danych GeoIP zawiodlo! -cantSpawnItem=\u00a7cNie mozesz stworzyc przedmiotu {0}. -chatTypeLocal=[L] +cantSpawnItem=\u00a74Nie mozesz stworzyc przedmiotu\u00a7c {0}\u00a74. chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Szpieg] +cleaned=Pliki gracza wyczyszczono. +cleaning=Czyszczene plikow gracza. commandFailed=Komenda {0} zawiodla. commandHelpFailedForPlugin=Blad podczas uzyskiwania pomocy dla: {0} -commandNotLoaded=\u00a7cKomenda {0} nie jest zaladowana! -compassBearing=\u00a77Bearing: {0} ({1} stopni). +commandNotLoaded=\u00a74Komenda {0} nie jest zaladowana! +compassBearing=\u00a77Lozko: {0} ({1} stopni). configFileMoveError=Nie udalo sie przeniesc config.yml do lokalizacji backupa. configFileRenameError=Nie udalo sie zmienic nazwy tymczasowego pliku na config.yml -connectedPlayers=Obecni gracze: +connectedPlayers=\u00a77Obecni gracze\u00a7r connectionFailed=Blad podczas otwierania polaczenia. -cooldownWithMessage=\u00a7cCooldown: {0} -corruptNodeInConfig=\u00a74Notice: Twoj plik konfiguracyjny ma uszkodzony wpis: {0} -couldNotFindTemplate=Nie mozna znajsc szablonu: {0} -creatingConfigFromTemplate=tworzenie konfiguracji z szablonu: {0} +cooldownWithMessage=\u00a74Cooldown: {0} +corruptNodeInConfig=\u00a74Uwaga: Twoj plik konfiguracyjny ma uszkodzony wpis: {0} +couldNotFindTemplate=\u00a74Nie mozna znalezc szablonu: {0} +creatingConfigFromTemplate=Tworzenie konfiguracji z szablonu: {0} creatingEmptyConfig=Stworzono pusty config: {0} creative=Kreatywny currency={0}{1} -currentWorld=Biezacy swiat: {0} +currentWorld=\u00a77Biezacy swiat:\u00a7c {0} day=dzien -days=dnie +days=dni defaultBanReason=Admin ma zawsze racje! deleteFileError=Nie mozna usunac pliku: {0} -deleteHome=\u00a77Posterunek {0} zostal usuniety -deleteJail=\u00a77Wiezienie {0} zostalo usuniete -deleteWarp=\u00a77Warp {0} zostal usuniety -deniedAccessCommand={0} nie ma dostepu do tego polecenia +deleteHome=\u00a77Dom\u00a7c {0} \u00a77zostal usuniety. +deleteJail=\u00a77Wiezienie\u00a7c {0} \u00a77zostalo usuniete. +deleteWarp=\u00a77Warp\u00a7c {0} \u00a77zostal usuniety. +deniedAccessCommand=\u00a7c{0} \u00a74nie ma dostepu do tego polecenia +denyBookEdit=\u00a74Nie mozesz odblokowac tej ksiazki. +denyChangeAuthor=\u00a74Nie mozesz zmienic autora tej ksiazki. +denyChangeTitle=\u00a74Nie mozesz zmienic tytulu tej ksiazki. dependancyDownloaded=[Essentials] Zaleznosci {0} pobrane prawidlowo. dependancyException=[Essentials] Wystapil blad w trakcie pobierania zaleznosci. dependancyNotFound=[Essentials] Wymagana zaleznosc nie zostala znaleziona, pobieranie. depth=\u00a77Jestes na poziomie morza. -depthAboveSea=\u00a77Jestes {0} blok(ow) nad poziomem morza. -depthBelowSea=\u00a77Jestes {0} blok(ow) pod poziomem morza. +depthAboveSea=\u00a77Jestes\u00a7c {0} \u00a77blok(ow) nad poziomem morza. +depthBelowSea=\u00a77Jestes\u00a7c {0} \u00a77blok(ow) pod poziomem morza. destinationNotSet=Cel nieokreslony. -disableUnlimited=\u00a77Wylaczone nieograniczone tworzenia {0} dla {1}. +disableUnlimited=\u00a77Wylaczone nieograniczone tworzenia\u00a7c {0} \u00a77dla {1}. disabled=wylaczone -disabledToSpawnMob=Tworzenie tego moba zostalo wylaczone w pliku config. -dontMoveMessage=\u00a77Teleportacja nastapi za {0}. Prosze sie nie ruszac. +disabledToSpawnMob=\u00a74Tworzenie tego moba zostalo wylaczone w pliku config. +distance=\u00a77Odleglosc: {0} +dontMoveMessage=\u00a77Teleportacja nastapi za\u00a7c {0}\u00a77. Prosze sie nie ruszac. downloadingGeoIp=Pobieranie bazy danych GeoIP... To moze zajac chwile (wioska: 0.6 MB, miasto: 20MB) duplicatedUserdata=Kopiowanie danych uzytkownika: {0} i {1} durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left -enableUnlimited=\u00a77Przyznano nielimitowane zasoby {0} dla {1}. +editBookContents=\u00a7eNie mozesz teraz edytowac tej ksiazki. +enableUnlimited=\u00a77Przyznano nielimitowane zasoby\u00a7c {0} \u00a77dla {1}. enabled=wlaczone -enchantmentApplied = \u00a77Ulepszenie {0} zostalo przyznane przedmiotowi w twoim reku. -enchantmentNotFound = \u00a7cUlepszenie nie odnalezione -enchantmentPerm = \u00a7cNie masz zezwolenia na {0}. -enchantmentRemoved = \u00a77Ulepszenie {0} zostalo usuniete z przedmiotu w twoim reku.. -enchantments = \u00a77Ulepszenia: {0} +enchantmentApplied= \u00a77Ulepszenie\u00a7c {0} \u00a77zostalo przyznane przedmiotowi w twoim reku. +enchantmentNotFound= \u00a74Ulepszenie nie odnalezione +enchantmentPerm= \u00a74Nie masz zezwolenia na\u00a7c {0}\u00a7c4. +enchantmentRemoved= \u00a77Ulepszenie\u00a7c {0} \u00a77zostalo usuniete z przedmiotu w twoim reku.. +enchantments= \u00a77Ulepszenia:\u00a7r {0} errorCallingCommand=Blad wywolywania komendy /{0} -errorWithMessage=\u00a7cBlad: {0} -essentialsHelp1=Plik jest uszkodzony i Essentials nie moze go otworzyc. Essentials jest teraz wylaczone. Jesli nie mozesz samemu naprawic pliku, idz do adresu http://tiny.cc/EssentialsChat -essentialsHelp2=Plik jest uszkodzony i Essentials nie moze go otworzyc. Essentials jest teraz wylaczone. Jesli nie mozesz samemu naprawic pliku, wpisz /essentialshelp w grze lub idz do adresu http://tiny.cc/EssentialsChat -essentialsReload=\u00a77Essentials przeladowalo {0}. +errorWithMessage=\u00a7cBlad:\u00a74 {0} +essentialsHelp1=Plik jest uszkodzony i Essentials nie moze go otworzyc. Essentials jest teraz wylaczone. Jesli nie mozesz samemu naprawic pliku, idz na http://tiny.cc/EssentialsChat +essentialsHelp2=Plik jest uszkodzony i Essentials nie moze go otworzyc. Essentials jest teraz wylaczone. Jesli nie mozesz samemu naprawic pliku, wpisz /essentialshelp w grze lub wejdz na http://tiny.cc/EssentialsChat +essentialsReload=\u00a77Essentials przeladowalo\u00a7c {0}. exp=\u00a7c{0} \u00a77ma\u00a7c {1} \u00a77doswiadczenia (poziom\u00a7c {2}\u00a77), potrzebuje\u00a7c {3} \u00a77wiecej doswiadczenia do nastepnego poziomu. expSet=\u00a7c{0} \u00a77teraz ma\u00a7c {1} \u00a77doswiadczenia. extinguish=\u00a77Zostales ugaszony. -extinguishOthers=\u00a77Ugasiles {0}. +extinguishOthers=\u00a77Ugasiles {0}\u00a77. failedToCloseConfig=Blad podczas zamykania configu {0} failedToCreateConfig=Blad podczas tworzenia configu {0} failedToWriteConfig=Blad podczas pisania configu {0} -false=\u00a74false\u00a7f +false=\u00a74nie\u00a7r feed=\u00a77Twoj glod zostal zaspokojony. -feedOther=\u00a77Nakarmiono {0}. +feedOther=\u00a77Nakarmiono gracza {0}. fileRenameError=Blad podczas zmiany nazwy pliku \u0093{0}\u0094. -flyMode=\u00a77Latanie {0} dla {1}. -flying=flying -foreverAlone=\u00a7cNie masz komu odpisac. +fireworkColor=\u00a74Musisz dodac kolor fajerwerki by dodac do niej efekt. +fireworkEffectsCleared=\u00a77Usunieto wszystkie efekty trzymanych w reku fajerwerek. +fireworkSyntax=\u00a77Parametry Fajerwerki:\u00a74 color: [fade:] [shape:] [effect:]\n\u00a77By uzyc wielu kolorow/efektow, oddziel wartosci przecinkami: \u00a74red,blue,pink\n\u00a77Ksztalty:\u00a74 star, ball, large, creeper, burst \u00a77Efekty:\u00a74 trail, twinkle. +flyMode=\u00a77Ustawiono latanie\u00a7c {0} \u00a77dla {1}\u00a77. +flying=latanie +foreverAlone=\u00a74Nie masz komu odpisac. freedMemory=Zwolniono {0} MB. -gameMode=\u00a77Ustawiono tryb gry {0} dla {1}. -gcchunks= chunki -gcentities= jednostki -gcfree=Wolna pamiec: {0} MB -gcmax=Maksymalna pamiec: {0} MB +fullStack=\u00a74Juz masz pelny stack. +gameMode=\u00a77Ustawiono tryb gry\u00a7c {0} \u00a77dla {1}\u00a77. +gcWorld=\u00a77{0} "\u00a7c{1}\u00a77": \u00a7c{2}\u00a77 chunks, \u00a7c{3}\u00a77 entities +gcfree=\u00a77Wolna pamiec:\u00a7c {0} MB +gcmax=\u00a77Maksymalna pamiec:\u00a7c {0} MB gctotal=Alokowana pamiec: {0} MB geoIpUrlEmpty=Url pobierania GeoIP jest puste. geoIpUrlInvalid=Url pobierania GeoIP jest nieprawidlowe. -geoipJoinFormat=Gracz {0} przybyl z {1} -godDisabledFor=Godmode wylaczony dla {0}. -godEnabledFor=Godmode wlaczony dla {0}. -godMode=\u00a77Godmode {0}. -hatArmor=\u00a7cError, you cannot use this item as a hat! -hatEmpty=\u00a7cYou are not wearing a hat. -hatFail=\u00a7cMusisz cos trzymac w dloni. -hatPlaced=\u00a7eCiesz sie nowym kapeluszem! +geoipJoinFormat=\u00a76Gracz \u00a7c{0} \u00a76przybyl z \u00a7c{1}\u00a76. +giveSpawn=\u00a77Dales\u00a7c {1} {0} \u00a77graczowi\u00a7c {2}\u00a77. +godDisabledFor=\u00a74wylaczony\u00a77 dla\u00a7c {0}. +godEnabledFor=\u00a7awlaczony\u00a77 dla\u00a7c {0}. +godMode=\u00a77Godmode\u00a7c {0}\u00a77. +groupNumber={0} online, by zobaczyc pelna liste wpisz /{1} {2} +groupDoesNotExist=\u00a74W tej grupie nikt nie jest online. +hatArmor=\u00a74Blad, nie mozesz uzyc tego jako kapelusz. +hatEmpty=\u00a74Nie nosisz aktualnie kapelusza. +hatFail=\u00a74Musisz cos trzymac w dloni. +hatPlaced=\u00a77Ciesz sie nowym kapeluszem! +hatRemoved=\u00a77Twoj kapelusz zostal usuniety. haveBeenReleased=\u00a77Zostales wypuszczony. -heal=\u00a77Uleczony +heal=\u00a77Zostales uleczony. +healDead=\u00a74Nie mozesz uleczyc kogos kto nie zyje! healOther=\u00a77Uleczono {0}. -helpConsole=Aby uzyskac pomoc z konsoli, wpisz \u0093????. +helpConsole=Aby uzyskac pomoc z konsoli, wpisz ?. helpFrom=\u00a77Komendy od {0}: -helpLine=\u00a76/{0}\u00a7f: {1} -helpMatching=\u00a77Komendy odpowiadajace "{0}": -helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} -helpPages=Strona \u00a7c{0}\u00a7f z \u00a7c{1}\u00a7f: -helpPlugin=\u00a74{0}\u00a7f: Plugin Help: /help {1} -holeInFloor=Kosmos -homeSet=\u00a77Dom ustawiono +helpLine=\u00a77/{0}\u00a7r: {1} +helpMatching=\u00a77Komendy odpowiadajace "\u00a7c{0}\u00a77": +helpOp=\u00a74[HelpOp]\u00a7r \u00a77{0}:\u00a7r {1} +helpPages=\u00a77Strona \u00a7c{0}\u00a77 z \u00a7c{1}\u00a77: +helpPlugin=\u00a74{0}\u00a7r: Plugin Help: /help {1} +holdBook=\u00a74Nie trzymasz napisanej ksiazki. +holdFirework=\u00a74Musisz trzymac fajerwerke by dodac efekt. +holdPotion=\u00a74Musisz trzymac miksture by dodac do niej efekt. +holeInFloor=\u00a74Kosmos +homeSet=\u00a77Dom zostal ustawiony. homeSetToBed=\u00a77Twoj dom znajduje sie teraz w tym lozku. -homes=Domy: {0} +homes=\u00a77Domy:\u00a7r {0} hour=godzina -hours=godziny -ignorePlayer=Od tej chwili ignorujesz gracza {0}. +hours=godzin +ignorePlayer=\u00a77Od tej chwili ignorujesz gracza \u00a7c{0}\u00a77. illegalDate=Nie prawidlowy format daty. infoChapter=Wybierz rozdzial: -infoChapterPages=Rozdzial {0}, strona \u00a7c{1}\u00a7f z \u00a7c{2}\u00a7f: -infoFileDoesNotExist=Plik \u0093info.txt\u0094 nie istnieje. Tworzenie tego pliku. -infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Strona \u00a74{0}\u00a76/\u00a74{1} \u00a7e---- +infoChapterPages=\u00a77Rozdzial {0}, strona \u00a7c{1}\u00a77 z \u00a7c{2}\u00a77: +infoFileDoesNotExist=Plik info.txt nie istnieje. Tworzenie tego pliku. +infoPages=\u00a7e ---- \u00a77{2} \u00a7e--\u00a77 Strona \u00a7c{0}\u00a77/\u00a7c{1} \u00a7e---- infoUnknownChapter=Nieznany rozdzial. -invBigger=Ekwipunek innego gracza jest wiekszy niz Twoj. -invRestored=Twoj ekwipunek zostal przywrocony. -invSee=Widzisz ekwipunek {0}. -invSeeHelp=Wpisz /invsee aby przywrocic swoj ekwipunek. -invalidCharge=\u00a7cInvalid charge. -invalidHome=Dom {0} nie istnieje. -invalidMob=Niepoprawny typ moba.. +invBigger=\u00a74Ekwipunek innego gracza jest wiekszy niz Twoj. +invRestored=\u00a77Twoj ekwipunek zostal przywrocony. +invSee=\u00a77Widzisz ekwipunek\u00a7c {0}\u00a77. +invSeeHelp=\u00a77Wpisz /invsee aby przywrocic swoj ekwipunek. +invalidCharge=\u00a74Invalid charge. +invalidFireworkFormat=\u00a77Opcja \u00a74{0} \u00a77nie jest poprawna wartoscia dla \u00a74{1}\u00a77. +invalidHome=\u00a74Dom\u00a7c {0} \u00a74nie istnieje. +invalidHomeName=\u00a74Niepoprawna nazwa domu. +invalidMob=Niepoprawny typ moba. +invalidNumber=Niepoprawny Numer. +invalidPotion=\u00a74Niepoprawna mikstura. invalidServer=Niepoprawny serwer! -invalidSignLine=Linia {0} na znaku jest bledna. -invalidWorld=\u00a7cNieprawidlowy swiat. +invalidSignLine=\u00a74Linia\u00a7c {0} \u00a74na znaku jest bledna. +invalidWarpName=\u00a74Niepoprawna nazwa warpa. +invalidWorld=\u00a74Nieprawidlowy swiat. inventoryCleared=\u00a77Ekwipunek oprozniony. -inventoryClearedOthers=\u00a77Ekwipunek \u00a7c{0}\u00a77 oprozniony. +inventoryClearedAll=\u00a77Wszystkim wyczyszczono ekwipunek. +inventoryClearedOthers=\u00a77Ekwipunek \u00a7c{0}\u00a77 oprozniony. is=jest -itemCannotBeSold=Nie mozesz sprzedac tego przedmiotu do serwera. -itemMustBeStacked=Przedmiotem handluje sie w stackach. Wielkosc 2s to dwa stacki itd. -itemNotEnough1=\u00a7cMasz za malo tego przedmiotu, aby go sprzedac. +itemCannotBeSold=\u00a7rNie mozesz sprzedac tego przedmiotu serwerowi. +itemMustBeStacked=\u00a74Przedmiotem handluje sie w stackach. Wielkosc 2s to dwa stacki itd. +itemNames=\u00a77Krotka nazwa:\u00a7r {0} +itemNotEnough1=\u00a74Masz za malo tego przedmiotu, aby go sprzedac. itemNotEnough2=\u00a77Jesli chcesz sprzedac wszystkie przedmioty tego typu, wpisz /sell nazwaprzedmiotu itemNotEnough3=\u00a77/sell nazwaprzedmiotu -1 sprzeda cala ilosc przedmiotu poza 1 sztuka itd. itemSellAir=Serio probujesz sprzedac powietrze? Miej w reku przedmiot.. -itemSold=\u00a77Sprzedamo za \u00a7c{0} \u00a77({1} {2} po {3} kazdy) -itemSoldConsole={0} Sprzedano {1} za \u00a77{2} \u00a77({3} sztuki po {4} kazda) -itemSpawn=\u00a77Otrzymywanie {0} {1} -itemsCsvNotLoaded=Nie mozna wczytac items.csv. -jailAlreadyIncarcerated=\u00a7cTen gracz jest juz w wiezieniu \u0093{0}\u0094. -jailMessage=\u00a7cZa kazde przewinienie czeka kara. -jailNotExist=Nie ma takiego wiezienia.. -jailReleased=\u00a77Gracz \u00a7e{0}\u00a77 wypuszczony z wiezienia. +itemSold=\u00a7aSprzedano za \u00a7c{0} \u00a7a({1} {2} po {3} kazdy) +itemSoldConsole=\u00a7a{0} \u00a7aSprzedano {1} za \u00a7a{2} \u00a7a({3} sztuki po {4} kazda) +itemSpawn=\u00a77Otrzymywanio\u00a7c {0} \u00a77z\u00a7c {1} +itemType=\u00a77Przedmiot:\u00a7c {0} \u00a77-\u00a7c {1} +itemsCsvNotLoaded=Nie mozna wczytac pliku items.csv. +jailAlreadyIncarcerated=\u00a74Ten gracz jest juz w wiezieniu \u00a7c{0} \u00a74. +jailMessage=\u00a74Za kazde przewinienie czeka kara. +jailNotExist=\u00a74Nie ma takiego wiezienia. +jailReleased=\u00a77Gracz \u00a7c{0}\u00a77 wypuszczony z wiezienia. jailReleasedPlayerNotify=\u00a77Zostales zwolniony! -jailSentenceExtended=Czas pobyty w wiezieniu zwiekszony do: {0) -jailSet=\u00a77Zostalo stworzone wiezienie \u0093{0}\u0094. -jumpError=To moglo by ci cos zrobic. -kickDefault=Zostales wyrzucony z serwera. -kickExempt=\u00a7cNie mozesz wyrzucic tej osoby. -kickedAll=\u00a7cWyrzucanie wszystki graczy z serwera -kill=\u00a77Zabito {0}. -kitError2=\u00a7cTen zestaw nie istnieje lub zostal zle zdefininowany. -kitError=\u00a7cNie ma prawidlowych zestawow. -kitErrorHelp=\u00a7cByc moze przedmiotowi brakuje ilosci w konfiguracji? -kitGive=\u00a77Przydzielanie zestawu {0}. -kitInvFull=\u00a7cTwoj ekwipuek jest pelen, wyrzucanie zestawu na podloge. -kitTimed=\u00a7cNie mozesz wziasc tego zestawu przez kolejne {0}. -kits=\u00a77Zestawy: {0} +jailSentenceExtended=\u00a77Czas pobyty w wiezieniu zwiekszony do: {0} +jailSet=\u00a77Zostalo stworzone wiezienie \u00a7c{0}\u00a77. +jumpError=\u00a74To moglo by ci cos zrobic. +kickDefault=Zostales wyrzucony z serwera. +kickExempt=\u00a74Nie mozesz wyrzucic tej osoby. +kickedAll=\u00a74Wyrzucanie wszystki graczy z serwera +kill=\u00a77Gracz \u00a7c{0} \u00a77zostal zabity. +killExempt=\u00a74Nie mozesz zabic gracza {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. +kitError=\u00a74Nie ma prawidlowych zestawow. +kitErrorHelp=\u00a74Byc moze przedmiotowi brakuje ilosci w konfiguracji? +kitGive=\u00a77Przydzielanie zestaw\u00a7c {0}\u00a77. +kitGiveTo=\u00a74{1} \u00a77otrzymal zestaw\u00a7c {0}\u00a77. +kitInvFull=\u00a74Twoj ekwipuek jest pelen, zestaw zostal wyrzucony na podloge. +kitOnce=\u00a74Nie mozesz uzyc zestawu ponownie. +kitReceive=\u00a77Otrzymales zestaw\u00a7c {0}\u00a77. +kitTimed=\u00a74Nie mozesz wziasc tego zestawu przez kolejne\u00a7c {0}\u00a74. +kits=\u00a77Zestawy:\u00a7r {0} +leatherSyntax=\u00a77Skladnia Koloru Skory: color:,, np: color:255,0,0. lightningSmited=\u00a77Zostales uderzony piorunem. -lightningUse=\u00a77Uderzanie piorunem {0}. -listAfkTag = \u00a77[AFK]\u00a7f -listAmount = \u00a79Na serwerze jest \u00a7c{0}\u00a79 graczy z maksimum \u00a7c{1}\u00a79 online. -listAmountHidden = \u00a79There are \u00a7c{0}\u00a77/{1}\u00a79 out of maximum \u00a7c{2}\u00a79 players online. -listGroupTag={0}\u00a7f: -listHiddenTag = \u00a77[UKRYTY]\u00a7f -loadWarpError=Blad przy wczytywaniu Warpu {0} -localFormat=Lokalny: <{0}> {1} -mailClear=\u00a7cAby oczyscic skrzynke, wpisz /mail clear +lightningUse=\u00a77Uderzono piorunem\u00a7c {0}\u00a77. +listAfkTag= \u00a77[AFK]\u00a7f +listAmount= \u00a77Na serwerze jest \u00a7c{0}\u00a77 graczy z maksimum \u00a7c{1}\u00a77 online. +listAmountHidden= \u00a77Na serwerze jest \u00a7c{0}\u00a77/{1}\u00a77 graczy z maksimum \u00a7c{2}\u00a77 online. +listGroupTag={0}\u00a7r: +listHiddenTag= \u00a77[UKRYTY]\u00a7r +loadWarpError=\u00a74Blad przy wczytywaniu warpu {0}. +localFormat=[L]<{0}> {1} +mailClear=\u00a77Aby oczyscic skrzynke, wpisz\u00a7c /mail clear mailCleared=\u00a77Skrzynka oprozniona!! mailSent=\u00a77Wiadomosc wyslana! -markMailAsRead=\u00a7cAby oczyscic skrzynke, wpisz /mail clear +markMailAsRead=\u00a77Aby oczyscic skrzynke, wpisz\u00a7c /mail clear markedAsAway=\u00a77Zostales oznaczony jako nieobecny. markedAsNotAway=\u00a77Juz nie jestes nieobecny. -maxHomes=Nie mozesz ustawic wiecej niz {0} domow. -mayNotJail=\u00a7cNie mozesz wtracic do wiezienia tej osoby. -me=ja +matchingIPAddress=\u00a77Gracz wczesniej zalogowany z tego adresu IP: +maxHomes=\u00a74Nie mozesz ustawic wiecej niz\u00a7c {0} \u00a74domow. +mayNotJail=\u00a74Nie mozesz wtracic do wiezienia tej osoby. +me=Ja +messageTruncated=\u00a74Wiadomosc skrocona: aby zobaczyc cala wpisz\u00a7c /{0} {1} minute=minuta -minutes=minuty -missingItems=Nie masz {0}x{1}. +minutes=minut +missingItems=\u00a74Nie masz {0}x {1}. missingPrefixSuffix=Brakuje prefixu lub suffixu dla {0} -mobSpawnError=Blad podczas zmiany spawnera. +mobSpawnError=\u00a74Blad podczas zmiany spawnera. mobSpawnLimit=Ilosc mobow ograniczona do limitu serwera. -mobSpawnTarget=Blok musi byc spawnerem. +mobSpawnTarget=\u00a74Blok musi byc spawnerem. mobsAvailable=\u00a77Moby: {0} moneyRecievedFrom=\u00a7a{0} otrzymane od {1} moneySentTo=\u00a7a{0} zostalo wyslane do {1} -moneyTaken={0} zostalo zabrane z Twoich funduszy.. +moneyTaken=\u00a7a{0} zostalo zabrane z Twoich funduszy.. month=miesiac months=miesiecy -moreThanZero=Ilosc musi byc wieksza od 0. -msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} -muteExempt=\u00a7cNie mozesz wyciszyc tego gracza.. -mutedPlayer=Gracz {0} wyciszony. -mutedPlayerFor=Gracz {0} wyciszony na {1}. +moreThanZero=\u00a74Ilosc musi byc wieksza niz 0. +moveSpeed=\u00a77Ustawiono {0} szybkosc {1} dla {2}. +msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7r{2} +multipleCharges=\u00a74Nie mozesz ustawic wiecej niz jeden ladunek dla tej fajerwerki. +multiplePotionEffects=\u00a74Nie mozesz ustawic wiecej niz jeden efekt dla tej mikstury. +muteExempt=\u00a74Nie mozesz wyciszyc tego gracza.. +muteNotify=\u00a74{0} \u00a77zostal wyciszony \u00a74{1} +mutedPlayer=\u00a77Gracz {0} \u00a77zostal wyciszony. +mutedPlayerFor=\u00a77Gracz {0} \u00a77zostal wyciszony na {1}. mutedUserSpeaks={0} probowal sie odezwac, ale jest wyciszony. -nearbyPlayers=Gracze w poblizu: {0} -negativeBalanceError=Gracz nie moze miec ujemnego stanu konta. -nickChanged=Nick zmieniony. -nickDisplayName=\u00a77Musisz wlaczyc \u0093change-displayname\u0094 w configu Essential. -nickInUse=\u00a7cTen pseudonim jest juz w uzyciu. -nickNamesAlpha=\u00a7cPseudonimy musza byc alfanumeryczne. +nearbyPlayers=\u00a77Gracze w poblizu:\u00a7r {0} +negativeBalanceError=\u00a74Gracz nie moze miec ujemnego stanu konta. +nickChanged=\u00a77Nick zostal zmieniony. +nickDisplayName=\u00a74Musisz wlaczyc change-displayname w configu Essential. +nickInUse=\u00a74Ten pseudonim jest juz w uzyciu. +nickNamesAlpha=\u00a74Pseudonimy musza byc alfanumeryczne. nickNoMore=\u00a77Nie masz juz pseudonimu. nickOthersPermission=\u00a7cNie masz uprawnienia do zmiany pseudonimu innym. nickSet=\u00a77Twoj pseudonim od teraz to \u00a7c{0} -noAccessCommand=\u00a7cNie masz dostepu do tej komendy. -noAccessPermission=\u00a7cNie masz uprawnien do dostepu do {0}. -noBreakBedrock=Nie masz uprawnien do niszczenia bedrocka. -noDestroyPermission=\u00a7cNie masz uprawnien do niszczenia {0}. -noDurability=\u00a7cThis item does not have a durability. -noGodWorldWarning=\u00a7cUwaga! Godmode wylaczony w tym swiecie!. -noHelpFound=\u00a7cNie ma odpowiadajacych komend. -noHomeSet=Nie masz ustawionego domu. -noHomeSetPlayer=Gracz nie ma ustawionego domu. -noKitPermission=\u00a7cMusisz posiadac uprawnienia \u00a7c{0}\u00a7c aby uzywac tego zestawu. +noAccessCommand=\u00a74Nie masz dostepu do tej komendy. +noAccessPermission=\u00a74Nie masz uprawnien do dostepu do {0}. +noBreakBedrock=\u00a74Nie masz uprawnien do niszczenia bedrocka. +noChapterMeta=\u00a74Nie masz uprawnien by tworzyc dynamiczne ksiazki. +noDestroyPermission=\u00a74Nie masz uprawnien do niszczenia {0}. +noDurability=\u00a74Ten przedmiot nie jest wytrzymaly. +noGodWorldWarning=\u00a74Uwaga! Godmode jest wylaczony w tym swiecie!. +noHelpFound=\u00a74Nie ma odpowiadajacych komend. +noHomeSet=\u00a74Nie masz ustawionego domu. +noHomeSetPlayer=\u00a77Gracz nie ma ustawionego domu. +noKitPermission=\u00a74Musisz posiadac uprawnienia \u00a7c{0}\u00a74 aby uzywac tego zestawu. noKits=\u00a77Nie ma jeszcze dostepnych zestawow. -noMail=Nie masz zadnych wiadomosci. -noMotd=\u00a7cNie ma wiadomosci dnia.. +noMail=\u00a77Nie masz zadnych wiadomosci. +noMatchingPlayers=\u00a77Nie znaleziono pasujacych graczy. +noMetaFirework=\u00a74Nie masz uprawnien by zastosowac wartosci fajerwerce. +noMetaPerm=\u00a74Nie masz uprawnien by zastosowac wartosci \u00a7c{0}\u00a74 dla tego przedmiotu. +noMotd=\u00a77Nie ma wiadomosci dnia.. noNewMail=\u00a77Nie masz zadnych nowych wiadomosci. -noPendingRequest=Nie masz oczekuj\u00c3\u00a1cego z\u00c3\u00a1dania. -noPerm=\u00a7cNie masz uprawnien \u00a7f{0}. -noPermToSpawnMob=\u00a7cNie masz uprawnien do tworzenia tego moba.. -noPlacePermission=\u00a7cNie masz uprawnien do stawiania bloku kolo tego znaku.. -noPowerTools=Nie masz przypisanego zadnego power tool. -noRules=\u00a7cNie ustalono jeszcze zadnych zasad. -noWarpsDefined=Nie ma zadnych warpow. +noPendingRequest=\u00a74Nie masz oczekujacej prosby. +noPerm=\u00a74Nie masz uprawnien do \u00a7c{0}\u00a74. +noPermToSpawnMob=\u00a74Nie masz uprawnien do tworzenia tego moba.. +noPlacePermission=\u00a74Nie masz uprawnien do stawiania bloku kolo tego znaku.. +noPowerTools=\u00a77Nie masz przypisanego zadnego power tool. +noRules=\u00a74Nie ustalono jeszcze zadnych zasad. +noWarpsDefined=\u00a77Nie ma zadnych warpow. none=zaden -notAllowedToQuestion=\u00a7cNie mozesz zadac tego pytania. -notAllowedToShout=\u00a7cNie mozesz krzyczec.. -notEnoughExperience=Nie masz wystarczajaco duzo doswiadczenia. -notEnoughMoney=Nie masz tyle pieniedzy. -notFlying=not flying -notRecommendedBukkit= * ! * Wersja Bukkita nie jest rekomendowana wersja dla Essentials. +notAllowedToQuestion=\u00a74Nie mozesz zadac tego pytania. +notAllowedToShout=\u00a74Nie mozesz krzyczec.. +notEnoughExperience=\u00a74Nie masz wystarczajaco duzo doswiadczenia. +notEnoughMoney=\u00a74Nie masz tyle pieniedzy. +notFlying=nie lata +notRecommendedBukkit= \u00a74* ! * Wersja Bukkita nie jest rekomendowana dla Essentials. notSupportedYet=Jeszcze nie wspierane. -nothingInHand = \u00a7cNie masz nic w reku.. +nothingInHand=\u00a74Nie masz nic w reku.. now=teraz -nuke=Niech smierc pochlonie caly swiat! +nuke=\u00a75Niech smierc pochlonie caly swiat! numberRequired=Tutaj powinna byc liczba, gluptasie. onlyDayNight=/time obsluguje tylko day/night. -onlyPlayers=Tylko gracze w grze moga uzywac {0}. -onlySunStorm=/weather obsluguje tylko sun/storm. -orderBalances=Ordering balances of {0} users, please wait ... +onlyPlayerSkulls=\u00a74Mozesz ustawic tylko wlasciciela czaszki gracza (397:3). +onlyPlayers=\u00a74Tylko gracze w grze moga uzywac {0}. +onlySunStorm=\u00a74/weather obsluguje tylko sun/storm. +orderBalances=Pobieram fundusze {0} graczy, prosze czekac ... +oversizedTempban=\u00a74Nie mozesz teraz zbanowac tego gracza. pTimeCurrent=Czas \u00a7e{0} u00a7f to {1}. -pTimeCurrentFixed=Czas \u00a7e{0}\u00a7f przywrocony do {1}. -pTimeNormal=Czas \u00a7e{0}'s\u00a7f jest normalny i odpowiada serwerowemu. -pTimeOthersPermission=\u00a7cNie masz uprawnien do zmiany czasu innym. -pTimePlayers=Ci gracze beda miec wlasny czas: -pTimeReset=Czas gracza zostal zresetowany dla \u00a7e{0} -pTimeSet=Czas gracza ustawiony na \u00a73{0}\u00a7f dla \u00a7e{1} -pTimeSetFixed=Czas gracza przywrocony do \u00a73{0}\u00a7f dla \u00a7e{1} -parseError=Blad skladniowy {0} w linii {1}. -pendingTeleportCancelled=\u00a7cOczekujace zapytanie teleportacji odrzucone. -permissionsError=Brakuje Permissions/GroupManager; prefixy/suffixy czatu zostana wylaczone. -playerBanned=\u00a7c{0} zbanowal {1} za {2}. -playerInJail=\u00a7cGracz jest juz w wiezieniu \u0093{0}\u0094. -playerJailed=\u00a77Gracz {0} wtracony do wiezienia. -playerJailedFor= \u00a77Gracz {0} wtracony do wiezienia na {1}. -playerKicked=\u00a7c{0} wyrzucil {1} za {2}. +pTimeCurrentFixed=\u00a77Czas \u00a7c{0}\u00a77 przywrocony do\u00a7c {1}\u00a77. +pTimeNormal=\u00a77Czas \u00a7c{0}'s\u00a77 jest normalny i odpowiada serwerowemu. +pTimeOthersPermission=\u00a74Nie masz uprawnien do zmiany czasu innym. +pTimePlayers=\u00a77Ci gracze beda miec wlasny czas:\u00a7r +pTimeReset=\u00a77Czas gracza zostal zresetowany dla \u00a7c{0} +pTimeSet=\u00a77Czas gracza ustawiony na \u00a7c{0}\u00a77 dla: \u00a7c{1}. +pTimeSetFixed=\u00a77Czas gracza przywrocony do \u00a7c{0}\u00a77 dla \u00a7c{1}. +parseError=\u00a74Blad skladniowy\u00a7c {0} \u00a77w linii {1}. +pendingTeleportCancelled=\u00a74Oczekujace zapytanie teleportacji odrzucone. +permissionsError=Brakuje Permissions/GroupManager; prefixy/suffixy czatu zostana wylaczone. +playerBanned=\u00a77Gracz\u00a7c {0} \u00a77zbanowal {1} \u00a77za {2}. +playerInJail=\u00a74Gracz jest juz w wiezieniu\u00a7c {0}\u00a77. +playerJailed=\u00a77Gracz\u00a7c {0} \u00a77zostal wtracony do wiezienia. +playerJailedFor= \u00a77Gracz\u00a7c {0} \u00a77zostal wtracony do wiezienia na {1}. +playerKicked=\u00a77Gracz\u00a7c {0} \u00a77wyrzucil {1} za {2}. playerMuted=\u00a77Zostales wyciszony. -playerMutedFor=\u00a77Zostales wyciszony na {0}. -playerNeverOnServer=\u00a7cGracz {0} nigdy nie byl na tym serwerze. -playerNotFound=\u00a7cNie odnaleziono gracza. -playerUnmuted=\u00a77Zostales przywrocony do glosu. +playerMutedFor=\u00a77Zostales wyciszony na\u00a7c {0}. +playerNeverOnServer=\u00a74Gracz\u00a7c {0} \u00a74nigdy nie byl na tym serwerze. +playerNotFound=\u00a74Nie odnaleziono gracza. +playerUnmuted=\u00a77Twoj glos zostal przywrocony. pong=Pong! +posPitch=\u00a77Pitch: {0} (Head angle) +posX=\u00a77X: {0} (+Wschod <-> -Zachod) +posY=\u00a77Y: {0} (+Gora <-> -Dol) +posYaw=\u00a77Wysokosc: {0} (Rotacja) +posZ=\u00a77Z: {0} (+Poludnie <-> -Polnoc) possibleWorlds=\u00a77Mozliwe swiaty maja numery od 0 do {0}. -powerToolAir=Nie zartuj, chcesz przypisac polecenie do powietrza? -powerToolAlreadySet=Polecenie \u00a7c{0}\u00a7f jest juz przypisane do {1}. -powerToolAttach=\u00a7c{0}\u00a7f polecenie przypisane do {1}. -powerToolClearAll=Wszystkie przypisane polecenia zostaly usuniete! -powerToolList={1} zawiera nastepujace polecenia: \u00a7c{0}\u00a7f. -powerToolListEmpty={0} nie ma przypisanych polecen. -powerToolNoSuchCommandAssigned=Polecenie \u00a7c{0}\u00a7f nie moze byc przypisane do {1}. -powerToolRemove=Polecenie \u00a7c{0}\u00a7f usuniete z {1}. -powerToolRemoveAll=Wszystkie polecenia zostaly usuniete z {0}. -powerToolsDisabled=Wszystkie twoje podpiecia zostaly zdezaktywowane. -powerToolsEnabled=Wszystkie twoje podpiecia zostaly aktywowane. -protectionOwner=\u00a76[EssentialsProtect] Wlasciciel zabezpieczen: {0} -questionFormat=\u00a77[Question]\u00a7f {0} -readNextPage=Wpisz /{0} {1} aby przeczytac nastepna strone +potions=\u00a76Potions:\u00a7r {0}\u00a76. +powerToolAir=\u00a74Nie zartuj, chcesz przypisac polecenie do powietrza? +powerToolAlreadySet=\u00a74Polecenie \u00a7c{0}\u00a74 jest juz przypisane do {1}. +powerToolAttach=\u00a7c{0}\u00a77 polecenie przypisane do {1}. +powerToolClearAll=\u00a77Wszystkie przypisane polecenia zostaly usuniete! +powerToolList=\u00a77Przedmiot \u00a7c{1} \u00a77zawiera nastepujace polecenia: \u00a7c{0}\u00a77. +powerToolListEmpty=\u00a74Przedmiot \u00a7c{0} \u00a74nie ma przypisanych polecen. +powerToolNoSuchCommandAssigned=\u00a74Polecenie \u00a7c{0}\u00a74 nie moze byc przypisane do {1}. +powerToolRemove=\u00a77Polecenie \u00a7c{0}\u00a77 usuniete z {1}. +powerToolRemoveAll=\u00a77Wszystkie polecenia zostaly usuniete z {0}. +powerToolsDisabled=\u00a77Wszystkie twoje podpiecia zostaly zdezaktywowane. +powerToolsEnabled=\u00a77Wszystkie twoje podpiecia zostaly aktywowane. +protectionOwner=\u00a77[EssentialsProtect] Wlasciciel zabezpieczen:\u00a7r {0} +questionFormat=\u00a72[Pytanie]\u00a7r {0} +readNextPage=\u00a77Wpisz\u00a7c /{0} {1} \u00a77aby przeczytac nastepna strone +recipe=\u00a77Receptura dla \u00a7c{0}\u00a77 ({1} z {2}) +recipeBadIndex=Nie ma receptury dla tego numeru. +recipeFurnace=\u00a77Przetop \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a77| \u00a7{1}X \u00a77| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a77is \u00a7c{1} +recipeMore=\u00a77Wpisz /{0} \u00a7c{1}\u00a77 by zobaczyc receptury dla \u00a7c{2} \u00a77. +recipeNone=Nie ma receptur dla {0} . +recipeNothing=nic +recipeShapeless=\u00a77Kombinacja \u00a7c{0} +recipeWhere=\u00a77Gdzie: {0} reloadAllPlugins=\u00a77Przeladowano wszystkie wtyczki -removed=\u00a77Usunieto {0} byty. -repair=Udalo sie naprawic twoj: \u00a7e{0}. -repairAlreadyFixed=\u00a77Ten przedmiot nie potrzebuje naprawy -repairEnchanted=\u00a77Nie masz zezwolenia do naprawiania ulepszonych przedmiotow. -repairInvalidType=\u00a7cTen przedmiot nie moze byc naprawiony. -repairNone=Zaden przedmiot nie wymagal naprawy. -requestAccepted=\u00a77Zadanie teleportacji - zaakceptowano. -requestAcceptedFrom=\u00a77{0} zaakceptowal Twoje z\u00c3\u00a1danie teleportacji. -requestDenied=\u00a77Zadanie teleportacji - odrzucone. -requestDeniedFrom=\u00a77{0} odrzucil Twoje z\u00c3\u00a1danie teleportacji. -requestSent=\u00a77zZ\u00c3\u00a1danie wyslania do {0}\u00a77. -requestTimedOut=\u00a7cZ\u00c3\u00a1danie teleportacji - przedawnione. +removed=\u00a77Usunieto\u00a7c {0} \u00a77podmitow. +repair=\u00a77Udalo sie naprawic twoj: \u00a7c{0}. +repairAlreadyFixed=\u00a74Ten przedmiot nie potrzebuje naprawy +repairEnchanted=\u00a74Nie masz zezwolenia do naprawiania ulepszonych przedmiotow. +repairInvalidType=\u00a74Ten przedmiot nie moze byc naprawiony. +repairNone=\u00a74Zaden przedmiot nie wymagal naprawy. +requestAccepted=\u00a77Prosba o teleportacje - zaakceptowano. +requestAcceptedFrom=\u00a7c{0} \u00a77zaakceptowal Twoja prosbe o teleportacje. +requestDenied=\u00a77Prosba o teleportacje - odrzucona. +requestDeniedFrom=\u00a7c{0} \u00a77odrzucil Twoja prosbe o teleportacje. +requestSent=\u00a77Twoja prosba o teleportacje zostala wyslana do\u00a7c {0}\u00a77. +requestTimedOut=\u00a77Prosba o teleportacje - przedawniona. requiredBukkit= * ! * Potrzebujesz najnowszego {0} CraftBukkit-a, pobierz go z http://dl.bukkit.org/downloads/craftbukkit/ -returnPlayerToJailError=Wystapil blad podczas powrotu gracza {0} do wiezienia: {1} +resetBal=\u00a77Fundusz zostal zresetowany \u00a7a{0} \u00a77 wszystkim graczom online. +resetBalAll=\u00a77Fundusz zostal zresetowany \u00a7a{0} \u00a77 wszystkim graczom. +returnPlayerToJailError=\u00a74Wystapil blad podczas powrotu gracza\u00a7c {0} \u00a74do wiezienia: {1} . +runningPlayerMatch=\u00a77Wyszukiwanie pasujacych graczy ''\u00a7c{0}\u00a77'' (to moze chwile potrwac) second=sekunda seconds=sekund -seenOffline=Gracz {0} jest offline od {1} -seenOnline=Gracz {0} jest online od {1} +seenOffline=\u00a77Gracz\u00a7c {0} \u00a77jest \u00a74offline\u00a77 od {1} +seenOnline=\u00a77Gracz\u00a7c {0} \u00a77jest \u00a7aonline\u00a77 od {1} serverFull=Serwer jest pelen graczy, sprobuj pozniej. -serverTotal=Podsumowanie serwera: {0} -setSpawner=Ustawiono spawn na {0}. -sheepMalformedColor=Niewlasciwa barwa. -shoutFormat=\u00a77[Shout]\u00a7f {0} +serverTotal=\u00a77Podsumowanie serwera:\u00a7c {0} +setSpawner=\u00a77Ustawiono spawner na\u00a7c {0}. +sheepMalformedColor=\u00a74Niewlasciwa barwa. +shoutFormat=\u00a77[Shout]\u00a7r {0} signFormatFail=\u00a74[{0}] signFormatSuccess=\u00a71[{0}] signFormatTemplate=[{0}] signProtectInvalidLocation=\u00a74Nie masz zezwolenia do tworzenia tutaj znakow. -similarWarpExist=Warp o tej nazwie juz istnieje. -slimeMalformedSize=Niewlasciwy rozmiar. -soloMob=Ten mob lubi byc sam. -spawnSet=\u00a77Ustawiono punkt spawnu dla grupy {0}. +similarWarpExist=\u00a74Warp o tej nazwie juz istnieje. +slimeMalformedSize=\u00a74Niewlasciwy rozmiar. +soloMob=\u00a74Ten mob lubi byc sam. +spawnSet=\u00a77Ustawiono punkt spawnu dla grupy\u00a7c {0}\u00a77. spawned=stworzono -sudoExempt=Nie mozesz podniesc uprawnien tego uzytkownika. -sudoRun=Probuje {0} uruchomic: /{1} {2} +sudoExempt=\u00a74Nie mozesz podniesc uprawnien tego uzytkownika. +sudoRun=\u00a77Probuje\u00a7c {0} \u00a77uruchomic:\u00a7r /{1} {2} suicideMessage=\u00a77Zegnaj okrutny swiecie. suicideSuccess= \u00a77{0} dokonal zamachu na swoje zycie -survival=survival -takenFromAccount=\u00a7c{0} zostalo pobrane z konta. -takenFromOthersAccount=\u00a7c{0} zostalo pobrane z {1}\u00a7c konta. Nowy stan konta: {2} -teleportAAll=\u00a77Zadanie teleportacji - wyslano do wszystkich graczy. -teleportAll=\u00a77Teleportowanie wszystkich graczy. -teleportAtoB=\u00a77{0}\u00a77 przeteleportowal Ciebie do {1}\u00a77. -teleportDisabled={0} ma zdezaktywowana teleportacje. -teleportHereRequest=\u00a7c{0}\u00a7c ma zadanie przeteleportowac cie do nich. -teleportNewPlayerError=Blad przy teleportowniu nowego gracza. -teleportRequest=\u00a7c{0}\u00a7c zazadal teleportacji do Ciebie. -teleportRequestTimeoutInfo=\u00a77 Zadanie teleportacji przedawni sie za {0} sekund. +survival=Przetrwanie +takenFromAccount=\u00a7a{0} zostalo pobrane z konta. +takenFromOthersAccount=\u00a7a{0} zostalo pobrane z {1}\u00a7a konta. Nowy stan konta: {2} +teleportAAll=\u00a77Prosbe o teleportacje - wyslano do wszystkich graczy. +teleportAll=\u00a77Teleportowanio wszystkich graczy. +teleportAtoB=\u00a7c{0}\u00a77 przeteleportowal Ciebie do {1}\u00a77. +teleportDisabled=\u00a7c{0} \u00a74ma zdezaktywowana teleportacje. +teleportHereRequest=\u00a7c{0}\u00a77 ma zadanie przeteleportowac cie do nich. +teleportNewPlayerError=\u00a74Blad przy teleportowniu nowego gracza. +teleportRequest=\u00a7c{0}\u00a77 prosbe o teleportacje do Ciebie. +teleportRequestTimeoutInfo=\u00a77 Prosba o teleportacje przedawni sie za\u00a7c {0} \u00a77sekund. teleportTop=\u00a77Teleportacja na wierzch. teleportationCommencing=\u00a77Teleport rozgrzewa sie... teleportationDisabled=\u00a77Teleportacja - zdezaktywowana. +teleportationDisabledFor=\u00a77Teleportacja zablokowana dla {0} teleportationEnabled=\u00a77Teleportacja - aktywowana. +teleportationEnabledFor=\u00a77Teleportacja odblokowana dla {0} teleporting=\u00a77Teleportacja... teleportingPortal=\u00a77Teleportacja przez portal. tempBanned=Tymczasowo zbanowany na serwerze przez {0}. -tempbanExempt=\u00a77Nie mozesz tymczasowo zbanowac tego gracza. -thunder= {0} przywowlal burze. -thunderDuration={0} przywolal burze na {1} sekund. -timeBeforeHeal=Czas przed nastepnym uzdrowieniem: {0}. -timeBeforeTeleport=Czas przed nastepnym teleportem:{0}. -timeFormat=\u00a73{0}\u00a7f or \u00a73{1}\u00a7f or \u00a73{2}\u00a7f +tempbanExempt=\u00a74Nie mozesz tymczasowo zbanowac tego gracza. +thunder= \u00a7c{0} \u00a77przywowlal burze. +thunderDuration=\u00a7c{0} \u00a77przywolal burze na\u00a7c {1} \u00a77sekund. +timeBeforeHeal=\u00a77Czas przed nastepnym uzdrowieniem:\u00a7c {0}\u00a77. +timeBeforeTeleport=\u00a77Czas przed nastepnym teleportem:\u00a7c {0}. +timeFormat=\u00a7c{0}\u00a77 lub \u00a7c{1}\u00a77 lub \u00a7c{2}\u00a77. 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=Czas ustawiono we wszystkich swiatach. -timeSetPermission=\u00a7cNie masz uprawnien do ustawiania czasu. -timeWorldCurrent=Obecny czas {0} to \u00a73{1}. -timeWorldSet=Czas ustawiono {0} w: \u00a7c{1}. -tps=Current TPS = {0} -tradeCompleted=\u00a77Handel zakonczono. -tradeSignEmpty=Tabliczka handlowa nie jest dostepna dla Ciebie. -tradeSignEmptyOwner=Nie ma nic do pobrania z tej tabliczki. -treeFailure=\u00a7cUtworzenie drzewa nie powiodlo sie, sprobuj na trawie lub ziemi. -treeSpawned=\u00a77Drzewo utworzono. -true=\u00a72true\u00a7f +timeSet=\u00a77Czas ustawiono we wszystkich swiatach. +timeSetPermission=\u00a74Nie masz uprawnien do ustawiania czasu. +timeWorldCurrent=\u00a77Obecny czas\u00a7c {0} \u00a77to \u00a7c{1}\u00a77. +timeWorldSet=\u00a77Czas ustawiono\u00a7c {0} \u00a77w: \u00a7c{1}\u00a77. +totalWorthAll=\u00a7aSprzedano wszystkie bloki i przedmioty za kwote {1}. +totalWorthBlocks=\u00a7aSprzedano wszystkie bloki za kwote {1}. +tps=\u00a77Aktualne TPS = {0} +tradeCompleted=\u00a7aHandel zakonczono. +tradeSignEmpty=\u00a74Tabliczka handlowa nie jest dostepna dla Ciebie. +tradeSignEmptyOwner=\u00a74Nie ma nic do pobrania z tej tabliczki. +treeFailure=\u00a74Utworzenie drzewa nie powiodlo sie, sprobuj na trawie lub ziemi. +treeSpawned=\u00a77Stworzono drzewo. +true=\u00a72tak\u00a7r typeTpaccept=\u00a77Aby zaakceptowac teleport, wpisz \u00a7c/tpaccept\u00a77. typeTpdeny=\u00a77Aby odmowic teleportacji, wpisz \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Mozesz rowniez wpisac nazwe danego swiata. -unableToSpawnMob=Nie udalo sie stworzyc potwora. -unbannedIP=Odbanowana gracza o danym adresie IP. -unbannedPlayer=Odbanowano gracza. -unignorePlayer=Nie ignorujesz juz gracza {0}. -unknownItemId=Nieznane id przedmiotu: {0}. -unknownItemInList=Nieznany przedmiot {0} w liscie {1} . -unknownItemName=Nieznana nazwa przedmiotu: {0}. -unlimitedItemPermission=\u00a7cBrak uprawnien dla nielimitowanego przedmiotu {0}. -unlimitedItems=Nielimitowane przedmioty: -unmutedPlayer=Gracz {0} moze znowu mowic. -unvanished=\u00a7aZn\u00c3\u00b3w jestes widoczny. -unvanishedReload=\u00a7cReload spowodowal ze cie widac. -upgradingFilesError=Wystapil blad podczas aktualizowaniu plik\u00c3\u00b3w. -userDoesNotExist=Uzytkownik {0} nie istnieje w bazie danych. -userIsAway={0} jest teraz AFK. -userIsNotAway={0} nie jest juz AFK. +unableToSpawnMob=\u00a74Nie udalo sie stworzyc potwora. +unignorePlayer=\u00a77Nie ignorujesz juz gracza \u00a7c{0}\u00a77. +unknownItemId=\u00a74Nieznane id przedmiotu:\u00a7r {0}\u00a74. +unknownItemInList=\u00a74Nieznany przedmiot {0} w liscie {1} . +unknownItemName=\u00a74Nieznana nazwa przedmiotu: {0}. +unlimitedItemPermission=\u00a74Brak uprawnien dla nielimitowanego przedmiotu {0}. +unlimitedItems=\u00a77Nielimitowane przedmioty:\u00a7r +unmutedPlayer=\u00a77Gracz\u00a7c {0} \u00a77moze znowu mowic. +unvanished=\u00a77Znow jestes widoczny. +unvanishedReload=\u00a74Przeladowanie spowodowalo ze cie widac. +upgradingFilesError=Wystapil blad podczas aktualizowaniu plikow. +uptime=\u00a77Aktywny od:\u00a7c {0} +userAFK=\u00a74{0} \u00a7\u00a77jest teraz AFK i nie reaguje. +userDoesNotExist=\u00a74Uzytkownik\u00a7c {0} \u00a74nie istnieje w bazie danych. +userIsAway=\u00a75{0} \u00a75jest teraz AFK. +userIsNotAway=\u00a7c{0} \u00a75nie jest juz AFK. userJailed=\u00a77Zostales zamkniety w wiezieniu. +userUnknown=\u00a74Ostrzezenie: Gracz '\u00a7c{0}\u00a74' nigdy nie byl na tym serwerze. userUsedPortal={0} uzyl istniejacego portalu wyjscia. userdataMoveBackError=Nie udalo sie przeniesc userdata/{0}.tmp do userdata/{1} userdataMoveError=Nie udalo sie przeniesc userdata/{0} do userdata/{1}.tmp usingTempFolderForTesting=Uzywam tymczasowego folderu dla testu: -vanished=\u00a7aJuz jestes niewidoczny. -versionMismatch=Niepoprawna wersja! Prosze zaktualizowac {0} do tej samej wersji co inne pliki. -versionMismatchAll=Niepoprawna wersja! Prosze zaktualizowac wszystkie pliki Essentials do tej samej wersji. +vanished=\u00a77Juz jestes niewidoczny. +versionMismatch=\u00a74Niepoprawna wersja! Prosze zaktualizowac {0} do tej samej wersji co inne pliki. +versionMismatchAll=\u00a74Niepoprawna wersja! Prosze zaktualizowac wszystkie pliki Essentials do tej samej wersji. voiceSilenced=\u00a77Twe usta zostaly zaszyte. -warpDeleteError=Wystapil problem podczas usuwania pliku z Warpami. -warpListPermission=\u00a7cNie masz pozwolenia na sprawdzenie listy Warp\u00c3\u00b3w.. -warpNotExist=Ten Warp nie istnieje. -warpOverwrite=\u00a7cNie mozesz nadpisac tego Warpa. -warpSet=\u00a77Warp {0} stworzony. -warpUsePermission=\u00a7cNie masz pozwolenie na korzystanie z tego Warpa. -warpingTo=\u00a77Teleportuje do {0}. +walking=chodzi +warpDeleteError=\u00a74Wystapil problem podczas usuwania pliku z Warpami. +warpList={0} +warpListPermission=\u00a74Nie masz pozwolenia na sprawdzenie listy Warp\u00c3\u00b3w.. +warpNotExist=\u00a74Ten Warp nie istnieje. +warpOverwrite=\u00a74Nie mozesz nadpisac tego Warpa. +warpSet=\u00a77Warp\u00a7c {0} \u00a77stworzony. +warpUsePermission=\u00a74Nie masz pozwolenie na korzystanie z tego Warpa. +warpingTo=\u00a77Teleportuje do\u00a7c {0}\u00a77. warps=Warpy: {0} -warpsCount=\u00a77Istnieje {0} warp\u00c3\u00b3w. Pokazuje strone {1} z {2}. -weatherStorm=\u00a77Ustawiles burze w {0}. -weatherStormFor=\u00a77Ustawiles burze w {0} na {1} sekund. -weatherSun=\u00a77Ustawiles bezchmurna pogode w {0}. -weatherSunFor=\u00a77Ustawiles bezchmurna pogode w {0} na {1} sekund. -whoisAFK=\u00a76 - AFK:\u00a7f {0} -whoisBanned=\u00a76 - Zbanowany:\u00a7f {0}. -whoisExp=\u00a76 - Punkty Doswiadczenia:\u00a7f {0} (Poziom {1}). -whoisFly=\u00a76 - Fly mode:\u00a7f {0} ({1}) -whoisGamemode=\u00a76 - Tryb Gry:\u00a7f {0}. -whoisGeoLocation=\u00a76 - Lokalizacja:\u00a7f {0}. -whoisGod=\u00a76 - Godmode:\u00a7f {0}. -whoisHealth=\u00a76 - Zdrowie:\u00a7f {0}/20. -whoisIPAddress=\u00a76 - Adres IP:\u00a7f {0}. -whoisJail=\u00a76 - W wiezieniu:\u00a7f {0}. -whoisLocation=\u00a76 - Lokalizacja:\u00a7f ({0}, {1}, {2}, {3}) -whoisMoney=\u00a76 - Pieniadze:\u00a7f {0}. -whoisMuted=\u00a76 - Muted:\u00a7f {0} -whoisNick=\u00a76 - Nick:\u00a7f {0} -whoisOp=\u00a76 - OP:\u00a7f {0} -whoisTop=\u00a76 ====== WhoIs:\u00a7f {0} \u00a76====== -worth=\u00a77Stack {0} jest warty \u00a7c{1}\u00a77 ({2}rzedmiot(y) po {3} kazdy) -worthMeta=\u00a77Stack {0} z metadata {1} jest warty \u00a7c{2}\u00a77 ({3} przedmiot(y) po {4} kazdy) -worthSet=Cena przedmiotu ustawiona. +warpsCount=\u00a77Istnieje \u00a7c{0} \u00a77warp. Pokazuje strone {1} z {2}. +weatherStorm=\u00a77Ustawiles \u00a7cburze\u00a77 w\u00a7c {0}\u00a77. +weatherStormFor=\u00a77Ustawiles \u00a7cburze\u00a77 w\u00a7c {0} \u00a77na {1} sekund. +weatherSun=\u00a77Ustawiles \u00a7cbezchmurna\u00a77 pogode w\u00a7c {0}\u00a77. +weatherSunFor=\u00a77Ustawiles bezchmurna pogode w\u00a7c {0} \u00a77na {1} sekund. +whoisAFK=\u00a77 - AFK:\u00a7r {0} +whoisBanned=\u00a77 - Zbanowany:\u00a7r {0}. +whoisExp=\u00a77 - Punkty Doswiadczenia:\u00a7r {0} (Poziom {1}). +whoisFly=\u00a77 - Latanie:\u00a7r {0} ({1}) +whoisGamemode=\u00a77 - Tryb Gry:\u00a7r {0}. +whoisGeoLocation=\u00a77 - Lokalizacja:\u00a7r {0}. +whoisGod=\u00a77 - Godmode:\u00a7r {0}. +whoisHealth=\u00a77 - Zdrowie:\u00a7r {0}/20. +whoisIPAddress=\u00a77 - Adres IP:\u00a7r {0}. +whoisJail=\u00a77 - W wiezieniu:\u00a7r {0}. +whoisLocation=\u00a77 - Lokalizacja:\u00a7r ({0}, {1}, {2}, {3}) +whoisMoney=\u00a77 - Pieniadze:\u00a7r {0}. +whoisMuted=\u00a77 - Wyciszony:\u00a7r {0} +whoisNick=\u00a77 - Nick:\u00a7r {0} +whoisOp=\u00a77 - OP:\u00a7r {0} +whoisTop=\u00a77 ====== WhoIs:\u00a7c {0} \u00a77====== +worth=\u00a7aStack {0} jest warty \u00a7c{1}\u00a7a ({2}rzedmiot(y) po {3} kazdy) +worthMeta=\u00a7aStack {0} z metadata {1} jest warty \u00a7c{2}\u00a7a ({3} przedmiot(y) po {4} kazdy) +worthSet=\u00a77Cena przedmiotu ustawiona. year=rok years=lat youAreHealed=\u00a77Zostales/as uleczony/na. -youHaveNewMail=\u00a7cMasz {0} wiadomosci!\u00a7f napisz \u00a77/mail read\u00a7f aby je przeczytac. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +youHaveNewMail=\u00a77Masz\u00a7c {0} \u00a77wiadomosci! Wpisz \u00a7c/mail read\u00a77 aby je przeczytac. +playerUnbanned=\u00a77Gracz\u00a7c {0} \u00a77odbanowal {1}. +playerUnbanIpAddress=\u00a77Graczowi\u00a7c {0} \u00a77 odbanowano IP: {1}. +playerBanIpAddress=\u00a77Gracz\u00a7c {0} \u00a77zostal zbanowany na adres IP {1}\u00a77. +noPotionEffectPerm=\u00a74Nie masz uprawnien by dodac efekt \u00a7c{0} \u00a74tej miksturze. +invalidPotionMeta=\u00a74Niepoprawna wartosc mikstury: \u00a7c{0}\u00a74. +balanceOther=\u00a7aFundusz u \u00a77{0} \u00a7awynosi:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a77 pogoda to\u00a7c {1}\u00a77. +pWeatherNormal=\u00a7c{0}\u00a77 pogoda jest normalna i pasuje do serwera. +pWeatherOthersPermission=\u00a74Nie masz uprawnien, by zmienic pogode pozostalym graczom. +pWeatherPlayers=\u00a77Ci gracze maja wlasna pogode:\u00a7r +pWeatherReset=\u00a77Gracz zresetowal pogode dla: \u00a7c{0} +pWeatherSet=\u00a77 Gracz ustawil pogode \u00a7c{0}\u00a77 dla: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Niepoprawny typ pogody +cannotStackMob=\u00a74Nie masz uprawnien by stackowac wiele mobow +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_pt.properties b/Essentials/src/messages_pt.properties index 332395ed25..d0a58f9672 100644 --- a/Essentials/src/messages_pt.properties +++ b/Essentials/src/messages_pt.properties @@ -5,10 +5,17 @@ action=* {0} {1} addedToAccount=\u00a7a{0} foi adicionado a sua conta. addedToOthersAccount=\u00a7a{0} adicionado a {1}\u00a7a saldo. Novo saldo: {2} +adventure = adventure alertBroke=Quebrou: alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} em: {3} alertPlaced=Colocou: alertUsed=Usou: +antiBuildBreak=\u00a74You are not permitted to break {0} blocks here. +antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74You are not permitted to interact with {0}. +antiBuildPlace=\u00a74You are not permitted to place {0} here. +antiBuildUse=\u00a74You are not permitted to use {0}. autoAfkKickReason=Voc\u00ea foi kickado por estar inativo a mais de {0} minutos. backAfterDeath=\u00a77Use o comando /back para voltar onde morreu. backUsageMsg=\u00a77Retornando a posi\u00e7ao anterior... @@ -18,14 +25,17 @@ backupStarted=Backup iniciado balance=\u00a77Saldo: {0} balanceTop=\u00a77 Saldos superiores ({0}) banExempt=\u00a7cVoc\u00ea nao pode banir este jogador. -banIpAddress=\u00a77Endere\u00e7o de IP banido -bannedIpsFileError=Erro ao ler o arquivo banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt nao encontrado -bannedPlayersFileError=Erro ao ler o arquivo banned-players.txt -bannedPlayersFileNotFound=banned-players.txt nao encontrado +banFormat=Banned: {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! bigTreeFailure=\u00a7cFalha na gera\u00e7ao da \u00e1rvore grande. Tente de novo na terra ou grama. bigTreeSuccess= \u00a77\u00c1rvore grande gerada. blockList=Essentials passou o seguinte comando a outro plugin: +bookAuthorSet=\u00a76Author of the book set to {0} +bookLocked=\u00a7cThis book is now locked +bookTitleSet=\u00a76Title of the book set to {0} broadcast=[\u00a7cBroadcast\u00a7f]\u00a7a {0} buildAlert=\u00a7cVoc\u00ea nao tem permissao de construir. bukkitFormatChanged=Bukkit: formato da versao alterada. Versao nao verificada. @@ -34,16 +44,18 @@ canTalkAgain=\u00a77Voc\u00ea pode falar de novo cantFindGeoIpDB=Nao foi poss\u00edvel encontrar o GeoIP database! cantReadGeoIpDB=Falhou em ler a GeoIP database! cantSpawnItem=\u00a7cVoc\u00ea nao tem permissao de pegar este item {0} -chatTypeLocal=[L] chatTypeAdmin=[A] +chatTypeLocal=[L] chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. commandFailed=Comando {0} falhou: commandHelpFailedForPlugin=Erro ao obter ajuda para: {0} commandNotLoaded=\u00a7cCommando {0} provavelmente esta carregado. compassBearing=\u00a77Inclina\u00e7ao: {0} ({1} graus). configFileMoveError=Falha ao mover arquivo config.yml ao local de backup. configFileRenameError=Falha em renomear arquivo temporario em config.yml -connectedPlayers=Jogadores conectados: +connectedPlayers=\u00a77Jogadores conectados\u00a7r connectionFailed=Falha ao abrir conexao. cooldownWithMessage=\u00a7cTempo de espera: {0} corruptNodeInConfig=\u00a74Aviso: Seu arquivo de configura\u00e7ao tem uma parte {0} corrompida. @@ -61,6 +73,9 @@ deleteHome=\u00a77Casa {0} foi removida. deleteJail=\u00a77prisao {0} foi removida. deleteWarp=\u00a77Warp {0} foi removido. deniedAccessCommand={0} Acesso negado ao comando. +denyBookEdit=\u00a74You cannot unlock this book +denyChangeAuthor=\u00a74You cannot change the author of this book +denyChangeTitle=\u00a74You cannot change the title of this book dependancyDownloaded=[Essentials] Dependencia {0} baixada com sucesso. dependancyException=[Essentials] Ocorreu um erro ao tentar baixar uma dependencia dependancyNotFound=[Essentials] Uma dependencia necess\u00e1ria nao foi encontrada. Baixando agora. @@ -71,10 +86,12 @@ destinationNotSet=Destino nao definido. disableUnlimited=\u00a77Desativada itens ilimitados de {0} para {1}. disabled=desativado disabledToSpawnMob=Desovar este mob esta desativado nas configura\u00e7\u00f5es. +distance=\u00a76Distance: {0} dontMoveMessage=\u00a77Teleporte vai come\u00e7ar em {0}. Nao se mova. downloadingGeoIp=Baixando GeoIP database ... pode demorar um pouco (Pais: 0.6 MB, Cidade: 20MB) duplicatedUserdata=Dado de usu\u00e1rio duplicado: {0} e {1} durability=\u00a77This tool has \u00a7c{0}\u00a77 uses left +editBookContents=\u00a7eYou may now edit the contents of this book enableUnlimited=\u00a77Colocando quantidade ilimitada de {0} para {1}. enabled=ativado enchantmentApplied = \u00a77O encantamento {0} foi aplicado ao item na sua mao. @@ -98,28 +115,36 @@ false=\u00a74false\u00a7f feed=\u00a77Seu apetite foi saciado. feedOther=\u00a77Satisfeito {0}. fileRenameError=Falha ao renomear o arquivo {0}. +fireworkColor=\u00a74You must apply a color to the firework to add an effect +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle flyMode=\u00a77Definir o modo de voar {0} para {1}. flying=flying foreverAlone=\u00a7cVoc\u00ea nao tem ninguem a quem responder. freedMemory=Livre {0} MB. +fullStack=\u00a74You already have a full stack gameMode=\u00a77Gamemode {0} definido para {1}. -gcchunks= chunks, -gcentities= entidades +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities gcfree=Memoria livre: {0} MB gcmax=Mem\u00f3ria Maxima: {0} MB gctotal=Mem\u00f3ria alocada: {0} MB geoIpUrlEmpty=GeoIP url de download esta vazia. geoIpUrlInvalid=GeoIP url de download e invalida. -geoipJoinFormat=Jogador {0} veio do {1} +geoipJoinFormat=\u00a76Jogador \u00a7c{0} \u00a76veio do \u00a7c{1}\u00a76. +giveSpawn=\u00a76Giving\u00a7c {0} \u00a76of\u00a7c {1} to\u00a7c {2}\u00a76. godDisabledFor=desativado para {0} godEnabledFor=ativado para {0} godMode=\u00a77Modo Deus {0}. +groupNumber={0} online, for the full list type /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! hatArmor=\u00a7cDe erro, voce nao pode usar este item como um chapeu! hatEmpty=\u00a7cYou are not wearing a hat. hatFail=\u00a7cVoce deve ter algo para vestir na sua mao. hatPlaced=\u00a7eAproveite o seu novo chapeu! +hatRemoved=\u00a7eYour hat has been removed. haveBeenReleased=\u00a77Voc\u00ea foi liberado. heal=\u00a77Voc\u00ea foi curado. +healDead=\u00a74You cannot heal someone who is dead! healOther=\u00a77Curado {0}. helpConsole=Para ver ajuda do console, digite ?. helpFrom=\u00a77Comandos a partir de {0}: @@ -128,6 +153,9 @@ helpMatching=\u00a77Comandos correspondentes "{0}": helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} helpPages=P\u00e1gina \u00a7c{0}\u00a7f of \u00a7c{1}\u00a7f: helpPlugin=\u00a74{0}\u00a7f: Ajuda Plugin: /help {1} +holdBook=\u00a74You are not holding a writable book +holdFirework=\u00a74You must be holding a firework to add effects +holdPotion=\u00a74You must be holding a potion to apply effects to it. holeInFloor=Buraco no chao homeSet=\u00a77Casa definida. homeSetToBed=\u00a77Sua casa agora esta definida a esta cama. @@ -146,16 +174,23 @@ invRestored=Seu invent\u00e1rio foi restaurado. invSee=Voc\u00ea v\u00ea o invent\u00e1rio de {0}. invSeeHelp=Use /invsee para voltar ao seu invent\u00e1rio. invalidCharge=\u00a7cCarga invalida. +invalidFireworkFormat=\u00a76The option \u00a74{0} \u00a76is not a valid value for \u00a74{1} invalidHome=Home {0} nao existe +invalidHomeName=\u00a74Invalid home name invalidMob=Tipo de mob inv\u00e1lido. +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. invalidServer=Servidor inv\u00e1lido! invalidSignLine=Linha {0} da placa e inv\u00e1lida. +invalidWarpName=\u00a74Invalid warp name invalidWorld=\u00a7cMundo inv\u00e1lido. inventoryCleared=\u00a77Invent\u00e1rio limpo. +inventoryClearedAll=\u00a76Cleared everyone's inventory. inventoryClearedOthers=\u00a77Invent\u00e1rio de \u00a7c{0}\u00a77 limpo. is=\u00e9 itemCannotBeSold=Este item nao pode ser vendido para o servidor. itemMustBeStacked=O item deve ser negociado em pacotes. A qantidade de 2s seria dois pacotes, etc. +itemNames=Item short names: {0} itemNotEnough1=\u00a7cVoc\u00ea nao tem esta quantidade de itens para vender. itemNotEnough2=\u00a77Se voc\u00ea quer vender todos os itens deste tipo, use /sell NomeDoItem itemNotEnough3=\u00a77/sell NomeDoItem -1 vai vender tudo mais um item, etc. @@ -163,32 +198,38 @@ itemSellAir=Voc\u00ea realmente tentou vender ar? Coloque um item na sua mao. itemSold=\u00a77Vendido para \u00a7c{0} \u00a77({1} {2} a {3} cada) itemSoldConsole={0} vendido {1} para \u00a77{2} \u00a77({3} itens a {4} cada) itemSpawn=\u00a77Dando {0} de {1} +itemType=Item: {0} - {1} itemsCsvNotLoaded=nao foi poss\u00edvel carregar items.csv. jailAlreadyIncarcerated=\u00a7cEsta pessoa j\u00e1 esta na cadeia: {0} jailMessage=\u00a7cVoc\u00ea faz o crime, voc\u00ea cumpre a pena. jailNotExist=esta cadeia nao existe. jailReleased=\u00a77Player \u00a7e{0}\u00a77 libertado. jailReleasedPlayerNotify=\u00a77Voc\u00ea foi solto! -jailSentenceExtended=Tempo de prisao estendido para: {0) +jailSentenceExtended=Tempo de prisao estendido para: {0} jailSet=\u00a77Cela {0} foi definida jumpError=Isso prejudica o c\u00e9rebro do seu computador. kickDefault=Kickado do servidor. kickExempt=\u00a7cVoc\u00ea nao pode kickar esta pessoa. kickedAll=\u00a7cKicked all players from server kill=\u00a77Assassinado {0}. -kitError2=\u00a7cEsse kit nao existe ou foi definido impropiamente. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. kitError=\u00a7cNao existe kits v\u00e1lidos. kitErrorHelp=\u00a7cTalvez um item esta faltando a quantidade nas configura\u00e7\u00f5es? kitGive=\u00a77Dando kit {0}. +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. kitInvFull=\u00a7cSeu invent\u00e1rio esta cheio, colocando kit no chao +kitOnce=\u00a74You can't use that kit again. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. kitTimed=\u00a7cVoc\u00ea nao pode usar este kit denovo por {0}. kits=\u00a77Kits: {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,0. lightningSmited=\u00a77YVoc\u00ea acaba de ser castigado lightningUse=\u00a77Castigando {0} listAfkTag = \u00a77[Ausente]\u00a7f listAmount = \u00a79Aqui tem \u00a7c{0}\u00a79 do m\u00e1ximo de \u00a7c{1}\u00a79 jogadores online. listAmountHidden = \u00a79Aqui tem \u00a7c{0}\u00a77/{1}\u00a79 do maximo de \u00a7c{2}\u00a79 jogadores online. -listGroupTag={0}\u00a7f: +listGroupTag={0}\u00a7f: listHiddenTag = \u00a77[ESCONDIDO]\u00a7f loadWarpError=Falha ao carregar warp {0} localFormat=Local: <{0}> {1} @@ -198,9 +239,11 @@ mailSent=\u00a77eMail enviado! markMailAsRead=\u00a7cPara marcar seu email como lido, use /mail clear markedAsAway=\u00a77[AFK] Agora voc\u00ea esta marcado como aus\u00eante. markedAsNotAway=\u00a77[AFK] Voc\u00ea nao esta mais marcado como aus\u00eante. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: maxHomes=Voc\u00ea nao pode definir mais de {0} casas. mayNotJail=\u00a7cVoc\u00ea nao pode prender esta pessoa me=eu +messageTruncated=\u00a74Message truncated, to see the full output type:\u00a7c /{0} {1} minute=minuto minutes=minutos missingItems=Voc\u00ea nao tem {0}x {1}. @@ -215,8 +258,12 @@ moneyTaken={0} tirado da sua conta. month=m\u00eas months=meses moreThanZero=Quantidade deve ser maior que 0. +moveSpeed=\u00a77Set {0} speed to {1} for {2}. msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. muteExempt=\u00a7cVoc\u00ea nao pode mutar este jogador. +muteNotify=\u00a74{0} \u00a76has muted \u00a74{1} mutedPlayer=Player {0} mutado. mutedPlayerFor=Player {0} mutado por {1}. mutedUserSpeaks={0} tentou falar, mas esta mutado. @@ -232,6 +279,7 @@ nickSet=\u00a77Agora seu apelido \u00e9 \u00a7c{0} noAccessCommand=\u00a7cVoc\u00ea nao tem acesso a este comando. noAccessPermission=\u00a7cVoc\u00ea nao tem permissao para acessar isso {0}. noBreakBedrock=Voce nao tem permissao para destruir bedrock. +noChapterMeta=\u00a74You do not have permission to create dynamic books. noDestroyPermission=\u00a7cVoc\u00ea nao tem permissao para destruir isso {0}. noDurability=\u00a7cThis item does not have a durability. noGodWorldWarning=\u00a7cAviso! Modo Deus neste mundo esta desativado. @@ -241,6 +289,9 @@ noHomeSetPlayer=Jogador nao definiu nenhuma casa. noKitPermission=\u00a7cVoc\u00ea precisa da permissao \u00a7c{0}\u00a7c para usar este kit. noKits=\u00a77Ainda nao tem nenhum item disponivel noMail=Voc\u00ea nao tem nenhum email +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. noMotd=\u00a7cNao h\u00e1 nenhuma mensagem do dia. noNewMail=\u00a77Voc\u00ea nao tem nenhum novo email. noPendingRequest=Voc\u00ea nao tem um pedido pendente. @@ -263,9 +314,11 @@ now=agora nuke=Pode chover a morte sobre eles numberRequired=Um numero vai aqui, bobinho. onlyDayNight=/time apenas suporta day/night. +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). onlyPlayers=Apenas jogadores no jogo pode usar {0}. onlySunStorm=/weather apenas suporta sun/storm. orderBalances=Ordenando saldos de {0} usuarios, aguarde ... +oversizedTempban=\u00a74You may not ban a player for this period of time. pTimeCurrent=\u00a7e{0}''s\u00a7f horario e {1}. pTimeCurrentFixed=\u00a7e{0}''s\u00a7f hor\u00e1rio foi fixado para {1}. pTimeNormal=\u00a7e{0}''s\u00a7f o tempo esta normal e sincronisado com o servidor. @@ -288,7 +341,13 @@ playerNeverOnServer=\u00a7cJogador {0} nunca esteve no servidor. playerNotFound=\u00a7cJogador nao encontrado. playerUnmuted=\u00a77Foi desmutado pong=Pong! +posPitch=\u00a76Pitch: {0} (Head angle) +posX=\u00a76X: {0} (+East <-> -West) +posY=\u00a76Y: {0} (+Up <-> -Down) +posYaw=\u00a76Yaw: {0} (Rotation) +posZ=\u00a76Z: {0} (+South <-> -North) possibleWorlds=\u00a77Mundos poss\u00edveis sao 0 at\u00e9 {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. powerToolAir=Comando nao pode ser definido para o ar. powerToolAlreadySet=Comando \u00a7c{0}\u00a7f j\u00e1 esta definido para {1}. powerToolAttach=\u00a7c{0}\u00a7f comando definido para {1}. @@ -303,6 +362,16 @@ powerToolsEnabled=Todas suas super ferramentas foram desabilitadas. protectionOwner=\u00a76[EssentialsProtect] Dono da prote\u00e7ao: {0} questionFormat=\u00a77[Pergunta]\u00a7f {0} readNextPage=Digite /{0} {1} para ler a pr\u00f3xima p\u00e1gina +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=There is no recipe by that number +recipeFurnace=\u00a76Smelt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 to see other recipes for \u00a7c{2} +recipeNone=No recipes exist for {0} +recipeNothing=nothing +recipeShapeless=\u00a76Combine \u00a7c{0} +recipeWhere=\u00a76Where: {0} reloadAllPlugins=\u00a77Todos plugins recarregados. removed=\u00a77Removido {0} entidades. repair=Voc\u00ea reparou com sucesso sua: \u00a7e{0}. @@ -317,7 +386,10 @@ requestDeniedFrom=\u00a77{0} recusou seu pedido de teleporte requestSent=\u00a77Pedindo enviado para {0}\u00a77. requestTimedOut=\u00a7cPedido de teleporte passou o limite de tempo requiredBukkit=* ! * Voc\u00ea precisa da ultima build {0} do CraftBukkit, baixa ela em http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all online players +resetBalAll=\u00a76Balance has been reset to \u00a7a{0} \u00a76 for all players returnPlayerToJailError=Erro ocorreu ao tentar retornar jogador {0} para a cadeia: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) second=segundo seconds=segundos seenOffline=Jogador {0} esta offline desde {1} @@ -354,7 +426,9 @@ teleportRequestTimeoutInfo=\u00a77Este pedido vai acabar em {0} segundos. teleportTop=\u00a77Teleportando para o alto. teleportationCommencing=\u00a77Iniciando teleporte... teleportationDisabled=\u00a77Teleporte desativado. +teleportationDisabledFor=\u00a76Teleportation disabled for {0} teleportationEnabled=\u00a77Teleporte ativado. +teleportationEnabledFor=\u00a76Teleportation enabled for {0} teleporting=\u00a77Teleportando... teleportingPortal=\u00a77Teleportando via portal. tempBanned=Banido temporariamente do servidor por {0} @@ -369,6 +443,8 @@ timeSet=Horario definido em todos os mundos. timeSetPermission=\u00a7cVoc\u00ea nao tem autoriza\u00e7ao para modificar o hor\u00e1rio. timeWorldCurrent=O hor\u00e1rio atual no mundo {0} e \u00a73{1} timeWorldSet=O hor\u00e1rio foi definido para {0} no: \u00a7c{1} +totalWorthAll=\u00a7aSold all items and blocks for a total worth of \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aSold all blocks for a total worth of \u00a7c{1}\u00a7a. tps=Current TPS = {0} tradeCompleted=\u00a77Compra concluida. tradeSignEmpty=A placa de troca nao tem abastecimento suficiente. @@ -380,8 +456,6 @@ typeTpaccept=\u00a77Para aceitar o teleporte, digite \u00a7c/tpaccept\u00a77. typeTpdeny=\u00a77Para recusar o teleporte, digite \u00a7c/tpdeny\u00a77. typeWorldName=\u00a77Voc\u00ea tambem pode digitar o nome do mundo. unableToSpawnMob=Incapaz de gerar o mob. -unbannedIP=Endereco de IP desbanido. -unbannedPlayer=Jogador desbanido. unignorePlayer=Agora voc\u00ea nao esta mais ignorando o {0}. unknownItemId=ID do item desconhecido: {0} unknownItemInList=Item desconhecido {0} em {1} lista. @@ -392,10 +466,13 @@ unmutedPlayer=Jogador {0} desmutado. unvanished=\u00a7aEsta mais uma vez visivel. unvanishedReload=\u00a7cA recarga foi forcado a se tornar visivel. upgradingFilesError=Erro ao aprimorar os arquivos +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75is currently AFK and may not respond userDoesNotExist=O usu\u00e1rio {0} nao existe. userIsAway=[AFK]: {0} esta aus\u00eante. userIsNotAway=[AFK]: {0} nao esta mais aus\u00eante. userJailed=\u00a77Voc\u00ea foi preso, muaha! +userUnknown=\u00a74Warning: The user ''\u00a7c{0}\u00a74'' has never joined this server. userUsedPortal={0} usou um portal de saida existente. userdataMoveBackError=Falha ao mover userdata/{0}.tmp para userdata/{1} userdataMoveError=Falha ao mover userdata/{0} para userdata/{1}.tmp @@ -404,7 +481,9 @@ vanished=\u00a7aVoce agora desapareceu. versionMismatch=Versao incompativel! Atualise o {0} para mesma versao. versionMismatchAll=Versao imcompativel! Atualise todos os essentials jars para mesma versao. voiceSilenced=\u00a77Sua voz foi silenciada +walking=walking warpDeleteError=Problema ao deletar o arquivo warp. +warpList={0} warpListPermission=\u00a7cVoc\u00ea nao tem permissao para listar os warps. warpNotExist=Este warp nao existe. warpOverwrite=\u00a7cVoce nao pode substituir essa warp. @@ -440,5 +519,22 @@ year=ano years=anos youAreHealed=\u00a77Voc\u00ea foi curado. youHaveNewMail=\u00a7cVoc\u00ea tem {0} mensagens!\u00a7f Digite \u00a77/mail read\u00a7f para ver seu email. -hatRemoved=\u00a7eYour hat has been removed. -banFormat=Banned: {0} +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_ro.properties b/Essentials/src/messages_ro.properties new file mode 100644 index 0000000000..1c99c903fd --- /dev/null +++ b/Essentials/src/messages_ro.properties @@ -0,0 +1,540 @@ +#version: TeamCity +# Single quotes have to be doubled: '' +# Translations start here +# by: AnDrewKaisa +action=\u00a75* {0} \u00a75{1} +addedToAccount=\u00a7a{0} au fost adaugati in contul tau. +addedToOthersAccount=\u00a7a{0} au fost adaugati in contul lui {1}\u00a7a. Balanta noua: {2} +adventure=aventura +alertBroke=stricat: +alertFormat=\u00a73[{0}] \u00a7r {1} \u00a76 {2} la: {3} +alertPlaced=situat: +alertUsed=folosit: +antiBuildBreak=\u00a74Nu ai permisiunea sa spargi\u00a7c {0} \u00a74aici. +antiBuildCraft=\u00a74Nu ai permisiunea sa creezi\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74Nu ai permisiunea sa arunci\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74Nu ai permisiunea sa interactionezi cu\u00a7c {0}\u00a74. +antiBuildPlace=\u00a74Nu ai permisiunea sa plasati\u00a7c {0} \u00a74aici. +antiBuildUse=\u00a74Nu ai permisiunea sa utilizezi\u00a7c {0}\u00a74. +autoAfkKickReason=Ai fost dat afara deoarece ai fost AFK mai mult de {0} minute. +backAfterDeath=\u00a76Utilizeaza comanda /back pentru a te intoarce la locul mortii. +backUsageMsg=\u00a76Intoarcerea la locul anterior. +backupDisabled=\u00a74Scriptul pentru Backup nu a fost configurat. +backupFinished=\u00a76Backup terminat. +backupStarted=\u00a76Backup inceput. +balance=\u00a7aBalanta:\u00a7c {0} +balanceTop=\u00a76Balante de TOP ({0}) +banExempt=\u00a74Nu poti interzice acest jucator. +banFormat=\u00a74Interzisi:\n\u00a7r{0} +bed=\u00a7opat\u00a7r +bedMissing=\u00a74Patut tau nu a fost setat, lipeste sau este blocat. +bedNull=\u00a7mpat\u00a7r +bedSet=\u00a76Patul a fost setat! +bigTreeFailure=\u00a74Generarea copacului mare a esuat. Incearca pe pamant sau iarba. +bigTreeSuccess= \u00a76Copac mare generat. +blockList=\u00a76Essentials a retransmis comenzile urmatoare catre alt plugin: +bookAuthorSet=\u00a76Autorul cartii setat la {0}. +bookLocked=\u00a76Aceasta carte este acum blocata. +bookTitleSet=\u00a76Titlul cartii setat la {0}. +broadcast=\u00a7r\u00a74[Broadcast]\u00a7a {0} +buildAlert=\u00a74Nu ai permisiunea de a construi. +bukkitFormatChanged=Formatul versiunii Bukkit a fost schimbat. Versiunea nu este verificata. +burnMsg=\u00a76I-ai dat foc lui\u00a7c {0} \u00a76pentru\u00a7c {1} secunde\u00a76. +canTalkAgain=\u00a76Poti vorbi din nou acum. +cantFindGeoIpDB=Nu se gaseste baza de data GeoIP! +cantReadGeoIpDB=Citirea bazei de date GeoIP a dat gres! +cantSpawnItem=\u00a74Nu ai permisiunea de a genera obiectul\u00a7c {0}\u00a74. +chatTypeAdmin=[A] +chatTypeLocal=[L] +chatTypeSpy=[Spion] +cleaned=Fisierele jucatorilor au fost curatate. +cleaning=Fisierele jucatorilor se curata. +commandFailed=Comanda {0} a esuat: +commandHelpFailedForPlugin=Eroare primire ajutor pentru pluginul: {0} +commandNotLoaded=\u00a74Comanda {0} este partial incarcata. +compassBearing=\u00a76Directie: {0} ({1} grade). +configFileMoveError=Eroare mutand fisierul config.yml in locatia Backup. +configFileRenameError=Eroare redenumind fisierul config.yml. +connectedPlayers=\u00a76Jucatori conectati: \u00a7r +connectionFailed=Deschiderea conexiunii a esuat. +cooldownWithMessage=\u00a74Time ramas: {0} +corruptNodeInConfig=\u00a74Nota: Configuratia tare a un ''nod'' corupt. {0}. +couldNotFindTemplate=\u00a74Nu s-a gasit sablonul {0} +creatingConfigFromTemplate=Se creaza configuratie de la sablonul: {0} +creatingEmptyConfig=Se creaza o configuratie goala: {0} +creative=creativ +currency={0}{1} +currentWorld=\u00a76Lumea actuala:\u00a7c {0} +day=zi +days=zile +defaultBanReason=Ai fost interzis pe server! +deleteFileError=Nu s-a putut sterge fisierul: {0} +deleteHome=\u00a76Casa\u00a7c {0} \u00a76a fost stearsa. +deleteJail=\u00a76Inchisoarea\u00a7c {0} \u00a76a fost stearsa. +deleteWarp=\u00a76Teleportarea\u00a7c {0} \u00a76a fost stearsa. +deniedAccessCommand=\u00a7c{0} \u00a74are accesul interzis la comanda. +denyBookEdit=\u00a74Nu poti debloca aceasta carte. +denyChangeAuthor=\u00a74Nu poti schimba autorul acestei carti. +denyChangeTitle=\u00a74Nu poti schimba titlu acestei carti. +dependancyDownloaded=[Essentials] Dependenta {0} a fost descarcata cu succes. +dependancyException=[Essentials] O eroare a aparut in timpul descarcarii dependentei. +dependancyNotFound=[Essentials] O dependenta necesara nu a fost gasita, se descarca acum. +depth=\u00a76Esti la nivelul oceanului. +depthAboveSea=\u00a76Esti cu\u00a7c {0} \u00a76bloc(uri) deasupra nivelului oceanului. +depthBelowSea=\u00a76Esti cu\u00a7c {0} \u00a76bloc(uri) sub nivelul oceanului. +destinationNotSet=Destinatia nu a fost setata! +disableUnlimited=\u00a76Plasarea nelimitata de\u00a7c {0} \u00a76a fost dezactivata pentru {1}. +disabled=dezactivat +disabledToSpawnMob=\u00a74Generarea acestui mob a fost dezactivata din configuratie. +distance=\u00a76Distanta: {0} +dontMoveMessage=\u00a76Vei fi teleportat in\u00a7c {0}\u00a76. Nu te misca. +downloadingGeoIp=Baza GeoIP se descarca... Poate dura o vreme. +duplicatedUserdata=Informatiile jucatorilor duplicate: {0} and {1}. +durability=\u00a76Aceasta unealta are \u00a7c{0}\u00a76 utilizari ramase +editBookContents=\u00a7eAcum poti modifica continutul acestei carti. +enableUnlimited=\u00a76O suma nelimitata de\u00a7c {0} \u00a76i-a fost trimisa lui {1}. +enabled=activat +enchantmentApplied= \u00a76Magia\u00a7c {0} \u00a76a fost aplicata pe obiectul din mana. +enchantmentNotFound= \u00a74Magia nu a fost gasita! +enchantmentPerm= \u00a74YNu ai permisiunea pentru\u00a7c {0}\u00a74. +enchantmentRemoved= \u00a76Magia\u00a7c {0} \u00a76a fost scoasa de pe obiect. +enchantments= \u00a76Magii:\u00a7r {0} +errorCallingCommand=Eroare executand comanda /{0} +errorWithMessage=\u00a7cEroare:\u00a74 {0} +essentialsHelp1=Fisierul este stricat si nu poate fi deschis. Essentials este acum dezactivat. Daca nu poti rezolva problema singur, dute la http://tiny.cc/EssentialsChat +essentialsHelp2=Fisierul este stricat si nu poate fi deschis. Essentials este acum dezactivat. Daca nu poti rezolva problema singur, dute la http://tiny.cc/EssentialsChat +essentialsReload=\u00a76Essentials a fost reincarcat\u00a7c {0} +exp=\u00a7c{0} \u00a76are\u00a7c {1} \u00a76experienta (nivel\u00a7c {2}\u00a76) si are nevoie de \u00a7c {3} \u00a76experienta pentru a atinge un nou nivel. +expSet=\u00a7c{0} \u00a76are acum\u00a7c {1} \u00a76experienta. +extinguish=\u00a76Te-ai stins singur. +extinguishOthers=\u00a76Ai stins pe {0}\u00a76. +failedToCloseConfig=Eroare la inchiderea configuratiei {0}. +failedToCreateConfig=Eroare la creearea configuratiei {0}. +failedToWriteConfig=Eroare la scrierea configuratiei {0}. +false=\u00a74fals\u00a7r +feed=\u00a76Apetitul tau a fost saturat. +feedOther=\u00a76I-ai saturat apetitul lui {0}\u00a76. +fileRenameError=Redenumirea fisierului {0} a esuat! +fireworkColor=\u00a74Parametri de incarcare insertati sunt invalizi, trebuie sa setati o culoare intai. +fireworkEffectsCleared=\u00a76Efectele rachetelor au fost scoase. +fireworkSyntax=\u00a76Parametri rachetelor:\u00a7c culoare: [cadere:] [forma:] [efect:]\n\u00a76Pentru a utiliza mai mult culor/efecte, separati valorile prin virgula: \u00a7cred,blue,pink\n\u00a76forme:\u00a7c star, ball, large, creeper, burst \u00a76efecte:\u00a7c trail, twinkle. +flyMode=\u00a76Modul de zburat\u00a7c {0} \u00a76a fost setat pentru {1}\u00a76. +flying=zburand +foreverAlone=\u00a74Nu ai pe nimeni la care sa raspunzi. +freedMemory=Memorie libera {0} MB. +fullStack=\u00a74Ai deja un stac intreg. +gameMode=\u00a76Modul de joc\u00a7c {0} \u00a76a fost setat pentru {1}\u00a76. +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 bucati, \u00a7c{3}\u00a76 entitati. +gcfree=\u00a76Memorie libera:\u00a7c {0} MB. +gcmax=\u00a76Memorie maxima:\u00a7c {0} MB. +gctotal=\u00a76Memorie alocata:\u00a7c {0} MB. +geoIpUrlEmpty=URL-ul pentru descarcare GeoIP este gol. +geoIpUrlInvalid=URL-ul pentru descarcare GeoIP este invalid. +geoipJoinFormat=\u00a76Jucatorul \u00a7c{0} \u00a76a intrat din \u00a7c{1}\u00a76. +giveSpawn=\u00a76I-ai dat\u00a7c {0} \u00a76bucata(ti) de\u00a7c {1} lui\u00a7c {2}\u00a76. +godDisabledFor=\u00a74dezactivat\u00a76 pentru\u00a7c {0}. +godEnabledFor=\u00a7aactivat\u00a76 pentru\u00a7c {0}. +godMode=\u00a76Modul GOD\u00a7c {0}\u00a76. +groupNumber=\u00a7c{0}\u00a7f online, toata lista:\u00a7c /{1} {2} +groupDoesNotExist=\u00a74Nu sunt jucatori conectati din aceasta grupa! +hatArmor=\u00a74Nu poti folosi acest obicat ca palarie! +hatEmpty=\u00a74Nu porti o palarie. +hatFail=\u00a74Trebuie sa ai ceva de purtat in mana. +hatPlaced=\u00a76EBucurate de noua palarie! +hatRemoved=\u00a76Palaria ta a fost scoasa. +haveBeenReleased=\u00a76Ai fost eliberat. +heal=\u00a76Ai fost vindecat. +healDead=\u00a74Nu pot vindeca pe cineva mort! +healOther=\u00a76L-ai vindecat pe\u00a7c {0}\u00a76. +helpConsole=Pentru a vedea ajutorul din CONSOLA, scrie ?. +helpFrom=\u00a76Comenzi din {0}: +helpLine=\u00a76/{0}\u00a7r: {1} +helpMatching=\u00a76Comenzi potrivite "\u00a7c{0}\u00a76": +helpOp=\u00a74[AjutorOP]\u00a7r \u00a76{0}:\u00a7r {1} +helpPages=\u00a76Pagina \u00a7c{0}\u00a76 din \u00a7c{1}\u00a76: +helpPlugin=\u00a74{0}\u00a7r: Ajutor plugin: /help {1} +holdBook=\u00a74Nu detii o carte scriabila. +holdFirework=\u00a74Trebuie sa tii in mana o racheta pentru a-i adauga efecte. +holdPotion=\u00a74Trebuie sa tii in mana o potiune pentru a-i adauga efecte. +holeInFloor=\u00a74Gaura in podea! +homeSet=\u00a76Casa setata. +homeSetToBed=\u00a76Casa ta a fost setata la acest pat. +homes=\u00a76Case:\u00a7r {0} +hour=ora +hours=ore +ignorePlayer=\u00a76Il ignori pe jucatorul\u00a7c {0} \u00a76de acum. +illegalDate=Formatul datei este ilegala. +infoChapter=Selecteaza capitol: +infoChapterPages=\u00a76Capitol {0}, pagina \u00a7c{1}\u00a76 din \u00a7c{2}\u00a76: +infoFileDoesNotExist=Fisierul info.txt nu exista. Se creeaza unul pentru tine. +infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Pagina \u00a7c{0}\u00a76/\u00a7c{1} \u00a7e---- +infoUnknownChapter=Capitol necunoscut. +invBigger=\u00a74Inventarul altor jucatori este mai mare decat al tau. +invRestored=\u00a76Inventarul ti-a fost restaurat. +invSee=\u00a76Te uiti in inventarul lui\u00a7c {0}\u00a76. +invSeeHelp=\u00a76Folosestie /invsee pentru a-ti restaura inventarul. +invalidCharge=\u00a74Incarcare invalida. +invalidFireworkFormat=\u00a76Optiunea \u00a74{0} \u00a76nu este o valoare valida pentru \u00a74{1}\u00a76. +invalidHome=\u00a74Casa\u00a7c {0} \u00a74nu exista! +invalidHomeName=\u00a74Numele casei este invalida! +invalidMob=Numele mobului este invalid. +invalidNumber=Numar invalid. +invalidPotion=\u00a74Potiune invalida. +invalidServer=Server invalid! +invalidSignLine=\u00a74Linia\u00a7c {0} \u00a74de pe semn este invalida. +invalidWarpName=\u00a74Numele teleportarei este invalida! +invalidWorld=\u00a74Lume invalida. +inventoryCleared=\u00a76Inventarul a fost curatat. +inventoryClearedAll=\u00a76Inventarul tuturor a fost curatat. +inventoryClearedOthers=\u00a76Inventarul lui \u00a7c{0}\u00a76 a fost curatat. +is=este +itemCannotBeSold=\u00a74Acest obiect nu poate fi vandut pe server. +itemMustBeStacked=\u00a74Obiectul trebuie comercializat in stacuri. O cantitate de 2s ar trebuie sa fie 2 stacuri, s.a.m.d. +itemNames=\u00a76Numele scurte ale obiectului:\u00a7r {0} +itemNotEnough1=\u00a74YNu ai destul din acest obiect pentru a-l putea vinde. +itemNotEnough2=\u00a76Daca ai vrut sa vinzi toate obiectele de tipul acela, foloseste /sell +itemNotEnough3=\u00a76/sell va vinde totul inafara de 1, s.a.m.d. +itemSellAir=Chiar ai incercat sa vinzi ''aer''? Pune-ti un obiect in mana. +itemSold=\u00a7aVandut pentru \u00a7c{0} \u00a7a({1} {2} la {3} fiecare). +itemSoldConsole=\u00a7a{0} \u00a7aa vandut {1} pentru \u00a7a{2} \u00a7a({3} obiecte la {4} fiecare). +itemSpawn=\u00a76Ai primit\u00a7c {0} \u00a76bucata(ti) de\u00a7c {1} +itemType=\u00a76Obiect:\u00a7c {0} \u00a76-\u00a7c {1} +itemsCsvNotLoaded=Nu s-a putut incarca fisierul items.csv! +jailAlreadyIncarcerated=\u00a74Acest jucator este deja in inchisoare:\u00a7c {0} +jailMessage=\u00a74Incalci reguli, trebuie sa platesti. +jailNotExist=\u00a74Aceasta inchisoare nu exista. +jailReleased=\u00a76Jucatorul \u00a7c{0}\u00a76 a fost eliberat. +jailReleasedPlayerNotify=\u00a76Ai fost eliberat! +jailSentenceExtended=\u00a76Timpul pedepsei a fost crescut la: {0} +jailSet=\u00a76Inchisoarea\u00a7c {0} \u00a76a fost creata. +jumpError=\u00a74Asta ar putea sa raneasca creierul calculatorul. +kickDefault=Ai fost dat afara de pe server. +kickExempt=\u00a74Nu poti da afara acest jucator. +kickedAll=\u00a74Ai dat afara toti jucatorii de pe server. +kill=\u00a76Ai ucis (pe)\u00a7c {0} \u00a76. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. +kitError=\u00a74Nu sunt kituri valide. +kitErrorHelp=\u00a74Poate ca un obiect lipseste din cantitate in configuratie? +kitGive=\u00a76Kitul\u00a7c {0}\u00a76. +kitGiveTo=\u00a76Ai dat kitul\u00a7c {0}\u00a76 lui {1}\u00a7. +kitInvFull=\u00a74Inventarul tau este plin, kitul este aruncat jos. +kitOnce=\u00a74Nu poti folosi acest kit din nou. +kitReceive=\u00a76Ai primit kitul\u00a7c {0}\u00a76. +kitTimed=\u00a74Nu poti folosit acest kit inca\u00a7c {0}\u00a74. +kits=\u00a76Kituri:\u00a7r {0} +leatherSyntax=\u00a76Sintaxa culorilor la piele: color:,, ex: color:255,0,0. +lightningSmited=\u00a76Ai fost fulgerat! +lightningUse=\u00a76L-ai fulgerat pe\u00a7c {0} +listAfkTag= \u00a77[AFK]\u00a7r +listAmount= \u00a76Sunt \u00a7c{0}\u00a76 din maxim \u00a7c{1}\u00a76 jucatori online. +listAmountHidden= \u00a76Sunt \u00a7c{0}\u00a76/{1}\u00a76 din maxim \u00a7c{2}\u00a76 jucatori online. +listGroupTag={0}\u00a7r: +listHiddenTag= \u00a77[Ascuns]\u00a7r +loadWarpError=\u00a74Incarcarea teleportarii a esuat {0}. +localFormat=[L]<{0}> {1} +mailClear=\u00a76Pentru a-ti goli Posta, scrie\u00a7c /mail clear. +mailCleared=\u00a76Posta curatata! +mailSent=\u00a76Mail trimis! +markMailAsRead=\u00a76Pentru a-ti marca mailurile ca fiin , scrie\u00a7c /mail clear. +markedAsAway=\u00a76Ai fost marcat ca si . +markedAsNotAway=\u00a76Nu mai esti marcat ca si . +matchingIPAddress=\u00a76Jucatori s-au logat anterior de pe aceste IP-uri: +maxHomes=\u00a74Nu poti seta mai mult de\u00a7c {0} \u00a74case. +mayNotJail=\u00a74Nu poti incarcera acest jucator! +me=eu +messageTruncated=\u00a74Mesaj ascuns, pentru a vedea intregul mesaj scrie:\u00a7c /{0} {1} +minute=minut +minutes=minute +missingItems=\u00a74Nu ai {0}x {1}. +missingPrefixSuffix=Lipsa Sufix sau Prefix pentru {0} +mobSpawnError=\u00a74Eroare in schimbarea mob generator. +mobSpawnLimit=Cantitatea de mobi a fost limitata la limita serverului. +mobSpawnTarget=\u00a74Blocul tinta trebuie sa fie un generator. +mobsAvailable=\u00a76Mobi:\u00a7r {0} +moneyRecievedFrom=\u00a7a{0} au fost primiti de la {1}. +moneySentTo=\u00a7a{0} au fost trimisi catre {1}. +moneyTaken=\u00a7a{0} au fost luati din cont. +month=luna +months=luni +moreThanZero=\u00a74Cantitatea trebuie sa fie mai mare de 0. +moveSpeed=\u00a76Viteza {0} cu valoarea\u00a7c {1} \u00a76a fost setata pentru {2}\u00a76. +msgFormat=\u00a76[{0}\u00a76 -> {1}\u00a76] \u00a7r{2} +multipleCharges=\u00a74Nu poti aplica mai mult de o incarcare pe racheta. +multiplePotionEffects=\u00a74Nu poti aplica mai mult de un efect pe potiune. +muteExempt=\u00a74Nu poti sa opresti vorbitul acestui jucator. +muteNotify=\u00a76Adminul\u00a74 {0} \u00a76i-a interzis vorbitul lui \u00a74{1}\u00a76. +mutedPlayer=\u00a76Jucatorul {0} \u00a76nu mai are voie sa vorbeasca. +mutedPlayerFor=\u00a76Jucatorul {0} \u00a76nu mai poate vorbi pentru {1}. +mutedUserSpeaks={0} a incercat sa vorbeasca, dar nu are voie. +nearbyPlayers=\u00a76Jucatori in apropiere:\u00a7r {0} +negativeBalanceError=\u00a74Jucatorul nu are permisiunea sa aiba o balanta negativa. +nickChanged=\u00a76Nume schimbat. +nickDisplayName=\u00a74Trebuie sa activezi schimbarea numelui din configuratie. +nickInUse=\u00a74Acest nume este deja in uz. +nickNamesAlpha=\u00a74Numele trebuie sa fie alfanumeric. +nickNoMore=\u00a76Nu mai ai nume. +nickOthersPermission=\u00a74Nu ai permisiunea sa schimbi numele altor jucatori! +nickSet=\u00a76Numele tau este acum \u00a7c{0} +noAccessCommand=\u00a74Nu ai acces la aceasta comanda. +noAccessPermission=\u00a74Nu ai permisiunea la aceasta/acest {0}. +noBreakBedrock=\u00a74Nu ai permisiunea sa spargi roca. +noChapterMeta=\u00a74Nu ai permisiunea ca creezi blocuri dinamice. +noDestroyPermission=\u00a74Nu ai permisiunea sa distrugi aceasta/acest {0}. +noDurability=\u00a74Acest obiect nu are durabilitate. +noGodWorldWarning=\u00a74Avertisment! Modul GOD este dezactivat in aceasta lume. +noHelpFound=\u00a74Nici o comanda nu se potriveste. +noHomeSet=\u00a74Nu ai setat casa. +noHomeSetPlayer=\u00a76Jucatorul nu are setata casa. +noKitPermission=\u00a74Ai nevoie de permisiunea \u00a7c{0}\u00a74 pentru a utiliza acest kit. +noKits=\u00a76Nu sunt kituri valabile inca. +noMail=\u00a76Nu ai nici un mail. +noMatchingPlayers=\u00a76Nu s-a gasit potrivire jucatori. +noMetaFirework=\u00a74Nu ai permisiunea sa aplici meta pe racheta. +noMetaPerm=\u00a74Nu ai permisiunea sa aplici meta \u00a7c{0}\u00a74 pe acest obiect. +noMotd=\u00a76Nu este MOTD. +noNewMail=\u00a76Nu ai mailuri noi. +noPendingRequest=\u00a74Nu ai nici o cerere in asteptare. +noPerm=\u00a74Nu ai permisiunea \u00a7c{0}\u00a74. +noPermToSpawnMob=\u00a74Nu ai permisiunea sa generezi acest mob. +noPlacePermission=\u00a74Nu ai permisiunea sa plasezi un bloc in apropierea acestui semn. +noPowerTools=\u00a76Nu ai nicio putere pe acest obiect. +noRules=\u00a74Nu sunt reguli specificate inca. +noWarpsDefined=\u00a76Nu sunt teleportari specificate. +none=nimic +notAllowedToQuestion=\u00a74Nu ai permisiunea sa intrebi. +notAllowedToShout=\u00a74Nu ai permisiunea sa strigi. +notEnoughExperience=\u00a74Nu ai destula experienta. +notEnoughMoney=\u00a74Nu ai destule fonduri. +notFlying=nu zbori +notRecommendedBukkit= \u00a74*[!]* Aceastea versiune Bukkit nu este recomandata pentru acest Essentials. +notSupportedYet=Nu este suportat inca. +nothingInHand=\u00a74Nu ai nimic in mana. +now=acum +nuke=\u00a75Ploua cu decese. +numberRequired=Un numar merge acolo, prostesc. +onlyDayNight=/time suporta doar day/night. +onlyPlayerSkulls=\u00a74Puti seta doar proprietarul de cranii ale jucatorului(397:3). +onlyPlayers=\u00a74Doar jucatorii online pot utiliza {0}. +onlySunStorm=\u00a74/weather suporta doar sun/storm. +orderBalances=\u00a76Se ordoneaza balantele a\u00a7c {0} \u00a76jucatori, te rog asteapta... +oversizedTempban=\u00a74Nu poti interzice un jucator pentru asa o perioada de timp. +pTimeCurrent=\u00a76Timpul jucatorului \u00a7c{0}\u00a76 este\u00a7c {1}\u00a76. +pTimeCurrentFixed=\u00a76Timpul jucatorului \u00a7c{0}\u00a76 a fost fixat la\u00a7c {1}\u00a76. +pTimeNormal=\u00a76Timpul jucatorului \u00a7c{0}\u00a76 este timpul normal si potrivit serverului. +pTimeOthersPermission=\u00a74Nu ai permisiunea sa schimb timpul jucatorilor. +pTimePlayers=\u00a76Acesti jucatori au propiul lor timp:\u00a7r +pTimeReset=\u00a76Timpul jucatorului a fost resetat pentru: \u00a7c{0} +pTimeSet=\u00a76Timpul jucatorului a fost setat \u00a7c{0}\u00a76 pentru: \u00a7c{1}. +pTimeSetFixed=\u00a76Timpul jucatorului a fost fixat \u00a7c{0}\u00a76 pentru: \u00a7c{1}. +parseError=\u00a74Eroare trecand \u00a7c {0} \u00a76pe linia {1}. +pendingTeleportCancelled=\u00a74Cererea de teleportare a fost refuzata. +permissionsError=Lipsesc Permisiuni/GroupManager; prefixurile/sufixele vor fi dezactivate. +playerBanned=\u00a76Adminul\u00a7c {0} \u00a76l-a interzis pe {1} \u00a76pentru: {2}. +playerInJail=\u00a74Jucatorul este deja in inchisoare\u00a7c {0}\u00a76. +playerJailed=\u00a76Jucatorul\u00a7c {0} \u00a76a fost inchis. +playerJailedFor= \u00a76Jucatorul\u00a7c {0} \u00a76a fost inchis pentru: {1}. +playerKicked=\u00a76Adminul\u00a7c {0} \u00a76l-a dat afara pe {1} pentru: {2}. +playerMuted=\u00a76Ti-a fost interzis vorbitul! +playerMutedFor=\u00a76Ti-a fost interzis vorbitul pentru \u00a7c {0}. +playerNeverOnServer=\u00a74Jucatorul\u00a7c {0} \u00a74nu a fost niciodata pe acest server. +playerNotFound=\u00a74Jucatorul nu a fost gasit. +playerUnmuted=\u00a76Ti s-a dat voie sa vorbesti. +pong=Pong! +posPitch=\u00a76Inaltime: {0} (unghiul capului) +posX=\u00a76X: {0} (+Est <-> -Vest) +posY=\u00a76Y: {0} (+Sus <-> -Jos) +posYaw=\u00a76Yaw: {0} (Rotatie) +posZ=\u00a76Z: {0} (+Sud <-> -Nord) +possibleWorlds=\u00a76Lumile posibile sunt de la 0 la {0}. +potions=\u00a76Potiuni:\u00a7r {0}\u00a76. +powerToolAir=\u00a74Comanda nu poate fi atasata de ''aer''. +powerToolAlreadySet=\u00a74Comanda \u00a7c{0}\u00a74 este deja pusa pe {1}. +powerToolAttach=\u00a7c{0}\u00a76 comanda pusa {1}. +powerToolClearAll=\u00a76Comenzile au fost scoase de pe acest obiect. +powerToolList=\u00a76Obiectul \u00a7c{1} \u00a76are urmatoarele comenzi: \u00a7c{0}\u00a76. +powerToolListEmpty=\u00a74Obiectul \u00a7c{0} \u00a74nu are comenzi puse. +powerToolNoSuchCommandAssigned=\u00a74Comanda \u00a7c{0}\u00a74 nu a fost pusa pe{1}. +powerToolRemove=\u00a76Comanda \u00a7c{0}\u00a76 a fost scoasa de pe{1}. +powerToolRemoveAll=\u00a76Toate comenzile au fost scoase de pe {0}. +powerToolsDisabled=\u00a76Toate comenzile de pe obiecte au fost scoase. +powerToolsEnabled=\u00a76Toate comenzile de pe obiect au fost puse. +protectionOwner=\u00a76[EssentialsProtect] Detinator protectie:\u00a7r {0}. +questionFormat=\u00a72[Intrebare]\u00a7r {0} +readNextPage=\u00a76Scrie\u00a7c /{0} {1} \u00a76pentru a citi pagina urmatoare. +recipe=\u00a76Reteta pentru \u00a7c{0}\u00a76 ({1} din {2}) +recipeBadIndex=Nu este nici o reteta cu acel numar. +recipeFurnace=\u00a76Ai topit \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76este \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 pentru a vedea alta reteta pentru \u00a7c{2}\u00a76. +recipeNone=Nu exista reteta pentru {0} +recipeNothing=nimic +recipeShapeless=\u00a76Combina \u00a7c{0} +recipeWhere=\u00a76Unde: {0} +reloadAllPlugins=\u00a76Toate pluginurile au fost reincarcate. +removed=\u00a76S-au sters\u00a7c {0} \u00a76entitati. +repair=\u00a76Ti-ai reparat cu succes: \u00a7c{0}. +repairAlreadyFixed=\u00a74Aces obiect nu trebuie reparat. +repairEnchanted=\u00a74Ai ai permisiunea sa repair obiecte magice. +repairInvalidType=\u00a74Acest obiect nu poate fi reparat. +repairNone=\u00a74Nu sunt obiecte ce trebuiesc reparate. +requestAccepted=\u00a76Cererea de teleportare a fost acceptata. +requestAcceptedFrom=\u00a7c{0} \u00a76a acceptat cererea de teleportare. +requestDenied=\u00a76Cererea de teleportare a fost respinsa. +requestDeniedFrom=\u00a7c{0} \u00a76a respins cererea de teleportare. +requestSent=\u00a76Cerere a fost trimisa catre\u00a7c {0}\u00a76. +requestTimedOut=\u00a74Timpul de acceptare s-a terminat. +requiredBukkit= \u00a76*[!]* Ai nevoie de constructia minima {0} ale Bukkit-ului, descarcal de pe http://dl.bukkit.org/downloads/craftbukkit/ +resetBal=\u00a76Balanta a fost resetata la \u00a7a{0} \u00a76pentru toti jucatorii online. +resetBalAll=\u00a76Balanta a fost resetata la \u00a7a{0} \u00a76pentru toti jucatorii. +returnPlayerToJailError=\u00a74Eroare aparuta la incercarea returnarii jucatorului \u00a7c {0} \u00a74la inchisoare: {1}! +runningPlayerMatch=\u00a76Ruleaza cautarea pentru potrivite jucatori ''\u00a7c{0}\u00a76'' (Poate dura ceva) +second=secund +seconds=secunde +seenOffline=\u00a76Jucatorul\u00a7c {0} \u00a76este \u00a74offline\u00a76 din {1}. +seenOnline=\u00a76Jucatorul\u00a7c {0} \u00a76este \u00a7aonline\u00a76 din {1}. +serverFull=Serverul este plin! +serverTotal=\u00a76Total server:\u00a7c {0} +setSpawner=\u00a76Mobul generat a fost schimbat in\u00a7c {0} +sheepMalformedColor=\u00a74Culoare malformata. +shoutFormat=\u00a76[Strigat]\u00a7r {0} +signFormatFail=\u00a74[{0}] +signFormatSuccess=\u00a71[{0}] +signFormatTemplate=[{0}] +signProtectInvalidLocation=\u00a74Nu ai permsiunea sa creezi semne aici. +similarWarpExist=\u00a74O teleportare cu acelasi nume deja exista. +slimeMalformedSize=\u00a74Marile malformata. +soloMob=\u00a74Acel mob pare sa fie singur. +spawnSet=\u00a76Locatia spawn a fost setata grupului\u00a7c {0}\u00a76. +spawned=generati(te) +sudoExempt=\u00a74Nu poti forta acest jucator. +sudoRun=\u00a76Fortarea lui\u00a7c {0} \u00a76sa utilizeze:\u00a7r /{1} {2} +suicideMessage=\u00a76La revedere lume cruda... +suicideSuccess= \u00a76{0} \u00a76si-a luat viata. +survival=supravietuire +takenFromAccount=\u00a7a{0} au fost luati de pe contul tau. +takenFromOthersAccount=\u00a7a{0} au fost luati de pe contul lui {1}\u00a7a. Balanta noua: {2}. +teleportAAll=\u00a76Cererea de teleportare a fost trimisa catre toti jucatorii... +teleportAll=\u00a76Teleporteaza toti jucatorii... +teleportAtoB=\u00a7c{0}\u00a76 te-a teleportat catre {1}\u00a76. +teleportDisabled=\u00a7c{0} \u00a74are teleportarea dezactivata. +teleportHereRequest=\u00a7c{0}\u00a76 ti-a cerut sa te teleportezi la ei. +teleportNewPlayerError=\u00a74Teleportarea jucatorului nou a dat gres! +teleportRequest=\u00a7c{0}\u00a76 a cerut sa se teleporteze la tine. +teleportRequestTimeoutInfo=\u00a76Aceasta cerere va expira in\u00a7c {0} secunde\u00a76. +teleportTop=\u00a76Teleporteaza la cel mai inalt punct. +teleportationCommencing=\u00a76Teleportarea urmeaza... +teleportationDisabled=\u00a76Teleportarea a fost dezactivata. +teleportationDisabledFor=\u00a76Teleportarea a fost dezactivata pentru {0}. +teleportationEnabled=\u00a76Teleportarea activata. +teleportationEnabledFor=\u00a76Teleportarea a fost activata pentru {0}. +teleporting=\u00a76Teleporteaza... +teleportingPortal=\u00a76Teleporteaza prin portal. +tempBanned=Interzis temporar de pe server pentru {0}. +tempbanExempt=\u00a74Nu poti interzice acest jucatoru. +thunder= \u00a76Ai\u00a7c {0} \u00a76ploaia in lumea ta. +thunderDuration=\u00a76Ai\u00a7c {0} \u00a76ploaia in luma ta pentru\u00a7c {1} \u00a76secunde. +timeBeforeHeal=\u00a76Timp pana la urmatoarea vindecare:\u00a7c {0}\u00a76. +timeBeforeTeleport=\u00a76Timp intre teleportari:\u00a7c {0} +timeFormat=\u00a7c{0}\u00a76 sau \u00a7c{1}\u00a76 sau \u00a7c{2}\u00a76. +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=\u00a76Timp setat in toate lumile. +timeSetPermission=\u00a74Nu ai permisiunea sa setezi timpul. +timeWorldCurrent=\u00a76Timpul curent in lumea\u00a7c {0} \u00a76este \u00a7c{1}\u00a76. +timeWorldSet=\u00a76Timul a fost setat u00a7c {0} \u00a76in: \u00a7c{1}\u00a76. +totalWorthAll=\u00a7aVindeti toate obiectele pentru un toltal de \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aVindeti toate obiectele pentru un toltal de \u00a7c{1}\u00a7a. +tps=\u00a76TPSul curent = {0} +tradeCompleted=\u00a7aNegot complet. +tradeSignEmpty=\u00a74Semnul pentru negociere nu are nimic pentru tine. +tradeSignEmptyOwner=\u00a74Nu este nimic de colectat de la acest semn. +treeFailure=\u00a74Generarea copacului a esuat. Incearca pe pamand sau iarba. +treeSpawned=\u00a76Copac generat. +true=\u00a7aadevarat\u00a7r +typeTpaccept=\u00a76Pentru a accepta teleportarea, scrie \u00a7c/tpaccept\u00a76. +typeTpdeny=\u00a76Pentru a refuza teleportarea, scrie \u00a7c/tpdeny\u00a76. +typeWorldName=\u00a76De asemenea poti scrie numele unei lumi. +unableToSpawnMob=\u00a74Nu se poate genera mobul. +unignorePlayer=\u00a76Nu-l mai ignori pe\u00a7c {0} \u00a76de acum inainte. +unknownItemId=\u00a74Nu se cunoaste codul obiectului:\u00a7r {0}\u00a74. +unknownItemInList=\u00a74Obiect necunoscut {0} in {1} list. +unknownItemName=\u00a74Nume obiect necunoscut: {0}. +unlimitedItemPermission=\u00a74Nu ai permissiunea pentru obiecte nelimitate {0}. +unlimitedItems=\u00a76Obiecte nelimitate:\u00a7r +unmutedPlayer=\u00a76Jucatorul\u00a7c {0} \u00a76are voie sa vorbeasca. +unvanished=\u00a76Esti din nou vizibil. +unvanishedReload=\u00a74O reincarcare te-a fortat sa devii din nou vizibil. +upgradingFilesError=Eroare urcand fisierele. +uptime=\u00a76Uptime:\u00a7c {0} +userAFK=\u00a75{0} \u00a75este acum AFK si este posibil sa nu raspunda. +userDoesNotExist=\u00a74Jucatorul\u00a7c {0} \u00a74nu exista. +userIsAway=\u00a75{0} \u00a75este AFK. +userIsNotAway=\u00a75{0} \u00a75nu mai este AFK. +userJailed=\u00a76Ai fost inchis! +userUnknown=\u00a74Advertisment: Jucatorul ''\u00a7c{0}\u00a74'' nu a intrat niciodata pe acest server. +userUsedPortal={0} a utilizat un portal deja creat. +userdataMoveBackError=Mutarea datelor jucatorilor a esuat. /{0}.tmp catre datele jucatorilor /{1}! +userdataMoveError=Mutarea datelor jucatorilor a esuat. /{0} catre datele jucatorilor /{1}.tmp! +usingTempFolderForTesting=Se utilizicea un folder temportat pentru test: +vanished=\u00a76Ai devenit invizibil. +versionMismatch=\u00a74Versiunea nu se potriveste! Fa update {0} la aceasi versiune. +versionMismatchAll=\u00a74Versiunea nu se potriveste! Fa uptate la acceasi versiune. +voiceSilenced=\u00a76Vocea ta e fost interzisa +walking=mergand +warpDeleteError=\u00a74Problema in stergerea teleportarii. +warpList={0} +warpListPermission=\u00a74Nu ai permisiunea de a vedea teleportarile. +warpNotExist=\u00a74Aceasta teleportare nu exista. +warpOverwrite=\u00a74Nu poti rescrie peste aceasta teleportare. +warpSet=\u00a76teleportarea\u00a7c {0} \u00a76setata. +warpUsePermission=\u00a74Nu ai permisiunea de a utiliza aceasta teleportare. +warpingTo=\u00a76Teleporteaza catre\u00a7c {0}\u00a76. +warps=\u00a76teleportari:\u00a7r {0} +warpsCount=\u00a76In total sunt\u00a7c {0} \u00a76teleportari. Pagina {1} of {2}. +weatherStorm=\u00a76Ai setat vremea din \u00a7cstorm\u00a76 in\u00a7c {0}\u00a76. +weatherStormFor=\u00a76Ai setat vremea din \u00a7cstorm\u00a76 in\u00a7c {0} \u00a76pentru {1} secunde. +weatherSun=\u00a76Ai setat vremea din \u00a7csun\u00a76 in\u00a7c {0}\u00a76. +weatherSunFor=\u00a76Ai setat vremea din \u00a7csun\u00a76 in\u00a7c {0} \u00a76pentru {1} secunde. +whoisAFK=\u00a76 - AFK:\u00a7r {0} +whoisBanned=\u00a76 - Interzisi:\u00a7r {0} +whoisExp=\u00a76 - Experience:\u00a7r {0} (Level {1}) +whoisFly=\u00a76 - Mod zburator:\u00a7r {0} ({1}) +whoisGamemode=\u00a76 - Mod de joc:\u00a7r {0} +whoisGeoLocation=\u00a76 - Locatie:\u00a7r {0} +whoisGod=\u00a76 - Modul GOD:\u00a7r {0} +whoisHealth=\u00a76 - Viata:\u00a7r {0}/20 +whoisIPAddress=\u00a76 - Aresa IP:\u00a7r {0} +whoisJail=\u00a76 - Inchisi:\u00a7r {0} +whoisLocation=\u00a76 - Location:\u00a7r ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - Bani:\u00a7r {0} +whoisMuted=\u00a76 - Vorbit interzis:\u00a7r {0} +whoisNick=\u00a76 - Nume:\u00a7r {0} +whoisOp=\u00a76 - OP:\u00a7r {0} +whoisTop=\u00a76 ====== WhoIs:\u00a7c {0} \u00a76====== +worth=\u00a7aUn stac de {0} valoreaza \u00a7c{1}\u00a7a ({2} obiect(e) la {3} fiecare) +worthMeta=\u00a7aUn stac de {0} cu metadata de {1} valoreaza \u00a7c{2}\u00a7a ({3} obiect(e) la {4} fiecare) +worthSet=\u00a76Valoarea ''valorii'' setata +year=an +years=ani +youAreHealed=\u00a76Ai fost vindecat. +youHaveNewMail=\u00a76Ai\u00a7c {0} \u00a76mesaje! scrie \u00a7c/mail read\u00a76 pentru a-ti vedea mesajele. +playerUnbanned=\u00a76Adminul\u00a7c {0} \u00a76i-a scos interzicerea lui {1}. +playerUnbanIpAddress=\u00a76Adminul\u00a7c {0} \u00a76i-a scos interzicerea IPului: {1}. +playerBanIpAddress=\u00a76Adminul\u00a7c {0} \u00a76a interzis IPul: {1}\u00a76. +noPotionEffectPerm=\u00a74Nu ai permisiunea sa aplici efectul\u00a7c{0} \u00a74pe aceasta potiune. +invalidPotionMeta=\u00a74Potiune meta invalida: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_se.properties b/Essentials/src/messages_se.properties new file mode 100644 index 0000000000..349143259e --- /dev/null +++ b/Essentials/src/messages_se.properties @@ -0,0 +1,540 @@ +#version: TeamCity +# Single quotes have to be doubled: '' +# Translations start here +# by: oggehej, corrected by NeonMaster. +action=* {0} {1} +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 = \u00e4ventyr +alertBroke=gjorde s\u00f6nder: +alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} at: {3} +alertPlaced=placerade: +alertUsed=anv\u00e4nde: +antiBuildBreak=\u00a74Du har inte till\u00e5telse att ta s\u00f6nder {0} blocks h\u00e4r. +antiBuildCraft=\u00a74Du har inte till\u00e5telse att skapa\u00a7c {0}\u00a74. +antiBuildDrop=\u00a74Du har inte till\u00e5telse att kasta ut\u00a7c {0}\u00a74. +antiBuildInteract=\u00a74Du har inte till\u00e5telse att p\u00e5verka {0}. +antiBuildPlace=\u00a74Du har inte till\u00e5telse att placera {0} h\u00e4r. +antiBuildUse=\u00a74Du har inte till\u00e5telse att anv\u00e4nda {0}. +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 +balance=\u00a77Balans: {0} +balanceTop=\u00a77Topp balans ({0}) +banExempt=\u00a7cDu kan inte banna den spelaren. +banFormat=Banned: {0} +bed=\u00a7obed\u00a7r +bedMissing=\u00a74Your bed is either unset, missing or blocked. +bedNull=\u00a7mbed\u00a7r +bedSet=\u00a76Bed spawn set! +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: +bookAuthorSet=\u00a76F\u00c3\u00b6rfattaren av boken \u00c3\u00a4r nu{0} +bookLocked=\u00a7cDenna bok \u00c3\u00a4r nu l\u00c3\u00a5st +bookTitleSet=\u00a76Titeln av boken har blivit \u00c3\u00a4ndrad till {0} +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\u00e4sa inneh\u00e5ll fr\u00e5n GeoIP-databasen! +cantSpawnItem=\u00a7cDu har inte beh\u00f6righet att spawna {0} +chatTypeAdmin=[A] +chatTypeLocal=[L] +chatTypeSpy=[Spy] +cleaned=Userfiles Cleaned. +cleaning=Cleaning userfiles. +commandFailed=Kommando {0} misslyckades: +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\u00e5 temp-filen till config.yml +connectedPlayers=\u00a77Anslutna spelare\u00a7r +connectionFailed=Kunde inte \u00f6ppna anslutning. +cooldownWithMessage=\u00a7cNedkylning: {0} +corruptNodeInConfig=\u00a74Observera: Din konfigurationsfil har en korrupt {0} nod. +couldNotFindTemplate=Kunde inte hitta mallen {0} +creatingConfigFromTemplate=Skapar konfiguration fr\u00e5n mallen: {0} +creatingEmptyConfig=Skapar tom konfiguration: {0} +creative=kreativ +currency={0}{1} +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\u00e4ngelset {0} har tagits bort. +deleteWarp=\u00a77Warpen {0} har tagits bort. +deniedAccessCommand={0} nekades \u00e5tkomst till kommandot. +denyBookEdit=\u00a74Du kan inte l\u00c3\u00a5sa upp denna boken +denyChangeAuthor=\u00a74Du kan inte byta f\u00c3\u00b6rfattare p\u00c3\u00a5 denna bok +denyChangeTitle=\u00a74Du kan inte byta titel p\u00c3\u00a5 denna bok +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\u00e4r moben \u00e4r inaktiverat i configurationsfilen. +distance=\u00a76Avst\u00e5nd: {0} +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 +editBookContents=\u00a7eDu kan nu \u00c3\u00a4ndra inneh\u00c3\u00a5llet i denna bok +enableUnlimited=\u00a77Ger o\u00e4ndligt av {0} till {1}. +enabled=aktiverad +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 \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\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\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 \u00e4r m\u00e4ttad. +feedOther=\u00a77Matade {0}. +fileRenameError=Namnbytet av filen {0} misslyckades +fireworkColor=\u00a74Du m\u00c3\u00a5ste l\u00c3\u00a4gga till en f\u00c3\u00a4rg till fyrverkeripj\u00c3\u00a4sen f\u00c3\u00b6r att l\u00c3\u00a4gga till en effekt +fireworkEffectsCleared=\u00a76Removed all effects from held stack. +fireworkSyntax=\u00a76Firework parameters:\u00a7c color: [fade:] [shape:] [effect:]\n\u00a76To use multiple colors/effects, seperate values with commas: \u00a7cred,blue,pink\n\u00a76Shapes:\u00a7c star, ball, large, creeper, burst \u00a76Effects:\u00a7c trail, twinkle +flyMode=\u00a77Aktiverade flygl\u00e4ge {0} f\u00f6r {1}. +flying=flying +foreverAlone=\u00a7cDu har ingen att svara. +freedMemory=Befriade {0} MB. +fullStack=\u00a74Du har redan en full stapel +gameMode=\u00a77Satte {0}s spell\u00e4ge till {1}. +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 bitar, \u00a7c{3}\u00a76 enheter +gcfree=Ledigt minne: {0} MB +gcmax=Maximalt minne: {0} MB +gctotal=Tilldelat minne: {0} MB +geoIpUrlEmpty=Nerladdningsadressen f\u00f6r GeoIP \u00e4r tom. +geoIpUrlInvalid=Nerladdningsadressen f\u00f6r GeoIP \u00e4r ogiltig. +geoipJoinFormat=\u00a76Spelaren \u00a7c{0} \u00a76kommer fr\u00e5n \u00a7c{1}\u00a76. +giveSpawn=\u00a76Ger\u00a7c {0} \u00a76av\u00a7c {1} till\u00a7c {2}\u00a76. +godDisabledFor=inaktiverat f\u00f6r {0} +godEnabledFor=aktiverat f\u00f6r {0} +godMode=\u00a77Od\u00f6dlighet {0}. +groupNumber={0} online, for the full list type /{1} {2} +groupDoesNotExist=\u00a74There's no one online in this group! +hatArmor=\u00a7cFel, du kan inte anv\u00e4nda den h\u00e4r saken som en hatt! +hatEmpty=\u00a7cDu har inte p\u00e5 dig en hatt. +hatFail=\u00a7cDu m\u00e5ste ha n\u00e5gonting att b\u00e4ra i din hand. +hatPlaced=\u00a7eNjut av din nya hatt! +hatRemoved=\u00a7eDin hatt har tagits bort. +haveBeenReleased=\u00a77Du har blivit friad +heal=\u00a77Du har blivit l\u00e4kt. +healDead=\u00a74You cannot heal someone who is dead! +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\u00e4lp]\u00a7f \u00a77{0}:\u00a7f {1} +helpPages=Sida \u00a7c{0}\u00a7f av \u00a7c{1}\u00a7f: +helpPlugin=\u00a74{0}\u00a7f: Hj\u00e4lp f\u00f6r insticksprogram: /help {1} +holdBook=\u00a74Boken du h\u00c3\u00a5ller i \u00c3\u00a4r inte skrivbar +holdFirework=\u00a74Du m\u00c3\u00a5ste h\u00c3\u00a5lla i en fyrverkeripj\u00c3\u00a4s f\u00c3\u00b6r att l\u00c3\u00a4gga till effekter +holdPotion=\u00a74You must be holding a potion to apply effects to it. +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\u00e5n och med nu. +illegalDate=Felaktigt datumformat. +infoChapter=V\u00e4lj kapitel: +infoChapterPages=Kapitel {0}, sida \u00a7c{1}\u00a7f av \u00a7c{2}\u00a7f: +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\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. +invalidFireworkFormat=\u00a76Alternativet \u00a74{0} \u00a76is \u00c3\u00a4r inte ett korrekt alternativ f\u00c3\u00b6r \u00a74{1} +invalidHome=Hemmet {0} finns inte +invalidHomeName=\u00a74Ogiltigt hemnamn +invalidMob=Ogiltig monstertyp. +invalidNumber=Felaktigt nummer. +invalidPotion=\u00a74Invalid Potion. +invalidServer=Ogiltig server! +invalidSignLine=Rad {0} p\u00e5 skylten \u00e4r ogiltig. +invalidWarpName=\u00a74Ogiltigt warpnamn +invalidWorld=\u00a7cOgiltig v\u00e4rld. +inventoryCleared=\u00a77F\u00f6rr\u00e5d rensat. +inventoryClearedAll=\u00a76Cleared everyone's inventory. +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. +itemNames=F\u00f6rkortning p\u00e5 objekt: {0} +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} +itemType=Objekt: {0} - {1} +itemsCsvNotLoaded=Kunde inte ladda items.csv. +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\u00e5n servern +kill=\u00a77D\u00f6dade {0}. +killExempt=\u00a74You can not kill {0} +kitError2=\u00a74That kit is improperly defined. Contact an administrator. +kitError=\u00a7cDet finns inga giltiga kit. +kitErrorHelp=\u00a7cKanske en sak fattar m\u00e4ngd i konfigurationen? +kitGive=\u00a77Ger kit {0}. +kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to {1}\u00a7. +kitInvFull=\u00a7cDitt F\u00f6rr\u00e5d var fullt, placerar kit p\u00e5 golvet +kitOnce=\u00a74Du kan inte av\u00e4nda det kitet igen. +kitReceive=\u00a76Received kit\u00a7c {0}\u00a76. +kitTimed=\u00a7cDu kan inte anv\u00e4nda det kit:et igen p\u00e5 {0}. +kits=\u00a77Kit: {0} +leatherSyntax=\u00a76Leather Color Syntax: color:,, eg: color:255,0,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 \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\u00d6MD]\u00a7f +loadWarpError=Kunde inte ladda warp {0} +localFormat=Lokal: <{0}> {1} +mailClear=\u00a7cF\u00f6r att markera dina meddelanden som l\u00e4sta, skriv /mail clear +mailCleared=\u00a77Meddelanden rensade! +mailSent=\u00a77Meddelandet skickad! +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. +matchingIPAddress=\u00a76The following players previously logged in from that IP address: +maxHomes=Du kan inte ha fler \u00e4n {0} hem. +mayNotJail=\u00a7cDu f\u00e5r inte s\u00e4tta den personen i f\u00e4ngelse +me=jag +messageTruncated=\u00a74Meddelandet har blivit f\u00c3\u00b6rkortat, f\u00c3\u00b6r att se allt, skriv:\u00a7c /{0} {1} +minute=minut +minutes=minuter +missingItems=Du har inte {0}x {1}. +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\u00e5n {1} +moneySentTo=\u00a7a{0} har skickats till {1} +moneyTaken={0} \u00e4r taget fr\u00e5n ditt bankkonto. +month=m\u00e5nad +months=m\u00e5nader +moreThanZero=M\u00e5ngden m\u00e5ste vara st\u00f6rre \u00e4n 0. +moveSpeed=\u00a77Satte {0}fart till {1} f\u00f6r {2}. +msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} +multipleCharges=\u00a74You cannot apply more than one charge to this firework. +multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion. +muteExempt=\u00a7cDu kan inte tysta den spelaren. +muteNotify=\u00a74{0} \u00a76har tystat \u00a74{1} +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. +noChapterMeta=\u00a74You do not have permission to create dynamic books. +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\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 +noMatchingPlayers=\u00a76No matching players found. +noMetaFirework=\u00a74You do not have permission to apply firework meta. +noMetaPerm=\u00a74You do not have permission to apply \u00a7c{0}\u00a74 meta to this item. +noMotd=\u00a7cDet finns inget meddelande f\u00f6r dagen. +noNewMail=\u00a77Du har inget nytt meddelande. +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 \u00e4n. +noWarpsDefined=Inga warpar \u00e4r definerade +none=inga +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\u00e4ckligt med pengar. +notFlying=flyger inte +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\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). +onlyPlayerSkulls=\u00a74You can only set the owner of player skulls (397:3). +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... +oversizedTempban=\u00a74Du kan inte banna en spelare just vid denna tidpunkt. +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 \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\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\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! +posPitch=\u00a76Pitch: {0} (Huvudvinkel) +posX=\u00a76X: {0} (+\u00d6ster <-> -V\u00e4st) +posY=\u00a76Y: {0} (+Upp <-> -Ner) +posYaw=\u00a76Girning: {0} (Rotation) +posZ=\u00a76Z: {0} (+Syd <-> -Nort) +possibleWorlds=\u00a77M\u00f6jliga v\u00e4rdar \u00e4r nummer mellan 0 och {0}. +potions=\u00a76Potions:\u00a7r {0}\u00a76. +powerToolAir=Kommandot kan inte tilldelas luft. +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\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 \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\u00e4gare: {0} +questionFormat=\u00a77[Fr\u00e5ga]\u00a7f {0} +readNextPage=Skriv /{0} {1} f\u00f6r att l\u00e4sa n\u00e4sta sida +recipe=\u00a76Recept f\u00c3\u00b6r \u00a7c{0}\u00a76 ({1} av {2}) +recipeBadIndex=Det finns inget recept med det numret +recipeFurnace=\u00a76Sm\u00c3\u00a4lt \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76\u00c3\u00a4r \u00a7c{1} +recipeMore=\u00a76Skriv /{0} \u00a7c{1}\u00a76 f\u00c3\u00b6r att se andra recept f\u00c3\u00b6r \u00a7c{2} +recipeNone=Inga recept existerar f\u00c3\u00b6r {0} +recipeNothing=ingenting +recipeShapeless=\u00a76Kombinera \u00a7c{0} +recipeWhere=\u00a76Var: {0} +reloadAllPlugins=\u00a77Laddade om alla insticksprogram. +removed=\u00a77Tog bort {0} enheter. +repair=Du har reparerat din: \u00a7e{0}. +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/ +resetBal=\u00a76Balansen har blivit \u00c3\u00a5terst\u00c3\u00a4lld till \u00a7a{0} \u00a76 f\u00c3\u00b6r alla spelare som \u00c3\u00a4r online +resetBalAll=\u00a76Balansen har blivit \u00c3\u00a5terst\u00c3\u00a4lld till \u00a7a{0} \u00a76 f\u00c3\u00b6r alla spelare +returnPlayerToJailError=Ett fel uppstod n\u00e4r spelaren {0} skulle \u00e5terv\u00e4nda till f\u00e4ngelset: {1} +runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while) +second=sekund +seconds=sekunder +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\u00e4rg. +shoutFormat=\u00a77[Hojtning]\u00a7f {0} +signFormatFail=\u00a74[{0}] +signFormatSuccess=\u00a71[{0}] +signFormatTemplate=[{0}] +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\u00e4r monstret gillar att vara ensam +spawnSet=\u00a77Spawnpunkten inst\u00e4lld f\u00f6r gruppen {0}. +spawned=spawnade +sudoExempt=Du kan inte g\u00f6ra en sudo p\u00e5 den h\u00e4r anv\u00e4ndaren +sudoRun=Tvingar {0} att springa: /{1} {2} +suicideMessage=\u00a77Adj\u00f6 grymma v\u00e4rld... +suicideSuccess= \u00a77{0} tog sitt eget liv +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\u00e5gat dig om du vill teleportera till dem. +teleportNewPlayerError=Messlyckades med att teleportera ny spelare +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\u00e5b\u00f6rjas... +teleportationDisabled=\u00a77Teleportering inaktiverat. +teleportationDisabledFor=\u00a76Teleportering inaktiverat f\u00f6r {0} +teleportationEnabled=\u00a77Teleportering aktiverat. +teleportationEnabledFor=\u00a76TTeleportering aktiverat f\u00f6r {0} +teleporting=\u00a77Teleporterar... +teleportingPortal=\u00a77Teleporterar via portal. +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\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} +totalWorthAll=\u00a7aS\u00e5lde alla objekt f\u00f6r ett totalt v\u00e4rde av \u00a7c{1}\u00a7a. +totalWorthBlocks=\u00a7aS\u00e5lde alla blocks f\u00f6r ett totalt v\u00e4rde av \u00a7c{1}\u00a7a. +tps=Nuvarande TPS = {0} +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\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. +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 +uptime=\u00a76Upptid:\u00a7c {0} +userAFK=\u00a75{0} \u00a75\u00c3\u00a4r f\u00c3\u00b6r n\u00c3\u00a4rvarande borta och svarar kanske inte +userDoesNotExist=Anv\u00e4ndaren {0} existerar inte. +userIsAway={0} \u00e4r nu AFK +userIsNotAway={0} \u00e4r inte l\u00e4ngre AFK +userJailed=\u00a77Du har blivit f\u00e4ngslad +userUnknown=\u00a74Varning: Anv\u00e4ndaren ''\u00a7c{0}\u00a74'' har aldrig varit inne p\u00e5 denna server tidigare. +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\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 +walking=g\u00e5r +warpDeleteError=Problem med att ta bort warp-filen. +warpList={0} +warpListPermission=\u00a7cDu har inte tillst\u00e5nd att lista warparna. +warpNotExist=Den warpen finns inte. +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\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 +whoisAFK=\u00a76 - AFK:\u00a7f {0} +whoisBanned=\u00a76 - Bannad:\u00a7f {0} +whoisExp=\u00a76 - Erfarenhet:\u00a7f {0} (Level {1}) +whoisFly=\u00a76 - Flygl\u00e4ge:\u00a7f {0} ({1}) +whoisGamemode=\u00a76 - Spell\u00e4ge:\u00a7f {0} +whoisGeoLocation=\u00a76 - Lokalisering:\u00a7f {0} +whoisGod=\u00a76 - Gudsl\u00e4ge:\u00a7f {0} +whoisHealth=\u00a76 - H\u00e4lsa:\u00a7f {0}/20 +whoisIPAddress=\u00a76 - IP-Adress:\u00a7f {0} +whoisJail=\u00a76 - F\u00e4ngelse:\u00a7f {0} +whoisLocation=\u00a76 - Lokalisering:\u00a7f ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - Pengar:\u00a7f {0} +whoisMuted=\u00a76 - Tystad:\u00a7f {0} +whoisNick=\u00a76 - Smeknamn:\u00a7f {0} +whoisOp=\u00a76 - OP:\u00a7f {0} +whoisTop=\u00a76 ====== WhoIs:\u00a7f {0} \u00a76====== +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. +playerUnbanned=\u00a76Player\u00a7c {0} \u00a76unbanned {1}. +playerUnbanIpAddress=\u00a76Player\u00a7c {0} \u00a76unbanned IP: {1}. +playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address {1}\u00a76. +noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion. +invalidPotionMeta=\u00a74Invalid potion meta: \u00a7c{0}\u00a74. +balanceOther=\u00a7aBalance of {0}\u00a7a:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76''s weather is\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76''s weather is normal and matches the server. +pWeatherOthersPermission=\u00a74You are not authorized to set other players' weather. +pWeatherPlayers=\u00a76These players have their own weather:\u00a7r +pWeatherReset=\u00a76Player weather has been reset for: \u00a7c{0} +pWeatherSet=\u00a76Player weather is set to \u00a7c{0}\u00a76 for: \u00a7c{1}. +pWeatherInvalidAlias=\u00a74Invalid weather type +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. +insufficientFunds=\u00a74Insufficient funds available. diff --git a/Essentials/src/messages_zh.properties b/Essentials/src/messages_zh.properties new file mode 100644 index 0000000000..f2130aee96 --- /dev/null +++ b/Essentials/src/messages_zh.properties @@ -0,0 +1,549 @@ +#version: TeamCity +# Single quotes have to be doubled: '' +# Translations start here +# by: \u00e7\u0099\u00bd\u00e5\u00ae\u009d\u00e7\u009f\u00b3\u00e6\u00b1\u0089\u00e5\u008c\u0096\u00e7\u00bb\u0084:\u00e5\u00a4\u00a7\u00e5\u0088\u0098, pa001024 +action=\u00a7d* {0} \u00a7r5{1} +addedToAccount=\u00a7a{0} \u5df2\u6dfb\u52a0\u5230\u4f60\u7684\u94f6\u884c\u8d26\u6237 +addedToOthersAccount=\u00a7a{0} \u5df2\u88ab\u6dfb\u52a0\u5230 {1} \u00a7a\u7684\u8d26\u6237.\u76ee\u524d\u4f59\u989d: {2} +adventure=\u5192\u9669\u6a21\u5f0f +alertBroke=\u7834\u574f: +alertFormat=\u00a73[{0}] \u00a7r {1} \u00a76 {2} \u4e8e: {3} +alertPlaced=\u653e\u7f6e: +alertUsed=\u4f7f\u7528: +antiBuildBreak=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u7834\u574f\u00a74 {0} \u00a74\u8fd9\u4e2a\u65b9\u5757. +antiBuildCraft=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u653e\u7f6e\u00a74 {0} \u00a74\u8fd9\u4e2a\u65b9\u5757. +antiBuildDrop=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u653e\u7f6e\u00a74 {0} \u00a74\u8fd9\u4e2a\u65b9\u5757. +antiBuildInteract=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u4e0e\u00a74 {0}\u00a74\u4ea4\u4e92. +antiBuildPlace=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u653e\u7f6e\u00a74 {0} \u00a74\u8fd9\u4e2a\u65b9\u5757. +antiBuildUse=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u4f7f\u7528\u00a74 {0}\u00a74. +autoAfkKickReason=\u4f60\u56e0\u4e3a\u957f\u65f6\u95f4\u672a\u80fd\u5728\u6e38\u620f\u4e2d\u505a\u51fa\u52a8\u4f5c\u5e76\u8d85\u8fc7 {0} \u5206\u949f\u800c\u88ab\u670d\u52a1\u5668\u8bf7\u51fa\uff01 +backAfterDeath=\u00a76\u4f7f\u7528\u201c/back\u201d\u547d\u4ee4\u6765\u56de\u5230\u6b7b\u4ea1\u5730\u70b9 +backUsageMsg=\u00a76\u56de\u5230\u4e0a\u4e00\u4f4d\u7f6e +backupDisabled=\u00a74\u5907\u4efd\u914d\u7f6e\u6587\u4ef6\u672a\u88ab\u8bbe\u7f6e. +backupFinished=\u00a76\u5907\u4efd\u5b8c\u6210. +backupStarted=\u00a76\u5907\u4efd\u5f00\u59cb +balance=\u00a7a\u73b0\u91d1:{0} +balanceTop=\u00a76\u91d1\u94b1\u6392\u884c:{0} +banExempt=\u00a74\u4f60\u4e0d\u80fd\u5c01\u7981\u90a3\u4e2a\u73a9\u5bb6\u00a7r +banFormat=\u00a74\u5df2\u5c01\u7981:\u00a7r {0} +bed=\u00a77\u5e8a\u00a7r +bedMissing=\u00a7r54\u4f60\u7684\u5e8a\u5df2\u4e22\u5931\u6216\u963b\u6321 +bedNull=\u00a7m\u5e8a\u00a7r +bedSet=\u00a7m\u5df2\u8bbe\u7f6e\u5e8a\u00a7r +bigTreeFailure=\u00a74\u751f\u6210\u5927\u6811\u5931\u8d25.\u5728\u571f\u5757\u6216\u8349\u5757\u4e0a\u9762\u518d\u8bd5\u4e00\u6b21 +bigTreeSuccess=\u00a76\u5df2\u751f\u6210\u5927\u6811 +blockList=\u00a76Essentials \u63d2\u4ef6\u5c06\u4f20\u9012\u4e0b\u5217\u6307\u4ee4\u7ed9\u53e6\u4e00\u63d2\u4ef6: +broadcast=\u00a7r\u00a76[\u00a74\u516c\u544a\u00a76]\u00a7a {0} +buildAlert=\u00a74\u4f60\u6ca1\u6709\u5efa\u9020\u6743\u9650! +bukkitFormatChanged=Bukkit\u7248\u672c\u5df2\u6539\u53d8 +burnMsg=\u00a76\u4f60\u5c06\u4f7f \u00a74{0} \u00a76\u71c3\u70e7\u00a74 {1} \u00a76\u79d2 +canTalkAgain=\u00a76\u4f60\u5df2\u83b7\u5f97\u53d1\u8a00\u7684\u8d44\u683c +cantFindGeoIpDB=\u65e0\u6cd5\u627e\u5230GeoIP\u6570\u636e\u5e93\uff01 +cantReadGeoIpDB=\u8bfb\u53d6GeoIP\u6570\u636e\u5e93\u5931\u8d25\uff01 +cantSpawnItem=\u00a74\u4f60\u6ca1\u6709\u751f\u6210 {0} \u7684\u6743\u9650 +cantFindGeoIpDB=\u627e\u4e0d\u5230GeoIP\u6570\u636e\u5e93! +cantReadGeoIpDB=GeoIP\u6570\u636e\u5e93\u8bfb\u53d6\u5931\u8d25! +cantSpawnItem=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u751f\u6210\u7269\u54c1\u00a7c {0}\u00a74. +chatTypeAdmin=[A] +chatTypeLocal=[L] +chatTypeSpy=[Spy] +cleaned=\u7528\u6237\u6587\u4ef6\u5df2\u6e05\u7a7a +cleaning=\u6e05\u7a7a\u7528\u6237\u6587\u4ef6... +commandFailed=\u547d\u4ee4 {0} \u5931\u8d25: +commandHelpFailedForPlugin=\u672a\u80fd\u83b7\u53d6\u6b64\u63d2\u4ef6\u7684\u5e2e\u52a9:{0} +commandNotLoaded=\u00a74 {0} \u547d\u4ee4\u52a0\u8f7d\u5931\u8d25 +compassBearing=\u00a76\u65b9\u5411:{0}\uff08{1}\u5ea6\uff09 +configFileMoveError=\u79fb\u52a8config.yml\u6587\u4ef6\u5230\u5907\u4efd\u4f4d\u7f6e\u5931\u8d25 +configFileRenameError=\u91cd\u547d\u540d\u7f13\u5b58\u6587\u4ef6\u4e3aconfig.yml\u5931\u8d25 +connectedPlayers=\u00a76\u76ee\u524d\u5728\u7ebf: \u00a7r +connectionFailed=\u8fde\u63a5\u5931\u8d25. +cooldownWithMessage=\u00a74\u51b7\u5374\u65f6\u95f4:{0} +corruptNodeInConfig=\u00a74\u6ce8\u610f:\u4f60\u7684\u914d\u7f6e\u5185\u5b58\u5728\u4e00\u4e2a\u635f\u574f\u7684 {0} \u8282\u70b9 +couldNotFindTemplate=\u00a74\u65e0\u6cd5\u627e\u5230\u6a21\u7248 {0} +creatingConfigFromTemplate=\u4ece\u6a21\u7248:{0} \u521b\u5efa\u914d\u7f6e +creatingEmptyConfig=\u521b\u5efa\u7a7a\u7684\u914d\u7f6e:{0} +creative=\u521b\u9020\u6a21\u5f0f +currency={0}{1} +currentWorld=\u00a76\u5f53\u524d\u4e16\u754c:\u00a74 {0} +day=\u5929 +days=\u5929 +defaultBanReason=\u767b\u5f55\u5931\u8d25!\u60a8\u7684\u5e10\u53f7\u5df2\u88ab\u6b64\u670d\u52a1\u5668\u5c01\u7981! +deleteFileError=\u65e0\u6cd5\u5220\u9664\u6587\u4ef6:{0} +deleteHome=\u00a76\u5bb6 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deleteJail=\u00a76\u76d1\u72f1 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deleteWarp=\u00a76\u5730\u6807 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deniedAccessCommand=\u00a7c{0} \u00a74\u88ab\u62d2\u7edd\u4f7f\u7528\u547d\u4ee4 +denyBookEdit=\u00a74\u4f60\u4e0d\u80fd\u89e3\u9501\u8fd9\u672c\u4e66. +denyChangeAuthor=\u00a74\u4f60\u4e0d\u80fd\u6539\u53d8\u8fd9\u672c\u4e66\u7684\u4f5c\u8005. +denyChangeTitle=\u00a74\u4f60\u4e0d\u80fd\u6539\u53d8\u8fd9\u672c\u4e66\u7684\u6807\u9898. +dependancyDownloaded=[Essentials\u63d2\u4ef6] \u9644\u5c5e\u6587\u4ef6 {0} \u4e0b\u8f7d\u6210\u529f +dependancyException=[Essentials\u63d2\u4ef6] \u4e0b\u8f7d\u9644\u5c5e\u6587\u4ef6\u65f6\u53d1\u751f\u9519\u8bef +dependancyNotFound=[Essentials\u63d2\u4ef6] \u672a\u627e\u5230\u4e00\u4e2a\u6240\u9700\u7684\u9644\u5c5e\u6587\u4ef6,\u5f00\u59cb\u81ea\u52a8\u4e0b\u8f7d +depth=\u00a76\u4f60\u4f4d\u4e8e\u6d77\u62d40\u683c\u5904 +depthAboveSea=\u00a76\u4f60\u4f4d\u4e8e\u6d77\u62d4\u6b63\u00a7c{0}\u00a76\u683c\u5904 +depthBelowSea=\u00a76\u4f60\u4f4d\u4e8e\u6d77\u62d4\u8d1f\u00a7c{0}\u00a76\u683c\u5904 +destinationNotSet=\u76ee\u7684\u5730\u672a\u8bbe\u7f6e. +disableUnlimited=\u00a76\u53d6\u6d88\u4e86 {1} \u7684\u65e0\u9650\u653e\u7f6e \u00a7c{0} \u00a76\u7684\u80fd\u529b +disabled=\u5173\u95ed +disabledToSpawnMob=\u00a74\u5df2\u7981\u6b62\u6b64\u751f\u7269\u7684\u751f\u6210. +distance=\u00a76\u8ddd\u79bb: {0} +dontMoveMessage=\u00a76\u4f20\u9001\u5c06\u5728{0}\u5185\u5f00\u59cb.\u4e0d\u8981\u79fb\u52a8 +downloadingGeoIp=\u4e0b\u8f7dGeoIP\u6570\u636e\u5e93\u4e2d +duplicatedUserdata=\u590d\u5236\u4e86\u73a9\u5bb6\u5b58\u6863:{0} \u548c {1} +durability=\u00a76\u8fd9\u4e2a\u5de5\u5177\u8fd8\u6709 \u00a74{0}\u00a76 \u6301\u4e45 +enableUnlimited=\u00a76\u7ed9\u4e88\u4e86 \u00a7c{1} \u00a76\u7684\u65e0\u9650\u653e\u7f6e \u00a7c{0} \u00a76\u7684\u80fd\u529b +enableUnlimited=\u00a76\u65e0\u9650\u5236\u7684\u00a7c {0} \u00a76\u5df2\u7ecf\u7ed9\u4e0e {1}. +enabled=\u5f00\u542f +enchantmentApplied = \u00a76\u9644\u9b54 \u00a7c{0} \u00a76\u5df2\u88ab\u5e94\u7528\u5230\u4f60\u624b\u4e2d\u7684\u5de5\u5177. +enchantmentNotFound = \u00a74\u672a\u627e\u5230\u8be5\u9644\u9b54. +enchantmentPerm = \u00a74\u4f60\u6ca1\u6709\u8fdb\u884c\u00a7c {0} \u00a74\u9644\u9b54\u7684\u6743\u9650. +enchantmentRemoved = \u00a76\u9644\u9b54 \u00a7c{0} \u00a76\u5df2\u4ece\u4f60\u624b\u4e0a\u7684\u5de5\u5177\u79fb\u9664 +enchantments = \u00a76\u9644\u9b54: \u00a7r{0} +errorCallingCommand=\u9519\u8bef\u7684\u547c\u53eb\u547d\u4ee4:/{0} +errorWithMessage=\u00a7c\u9519\u8bef:{0} +essentialsHelp1=Essentials\u65e0\u6cd5\u5c06\u5176\u6253\u5f00 +essentialsHelp2=Essentials\u65e0\u6cd5\u5c06\u5176\u6253\u5f00 +essentialsReload=\u00a76Essentials \u5df2\u91cd\u65b0\u8f7d\u5165\u00a7c{0} +exp=\u00a74{0} \u00a76\u62e5\u6709\u00a7c {1} \u00a76\u7ecf\u9a8c\u503c (\u7b49\u7ea7\u00a7c {2}\u00a76) \u9700\u8981\u00a7c {3} \u00a76\u7ecf\u9a8c\u624d\u80fd\u5347\u7ea7. +expSet=\u00a7c\u4f60\u5c06{0} \u00a76\u7684\u7ecf\u9a8c\u8bbe\u7f6e\u4e3a\u00a7c {1} \u00a76\u7ecf\u9a8c\u503c. +extinguish=\u00a76\u4f60\u7184\u706d\u4e86\u4f60\u81ea\u5df1\u8eab\u4e0a\u7684\u706b +extinguishOthers=\u00a76\u4f60\u7184\u706d\u4e86 {0} \u00a76\u8eab\u4e0a\u7684\u706b +failedToCloseConfig=\u5173\u95ed\u914d\u7f6e {0} \u5931\u8d25 +failedToCreateConfig=\u521b\u5efa\u914d\u7f6e {0} \u5931\u8d25 +failedToWriteConfig=\u5199\u5165\u914d\u7f6e {0} \u5931\u8d25 +false=\u00a74\u5426\u00a7r +feed=\u5df2\u7ecf\u9971\u548c,\u65e0\u6cd5\u589e\u52a0\u9965\u997f\u5ea6. +feedOther=\u00a76\u5df2\u7ecf\u9971\u548c{0}. +fileRenameError=\u91cd\u547d\u540d\u6587\u4ef6 {0} \u5931\u8d25 +fireworkColor=\u00a74\u4f7f\u7528\u4e86\u65e0\u6548\u7684\u70df\u82b1\u586b\u5145\u53c2\u6570\uff0c\u5fc5\u987b\u9996\u5148\u8bbe\u7f6e\u4e00\u4e2a\u989c\u8272\u3002 +fireworkEffectsCleared=\u00a76\u4ece\u6301\u6709\u7684\u7269\u54c1\u4e2d\u79fb\u9664\u4e86\u6240\u6709\u7279\u6548. +fireworkSyntax=\u00a76\u70df\u82b1\u53c2\u6570:\u00a7c color:<\u989c\u8272> [fade:<\u6de1\u51fa\u989c\u8272>] [shape:<\u5f62\u6001>] [effect:<\u7279\u6548>]\n\u00a76\u8981\u4f7f\u7528\u591a\u4e2a\u989c\u8272/\u7279\u6548, \u4f7f\u7528\u9017\u53f7: \u00a7cred,blue,pink\n\u00a76\u5f62\u72b6:\u00a7c star, ball, large, creeper, burst \u00a76\u7279\u6548:\u00a7c trail, twinkle. +flyMode=\u00a76 \u5df2\u4e3a\u00a7c{1}\u00a76\u8bbe\u7f6e\u4e86\u98de\u884c\u6a21\u5f0f\u4e3a\u00a7c{0}. +flying=\u98de\u884c\u4e2d +foreverAlone=\u00a74\u4f60\u6ca1\u6709\u53ef\u56de\u590d\u7684\u73a9\u5bb6 +freedMemory=\u91ca\u653e\u4e86 {0} MB +fullStack=\u00a74\u4f60\u7684\u7269\u54c1\u5df2\u7ecf\u6700\u591a\u4e86. +gameMode=\u00a76\u5df2\u8bbe\u7f6e{1}\u7684\u6e38\u620f\u6a21\u5f0f\u4e3a{0}. +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 \u533a\u5757, \u00a7c{3}\u00a76 \u5b9e\u4f53. +gcfree=\u7a7a\u95f2\u5185\u5b58: \u00a7c{0} MB +gcmax=\u6700\u5927\u5185\u5b58: \u00a7c{0} MB +gctotal=\u5df2\u5206\u914d\u5185\u5b58: \u00a7c{0} MB +geoIpUrlEmpty=GeoIP\u4e0b\u8f7d\u94fe\u63a5\u4e3a\u7a7a +geoIpUrlInvalid=GeoIP\u4e0b\u8f7d\u94fe\u63a5\u5931\u6548 +geoipJoinFormat=\u73a9\u5bb6 {0} \u6765\u81ea\u4e8e {1} +giveSpawn=\u00a76\u7ed9\u4e88\u00a7c {2} \u00a76 \u00a7c {0} \u4e2a\u00a7c {1}\u00a76. +godDisabledFor=\u00a74\u53d6\u6d88\u4e86 \u00a7c{0} \u00a76\u7684\u4e0a\u5e1d\u6a21\u5f0f +godEnabledFor=\u00a74\u5f00\u542f\u4e86\u00a7c {0} \u00a76\u7684\u4e0a\u5e1d\u6a21\u5f0f +godMode=\u00a76\u4e0a\u5e1d\u6a21\u5f0f \u00a7c{0} +groupNumber=\u00a7c{0}\u00a7f \u5728\u7ebf, \u60f3\u8981\u83b7\u53d6\u5168\u90e8\u4f7f\u7528:\u00a7c /{1} {2} +groupDoesNotExist=\u00a74\u5f53\u524d\u7ec4\u6ca1\u6709\u4eba\u5728\u7ebf! +hatArmor=\u00a74\u9519\u8bef:\u4f60\u65e0\u6cd5\u4f7f\u7528\u8fd9\u4e2a\u7269\u54c1\u4f5c\u4e3a\u5e3d\u5b50! +hatEmpty=\u00a74\u4f60\u73b0\u5728\u8fd8\u6ca1\u6709\u6234\u5e3d\u5b50. +hatFail=\u00a74\u4f60\u5fc5\u987b\u628a\u60f3\u8981\u5e26\u7684\u5e3d\u5b50\u62ff\u5728\u624b\u4e2d. +hatPlaced=\u00a7e\u4eab\u53d7\u4f60\u7684\u65b0\u5e3d\u5b50\u628a! +hatRemoved=\u00a76\u4f60\u7684\u5e3d\u5b50\u5df2\u79fb\u9664. +haveBeenReleased=\u00a76\u4f60\u5df2\u88ab\u91ca\u653e +heal=\u00a76\u4f60\u5df2\u88ab\u6cbb\u7597 +healDead=\u00a74\u4f60\u4e0d\u80fd\u6cbb\u7597\u4e00\u4e2a\u6b7b\u4eba! +healOther=\u00a76\u5df2\u6cbb\u7597\u00a7c {0} +helpConsole=\u4ece\u63a7\u5236\u53f0\u67e5\u770b\u5e2e\u52a9,\u8bf7\u8f93\u5165\u201c?\u201d +helpFrom=\u00a76\u6765\u81ea\u4e8e {0} \u7684\u6307\u4ee4 +helpLine=\u00a76/{0}\u00a7r: {1} +helpMatching=\u00a76\u6307\u4ee4\u8fde\u63a5 "\u00a7c{0}\u00a76": +helpOp=\u00a74[\u6c42\u52a9OP]\u00a7r \u00a76{0}:\u00a7r {1} +helpPages=\u00a76\u7b2c \u00a7c{0}\u00a76 \u9875/\u5171 \u00a7c{1}\u00a76 \u9875: +helpPlugin=\u00a74{0}\u00a7r: \u63d2\u4ef6\u5e2e\u52a9: /help {1} +holeInFloor=\u00a74\u76ee\u6807\u811a\u4e0b\u662f\u865a\u7a7a +holdFirework=\u00a74\u4f60\u5fc5\u987b\u62ff\u7740\u70df\u706b\u624d\u80fd\u589e\u52a0\u7279\u6548. +holdPotion=\u00a74\u4f60\u5fc5\u987b\u62ff\u7740\u836f\u6c34\u624d\u80fd\u589e\u52a0\u7279\u6548. +holeInFloor=\u00a74\u5730\u677f\u6709\u6d1e! +homeSet=\u00a76\u5df2\u8bbe\u7f6e\u5bb6~ +homeSetToBed=\u00a76\u4f60\u7684\u5bb6\u5df2\u88ab\u8bbe\u4e3a\u6b64\u5e8a +homes=\u00a76\u5bb6:\u00a7r{0} +hour=\u5c0f\u65f6 +hours=\u5c0f\u65f6 +ignorePlayer=\u00a76\u4f60\u5c4f\u853d\u4e86\u73a9\u5bb6 \u00a7c{0} +illegalDate=\u9519\u8bef\u7684\u65e5\u671f\u683c\u5f0f +infoChapter=\u9009\u62e9\u7ae0\u8282: +infoChapterPages=\u00a76\u7ae0\u8282 {0},\u7b2c \u00a7c{1}\u00a76 \u9875/\u5171 \u00a7c{2}\u00a76: +infoFileDoesNotExist=\u6587\u4ef6info.txt\u4e0d\u5b58\u5728,\u5c06\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u6587\u4ef6 +infoPages=\u00a7e----\u7b2c \u00a7c{0}\u00a7e \u9875/\u5171 \u00a7c{1}\u00a7e \u9875---- +infoUnknownChapter=\u672a\u77e5\u7ae0\u8282 +invBigger=\u00a74\u5176\u4ed6\u73a9\u5bb6\u7684\u80cc\u5305\u6bd4\u4f60\u7684\u66f4\u5927 +invRestored=\u00a76\u4f60\u7684\u80cc\u5305\u5df2\u88ab\u6062\u590d +invSee=\u00a76\u4f60\u67e5\u770b\u4e86\u00a7c {0} \u00a76\u7684\u80cc\u5305 +invSeeHelp=\u00a76\u4f7f\u7528\u201c/invsee\u201d\u91cd\u65b0\u67e5\u770b\u81ea\u5df1\u7684\u80cc\u5305 +invalidCharge=\u00a74\u65e0\u6548\u7684\u4ef7\u683c +invalidFireworkFormat=\u00a76\u8fd9\u4e2a\u9009\u9879 \u00a74{0} \u00a76\u5bf9 \u00a74{1}\u00a76 \u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u503c \u00a76. +invalidHome=\u00a74\u5bb6\u00a7c {0} \u00a74\u4e0d\u5b58\u5728! +invalidMob=\u65e0\u6548\u7684\u52a8\u7269\u79cd\u7c7b +invalidServer=\u65e0\u6548\u7684\u670d\u52a1\u5668\uff01 +invalidSignLine=\u00a74\u724c\u5b50\u4e0a\u7684\u7b2c \u00a7c{0} \u00a74\u884c\u65e0\u6548 +invalidWorld=\u00a74\u65e0\u6548\u7684\u4e16\u754c +inventoryCleared=\u00a76\u80cc\u5305\u5df2\u6e05\u7a7a +inventoryClearedOthers=\u00a7c{0}\u00a76 \u7684\u80cc\u5305\u5df2\u88ab\u6e05\u7a7a +invalidWarpName=\u00a74\u65e0\u6548\u7684\u4f20\u9001\u70b9\u540d\u79f0! +invalidWorld=\u00a74\u65e0\u6548\u7684\u4e16\u754c\u540d. +inventoryCleared=\u00a76\u5305\u88f9\u5df2\u6e05\u7a7a. +inventoryClearedAll=\u00a76\u6240\u6709\u4eba\u7684\u5305\u88f9\u5df2\u6e05\u7a7a. +inventoryClearedOthers=\u00a7c{0}\u00a76\u7684\u5305\u88f9\u5df2\u6e05\u7a7a. +is=\u662f +itemCannotBeSold=\u00a74\u8be5\u7269\u54c1\u65e0\u6cd5\u5356\u7ed9\u670d\u52a1\u5668 +itemMustBeStacked=\u00a74\u7269\u54c1\u5fc5\u987b\u6210\u7ec4\u4ea4\u6613,2s\u7684\u6570\u91cf\u662f2\u7ec4,\u4ee5\u6b64\u7c7b\u63a8 +itemNames=\u00a76\u7269\u54c1\u7b80\u6613\u540d\u79f0:\u00a7r {0} +itemNotEnough1=\u00a74\u4f60\u6ca1\u6709\u8db3\u591f\u7684\u8be5\u7269\u54c1\u6765\u5356\u51fa +itemNotEnough2=\u00a76\u5982\u679c\u4f60\u60f3\u8981\u5356\u6389\u6240\u6709\u4f60\u80cc\u5305\u5185\u7684\u8be5\u7269\u54c1,\u4f7f\u7528\u201c/sell \u7269\u54c1\u540d\u79f0\uff08\u82f1\u6587,\u6216ID\uff09\u201d +itemNotEnough3=\u00a76\u201c/sell \u7269\u54c1\u540d\u79f0 -1\u201d\u5c06\u4f1a\u7559\u51fa\u4e00\u4e2a\u800c\u5356\u6389\u5176\u5b83\u8be5\u79cd\u7269\u54c1,\u4ee5\u6b64\u7c7b\u63a8 +itemSellAir=\u4f60\u96be\u9053\u60f3\u5356\u7a7a\u6c14\u5417\uff1f\u653e\u4e2a\u4e1c\u897f\u5728\u4f60\u624b\u91cc +itemSold=\u00a7a\u83b7\u5f97 \u00a7c {0} \u00a7a \uff08{1} \u5355\u4f4d{2},\u6bcf\u4e2a\u4ef7\u503c {3}\uff09 +itemSoldConsole=\u00a7c{0} \u00a76\u5356\u51fa\u4e86 {1},\u83b7\u5f97\u4e86\u00a76 {2} \u00a76 \uff08{3} \u5355\u4f4d\u7269\u54c1,\u6bcf\u4e2a\u4ef7\u503c {4}\uff09 +itemSpawn=\u00a76\u751f\u6210 {0} \u4e2a {1} +itemType=\u00a76\u7269\u54c1:\u00a7c {0} \u00a76-\u00a74 {1} +itemsCsvNotLoaded=\u65e0\u6cd5\u52a0\u8f7ditems.csv +jailAlreadyIncarcerated=\u00a74\u5df2\u5728\u76d1\u72f1\u4e2d\u7684\u73a9\u5bb6:{0} +jailMessage=\u00a74\u8bf7\u5728\u76d1\u72f1\u4e2d\u9762\u58c1\u601d\u8fc7\uff01 +jailNotExist=\u00a74\u8be5\u76d1\u72f1\u4e0d\u5b58\u5728 +jailReleased=\u00a76\u73a9\u5bb6 \u00a7c{0}\u00a76 \u51fa\u72f1\u4e86 +jailReleasedPlayerNotify=\u00a76\u4f60\u5df2\u88ab\u91ca\u653e\uff01 +jailSentenceExtended=\u00a76\u56da\u7981\u65f6\u95f4\u589e\u52a0\u5230:{0) +jailSet=\u00a76\u76d1\u72f1 {0} \u5df2\u88ab\u8bbe\u7f6e +jumpError=\u00a74\u8fd9\u5c06\u4f1a\u635f\u5bb3\u4f60\u7684\u7535\u8111 +kickDefault=\u4ece\u670d\u52a1\u5668\u8bf7\u51fa +kickExempt=\u00a74\u4f60\u65e0\u6cd5\u8bf7\u51fa\u8be5\u73a9\u5bb6. +kickedAll=\u00a74\u5df2\u5c06\u6240\u6709\u73a9\u5bb6\u8bf7\u51fa\u670d\u52a1\u5668. +kill=\u00a76\u6740\u6b7b\u4e86 \u00a7c{0} +killExempt=\u00a74\u4f60\u4e0d\u80fd\u6740\u6b7b {0} +kitError2=\u00a74\u8be5\u5de5\u5177\u5305\u53ef\u80fd\u4e0d\u5b58\u5728\u6216\u8005\u88ab\u62d2\u7edd\u4e86. +kitError=\u00a74\u6ca1\u6709\u6709\u6548\u7684\u5de5\u5177\u5305 +kitErrorHelp=\u00a74\u6216\u8bb8\u4e00\u4e2a\u7269\u54c1\u5728\u8bbe\u7f6e\u6587\u4ef6\u91cc\u672a\u88ab\u8bbe\u7f6e\u6570\u91cf\uff1f +kitGive=\u00a76\u83b7\u53d6\u5de5\u5177\u5305\u00a7c {0} +kitGiveTo=\u00a76\u6210\u529f\u53d1\u9001\u5de5\u5177\u5305\u00a7c {0}\u00a76 \u7ed9 {1}\u00a7. +kitInvFull=\u00a74\u4f60\u7684\u80cc\u5305\u5df2\u6ee1,\u5de5\u5177\u5305\u5c06\u653e\u5728\u5730\u4e0a +kitTimed=\u00a74\u51b7\u5374\u65f6\u95f4\u00a7c {0}. +kitReceive=\u00a76\u6536\u5230\u4e00\u4e2a\u00a7c {0} \u00a76\u5de5\u5177\u5305. +kitTimed=\u00a74You can''t use that kit again for another\u00a7c {0}\u00a74. +kits=\u00a76\u5de5\u5177\u5305:\u00a7r{0} +leatherSyntax=\u00a76\u76ae\u9769\u989c\u8272\u8bed\u6cd5: color:,, \u5982: color:255,0,0. +lightningSmited=\u00a76\u4f60\u521a\u521a\u88ab\u96f7\u51fb\u4e2d\u4e86 +lightningUse=\u00a76\u96f7\u51fb\u4e2d\u4e86\u00a7c {0} +listAfkTag = \u00a77[\u79bb\u5f00]\u00a7r +listAmount = \u00a76\u5f53\u524d\u6709 \u00a7c{0}\u00a76 \u4e2a\u73a9\u5bb6\u5728\u7ebf,\u6700\u5927\u5728\u7ebf\u4eba\u6570\u4e3a \u00a7c{1}\u00a76 \u4e2a\u73a9\u5bb6. +listAmountHidden = \u00a76\u5f53\u524d\u6709 \u00a7c{0}\u00a76/{1}\u00a76 \u4e2a\u73a9\u5bb6\u5728\u7ebf,\u6700\u5927\u5728\u7ebf\u4eba\u6570 \u00a7c{2}\u00a76 \u4e2a\u73a9\u5bb6 +listGroupTag={0}\u00a7r: +listHiddenTag = \u00a77[\u9690\u8eab]\u00a7r +loadWarpError=\u00a74\u52a0\u8f7d\u5730\u6807 {0} \u5931\u8d25 +localFormat=\u4f4d\u7f6e:<{0}> {1} +mailClear=\u00a76\u82e5\u8981\u6807\u8bb0\u4f60\u7684\u90ae\u4ef6\u4e3a\u5df2\u8bfb,\u8f93\u5165\u201c/mail clear\u201d +mailCleared=\u00a76\u90ae\u7bb1\u5df2\u6e05\u7a7a\uff01 +mailSent=\u00a76\u90ae\u4ef6\u5df2\u53d1\u51fa\uff01 +markMailAsRead=\u00a76\u82e5\u8981\u6807\u8bb0\u4f60\u7684\u90ae\u4ef6\u4e3a\u5df2\u8bfb,\u8f93\u5165\u201c/mail clear\u201d +markedAsAway=\u00a76\u4f60\u5df2\u8bbe\u7f6e\u79bb\u5f00. +markedAsNotAway=\u00a76\u4f60\u5df2\u8bbe\u7f6e\u53d6\u6d88\u79bb\u5f00. +matchingIPAddress=\u00a76\u4ee5\u4e0b\u662f\u6765\u81ea\u8be5IP\u5730\u5740\u7684\u73a9\u5bb6: +maxHomes=\u00a74\u4f60\u65e0\u6cd5\u8bbe\u7f6e\u8d85\u8fc7 {0} \u4e2a\u5bb6. +mayNotJail=\u00a74\u4f60\u65e0\u6cd5\u56da\u7981\u8be5\u73a9\u5bb6 +me=\u6211 +messageTruncated=\u00a74\u6d88\u606f\u88ab\u622a\u65ad, \u60f3\u8981\u770b\u5230\u5b8c\u6574\u7684\u4fe1\u606f\u8bf7\u8f93\u5165:\u00a7c /{0} {1} +minute=\u5206\u949f +minutes=\u5206\u949f +missingItems=\u00a74\u4f60\u6ca1\u6709 {0}x {1}. +missingPrefixSuffix=\u5931\u53bb\u4e86\u4e00\u4e2a\u524d\u7f00\u6216\u5c3e\u7f00\u4e8e {0} +mobSpawnError=\u00a74\u66f4\u6539\u5237\u602a\u7b3c\u65f6\u53d1\u751f\u9519\u8bef +mobSpawnLimit=\u751f\u7269\u6570\u91cf\u592a\u591a,\u65e0\u6cd5\u751f\u6210 +mobSpawnTarget=\u00a74\u76ee\u6807\u65b9\u5757\u5fc5\u987b\u662f\u4e00\u4e2a\u5237\u602a\u7b3c +mobsAvailable=\u00a76\u751f\u7269:\u00a7r {0} +moneyRecievedFrom=\u00a7a\u5df2\u4ece {1} \u63a5\u6536{0} +moneySentTo=\u00a7a{0} \u5df2\u53d1\u9001\u5230 {1} +moneyTaken=\u00a7a{0} \u5df2\u4ece\u4f60\u7684\u8d26\u6237\u4e2d\u6263\u9664 +month=\u6708 +months=\u6708 +moreThanZero=\u00a74\u6570\u91cf\u5fc5\u987b\u5927\u4e8e0 +moveSpeed=\u00a76\u4e3a\u00a7c{2}\u00a76\u8bbe\u7f6e\u00a7c {0} \u00a76\u901f\u5ea6\u4e3a\u00a7c {1} \u00a76. +msgFormat=\u00a76[{0}\u00a76 -> {1}\u00a76] \u00a7r{2} +multipleCharges=\u00a74\u60a8\u4e0d\u80fd\u5bf9\u8fd9\u4e2a\u70df\u82b1\u5e94\u7528\u591a\u4e8e\u4e00\u4e2a\u7684\u88c5\u6599. +multiplePotionEffects=\u00a74\u60a8\u4e0d\u80fd\u5bf9\u8fd9\u4e2a\u70df\u82b1\u5e94\u7528\u591a\u4e8e\u4e00\u4e2a\u7684\u6548\u679c. +muteExempt=\u00a74\u4f60\u65e0\u6cd5\u7981\u8a00\u8be5\u73a9\u5bb6 +muteNotify=\u00a74{0} \u00a76\u5df2\u88ab\u7981\u8a00 \u00a74{1}\u00a76. +mutedPlayer=\u00a76\u73a9\u5bb6 {0} \u00a76\u88ab\u7981\u8a00 +mutedPlayerFor=\u00a76\u73a9\u5bb6 {0} \u00a76\u88ab\u7981\u8a00 \u65f6\u95f4:{1} +mutedUserSpeaks={0} \u60f3\u8981\u8bf4\u8bdd,\u4f46\u88ab\u7981\u8a00\u4e86 +nearbyPlayers=\u00a76\u9644\u8fd1\u7684\u73a9\u5bb6: {0} +negativeBalanceError=\u00a74\u73b0\u91d1\u4e0d\u53ef\u5c0f\u4e8e\u96f6 +nickChanged=\u00a76\u6635\u79f0\u5df2\u66f4\u6362 +nickDisplayName=\u00a74\u4f60\u9700\u8981\u6fc0\u6d3bchange-displayname.\u8be5\u6587\u4ef6\u5728Essentials\u8bbe\u7f6e\u6587\u4ef6\u4e2d +nickInUse=\u00a74\u90a3\u4e2a\u6635\u79f0\u5df2\u88ab\u4f7f\u7528 +nickNamesAlpha=\u00a74\u6635\u79f0\u5fc5\u987b\u4e3a\u5b57\u6bcd\u6216\u6570\u5b57. +nickNoMore=\u00a76\u4f60\u4e0d\u518d\u62e5\u6709\u4e00\u4e2a\u6635\u79f0 +nickOthersPermission=\u00a74\u4f60\u6ca1\u6709\u66f4\u6539\u522b\u4eba\u6635\u79f0\u7684\u6743\u9650 +nickSet=\u00a76\u4f60\u7684\u6635\u79f0\u73b0\u5728\u662f \u00a74{0} +noAccessCommand=\u00a74\u4f60\u6ca1\u6709\u4f7f\u7528\u8be5\u547d\u4ee4\u7684\u6743\u9650 +noAccessPermission=\u00a74\u4f60\u6ca1\u6709\u4f7f\u7528 {0} \u7684\u6743\u9650 +noBreakBedrock=\u00a74\u4f60\u4e0d\u80fd\u6467\u6bc1\u57fa\u5ca9\uff01 +noChapterMeta=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u521b\u5efa\u52a8\u6001\u4e66\u672c. +noDestroyPermission=\u00a74\u4f60\u6ca1\u6709\u7834\u574f {0} \u7684\u6743\u9650 +noDurability=\u00a74\u8fd9\u4e2a\u7269\u54c1\u6ca1\u6709\u8010\u4e45. +noGodWorldWarning=\u00a74\u7981\u6b62\u4f7f\u7528\u4e0a\u5e1d\u6a21\u5f0f. +noHelpFound=\u00a74\u6ca1\u6709\u5339\u914d\u7684\u547d\u4ee4 +noHomeSet=\u4f60\u8fd8\u672a\u8bbe\u7f6e\u5bb6 +noHomeSetPlayer=\u00a76\u8be5\u73a9\u5bb6\u8fd8\u672a\u8bbe\u7f6e\u5bb6 +noKitPermission=\u00a74\u4f60\u9700\u8981 \u00a74{0}\u00a74 \u6743\u9650\u6765\u4f7f\u7528\u8be5\u5de5\u5177 +noKits=\u00a76\u8fd8\u6ca1\u6709\u53ef\u83b7\u5f97\u7684\u5de5\u5177 +noMail=\u4f60\u6ca1\u6709\u4efb\u4f55\u90ae\u4ef6 +noMatchingPlayers=\u00a76\u627e\u4e0d\u5230\u5339\u914d\u7684\u73a9\u5bb6. +noMetaFirework=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u5e94\u7528\u70df\u82b1\u6570\u636e. +noMetaPerm=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u5e94\u7528 \u00a7c{0}\u00a74 \u7684\u6570\u636e. +noMotd=\u00a76\u4eca\u65e5\u6ca1\u6709\u516c\u544a +noNewMail=\u00a76\u4f60\u6ca1\u6709\u65b0\u7684\u90ae\u4ef6 +noPendingRequest=\u00a74\u4f60\u6ca1\u6709\u5f85\u89e3\u51b3\u7684\u8bf7\u6c42 +noPerm=\u00a74\u4f60\u6ca1\u6709 \u00a7c{0}\u00a74 \u6743\u9650 +noPermToSpawnMob=\u00a74\u4f60\u6ca1\u6709\u751f\u6210\u8be5\u751f\u7269\u7684\u6743\u9650 +noPlacePermission=\u00a74\u00a74\u4f60\u6ca1\u6709\u5728\u90a3\u4e2a\u724c\u5b50\u65c1\u8fb9\u653e\u65b9\u5757\u7684\u6743\u5229 +noPowerTools=\u00a76\u4f60\u6ca1\u6709\u7ed1\u5b9a\u547d\u4ee4 +noRules=\u00a74\u6ca1\u6709\u6307\u5b9a\u7684\u6761\u89c4 +noWarpsDefined=\u00a74\u6ca1\u6709\u786e\u5b9a\u7684\u5730\u6807 +none=\u65e0 +notAllowedToQuestion=\u00a74\u4f60\u672a\u88ab\u6388\u6743\u4f7f\u7528\u63d0\u95ee\u53d1\u8a00 +notAllowedToShout=\u00a74\u4f60\u672a\u88ab\u6388\u6743\u4f7f\u7528\u558a\u8bdd\u53d1\u8a00 +notEnoughExperience=\u00a74\u4f60\u6ca1\u6709\u8db3\u591f\u7684\u7ecf\u9a8c\u503c +notEnoughMoney=\u00a74\u4f60\u6ca1\u6709\u8db3\u591f\u7684\u8d44\u91d1 +notFlying=\u672a\u98de\u884c +notRecommendedBukkit= \u00a74Bukkit\u7248\u672c\u8fc7\u65e7.\u5efa\u8bae\u66f4\u65b0. +notSupportedYet=\u6682\u4e0d\u652f\u6301 +nothingInHand = \u00a74\u4f60\u6ca1\u6709\u6301\u6709\u4efb\u4f55\u7269\u54c1 +now=\u73b0\u5728 +nuke=\u00a7d\u6838\u6b66\u964d\u843d,\u6ce8\u610f\u9690\u853d\uff01 +numberRequired=\u9700\u8981\u8f93\u5165\u6570\u5b57\uff01 +onlyDayNight=/time \u547d\u4ee4\u53ea\u6709 day/night \u4e24\u4e2a\u9009\u62e9 +onlyPlayerSkulls=\u00a74\u4f60\u53ea\u80fd\u8bbe\u7f6e\u4eba\u5934\u7684\u4e3b\u4eba (397:3). +onlyPlayers=\u00a74\u53ea\u6709\u6e38\u620f\u4e2d\u73a9\u5bb6\u624d\u53ef\u4f7f\u7528 {0} +onlySunStorm=\u00a74/weather \u547d\u4ee4\u53ea\u6709 sun/storm \u4e24\u4e2a\u9009\u62e9 +orderBalances=\u00a76\u6392\u5e8f {0} \u00a76\u4e2a\u73a9\u5bb6\u7684\u8d44\u91d1\u4e2d,\u8bf7\u7a0d\u5019\u2026\u2026 +oversizedTempban=\u00a74\u4f60\u53ef\u80fd\u6ca1\u6709\u5728\u8fd9\u4e2a\u65f6\u6bb5\u5c01\u7981\u73a9\u5bb6. +pTimeCurrent=\u00a76{0}\u00a7c \u00a76\u7684\u65f6\u95f4\u662f \u00a7c{1} +pTimeCurrentFixed=\u00a7c{0}\u00a76 \u7684\u65f6\u95f4\u88ab\u8fde\u63a5\u5230 \u00a7c{1} +pTimeNormal=\u00a7c{0}\u00a76 \u7684\u65f6\u95f4\u662f\u6b63\u5e38\u7684\u5e76\u4e0e\u670d\u52a1\u5668\u540c\u6b65 +pTimeOthersPermission=\u00a74\u4f60\u672a\u88ab\u6388\u6743\u8bbe\u7f6e\u5176\u4ed6\u73a9\u5bb6\u7684\u65f6\u95f4 +pTimePlayers=\u00a76\u8fd9\u4e9b\u73a9\u5bb6\u6709\u4ed6\u4eec\u81ea\u5df1\u7684\u65f6\u95f4: +pTimeReset=\u00a76\u8be5\u73a9\u5bb6\u7684\u65f6\u95f4\u88ab\u91cd\u7f6e:\u00a7c{0} +pTimeSet=\u00a76\u8be5\u73a9\u5bb6\u7684\u65f6\u95f4\u88ab\u8bbe\u5b9a\u4e3a \u00a7c{0}\u00a76 \u5bf9\u8c61:\u00a7c{1} +pTimeSetFixed=\u00a76\u8be5\u73a9\u5bb6\u65f6\u95f4\u88ab\u8fde\u63a5\u5230 \u00a7c{0}\u00a76 \u5bf9\u8c61:\u00a7c{1} +parseError=\u00a74\u89e3\u6790\u00a7c {0} \u00a74\u4e8e\u7b2c \u00a7c{1}\u00a74 \u884c\u65f6\u53d1\u751f\u9519\u8bef +pendingTeleportCancelled=\u00a74\u5f85\u5904\u7406\u7684\u4f20\u9001\u8bf7\u6c42\u5df2\u53d6\u6d88 +permissionsError=\u672a\u627e\u5230Permissions/GroupManager\u63d2\u4ef6\uff1b\u804a\u5929\u7684 \u524d\u7f00/\u5c3e\u7f00 \u5c06\u4e0d\u8d77\u4f5c\u7528 +playerBanned=\u00a76\u7ba1\u7406\u5458\u00a7c {0}\u00a76 \u5c01\u7981\u4e86 {1},\u00a76\u7406\u7531:{2} +playerInJail=\u00a74\u8be5\u73a9\u5bb6\u5df2\u5728\u76d1\u72f1 {0} +playerJailed=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u88ab\u902e\u6355\u4e86 +playerJailedFor= \u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u88ab\u902e\u6355,\u65f6\u95f4:{1} +playerKicked=\u00a74\u7ba1\u7406\u5458 \u00a7c{0} \u00a76\u8bf7\u51fa\u4e86 \u00a7c{1},\u00a76\u7406\u7531:{2} +playerMuted=\u00a76\u4f60\u88ab\u7981\u6b62\u53d1\u8a00 +playerMutedFor=\u00a76\u4f60\u5df2\u88ab\u7981\u8a00.\u7406\u7531: {0} +playerNeverOnServer=\u00a74\u73a9\u5bb6 \u00a7c{0} \u00a74\u4ece\u6ca1\u51fa\u73b0\u5728\u670d\u52a1\u5668\u8fc7 +playerNotFound=\u00a74\u73a9\u5bb6\u672a\u5728\u7ebf\uff08\u6216\u4e0d\u5b58\u5728\uff09 +playerUnmuted=\u00a76\u4f60\u88ab\u5141\u8bb8\u53d1\u8a00 +pong=\u556a\uff01 +posPitch=\u00a76\u4ef0\u89d2: {0} (\u5934\u90e8\u7684\u89d2\u5ea6) +posX=\u00a76X: {0} (+\u4e1c <-> -\u897f) +posY=\u00a76Y: {0} (+\u4e0a <-> -\u4e0b) +posYaw=\u00a76Yaw: {0} (\u65cb\u8f6c) +posZ=\u00a76Z: {0} (+\u5357 <-> -\u5317) +possibleWorlds=\u00a76\u53ef\u884c\u7684\u4e16\u754c\u6570\u91cf\u4e3a 0 \u5171 {0} +potions=\u00a76\u836f\u6c34:\u00a7r {0}\u00a76. +powerToolAir=\u00a74\u547d\u4ee4\u4e0d\u80fd\u5bf9\u7740\u7a7a\u6c14\u4f7f\u7528. +powerToolAlreadySet=\u00a74\u547d\u4ee4 \u00a7c{0}\u00a74 \u5df2\u88ab\u7ed1\u5b9a\u5230 {1}. +powerToolAttach=\u00a7c{0}\u00a76 \u547d\u4ee4\u88ab\u7ed1\u5b9a\u5230 {1} +powerToolClearAll=\u00a76\u6240\u6709\u5feb\u6377\u547d\u4ee4\u5df2\u88ab\u6e05\u9664 +powerToolList={1} \u6709\u5982\u4e0b\u547d\u4ee4:\u00a74{0}\u00a7r. +powerToolListEmpty={0} \u6ca1\u6709\u88ab\u7ed1\u5b9a\u547d\u4ee4 +powerToolNoSuchCommandAssigned=\u547d\u4ee4 \u00a74{0}\u00a7r \u672a\u88ab\u7ed1\u5b9a\u5230 {1}. +powerToolRemove=\u547d\u4ee4 \u00a74{0}\u00a7r \u88ab\u4ece {1} \u4e0a\u79fb\u9664 +powerToolRemoveAll=\u79fb\u9664\u4e86 {0} \u4e0a\u7684\u6240\u6709\u547d\u4ee4 +powerToolsDisabled=\u4f60\u6240\u6709\u7684\u5feb\u6377\u547d\u4ee4\u88ab\u51bb\u7ed3 +powerToolsEnabled=\u4f60\u6240\u6709\u7684\u5feb\u6377\u547d\u4ee4\u88ab\u6fc0\u6d3b +protectionOwner=\u00a76[Essentials\u4fdd\u62a4] \u7269\u54c1\u62e5\u6709\u8005:\u00a7r{0} +questionFormat=\u00a72[\u63d0\u95ee]\u00a7r {0} +readNextPage=\u00a76\u8f93\u5165 \u00a7c/{0} {1} \u00a76\u6765\u9605\u8bfb\u4e0b\u4e00\u9875 +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=\u8fd9\u4e2a\u7f16\u53f7\u6ca1\u6709\u5339\u914d\u7684\u5408\u6210\u516c\u5f0f. +recipeFurnace=\u00a76\u51b6\u70bc \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 <\u6570\u5b57> \u53bb\u67e5\u770b\u66f4\u591a\u7684 \u00a7c{2}\u00a76\u5408\u6210\u516c\u5f0f. +recipeNone=\u5bf9{0}\u6ca1\u6709\u5339\u914d\u7684\u5408\u6210\u516c\u5f0f +recipeNothing=\u6ca1\u6709\u4e1c\u897f +recipeShapeless=\u00a76\u7ed3\u5408 \u00a7c{0} +recipeWhere=\u00a76\u5f53: {0} +reloadAllPlugins=\u00a76\u91cd\u8f7d\u4e86\u6240\u6709\u63d2\u4ef6 +removed=\u00a76\u79fb\u9664\u4e86\u00a7c {0} \u00a76\u9879 +repair=\u00a76\u4f60\u5df2\u7ecf\u6210\u529f\u7684\u4fee\u590d\u4e86\u4f60\u7684:\u00a7c{0} +repairAlreadyFixed=\u00a74\u8be5\u7269\u54c1\u65e0\u9700\u4fee\u590d +repairEnchanted=\u00a74\u4f60\u65e0\u6743\u4fee\u590d\u9644\u9b54\u7269\u54c1 +repairInvalidType=\u00a74\u8be5\u7269\u54c1\u65e0\u6cd5\u4fee\u590d +repairNone=\u00a74\u8fd9\u91cc\u6ca1\u6709\u9700\u8981\u4fee\u7406\u7684\u7269\u54c1 +requestAccepted=\u00a76\u5df2\u63a5\u53d7\u4f20\u9001\u8bf7\u6c42 +requestAcceptedFrom=\u00a7c{0}\u00a76 \u63a5\u53d7\u4e86\u4f60\u7684\u4f20\u9001\u8bf7\u6c42 +requestDenied=\u00a76\u5df2\u62d2\u7edd\u4f20\u9001\u8bf7\u6c42 +requestDeniedFrom=\u00a7c{0}\u00a76 \u62d2\u7edd\u4e86\u4f60\u7684\u4f20\u9001\u8bf7\u6c42 +requestSent=\u00a76\u8bf7\u6c42\u5df2\u53d1\u9001\u7ed9 {0}\u00a76 +requestTimedOut=\u00a74\u4f20\u9001\u8bf7\u6c42\u8d85\u65f6\u2026\u2026 +requiredBukkit= \u00a76\u4f60\u9700\u8981\u7248\u672c {0} \u4ee5\u4e0a\u7684bukkit.\u8bf7\u81f3\u5b98\u7f51\u4e0b\u8f7d +resetBal=\u00a76\u5df2\u7ecf\u91cd\u7f6e\u6240\u6709\u5728\u7ebf\u73a9\u5bb6\u7684\u91d1\u94b1\u5230 \u00a7a{0} \u00a76. +resetBalAll=\u00a76\u5df2\u7ecf\u91cd\u7f6e\u6240\u6709\u73a9\u5bb6\u7684\u91d1\u94b1 \u00a7a{0} \u00a76. +returnPlayerToJailError=\u00a74\u5c06\u73a9\u5bb6{0}\u5173\u56de\u76d1\u72f1{1}\u65f6\u53d1\u751f\u9519\u8bef +runningPlayerMatch=\u00a76\u6b63\u5728\u641c\u7d22\u5339\u914d\u7684\u73a9\u5bb6 ''\u00a7c{0}\u00a76'' (\u8fd9\u53ef\u80fd\u4f1a\u82b1\u8d39\u4e00\u4e9b\u65f6\u95f4) +second=\u79d2 +seconds=\u79d2 +seenOffline=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u6700\u8fd1\u4e00\u6b21\u00a74\u4e0b\u7ebf\u00a76\u4e3a {1} +seenOnline=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u6700\u8fd1\u4e00\u6b21\u00a7a\u767b\u5f55\u00a76\u4e3a {1} +serverFull=\u670d\u52a1\u5668\u5df2\u6ee1 +serverTotal=\u00a76\u670d\u52a1\u5668\u603b\u548c: {0} +setSpawner=\u00a76\u6539\u53d8\u5237\u602a\u7b3c\u4e3a {0} +sheepMalformedColor=\u00a74\u65e0\u6548\u7684\u989c\u8272 +shoutFormat=\u00a76[\u558a\u8bdd]\u00a7r {0} +signFormatFail=\u00a74[{0}] +signFormatSuccess=\u00a71[{0}] +signFormatTemplate=[{0}] +signProtectInvalidLocation=\u00a74\u4f60\u4e0d\u5141\u8bb8\u5728\u6b64\u653e\u7f6e\u724c\u5b50 +similarWarpExist=\u00a74\u4e00\u4e2a\u540c\u540d\u7684\u5730\u6807\u5df2\u5b58\u5728 +slimeMalformedSize=\u00a74\u5927\u5c0f\u975e\u6cd5 +soloMob=\u00a74\u8be5\u751f\u7269\u559c\u6b22\u72ec\u5c45 +spawnSet=\u00a76\u5df2\u4e3a\u00a7c {0}\u00a76 \u7ec4\u7684\u8bbe\u7f6e\u51fa\u751f\u70b9 +spawned=\u5df2\u751f\u6210 +sudoExempt=\u00a74\u65e0\u6cd5\u5f3a\u5236\u4f7f\u6b64\u73a9\u5bb6\u6267\u884c\u547d\u4ee4 +sudoRun=\u00a76\u5f3a\u5236\u4f7f\u00a7c {0} \u00a76\u8fd0\u884c\u547d\u4ee4:\u00a7r /{1} {2} +suicideMessage=\u00a76\u6c38\u522b\u4e86,\u6b8b\u9177\u7684\u4e16\u754c\u2026\u2026 +suicideSuccess= \u00a7c{0} \u00a76\u7ed3\u675f\u4e86\u4ed6\u81ea\u5df1\u7684\u751f\u547d +survival=\u751f\u5b58\u6a21\u5f0f +takenFromAccount=\u00a7a\u4ece\u4f60\u7684\u8d26\u6237\u4e2d\u6263\u9664\u4e86 {0} +takenFromOthersAccount=\u00a7a\u4ece {1} \u00a7a\u4e2d\u7684\u8d26\u6237\u6263\u9664\u4e86 {0}.\u76ee\u524d\u91d1\u94b1: {2} +teleportAAll=\u00a76\u5411\u6240\u6709\u73a9\u5bb6\u53d1\u9001\u4e86\u4f20\u9001\u8bf7\u6c42\u2026\u2026 +teleportAll=\u00a76\u4f20\u9001\u4e86\u6240\u6709\u73a9\u5bb6\u2026\u2026 +teleportAtoB=\u00a7c{0}\u00a76 \u4f20\u9001\u4f60\u5230 {1}\u00a76 +teleportDisabled=\u00a7c{0}\u00a74 \u53d6\u6d88\u4e86\u4f20\u9001 +teleportHereRequest=\u00a7c{0}\u00a74 \u8bf7\u6c42\u4f60\u4f20\u9001\u5230\u4ed6\u90a3\u91cc +teleportNewPlayerError=\u00a74\u4f20\u9001\u65b0\u73a9\u5bb6\u5931\u8d25 +teleportRequest=\u00a7c{0}\u00a76 \u8bf7\u6c42\u4f20\u9001\u5230\u4f60\u8fd9\u91cc +teleportRequestTimeoutInfo=\u00a76\u6b64\u8bf7\u6c42\u5c06\u5728 {0} \u79d2\u5185\u53d6\u6d88 +teleportTop=\u00a76\u4f20\u9001\u5230\u9876\u90e8 +teleportationCommencing=\u00a76\u51c6\u5907\u4f20\u9001... +teleportationDisabled=\u00a76\u4f20\u9001\u5df2\u7981\u7528 +teleportationDisabledFor=\u00a76\u4f20\u9001\u5df2\u5bf9 {0} \u7981\u7528. +teleportationEnabled=\u00a76\u4f20\u9001\u5df2\u542f\u7528 +teleportationEnabledFor=\u00a76\u4f20\u9001\u5df2\u5bf9 {0} \u542f\u7528. +teleporting=\u00a76\u6b63\u5728\u4f20\u9001... +teleportingPortal=\u00a76\u6b63\u5728\u901a\u8fc7\u4f20\u9001\u95e8\u4f20\u9001... +tempBanned=\u5df2\u4e34\u65f6\u88ab\u670d\u52a1\u5668\u5c01\u7981,\u7406\u7531:{0} +tempbanExempt=\u00a76\u4f60\u65e0\u6cd5\u4e34\u65f6\u5c01\u7981\u6389\u8be5\u73a9\u5bb6 +thunder=\u00a76\u4f60 \u00a7c{0} \u00a76\u4e86\u4f60\u7684\u4e16\u754c\u7684\u95ea\u7535 +thunderDuration=\u00a76\u4f60 \u00a7c{0} \u00a76\u4e86\u4f60\u7684\u4e16\u754c\u7684\u95ea\u7535\u00a7c {1} \u00a76\u79d2 +timeBeforeHeal=\u00a76\u6cbb\u7597\u51b7\u5374:{0} +timeBeforeTeleport=\u00a76\u4f20\u9001\u51b7\u5374:{0} +timeFormat=\u00a7c{0}\u00a76 or \u00a7c{1}\u00a76 or \u00a7c{2}\u00a76 +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=\u00a76\u6240\u6709\u4e16\u754c\u7684\u4e16\u754c\u5df2\u8bbe\u7f6e +timeSetPermission=\u00a74\u4f60\u6ca1\u6709\u8bbe\u7f6e\u65f6\u95f4\u7684\u6743\u9650 +timeWorldCurrent=\u00a76\u76ee\u524d\u4e16\u754c {0} \u7684\u65f6\u95f4\u662f \u00a73{1} +timeWorldSet=\u00a76\u65f6\u95f4\u88ab\u8bbe\u7f6e\u4e3a {0} \u4e8e\u4e16\u754c:\u00a74{1} +totalWorthAll=\u00a7a\u51fa\u552e\u7684\u6240\u6709\u7269\u54c1\u548c\u65b9\u5757\uff0c\u603b\u4ef7\u503c {1}. +totalWorthBlocks=\u00a7a\u51fa\u552e\u7684\u6240\u6709\u65b9\u5757\u5757\uff0c\u603b\u4ef7\u503c {1}. +tps=\u00a76\u5f53\u524d TPS = {0} +tradeCompleted=\u00a7a\u4ea4\u6613\u5b8c\u6bd5 +tradeSignEmpty=\u00a74\u4ea4\u6613\u724c\u4e0a\u6ca1\u6709\u4f60\u53ef\u83b7\u5f97\u7684\u4e1c\u897f +tradeSignEmptyOwner=\u00a74\u4ea4\u6613\u724c\u4e0a\u6ca1\u6709\u4f60\u53ef\u6536\u96c6\u7684\u4e1c\u897f +treeFailure=\u00a74\u751f\u6210\u6811\u6728\u5931\u8d25,\u5728\u8349\u5757\u4e0a\u6216\u571f\u4e0a\u518d\u8bd5\u4e00\u6b21 +treeSpawned=\u00a76\u751f\u6210\u6811\u6728\u6210\u529f +true=\u00a7a\u662f\u00a7r +typeTpaccept=\u00a76\u82e5\u60f3\u63a5\u53d7\u4f20\u9001,\u8f93\u5165 \u00a74/tpaccept\u00a76 +typeTpdeny=\u00a76\u82e5\u60f3\u62d2\u7edd\u4f20\u9001,\u8f93\u5165 \u00a74/tpdeny\u00a76 +typeWorldName=\u00a76\u4f60\u4e5f\u53ef\u4ee5\u8f93\u5165\u6307\u5b9a\u7684\u4e16\u754c\u7684\u540d\u5b57 +unableToSpawnMob=\u00a74\u751f\u6210\u751f\u7269\u5931\u8d25 +unignorePlayer=\u00a76\u4f60\u5df2\u4e0d\u518d\u5c4f\u853d\u73a9\u5bb6 {0} +unknownItemId=\u00a74\u672a\u77e5\u7684\u7269\u54c1ID:{0} +unknownItemInList=\u00a74\u672a\u77e5\u7684\u7269\u54c1 {0} \u4e8e {1} \u5217\u8868 +unknownItemName=\u00a74\u672a\u77e5\u7684\u7269\u54c1\u540d\u79f0:{0} +unlimitedItemPermission=\u00a74\u6ca1\u6709\u6743\u9650\u6765\u4f7f\u8be5\u7269\u54c1\u65e0\u9650 {0} +unlimitedItems=\u00a76\u65e0\u9650\u7269\u54c1: +unmutedPlayer=\u00a76\u73a9\u5bb6 \u00a7c{0}\u00a76 \u88ab\u5141\u8bb8\u53d1\u8a00 +unvanished=\u00a76\u5df2\u9000\u51fa\u9690\u8eab\u6a21\u5f0f. +unvanishedReload=\u00a74\u63d2\u4ef6\u91cd\u8f7d\u8feb\u4f7f\u4f60\u7684\u9690\u8eab\u6a21\u5f0f\u5931\u6548. +upgradingFilesError=\u5347\u7ea7\u6587\u4ef6\u65f6\u53d1\u751f\u9519\u8bef +uptime=\u00a76\u8fd0\u884c\u65f6\u95f4:\u00a7c {0} +userAFK=\u00a75{0} \u00a75\u73b0\u5728\u79bb\u5f00, \u53ef\u80fd\u6682\u65f6\u6ca1\u529e\u6cd5\u56de\u5e94. +userDoesNotExist=\u00a74\u73a9\u5bb6 \u00a7c{0} \u00a74\u4e0d\u5b58\u5728. +userIsAway=\u00a7d{0} \u00a7d\u6682\u65f6\u79bb\u5f00\u4e86 +userIsNotAway=\u00a7d{0} \u00a7d\u56de\u6765\u4e86 +userJailed=\u00a76\u4f60\u5df2\u88ab\u76d1\u7981 +userUnknown=\u00a74\u8b66\u544a: \u8fd9\u4e2a\u73a9\u5bb6 ''\u00a7c{0}\u00a74'' \u4ece\u6765\u6ca1\u6709\u52a0\u5165\u8fc7\u670d\u52a1\u5668. +userUsedPortal={0} \u4f7f\u7528\u4e86\u73b0\u6709\u7684\u9000\u51fa\u4f20\u9001\u95e8. +userdataMoveBackError=\u79fb\u52a8 userdata/{0}.tmp \u5230 userdata/{1} \u5931\u8d25 +userdataMoveError=\u79fb\u52a8 userdata/{0} \u5230 userdata/{1}.tmp \u5931\u8d25 +usingTempFolderForTesting=\u4f7f\u7528\u7f13\u5b58\u6587\u4ef6\u5939\u6765\u6d4b\u8bd5: +vanished=\u00a76\u5df2\u8fdb\u5165\u9690\u8eab\u6a21\u5f0f,\u73a9\u5bb6\u5c06\u65e0\u6cd5\u770b\u5230\u4f60. +versionMismatch=\u00a74\u7248\u672c\u4e0d\u5339\u914d\uff01\u8bf7\u5347\u7ea7 {0} \u5230\u76f8\u540c\u7248\u672c. +versionMismatchAll=\u00a74\u7248\u672c\u4e0d\u5339\u914d\uff01\u8bf7\u5347\u7ea7\u6240\u6709Essentials\u7cfb\u5217\u7684\u63d2\u4ef6\u5230\u76f8\u540c\u7248\u672c. +voiceSilenced=\u00a76\u5df2\u9759\u97f3 +walking=\u884c\u8d70\u4e2d +warpDeleteError=\u00a74\u5220\u9664\u5730\u6807\u6587\u4ef6\u65f6\u53d1\u751f\u9519\u8bef +warpList={0} +warpListPermission=\u00a74\u4f60\u6ca1\u6709\u5217\u51fa\u5730\u6807\u7684\u6743\u9650 +warpNotExist=\u00a74\u8be5\u5730\u6807\u4e0d\u5b58\u5728 +warpOverwrite=\u00a74\u4f60\u4e0d\u80fd\u91cd\u7f6e\u8be5\u5730\u8868 +warpSet=\u00a76\u5730\u6807 \u00a7c{0} \u00a76\u5df2\u8bbe\u7f6e +warpUsePermission=\u00a74\u4f60\u6ca1\u6709\u4f7f\u7528\u8be5\u5730\u6807\u7684\u6743\u9650 +warpingTo=\u00a76\u4f20\u9001\u5230\u5730\u6807 \u00a7c{0} +warps=\u00a76\u5730\u6807: \u00a7r{0} +warpsCount=\u00a76\u8fd9\u6709 {0} \u5730\u6807,\u663e\u793a \u7b2c {1} \u9875/\u5171 {2} \u9875 +weatherStorm=\u00a76\u4f60\u5c06 {0} \u7684\u5929\u6c14\u6539\u4e3a\u96e8\u96ea +weatherStormFor=\u00a76\u4f60\u5c06 {0} \u7684\u5929\u6c14\u7684\u6539\u4e3a\u96e8\u96ea,\u6301\u7eed {1} \u79d2 +weatherSun=\u00a76\u4f60\u5c06 {0} \u7684\u5929\u6c14\u6539\u4e3a\u6674\u5929 +weatherSunFor=\u00a76\u4f60\u5c06 {0} \u7684\u5929\u6c14\u7684\u6539\u4e3a\u6674\u5929,\u6301\u7eed {1} \u79d2 +whoisAFK=\u00a76 - \u6682\u79bb:\u00a7r {0} +whoisBanned=\u00a76 - \u5c01\u7981:\u00a7r {0} +whoisExp=\u00a76 - \u7ecf\u9a8c:\u00a7r {0} (\u7b49\u7ea7 {1}) +whoisFly=\u00a76 - \u98de\u884c\u6a21\u5f0f:\u00a7r {0} ({1}) +whoisGamemode=\u00a76 - \u6e38\u620f\u6a21\u5f0f:\u00a7r {0} +whoisGeoLocation=\u00a76 - \u5730\u7406\u4f4d\u7f6e:\u00a7r {0} +whoisGod=\u00a76 - \u4e0a\u5e1d\u6a21\u5f0f:\u00a7r {0} +whoisHealth=\u00a76 - \u751f\u547d:\u00a7r {0}/20 +whoisIPAddress=\u00a76 - IP\u5730\u5740:\u00a7r {0} +whoisJail=\u00a76 - \u76d1\u72f1:\u00a7r {0} +whoisLocation=\u00a76 - \u5750\u6807:\u00a7r ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - \u73b0\u91d1:\u00a7r {0} +whoisMuted=\u00a76 - \u7981\u8a00:\u00a7r {0} +whoisNick=\u00a76 - \u6635\u79f0:\u00a7r {0} +whoisOp=\u00a76 - OP:\u00a7r {0} +whoisTop=\u00a76 ====== \u00a7c {0} \u00a76\u7684\u8d44\u6599====== +worth=\u00a76\u4e00\u7ec4 {0} \u4ef7\u503c \u00a74{1}\u00a76\uff08{2} \u5355\u4f4d\u7269\u54c1,\u6bcf\u4e2a\u4ef7\u503c {3}\uff09 +worthMeta=\u00a7a\u4e00\u7ec4\u526f\u7801\u4e3a {1} \u7684 {0} \u4ef7\u503c \u00a7c{2}\u00a76\uff08{3} \u5355\u4f4d\u7269\u54c1,\u6bcf\u4e2a\u4ef7\u503c {4}\uff09 +worthSet=\u00a76\u4ef7\u683c\u5df2\u8bbe\u7f6e +year=\u5e74 +years=\u5e74 +youAreHealed=\u00a76\u4f60\u5df2\u88ab\u6cbb\u7597 +youHaveNewMail=\u00a76\u4f60\u62e5\u6709 \u00a7c{0}\u00a76 \u6761\u6d88\u606f\uff01\u00a7r\u8f93\u5165 \u00a7c/mail read\u00a76 \u6765\u67e5\u770b +playerUnbanned=\u00a76\u5df2\u89e3\u9664\u7528\u6237\u00a7c {0} \u00a76\u7684\u5c01\u7981 {1}. +playerUnbanIpAddress=\u00a76\u5df2\u89e3\u9664\u7528\u6237\u00a7c {0} \u00a76\u7684\u5c01\u7981IP: {1}. +playerBanIpAddress=\u00a76\u5df2\u5c01\u7981\u7528\u6237\u00a7c {0} \u00a76\u7684IP\u5730\u5740 {1}\u00a76. +noPotionEffectPerm=\u00a74\u4f60\u6ca1\u6709\u6743\u9650\u5e94\u7528\u7279\u6548 \u00a7c{0} \u00a74\u5230\u8fd9\u4e2a\u836f\u6c34. +invalidPotionMeta=\u00a74\u65e0\u6548\u7684\u836f\u6c34\u6570\u636e: \u00a7c{0}\u00a74. +balanceOther=\u00a7a{0}\u7684\u91d1\u94b1:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76\u7684\u5929\u6c14\u662f\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76\u7684\u5929\u6c14\u662f\u6b63\u5e38\u7684. +pWeatherOthersPermission=\u00a74\u60a8\u6ca1\u6709\u88ab\u6388\u6743\u8bbe\u7f6e\u5176\u4ed6\u73a9\u5bb6\u7684\u5929\u6c14. +pWeatherPlayers=\u00a76\u8fd9\u4e9b\u73a9\u5bb6\u90fd\u6709\u81ea\u5df1\u7684\u5929\u6c14:\u00a7r +pWeatherReset=\u00a76\u73a9\u5bb6\u7684\u5929\u6c14\u88ab\u91cd\u7f6e: \u00a7c{0} +pWeatherSet=\u00a76\u73a9\u5bb6\u00a7c{1}\u00a76\u7684\u5929\u6c14\u88ab\u8bbe\u7f6e\u4e3a \u00a7c{0}\u00a76 . +pWeatherInvalidAlias=\u00a74\u9519\u8bef\u7684\u5929\u6c14\u7c7b\u578b +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +kitOnce=\u00a74You can't use that kit again. +invalidHomeName=\u00a74Invalid home name! +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. +holdBook=\u00a74You are not holding a writable book. +editBookContents=\u00a7eYou may now edit the contents of this book. +bookAuthorSet=\u00a76Author of the book set to {0}. +bookLocked=\u00a76This book is now locked. +bookTitleSet=\u00a76Title of the book set to {0}. +insufficientFunds=\u00a74Insufficient funds available. +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. diff --git a/Essentials/src/messages_zh_HK.properties b/Essentials/src/messages_zh_HK.properties new file mode 100644 index 0000000000..265f19ef4f --- /dev/null +++ b/Essentials/src/messages_zh_HK.properties @@ -0,0 +1,549 @@ +#version: TeamCity +# Single quotes have to be doubled: '' +# Translations start here +# by: \u00e7\u0099\u00bd\u00e5\u00af\u00b6\u00e7\u009f\u00b3\u00e6\u00bc\u00a2\u00e5\u008c\u0096\u00e7\u00b5\u0084:\u00e5\u00a4\u00a7\u00e5\u008a\u0089, pa001024 +action=\u00a7d* {0} \u00a7r5{1} +addedToAccount=\u00a7a{0} \u5df2\u6dfb\u52a0\u5230\u4f60\u7684\u9280\u884c\u8cec\u6236 +addedToOthersAccount=\u00a7a{0} \u5df2\u88ab\u6dfb\u52a0\u5230 {1} \u00a7a\u7684\u8cec\u6236.\u76ee\u524d\u9918\u984d: {2} +adventure=\u5192\u96aa\u6a21\u5f0f +alertBroke=\u7834\u58de: +alertFormat=\u00a73[{0}] \u00a7r {1} \u00a76 {2} \u65bc: {3} +alertPlaced=\u653e\u7f6e: +alertUsed=\u4f7f\u7528: +antiBuildBreak=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u7834\u58de\u00a74 {0} \u00a74\u9019\u500b\u65b9\u584a. +antiBuildCraft=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u653e\u7f6e\u00a74 {0} \u00a74\u9019\u500b\u65b9\u584a. +antiBuildDrop=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u653e\u7f6e\u00a74 {0} \u00a74\u9019\u500b\u65b9\u584a. +antiBuildInteract=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u8207\u00a74 {0}\u00a74\u4ea4\u4e92. +antiBuildPlace=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u653e\u7f6e\u00a74 {0} \u00a74\u9019\u500b\u65b9\u584a. +antiBuildUse=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u4f7f\u7528\u00a74 {0}\u00a74. +autoAfkKickReason=\u4f60\u56e0\u70ba\u9577\u6642\u9593\u672a\u80fd\u5728\u904a\u6232\u4e2d\u505a\u51fa\u52d5\u4f5c\u4e26\u8d85\u904e {0} \u5206\u9418\u800c\u88ab\u670d\u52d9\u5668\u8acb\u51fa\uff01 +backAfterDeath=\u00a76\u4f7f\u7528\u300c/back\u300d\u547d\u4ee4\u4f86\u56de\u5230\u6b7b\u4ea1\u5730\u9ede +backUsageMsg=\u00a76\u56de\u5230\u4e0a\u4e00\u4f4d\u7f6e +backupDisabled=\u00a74\u5099\u4efd\u914d\u7f6e\u6587\u4ef6\u672a\u88ab\u8a2d\u7f6e. +backupFinished=\u00a76\u5099\u4efd\u5b8c\u6210. +backupStarted=\u00a76\u5099\u4efd\u958b\u59cb +balance=\u00a7a\u73fe\u91d1:{0} +balanceTop=\u00a76\u91d1\u9322\u6392\u884c:{0} +banExempt=\u00a74\u4f60\u4e0d\u80fd\u5c01\u7981\u90a3\u500b\u73a9\u5bb6\u00a7r +banFormat=\u00a74\u5df2\u5c01\u7981:\u00a7r {0} +bed=\u00a77\u5e8a\u00a7r +bedMissing=\u00a7r54\u4f60\u7684\u5e8a\u5df2\u4e1f\u5931\u6216\u963b\u64cb +bedNull=\u00a7m\u5e8a\u00a7r +bedSet=\u00a7m\u5df2\u8a2d\u7f6e\u5e8a\u00a7r +bigTreeFailure=\u00a74\u751f\u6210\u5927\u6a39\u5931\u6557.\u5728\u571f\u584a\u6216\u8349\u584a\u4e0a\u9762\u518d\u8a66\u4e00\u6b21 +bigTreeSuccess=\u00a76\u5df2\u751f\u6210\u5927\u6a39 +blockList=\u00a76Essentials \u5916\u639b\u7a0b\u5f0f\u5c07\u50b3\u905e\u4e0b\u5217\u6307\u4ee4\u7d66\u53e6\u4e00\u5916\u639b\u7a0b\u5f0f: +broadcast=\u00a7r\u00a76[\u00a74\u516c\u544a\u00a76]\u00a7a {0} +buildAlert=\u00a74\u4f60\u6c92\u6709\u5efa\u9020\u6b0a\u9650! +bukkitFormatChanged=Bukkit\u7248\u672c\u5df2\u6539\u8b8a +burnMsg=\u00a76\u4f60\u5c07\u4f7f \u00a74{0} \u00a76\u71c3\u71d2\u00a74 {1} \u00a76\u79d2 +canTalkAgain=\u00a76\u4f60\u5df2\u7372\u5f97\u767c\u8a00\u7684\u8cc7\u683c +cantFindGeoIpDB=\u7121\u6cd5\u627e\u5230GeoIP\u6578\u64da\u5eab\uff01 +cantReadGeoIpDB=\u8b80\u53d6GeoIP\u6578\u64da\u5eab\u5931\u6557\uff01 +cantSpawnItem=\u00a74\u4f60\u6c92\u6709\u751f\u6210 {0} \u7684\u6b0a\u9650 +cantFindGeoIpDB=\u627e\u4e0d\u5230GeoIP\u6578\u64da\u5eab! +cantReadGeoIpDB=GeoIP\u6578\u64da\u5eab\u8b80\u53d6\u5931\u6557! +cantSpawnItem=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u751f\u6210\u7269\u54c1\u00a7c {0}\u00a74. +chatTypeAdmin=[A] +chatTypeLocal=[L] +chatTypeSpy=[Spy] +cleaned=\u7528\u6236\u6587\u4ef6\u5df2\u6e05\u7a7a +cleaning=\u6e05\u7a7a\u7528\u6236\u6587\u4ef6... +commandFailed=\u547d\u4ee4 {0} \u5931\u6557: +commandHelpFailedForPlugin=\u672a\u80fd\u7372\u53d6\u6b64\u5916\u639b\u7a0b\u5f0f\u7684\u5e6b\u52a9:{0} +commandNotLoaded=\u00a74 {0} \u547d\u4ee4\u52a0\u8f09\u5931\u6557 +compassBearing=\u00a76\u65b9\u5411:{0}\uff08{1}\u5ea6\uff09 +configFileMoveError=\u79fb\u52d5config.yml\u6587\u4ef6\u5230\u5099\u4efd\u4f4d\u7f6e\u5931\u6557 +configFileRenameError=\u91cd\u547d\u540d\u7de9\u5b58\u6587\u4ef6\u70baconfig.yml\u5931\u6557 +connectedPlayers=\u00a76\u76ee\u524d\u5728\u7dda: \u00a7r +connectionFailed=\u9023\u63a5\u5931\u6557. +cooldownWithMessage=\u00a74\u51b7\u537b\u6642\u9593:{0} +corruptNodeInConfig=\u00a74\u6ce8\u610f:\u4f60\u7684\u914d\u7f6e\u5167\u5b58\u5728\u4e00\u500b\u640d\u58de\u7684 {0} \u7bc0\u9ede +couldNotFindTemplate=\u00a74\u7121\u6cd5\u627e\u5230\u6a21\u7248 {0} +creatingConfigFromTemplate=\u5f9e\u6a21\u7248:{0} \u5275\u5efa\u914d\u7f6e +creatingEmptyConfig=\u5275\u5efa\u7a7a\u7684\u914d\u7f6e:{0} +creative=\u5275\u9020\u6a21\u5f0f +currency={0}{1} +currentWorld=\u00a76\u7576\u524d\u4e16\u754c:\u00a74 {0} +day=\u5929 +days=\u5929 +defaultBanReason=\u767b\u9304\u5931\u6557!\u60a8\u7684\u5e33\u865f\u5df2\u88ab\u6b64\u670d\u52d9\u5668\u5c01\u7981! +deleteFileError=\u7121\u6cd5\u522a\u9664\u6587\u4ef6:{0} +deleteHome=\u00a76\u5bb6 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deleteJail=\u00a76\u76e3\u7344 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deleteWarp=\u00a76\u5730\u6a19 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deniedAccessCommand=\u00a7c{0} \u00a74\u88ab\u62d2\u7d55\u4f7f\u7528\u547d\u4ee4 +denyBookEdit=\u00a74\u4f60\u4e0d\u80fd\u89e3\u9396\u9019\u672c\u66f8. +denyChangeAuthor=\u00a74\u4f60\u4e0d\u80fd\u6539\u8b8a\u9019\u672c\u66f8\u7684\u4f5c\u8005. +denyChangeTitle=\u00a74\u4f60\u4e0d\u80fd\u6539\u8b8a\u9019\u672c\u66f8\u7684\u6a19\u984c. +dependancyDownloaded=[Essentials\u5916\u639b\u7a0b\u5f0f] \u9644\u5c6c\u6587\u4ef6 {0} \u4e0b\u8f09\u6210\u529f +dependancyException=[Essentials\u5916\u639b\u7a0b\u5f0f] \u4e0b\u8f09\u9644\u5c6c\u6587\u4ef6\u6642\u767c\u751f\u932f\u8aa4 +dependancyNotFound=[Essentials\u5916\u639b\u7a0b\u5f0f] \u672a\u627e\u5230\u4e00\u500b\u6240\u9700\u7684\u9644\u5c6c\u6587\u4ef6,\u958b\u59cb\u81ea\u52d5\u4e0b\u8f09 +depth=\u00a76\u4f60\u4f4d\u65bc\u6d77\u62d40\u683c\u8655 +depthAboveSea=\u00a76\u4f60\u4f4d\u65bc\u6d77\u62d4\u6b63\u00a7c{0}\u00a76\u683c\u8655 +depthBelowSea=\u00a76\u4f60\u4f4d\u65bc\u6d77\u62d4\u8ca0\u00a7c{0}\u00a76\u683c\u8655 +destinationNotSet=\u76ee\u7684\u5730\u672a\u8a2d\u7f6e. +disableUnlimited=\u00a76\u53d6\u6d88\u4e86 {1} \u7684\u7121\u9650\u653e\u7f6e \u00a7c{0} \u00a76\u7684\u80fd\u529b +disabled=\u95dc\u9589 +disabledToSpawnMob=\u00a74\u5df2\u7981\u6b62\u6b64\u751f\u7269\u7684\u751f\u6210. +distance=\u00a76\u8ddd\u96e2: {0} +dontMoveMessage=\u00a76\u50b3\u9001\u5c07\u5728{0}\u5167\u958b\u59cb.\u4e0d\u8981\u79fb\u52d5 +downloadingGeoIp=\u4e0b\u8f09GeoIP\u6578\u64da\u5eab\u4e2d +duplicatedUserdata=\u8907\u88fd\u4e86\u73a9\u5bb6\u5b58\u6a94:{0} \u548c {1} +durability=\u00a76\u9019\u500b\u5de5\u5177\u9084\u6709 \u00a74{0}\u00a76 \u6301\u4e45 +enableUnlimited=\u00a76\u7d66\u4e88\u4e86 \u00a7c{1} \u00a76\u7684\u7121\u9650\u653e\u7f6e \u00a7c{0} \u00a76\u7684\u80fd\u529b +enableUnlimited=\u00a76\u7121\u9650\u5236\u7684\u00a7c {0} \u00a76\u5df2\u7d93\u7d66\u8207 {1}. +enabled=\u958b\u555f +enchantmentApplied = \u00a76\u9644\u9b54 \u00a7c{0} \u00a76\u5df2\u88ab\u61c9\u7528\u5230\u4f60\u624b\u4e2d\u7684\u5de5\u5177. +enchantmentNotFound = \u00a74\u672a\u627e\u5230\u8a72\u9644\u9b54. +enchantmentPerm = \u00a74\u4f60\u6c92\u6709\u9032\u884c\u00a7c {0} \u00a74\u9644\u9b54\u7684\u6b0a\u9650. +enchantmentRemoved = \u00a76\u9644\u9b54 \u00a7c{0} \u00a76\u5df2\u5f9e\u4f60\u624b\u4e0a\u7684\u5de5\u5177\u79fb\u9664 +enchantments = \u00a76\u9644\u9b54: \u00a7r{0} +errorCallingCommand=\u932f\u8aa4\u7684\u547c\u53eb\u547d\u4ee4:/{0} +errorWithMessage=\u00a7c\u932f\u8aa4:{0} +essentialsHelp1=Essentials\u7121\u6cd5\u5c07\u5176\u6253\u958b +essentialsHelp2=Essentials\u7121\u6cd5\u5c07\u5176\u6253\u958b +essentialsReload=\u00a76Essentials \u5df2\u91cd\u65b0\u8f09\u5165\u00a7c{0} +exp=\u00a74{0} \u00a76\u64c1\u6709\u00a7c {1} \u00a76\u7d93\u9a57\u503c (\u7b49\u7d1a\u00a7c {2}\u00a76) \u9700\u8981\u00a7c {3} \u00a76\u7d93\u9a57\u624d\u80fd\u5347\u7d1a. +expSet=\u00a7c\u4f60\u5c07{0} \u00a76\u7684\u7d93\u9a57\u8a2d\u7f6e\u70ba\u00a7c {1} \u00a76\u7d93\u9a57\u503c. +extinguish=\u00a76\u4f60\u7184\u6ec5\u4e86\u4f60\u81ea\u5df1\u8eab\u4e0a\u7684\u706b +extinguishOthers=\u00a76\u4f60\u7184\u6ec5\u4e86 {0} \u00a76\u8eab\u4e0a\u7684\u706b +failedToCloseConfig=\u95dc\u9589\u914d\u7f6e {0} \u5931\u6557 +failedToCreateConfig=\u5275\u5efa\u914d\u7f6e {0} \u5931\u6557 +failedToWriteConfig=\u5beb\u5165\u914d\u7f6e {0} \u5931\u6557 +false=\u00a74\u5426\u00a7r +feed=\u5df2\u7d93\u98fd\u548c,\u7121\u6cd5\u589e\u52a0\u98e2\u9913\u5ea6. +feedOther=\u00a76\u5df2\u7d93\u98fd\u548c{0}. +fileRenameError=\u91cd\u547d\u540d\u6587\u4ef6 {0} \u5931\u6557 +fireworkColor=\u00a74\u4f7f\u7528\u4e86\u7121\u6548\u7684\u7159\u82b1\u586b\u5145\u53c3\u6578\uff0c\u5fc5\u9808\u9996\u5148\u8a2d\u7f6e\u4e00\u500b\u984f\u8272\u3002 +fireworkEffectsCleared=\u00a76\u5f9e\u6301\u6709\u7684\u7269\u54c1\u4e2d\u79fb\u9664\u4e86\u6240\u6709\u7279\u6548. +fireworkSyntax=\u00a76\u7159\u82b1\u53c3\u6578:\u00a7c color:<\u984f\u8272> [fade:<\u6de1\u51fa\u984f\u8272>] [shape:<\u5f62\u614b>] [effect:<\u7279\u6548>]\n\u00a76\u8981\u4f7f\u7528\u591a\u500b\u984f\u8272/\u7279\u6548, \u4f7f\u7528\u9017\u865f: \u00a7cred,blue,pink\n\u00a76\u5f62\u72c0:\u00a7c star, ball, large, creeper, burst \u00a76\u7279\u6548:\u00a7c trail, twinkle. +flyMode=\u00a76 \u5df2\u70ba\u00a7c{1}\u00a76\u8a2d\u7f6e\u4e86\u98db\u884c\u6a21\u5f0f\u70ba\u00a7c{0}. +flying=\u98db\u884c\u4e2d +foreverAlone=\u00a74\u4f60\u6c92\u6709\u53ef\u56de\u5fa9\u7684\u73a9\u5bb6 +freedMemory=\u91cb\u653e\u4e86 {0} MB +fullStack=\u00a74\u4f60\u7684\u7269\u54c1\u5df2\u7d93\u6700\u591a\u4e86. +gameMode=\u00a76\u5df2\u8a2d\u7f6e{1}\u7684\u904a\u6232\u6a21\u5f0f\u70ba{0}. +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 \u5340\u584a, \u00a7c{3}\u00a76 \u5be6\u9ad4. +gcfree=\u7a7a\u9592\u5167\u5b58: \u00a7c{0} MB +gcmax=\u6700\u5927\u5167\u5b58: \u00a7c{0} MB +gctotal=\u5df2\u5206\u914d\u5167\u5b58: \u00a7c{0} MB +geoIpUrlEmpty=GeoIP\u4e0b\u8f09\u93c8\u63a5\u70ba\u7a7a +geoIpUrlInvalid=GeoIP\u4e0b\u8f09\u93c8\u63a5\u5931\u6548 +geoipJoinFormat=\u73a9\u5bb6 {0} \u4f86\u81ea\u65bc {1} +giveSpawn=\u00a76\u7d66\u4e88\u00a7c {2} \u00a76 \u00a7c {0} \u500b\u00a7c {1}\u00a76. +godDisabledFor=\u00a74\u53d6\u6d88\u4e86 \u00a7c{0} \u00a76\u7684\u4e0a\u5e1d\u6a21\u5f0f +godEnabledFor=\u00a74\u958b\u555f\u4e86\u00a7c {0} \u00a76\u7684\u4e0a\u5e1d\u6a21\u5f0f +godMode=\u00a76\u4e0a\u5e1d\u6a21\u5f0f \u00a7c{0} +groupNumber=\u00a7c{0}\u00a7f \u5728\u7dda, \u60f3\u8981\u7372\u53d6\u5168\u90e8\u4f7f\u7528:\u00a7c /{1} {2} +groupDoesNotExist=\u00a74\u7576\u524d\u7d44\u6c92\u6709\u4eba\u5728\u7dda! +hatArmor=\u00a74\u932f\u8aa4:\u4f60\u7121\u6cd5\u4f7f\u7528\u9019\u500b\u7269\u54c1\u4f5c\u70ba\u5e3d\u5b50! +hatEmpty=\u00a74\u4f60\u73fe\u5728\u9084\u6c92\u6709\u6234\u5e3d\u5b50. +hatFail=\u00a74\u4f60\u5fc5\u9808\u628a\u60f3\u8981\u5e36\u7684\u5e3d\u5b50\u62ff\u5728\u624b\u4e2d. +hatPlaced=\u00a7e\u4eab\u53d7\u4f60\u7684\u65b0\u5e3d\u5b50\u628a! +hatRemoved=\u00a76\u4f60\u7684\u5e3d\u5b50\u5df2\u79fb\u9664. +haveBeenReleased=\u00a76\u4f60\u5df2\u88ab\u91cb\u653e +heal=\u00a76\u4f60\u5df2\u88ab\u6cbb\u7642 +healDead=\u00a74\u4f60\u4e0d\u80fd\u6cbb\u7642\u4e00\u500b\u6b7b\u4eba! +healOther=\u00a76\u5df2\u6cbb\u7642\u00a7c {0} +helpConsole=\u5f9e\u63a7\u5236\u53f0\u67e5\u770b\u5e6b\u52a9,\u8acb\u8f38\u5165\u300c?\u300d +helpFrom=\u00a76\u4f86\u81ea\u65bc {0} \u7684\u6307\u4ee4 +helpLine=\u00a76/{0}\u00a7r: {1} +helpMatching=\u00a76\u6307\u4ee4\u9023\u63a5 "\u00a7c{0}\u00a76": +helpOp=\u00a74[\u6c42\u52a9OP]\u00a7r \u00a76{0}:\u00a7r {1} +helpPages=\u00a76\u7b2c \u00a7c{0}\u00a76 \u9801/\u5171 \u00a7c{1}\u00a76 \u9801: +helpPlugin=\u00a74{0}\u00a7r: \u5916\u639b\u7a0b\u5f0f\u5e6b\u52a9: /help {1} +holeInFloor=\u00a74\u76ee\u6a19\u8173\u4e0b\u662f\u865b\u7a7a +holdFirework=\u00a74\u4f60\u5fc5\u9808\u62ff\u7740\u7159\u706b\u624d\u80fd\u589e\u52a0\u7279\u6548. +holdPotion=\u00a74\u4f60\u5fc5\u9808\u62ff\u7740\u85e5\u6c34\u624d\u80fd\u589e\u52a0\u7279\u6548. +holeInFloor=\u00a74\u5730\u677f\u6709\u6d1e! +homeSet=\u00a76\u5df2\u8a2d\u7f6e\u5bb6~ +homeSetToBed=\u00a76\u4f60\u7684\u5bb6\u5df2\u88ab\u8a2d\u70ba\u6b64\u5e8a +homes=\u00a76\u5bb6:\u00a7r{0} +hour=\u5c0f\u6642 +hours=\u5c0f\u6642 +ignorePlayer=\u00a76\u4f60\u5c4f\u853d\u4e86\u73a9\u5bb6 \u00a7c{0} +illegalDate=\u932f\u8aa4\u7684\u65e5\u671f\u683c\u5f0f +infoChapter=\u9078\u64c7\u7ae0\u7bc0: +infoChapterPages=\u00a76\u7ae0\u7bc0 {0},\u7b2c \u00a7c{1}\u00a76 \u9801/\u5171 \u00a7c{2}\u00a76: +infoFileDoesNotExist=\u6587\u4ef6info.txt\u4e0d\u5b58\u5728,\u5c07\u5275\u5efa\u4e00\u500b\u65b0\u7684\u6587\u4ef6 +infoPages=\u00a7e----\u7b2c \u00a7c{0}\u00a7e \u9801/\u5171 \u00a7c{1}\u00a7e \u9801---- +infoUnknownChapter=\u672a\u77e5\u7ae0\u7bc0 +invBigger=\u00a74\u5176\u4ed6\u73a9\u5bb6\u7684\u80cc\u5305\u6bd4\u4f60\u7684\u66f4\u5927 +invRestored=\u00a76\u4f60\u7684\u80cc\u5305\u5df2\u88ab\u6062\u5fa9 +invSee=\u00a76\u4f60\u67e5\u770b\u4e86\u00a7c {0} \u00a76\u7684\u80cc\u5305 +invSeeHelp=\u00a76\u4f7f\u7528\u300c/invsee\u300d\u91cd\u65b0\u67e5\u770b\u81ea\u5df1\u7684\u80cc\u5305 +invalidCharge=\u00a74\u7121\u6548\u7684\u50f9\u683c +invalidFireworkFormat=\u00a76\u9019\u500b\u9078\u9805 \u00a74{0} \u00a76\u5c0d \u00a74{1}\u00a76 \u4e0d\u662f\u4e00\u500b\u6709\u6548\u7684\u503c \u00a76. +invalidHome=\u00a74\u5bb6\u00a7c {0} \u00a74\u4e0d\u5b58\u5728! +invalidMob=\u7121\u6548\u7684\u52d5\u7269\u7a2e\u985e +invalidServer=\u7121\u6548\u7684\u670d\u52d9\u5668\uff01 +invalidSignLine=\u00a74\u724c\u5b50\u4e0a\u7684\u7b2c \u00a7c{0} \u00a74\u884c\u7121\u6548 +invalidWorld=\u00a74\u7121\u6548\u7684\u4e16\u754c +inventoryCleared=\u00a76\u80cc\u5305\u5df2\u6e05\u7a7a +inventoryClearedOthers=\u00a7c{0}\u00a76 \u7684\u80cc\u5305\u5df2\u88ab\u6e05\u7a7a +invalidWarpName=\u00a74\u7121\u6548\u7684\u50b3\u9001\u9ede\u540d\u7a31! +invalidWorld=\u00a74\u7121\u6548\u7684\u4e16\u754c\u540d. +inventoryCleared=\u00a76\u5305\u88f9\u5df2\u6e05\u7a7a. +inventoryClearedAll=\u00a76\u6240\u6709\u4eba\u7684\u5305\u88f9\u5df2\u6e05\u7a7a. +inventoryClearedOthers=\u00a7c{0}\u00a76\u7684\u5305\u88f9\u5df2\u6e05\u7a7a. +is=\u662f +itemCannotBeSold=\u00a74\u8a72\u7269\u54c1\u7121\u6cd5\u8ce3\u7d66\u670d\u52d9\u5668 +itemMustBeStacked=\u00a74\u7269\u54c1\u5fc5\u9808\u6210\u7d44\u4ea4\u6613,2s\u7684\u6578\u91cf\u662f2\u7d44,\u4ee5\u6b64\u985e\u63a8 +itemNames=\u00a76\u7269\u54c1\u7c21\u6613\u540d\u7a31:\u00a7r {0} +itemNotEnough1=\u00a74\u4f60\u6c92\u6709\u8db3\u5920\u7684\u8a72\u7269\u54c1\u4f86\u8ce3\u51fa +itemNotEnough2=\u00a76\u5982\u679c\u4f60\u60f3\u8981\u8ce3\u6389\u6240\u6709\u4f60\u80cc\u5305\u5167\u7684\u8a72\u7269\u54c1,\u4f7f\u7528\u300c/sell \u7269\u54c1\u540d\u7a31\uff08\u82f1\u6587,\u6216ID\uff09\u300d +itemNotEnough3=\u00a76\u300c/sell \u7269\u54c1\u540d\u7a31 -1\u300d\u5c07\u6703\u7559\u51fa\u4e00\u500b\u800c\u8ce3\u6389\u5176\u5b83\u8a72\u7a2e\u7269\u54c1,\u4ee5\u6b64\u985e\u63a8 +itemSellAir=\u4f60\u96e3\u9053\u60f3\u8ce3\u7a7a\u6c23\u55ce\uff1f\u653e\u500b\u6771\u897f\u5728\u4f60\u624b\u88e1 +itemSold=\u00a7a\u7372\u5f97 \u00a7c {0} \u00a7a \uff08{1} \u55ae\u4f4d{2},\u6bcf\u500b\u50f9\u503c {3}\uff09 +itemSoldConsole=\u00a7c{0} \u00a76\u8ce3\u51fa\u4e86 {1},\u7372\u5f97\u4e86\u00a76 {2} \u00a76 \uff08{3} \u55ae\u4f4d\u7269\u54c1,\u6bcf\u500b\u50f9\u503c {4}\uff09 +itemSpawn=\u00a76\u751f\u6210 {0} \u500b {1} +itemType=\u00a76\u7269\u54c1:\u00a7c {0} \u00a76-\u00a74 {1} +itemsCsvNotLoaded=\u7121\u6cd5\u52a0\u8f09items.csv +jailAlreadyIncarcerated=\u00a74\u5df2\u5728\u76e3\u7344\u4e2d\u7684\u73a9\u5bb6:{0} +jailMessage=\u00a74\u8acb\u5728\u76e3\u7344\u4e2d\u9762\u58c1\u601d\u904e\uff01 +jailNotExist=\u00a74\u8a72\u76e3\u7344\u4e0d\u5b58\u5728 +jailReleased=\u00a76\u73a9\u5bb6 \u00a7c{0}\u00a76 \u51fa\u7344\u4e86 +jailReleasedPlayerNotify=\u00a76\u4f60\u5df2\u88ab\u91cb\u653e\uff01 +jailSentenceExtended=\u00a76\u56da\u7981\u6642\u9593\u589e\u52a0\u5230:{0) +jailSet=\u00a76\u76e3\u7344 {0} \u5df2\u88ab\u8a2d\u7f6e +jumpError=\u00a74\u9019\u5c07\u6703\u640d\u5bb3\u4f60\u7684\u96fb\u8166 +kickDefault=\u5f9e\u670d\u52d9\u5668\u8acb\u51fa +kickExempt=\u00a74\u4f60\u7121\u6cd5\u8acb\u51fa\u8a72\u73a9\u5bb6. +kickedAll=\u00a74\u5df2\u5c07\u6240\u6709\u73a9\u5bb6\u8acb\u51fa\u670d\u52d9\u5668. +kill=\u00a76\u6bba\u6b7b\u4e86 \u00a7c{0} +killExempt=\u00a74\u4f60\u4e0d\u80fd\u6bba\u6b7b {0} +kitError2=\u00a74\u8a72\u5de5\u5177\u5305\u53ef\u80fd\u4e0d\u5b58\u5728\u6216\u8005\u88ab\u62d2\u7d55\u4e86. +kitError=\u00a74\u6c92\u6709\u6709\u6548\u7684\u5de5\u5177\u5305 +kitErrorHelp=\u00a74\u6216\u8a31\u4e00\u500b\u7269\u54c1\u5728\u8a2d\u7f6e\u6587\u4ef6\u91cc\u672a\u88ab\u8a2d\u7f6e\u6578\u91cf\uff1f +kitGive=\u00a76\u7372\u53d6\u5de5\u5177\u5305\u00a7c {0} +kitGiveTo=\u00a76\u6210\u529f\u767c\u9001\u5de5\u5177\u5305\u00a7c {0}\u00a76 \u7d66 {1}\u00a7. +kitInvFull=\u00a74\u4f60\u7684\u80cc\u5305\u5df2\u6eff,\u5de5\u5177\u5305\u5c07\u653e\u5728\u5730\u4e0a +kitTimed=\u00a74\u51b7\u537b\u6642\u9593\u00a7c {0}. +kitReceive=\u00a76\u6536\u5230\u4e00\u500b\u00a7c {0} \u00a76\u5de5\u5177\u5305. +kitTimed=\u00a74You cant use that kit again for another\u00a7c {0}\u00a74. +kits=\u00a76\u5de5\u5177\u5305:\u00a7r{0} +leatherSyntax=\u00a76\u76ae\u9769\u984f\u8272\u8a9e\u6cd5: color:,, \u5982: color:255,0,0. +lightningSmited=\u00a76\u4f60\u525b\u525b\u88ab\u96f7\u64ca\u4e2d\u4e86 +lightningUse=\u00a76\u96f7\u64ca\u4e2d\u4e86\u00a7c {0} +listAfkTag = \u00a77[\u96e2\u958b]\u00a7r +listAmount = \u00a76\u7576\u524d\u6709 \u00a7c{0}\u00a76 \u500b\u73a9\u5bb6\u5728\u7dda,\u6700\u5927\u5728\u7dda\u4eba\u6578\u70ba \u00a7c{1}\u00a76 \u500b\u73a9\u5bb6. +listAmountHidden = \u00a76\u7576\u524d\u6709 \u00a7c{0}\u00a76/{1}\u00a76 \u500b\u73a9\u5bb6\u5728\u7dda,\u6700\u5927\u5728\u7dda\u4eba\u6578 \u00a7c{2}\u00a76 \u500b\u73a9\u5bb6 +listGroupTag={0}\u00a7r: +listHiddenTag = \u00a77[\u96b1\u8eab]\u00a7r +loadWarpError=\u00a74\u52a0\u8f09\u5730\u6a19 {0} \u5931\u6557 +localFormat=\u4f4d\u7f6e:<{0}> {1} +mailClear=\u00a76\u82e5\u8981\u6a19\u8a18\u4f60\u7684\u90f5\u4ef6\u70ba\u5df2\u8b80,\u8f38\u5165\u300c/mail clear\u300d +mailCleared=\u00a76\u90f5\u7bb1\u5df2\u6e05\u7a7a\uff01 +mailSent=\u00a76\u90f5\u4ef6\u5df2\u767c\u51fa\uff01 +markMailAsRead=\u00a76\u82e5\u8981\u6a19\u8a18\u4f60\u7684\u90f5\u4ef6\u70ba\u5df2\u8b80,\u8f38\u5165\u300c/mail clear\u300d +markedAsAway=\u00a76\u4f60\u5df2\u8a2d\u7f6e\u96e2\u958b. +markedAsNotAway=\u00a76\u4f60\u5df2\u8a2d\u7f6e\u53d6\u6d88\u96e2\u958b. +matchingIPAddress=\u00a76\u4ee5\u4e0b\u662f\u4f86\u81ea\u8a72IP\u4f4d\u5740\u7684\u73a9\u5bb6: +maxHomes=\u00a74\u4f60\u7121\u6cd5\u8a2d\u7f6e\u8d85\u904e {0} \u500b\u5bb6. +mayNotJail=\u00a74\u4f60\u7121\u6cd5\u56da\u7981\u8a72\u73a9\u5bb6 +me=\u6211 +messageTruncated=\u00a74\u6d88\u606f\u88ab\u622a\u65b7, \u60f3\u8981\u770b\u5230\u5b8c\u6574\u7684\u4fe1\u606f\u8acb\u8f38\u5165:\u00a7c /{0} {1} +minute=\u5206\u9418 +minutes=\u5206\u9418 +missingItems=\u00a74\u4f60\u6c92\u6709 {0}x {1}. +missingPrefixSuffix=\u5931\u53bb\u4e86\u4e00\u500b\u524d\u7db4\u6216\u5c3e\u7db4\u65bc {0} +mobSpawnError=\u00a74\u66f4\u6539\u5237\u602a\u7c60\u6642\u767c\u751f\u932f\u8aa4 +mobSpawnLimit=\u751f\u7269\u6578\u91cf\u592a\u591a,\u7121\u6cd5\u751f\u6210 +mobSpawnTarget=\u00a74\u76ee\u6a19\u65b9\u584a\u5fc5\u9808\u662f\u4e00\u500b\u5237\u602a\u7c60 +mobsAvailable=\u00a76\u751f\u7269:\u00a7r {0} +moneyRecievedFrom=\u00a7a\u5df2\u5f9e {1} \u63a5\u6536{0} +moneySentTo=\u00a7a{0} \u5df2\u767c\u9001\u5230 {1} +moneyTaken=\u00a7a{0} \u5df2\u5f9e\u4f60\u7684\u8cec\u6236\u4e2d\u6263\u9664 +month=\u6708 +months=\u6708 +moreThanZero=\u00a74\u6578\u91cf\u5fc5\u9808\u5927\u65bc0 +moveSpeed=\u00a76\u70ba\u00a7c{2}\u00a76\u8a2d\u7f6e\u00a7c {0} \u00a76\u901f\u5ea6\u70ba\u00a7c {1} \u00a76. +msgFormat=\u00a76[{0}\u00a76 -> {1}\u00a76] \u00a7r{2} +multipleCharges=\u00a74\u60a8\u4e0d\u80fd\u5c0d\u9019\u500b\u7159\u82b1\u61c9\u7528\u591a\u65bc\u4e00\u500b\u7684\u88dd\u6599. +multiplePotionEffects=\u00a74\u60a8\u4e0d\u80fd\u5c0d\u9019\u500b\u7159\u82b1\u61c9\u7528\u591a\u65bc\u4e00\u500b\u7684\u6548\u679c. +muteExempt=\u00a74\u4f60\u7121\u6cd5\u7981\u8a00\u8a72\u73a9\u5bb6 +muteNotify=\u00a74{0} \u00a76\u5df2\u88ab\u7981\u8a00 \u00a74{1}\u00a76. +mutedPlayer=\u00a76\u73a9\u5bb6 {0} \u00a76\u88ab\u7981\u8a00 +mutedPlayerFor=\u00a76\u73a9\u5bb6 {0} \u00a76\u88ab\u7981\u8a00 \u6642\u9593:{1} +mutedUserSpeaks={0} \u60f3\u8981\u8aaa\u8a71,\u4f46\u88ab\u7981\u8a00\u4e86 +nearbyPlayers=\u00a76\u9644\u8fd1\u7684\u73a9\u5bb6: {0} +negativeBalanceError=\u00a74\u73fe\u91d1\u4e0d\u53ef\u5c0f\u65bc\u96f6 +nickChanged=\u00a76\u66b1\u7a31\u5df2\u66f4\u63db +nickDisplayName=\u00a74\u4f60\u9700\u8981\u6fc0\u6d3bchange-displayname.\u8a72\u6587\u4ef6\u5728Essentials\u8a2d\u7f6e\u6587\u4ef6\u4e2d +nickInUse=\u00a74\u90a3\u500b\u66b1\u7a31\u5df2\u88ab\u4f7f\u7528 +nickNamesAlpha=\u00a74\u66b1\u7a31\u5fc5\u9808\u70ba\u5b57\u6bcd\u6216\u6578\u5b57. +nickNoMore=\u00a76\u4f60\u4e0d\u518d\u64c1\u6709\u4e00\u500b\u66b1\u7a31 +nickOthersPermission=\u00a74\u4f60\u6c92\u6709\u66f4\u6539\u5225\u4eba\u66b1\u7a31\u7684\u6b0a\u9650 +nickSet=\u00a76\u4f60\u7684\u66b1\u7a31\u73fe\u5728\u662f \u00a74{0} +noAccessCommand=\u00a74\u4f60\u6c92\u6709\u4f7f\u7528\u8a72\u547d\u4ee4\u7684\u6b0a\u9650 +noAccessPermission=\u00a74\u4f60\u6c92\u6709\u4f7f\u7528 {0} \u7684\u6b0a\u9650 +noBreakBedrock=\u00a74\u4f60\u4e0d\u80fd\u6467\u6bc0\u57fa\u5ca9\uff01 +noChapterMeta=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u5275\u5efa\u52d5\u614b\u66f8\u672c. +noDestroyPermission=\u00a74\u4f60\u6c92\u6709\u7834\u58de {0} \u7684\u6b0a\u9650 +noDurability=\u00a74\u9019\u500b\u7269\u54c1\u6c92\u6709\u8010\u4e45. +noGodWorldWarning=\u00a74\u7981\u6b62\u4f7f\u7528\u4e0a\u5e1d\u6a21\u5f0f. +noHelpFound=\u00a74\u6c92\u6709\u5339\u914d\u7684\u547d\u4ee4 +noHomeSet=\u4f60\u9084\u672a\u8a2d\u7f6e\u5bb6 +noHomeSetPlayer=\u00a76\u8a72\u73a9\u5bb6\u9084\u672a\u8a2d\u7f6e\u5bb6 +noKitPermission=\u00a74\u4f60\u9700\u8981 \u00a74{0}\u00a74 \u6b0a\u9650\u4f86\u4f7f\u7528\u8a72\u5de5\u5177 +noKits=\u00a76\u9084\u6c92\u6709\u53ef\u7372\u5f97\u7684\u5de5\u5177 +noMail=\u4f60\u6c92\u6709\u4efb\u4f55\u90f5\u4ef6 +noMatchingPlayers=\u00a76\u627e\u4e0d\u5230\u5339\u914d\u7684\u73a9\u5bb6. +noMetaFirework=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u61c9\u7528\u7159\u82b1\u6578\u64da. +noMetaPerm=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u61c9\u7528 \u00a7c{0}\u00a74 \u7684\u6578\u64da. +noMotd=\u00a76\u4eca\u65e5\u6c92\u6709\u516c\u544a +noNewMail=\u00a76\u4f60\u6c92\u6709\u65b0\u7684\u90f5\u4ef6 +noPendingRequest=\u00a74\u4f60\u6c92\u6709\u5f85\u89e3\u6c7a\u7684\u8acb\u6c42 +noPerm=\u00a74\u4f60\u6c92\u6709 \u00a7c{0}\u00a74 \u6b0a\u9650 +noPermToSpawnMob=\u00a74\u4f60\u6c92\u6709\u751f\u6210\u8a72\u751f\u7269\u7684\u6b0a\u9650 +noPlacePermission=\u00a74\u00a74\u4f60\u6c92\u6709\u5728\u90a3\u500b\u724c\u5b50\u65c1\u908a\u653e\u65b9\u584a\u7684\u6b0a\u5229 +noPowerTools=\u00a76\u4f60\u6c92\u6709\u7d81\u5b9a\u547d\u4ee4 +noRules=\u00a74\u6c92\u6709\u6307\u5b9a\u7684\u689d\u898f +noWarpsDefined=\u00a74\u6c92\u6709\u78ba\u5b9a\u7684\u5730\u6a19 +none=\u7121 +notAllowedToQuestion=\u00a74\u4f60\u672a\u88ab\u6388\u6b0a\u4f7f\u7528\u63d0\u554f\u767c\u8a00 +notAllowedToShout=\u00a74\u4f60\u672a\u88ab\u6388\u6b0a\u4f7f\u7528\u558a\u8a71\u767c\u8a00 +notEnoughExperience=\u00a74\u4f60\u6c92\u6709\u8db3\u5920\u7684\u7d93\u9a57\u503c +notEnoughMoney=\u00a74\u4f60\u6c92\u6709\u8db3\u5920\u7684\u8cc7\u91d1 +notFlying=\u672a\u98db\u884c +notRecommendedBukkit= \u00a74Bukkit\u7248\u672c\u904e\u820a.\u5efa\u8b70\u66f4\u65b0. +notSupportedYet=\u66ab\u4e0d\u652f\u6301 +nothingInHand = \u00a74\u4f60\u6c92\u6709\u6301\u6709\u4efb\u4f55\u7269\u54c1 +now=\u73fe\u5728 +nuke=\u00a7d\u6838\u6b66\u964d\u843d,\u6ce8\u610f\u96b1\u853d\uff01 +numberRequired=\u9700\u8981\u8f38\u5165\u6578\u5b57\uff01 +onlyDayNight=/time \u547d\u4ee4\u53ea\u6709 day/night \u5169\u500b\u9078\u64c7 +onlyPlayerSkulls=\u00a74\u4f60\u53ea\u80fd\u8a2d\u7f6e\u4eba\u982d\u7684\u4e3b\u4eba (397:3). +onlyPlayers=\u00a74\u96bb\u6709\u904a\u6232\u4e2d\u73a9\u5bb6\u624d\u53ef\u4f7f\u7528 {0} +onlySunStorm=\u00a74/weather \u547d\u4ee4\u53ea\u6709 sun/storm \u5169\u500b\u9078\u64c7 +orderBalances=\u00a76\u6392\u5e8f {0} \u00a76\u500b\u73a9\u5bb6\u7684\u8cc7\u91d1\u4e2d,\u8acb\u7a0d\u5019\u2026\u2026 +oversizedTempban=\u00a74\u4f60\u53ef\u80fd\u6c92\u6709\u5728\u9019\u500b\u6642\u6bb5\u5c01\u7981\u73a9\u5bb6. +pTimeCurrent=\u00a76{0}\u00a7c \u00a76\u7684\u6642\u9593\u662f \u00a7c{1} +pTimeCurrentFixed=\u00a7c{0}\u00a76 \u7684\u6642\u9593\u88ab\u9023\u63a5\u5230 \u00a7c{1} +pTimeNormal=\u00a7c{0}\u00a76 \u7684\u6642\u9593\u662f\u6b63\u5e38\u7684\u4e26\u8207\u670d\u52d9\u5668\u540c\u6b65 +pTimeOthersPermission=\u00a74\u4f60\u672a\u88ab\u6388\u6b0a\u8a2d\u7f6e\u5176\u4ed6\u73a9\u5bb6\u7684\u6642\u9593 +pTimePlayers=\u00a76\u9019\u4e9b\u73a9\u5bb6\u6709\u4ed6\u5011\u81ea\u5df1\u7684\u6642\u9593: +pTimeReset=\u00a76\u8a72\u73a9\u5bb6\u7684\u6642\u9593\u88ab\u91cd\u7f6e:\u00a7c{0} +pTimeSet=\u00a76\u8a72\u73a9\u5bb6\u7684\u6642\u9593\u88ab\u8a2d\u5b9a\u70ba \u00a7c{0}\u00a76 \u5c0d\u8c61:\u00a7c{1} +pTimeSetFixed=\u00a76\u8a72\u73a9\u5bb6\u6642\u9593\u88ab\u9023\u63a5\u5230 \u00a7c{0}\u00a76 \u5c0d\u8c61:\u00a7c{1} +parseError=\u00a74\u89e3\u6790\u00a7c {0} \u00a74\u65bc\u7b2c \u00a7c{1}\u00a74 \u884c\u6642\u767c\u751f\u932f\u8aa4 +pendingTeleportCancelled=\u00a74\u5f85\u8655\u7406\u7684\u50b3\u9001\u8acb\u6c42\u5df2\u53d6\u6d88 +permissionsError=\u672a\u627e\u5230Permissions/GroupManager\u5916\u639b\u7a0b\u5f0f\uff1b\u804a\u5929\u7684 \u524d\u7db4/\u5c3e\u7db4 \u5c07\u4e0d\u8d77\u4f5c\u7528 +playerBanned=\u00a76\u7ba1\u7406\u54e1\u00a7c {0}\u00a76 \u5c01\u7981\u4e86 {1},\u00a76\u7406\u7531:{2} +playerInJail=\u00a74\u8a72\u73a9\u5bb6\u5df2\u5728\u76e3\u7344 {0} +playerJailed=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u88ab\u902e\u6355\u4e86 +playerJailedFor= \u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u88ab\u902e\u6355,\u6642\u9593:{1} +playerKicked=\u00a74\u7ba1\u7406\u54e1 \u00a7c{0} \u00a76\u8acb\u51fa\u4e86 \u00a7c{1},\u00a76\u7406\u7531:{2} +playerMuted=\u00a76\u4f60\u88ab\u7981\u6b62\u767c\u8a00 +playerMutedFor=\u00a76\u4f60\u5df2\u88ab\u7981\u8a00.\u7406\u7531: {0} +playerNeverOnServer=\u00a74\u73a9\u5bb6 \u00a7c{0} \u00a74\u5f9e\u6c92\u51fa\u73fe\u5728\u670d\u52d9\u5668\u904e +playerNotFound=\u00a74\u73a9\u5bb6\u672a\u5728\u7dda\uff08\u6216\u4e0d\u5b58\u5728\uff09 +playerUnmuted=\u00a76\u4f60\u88ab\u5141\u8a31\u767c\u8a00 +pong=\u556a\uff01 +posPitch=\u00a76\u4ef0\u89d2: {0} (\u982d\u90e8\u7684\u89d2\u5ea6) +posX=\u00a76X: {0} (+\u6771 <-> -\u897f) +posY=\u00a76Y: {0} (+\u4e0a <-> -\u4e0b) +posYaw=\u00a76Yaw: {0} (\u65cb\u8f49) +posZ=\u00a76Z: {0} (+\u5357 <-> -\u5317) +possibleWorlds=\u00a76\u53ef\u884c\u7684\u4e16\u754c\u6578\u91cf\u70ba 0 \u5171 {0} +potions=\u00a76\u85e5\u6c34:\u00a7r {0}\u00a76. +powerToolAir=\u00a74\u547d\u4ee4\u4e0d\u80fd\u5c0d\u7740\u7a7a\u6c23\u4f7f\u7528. +powerToolAlreadySet=\u00a74\u547d\u4ee4 \u00a7c{0}\u00a74 \u5df2\u88ab\u7d81\u5b9a\u5230 {1}. +powerToolAttach=\u00a7c{0}\u00a76 \u547d\u4ee4\u88ab\u7d81\u5b9a\u5230 {1} +powerToolClearAll=\u00a76\u6240\u6709\u5feb\u6377\u547d\u4ee4\u5df2\u88ab\u6e05\u9664 +powerToolList={1} \u6709\u5982\u4e0b\u547d\u4ee4:\u00a74{0}\u00a7r. +powerToolListEmpty={0} \u6c92\u6709\u88ab\u7d81\u5b9a\u547d\u4ee4 +powerToolNoSuchCommandAssigned=\u547d\u4ee4 \u00a74{0}\u00a7r \u672a\u88ab\u7d81\u5b9a\u5230 {1}. +powerToolRemove=\u547d\u4ee4 \u00a74{0}\u00a7r \u88ab\u5f9e {1} \u4e0a\u79fb\u9664 +powerToolRemoveAll=\u79fb\u9664\u4e86 {0} \u4e0a\u7684\u6240\u6709\u547d\u4ee4 +powerToolsDisabled=\u4f60\u6240\u6709\u7684\u5feb\u6377\u547d\u4ee4\u88ab\u51cd\u7d50 +powerToolsEnabled=\u4f60\u6240\u6709\u7684\u5feb\u6377\u547d\u4ee4\u88ab\u6fc0\u6d3b +protectionOwner=\u00a76[Essentials\u4fdd\u8b77] \u7269\u54c1\u64c1\u6709\u8005:\u00a7r{0} +questionFormat=\u00a72[\u63d0\u554f]\u00a7r {0} +readNextPage=\u00a76\u8f38\u5165 \u00a7c/{0} {1} \u00a76\u4f86\u95b1\u8b80\u4e0b\u4e00\u9801 +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=\u9019\u500b\u7de8\u865f\u6c92\u6709\u5339\u914d\u7684\u5408\u6210\u516c\u5f0f. +recipeFurnace=\u00a76\u51b6\u7149 \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 <\u6578\u5b57> \u53bb\u67e5\u770b\u66f4\u591a\u7684 \u00a7c{2}\u00a76\u5408\u6210\u516c\u5f0f. +recipeNone=\u5c0d{0}\u6c92\u6709\u5339\u914d\u7684\u5408\u6210\u516c\u5f0f +recipeNothing=\u6c92\u6709\u6771\u897f +recipeShapeless=\u00a76\u7d50\u5408 \u00a7c{0} +recipeWhere=\u00a76\u7576: {0} +reloadAllPlugins=\u00a76\u91cd\u8f09\u4e86\u6240\u6709\u5916\u639b\u7a0b\u5f0f +removed=\u00a76\u79fb\u9664\u4e86\u00a7c {0} \u00a76\u9805 +repair=\u00a76\u4f60\u5df2\u7d93\u6210\u529f\u7684\u4fee\u5fa9\u4e86\u4f60\u7684:\u00a7c{0} +repairAlreadyFixed=\u00a74\u8a72\u7269\u54c1\u7121\u9700\u4fee\u5fa9 +repairEnchanted=\u00a74\u4f60\u7121\u6b0a\u4fee\u5fa9\u9644\u9b54\u7269\u54c1 +repairInvalidType=\u00a74\u8a72\u7269\u54c1\u7121\u6cd5\u4fee\u5fa9 +repairNone=\u00a74\u9019\u88e1\u6c92\u6709\u9700\u8981\u4fee\u7406\u7684\u7269\u54c1 +requestAccepted=\u00a76\u5df2\u63a5\u53d7\u50b3\u9001\u8acb\u6c42 +requestAcceptedFrom=\u00a7c{0}\u00a76 \u63a5\u53d7\u4e86\u4f60\u7684\u50b3\u9001\u8acb\u6c42 +requestDenied=\u00a76\u5df2\u62d2\u7d55\u50b3\u9001\u8acb\u6c42 +requestDeniedFrom=\u00a7c{0}\u00a76 \u62d2\u7d55\u4e86\u4f60\u7684\u50b3\u9001\u8acb\u6c42 +requestSent=\u00a76\u8acb\u6c42\u5df2\u767c\u9001\u7d66 {0}\u00a76 +requestTimedOut=\u00a74\u50b3\u9001\u8acb\u6c42\u8d85\u6642\u2026\u2026 +requiredBukkit= \u00a76\u4f60\u9700\u8981\u7248\u672c {0} \u4ee5\u4e0a\u7684bukkit.\u8acb\u81f3\u5b98\u7db2\u4e0b\u8f09 +resetBal=\u00a76\u5df2\u7d93\u91cd\u7f6e\u6240\u6709\u5728\u7dda\u73a9\u5bb6\u7684\u91d1\u9322\u5230 \u00a7a{0} \u00a76. +resetBalAll=\u00a76\u5df2\u7d93\u91cd\u7f6e\u6240\u6709\u73a9\u5bb6\u7684\u91d1\u9322 \u00a7a{0} \u00a76. +returnPlayerToJailError=\u00a74\u5c07\u73a9\u5bb6{0}\u95dc\u56de\u76e3\u7344{1}\u6642\u767c\u751f\u932f\u8aa4 +runningPlayerMatch=\u00a76\u6b63\u5728\u641c\u7d22\u5339\u914d\u7684\u73a9\u5bb6 \u00a7c{0}\u00a76 (\u9019\u53ef\u80fd\u6703\u82b1\u8cbb\u4e00\u4e9b\u6642\u9593) +second=\u79d2 +seconds=\u79d2 +seenOffline=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u6700\u8fd1\u4e00\u6b21\u00a74\u4e0b\u7dda\u00a76\u70ba {1} +seenOnline=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u6700\u8fd1\u4e00\u6b21\u00a7a\u767b\u9304\u00a76\u70ba {1} +serverFull=\u670d\u52d9\u5668\u5df2\u6eff +serverTotal=\u00a76\u670d\u52d9\u5668\u7e3d\u548c: {0} +setSpawner=\u00a76\u6539\u8b8a\u5237\u602a\u7c60\u70ba {0} +sheepMalformedColor=\u00a74\u7121\u6548\u7684\u984f\u8272 +shoutFormat=\u00a76[\u558a\u8a71]\u00a7r {0} +signFormatFail=\u00a74[{0}] +signFormatSuccess=\u00a71[{0}] +signFormatTemplate=[{0}] +signProtectInvalidLocation=\u00a74\u4f60\u4e0d\u5141\u8a31\u5728\u6b64\u653e\u7f6e\u724c\u5b50 +similarWarpExist=\u00a74\u4e00\u500b\u540c\u540d\u7684\u5730\u6a19\u5df2\u5b58\u5728 +slimeMalformedSize=\u00a74\u5927\u5c0f\u975e\u6cd5 +soloMob=\u00a74\u8a72\u751f\u7269\u559c\u6b61\u7368\u5c45 +spawnSet=\u00a76\u5df2\u70ba\u00a7c {0}\u00a76 \u7d44\u7684\u8a2d\u7f6e\u51fa\u751f\u9ede +spawned=\u5df2\u751f\u6210 +sudoExempt=\u00a74\u7121\u6cd5\u5f37\u5236\u4f7f\u6b64\u73a9\u5bb6\u57f7\u884c\u547d\u4ee4 +sudoRun=\u00a76\u5f37\u5236\u4f7f\u00a7c {0} \u00a76\u904b\u884c\u547d\u4ee4:\u00a7r /{1} {2} +suicideMessage=\u00a76\u6c38\u5225\u4e86,\u6b98\u9177\u7684\u4e16\u754c\u2026\u2026 +suicideSuccess= \u00a7c{0} \u00a76\u7d50\u675f\u4e86\u4ed6\u81ea\u5df1\u7684\u751f\u547d +survival=\u751f\u5b58\u6a21\u5f0f +takenFromAccount=\u00a7a\u5f9e\u4f60\u7684\u8cec\u6236\u4e2d\u6263\u9664\u4e86 {0} +takenFromOthersAccount=\u00a7a\u5f9e {1} \u00a7a\u4e2d\u7684\u8cec\u6236\u6263\u9664\u4e86 {0}.\u76ee\u524d\u91d1\u9322: {2} +teleportAAll=\u00a76\u5411\u6240\u6709\u73a9\u5bb6\u767c\u9001\u4e86\u50b3\u9001\u8acb\u6c42\u2026\u2026 +teleportAll=\u00a76\u50b3\u9001\u4e86\u6240\u6709\u73a9\u5bb6\u2026\u2026 +teleportAtoB=\u00a7c{0}\u00a76 \u50b3\u9001\u4f60\u5230 {1}\u00a76 +teleportDisabled=\u00a7c{0}\u00a74 \u53d6\u6d88\u4e86\u50b3\u9001 +teleportHereRequest=\u00a7c{0}\u00a74 \u8acb\u6c42\u4f60\u50b3\u9001\u5230\u4ed6\u90a3\u88e1 +teleportNewPlayerError=\u00a74\u50b3\u9001\u65b0\u73a9\u5bb6\u5931\u6557 +teleportRequest=\u00a7c{0}\u00a76 \u8acb\u6c42\u50b3\u9001\u5230\u4f60\u9019\u88e1 +teleportRequestTimeoutInfo=\u00a76\u6b64\u8acb\u6c42\u5c07\u5728 {0} \u79d2\u5167\u53d6\u6d88 +teleportTop=\u00a76\u50b3\u9001\u5230\u9802\u90e8 +teleportationCommencing=\u00a76\u6e96\u5099\u50b3\u9001... +teleportationDisabled=\u00a76\u50b3\u9001\u5df2\u7981\u7528 +teleportationDisabledFor=\u00a76\u50b3\u9001\u5df2\u5c0d {0} \u7981\u7528. +teleportationEnabled=\u00a76\u50b3\u9001\u5df2\u555f\u7528 +teleportationEnabledFor=\u00a76\u50b3\u9001\u5df2\u5c0d {0} \u555f\u7528. +teleporting=\u00a76\u6b63\u5728\u50b3\u9001... +teleportingPortal=\u00a76\u6b63\u5728\u901a\u904e\u50b3\u9001\u9580\u50b3\u9001... +tempBanned=\u5df2\u81e8\u6642\u88ab\u670d\u52d9\u5668\u5c01\u7981,\u7406\u7531:{0} +tempbanExempt=\u00a76\u4f60\u7121\u6cd5\u81e8\u6642\u5c01\u7981\u6389\u8a72\u73a9\u5bb6 +thunder=\u00a76\u4f60 \u00a7c{0} \u00a76\u4e86\u4f60\u7684\u4e16\u754c\u7684\u9583\u96fb +thunderDuration=\u00a76\u4f60 \u00a7c{0} \u00a76\u4e86\u4f60\u7684\u4e16\u754c\u7684\u9583\u96fb\u00a7c {1} \u00a76\u79d2 +timeBeforeHeal=\u00a76\u6cbb\u7642\u51b7\u537b:{0} +timeBeforeTeleport=\u00a76\u50b3\u9001\u51b7\u537b:{0} +timeFormat=\u00a7c{0}\u00a76 or \u00a7c{1}\u00a76 or \u00a7c{2}\u00a76 +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=\u00a76\u6240\u6709\u4e16\u754c\u7684\u4e16\u754c\u5df2\u8a2d\u7f6e +timeSetPermission=\u00a74\u4f60\u6c92\u6709\u8a2d\u7f6e\u6642\u9593\u7684\u6b0a\u9650 +timeWorldCurrent=\u00a76\u76ee\u524d\u4e16\u754c {0} \u7684\u6642\u9593\u662f \u00a73{1} +timeWorldSet=\u00a76\u6642\u9593\u88ab\u8a2d\u7f6e\u70ba {0} \u65bc\u4e16\u754c:\u00a74{1} +totalWorthAll=\u00a7a\u51fa\u552e\u7684\u6240\u6709\u7269\u54c1\u548c\u65b9\u584a\uff0c\u7e3d\u50f9\u503c {1}. +totalWorthBlocks=\u00a7a\u51fa\u552e\u7684\u6240\u6709\u65b9\u584a\u584a\uff0c\u7e3d\u50f9\u503c {1}. +tps=\u00a76\u7576\u524d TPS = {0} +tradeCompleted=\u00a7a\u4ea4\u6613\u5b8c\u7562 +tradeSignEmpty=\u00a74\u4ea4\u6613\u724c\u4e0a\u6c92\u6709\u4f60\u53ef\u7372\u5f97\u7684\u6771\u897f +tradeSignEmptyOwner=\u00a74\u4ea4\u6613\u724c\u4e0a\u6c92\u6709\u4f60\u53ef\u6536\u96c6\u7684\u6771\u897f +treeFailure=\u00a74\u751f\u6210\u6a39\u6728\u5931\u6557,\u5728\u8349\u584a\u4e0a\u6216\u571f\u4e0a\u518d\u8a66\u4e00\u6b21 +treeSpawned=\u00a76\u751f\u6210\u6a39\u6728\u6210\u529f +true=\u00a7a\u662f\u00a7r +typeTpaccept=\u00a76\u82e5\u60f3\u63a5\u53d7\u50b3\u9001,\u8f38\u5165 \u00a74/tpaccept\u00a76 +typeTpdeny=\u00a76\u82e5\u60f3\u62d2\u7d55\u50b3\u9001,\u8f38\u5165 \u00a74/tpdeny\u00a76 +typeWorldName=\u00a76\u4f60\u4e5f\u53ef\u4ee5\u8f38\u5165\u6307\u5b9a\u7684\u4e16\u754c\u7684\u540d\u5b57 +unableToSpawnMob=\u00a74\u751f\u6210\u751f\u7269\u5931\u6557 +unignorePlayer=\u00a76\u4f60\u5df2\u4e0d\u518d\u5c4f\u853d\u73a9\u5bb6 {0} +unknownItemId=\u00a74\u672a\u77e5\u7684\u7269\u54c1ID:{0} +unknownItemInList=\u00a74\u672a\u77e5\u7684\u7269\u54c1 {0} \u65bc {1} \u5217\u8868 +unknownItemName=\u00a74\u672a\u77e5\u7684\u7269\u54c1\u540d\u7a31:{0} +unlimitedItemPermission=\u00a74\u6c92\u6709\u6b0a\u9650\u4f86\u4f7f\u8a72\u7269\u54c1\u7121\u9650 {0} +unlimitedItems=\u00a76\u7121\u9650\u7269\u54c1: +unmutedPlayer=\u00a76\u73a9\u5bb6 \u00a7c{0}\u00a76 \u88ab\u5141\u8a31\u767c\u8a00 +unvanished=\u00a76\u5df2\u9000\u51fa\u96b1\u8eab\u6a21\u5f0f. +unvanishedReload=\u00a74\u5916\u639b\u7a0b\u5f0f\u91cd\u8f09\u8feb\u4f7f\u4f60\u7684\u96b1\u8eab\u6a21\u5f0f\u5931\u6548. +upgradingFilesError=\u5347\u7d1a\u6587\u4ef6\u6642\u767c\u751f\u932f\u8aa4 +uptime=\u00a76\u904b\u884c\u6642\u9593:\u00a7c {0} +userAFK=\u00a75{0} \u00a75\u73fe\u5728\u96e2\u958b, \u53ef\u80fd\u66ab\u6642\u6c92\u8fa6\u6cd5\u56de\u61c9. +userDoesNotExist=\u00a74\u73a9\u5bb6 \u00a7c{0} \u00a74\u4e0d\u5b58\u5728. +userIsAway=\u00a7d{0} \u00a7d\u66ab\u6642\u96e2\u958b\u4e86 +userIsNotAway=\u00a7d{0} \u00a7d\u56de\u4f86\u4e86 +userJailed=\u00a76\u4f60\u5df2\u88ab\u76e3\u7981 +userUnknown=\u00a74\u8b66\u544a: \u9019\u500b\u73a9\u5bb6 \u00a7c{0}\u00a74 \u5f9e\u4f86\u6c92\u6709\u52a0\u5165\u904e\u670d\u52d9\u5668. +userUsedPortal={0} \u4f7f\u7528\u4e86\u73fe\u6709\u7684\u9000\u51fa\u50b3\u9001\u9580. +userdataMoveBackError=\u79fb\u52d5 userdata/{0}.tmp \u5230 userdata/{1} \u5931\u6557 +userdataMoveError=\u79fb\u52d5 userdata/{0} \u5230 userdata/{1}.tmp \u5931\u6557 +usingTempFolderForTesting=\u4f7f\u7528\u7de9\u5b58\u6587\u4ef6\u593e\u4f86\u6e2c\u8a66: +vanished=\u00a76\u5df2\u9032\u5165\u96b1\u8eab\u6a21\u5f0f,\u73a9\u5bb6\u5c07\u7121\u6cd5\u770b\u5230\u4f60. +versionMismatch=\u00a74\u7248\u672c\u4e0d\u5339\u914d\uff01\u8acb\u5347\u7d1a {0} \u5230\u76f8\u540c\u7248\u672c. +versionMismatchAll=\u00a74\u7248\u672c\u4e0d\u5339\u914d\uff01\u8acb\u5347\u7d1a\u6240\u6709Essentials\u7cfb\u5217\u7684\u5916\u639b\u7a0b\u5f0f\u5230\u76f8\u540c\u7248\u672c. +voiceSilenced=\u00a76\u5df2\u975c\u97f3 +walking=\u884c\u8d70\u4e2d +warpDeleteError=\u00a74\u522a\u9664\u5730\u6a19\u6587\u4ef6\u6642\u767c\u751f\u932f\u8aa4 +warpList={0} +warpListPermission=\u00a74\u4f60\u6c92\u6709\u5217\u51fa\u5730\u6a19\u7684\u6b0a\u9650 +warpNotExist=\u00a74\u8a72\u5730\u6a19\u4e0d\u5b58\u5728 +warpOverwrite=\u00a74\u4f60\u4e0d\u80fd\u91cd\u7f6e\u8a72\u5730\u8868 +warpSet=\u00a76\u5730\u6a19 \u00a7c{0} \u00a76\u5df2\u8a2d\u7f6e +warpUsePermission=\u00a74\u4f60\u6c92\u6709\u4f7f\u7528\u8a72\u5730\u6a19\u7684\u6b0a\u9650 +warpingTo=\u00a76\u50b3\u9001\u5230\u5730\u6a19 \u00a7c{0} +warps=\u00a76\u5730\u6a19: \u00a7r{0} +warpsCount=\u00a76\u9019\u6709 {0} \u5730\u6a19,\u986f\u793a \u7b2c {1} \u9801/\u5171 {2} \u9801 +weatherStorm=\u00a76\u4f60\u5c07 {0} \u7684\u5929\u6c23\u6539\u70ba\u96e8\u96ea +weatherStormFor=\u00a76\u4f60\u5c07 {0} \u7684\u5929\u6c23\u7684\u6539\u70ba\u96e8\u96ea,\u6301\u7e8c {1} \u79d2 +weatherSun=\u00a76\u4f60\u5c07 {0} \u7684\u5929\u6c23\u6539\u70ba\u6674\u5929 +weatherSunFor=\u00a76\u4f60\u5c07 {0} \u7684\u5929\u6c23\u7684\u6539\u70ba\u6674\u5929,\u6301\u7e8c {1} \u79d2 +whoisAFK=\u00a76 - \u66ab\u96e2:\u00a7r {0} +whoisBanned=\u00a76 - \u5c01\u7981:\u00a7r {0} +whoisExp=\u00a76 - \u7d93\u9a57:\u00a7r {0} (\u7b49\u7d1a {1}) +whoisFly=\u00a76 - \u98db\u884c\u6a21\u5f0f:\u00a7r {0} ({1}) +whoisGamemode=\u00a76 - \u904a\u6232\u6a21\u5f0f:\u00a7r {0} +whoisGeoLocation=\u00a76 - \u5730\u7406\u4f4d\u7f6e:\u00a7r {0} +whoisGod=\u00a76 - \u4e0a\u5e1d\u6a21\u5f0f:\u00a7r {0} +whoisHealth=\u00a76 - \u751f\u547d:\u00a7r {0}/20 +whoisIPAddress=\u00a76 - IP\u4f4d\u5740:\u00a7r {0} +whoisJail=\u00a76 - \u76e3\u7344:\u00a7r {0} +whoisLocation=\u00a76 - \u5750\u6a19:\u00a7r ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - \u73fe\u91d1:\u00a7r {0} +whoisMuted=\u00a76 - \u7981\u8a00:\u00a7r {0} +whoisNick=\u00a76 - \u66b1\u7a31:\u00a7r {0} +whoisOp=\u00a76 - OP:\u00a7r {0} +whoisTop=\u00a76 ====== \u00a7c {0} \u00a76\u7684\u8cc7\u6599====== +worth=\u00a76\u4e00\u7d44 {0} \u50f9\u503c \u00a74{1}\u00a76\uff08{2} \u55ae\u4f4d\u7269\u54c1,\u6bcf\u500b\u50f9\u503c {3}\uff09 +worthMeta=\u00a7a\u4e00\u7d44\u526f\u78bc\u70ba {1} \u7684 {0} \u50f9\u503c \u00a7c{2}\u00a76\uff08{3} \u55ae\u4f4d\u7269\u54c1,\u6bcf\u500b\u50f9\u503c {4}\uff09 +worthSet=\u00a76\u50f9\u683c\u5df2\u8a2d\u7f6e +year=\u5e74 +years=\u5e74 +youAreHealed=\u00a76\u4f60\u5df2\u88ab\u6cbb\u7642 +youHaveNewMail=\u00a76\u4f60\u64c1\u6709 \u00a7c{0}\u00a76 \u689d\u6d88\u606f\uff01\u00a7r\u8f38\u5165 \u00a7c/mail read\u00a76 \u4f86\u67e5\u770b +playerUnbanned=\u00a76\u5df2\u89e3\u9664\u7528\u6236\u00a7c {0} \u00a76\u7684\u5c01\u7981 {1}. +playerUnbanIpAddress=\u00a76\u5df2\u89e3\u9664\u7528\u6236\u00a7c {0} \u00a76\u7684\u5c01\u7981IP: {1}. +playerBanIpAddress=\u00a76\u5df2\u5c01\u7981\u7528\u6236\u00a7c {0} \u00a76\u7684IP\u4f4d\u5740 {1}\u00a76. +noPotionEffectPerm=\u00a74\u4f60\u6c92\u6709\u6b0a\u9650\u61c9\u7528\u7279\u6548 \u00a7c{0} \u00a74\u5230\u9019\u500b\u85e5\u6c34. +invalidPotionMeta=\u00a74\u7121\u6548\u7684\u85e5\u6c34\u6578\u64da: \u00a7c{0}\u00a74. +balanceOther=\u00a7a{0}\u7684\u91d1\u9322:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76\u7684\u5929\u6c23\u662f\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76\u7684\u5929\u6c23\u662f\u6b63\u5e38\u7684. +pWeatherOthersPermission=\u00a74\u60a8\u6c92\u6709\u88ab\u6388\u6b0a\u8a2d\u7f6e\u5176\u4ed6\u73a9\u5bb6\u7684\u5929\u6c23. +pWeatherPlayers=\u00a76\u9019\u4e9b\u73a9\u5bb6\u90fd\u6709\u81ea\u5df1\u7684\u5929\u6c23:\u00a7r +pWeatherReset=\u00a76\u73a9\u5bb6\u7684\u5929\u6c23\u88ab\u91cd\u7f6e: \u00a7c{0} +pWeatherSet=\u00a76\u73a9\u5bb6\u00a7c{1}\u00a76\u7684\u5929\u6c23\u88ab\u8a2d\u7f6e\u70ba \u00a7c{0}\u00a76 . +pWeatherInvalidAlias=\u00a74\u932f\u8aa4\u7684\u5929\u6c23\u985e\u578b +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitNotFound=\u00a74That kit does not exist. +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +kitOnce=\u00a74You can't use that kit again. +invalidHomeName=\u00a74Invalid home name! +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. +holdBook=\u00a74You are not holding a writable book. +editBookContents=\u00a7eYou may now edit the contents of this book. +bookAuthorSet=\u00a76Author of the book set to {0}. +bookLocked=\u00a76This book is now locked. +bookTitleSet=\u00a76Title of the book set to {0}. +insufficientFunds=\u00a74Insufficient funds available. +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. diff --git a/Essentials/src/messages_zh_TW.properties b/Essentials/src/messages_zh_TW.properties new file mode 100644 index 0000000000..f048e32f01 --- /dev/null +++ b/Essentials/src/messages_zh_TW.properties @@ -0,0 +1,549 @@ +#version: TeamCity +# Single quotes have to be doubled: '' +# Translations start here +# by: \u00e7\u0099\u00bd\u00e5\u00af\u00b6\u00e7\u009f\u00b3\u00e6\u00bc\u00a2\u00e5\u008c\u0096\u00e7\u00b5\u0084:\u00e5\u00a4\u00a7\u00e5\u008a\u0089, pa001024 +action=\u00a7d* {0} \u00a7r5{1} +addedToAccount=\u00a7a{0} \u5df2\u6dfb\u52a0\u5230\u4f60\u7684\u9280\u884c\u8cec\u6236 +addedToOthersAccount=\u00a7a{0} \u5df2\u88ab\u6dfb\u52a0\u5230 {1} \u00a7a\u7684\u8cec\u6236.\u76ee\u524d\u9918\u984d: {2} +adventure=\u5192\u96aa\u6a21\u5f0f +alertBroke=\u7834\u58de: +alertFormat=\u00a73[{0}] \u00a7r {1} \u00a76 {2} \u65bc: {3} +alertPlaced=\u653e\u7f6e: +alertUsed=\u4f7f\u7528: +antiBuildBreak=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u7834\u58de\u00a74 {0} \u00a74\u9019\u500b\u65b9\u584a. +antiBuildCraft=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u653e\u7f6e\u00a74 {0} \u00a74\u9019\u500b\u65b9\u584a. +antiBuildDrop=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u653e\u7f6e\u00a74 {0} \u00a74\u9019\u500b\u65b9\u584a. +antiBuildInteract=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u8207\u00a74 {0}\u00a74\u4ea4\u4e92. +antiBuildPlace=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u653e\u7f6e\u00a74 {0} \u00a74\u9019\u500b\u65b9\u584a. +antiBuildUse=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u4f7f\u7528\u00a74 {0}\u00a74. +autoAfkKickReason=\u4f60\u56e0\u70ba\u9577\u6642\u9593\u672a\u80fd\u5728\u904a\u6232\u4e2d\u505a\u51fa\u52d5\u4f5c\u4e26\u8d85\u904e {0} \u5206\u9418\u800c\u88ab\u4f3a\u670d\u5668\u8acb\u51fa\uff01 +backAfterDeath=\u00a76\u4f7f\u7528\u300c/back\u300d\u547d\u4ee4\u4f86\u56de\u5230\u6b7b\u4ea1\u5730\u9ede +backUsageMsg=\u00a76\u56de\u5230\u4e0a\u4e00\u4f4d\u7f6e +backupDisabled=\u00a74\u5099\u4efd\u914d\u7f6e\u6587\u4ef6\u672a\u88ab\u8a2d\u7f6e. +backupFinished=\u00a76\u5099\u4efd\u5b8c\u6210. +backupStarted=\u00a76\u5099\u4efd\u958b\u59cb +balance=\u00a7a\u73fe\u91d1:{0} +balanceTop=\u00a76\u91d1\u9322\u6392\u884c:{0} +banExempt=\u00a74\u4f60\u4e0d\u80fd\u5c01\u7981\u90a3\u500b\u73a9\u5bb6\u00a7r +banFormat=\u00a74\u5df2\u5c01\u7981:\u00a7r {0} +bed=\u00a77\u5e8a\u00a7r +bedMissing=\u00a7r54\u4f60\u7684\u5e8a\u5df2\u4e1f\u5931\u6216\u963b\u64cb +bedNull=\u00a7m\u5e8a\u00a7r +bedSet=\u00a7m\u5df2\u8a2d\u7f6e\u5e8a\u00a7r +bigTreeFailure=\u00a74\u751f\u6210\u5927\u6a39\u5931\u6557.\u5728\u571f\u584a\u6216\u8349\u584a\u4e0a\u9762\u518d\u8a66\u4e00\u6b21 +bigTreeSuccess=\u00a76\u5df2\u751f\u6210\u5927\u6a39 +blockList=\u00a76Essentials \u5916\u639b\u7a0b\u5f0f\u5c07\u50b3\u905e\u4e0b\u5217\u6307\u4ee4\u7d66\u53e6\u4e00\u5916\u639b\u7a0b\u5f0f: +broadcast=\u00a7r\u00a76[\u00a74\u516c\u544a\u00a76]\u00a7a {0} +buildAlert=\u00a74\u4f60\u6c92\u6709\u5efa\u9020\u8a31\u53ef\u6b0a! +bukkitFormatChanged=Bukkit\u7248\u672c\u5df2\u6539\u8b8a +burnMsg=\u00a76\u4f60\u5c07\u4f7f \u00a74{0} \u00a76\u71c3\u71d2\u00a74 {1} \u00a76\u79d2 +canTalkAgain=\u00a76\u4f60\u5df2\u7372\u5f97\u767c\u8a00\u7684\u8cc7\u683c +cantFindGeoIpDB=\u7121\u6cd5\u627e\u5230GeoIP\u8cc7\u6599\u5eab\uff01 +cantReadGeoIpDB=\u8b80\u53d6GeoIP\u8cc7\u6599\u5eab\u5931\u6557\uff01 +cantSpawnItem=\u00a74\u4f60\u6c92\u6709\u751f\u6210 {0} \u7684\u8a31\u53ef\u6b0a +cantFindGeoIpDB=\u627e\u4e0d\u5230GeoIP\u8cc7\u6599\u5eab! +cantReadGeoIpDB=GeoIP\u8cc7\u6599\u5eab\u8b80\u53d6\u5931\u6557! +cantSpawnItem=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u751f\u6210\u7269\u54c1\u00a7c {0}\u00a74. +chatTypeAdmin=[A] +chatTypeLocal=[L] +chatTypeSpy=[Spy] +cleaned=\u7528\u6236\u6587\u4ef6\u5df2\u6e05\u7a7a +cleaning=\u6e05\u7a7a\u7528\u6236\u6587\u4ef6... +commandFailed=\u547d\u4ee4 {0} \u5931\u6557: +commandHelpFailedForPlugin=\u672a\u80fd\u7372\u53d6\u6b64\u5916\u639b\u7a0b\u5f0f\u7684\u5e6b\u52a9:{0} +commandNotLoaded=\u00a74 {0} \u547d\u4ee4\u8f09\u5165\u5931\u6557 +compassBearing=\u00a76\u65b9\u5411:{0}\uff08{1}\u5ea6\uff09 +configFileMoveError=\u79fb\u52d5config.yml\u6587\u4ef6\u5230\u5099\u4efd\u4f4d\u7f6e\u5931\u6557 +configFileRenameError=\u91cd\u547d\u540d\u7de9\u5b58\u6587\u4ef6\u70baconfig.yml\u5931\u6557 +connectedPlayers=\u00a76\u76ee\u524d\u5728\u7dda: \u00a7r +connectionFailed=\u9023\u63a5\u5931\u6557. +cooldownWithMessage=\u00a74\u51b7\u537b\u6642\u9593:{0} +corruptNodeInConfig=\u00a74\u6ce8\u610f:\u4f60\u7684\u914d\u7f6e\u5167\u5b58\u5728\u4e00\u500b\u640d\u58de\u7684 {0} \u7bc0\u9ede +couldNotFindTemplate=\u00a74\u7121\u6cd5\u627e\u5230\u6a21\u7248 {0} +creatingConfigFromTemplate=\u5f9e\u6a21\u7248:{0} \u5275\u5efa\u914d\u7f6e +creatingEmptyConfig=\u5275\u5efa\u7a7a\u7684\u914d\u7f6e:{0} +creative=\u5275\u9020\u6a21\u5f0f +currency={0}{1} +currentWorld=\u00a76\u7576\u524d\u4e16\u754c:\u00a74 {0} +day=\u5929 +days=\u5929 +defaultBanReason=\u767b\u9304\u5931\u6557!\u60a8\u7684\u5e33\u865f\u5df2\u88ab\u6b64\u4f3a\u670d\u5668\u5c01\u7981! +deleteFileError=\u7121\u6cd5\u522a\u9664\u6587\u4ef6:{0} +deleteHome=\u00a76\u5bb6 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deleteJail=\u00a76\u76e3\u7344 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deleteWarp=\u00a76\u5730\u6a19 \u00a74{0} \u00a76\u88ab\u79fb\u9664 +deniedAccessCommand=\u00a7c{0} \u00a74\u88ab\u62d2\u7d55\u4f7f\u7528\u547d\u4ee4 +denyBookEdit=\u00a74\u4f60\u4e0d\u80fd\u89e3\u9396\u9019\u672c\u66f8. +denyChangeAuthor=\u00a74\u4f60\u4e0d\u80fd\u6539\u8b8a\u9019\u672c\u66f8\u7684\u4f5c\u8005. +denyChangeTitle=\u00a74\u4f60\u4e0d\u80fd\u6539\u8b8a\u9019\u672c\u66f8\u7684\u6a19\u984c. +dependancyDownloaded=[Essentials\u5916\u639b\u7a0b\u5f0f] \u9644\u5c6c\u6587\u4ef6 {0} \u4e0b\u8f09\u6210\u529f +dependancyException=[Essentials\u5916\u639b\u7a0b\u5f0f] \u4e0b\u8f09\u9644\u5c6c\u6587\u4ef6\u6642\u767c\u751f\u932f\u8aa4 +dependancyNotFound=[Essentials\u5916\u639b\u7a0b\u5f0f] \u672a\u627e\u5230\u4e00\u500b\u6240\u9700\u7684\u9644\u5c6c\u6587\u4ef6,\u958b\u59cb\u81ea\u52d5\u4e0b\u8f09 +depth=\u00a76\u4f60\u4f4d\u65bc\u6d77\u62d40\u683c\u8655 +depthAboveSea=\u00a76\u4f60\u4f4d\u65bc\u6d77\u62d4\u6b63\u00a7c{0}\u00a76\u683c\u8655 +depthBelowSea=\u00a76\u4f60\u4f4d\u65bc\u6d77\u62d4\u8ca0\u00a7c{0}\u00a76\u683c\u8655 +destinationNotSet=\u76ee\u7684\u5730\u672a\u8a2d\u7f6e. +disableUnlimited=\u00a76\u53d6\u6d88\u4e86 {1} \u7684\u7121\u9650\u653e\u7f6e \u00a7c{0} \u00a76\u7684\u80fd\u529b +disabled=\u95dc\u9589 +disabledToSpawnMob=\u00a74\u5df2\u7981\u6b62\u6b64\u751f\u7269\u7684\u751f\u6210. +distance=\u00a76\u8ddd\u96e2: {0} +dontMoveMessage=\u00a76\u50b3\u9001\u5c07\u5728{0}\u5167\u958b\u59cb.\u4e0d\u8981\u79fb\u52d5 +downloadingGeoIp=\u4e0b\u8f09GeoIP\u8cc7\u6599\u5eab\u4e2d +duplicatedUserdata=\u8907\u88fd\u4e86\u73a9\u5bb6\u5b58\u6a94:{0} \u548c {1} +durability=\u00a76\u9019\u500b\u5de5\u5177\u9084\u6709 \u00a74{0}\u00a76 \u6301\u4e45 +enableUnlimited=\u00a76\u7d66\u4e88\u4e86 \u00a7c{1} \u00a76\u7684\u7121\u9650\u653e\u7f6e \u00a7c{0} \u00a76\u7684\u80fd\u529b +enableUnlimited=\u00a76\u7121\u9650\u5236\u7684\u00a7c {0} \u00a76\u5df2\u7d93\u7d66\u8207 {1}. +enabled=\u958b\u555f +enchantmentApplied = \u00a76\u9644\u9b54 \u00a7c{0} \u00a76\u5df2\u88ab\u61c9\u7528\u5230\u4f60\u624b\u4e2d\u7684\u5de5\u5177. +enchantmentNotFound = \u00a74\u672a\u627e\u5230\u8a72\u9644\u9b54. +enchantmentPerm = \u00a74\u4f60\u6c92\u6709\u9032\u884c\u00a7c {0} \u00a74\u9644\u9b54\u7684\u8a31\u53ef\u6b0a. +enchantmentRemoved = \u00a76\u9644\u9b54 \u00a7c{0} \u00a76\u5df2\u5f9e\u4f60\u624b\u4e0a\u7684\u5de5\u5177\u79fb\u9664 +enchantments = \u00a76\u9644\u9b54: \u00a7r{0} +errorCallingCommand=\u932f\u8aa4\u7684\u547c\u53eb\u547d\u4ee4:/{0} +errorWithMessage=\u00a7c\u932f\u8aa4:{0} +essentialsHelp1=Essentials\u7121\u6cd5\u5c07\u5176\u6253\u958b +essentialsHelp2=Essentials\u7121\u6cd5\u5c07\u5176\u6253\u958b +essentialsReload=\u00a76Essentials \u5df2\u91cd\u65b0\u8f09\u5165\u00a7c{0} +exp=\u00a74{0} \u00a76\u64c1\u6709\u00a7c {1} \u00a76\u7d93\u9a57\u503c (\u7b49\u7d1a\u00a7c {2}\u00a76) \u9700\u8981\u00a7c {3} \u00a76\u7d93\u9a57\u624d\u80fd\u5347\u7d1a. +expSet=\u00a7c\u4f60\u5c07{0} \u00a76\u7684\u7d93\u9a57\u8a2d\u7f6e\u70ba\u00a7c {1} \u00a76\u7d93\u9a57\u503c. +extinguish=\u00a76\u4f60\u7184\u6ec5\u4e86\u4f60\u81ea\u5df1\u8eab\u4e0a\u7684\u706b +extinguishOthers=\u00a76\u4f60\u7184\u6ec5\u4e86 {0} \u00a76\u8eab\u4e0a\u7684\u706b +failedToCloseConfig=\u95dc\u9589\u914d\u7f6e {0} \u5931\u6557 +failedToCreateConfig=\u5275\u5efa\u914d\u7f6e {0} \u5931\u6557 +failedToWriteConfig=\u5beb\u5165\u914d\u7f6e {0} \u5931\u6557 +false=\u00a74\u5426\u00a7r +feed=\u5df2\u7d93\u98fd\u548c,\u7121\u6cd5\u589e\u52a0\u98e2\u9913\u5ea6. +feedOther=\u00a76\u5df2\u7d93\u98fd\u548c{0}. +fileRenameError=\u91cd\u547d\u540d\u6587\u4ef6 {0} \u5931\u6557 +fireworkColor=\u00a74\u4f7f\u7528\u4e86\u7121\u6548\u7684\u7159\u82b1\u586b\u5145\u53c3\u6578\uff0c\u5fc5\u9808\u9996\u5148\u8a2d\u7f6e\u4e00\u500b\u984f\u8272\u3002 +fireworkEffectsCleared=\u00a76\u5f9e\u6301\u6709\u7684\u7269\u54c1\u4e2d\u79fb\u9664\u4e86\u6240\u6709\u7279\u6548. +fireworkSyntax=\u00a76\u7159\u82b1\u53c3\u6578:\u00a7c color:<\u984f\u8272> [fade:<\u6de1\u51fa\u984f\u8272>] [shape:<\u5f62\u614b>] [effect:<\u7279\u6548>]\n\u00a76\u8981\u4f7f\u7528\u591a\u500b\u984f\u8272/\u7279\u6548, \u4f7f\u7528\u9017\u865f: \u00a7cred,blue,pink\n\u00a76\u5f62\u72c0:\u00a7c star, ball, large, creeper, burst \u00a76\u7279\u6548:\u00a7c trail, twinkle. +flyMode=\u00a76 \u5df2\u70ba\u00a7c{1}\u00a76\u8a2d\u7f6e\u4e86\u98db\u884c\u6a21\u5f0f\u70ba\u00a7c{0}. +flying=\u98db\u884c\u4e2d +foreverAlone=\u00a74\u4f60\u6c92\u6709\u53ef\u56de\u5fa9\u7684\u73a9\u5bb6 +freedMemory=\u91cb\u653e\u4e86 {0} MB +fullStack=\u00a74\u4f60\u7684\u7269\u54c1\u5df2\u7d93\u6700\u591a\u4e86. +gameMode=\u00a76\u5df2\u8a2d\u7f6e{1}\u7684\u904a\u6232\u6a21\u5f0f\u70ba{0}. +gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 \u5340\u584a, \u00a7c{3}\u00a76 \u5be6\u9ad4. +gcfree=\u7a7a\u9592\u5167\u5b58: \u00a7c{0} MB +gcmax=\u6700\u5927\u5167\u5b58: \u00a7c{0} MB +gctotal=\u5df2\u5206\u914d\u5167\u5b58: \u00a7c{0} MB +geoIpUrlEmpty=GeoIP\u4e0b\u8f09\u9023\u7d50\u70ba\u7a7a +geoIpUrlInvalid=GeoIP\u4e0b\u8f09\u9023\u7d50\u5931\u6548 +geoipJoinFormat=\u73a9\u5bb6 {0} \u4f86\u81ea\u65bc {1} +giveSpawn=\u00a76\u7d66\u4e88\u00a7c {2} \u00a76 \u00a7c {0} \u500b\u00a7c {1}\u00a76. +godDisabledFor=\u00a74\u53d6\u6d88\u4e86 \u00a7c{0} \u00a76\u7684\u4e0a\u5e1d\u6a21\u5f0f +godEnabledFor=\u00a74\u958b\u555f\u4e86\u00a7c {0} \u00a76\u7684\u4e0a\u5e1d\u6a21\u5f0f +godMode=\u00a76\u4e0a\u5e1d\u6a21\u5f0f \u00a7c{0} +groupNumber=\u00a7c{0}\u00a7f \u5728\u7dda, \u60f3\u8981\u7372\u53d6\u5168\u90e8\u4f7f\u7528:\u00a7c /{1} {2} +groupDoesNotExist=\u00a74\u7576\u524d\u7d44\u6c92\u6709\u4eba\u5728\u7dda! +hatArmor=\u00a74\u932f\u8aa4:\u4f60\u7121\u6cd5\u4f7f\u7528\u9019\u500b\u7269\u54c1\u4f5c\u70ba\u5e3d\u5b50! +hatEmpty=\u00a74\u4f60\u73fe\u5728\u9084\u6c92\u6709\u6234\u5e3d\u5b50. +hatFail=\u00a74\u4f60\u5fc5\u9808\u628a\u60f3\u8981\u5e36\u7684\u5e3d\u5b50\u62ff\u5728\u624b\u4e2d. +hatPlaced=\u00a7e\u4eab\u53d7\u4f60\u7684\u65b0\u5e3d\u5b50\u628a! +hatRemoved=\u00a76\u4f60\u7684\u5e3d\u5b50\u5df2\u79fb\u9664. +haveBeenReleased=\u00a76\u4f60\u5df2\u88ab\u91cb\u653e +heal=\u00a76\u4f60\u5df2\u88ab\u6cbb\u7642 +healDead=\u00a74\u4f60\u4e0d\u80fd\u6cbb\u7642\u4e00\u500b\u6b7b\u4eba! +healOther=\u00a76\u5df2\u6cbb\u7642\u00a7c {0} +helpConsole=\u5f9e\u63a7\u5236\u53f0\u67e5\u770b\u5e6b\u52a9,\u8acb\u8f38\u5165\u300c?\u300d +helpFrom=\u00a76\u4f86\u81ea\u65bc {0} \u7684\u6307\u4ee4 +helpLine=\u00a76/{0}\u00a7r: {1} +helpMatching=\u00a76\u6307\u4ee4\u9023\u63a5 "\u00a7c{0}\u00a76": +helpOp=\u00a74[\u6c42\u52a9OP]\u00a7r \u00a76{0}:\u00a7r {1} +helpPages=\u00a76\u7b2c \u00a7c{0}\u00a76 \u9801/\u5171 \u00a7c{1}\u00a76 \u9801: +helpPlugin=\u00a74{0}\u00a7r: \u5916\u639b\u7a0b\u5f0f\u5e6b\u52a9: /help {1} +holeInFloor=\u00a74\u76ee\u6a19\u8173\u4e0b\u662f\u865b\u7a7a +holdFirework=\u00a74\u4f60\u5fc5\u9808\u62ff\u8457\u7159\u706b\u624d\u80fd\u589e\u52a0\u7279\u6548. +holdPotion=\u00a74\u4f60\u5fc5\u9808\u62ff\u8457\u85e5\u6c34\u624d\u80fd\u589e\u52a0\u7279\u6548. +holeInFloor=\u00a74\u5730\u677f\u6709\u6d1e! +homeSet=\u00a76\u5df2\u8a2d\u7f6e\u5bb6~ +homeSetToBed=\u00a76\u4f60\u7684\u5bb6\u5df2\u88ab\u8a2d\u70ba\u6b64\u5e8a +homes=\u00a76\u5bb6:\u00a7r{0} +hour=\u5c0f\u6642 +hours=\u5c0f\u6642 +ignorePlayer=\u00a76\u4f60\u5c4f\u853d\u4e86\u73a9\u5bb6 \u00a7c{0} +illegalDate=\u932f\u8aa4\u7684\u65e5\u671f\u683c\u5f0f +infoChapter=\u9078\u64c7\u7ae0\u7bc0: +infoChapterPages=\u00a76\u7ae0\u7bc0 {0},\u7b2c \u00a7c{1}\u00a76 \u9801/\u5171 \u00a7c{2}\u00a76: +infoFileDoesNotExist=\u6587\u4ef6info.txt\u4e0d\u5b58\u5728,\u5c07\u5275\u5efa\u4e00\u500b\u65b0\u7684\u6587\u4ef6 +infoPages=\u00a7e----\u7b2c \u00a7c{0}\u00a7e \u9801/\u5171 \u00a7c{1}\u00a7e \u9801---- +infoUnknownChapter=\u672a\u77e5\u7ae0\u7bc0 +invBigger=\u00a74\u5176\u4ed6\u73a9\u5bb6\u7684\u80cc\u5305\u6bd4\u4f60\u7684\u66f4\u5927 +invRestored=\u00a76\u4f60\u7684\u80cc\u5305\u5df2\u88ab\u6062\u5fa9 +invSee=\u00a76\u4f60\u67e5\u770b\u4e86\u00a7c {0} \u00a76\u7684\u80cc\u5305 +invSeeHelp=\u00a76\u4f7f\u7528\u300c/invsee\u300d\u91cd\u65b0\u67e5\u770b\u81ea\u5df1\u7684\u80cc\u5305 +invalidCharge=\u00a74\u7121\u6548\u7684\u50f9\u683c +invalidFireworkFormat=\u00a76\u9019\u500b\u9078\u9805 \u00a74{0} \u00a76\u5c0d \u00a74{1}\u00a76 \u4e0d\u662f\u4e00\u500b\u6709\u6548\u7684\u503c \u00a76. +invalidHome=\u00a74\u5bb6\u00a7c {0} \u00a74\u4e0d\u5b58\u5728! +invalidMob=\u7121\u6548\u7684\u52d5\u7269\u7a2e\u985e +invalidServer=\u7121\u6548\u7684\u4f3a\u670d\u5668\uff01 +invalidSignLine=\u00a74\u724c\u5b50\u4e0a\u7684\u7b2c \u00a7c{0} \u00a74\u884c\u7121\u6548 +invalidWorld=\u00a74\u7121\u6548\u7684\u4e16\u754c +inventoryCleared=\u00a76\u80cc\u5305\u5df2\u6e05\u7a7a +inventoryClearedOthers=\u00a7c{0}\u00a76 \u7684\u80cc\u5305\u5df2\u88ab\u6e05\u7a7a +invalidWarpName=\u00a74\u7121\u6548\u7684\u50b3\u9001\u9ede\u540d\u7a31! +invalidWorld=\u00a74\u7121\u6548\u7684\u4e16\u754c\u540d. +inventoryCleared=\u00a76\u5305\u88f9\u5df2\u6e05\u7a7a. +inventoryClearedAll=\u00a76\u6240\u6709\u4eba\u7684\u5305\u88f9\u5df2\u6e05\u7a7a. +inventoryClearedOthers=\u00a7c{0}\u00a76\u7684\u5305\u88f9\u5df2\u6e05\u7a7a. +is=\u662f +itemCannotBeSold=\u00a74\u8a72\u7269\u54c1\u7121\u6cd5\u8ce3\u7d66\u4f3a\u670d\u5668 +itemMustBeStacked=\u00a74\u7269\u54c1\u5fc5\u9808\u6210\u7d44\u4ea4\u6613,2s\u7684\u6578\u91cf\u662f2\u7d44,\u4ee5\u6b64\u985e\u63a8 +itemNames=\u00a76\u7269\u54c1\u7c21\u6613\u540d\u7a31:\u00a7r {0} +itemNotEnough1=\u00a74\u4f60\u6c92\u6709\u8db3\u5920\u7684\u8a72\u7269\u54c1\u4f86\u8ce3\u51fa +itemNotEnough2=\u00a76\u5982\u679c\u4f60\u60f3\u8981\u8ce3\u6389\u6240\u6709\u4f60\u80cc\u5305\u5167\u7684\u8a72\u7269\u54c1,\u4f7f\u7528\u300c/sell \u7269\u54c1\u540d\u7a31\uff08\u82f1\u6587,\u6216ID\uff09\u300d +itemNotEnough3=\u00a76\u300c/sell \u7269\u54c1\u540d\u7a31 -1\u300d\u5c07\u6703\u7559\u51fa\u4e00\u500b\u800c\u8ce3\u6389\u5176\u5b83\u8a72\u7a2e\u7269\u54c1,\u4ee5\u6b64\u985e\u63a8 +itemSellAir=\u4f60\u96e3\u9053\u60f3\u8ce3\u7a7a\u6c23\u55ce\uff1f\u653e\u500b\u6771\u897f\u5728\u4f60\u624b\u88e1 +itemSold=\u00a7a\u7372\u5f97 \u00a7c {0} \u00a7a \uff08{1} \u55ae\u4f4d{2},\u6bcf\u500b\u50f9\u503c {3}\uff09 +itemSoldConsole=\u00a7c{0} \u00a76\u8ce3\u51fa\u4e86 {1},\u7372\u5f97\u4e86\u00a76 {2} \u00a76 \uff08{3} \u55ae\u4f4d\u7269\u54c1,\u6bcf\u500b\u50f9\u503c {4}\uff09 +itemSpawn=\u00a76\u751f\u6210 {0} \u500b {1} +itemType=\u00a76\u7269\u54c1:\u00a7c {0} \u00a76-\u00a74 {1} +itemsCsvNotLoaded=\u7121\u6cd5\u8f09\u5165items.csv +jailAlreadyIncarcerated=\u00a74\u5df2\u5728\u76e3\u7344\u4e2d\u7684\u73a9\u5bb6:{0} +jailMessage=\u00a74\u8acb\u5728\u76e3\u7344\u4e2d\u9762\u58c1\u601d\u904e\uff01 +jailNotExist=\u00a74\u8a72\u76e3\u7344\u4e0d\u5b58\u5728 +jailReleased=\u00a76\u73a9\u5bb6 \u00a7c{0}\u00a76 \u51fa\u7344\u4e86 +jailReleasedPlayerNotify=\u00a76\u4f60\u5df2\u88ab\u91cb\u653e\uff01 +jailSentenceExtended=\u00a76\u56da\u7981\u6642\u9593\u589e\u52a0\u5230:{0) +jailSet=\u00a76\u76e3\u7344 {0} \u5df2\u88ab\u8a2d\u7f6e +jumpError=\u00a74\u9019\u5c07\u6703\u640d\u5bb3\u4f60\u7684\u96fb\u8166 +kickDefault=\u5f9e\u4f3a\u670d\u5668\u8acb\u51fa +kickExempt=\u00a74\u4f60\u7121\u6cd5\u8acb\u51fa\u8a72\u73a9\u5bb6. +kickedAll=\u00a74\u5df2\u5c07\u6240\u6709\u73a9\u5bb6\u8acb\u51fa\u4f3a\u670d\u5668. +kill=\u00a76\u6bba\u6b7b\u4e86 \u00a7c{0} +killExempt=\u00a74\u4f60\u4e0d\u80fd\u6bba\u6b7b {0} +kitError2=\u00a74\u8a72\u5de5\u5177\u5305\u53ef\u80fd\u4e0d\u5b58\u5728\u6216\u8005\u88ab\u62d2\u7d55\u4e86. +kitError=\u00a74\u6c92\u6709\u6709\u6548\u7684\u5de5\u5177\u5305 +kitErrorHelp=\u00a74\u6216\u8a31\u4e00\u500b\u7269\u54c1\u5728\u8a2d\u7f6e\u6587\u4ef6\u91cc\u672a\u88ab\u8a2d\u7f6e\u6578\u91cf\uff1f +kitGive=\u00a76\u7372\u53d6\u5de5\u5177\u5305\u00a7c {0} +kitGiveTo=\u00a76\u6210\u529f\u767c\u9001\u5de5\u5177\u5305\u00a7c {0}\u00a76 \u7d66 {1}\u00a7. +kitInvFull=\u00a74\u4f60\u7684\u80cc\u5305\u5df2\u6eff,\u5de5\u5177\u5305\u5c07\u653e\u5728\u5730\u4e0a +kitTimed=\u00a74\u51b7\u537b\u6642\u9593\u00a7c {0}. +kitReceive=\u00a76\u6536\u5230\u4e00\u500b\u00a7c {0} \u00a76\u5de5\u5177\u5305. +kitTimed=\u00a74You cant use that kit again for another\u00a7c {0}\u00a74. +kits=\u00a76\u5de5\u5177\u5305:\u00a7r{0} +leatherSyntax=\u00a76\u76ae\u9769\u984f\u8272\u8a9e\u6cd5: color:,, \u5982: color:255,0,0. +lightningSmited=\u00a76\u4f60\u525b\u525b\u88ab\u96f7\u64ca\u4e2d\u4e86 +lightningUse=\u00a76\u96f7\u64ca\u4e2d\u4e86\u00a7c {0} +listAfkTag = \u00a77[\u96e2\u958b]\u00a7r +listAmount = \u00a76\u7576\u524d\u6709 \u00a7c{0}\u00a76 \u500b\u73a9\u5bb6\u5728\u7dda,\u6700\u5927\u5728\u7dda\u4eba\u6578\u70ba \u00a7c{1}\u00a76 \u500b\u73a9\u5bb6. +listAmountHidden = \u00a76\u7576\u524d\u6709 \u00a7c{0}\u00a76/{1}\u00a76 \u500b\u73a9\u5bb6\u5728\u7dda,\u6700\u5927\u5728\u7dda\u4eba\u6578 \u00a7c{2}\u00a76 \u500b\u73a9\u5bb6 +listGroupTag={0}\u00a7r: +listHiddenTag = \u00a77[\u96b1\u8eab]\u00a7r +loadWarpError=\u00a74\u8f09\u5165\u5730\u6a19 {0} \u5931\u6557 +localFormat=\u4f4d\u7f6e:<{0}> {1} +mailClear=\u00a76\u82e5\u8981\u6a19\u8a18\u4f60\u7684\u90f5\u4ef6\u70ba\u5df2\u8b80,\u8f38\u5165\u300c/mail clear\u300d +mailCleared=\u00a76\u90f5\u7bb1\u5df2\u6e05\u7a7a\uff01 +mailSent=\u00a76\u90f5\u4ef6\u5df2\u767c\u51fa\uff01 +markMailAsRead=\u00a76\u82e5\u8981\u6a19\u8a18\u4f60\u7684\u90f5\u4ef6\u70ba\u5df2\u8b80,\u8f38\u5165\u300c/mail clear\u300d +markedAsAway=\u00a76\u4f60\u5df2\u8a2d\u7f6e\u96e2\u958b. +markedAsNotAway=\u00a76\u4f60\u5df2\u8a2d\u7f6e\u53d6\u6d88\u96e2\u958b. +matchingIPAddress=\u00a76\u4ee5\u4e0b\u662f\u4f86\u81ea\u8a72IP\u4f4d\u5740\u7684\u73a9\u5bb6: +maxHomes=\u00a74\u4f60\u7121\u6cd5\u8a2d\u7f6e\u8d85\u904e {0} \u500b\u5bb6. +mayNotJail=\u00a74\u4f60\u7121\u6cd5\u56da\u7981\u8a72\u73a9\u5bb6 +me=\u6211 +messageTruncated=\u00a74\u6d88\u606f\u88ab\u622a\u65b7, \u60f3\u8981\u770b\u5230\u5b8c\u6574\u7684\u4fe1\u606f\u8acb\u8f38\u5165:\u00a7c /{0} {1} +minute=\u5206\u9418 +minutes=\u5206\u9418 +missingItems=\u00a74\u4f60\u6c92\u6709 {0}x {1}. +missingPrefixSuffix=\u5931\u53bb\u4e86\u4e00\u500b\u524d\u7db4\u6216\u5c3e\u7db4\u65bc {0} +mobSpawnError=\u00a74\u66f4\u6539\u5237\u602a\u7c60\u6642\u767c\u751f\u932f\u8aa4 +mobSpawnLimit=\u751f\u7269\u6578\u91cf\u592a\u591a,\u7121\u6cd5\u751f\u6210 +mobSpawnTarget=\u00a74\u76ee\u6a19\u65b9\u584a\u5fc5\u9808\u662f\u4e00\u500b\u5237\u602a\u7c60 +mobsAvailable=\u00a76\u751f\u7269:\u00a7r {0} +moneyRecievedFrom=\u00a7a\u5df2\u5f9e {1} \u63a5\u6536{0} +moneySentTo=\u00a7a{0} \u5df2\u767c\u9001\u5230 {1} +moneyTaken=\u00a7a{0} \u5df2\u5f9e\u4f60\u7684\u8cec\u6236\u4e2d\u6263\u9664 +month=\u6708 +months=\u6708 +moreThanZero=\u00a74\u6578\u91cf\u5fc5\u9808\u5927\u65bc0 +moveSpeed=\u00a76\u70ba\u00a7c{2}\u00a76\u8a2d\u7f6e\u00a7c {0} \u00a76\u901f\u5ea6\u70ba\u00a7c {1} \u00a76. +msgFormat=\u00a76[{0}\u00a76 -> {1}\u00a76] \u00a7r{2} +multipleCharges=\u00a74\u60a8\u4e0d\u80fd\u5c0d\u9019\u500b\u7159\u82b1\u61c9\u7528\u591a\u65bc\u4e00\u500b\u7684\u88dd\u6599. +multiplePotionEffects=\u00a74\u60a8\u4e0d\u80fd\u5c0d\u9019\u500b\u7159\u82b1\u61c9\u7528\u591a\u65bc\u4e00\u500b\u7684\u6548\u679c. +muteExempt=\u00a74\u4f60\u7121\u6cd5\u7981\u8a00\u8a72\u73a9\u5bb6 +muteNotify=\u00a74{0} \u00a76\u5df2\u88ab\u7981\u8a00 \u00a74{1}\u00a76. +mutedPlayer=\u00a76\u73a9\u5bb6 {0} \u00a76\u88ab\u7981\u8a00 +mutedPlayerFor=\u00a76\u73a9\u5bb6 {0} \u00a76\u88ab\u7981\u8a00 \u6642\u9593:{1} +mutedUserSpeaks={0} \u60f3\u8981\u8aaa\u8a71,\u4f46\u88ab\u7981\u8a00\u4e86 +nearbyPlayers=\u00a76\u9644\u8fd1\u7684\u73a9\u5bb6: {0} +negativeBalanceError=\u00a74\u73fe\u91d1\u4e0d\u53ef\u5c0f\u65bc\u96f6 +nickChanged=\u00a76\u66b1\u7a31\u5df2\u66f4\u63db +nickDisplayName=\u00a74\u4f60\u9700\u8981\u6fc0\u6d3bchange-displayname.\u8a72\u6587\u4ef6\u5728Essentials\u8a2d\u7f6e\u6587\u4ef6\u4e2d +nickInUse=\u00a74\u90a3\u500b\u66b1\u7a31\u5df2\u88ab\u4f7f\u7528 +nickNamesAlpha=\u00a74\u66b1\u7a31\u5fc5\u9808\u70ba\u5b57\u6bcd\u6216\u6578\u5b57. +nickNoMore=\u00a76\u4f60\u4e0d\u518d\u64c1\u6709\u4e00\u500b\u66b1\u7a31 +nickOthersPermission=\u00a74\u4f60\u6c92\u6709\u66f4\u6539\u5225\u4eba\u66b1\u7a31\u7684\u8a31\u53ef\u6b0a +nickSet=\u00a76\u4f60\u7684\u66b1\u7a31\u73fe\u5728\u662f \u00a74{0} +noAccessCommand=\u00a74\u4f60\u6c92\u6709\u4f7f\u7528\u8a72\u547d\u4ee4\u7684\u8a31\u53ef\u6b0a +noAccessPermission=\u00a74\u4f60\u6c92\u6709\u4f7f\u7528 {0} \u7684\u8a31\u53ef\u6b0a +noBreakBedrock=\u00a74\u4f60\u4e0d\u80fd\u6467\u6bc0\u57fa\u5ca9\uff01 +noChapterMeta=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u5275\u5efa\u52d5\u614b\u66f8\u672c. +noDestroyPermission=\u00a74\u4f60\u6c92\u6709\u7834\u58de {0} \u7684\u8a31\u53ef\u6b0a +noDurability=\u00a74\u9019\u500b\u7269\u54c1\u6c92\u6709\u8010\u4e45. +noGodWorldWarning=\u00a74\u7981\u6b62\u4f7f\u7528\u4e0a\u5e1d\u6a21\u5f0f. +noHelpFound=\u00a74\u6c92\u6709\u5339\u914d\u7684\u547d\u4ee4 +noHomeSet=\u4f60\u9084\u672a\u8a2d\u7f6e\u5bb6 +noHomeSetPlayer=\u00a76\u8a72\u73a9\u5bb6\u9084\u672a\u8a2d\u7f6e\u5bb6 +noKitPermission=\u00a74\u4f60\u9700\u8981 \u00a74{0}\u00a74 \u8a31\u53ef\u6b0a\u4f86\u4f7f\u7528\u8a72\u5de5\u5177 +noKits=\u00a76\u9084\u6c92\u6709\u53ef\u7372\u5f97\u7684\u5de5\u5177 +noMail=\u4f60\u6c92\u6709\u4efb\u4f55\u90f5\u4ef6 +noMatchingPlayers=\u00a76\u627e\u4e0d\u5230\u5339\u914d\u7684\u73a9\u5bb6. +noMetaFirework=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u61c9\u7528\u7159\u82b1\u6578\u64da. +noMetaPerm=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u61c9\u7528 \u00a7c{0}\u00a74 \u7684\u6578\u64da. +noMotd=\u00a76\u4eca\u65e5\u6c92\u6709\u516c\u544a +noNewMail=\u00a76\u4f60\u6c92\u6709\u65b0\u7684\u90f5\u4ef6 +noPendingRequest=\u00a74\u4f60\u6c92\u6709\u5f85\u89e3\u6c7a\u7684\u8acb\u6c42 +noPerm=\u00a74\u4f60\u6c92\u6709 \u00a7c{0}\u00a74 \u8a31\u53ef\u6b0a +noPermToSpawnMob=\u00a74\u4f60\u6c92\u6709\u751f\u6210\u8a72\u751f\u7269\u7684\u8a31\u53ef\u6b0a +noPlacePermission=\u00a74\u00a74\u4f60\u6c92\u6709\u5728\u90a3\u500b\u724c\u5b50\u65c1\u908a\u653e\u65b9\u584a\u7684\u6b0a\u5229 +noPowerTools=\u00a76\u4f60\u6c92\u6709\u7d81\u5b9a\u547d\u4ee4 +noRules=\u00a74\u6c92\u6709\u6307\u5b9a\u7684\u689d\u898f +noWarpsDefined=\u00a74\u6c92\u6709\u78ba\u5b9a\u7684\u5730\u6a19 +none=\u7121 +notAllowedToQuestion=\u00a74\u4f60\u672a\u88ab\u6388\u6b0a\u4f7f\u7528\u63d0\u554f\u767c\u8a00 +notAllowedToShout=\u00a74\u4f60\u672a\u88ab\u6388\u6b0a\u4f7f\u7528\u558a\u8a71\u767c\u8a00 +notEnoughExperience=\u00a74\u4f60\u6c92\u6709\u8db3\u5920\u7684\u7d93\u9a57\u503c +notEnoughMoney=\u00a74\u4f60\u6c92\u6709\u8db3\u5920\u7684\u8cc7\u91d1 +notFlying=\u672a\u98db\u884c +notRecommendedBukkit= \u00a74Bukkit\u7248\u672c\u904e\u820a.\u5efa\u8b70\u66f4\u65b0. +notSupportedYet=\u66ab\u4e0d\u652f\u6301 +nothingInHand = \u00a74\u4f60\u6c92\u6709\u6301\u6709\u4efb\u4f55\u7269\u54c1 +now=\u73fe\u5728 +nuke=\u00a7d\u6838\u6b66\u964d\u843d,\u6ce8\u610f\u96b1\u853d\uff01 +numberRequired=\u9700\u8981\u8f38\u5165\u6578\u5b57\uff01 +onlyDayNight=/time \u547d\u4ee4\u53ea\u6709 day/night \u5169\u500b\u9078\u64c7 +onlyPlayerSkulls=\u00a74\u4f60\u53ea\u80fd\u8a2d\u7f6e\u4eba\u982d\u7684\u4e3b\u4eba (397:3). +onlyPlayers=\u00a74\u96bb\u6709\u904a\u6232\u4e2d\u73a9\u5bb6\u624d\u53ef\u4f7f\u7528 {0} +onlySunStorm=\u00a74/weather \u547d\u4ee4\u53ea\u6709 sun/storm \u5169\u500b\u9078\u64c7 +orderBalances=\u00a76\u6392\u5e8f {0} \u00a76\u500b\u73a9\u5bb6\u7684\u8cc7\u91d1\u4e2d,\u8acb\u7a0d\u5019\u2026\u2026 +oversizedTempban=\u00a74\u4f60\u53ef\u80fd\u6c92\u6709\u5728\u9019\u500b\u6642\u6bb5\u5c01\u7981\u73a9\u5bb6. +pTimeCurrent=\u00a76{0}\u00a7c \u00a76\u7684\u6642\u9593\u662f \u00a7c{1} +pTimeCurrentFixed=\u00a7c{0}\u00a76 \u7684\u6642\u9593\u88ab\u9023\u63a5\u5230 \u00a7c{1} +pTimeNormal=\u00a7c{0}\u00a76 \u7684\u6642\u9593\u662f\u6b63\u5e38\u7684\u4e26\u8207\u4f3a\u670d\u5668\u540c\u6b65 +pTimeOthersPermission=\u00a74\u4f60\u672a\u88ab\u6388\u6b0a\u8a2d\u7f6e\u5176\u4ed6\u73a9\u5bb6\u7684\u6642\u9593 +pTimePlayers=\u00a76\u9019\u4e9b\u73a9\u5bb6\u6709\u4ed6\u5011\u81ea\u5df1\u7684\u6642\u9593: +pTimeReset=\u00a76\u8a72\u73a9\u5bb6\u7684\u6642\u9593\u88ab\u91cd\u7f6e:\u00a7c{0} +pTimeSet=\u00a76\u8a72\u73a9\u5bb6\u7684\u6642\u9593\u88ab\u8a2d\u5b9a\u70ba \u00a7c{0}\u00a76 \u5c0d\u8c61:\u00a7c{1} +pTimeSetFixed=\u00a76\u8a72\u73a9\u5bb6\u6642\u9593\u88ab\u9023\u63a5\u5230 \u00a7c{0}\u00a76 \u5c0d\u8c61:\u00a7c{1} +parseError=\u00a74\u89e3\u6790\u00a7c {0} \u00a74\u65bc\u7b2c \u00a7c{1}\u00a74 \u884c\u6642\u767c\u751f\u932f\u8aa4 +pendingTeleportCancelled=\u00a74\u5f85\u8655\u7406\u7684\u50b3\u9001\u8acb\u6c42\u5df2\u53d6\u6d88 +permissionsError=\u672a\u627e\u5230Permissions/GroupManager\u5916\u639b\u7a0b\u5f0f\uff1b\u804a\u5929\u7684 \u524d\u7db4/\u5c3e\u7db4 \u5c07\u4e0d\u8d77\u4f5c\u7528 +playerBanned=\u00a76\u7ba1\u7406\u54e1\u00a7c {0}\u00a76 \u5c01\u7981\u4e86 {1},\u00a76\u7406\u7531:{2} +playerInJail=\u00a74\u8a72\u73a9\u5bb6\u5df2\u5728\u76e3\u7344 {0} +playerJailed=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u88ab\u902e\u6355\u4e86 +playerJailedFor= \u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u88ab\u902e\u6355,\u6642\u9593:{1} +playerKicked=\u00a74\u7ba1\u7406\u54e1 \u00a7c{0} \u00a76\u8acb\u51fa\u4e86 \u00a7c{1},\u00a76\u7406\u7531:{2} +playerMuted=\u00a76\u4f60\u88ab\u7981\u6b62\u767c\u8a00 +playerMutedFor=\u00a76\u4f60\u5df2\u88ab\u7981\u8a00.\u7406\u7531: {0} +playerNeverOnServer=\u00a74\u73a9\u5bb6 \u00a7c{0} \u00a74\u5f9e\u6c92\u51fa\u73fe\u5728\u4f3a\u670d\u5668\u904e +playerNotFound=\u00a74\u73a9\u5bb6\u672a\u5728\u7dda\uff08\u6216\u4e0d\u5b58\u5728\uff09 +playerUnmuted=\u00a76\u4f60\u88ab\u5141\u8a31\u767c\u8a00 +pong=\u556a\uff01 +posPitch=\u00a76\u4ef0\u89d2: {0} (\u982d\u90e8\u7684\u89d2\u5ea6) +posX=\u00a76X: {0} (+\u6771 <-> -\u897f) +posY=\u00a76Y: {0} (+\u4e0a <-> -\u4e0b) +posYaw=\u00a76Yaw: {0} (\u65cb\u8f49) +posZ=\u00a76Z: {0} (+\u5357 <-> -\u5317) +possibleWorlds=\u00a76\u53ef\u884c\u7684\u4e16\u754c\u6578\u91cf\u70ba 0 \u5171 {0} +potions=\u00a76\u85e5\u6c34:\u00a7r {0}\u00a76. +powerToolAir=\u00a74\u547d\u4ee4\u4e0d\u80fd\u5c0d\u8457\u7a7a\u6c23\u4f7f\u7528. +powerToolAlreadySet=\u00a74\u547d\u4ee4 \u00a7c{0}\u00a74 \u5df2\u88ab\u7d81\u5b9a\u5230 {1}. +powerToolAttach=\u00a7c{0}\u00a76 \u547d\u4ee4\u88ab\u7d81\u5b9a\u5230 {1} +powerToolClearAll=\u00a76\u6240\u6709\u5feb\u6377\u547d\u4ee4\u5df2\u88ab\u6e05\u9664 +powerToolList={1} \u6709\u5982\u4e0b\u547d\u4ee4:\u00a74{0}\u00a7r. +powerToolListEmpty={0} \u6c92\u6709\u88ab\u7d81\u5b9a\u547d\u4ee4 +powerToolNoSuchCommandAssigned=\u547d\u4ee4 \u00a74{0}\u00a7r \u672a\u88ab\u7d81\u5b9a\u5230 {1}. +powerToolRemove=\u547d\u4ee4 \u00a74{0}\u00a7r \u88ab\u5f9e {1} \u4e0a\u79fb\u9664 +powerToolRemoveAll=\u79fb\u9664\u4e86 {0} \u4e0a\u7684\u6240\u6709\u547d\u4ee4 +powerToolsDisabled=\u4f60\u6240\u6709\u7684\u5feb\u6377\u547d\u4ee4\u88ab\u51cd\u7d50 +powerToolsEnabled=\u4f60\u6240\u6709\u7684\u5feb\u6377\u547d\u4ee4\u88ab\u6fc0\u6d3b +protectionOwner=\u00a76[Essentials\u4fdd\u8b77] \u7269\u54c1\u64c1\u6709\u8005:\u00a7r{0} +questionFormat=\u00a72[\u63d0\u554f]\u00a7r {0} +readNextPage=\u00a76\u8f38\u5165 \u00a7c/{0} {1} \u00a76\u4f86\u95b1\u8b80\u4e0b\u4e00\u9801 +recipe=\u00a76Recipe for \u00a7c{0}\u00a76 ({1} of {2}) +recipeBadIndex=\u9019\u500b\u7de8\u865f\u6c92\u6709\u5339\u914d\u7684\u5408\u6210\u516c\u5f0f. +recipeFurnace=\u00a76\u51b6\u7149 \u00a7c{0} +recipeGrid=\u00a7{0}X \u00a76| \u00a7{1}X \u00a76| \u00a7{2}X +recipeGridItem=\ \u00a7{0}X \u00a76is \u00a7c{1} +recipeMore=\u00a76Type /{0} \u00a7c{1}\u00a76 <\u6578\u5b57> \u53bb\u67e5\u770b\u66f4\u591a\u7684 \u00a7c{2}\u00a76\u5408\u6210\u516c\u5f0f. +recipeNone=\u5c0d{0}\u6c92\u6709\u5339\u914d\u7684\u5408\u6210\u516c\u5f0f +recipeNothing=\u6c92\u6709\u6771\u897f +recipeShapeless=\u00a76\u7d50\u5408 \u00a7c{0} +recipeWhere=\u00a76\u7576: {0} +reloadAllPlugins=\u00a76\u91cd\u8f09\u4e86\u6240\u6709\u5916\u639b\u7a0b\u5f0f +removed=\u00a76\u79fb\u9664\u4e86\u00a7c {0} \u00a76\u9805 +repair=\u00a76\u4f60\u5df2\u7d93\u6210\u529f\u7684\u4fee\u5fa9\u4e86\u4f60\u7684:\u00a7c{0} +repairAlreadyFixed=\u00a74\u8a72\u7269\u54c1\u7121\u9700\u4fee\u5fa9 +repairEnchanted=\u00a74\u4f60\u7121\u6b0a\u4fee\u5fa9\u9644\u9b54\u7269\u54c1 +repairInvalidType=\u00a74\u8a72\u7269\u54c1\u7121\u6cd5\u4fee\u5fa9 +repairNone=\u00a74\u9019\u88e1\u6c92\u6709\u9700\u8981\u4fee\u7406\u7684\u7269\u54c1 +requestAccepted=\u00a76\u5df2\u63a5\u53d7\u50b3\u9001\u8acb\u6c42 +requestAcceptedFrom=\u00a7c{0}\u00a76 \u63a5\u53d7\u4e86\u4f60\u7684\u50b3\u9001\u8acb\u6c42 +requestDenied=\u00a76\u5df2\u62d2\u7d55\u50b3\u9001\u8acb\u6c42 +requestDeniedFrom=\u00a7c{0}\u00a76 \u62d2\u7d55\u4e86\u4f60\u7684\u50b3\u9001\u8acb\u6c42 +requestSent=\u00a76\u8acb\u6c42\u5df2\u767c\u9001\u7d66 {0}\u00a76 +requestTimedOut=\u00a74\u50b3\u9001\u8acb\u6c42\u8d85\u6642\u2026\u2026 +requiredBukkit= \u00a76\u4f60\u9700\u8981\u7248\u672c {0} \u4ee5\u4e0a\u7684bukkit.\u8acb\u81f3\u5b98\u7db2\u4e0b\u8f09 +resetBal=\u00a76\u5df2\u7d93\u91cd\u7f6e\u6240\u6709\u5728\u7dda\u73a9\u5bb6\u7684\u91d1\u9322\u5230 \u00a7a{0} \u00a76. +resetBalAll=\u00a76\u5df2\u7d93\u91cd\u7f6e\u6240\u6709\u73a9\u5bb6\u7684\u91d1\u9322 \u00a7a{0} \u00a76. +returnPlayerToJailError=\u00a74\u5c07\u73a9\u5bb6{0}\u95dc\u56de\u76e3\u7344{1}\u6642\u767c\u751f\u932f\u8aa4 +runningPlayerMatch=\u00a76\u6b63\u5728\u641c\u7d22\u5339\u914d\u7684\u73a9\u5bb6 \u00a7c{0}\u00a76 (\u9019\u53ef\u80fd\u6703\u82b1\u8cbb\u4e00\u4e9b\u6642\u9593) +second=\u79d2 +seconds=\u79d2 +seenOffline=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u6700\u8fd1\u4e00\u6b21\u00a74\u4e0b\u7dda\u00a76\u70ba {1} +seenOnline=\u00a76\u73a9\u5bb6 \u00a7c{0} \u00a76\u6700\u8fd1\u4e00\u6b21\u00a7a\u767b\u9304\u00a76\u70ba {1} +serverFull=\u4f3a\u670d\u5668\u5df2\u6eff +serverTotal=\u00a76\u4f3a\u670d\u5668\u7e3d\u548c: {0} +setSpawner=\u00a76\u6539\u8b8a\u5237\u602a\u7c60\u70ba {0} +sheepMalformedColor=\u00a74\u7121\u6548\u7684\u984f\u8272 +shoutFormat=\u00a76[\u558a\u8a71]\u00a7r {0} +signFormatFail=\u00a74[{0}] +signFormatSuccess=\u00a71[{0}] +signFormatTemplate=[{0}] +signProtectInvalidLocation=\u00a74\u4f60\u4e0d\u5141\u8a31\u5728\u6b64\u653e\u7f6e\u724c\u5b50 +similarWarpExist=\u00a74\u4e00\u500b\u540c\u540d\u7684\u5730\u6a19\u5df2\u5b58\u5728 +slimeMalformedSize=\u00a74\u5927\u5c0f\u975e\u6cd5 +soloMob=\u00a74\u8a72\u751f\u7269\u559c\u6b61\u7368\u5c45 +spawnSet=\u00a76\u5df2\u70ba\u00a7c {0}\u00a76 \u7d44\u7684\u8a2d\u7f6e\u51fa\u751f\u9ede +spawned=\u5df2\u751f\u6210 +sudoExempt=\u00a74\u7121\u6cd5\u5f37\u5236\u4f7f\u6b64\u73a9\u5bb6\u57f7\u884c\u547d\u4ee4 +sudoRun=\u00a76\u5f37\u5236\u4f7f\u00a7c {0} \u00a76\u904b\u884c\u547d\u4ee4:\u00a7r /{1} {2} +suicideMessage=\u00a76\u6c38\u5225\u4e86,\u6b98\u9177\u7684\u4e16\u754c\u2026\u2026 +suicideSuccess= \u00a7c{0} \u00a76\u7d50\u675f\u4e86\u4ed6\u81ea\u5df1\u7684\u751f\u547d +survival=\u751f\u5b58\u6a21\u5f0f +takenFromAccount=\u00a7a\u5f9e\u4f60\u7684\u8cec\u6236\u4e2d\u6263\u9664\u4e86 {0} +takenFromOthersAccount=\u00a7a\u5f9e {1} \u00a7a\u4e2d\u7684\u8cec\u6236\u6263\u9664\u4e86 {0}.\u76ee\u524d\u91d1\u9322: {2} +teleportAAll=\u00a76\u5411\u6240\u6709\u73a9\u5bb6\u767c\u9001\u4e86\u50b3\u9001\u8acb\u6c42\u2026\u2026 +teleportAll=\u00a76\u50b3\u9001\u4e86\u6240\u6709\u73a9\u5bb6\u2026\u2026 +teleportAtoB=\u00a7c{0}\u00a76 \u50b3\u9001\u4f60\u5230 {1}\u00a76 +teleportDisabled=\u00a7c{0}\u00a74 \u53d6\u6d88\u4e86\u50b3\u9001 +teleportHereRequest=\u00a7c{0}\u00a74 \u8acb\u6c42\u4f60\u50b3\u9001\u5230\u4ed6\u90a3\u88e1 +teleportNewPlayerError=\u00a74\u50b3\u9001\u65b0\u73a9\u5bb6\u5931\u6557 +teleportRequest=\u00a7c{0}\u00a76 \u8acb\u6c42\u50b3\u9001\u5230\u4f60\u9019\u88e1 +teleportRequestTimeoutInfo=\u00a76\u6b64\u8acb\u6c42\u5c07\u5728 {0} \u79d2\u5167\u53d6\u6d88 +teleportTop=\u00a76\u50b3\u9001\u5230\u9802\u90e8 +teleportationCommencing=\u00a76\u6e96\u5099\u50b3\u9001... +teleportationDisabled=\u00a76\u50b3\u9001\u5df2\u7981\u7528 +teleportationDisabledFor=\u00a76\u50b3\u9001\u5df2\u5c0d {0} \u7981\u7528. +teleportationEnabled=\u00a76\u50b3\u9001\u5df2\u555f\u7528 +teleportationEnabledFor=\u00a76\u50b3\u9001\u5df2\u5c0d {0} \u555f\u7528. +teleporting=\u00a76\u6b63\u5728\u50b3\u9001... +teleportingPortal=\u00a76\u6b63\u5728\u901a\u904e\u50b3\u9001\u9580\u50b3\u9001... +tempBanned=\u5df2\u81e8\u6642\u88ab\u4f3a\u670d\u5668\u5c01\u7981,\u7406\u7531:{0} +tempbanExempt=\u00a76\u4f60\u7121\u6cd5\u81e8\u6642\u5c01\u7981\u6389\u8a72\u73a9\u5bb6 +thunder=\u00a76\u4f60 \u00a7c{0} \u00a76\u4e86\u4f60\u7684\u4e16\u754c\u7684\u9583\u96fb +thunderDuration=\u00a76\u4f60 \u00a7c{0} \u00a76\u4e86\u4f60\u7684\u4e16\u754c\u7684\u9583\u96fb\u00a7c {1} \u00a76\u79d2 +timeBeforeHeal=\u00a76\u6cbb\u7642\u51b7\u537b:{0} +timeBeforeTeleport=\u00a76\u50b3\u9001\u51b7\u537b:{0} +timeFormat=\u00a7c{0}\u00a76 or \u00a7c{1}\u00a76 or \u00a7c{2}\u00a76 +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=\u00a76\u6240\u6709\u4e16\u754c\u7684\u4e16\u754c\u5df2\u8a2d\u7f6e +timeSetPermission=\u00a74\u4f60\u6c92\u6709\u8a2d\u7f6e\u6642\u9593\u7684\u8a31\u53ef\u6b0a +timeWorldCurrent=\u00a76\u76ee\u524d\u4e16\u754c {0} \u7684\u6642\u9593\u662f \u00a73{1} +timeWorldSet=\u00a76\u6642\u9593\u88ab\u8a2d\u7f6e\u70ba {0} \u65bc\u4e16\u754c:\u00a74{1} +totalWorthAll=\u00a7a\u51fa\u552e\u7684\u6240\u6709\u7269\u54c1\u548c\u65b9\u584a\uff0c\u7e3d\u50f9\u503c {1}. +totalWorthBlocks=\u00a7a\u51fa\u552e\u7684\u6240\u6709\u65b9\u584a\u584a\uff0c\u7e3d\u50f9\u503c {1}. +tps=\u00a76\u7576\u524d TPS = {0} +tradeCompleted=\u00a7a\u4ea4\u6613\u5b8c\u7562 +tradeSignEmpty=\u00a74\u4ea4\u6613\u724c\u4e0a\u6c92\u6709\u4f60\u53ef\u7372\u5f97\u7684\u6771\u897f +tradeSignEmptyOwner=\u00a74\u4ea4\u6613\u724c\u4e0a\u6c92\u6709\u4f60\u53ef\u6536\u96c6\u7684\u6771\u897f +treeFailure=\u00a74\u751f\u6210\u6a39\u6728\u5931\u6557,\u5728\u8349\u584a\u4e0a\u6216\u571f\u4e0a\u518d\u8a66\u4e00\u6b21 +treeSpawned=\u00a76\u751f\u6210\u6a39\u6728\u6210\u529f +true=\u00a7a\u662f\u00a7r +typeTpaccept=\u00a76\u82e5\u60f3\u63a5\u53d7\u50b3\u9001,\u8f38\u5165 \u00a74/tpaccept\u00a76 +typeTpdeny=\u00a76\u82e5\u60f3\u62d2\u7d55\u50b3\u9001,\u8f38\u5165 \u00a74/tpdeny\u00a76 +typeWorldName=\u00a76\u4f60\u4e5f\u53ef\u4ee5\u8f38\u5165\u6307\u5b9a\u7684\u4e16\u754c\u7684\u540d\u5b57 +unableToSpawnMob=\u00a74\u751f\u6210\u751f\u7269\u5931\u6557 +unignorePlayer=\u00a76\u4f60\u5df2\u4e0d\u518d\u5c4f\u853d\u73a9\u5bb6 {0} +unknownItemId=\u00a74\u672a\u77e5\u7684\u7269\u54c1ID:{0} +unknownItemInList=\u00a74\u672a\u77e5\u7684\u7269\u54c1 {0} \u65bc {1} \u5217\u8868 +unknownItemName=\u00a74\u672a\u77e5\u7684\u7269\u54c1\u540d\u7a31:{0} +unlimitedItemPermission=\u00a74\u6c92\u6709\u8a31\u53ef\u6b0a\u4f86\u4f7f\u8a72\u7269\u54c1\u7121\u9650 {0} +unlimitedItems=\u00a76\u7121\u9650\u7269\u54c1: +unmutedPlayer=\u00a76\u73a9\u5bb6 \u00a7c{0}\u00a76 \u88ab\u5141\u8a31\u767c\u8a00 +unvanished=\u00a76\u5df2\u9000\u51fa\u96b1\u8eab\u6a21\u5f0f. +unvanishedReload=\u00a74\u5916\u639b\u7a0b\u5f0f\u91cd\u8f09\u8feb\u4f7f\u4f60\u7684\u96b1\u8eab\u6a21\u5f0f\u5931\u6548. +upgradingFilesError=\u5347\u7d1a\u6587\u4ef6\u6642\u767c\u751f\u932f\u8aa4 +uptime=\u00a76\u904b\u884c\u6642\u9593:\u00a7c {0} +userAFK=\u00a75{0} \u00a75\u73fe\u5728\u96e2\u958b, \u53ef\u80fd\u66ab\u6642\u6c92\u8fa6\u6cd5\u56de\u61c9. +userDoesNotExist=\u00a74\u73a9\u5bb6 \u00a7c{0} \u00a74\u4e0d\u5b58\u5728. +userIsAway=\u00a7d{0} \u00a7d\u66ab\u6642\u96e2\u958b\u4e86 +userIsNotAway=\u00a7d{0} \u00a7d\u56de\u4f86\u4e86 +userJailed=\u00a76\u4f60\u5df2\u88ab\u76e3\u7981 +userUnknown=\u00a74\u8b66\u544a: \u9019\u500b\u73a9\u5bb6 \u00a7c{0}\u00a74 \u5f9e\u4f86\u6c92\u6709\u52a0\u5165\u904e\u4f3a\u670d\u5668. +userUsedPortal={0} \u4f7f\u7528\u4e86\u73fe\u6709\u7684\u9000\u51fa\u50b3\u9001\u9580. +userdataMoveBackError=\u79fb\u52d5 userdata/{0}.tmp \u5230 userdata/{1} \u5931\u6557 +userdataMoveError=\u79fb\u52d5 userdata/{0} \u5230 userdata/{1}.tmp \u5931\u6557 +usingTempFolderForTesting=\u4f7f\u7528\u7de9\u5b58\u6587\u4ef6\u593e\u4f86\u6e2c\u8a66: +vanished=\u00a76\u5df2\u9032\u5165\u96b1\u8eab\u6a21\u5f0f,\u73a9\u5bb6\u5c07\u7121\u6cd5\u770b\u5230\u4f60. +versionMismatch=\u00a74\u7248\u672c\u4e0d\u5339\u914d\uff01\u8acb\u5347\u7d1a {0} \u5230\u76f8\u540c\u7248\u672c. +versionMismatchAll=\u00a74\u7248\u672c\u4e0d\u5339\u914d\uff01\u8acb\u5347\u7d1a\u6240\u6709Essentials\u7cfb\u5217\u7684\u5916\u639b\u7a0b\u5f0f\u5230\u76f8\u540c\u7248\u672c. +voiceSilenced=\u00a76\u5df2\u975c\u97f3 +walking=\u884c\u8d70\u4e2d +warpDeleteError=\u00a74\u522a\u9664\u5730\u6a19\u6587\u4ef6\u6642\u767c\u751f\u932f\u8aa4 +warpList={0} +warpListPermission=\u00a74\u4f60\u6c92\u6709\u5217\u51fa\u5730\u6a19\u7684\u8a31\u53ef\u6b0a +warpNotExist=\u00a74\u8a72\u5730\u6a19\u4e0d\u5b58\u5728 +warpOverwrite=\u00a74\u4f60\u4e0d\u80fd\u91cd\u7f6e\u8a72\u5730\u8868 +warpSet=\u00a76\u5730\u6a19 \u00a7c{0} \u00a76\u5df2\u8a2d\u7f6e +warpUsePermission=\u00a74\u4f60\u6c92\u6709\u4f7f\u7528\u8a72\u5730\u6a19\u7684\u8a31\u53ef\u6b0a +warpingTo=\u00a76\u50b3\u9001\u5230\u5730\u6a19 \u00a7c{0} +warps=\u00a76\u5730\u6a19: \u00a7r{0} +warpsCount=\u00a76\u9019\u6709 {0} \u5730\u6a19,\u986f\u793a \u7b2c {1} \u9801/\u5171 {2} \u9801 +weatherStorm=\u00a76\u4f60\u5c07 {0} \u7684\u5929\u6c23\u6539\u70ba\u96e8\u96ea +weatherStormFor=\u00a76\u4f60\u5c07 {0} \u7684\u5929\u6c23\u7684\u6539\u70ba\u96e8\u96ea,\u6301\u7e8c {1} \u79d2 +weatherSun=\u00a76\u4f60\u5c07 {0} \u7684\u5929\u6c23\u6539\u70ba\u6674\u5929 +weatherSunFor=\u00a76\u4f60\u5c07 {0} \u7684\u5929\u6c23\u7684\u6539\u70ba\u6674\u5929,\u6301\u7e8c {1} \u79d2 +whoisAFK=\u00a76 - \u66ab\u96e2:\u00a7r {0} +whoisBanned=\u00a76 - \u5c01\u7981:\u00a7r {0} +whoisExp=\u00a76 - \u7d93\u9a57:\u00a7r {0} (\u7b49\u7d1a {1}) +whoisFly=\u00a76 - \u98db\u884c\u6a21\u5f0f:\u00a7r {0} ({1}) +whoisGamemode=\u00a76 - \u904a\u6232\u6a21\u5f0f:\u00a7r {0} +whoisGeoLocation=\u00a76 - \u5730\u7406\u4f4d\u7f6e:\u00a7r {0} +whoisGod=\u00a76 - \u4e0a\u5e1d\u6a21\u5f0f:\u00a7r {0} +whoisHealth=\u00a76 - \u751f\u547d:\u00a7r {0}/20 +whoisIPAddress=\u00a76 - IP\u4f4d\u5740:\u00a7r {0} +whoisJail=\u00a76 - \u76e3\u7344:\u00a7r {0} +whoisLocation=\u00a76 - \u5750\u6a19:\u00a7r ({0}, {1}, {2}, {3}) +whoisMoney=\u00a76 - \u73fe\u91d1:\u00a7r {0} +whoisMuted=\u00a76 - \u7981\u8a00:\u00a7r {0} +whoisNick=\u00a76 - \u66b1\u7a31:\u00a7r {0} +whoisOp=\u00a76 - OP:\u00a7r {0} +whoisTop=\u00a76 ====== \u00a7c {0} \u00a76\u7684\u8cc7\u6599====== +worth=\u00a76\u4e00\u7d44 {0} \u50f9\u503c \u00a74{1}\u00a76\uff08{2} \u55ae\u4f4d\u7269\u54c1,\u6bcf\u500b\u50f9\u503c {3}\uff09 +worthMeta=\u00a7a\u4e00\u7d44\u526f\u78bc\u70ba {1} \u7684 {0} \u50f9\u503c \u00a7c{2}\u00a76\uff08{3} \u55ae\u4f4d\u7269\u54c1,\u6bcf\u500b\u50f9\u503c {4}\uff09 +worthSet=\u00a76\u50f9\u683c\u5df2\u8a2d\u7f6e +year=\u5e74 +years=\u5e74 +youAreHealed=\u00a76\u4f60\u5df2\u88ab\u6cbb\u7642 +youHaveNewMail=\u00a76\u4f60\u64c1\u6709 \u00a7c{0}\u00a76 \u689d\u6d88\u606f\uff01\u00a7r\u8f38\u5165 \u00a7c/mail read\u00a76 \u4f86\u67e5\u770b +playerUnbanned=\u00a76\u5df2\u89e3\u9664\u7528\u6236\u00a7c {0} \u00a76\u7684\u5c01\u7981 {1}. +playerUnbanIpAddress=\u00a76\u5df2\u89e3\u9664\u7528\u6236\u00a7c {0} \u00a76\u7684\u5c01\u7981IP: {1}. +playerBanIpAddress=\u00a76\u5df2\u5c01\u7981\u7528\u6236\u00a7c {0} \u00a76\u7684IP\u4f4d\u5740 {1}\u00a76. +noPotionEffectPerm=\u00a74\u4f60\u6c92\u6709\u8a31\u53ef\u6b0a\u61c9\u7528\u7279\u6548 \u00a7c{0} \u00a74\u5230\u9019\u500b\u85e5\u6c34. +invalidPotionMeta=\u00a74\u7121\u6548\u7684\u85e5\u6c34\u6578\u64da: \u00a7c{0}\u00a74. +balanceOther=\u00a7a{0}\u7684\u91d1\u9322:\u00a7c {1} +pWeatherCurrent=\u00a7c{0}\u00a76\u7684\u5929\u6c23\u662f\u00a7c {1}\u00a76. +pWeatherNormal=\u00a7c{0}\u00a76\u7684\u5929\u6c23\u662f\u6b63\u5e38\u7684. +pWeatherOthersPermission=\u00a74\u60a8\u6c92\u6709\u88ab\u6388\u6b0a\u8a2d\u7f6e\u5176\u4ed6\u73a9\u5bb6\u7684\u5929\u6c23. +pWeatherPlayers=\u00a76\u9019\u4e9b\u73a9\u5bb6\u90fd\u6709\u81ea\u5df1\u7684\u5929\u6c23:\u00a7r +pWeatherReset=\u00a76\u73a9\u5bb6\u7684\u5929\u6c23\u88ab\u91cd\u7f6e: \u00a7c{0} +pWeatherSet=\u00a76\u73a9\u5bb6\u00a7c{1}\u00a76\u7684\u5929\u6c23\u88ab\u8a2d\u7f6e\u70ba \u00a7c{0}\u00a76 . +pWeatherInvalidAlias=\u00a74\u932f\u8aa4\u7684\u5929\u6c23\u985e\u578b +socialSpy=\u00a76SocialSpy for {0}\u00a76: {1} +kitNotFound=\u00a74That kit does not exist. +cannotStackMob=\u00a74You do not have permission to stack multiple mobs +kitOnce=\u00a74You can't use that kit again. +invalidHomeName=\u00a74Invalid home name! +invalidNumber=Invalid Number. +invalidPotion=\u00a74Invalid Potion. +holdBook=\u00a74You are not holding a writable book. +editBookContents=\u00a7eYou may now edit the contents of this book. +bookAuthorSet=\u00a76Author of the book set to {0}. +bookLocked=\u00a76This book is now locked. +bookTitleSet=\u00a76Title of the book set to {0}. +insufficientFunds=\u00a74Insufficient funds available. +setBal=\u00a7aYour balance was set to {0}. +setBalOthers=\u00a7aYou set {0}''s balance to {1}. diff --git a/Essentials/src/motd.txt b/Essentials/src/motd.txt index 224e452efa..3f0aa027ae 100644 --- a/Essentials/src/motd.txt +++ b/Essentials/src/motd.txt @@ -1,3 +1,3 @@ -&cWelcome, {PLAYER}&c! -&fType &c/help&f for a list of commands. -Currently online: {PLAYERLIST} \ No newline at end of file +&6Welcome, {PLAYER}&6! +&6Type &c/help&6 for a list of commands. +&6Currently online:&r {PLAYERLIST} \ No newline at end of file diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml index 1d0a64d6a9..0a164234d3 100644 --- a/Essentials/src/plugin.yml +++ b/Essentials/src/plugin.yml @@ -9,12 +9,12 @@ authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xe commands: afk: description: Marks you as away-from-keyboard. - usage: / + usage: / [player] aliases: [eafk] antioch: description: 'A little surprise for operators.' usage: / [message] - aliases: [eantioch,grenade,tnt,egrenade,etnt] + aliases: [eantioch,grenade,egrenade,tnt,etnt] back: description: Teleports you to your location prior to tp/spawn/warp. usage: / @@ -26,11 +26,11 @@ commands: balance: description: States the current balance of a player. usage: / [player] - aliases: [bal,money,emoney,ebalance,ebal] + aliases: [bal,ebal,ebalance,money,emoney] balancetop: description: Gets the top balance values. usage: / - aliases: [baltop,ebaltop,ebalancetop] + aliases: [ebalancetop,baltop,ebaltop] ban: description: Bans a player. usage: / [reason] @@ -39,6 +39,10 @@ commands: description: Bans an IP address. usage: /
aliases: [ebanip] + book: + description: Allows reopening and editing of sealed books. + usage: / [title|author [name]] + aliases: [ebook] break: description: Breaks the block you are looking at. usage: / @@ -46,7 +50,7 @@ commands: broadcast: description: Broadcasts a message to the entire server. usage: / - aliases: [ebroadcast,bcast,ebcast] + aliases: [bc,ebc,bcast,ebcast,ebroadcast,shout,eshout] bigtree: description: Spawn a big tree where you are looking. usage: / @@ -57,40 +61,44 @@ commands: aliases: [eburn] clearinventory: description: Clear all items in your inventory. - usage: / - aliases: [ci,eci,clearinvent,clean,eclean,eclearinvent,eclearinventory] + usage: / [player|*] [item[:]|*|**] + aliases: [ci,eci,clean,eclean,clear,eclear,clearinvent,eclearinvent,eclearinventory] compass: description: Describes your current bearing. usage: / aliases: [ecompass,direction,edirection] delhome: - description: Removes a home + description: Removes a home. usage: / [player:] - aliases: [edelhome,remhome,rmhome,eremhome,ermhome] + aliases: [edelhome,remhome,eremhome,rmhome,ermhome] deljail: - description: Removes a jail + description: Removes a jail. usage: / aliases: [edeljail] delwarp: description: Deletes the specified warp. usage: / - aliases: [edelwarp,remwarp,rmwarp,eremwarp,ermwarp] + aliases: [edelwarp,remwarp,eremwarp,rmwarp,ermwarp] depth: description: States current depth, relative to sea level. usage: /depth aliases: [edepth] eco: description: Manages the server economy. - usage: / - aliases: [economy,eeco,eeconomy] + usage: / + aliases: [eeco,economy,eeconomy] enchant: description: Enchants the item the user is holding. usage: / [level] - aliases: [enchantment,eenchant,eenchantment] + aliases: [eenchant,enchantment,eenchantment] + enderchest: + description: Lets you see inside an enderchest. + usage: / [player] + aliases: [echest,eechest,eenderchest,endersee,eendersee] essentials: description: Reloads essentials. usage: / - aliases: [ess] + aliases: [eessentials, ess, eess, essversion] exp: description: Give, set or look at a players exp. usage: / [show|set|give] [playername [amount]] @@ -98,45 +106,45 @@ commands: ext: description: Extinguish players. usage: / [player] - aliases: [extinguish,eext,eextinguish] + aliases: [eext,extinguish,eextinguish] feed: description: Satisfy the hunger. usage: / [player] - aliases: [efeed,eat,eeat] + aliases: [eat,eeat,efeed] fly: description: Take off, and soar! - usage: / [player] [on|off] + usage: / [player [on|off]] aliases: [efly] - itemdb: - description: Searches for an item. - usage: / - aliases: [eitemdb,itemno,eitemno,durability,dura,edura,edurability] fireball: description: Throw a fireball. - usage: / [small] - aliases: [efireball] + usage: / [small|skull] + aliases: [efireball,fireentity,efireentity,fireskull,efireskull] + firework: + description: Allows you to modify a stack of fireworks. + usage: / <|power [amount]|clear|fire [amount]> + aliases: [efirework] gamemode: description: Change player gamemode. - usage: / [player] - aliases: [gm,creative,creativemode,egamemode,ecreative,ecreativemode,egm] + usage: / [player] + aliases: [adventure,eadventure,adventuremode,eadventuremode,creative,eecreative,creativemode,ecreativemode,egamemode,gm,egm,gma,egma,gmc,egmc,gms,egms,gmt,egmt,survival,esurvival,survivalmode,esurvivalmode] + gc: + description: Reports memory, uptime and tick info. + usage: / [all] + aliases: [lag,elag,egc,mem,emem,memory,ememory,uptime,euptime] getpos: description: Get your current coordinates or those of a player. usage: / [player] aliases: [coords,egetpos,position,eposition,whereami,ewhereami] - gc: - description: Reports garbage collection and tick info; useful to developers. - usage: / - aliases: [elag,lag,mem,memory,egc,emem,ememory] give: description: Give a player an item. - usage: / [amount ...] + usage: / [amount [itemmeta...]] aliases: [egive] god: description: Enables your godly powers. - usage: / [player] [on|off] - aliases: [tgm,godmode,egod,etgm,egodmode] + usage: / [player [on|off]] + aliases: [egod,godmode,egodmode,tgm,etgm] hat: - description: Get some cool new headgear + description: Get some cool new headgear. usage: / [remove] aliases: [ehat] heal: @@ -148,9 +156,9 @@ commands: usage: / [search term] [page] aliases: [ehelp] helpop: - description: Request help from online operators. + description: Message online admins. usage: / - aliases: [ehelpop] + aliases: [ac,eac,amsg,eamsg,ehelpop] home: description: Teleport to your home. usage: / [player:][name] @@ -160,17 +168,21 @@ commands: usage: / aliases: [eignore] info: - description: Shows information set by the server owner + description: Shows information set by the server owner. usage: / [chapter] [page] - aliases: [ifo,einfo,eabout,news,enews,eifo] + aliases: [about,eabout,ifo,eifo,einfo,inform,einform,news,enews] invsee: description: See the inventory of other players. usage: / aliases: [einvsee] item: description: Spawn an item. - usage: / [amount ...] + usage: / [amount [itemmeta...]] aliases: [i,eitem] + itemdb: + description: Searches for an item. + usage: / + aliases: [dura,edura,durability,edurability,eitemdb,itemno,eitemno] jails: description: List all jails. usage: / @@ -178,7 +190,7 @@ commands: jump: description: Jumps to the nearest block in the line of sight. usage: / - aliases: [j,ej,jumpto,ejumpto,ejump] + aliases: [j,ej,ejump,jumpto,ejumpto] kick: description: Kicks a specified player with a reason. usage: / [reason] @@ -187,29 +199,29 @@ commands: description: Kicks all players off the server except the issuer. usage: / [reason] aliases: [ekickall] - kit: - description: Obtains the specified kit or views all available kits. - usage: / [kit] [player] - aliases: [ekit,kits,ekits] kill: description: Kills specified player. usage: / aliases: [ekill] killall: description: Kill all mobs in a world. - usage: / [mobType] [radius] - aliases: [ekillall,butcher,ebutcher,mobkill,emobkill] + usage: / [mobType] [radius] [world] + aliases: [butcher,ebutcher,ekillall,mobkill,emobkill] + kit: + description: Obtains the specified kit or views all available kits. + usage: / [kit] [player] + aliases: [ekit,kits,ekits] kittycannon: - description: Throw an exploding kitten at your opponent + description: Throw an exploding kitten at your opponent. usage: / - list: - description: List all online players. - usage: / - aliases: [playerlist,who,online,plist,eplist,elist,ewho,eplayerlist,eonline] lightning: description: The power of Thor. Strike at cursor or player. usage: / [player] [power] - aliases: [strike,smite,thor,shock,elightning,estrike,esmite,ethor,eshock] + aliases: [elightning,shock,eshock,smite,esmite,strike,estrike,thor,ethor] + list: + description: List all online players. + usage: / [group] + aliases: [elist,online,eonline,playerlist,eplayerlist,plist,eplist,who,ewho] mail: description: Manages inter-player, intra-server mail. usage: / [read|clear|send [to] [message]|sendall [message]] @@ -217,7 +229,7 @@ commands: me: description: Describes an action in the context of the player. usage: / - aliases: [action,describe,eme,eaction,edescribe] + aliases: [action,eaction,describe,edescribe,eme] more: description: Fills the item stack in hand to maximum size. usage: / @@ -229,15 +241,15 @@ commands: msg: description: Sends a private message to the specified player. usage: / - aliases: [m,t,emsg,tell,etell,whisper,ewhisper] + aliases: [w,m,t,emsg,tell,etell,whisper,ewhisper] mute: description: Mutes or unmutes a player. usage: / [datediff] aliases: [emute] near: - description: Lists the players near by or around a player + description: Lists the players near by or around a player. usage: / [playername] [radius] - aliases: [nearby,enear,enearby] + aliases: [enear,nearby,enearby] nick: description: Change your nickname or that of another player. usage: / [player] @@ -247,25 +259,33 @@ commands: usage: / [player] aliases: [enuke] pay: - description: Pays another player from your balance + description: Pays another player from your balance. usage: / aliases: [epay] ping: description: Pong! usage: / - aliases: [pong,echo,echo,eping,epong] + aliases: [echo,eecho,eping,pong,epong] + potion: + description: Adds custom potion effects to a potion. + usage: / power: duration:> + aliases: [epotion,elixer,eelixer] powertool: description: Assigns a command to the item in hand. usage: / [l:|a:|r:|c:|d:][command] [arguments] - {player} can be replaced by name of a clicked player. - aliases: [pt,epowertool,ept] + aliases: [epowertool,pt,ept] powertooltoggle: - description: Enables or disables all current powertools + description: Enables or disables all current powertools. usage: / - aliases: [ptt,epowertooltoggle,pttoggle,epttoggle,eptt] + aliases: [epowertooltoggle,ptt,eptt,pttoggle,epttoggle] ptime: description: Adjust player's client time. Add @ prefix to fix. usage: / [list|reset|day|night|dawn|17:30|4pm|4000ticks] [player|*] - aliases: [playertime, eptime, eplayertime] + aliases: [playertime,eplayertime,eptime] + pweather: + description: Adjust a player's weather + usage: / [list|reset|storm|sun|clear] [player|*] + aliases: [playerweather,eplayerweather,epweather] r: description: Quickly reply to the last player to message you. usage: / @@ -274,20 +294,24 @@ commands: description: Displays the username of a user based on nick. usage: / aliases: [erealname] + recipe: + description: Displays how to craft items. + usage: / [number] + aliases: [formula,eformula,method,emethod,erecipe,recipes,erecipes] remove: - description: Removes entities in your world - usage: / [radius] + description: Removes entities in your world. + usage: / [radius] [world] aliases: [eremove] repair: description: Repairs the durability of all or one item. usage: / - aliases: [fix,erepair,efix] + aliases: [fix,efix,erepair] rules: description: Views the server rules. usage: / aliases: [erules] seen: - description: Shows the last logout time of a player + description: Shows the last logout time of a player. usage: / aliases: [eseen] sell: @@ -299,29 +323,33 @@ commands: usage: / [[player:]name] aliases: [esethome] setjail: - description: Creates a jail where you specified named [jailname] + description: Creates a jail where you specified named [jailname]. usage: / aliases: [esetjail] setwarp: description: Creates a new warp. usage: / - aliases: [createwarp,esetwarp] + aliases: [createwarp,ecreatewarp,esetwarp] setworth: description: Set the sell value of an item. usage: / [itemname|id] aliases: [esetworth] socialspy: description: Toggles if you can see msg/mail commands in chat. - usage: / + usage: / [player] aliases: [esocialspy] spawner: - description: Change the mob type of a spawner + description: Change the mob type of a spawner. usage: / - aliases: [espawner,changems,echangems] + aliases: [changems,echangems,espawner] spawnmob: description: Spawns a mob. usage: / [:data][,[:data]] [amount] [player] - aliases: [espawnmob,mob,emob] + aliases: [mob,emob,spawnentity,espawnentity,espawnmob] + speed: + description: Change your speed limits. + usage: / [type] [player] + aliases: [flyspeed,eflyspeed,fspeed,efspeed,espeed,walkspeed,ewalkspeed,wspeed,ewspeed] sudo: description: Make another user perform a command. usage: / @@ -341,11 +369,11 @@ commands: time: description: Display/Change the world time. Defaults to current world. usage: / [day|night|dawn|17:30|4pm|4000ticks] [worldname|all] - aliases: [etime, day, night] + aliases: [day,eday,night,enight,etime] togglejail: - description: Jails/Unjails a player and tp them to the jail specified. + description: Jails/Unjails a player, TPs them to the jail specified. usage: / [datediff] - aliases: [tjail,jail,ejail,unjail,eunjail,etogglejail] + aliases: [jail,ejail,tjail,etjail,etogglejail,unjail,eunjail] top: description: Teleport to the highest block at your current position. usage: / @@ -353,11 +381,11 @@ commands: tp: description: Teleport to a player. usage: / [otherplayer] - aliases: [tele,teleport,eteleport,etele,etp,tp2p,etp2p] + aliases: [tele,etele,teleport,eteleport,etp,tp2p,etp2p] tpa: description: Request to teleport to the specified player. usage: / - aliases: [call,tpask,etpask,etpa,ecall] + aliases: [call,ecall,etpa,tpask,etpask] tpaall: description: Requests all players online to teleport to you. usage: / @@ -365,7 +393,7 @@ commands: tpaccept: description: Accepts a teleport request. usage: / [otherplayer] - aliases: [tpyes,etpaccept,etpyes] + aliases: [etpaccept,tpyes,etpyes] tpahere: description: Request that the specified player teleport to you. usage: / @@ -377,7 +405,7 @@ commands: tpdeny: description: Reject a teleport request. usage: / - aliases: [tpno,etpdeny,etpno] + aliases: [etpdeny,tpno,etpno] tphere: description: Teleport a player to you. usage: / @@ -396,7 +424,7 @@ commands: aliases: [etppos] tptoggle: description: Blocks all forms of teleportation. - usage: / + usage: / [player [on|off]] aliases: [etptoggle] tree: description: Spawn a tree where you are looking. @@ -417,19 +445,23 @@ commands: vanish: description: Hide yourself from other players. usage: / [on|off] - aliases: [evanish] + aliases: [v,ev,evanish] warp: description: List all warps or warp to the specified location. usage: / [player] aliases: [ewarp,warps,ewarps] weather: - description: Setting the weather. + description: Sets the weather. usage: / [duration] - aliases: [sky,sun,storm,eweather,esky,esun,estorm] + aliases: [rain,erain,sky,esky,storm,estorm,sun,esun,eweather] whois: description: Determine the username behind a nickname. usage: / aliases: [ewhois] + workbench: + description: Opens up a workbench. + usage: / + aliases: [craft,ecraft,wb,ewb,wbench,ewbench,eworkbench] world: description: Switch between worlds. usage: / [world] @@ -437,4 +469,9 @@ commands: worth: description: Calculates the worth of items in hand or as specified. usage: / [item] [amount] - aliases: [eworth,price,eprice] + aliases: [eprice,price,eworth] + +permissions: + essentials.*: + default: op + description: Give players with op everything by default diff --git a/Essentials/src/worth.yml b/Essentials/src/worth.yml index d0e9281b37..600795d41f 100644 --- a/Essentials/src/worth.yml +++ b/Essentials/src/worth.yml @@ -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 diff --git a/Essentials/test/com/earth2me/essentials/EconomyTest.java b/Essentials/test/com/earth2me/essentials/EconomyTest.java index 219d68b40f..f2d1bfcc31 100644 --- a/Essentials/test/com/earth2me/essentials/EconomyTest.java +++ b/Essentials/test/com/earth2me/essentials/EconomyTest.java @@ -87,8 +87,8 @@ public void testEconomy() assertEquals("Format $1000", "$1000", Economy.format(1000.0)); assertEquals("Format $10", "$10", Economy.format(10.0)); assertEquals("Format $10.10", "$10.10", Economy.format(10.10)); - assertEquals("Format $10.10", "$10.10", Economy.format(10.102)); - assertEquals("Format $10.11", "$10.11", Economy.format(10.109)); + assertEquals("Format $10.10", "$10.10", Economy.format(10.1000001)); + assertEquals("Format $10.10", "$10.10", Economy.format(10.1099999)); //test Exceptions diff --git a/Essentials/test/com/earth2me/essentials/FakeServer.java b/Essentials/test/com/earth2me/essentials/FakeServer.java index 53763b8ca8..94e1bb6cbb 100644 --- a/Essentials/test/com/earth2me/essentials/FakeServer.java +++ b/Essentials/test/com/earth2me/essentials/FakeServer.java @@ -1,25 +1,22 @@ package com.earth2me.essentials; -import com.earth2me.essentials.craftbukkit.FakeWorld; import com.avaje.ebean.config.ServerConfig; +import com.earth2me.essentials.craftbukkit.FakeWorld; import java.io.File; import java.util.*; import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.logging.Logger; -import org.bukkit.World.Environment; import org.bukkit.*; +import org.bukkit.Warning.WarningState; +import org.bukkit.World.Environment; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; -import org.bukkit.generator.ChunkGenerator; import org.bukkit.help.HelpMap; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.Recipe; +import org.bukkit.inventory.*; import org.bukkit.map.MapView; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; @@ -28,6 +25,7 @@ import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitWorker; +import org.bukkit.scoreboard.ScoreboardManager; public class FakeServer implements Server @@ -43,11 +41,13 @@ public FakeServer() } } + @Override public String getName() { return "Essentials Fake Server"; } + @Override public String getVersion() { return "1.0"; @@ -118,6 +118,12 @@ public File getUpdateFolderFile() throw new UnsupportedOperationException("Not supported yet."); } + @Override + public boolean isHardcore() + { + throw new UnsupportedOperationException("Not supported yet."); + } + @Override public Player getPlayer(String string) { @@ -174,19 +180,6 @@ public int scheduleSyncRepeatingTask(Plugin plugin, Runnable r, long l, long l1) throw new UnsupportedOperationException("Not supported yet."); } - @Override - public int scheduleAsyncDelayedTask(Plugin plugin, Runnable r, long l) - { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int scheduleAsyncDelayedTask(Plugin plugin, Runnable r) - { - r.run(); - return 0; - } - @Override public int scheduleAsyncRepeatingTask(Plugin plugin, Runnable r, long l, long l1) { @@ -240,6 +233,56 @@ public List getPendingTasks() { throw new UnsupportedOperationException("Not supported yet."); } + + @Override + public BukkitTask runTask(Plugin plugin, Runnable r) throws IllegalArgumentException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public BukkitTask runTaskAsynchronously(Plugin plugin, Runnable r) throws IllegalArgumentException + { + r.run(); + return null; + } + + @Override + public BukkitTask runTaskLater(Plugin plugin, Runnable r, long l) throws IllegalArgumentException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public BukkitTask runTaskLaterAsynchronously(Plugin plugin, Runnable r, long l) throws IllegalArgumentException + { + r.run(); + return null; + } + + @Override + public BukkitTask runTaskTimer(Plugin plugin, Runnable r, long l, long l1) throws IllegalArgumentException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public BukkitTask runTaskTimerAsynchronously(Plugin plugin, Runnable r, long l, long l1) throws IllegalArgumentException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int scheduleAsyncDelayedTask(Plugin plugin, Runnable r, long l) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int scheduleAsyncDelayedTask(Plugin plugin, Runnable r) + { + throw new UnsupportedOperationException("Not supported yet."); + } }; } @@ -741,4 +784,46 @@ public int getWaterAnimalSpawnLimit() { throw new UnsupportedOperationException("Not supported yet."); } + + @Override + public boolean isPrimaryThread() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getMotd() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public WarningState getWarningState() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getAmbientSpawnLimit() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getShutdownMessage() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public ItemFactory getItemFactory() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public ScoreboardManager getScoreboardManager() + { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/Essentials/test/com/earth2me/essentials/StorageTest.java b/Essentials/test/com/earth2me/essentials/StorageTest.java index b7fe234334..bde770997a 100644 --- a/Essentials/test/com/earth2me/essentials/StorageTest.java +++ b/Essentials/test/com/earth2me/essentials/StorageTest.java @@ -1,11 +1,6 @@ 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 java.io.IOException; import junit.framework.TestCase; import org.bukkit.Location; import org.bukkit.World; @@ -39,100 +34,6 @@ public StorageTest() } } - @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() { diff --git a/Essentials/test/com/earth2me/essentials/UserTest.java b/Essentials/test/com/earth2me/essentials/UserTest.java index ef9ab515d3..5b096431f8 100644 --- a/Essentials/test/com/earth2me/essentials/UserTest.java +++ b/Essentials/test/com/earth2me/essentials/UserTest.java @@ -51,7 +51,7 @@ public void testHome() { User user = ess.getUser(base1); Location loc = base1.getLocation(); - user.setHome(); + user.setHome("home", loc); OfflinePlayer base2 = server.createPlayer(base1.getName(), ess); User user2 = ess.getUser(base2); diff --git a/Essentials/test/com/earth2me/essentials/UtilTest.java b/Essentials/test/com/earth2me/essentials/UtilTest.java index 2efd39e4c0..e1edda95e0 100644 --- a/Essentials/test/com/earth2me/essentials/UtilTest.java +++ b/Essentials/test/com/earth2me/essentials/UtilTest.java @@ -3,6 +3,8 @@ import java.io.IOException; import java.util.Calendar; import java.util.GregorianCalendar; +import java.util.HashSet; +import java.util.Set; import junit.framework.TestCase; import org.bukkit.World.Environment; import org.bukkit.plugin.InvalidDescriptionException; @@ -32,6 +34,33 @@ public UtilTest() } } + public void testSafeLocation() + { + Set testSet = new HashSet(); + int count = 0; + int x, y, z, origX, origY, origZ; + x = y = z = origX = origY = origZ = 0; + int i = 0; + while (true) + { + testSet.add(x + ":" + y + ":" + z); + count++; + i++; + if (i >= Util.VOLUME.length) + { + break; + } + x = origX + Util.VOLUME[i].x; + y = origY + Util.VOLUME[i].y; + z = origZ + Util.VOLUME[i].z; + } + assertTrue(testSet.contains("0:0:0")); + assertTrue(testSet.contains("3:3:3")); + assertEquals(testSet.size(), count); + int diameter = Util.RADIUS * 2 + 1; + assertEquals(diameter * diameter * diameter, count); + } + public void testFDDnow() { Calendar c = new GregorianCalendar(); diff --git a/EssentialsUpdate/build.xml b/EssentialsAntiBuild/build.xml similarity index 84% rename from EssentialsUpdate/build.xml rename to EssentialsAntiBuild/build.xml index dedb62afaa..8cae8a7c12 100644 --- a/EssentialsUpdate/build.xml +++ b/EssentialsAntiBuild/build.xml @@ -1,4 +1,5 @@ + ]> @@ -7,9 +8,9 @@ - - Builds, tests, and runs the project EssentialsUpdate. - + + Builds, tests, and runs the project EssentialsAntiBuild. + + + + + + + + + diff --git a/EssentialsUpdate/nbproject/build-impl.xml b/EssentialsAntiBuild/nbproject/build-impl.xml similarity index 68% rename from EssentialsUpdate/nbproject/build-impl.xml rename to EssentialsAntiBuild/nbproject/build-impl.xml index 2f8555c4ca..94e589ef7d 100644 --- a/EssentialsUpdate/nbproject/build-impl.xml +++ b/EssentialsAntiBuild/nbproject/build-impl.xml @@ -12,14 +12,14 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup --> - + @@ -181,6 +181,7 @@ is divided into following sections: + @@ -225,6 +226,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -357,11 +379,52 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -370,32 +433,270 @@ is divided into following sections: - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -427,10 +728,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -488,6 +792,7 @@ is divided into following sections: + @@ -504,6 +809,7 @@ is divided into following sections: + @@ -511,6 +817,7 @@ is divided into following sections: + @@ -537,6 +844,9 @@ is divided into following sections: + + + @@ -582,7 +892,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -806,8 +1127,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -815,12 +1137,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -832,12 +1150,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -859,6 +1173,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -945,14 +1295,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -965,39 +1315,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1039,7 +1390,7 @@ is divided into following sections: - + @@ -1049,6 +1400,13 @@ is divided into following sections: + + + + + + + @@ -1062,9 +1420,12 @@ is divided into following sections: - - - + + + + + + diff --git a/EssentialsAntiBuild/nbproject/genfiles.properties b/EssentialsAntiBuild/nbproject/genfiles.properties new file mode 100644 index 0000000000..ed84f2f678 --- /dev/null +++ b/EssentialsAntiBuild/nbproject/genfiles.properties @@ -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=00e1454b +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/EssentialsUpdate/nbproject/project.properties b/EssentialsAntiBuild/nbproject/project.properties similarity index 91% rename from EssentialsUpdate/nbproject/project.properties rename to EssentialsAntiBuild/nbproject/project.properties index 88315dfa0d..10fe0db046 100644 --- a/EssentialsUpdate/nbproject/project.properties +++ b/EssentialsAntiBuild/nbproject/project.properties @@ -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} diff --git a/EssentialsGroupBridge/nbproject/project.xml b/EssentialsAntiBuild/nbproject/project.xml similarity index 75% rename from EssentialsGroupBridge/nbproject/project.xml rename to EssentialsAntiBuild/nbproject/project.xml index e137138707..931bed5ead 100644 --- a/EssentialsGroupBridge/nbproject/project.xml +++ b/EssentialsAntiBuild/nbproject/project.xml @@ -3,7 +3,7 @@ org.netbeans.modules.java.j2seproject - EssentialsGroupBridge + EssentialsAntiBuild @@ -11,9 +11,12 @@ + + ../lib/nblibraries.properties + - EssentialsGroupManager + Essentials jar jar diff --git a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/AntiBuildConfig.java b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/AntiBuildConfig.java new file mode 100644 index 0000000000..f0cdfcef4e --- /dev/null +++ b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/AntiBuildConfig.java @@ -0,0 +1,74 @@ +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"), + blacklist_dispenser("protect.blacklist.dispenser"); + 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; + } +} diff --git a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuild.java b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuild.java new file mode 100644 index 0000000000..c7b2eb7dd1 --- /dev/null +++ b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuild.java @@ -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 settingsBoolean = new EnumMap(AntiBuildConfig.class); + private final transient Map> settingsList = new EnumMap>(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 itemList = settingsList.get(list); + return itemList != null && !itemList.isEmpty() && itemList.contains(id); + } + + @Override + public EssentialsConnect getEssentialsConnect() + { + return ess; + } + + @Override + public Map getSettingsBoolean() + { + return settingsBoolean; + } + + @Override + public Map> getSettingsList() + { + return settingsList; + } + + @Override + public boolean getSettingBool(final AntiBuildConfig protectConfig) + { + final Boolean bool = settingsBoolean.get(protectConfig); + return bool == null ? protectConfig.getDefaultValueBoolean() : bool; + } +} diff --git a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java new file mode 100644 index 0000000000..e457f72f22 --- /dev/null +++ b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java @@ -0,0 +1,326 @@ +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.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; +import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +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(final User user, final String action, final Block block) + { + if (block == null) + { + if (ess.getSettings().isDebug()) + { + ess.getLogger().log(Level.INFO, "AntiBuild permission check failed, invalid block."); + } + return false; + } + return metaPermCheck(user, action, block.getTypeId(), block.getData()); + } + + private boolean metaPermCheck(final User user, final String action, final int blockId) + { + final String blockPerm = "essentials.build." + action + "." + blockId; + return user.isAuthorized(blockPerm); + } + + private boolean metaPermCheck(final User user, final String action, final int blockId, final short 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, "DataValue perm on " + user.getName() + " is not directly set: " + dataPerm); + } + } + + return user.isAuthorized(blockPerm); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockPlace(final BlockPlaceEvent event) + { + final User user = ess.getUser(event.getPlayer()); + final Block block = event.getBlockPlaced(); + final int typeId = block.getTypeId(); + final Material type = block.getType(); + + if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build") + && !metaPermCheck(user, "place", block)) + { + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildPlace", type.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.blacklist_placement, typeId) && !user.isAuthorized("essentials.protect.exemptplacement")) + { + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildPlace", type.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.alert_on_placement, typeId) + && !user.isAuthorized("essentials.protect.alerts.notrigger")) + { + prot.getEssentialsConnect().alert(user, type.toString(), _("alertPlaced")); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockBreak(final BlockBreakEvent event) + { + final User user = ess.getUser(event.getPlayer()); + final Block block = event.getBlock(); + final int typeId = block.getTypeId(); + final Material type = block.getType(); + + if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build") + && !metaPermCheck(user, "break", block)) + { + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildBreak", type.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.blacklist_break, typeId) + && !user.isAuthorized("essentials.protect.exemptbreak")) + { + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildBreak", type.toString())); + } + event.setCancelled(true); + return; + } + + 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, ignoreCancelled = true) + public void onHangingBreak(final HangingBreakByEntityEvent event) + { + final Entity entity = event.getRemover(); + if (entity instanceof Player) + { + final User user = ess.getUser(entity); + final EntityType type = event.getEntity().getType(); + final boolean warn = ess.getSettings().warnOnBuildDisallow(); + if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build")) + { + if (type == EntityType.PAINTING && !metaPermCheck(user, "break", Material.PAINTING.getId())) + { + if (warn) + { + user.sendMessage(_("antiBuildBreak", Material.PAINTING.toString())); + } + event.setCancelled(true); + } + else if(type == EntityType.ITEM_FRAME && !metaPermCheck(user, "break", Material.ITEM_FRAME.getId())) + { + if (warn) + { + user.sendMessage(_("antiBuildBreak", Material.ITEM_FRAME.toString())); + } + event.setCancelled(true); + } + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockPistonExtend(final BlockPistonExtendEvent event) + { + for (Block block : event.getBlocks()) + { + if (prot.checkProtectionItems(AntiBuildConfig.blacklist_piston, block.getTypeId())) + { + event.setCancelled(true); + return; + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockPistonRetract(final BlockPistonRetractEvent event) + { + if (!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()); + final ItemStack item = event.getItem(); + + if (item != null + && prot.checkProtectionItems(AntiBuildConfig.blacklist_usage, item.getTypeId()) + && !user.isAuthorized("essentials.protect.exemptusage")) + { + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildUse", item.getType().toString())); + } + 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.build")) + { + if (event.hasItem() && !metaPermCheck(user, "interact", item.getTypeId(), item.getDurability())) + { + event.setCancelled(true); + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildUse", item.getType().toString())); + } + return; + } + if (event.hasBlock() && !metaPermCheck(user, "interact", event.getClickedBlock())) + { + event.setCancelled(true); + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildInteract", event.getClickedBlock().getType().toString())); + } + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onCraftItemEvent(final CraftItemEvent event) + { + HumanEntity entity = event.getWhoClicked(); + + if (entity instanceof Player) + { + final User user = ess.getUser(entity); + final ItemStack item = event.getRecipe().getResult(); + + if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.build")) + { + if (!metaPermCheck(user, "craft", item.getTypeId(), item.getDurability())) + { + event.setCancelled(true); + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildCraft", item.getType().toString())); + } + } + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerPickupItem(PlayerPickupItemEvent event) + { + + final User user = ess.getUser(event.getPlayer()); + final ItemStack item = event.getItem().getItemStack(); + + if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.build")) + { + if (!metaPermCheck(user, "pickup", item.getTypeId(), item.getDurability())) + { + event.setCancelled(true); + event.getItem().setPickupDelay(50); + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerDropItem(final PlayerDropItemEvent event) + { + + final User user = ess.getUser(event.getPlayer()); + final ItemStack item = event.getItemDrop().getItemStack(); + + if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.build")) + { + if (!metaPermCheck(user, "drop", item.getTypeId(), item.getDurability())) + { + event.setCancelled(true); + user.updateInventory(); + if (ess.getSettings().warnOnBuildDisallow()) + { + user.sendMessage(_("antiBuildDrop", item.getType().toString())); + } + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockDispense(final BlockDispenseEvent event) + { + final ItemStack item = event.getItem(); + if (prot.checkProtectionItems(AntiBuildConfig.blacklist_dispenser, item.getTypeId())) + { + event.setCancelled(true); + } + } +} diff --git a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsConnect.java b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsConnect.java new file mode 100644 index 0000000000..c25898f78d --- /dev/null +++ b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsConnect.java @@ -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())); + } + + } + + } + } +} diff --git a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/IAntiBuild.java b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/IAntiBuild.java new file mode 100644 index 0000000000..c7b370006c --- /dev/null +++ b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/IAntiBuild.java @@ -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 getSettingsBoolean(); + + Map> getSettingsList(); +} diff --git a/EssentialsAntiBuild/src/plugin.yml b/EssentialsAntiBuild/src/plugin.yml new file mode 100644 index 0000000000..cfe6e63672 --- /dev/null +++ b/EssentialsAntiBuild/src/plugin.yml @@ -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://tiny.cc/EssentialsCommands +description: Provides build protection. +authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, Iaccidentally] +depend: [Essentials] diff --git a/EssentialsChat/nbproject/build-impl.xml b/EssentialsChat/nbproject/build-impl.xml index 80a5b52568..2718ae609c 100644 --- a/EssentialsChat/nbproject/build-impl.xml +++ b/EssentialsChat/nbproject/build-impl.xml @@ -12,9 +12,9 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup @@ -181,6 +181,7 @@ is divided into following sections: + @@ -225,6 +226,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -357,11 +379,52 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -370,32 +433,270 @@ is divided into following sections: - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -427,10 +728,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -488,6 +792,7 @@ is divided into following sections: + @@ -504,6 +809,7 @@ is divided into following sections: + @@ -511,6 +817,7 @@ is divided into following sections: + @@ -537,6 +844,9 @@ is divided into following sections: + + + @@ -582,7 +892,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -813,8 +1127,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -822,12 +1137,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -839,12 +1150,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -866,6 +1173,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -952,14 +1295,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -972,39 +1315,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1076,9 +1420,12 @@ is divided into following sections: - - - + + + + + + diff --git a/EssentialsChat/nbproject/genfiles.properties b/EssentialsChat/nbproject/genfiles.properties index 98d5059134..8f6e6c76ce 100644 --- a/EssentialsChat/nbproject/genfiles.properties +++ b/EssentialsChat/nbproject/genfiles.properties @@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=28e38971@1.38.2.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=7c7f517b -nbproject/build-impl.xml.script.CRC32=52184b61 -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 +nbproject/build-impl.xml.script.CRC32=9ec3d353 +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java index 436bb55e50..f16579a4d0 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java @@ -2,12 +2,13 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.IEssentials; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentSkipListMap; import java.util.logging.Level; import java.util.logging.Logger; -import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -33,7 +34,7 @@ public void onEnable() } chatListener = new ConcurrentSkipListMap(); - final Map chatStore = new HashMap(); + final Map chatStore = Collections.synchronizedMap(new HashMap()); final EssentialsChatPlayerListenerLowest playerListenerLowest = new EssentialsChatPlayerListenerLowest(getServer(), ess, chatListener, chatStore); diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java index 58b0947933..8ca1e07263 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java @@ -6,27 +6,27 @@ import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; -//TODO: Translate the local/spy tags public abstract class EssentialsChatPlayer implements Listener { protected transient IEssentials ess; protected final static Logger logger = Logger.getLogger("Minecraft"); protected final transient Map listeners; protected final transient Server server; - protected final transient Map chatStorage; + protected final transient Map chatStorage; public EssentialsChatPlayer(final Server server, final IEssentials ess, final Map listeners, - final Map chatStorage) + final Map chatStorage) { this.ess = ess; this.listeners = listeners; @@ -34,21 +34,38 @@ public EssentialsChatPlayer(final Server server, this.chatStorage = chatStorage; } - public void onPlayerChat(final PlayerChatEvent event) + public void onPlayerChat(final AsyncPlayerChatEvent event) { } - public boolean isAborted(final PlayerChatEvent event) + public boolean isAborted(final AsyncPlayerChatEvent event) { if (event.isCancelled()) { return true; } - for (IEssentialsChatListener listener : listeners.values()) + synchronized (listeners) { - if (listener.shouldHandleThisChat(event)) + for (Map.Entry listener : listeners.entrySet()) { - return true; + try + { + if (listener.getValue().shouldHandleThisChat(event)) + { + return true; + } + } + catch (Throwable t) + { + if (ess.getSettings().isDebug()) + { + logger.log(Level.WARNING, "Error with EssentialsChat listener of " + listener.getKey() + ": " + t.getMessage(), t); + } + else + { + logger.log(Level.WARNING, "Error with EssentialsChat listener of " + listener.getKey() + ": " + t.getMessage()); + } + } } } return false; @@ -69,17 +86,17 @@ public String getChatType(final String message) } } - public ChatStore getChatStore(final PlayerChatEvent event) + public ChatStore getChatStore(final AsyncPlayerChatEvent event) { return chatStorage.get(event); } - public void setChatStore(final PlayerChatEvent event, final ChatStore chatStore) + public void setChatStore(final AsyncPlayerChatEvent event, final ChatStore chatStore) { chatStorage.put(event, chatStore); } - public ChatStore delChatStore(final PlayerChatEvent event) + public ChatStore delChatStore(final AsyncPlayerChatEvent event) { return chatStorage.remove(event); } @@ -89,7 +106,7 @@ protected void charge(final User user, final Trade charge) throws ChargeExceptio charge.charge(user); } - protected boolean charge(final PlayerChatEvent event, final ChatStore chatStore) + protected boolean charge(final AsyncPlayerChatEvent event, final ChatStore chatStore) { try { @@ -104,7 +121,7 @@ protected boolean charge(final PlayerChatEvent event, final ChatStore chatStore) return true; } - protected void sendLocalChat(final PlayerChatEvent event, final ChatStore chatStore) + protected void sendLocalChat(final AsyncPlayerChatEvent event, final ChatStore chatStore) { event.setCancelled(true); final User sender = chatStore.getUser(); @@ -117,14 +134,10 @@ protected void sendLocalChat(final PlayerChatEvent event, final ChatStore chatSt return; } - for (Player onlinePlayer : server.getOnlinePlayers()) + for (Player onlinePlayer : event.getRecipients()) { String type = _("chatTypeLocal"); final User onlineUser = ess.getUser(onlinePlayer); - if (onlineUser.isIgnoredPlayer(sender)) - { - continue; - } if (!onlineUser.equals(sender)) { boolean abort = false; @@ -133,10 +146,13 @@ protected void sendLocalChat(final PlayerChatEvent event, final ChatStore chatSt { abort = true; } - final double delta = playerLoc.distanceSquared(loc); - if (delta > chatStore.getRadius()) + else { - abort = true; + final double delta = playerLoc.distanceSquared(loc); + if (delta > chatStore.getRadius()) + { + abort = true; + } } if (abort) { @@ -151,10 +167,27 @@ protected void sendLocalChat(final PlayerChatEvent event, final ChatStore chatSt } } - String message = String.format(event.getFormat(), type.concat(sender.getDisplayName()), event.getMessage()); - for (IEssentialsChatListener listener : listeners.values()) + String message = type.concat(String.format(event.getFormat(), sender.getDisplayName(), event.getMessage())); + synchronized (listeners) { - message = listener.modifyMessage(event, onlinePlayer, message); + for (Map.Entry listener : listeners.entrySet()) + { + try + { + message = listener.getValue().modifyMessage(event, onlinePlayer, message); + } + catch (Throwable t) + { + if (ess.getSettings().isDebug()) + { + logger.log(Level.WARNING, "Error with EssentialsChat listener of " + listener.getKey() + ": " + t.getMessage(), t); + } + else + { + logger.log(Level.WARNING, "Error with EssentialsChat listener of " + listener.getKey() + ": " + t.getMessage()); + } + } + } } onlineUser.sendMessage(message); } diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerHighest.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerHighest.java index e8f785228b..9af8cf593e 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerHighest.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerHighest.java @@ -5,7 +5,7 @@ import org.bukkit.Server; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; public class EssentialsChatPlayerListenerHighest extends EssentialsChatPlayer @@ -13,17 +13,17 @@ public class EssentialsChatPlayerListenerHighest extends EssentialsChatPlayer public EssentialsChatPlayerListenerHighest(final Server server, final IEssentials ess, final Map listeners, - final Map chatStorage) + final Map chatStorage) { super(server, ess, listeners, chatStorage); } @EventHandler(priority = EventPriority.HIGHEST) @Override - public void onPlayerChat(final PlayerChatEvent event) + public void onPlayerChat(final AsyncPlayerChatEvent event) { final ChatStore chatStore = delChatStore(event); - if (isAborted(event)) + if (isAborted(event) || chatStore == null) { return; } diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java index 599c39dda0..e8fee2fbba 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java @@ -3,12 +3,13 @@ import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; import com.earth2me.essentials.Util; +import java.text.MessageFormat; import java.util.Locale; import java.util.Map; import org.bukkit.Server; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; public class EssentialsChatPlayerListenerLowest extends EssentialsChatPlayer @@ -16,14 +17,14 @@ public class EssentialsChatPlayerListenerLowest extends EssentialsChatPlayer public EssentialsChatPlayerListenerLowest(final Server server, final IEssentials ess, final Map listeners, - final Map chatStorage) + final Map chatStorage) { super(server, ess, listeners, chatStorage); } @EventHandler(priority = EventPriority.LOWEST) @Override - public void onPlayerChat(final PlayerChatEvent event) + public void onPlayerChat(final AsyncPlayerChatEvent event) { if (isAborted(event)) { @@ -31,6 +32,12 @@ public void onPlayerChat(final PlayerChatEvent event) } final User user = ess.getUser(event.getPlayer()); + + if (user == null) { + event.setCancelled(true); + return; + } + final ChatStore chatStore = new ChatStore(ess, user, getChatType(event.getMessage())); setChatStore(event, chatStore); @@ -40,9 +47,13 @@ public void onPlayerChat(final PlayerChatEvent event) event.setMessage(Util.formatMessage(user, "essentials.chat", event.getMessage())); String group = user.getGroup(); String world = user.getWorld().getName(); - event.setFormat(ess.getSettings().getChatFormat(group).format(new Object[] - { - group, world, world.substring(0, 1).toUpperCase(Locale.ENGLISH) - })); + MessageFormat format = ess.getSettings().getChatFormat(group); + synchronized (format) + { + event.setFormat(format.format(new Object[] + { + group, world, world.substring(0, 1).toUpperCase(Locale.ENGLISH) + })); + } } } diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java index fdaccdc8d9..9105183026 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java @@ -8,7 +8,7 @@ import org.bukkit.Server; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer @@ -16,14 +16,14 @@ public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer public EssentialsChatPlayerListenerNormal(final Server server, final IEssentials ess, final Map listeners, - final Map chatStorage) + final Map chatStorage) { super(server, ess, listeners, chatStorage); } @EventHandler(priority = EventPriority.NORMAL) @Override - public void onPlayerChat(final PlayerChatEvent event) + public void onPlayerChat(final AsyncPlayerChatEvent event) { if (isAborted(event)) { diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/IEssentialsChatListener.java b/EssentialsChat/src/com/earth2me/essentials/chat/IEssentialsChatListener.java index 5c9c5c2191..abf5893ea5 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/IEssentialsChatListener.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/IEssentialsChatListener.java @@ -1,12 +1,12 @@ package com.earth2me.essentials.chat; import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; public interface IEssentialsChatListener { - boolean shouldHandleThisChat(PlayerChatEvent event); + boolean shouldHandleThisChat(AsyncPlayerChatEvent event); - String modifyMessage(PlayerChatEvent event, Player target, String message); + String modifyMessage(AsyncPlayerChatEvent event, Player target, String message); } diff --git a/EssentialsGeoIP/nbproject/build-impl.xml b/EssentialsGeoIP/nbproject/build-impl.xml index 4b4feb8d8f..13f9bde1fa 100644 --- a/EssentialsGeoIP/nbproject/build-impl.xml +++ b/EssentialsGeoIP/nbproject/build-impl.xml @@ -12,9 +12,9 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup @@ -181,6 +181,7 @@ is divided into following sections: + @@ -225,6 +226,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -357,11 +379,52 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -370,32 +433,270 @@ is divided into following sections: - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -427,10 +728,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -488,6 +792,7 @@ is divided into following sections: + @@ -504,6 +809,7 @@ is divided into following sections: + @@ -511,6 +817,7 @@ is divided into following sections: + @@ -537,6 +844,9 @@ is divided into following sections: + + + @@ -582,7 +892,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -813,8 +1127,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -822,12 +1137,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -839,12 +1150,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -866,6 +1173,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -952,14 +1295,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -972,39 +1315,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1076,9 +1420,12 @@ is divided into following sections: - - - + + + + + + diff --git a/EssentialsGeoIP/nbproject/genfiles.properties b/EssentialsGeoIP/nbproject/genfiles.properties index 59191ffdee..2aab272022 100644 --- a/EssentialsGeoIP/nbproject/genfiles.properties +++ b/EssentialsGeoIP/nbproject/genfiles.properties @@ -4,5 +4,5 @@ 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=cbf94f59 -nbproject/build-impl.xml.script.CRC32=db2bb7a7 -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 +nbproject/build-impl.xml.script.CRC32=af872325 +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java b/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java index 0018d09b40..31324a8416 100644 --- a/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java +++ b/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java @@ -42,14 +42,26 @@ public EssentialsGeoIPPlayerListener(File dataFolder, IEssentials ess) } @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerJoin(PlayerJoinEvent event) + public void onPlayerJoin(final PlayerJoinEvent event) { - User u = ess.getUser(event.getPlayer()); - if (u.isAuthorized("essentials.geoip.hide")) + ess.runTaskAsynchronously(new Runnable() + { + @Override + public void run() + { + delayedJoin(event.getPlayer()); + } + }); + } + + public void delayedJoin(Player player) + { + User u = ess.getUser(player); + if (u.isAuthorized("essentials.geoip.hide") || player.getAddress() == null) { return; } - InetAddress address = event.getPlayer().getAddress().getAddress(); + InetAddress address = player.getAddress().getAddress(); StringBuilder sb = new StringBuilder(); if (config.getBoolean("database.show-cities", false)) { @@ -79,9 +91,9 @@ public void onPlayerJoin(PlayerJoinEvent event) } if (config.getBoolean("show-on-login", true) && !u.isHidden()) { - for (Player player : event.getPlayer().getServer().getOnlinePlayers()) + for (Player onlinePlayer : player.getServer().getOnlinePlayers()) { - User user = ess.getUser(player); + User user = ess.getUser(onlinePlayer); if (user.isAuthorized("essentials.geoip.show")) { user.sendMessage(_("geoipJoinFormat", u.getDisplayName(), sb.toString())); diff --git a/EssentialsGroupBridge/.classpath b/EssentialsGroupBridge/.classpath deleted file mode 100644 index ebd606dcac..0000000000 --- a/EssentialsGroupBridge/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/EssentialsGroupBridge/.project b/EssentialsGroupBridge/.project deleted file mode 100644 index 2ea0b05e12..0000000000 --- a/EssentialsGroupBridge/.project +++ /dev/null @@ -1,27 +0,0 @@ - - - EssentialsGroupBridge - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.ui.externaltools.ExternalToolBuilder - full,incremental, - - - LaunchConfigHandle - <project>/.externalToolBuilders/GroupBridge.launch - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/EssentialsGroupBridge/build.xml b/EssentialsGroupBridge/build.xml deleted file mode 100644 index cf379e9c7d..0000000000 --- a/EssentialsGroupBridge/build.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - Builds, tests, and runs the project EssentialsGroupBridge. - - - diff --git a/EssentialsGroupBridge/nbproject/build-impl.xml b/EssentialsGroupBridge/nbproject/build-impl.xml deleted file mode 100644 index 97400aa029..0000000000 --- a/EssentialsGroupBridge/nbproject/build-impl.xml +++ /dev/null @@ -1,1067 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set JVM to use for profiling in profiler.info.jvm - Must set profiler agent JVM arguments in profiler.info.jvmargs.agent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - - - - - - - - Must select one file in the IDE or set profile.class - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/EssentialsGroupBridge/nbproject/genfiles.properties b/EssentialsGroupBridge/nbproject/genfiles.properties deleted file mode 100644 index d862c9b422..0000000000 --- a/EssentialsGroupBridge/nbproject/genfiles.properties +++ /dev/null @@ -1,8 +0,0 @@ -build.xml.data.CRC32=475c8f4d -build.xml.script.CRC32=674d9b15 -build.xml.stylesheet.CRC32=28e38971@1.38.2.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=475c8f4d -nbproject/build-impl.xml.script.CRC32=c7581402 -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 diff --git a/EssentialsGroupBridge/nbproject/project.properties b/EssentialsGroupBridge/nbproject/project.properties deleted file mode 100644 index b114e24e39..0000000000 --- a/EssentialsGroupBridge/nbproject/project.properties +++ /dev/null @@ -1,101 +0,0 @@ -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=EssentialsGroupBridge -application.vendor=gabrielcouto -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.expand-tabs=true -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.spaces-per-tab=4 -auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.tab-size=4 -auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.text-limit-width=120 -auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.text-line-wrap=none -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}/EssentialsGroupBridge.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.EssentialsGroupManager.jar}:\ - ${file.reference.bukkit.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=true -platform.active=default_platform -project.EssentialsGroupManager=../EssentialsGroupManager -reference.EssentialsGroupManager.jar=${project.EssentialsGroupManager}/dist/EssentialsGroupManager.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 diff --git a/EssentialsGroupBridge/src/com/nijiko/permissions/Entry.java b/EssentialsGroupBridge/src/com/nijiko/permissions/Entry.java deleted file mode 100644 index 913c7f51ed..0000000000 --- a/EssentialsGroupBridge/src/com/nijiko/permissions/Entry.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.nijiko.permissions; - -public class Entry { - -} diff --git a/EssentialsGroupBridge/src/com/nijiko/permissions/Group.java b/EssentialsGroupBridge/src/com/nijiko/permissions/Group.java deleted file mode 100644 index 0d070c2075..0000000000 --- a/EssentialsGroupBridge/src/com/nijiko/permissions/Group.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.nijiko.permissions; - -public class Group extends Entry { - - -} \ No newline at end of file diff --git a/EssentialsGroupBridge/src/com/nijiko/permissions/PermissionHandler.java b/EssentialsGroupBridge/src/com/nijiko/permissions/PermissionHandler.java deleted file mode 100644 index 3b7181d03d..0000000000 --- a/EssentialsGroupBridge/src/com/nijiko/permissions/PermissionHandler.java +++ /dev/null @@ -1,458 +0,0 @@ -package com.nijiko.permissions; - -import java.util.Collection; -import java.util.Comparator; -import java.util.Map; -import java.util.Set; - -import org.bukkit.entity.Player; - -/** - * Permissions 3.0 - * Copyright (C) 2011 Matt 'The Yeti' Burnett - * Original Credit & Copyright (C) 2010 Nijikokun - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Permissions Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Permissions Public License for more details. - * - * You should have received a copy of the GNU Permissions Public License - * along with this program. If not, see . - */ - -public abstract class PermissionHandler { - //World config manipulation methods - - /** - * Sets the default world that is loaded on startup. - * @param world World to load on startup - */ - public abstract void setDefaultWorld(String world); - /** - * Check if world is loaded. - * A world is considered as loaded if there exists a user/group storage for it or it mirrors another world. - * @param world Target world - * @return Whether the world is loaded. - */ - public abstract boolean checkWorld(String world); - - /** - * Attempts to load a world. If the world is already loaded, nothing happens. - * @param world World to load - * @return Whether world isn't already loaded - * @throws Exception Any exception that may occur when loading the world. - */ - public abstract boolean loadWorld(String world) throws Exception; - /** - * Forces a load of the world. - * @param world World to load - * @throws Exception Any exception that may occur when loading the world. - */ - public abstract void forceLoadWorld(String world) throws Exception; - /** - * Returns a set of the names all loaded worlds. - * A world is considered as loaded if there exists a user/group storage for it or it mirrors another world. - * @return Set of the names all loaded worlds. - */ - public abstract Set getWorlds(); - /** - * Loads the default world and global permissions. - * @throws Exception Any exception that may occur when loading the worlds. - */ - public abstract void load() throws Exception; - /** - * Reloads all worlds - */ - public abstract void reload(); - /** - * Reloads the specified world - * @param world Name of target world - * @return False if world is not loaded, true otherwise - */ - public abstract boolean reload(String world); - /** - * Forces all storages to save, - */ - public abstract void saveAll(); - /** - * This method forces a save of the specified world - * @param world Name of target world - */ - public abstract void save(String world); - /** - * Forces all storages to close. - */ - public abstract void closeAll(); - - //Permission-checking methods - /** - * This is an alias for permission(Player, String). - * @param player Target player - * @param node Permission node - * @return True if the player has the specified node, false otherwise - */ - public abstract boolean has(Player player, String node); - /** - * This is an alias for permission(String, String, String). - * @param worldName Target world (may be different from player's current world) - * @param playerName Player's name - * @param node Permission node - * @return True if the player has the specified node, false otherwise - */ - public abstract boolean has(String worldName, String playerName, String node); - /** - * This method checks if the player has the given permissions in his/her current world. - * In other words, this calls permissions(player.getWorld().getName(), player.getName(), node). - * @param player Target player - * @param node Permission node - * @return True if the player has the specified node, false otherwise - */ - public abstract boolean permission(Player player, String node); - /** - * This method checks if the player has the given permissions in the given world. - * @param worldName Target world (may be different from player's current world) - * @param playerName Player's name - * @param node Permission node - * @return True if the player has the specified node, false otherwise - */ - public abstract boolean permission(String worldName, String playerName, String node); - - //Permission-manipulation methods - /** - * Adds the given permission to the targeted player. - * @param world Target world (may be different from player's current world) - * @param user Player's name - * @param node Permission node - */ - public abstract void addUserPermission(String world, String user, String node); - /** - * Removes the given permission from the targeted player. - * @param world Target world (may be different from player's current world) - * @param user Player's name - * @param node Permission node - */ - public abstract void removeUserPermission(String world, String user, String node); - /** - * Adds the given permission to the targeted group. - * @param world Target world - * @param user Group's name - * @param node Permission node - */ - public abstract void addGroupPermission(String world, String user, String node); - /** - * Removes the given permission from the targeted group. - * @param world Target world - * @param user Group's name - * @param node Permission node - */ - public abstract void removeGroupPermission(String world, String user, String node); - - //Chat, prefix, suffix, build methods - /** - * Retrieves the properly-capitalised version of the given group's name. - * Returns an empty string if group does not exist. - * @param world Group's world - * @param group Group's name (any capitalisation) - * @return Group's properly-capitalised name. - */ - public abstract String getGroupProperName(String world, String group); - /** - * Gets the appropriate prefix for the user. - * This method is a utility method for chat plugins to get the user's prefix - * without having to look at every one of the user's ancestors. - * Returns an empty string if user has no parent groups. - * @param world Player's world - * @param user Player's name - * @return Player's prefix - */ - public abstract String getUserPrefix(String world, String user); - /** - * Gets the appropriate suffix for the user. - * This method is a utility method for chat plugins to get the user's suffix - * without having to look at every one of the user's ancestors. - * Returns an empty string if user has no parent groups. - * @param world Player's world - * @param user Player's name - * @return Player's suffix - */ - public abstract String getUserSuffix(String world, String user); - /** - * Gets the primary group of the user. - * Returns the default group if user has no parent groups, - * or null if there is no default group for that world. - * @param world Player's world - * @param user Player's name - * @return Player's primary group - */ - public abstract Group getPrimaryGroupObject(String world, String user); - /** - * Gets name of the primary group of the user. - * Returns the name of the default group if user has no parent groups, - * or "Default" if there is no default group for that world. - * @param world Player's world - * @param user Player's name - * @return Name of player's primary group - */ - public abstract String getPrimaryGroup(String world, String user); - /** - * Check if user can build. - * @param world Player's world - * @param user Player's name - * @return Whether the user can build - */ - public abstract boolean canUserBuild(String world, String user); - - /** - * Retrieves group's raw prefix, inheritance not included. - * Will return an empty string if no prefix is defined for the group. - * @param world Group's world - * @param group Group's name - * @return The prefix defined for the group, empty string if prefix is not defined. - */ - public abstract String getGroupRawPrefix(String world, String group); - /** - * Retrieves group's raw suffix, inheritance not included. - * Will return an empty string if no suffix is defined for the group. - * @param world Group's world - * @param group Group's name - * @return The suffix defined for the group, empty string if suffix is not defined. - */ - public abstract String getGroupRawSuffix(String world, String group); - /** - * Retrieves group's build setting, inheritance not included. - * @param world Group's world - * @param group Group's name - * @return Returns group's build setting. - */ - public abstract boolean canGroupRawBuild(String world, String group); - - //Entry methods - /** - * Returns the user object defined by the given world and name. - * This method attempts to create the object if it does not exist. - * @param world User's world - * @param name User's name - * @return User object - * @throws Exception An exception when creating the user object - */ - public abstract User safeGetUser(String world, String name) throws Exception; - /** - * Returns the group object defined by the given world and name. - * This method attempts to create the object if it does not exist. - * @param world Group's world - * @param name Group's name - * @return Group object - * @throws Exception An exception when creating the group object - */ - public abstract Group safeGetGroup(String world, String name) throws Exception; - /** - * Returns the user object defined by the given world and name. - * This method will return null if the object does not exist. - * @param world User's world - * @param name User's name - * @return User object, or null if it doesn't exist - */ - public abstract User getUserObject(String world, String name); - /** - * Returns the group object defined by the given world and name. - * This method will return null if the object does not exist. - * @param world Group's world - * @param name Group's name - * @return Group object, or null if it doesn't exist - */ - public abstract Group getGroupObject(String world, String name); - - /** - * Returns the group object representing the default group of the given world. - * This method will return null if the object does not exist or the world has no default group. - * @param world Target world - * @return Group object representing default world, or null if it doesn't exist or is not defined. - */ - public abstract Group getDefaultGroup(String world); - /** - * Returns all the user objects in the world. - * Will return null if world does not exist. - * @param world Target world - * @return Collection of all user objects belonging to the world. - */ - public abstract Collection getUsers(String world); - /** - * Returns all the group objects in the world. - * Will return null if world does not exist. - * @param world Target world - * @return Collection of all group objects belonging to the world. - */ - public abstract Collection getGroups(String world); - - //Parent-related methods - public abstract Set getTracks(String world); - /** - * Checks if user is in specified group. Includes inherited groups. - * @param world World of both the user and the group - * @param user User's name - * @param group Parent group's name - * @return Whether user is a child of the specified group - */ - public abstract boolean inGroup(String world, String user, String group); - /** - * Checks if user is in specified group. Includes inherited groups. - * @param world User's world - * @param user User's name - * @param groupWorld Parent group's world - * @param group Parent group's name - * @return Whether user is a child of the specified group - */ - public abstract boolean inGroup(String world, String user, String groupWorld, String group); - /** - * Checks if user is in specified group, not counting inherited parents. - * @param world World of both the user and the group - * @param user User's name - * @param group Parent group's name - * @return Whether user is a child of the specified group - */ - public abstract boolean inSingleGroup(String world, String user, String group); - /** - * Checks if user is in specified group, not counting inherited parents. - * @param world User's world - * @param user User's name - * @param groupWorld Parent group's world - * @param group Parent group's name - * @return Whether user is a child of the specified group - */ - public abstract boolean inSingleGroup(String world, String user, String groupWorld, String group); - /** - * Gets a array of the names of all parent groups in the same world. - * @param world Target user's world - * @param name Target user's name - * @return An array containing the names of all parent groups (including ancestors) that are in the same world - */ - public abstract String[] getGroups(String world, String name); - /** - * Gets a map of world name to all parent groups of the target user in that world. - * @param world Target user's world - * @param name Target user's name - * @return Map of world name to set of groups that the user inherits from in the world. - */ - public abstract Map> getAllGroups(String world, String name); - - //Weight-related methods - /** - * Compare the weights of two users. - * This method is for plugin devs to compare whether a user can do an action to another user. - * For example, SlapPlugin can compare the weights of two users when one of them wants to /slap the other. - * It can decide whether to allow the slap using the result of this function. - * @param firstWorld First user's world - * @param first First user's name - * @param secondWorld Second user's world - * @param second Second user's name - * @return -1 if firstWeight < secondWeight, 0 if firstWeight == secondWeight, 1 if firstWeight > secondWeight - */ - public abstract int compareWeights(String firstWorld, String first, String secondWorld, String second); - /** - * Alias for compareWeights(world, first, world, second). - * @param world World - * @param first First user's name - * @param second Second user's name - * @return -1 if firstWeight < secondWeight, 0 if firstWeight == secondWeight, 1 if firstWeight > secondWeight - */ - public abstract int compareWeights(String world, String first, String second); - - //Data-related methods - public abstract String getRawInfoString(String world, String entryName, String path,boolean isGroup); - - public abstract Integer getRawInfoInteger(String world, String entryName, String path, boolean isGroup); - - public abstract Double getRawInfoDouble(String world, String entryName, String path, boolean isGroup); - - public abstract Boolean getRawInfoBoolean(String world, String entryName, String path, boolean isGroup); - - - public abstract String getInfoString(String world, String entryName, String path,boolean isGroup); - public abstract String getInfoString(String world, String entryName, String path, boolean isGroup, Comparator comparator); - - public abstract Integer getInfoInteger(String world, String entryName, String path, boolean isGroup); - public abstract Integer getInfoInteger(String world, String entryName, String path, boolean isGroup, Comparator comparator); - - public abstract Double getInfoDouble(String world, String entryName, String path, boolean isGroup); - public abstract Double getInfoDouble(String world, String entryName, String path, boolean isGroup, Comparator comparator); - - public abstract Boolean getInfoBoolean(String world, String entryName, String path, boolean isGroup); - public abstract Boolean getInfoBoolean(String world, String entryName, String path, boolean isGroup, Comparator comparator); - - - public abstract void addUserInfo(String world, String name, String path, Object data); - public abstract void removeUserInfo(String world, String name, String path); - public abstract void addGroupInfo(String world, String name, String path, Object data); - public abstract void removeGroupInfo(String world, String name, String path); - - //Legacy methods - @Deprecated - public abstract String getGroupPermissionString(String world, String group, String path); - @Deprecated - public abstract int getGroupPermissionInteger(String world, String group, String path); - @Deprecated - public abstract boolean getGroupPermissionBoolean(String world, String group, String path); - @Deprecated - public abstract double getGroupPermissionDouble(String world, String group, String path); - - @Deprecated - public abstract String getUserPermissionString(String world, String group, String path); - @Deprecated - public abstract int getUserPermissionInteger(String world, String group, String path); - @Deprecated - public abstract boolean getUserPermissionBoolean(String world, String group, String path); - @Deprecated - public abstract double getUserPermissionDouble(String world, String group, String path); - - @Deprecated - public abstract String getPermissionString(String world, String group, String path); - @Deprecated - public abstract int getPermissionInteger(String world, String group, String path); - @Deprecated - public abstract boolean getPermissionBoolean(String world, String group, String path); - @Deprecated - public abstract double getPermissionDouble(String world, String group, String path); - - - @Deprecated - public abstract String getGroup(String world, String group); - - @Deprecated - public abstract String getGroupPrefix(String world, String group); - @Deprecated - public abstract String getGroupSuffix(String world, String group); - @Deprecated - public abstract boolean canGroupBuild(String world, String group); - - //Cache methods are no longer available -// @Deprecated -// public void setCache(String world, Map Cache) { -// } -// @Deprecated -// public void setCacheItem(String world, String player, String permission, boolean data){ -// } -// @Deprecated -// public Map getCache(String world){ -// return null; -// } -// @Deprecated -// public boolean getCacheItem(String world, String player, String permission){ -// return false; -// } -// @Deprecated -// public void removeCachedItem(String world, String player, String permission){ -// } -// @Deprecated -// public void clearCache(String world){ -// } -// @Deprecated -// public void clearAllCache(){ -// } - -} \ No newline at end of file diff --git a/EssentialsGroupBridge/src/com/nijiko/permissions/User.java b/EssentialsGroupBridge/src/com/nijiko/permissions/User.java deleted file mode 100644 index 9e93d850af..0000000000 --- a/EssentialsGroupBridge/src/com/nijiko/permissions/User.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.nijiko.permissions; - -public class User extends Entry { - -} diff --git a/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/OverrideListener.java b/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/OverrideListener.java deleted file mode 100644 index 762e42b496..0000000000 --- a/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/OverrideListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.nijikokun.bukkit.Permissions; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.server.PluginEnableEvent; -import org.bukkit.event.Listener; - - - -public class OverrideListener implements Listener { - - Permissions permClass; - - OverrideListener(Permissions instance) { - this.permClass = instance; - } - - @EventHandler(priority = EventPriority.NORMAL) - public void onPluginEnable(PluginEnableEvent event) { - if (event.getPlugin().getDescription().getName().equals("GroupManager")) { - permClass.setGM(event.getPlugin()); - } - } - -} \ No newline at end of file diff --git a/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/Permissions.java b/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/Permissions.java deleted file mode 100644 index 99fd18ce8e..0000000000 --- a/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/Permissions.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.nijikokun.bukkit.Permissions; - -import com.nijiko.permissions.PermissionHandler; -import java.util.logging.Logger; -//import org.anjocaido.groupmanager.GroupManager; -import org.anjocaido.groupmanager.permissions.NijikoPermissionsProxy; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.plugin.java.JavaPlugin; - -public class Permissions extends JavaPlugin { - - public static final Logger log = Logger.getLogger("Fake Permissions"); - public static String name = "Permissions"; - public static String codename = "Hacked Permissions by AnjoCaido"; - public static String version = "2.0"; - public static PermissionHandler Security = null; - - @Override - public void onDisable() { - PluginDescriptionFile pdfFile = this.getDescription(); - System.out.println("Fake " + pdfFile.getName() + " version " + pdfFile.getVersion() + " is disabled!"); - } - - @Override - public void onEnable() { - PluginDescriptionFile pdfFile = this.getDescription(); - - if (Security == null) { - //make sure we have only one instance - Security = new NijikoPermissionsProxy(null); - } - - Plugin p = (this.getServer() == null) ? null : this.getServer().getPluginManager().getPlugin("GroupManager"); - if (p != null) { - if (p.isEnabled()) { - setGM(p); - } else { - if (this.getServer() != null) { - this.getServer().getPluginManager().registerEvents(new OverrideListener(this), this); - } - } - } else { - System.err.println("OOOPS! Fake " + pdfFile.getName() + " version " + pdfFile.getVersion() + " couldn't find GroupManager!"); - this.getPluginLoader().disablePlugin(this); - } - - if (pdfFile != null) { - System.out.println("Fake " + pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!"); - } - } - - public void setGM(final Plugin p) { - //GroupManager groupManager = (GroupManager) p; - ((NijikoPermissionsProxy) Security).setGM(p); - } - - public PermissionHandler getHandler() { - if (Security == null) { - Security = new NijikoPermissionsProxy(null); - } - return Security; - } - - public void setupPermissions() { - if (Security == null) { - Security = new NijikoPermissionsProxy(null); - } - } - - - -} - - diff --git a/EssentialsGroupBridge/src/org/anjocaido/groupmanager/permissions/NijikoPermissionsProxy.java b/EssentialsGroupBridge/src/org/anjocaido/groupmanager/permissions/NijikoPermissionsProxy.java deleted file mode 100644 index da40fc1729..0000000000 --- a/EssentialsGroupBridge/src/org/anjocaido/groupmanager/permissions/NijikoPermissionsProxy.java +++ /dev/null @@ -1,588 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package org.anjocaido.groupmanager.permissions; - -import com.nijiko.permissions.Group; -import com.nijiko.permissions.PermissionHandler; -import com.nijiko.permissions.User; - -import java.io.File; -import java.util.Collection; -import java.util.Comparator; -import java.util.Map; -import java.util.Set; - -import org.anjocaido.groupmanager.GroupManager; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -/** - * Everything here maintains the model created by Nijikokun - * - * But implemented to use GroupManager system. Which provides instant changes, - * without file access. - * - * @author gabrielcouto - */ -public class NijikoPermissionsProxy extends PermissionHandler { - - GroupManager plugin; - - public NijikoPermissionsProxy(GroupManager plugin) { - super(); - this.plugin = plugin; - } - - @Override - public void addGroupPermission(String world, String group, String node) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void removeGroupPermission(String world, String group, String node) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void addGroupInfo(String world, String group, String node, Object data) { - plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().addGroupInfo(group, node, data); - } - - @Override - public void removeGroupInfo(String world, String group, String node) { - plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().removeGroupInfo(group, node); - } - - @Override - public void addUserPermission(String world, String user, String node) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void removeUserPermission(String world, String user, String node) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void addUserInfo(String world, String user, String node, Object data) { - plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().addUserInfo(user, node, data); - } - - @Override - public void removeUserInfo(String world, String user, String node) { - plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().removeUserInfo(user, node); - } - - @Deprecated - public void removeUserInfo(String user, String node) { - plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().removeUserInfo(user, node); - } - - @Deprecated - public void addGroupPermission(String group, String node) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Deprecated - public void removeGroupPermission(String group, String node) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Deprecated - public void addGroupInfo(String group, String node, Object data) { - plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().addGroupInfo(group, node, data); - } - - @Deprecated - public void removeGroupInfo(String group, String node) { - plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().removeGroupInfo(group, node); - } - - @Deprecated - public void addUserPermission(String user, String node) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Deprecated - public void removeUserPermission(String user, String node) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Deprecated - public void addUserInfo(String user, String node, Object data) { - plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().addUserInfo(user, node, data); - } - - @Override - public void setDefaultWorld(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Deprecated - public void setDirectory(File directory) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean loadWorld(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void forceLoadWorld(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean checkWorld(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void load() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void reload() { - plugin.getWorldsHolder().reloadAll(); - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean reload(String world) { - plugin.getWorldsHolder().reloadWorld(world); - return true; - } - - @Override - public boolean has(Player player, String permission) { - //throw new UnsupportedOperationException("Not supported yet."); - return permission(player, permission); - } - - @Override - public boolean permission(Player player, String permission) { - //throw new UnsupportedOperationException("Not supported yet."); - if (permission == null || permission.equals("")) { - return false; - } - if (player == null) { - GroupManager.logger.severe("A plugin is asking permission '" + permission + "' for a null player... Which plugin does that? Bastards!"); - return false; - } - if (player.getWorld() == null) { - GroupManager.logger.warning("The player " + player.getName() + " has a null world? Treating as default world!"); - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().has(player, permission); - } - return plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getPermissionsHandler().has(player, permission); - } - - @Override - public String getGroupRawPrefix(String world, String group) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPrefix(group); - } - - @Override - public String getGroupRawSuffix(String world, String group) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupSuffix(group); - } - - @Override - public String getUserPrefix(String world, String user) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPrefix(user); - } - - @Override - public String getUserSuffix(String world, String user) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserSuffix(user); - } - - @Override - public String getGroup(String world, String user) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroup(user); - } - - @Override - public String getPrimaryGroup(String world, String user) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroup(user); - } - - @Override - public boolean canUserBuild(String world, String user) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().canUserBuild(user); - } - - @Deprecated - public String getGroup(String name) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroup(name); - } - - @Override - public String[] getGroups(String world, String name) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroups(name); - } - - @Override - public boolean inGroup(String world, String name, String group) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().inGroup(name, group); - } - - @Deprecated - public boolean inGroup(String name, String group) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().inGroup(name, group); - } - - @Override - public String getGroupPrefix(String world, String group) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPrefix(group); - } - - @Deprecated - public String getGroupPrefix(String group) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPrefix(group); - } - - @Override - public String getGroupSuffix(String world, String group) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupSuffix(group); - } - - @Deprecated - public String getGroupSuffix(String group) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupSuffix(group); - } - - @Override - public boolean canGroupBuild(String world, String group) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().canGroupBuild(group); - } - - @Deprecated - public boolean canGroupBuild(String group) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().canGroupBuild(group); - } - - @Override - public String getGroupPermissionString(String world, String group, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPermissionString(group, permission); - } - - @Deprecated - public String getGroupPermissionString(String group, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPermissionString(group, permission); - } - - @Override - public int getGroupPermissionInteger(String world, String group, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPermissionInteger(group, permission); - } - - @Deprecated - public int getGroupPermissionInteger(String group, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPermissionInteger(group, permission); - } - - @Override - public boolean getGroupPermissionBoolean(String world, String group, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPermissionBoolean(group, permission); - } - - @Deprecated - public boolean getGroupPermissionBoolean(String group, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPermissionBoolean(group, permission); - } - - @Override - public double getGroupPermissionDouble(String world, String group, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPermissionDouble(group, permission); - } - - @Deprecated - public double getGroupPermissionDouble(String group, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPermissionDouble(group, permission); - } - - @Override - public String getUserPermissionString(String world, String name, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPermissionString(name, permission); - } - - @Deprecated - public String getUserPermissionString(String name, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getUserPermissionString(name, permission); - } - - @Override - public int getUserPermissionInteger(String world, String name, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPermissionInteger(name, permission); - } - - @Deprecated - public int getUserPermissionInteger(String name, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getUserPermissionInteger(name, permission); - } - - @Override - public boolean getUserPermissionBoolean(String world, String name, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPermissionBoolean(name, permission); - } - - @Deprecated - public boolean getUserPermissionBoolean(String name, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getUserPermissionBoolean(name, permission); - } - - @Override - public double getUserPermissionDouble(String world, String name, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPermissionDouble(name, permission); - } - - @Deprecated - public double getUserPermissionDouble(String name, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getUserPermissionDouble(name, permission); - } - - @Override - public String getPermissionString(String world, String name, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getPermissionString(name, permission); - } - - @Deprecated - public String getPermissionString(String name, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getPermissionString(name, permission); - } - - @Override - public int getPermissionInteger(String world, String name, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getPermissionInteger(name, permission); - } - - @Deprecated - public int getPermissionInteger(String name, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getPermissionInteger(name, permission); - } - - @Override - public boolean getPermissionBoolean(String world, String name, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getPermissionBoolean(name, permission); - } - - @Deprecated - public boolean getPermissionBoolean(String name, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getPermissionBoolean(name, permission); - } - - @Override - public double getPermissionDouble(String world, String name, String permission) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getPermissionDouble(name, permission); - } - - @Deprecated - public double getPermissionDouble(String name, String permission) { - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getPermissionDouble(name, permission); - } - - public void setGM(Plugin p) { - this.plugin = (GroupManager) p; - } - - @Override - public boolean canGroupRawBuild(String world, String group) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().canGroupBuild(group); - } - - @Override - public void closeAll() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int compareWeights(String firstWorld, String first, String secondWorld, String second) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int compareWeights(String world, String first, String second) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Map> getAllGroups(String world, String name) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Group getDefaultGroup(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Group getGroupObject(String world, String group) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public String getGroupProperName(String world, String group) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Boolean getInfoBoolean(String world, String entryName, String path, - boolean isGroup) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getInfoBoolean(entryName, path, isGroup); - } - - @Override - public Boolean getInfoBoolean(String world, String entryName, String path, - boolean isGroup, Comparator comparator) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Double getInfoDouble(String world, String entryName, String path, boolean isGroup) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getInfoDouble(entryName, path, isGroup); - } - - @Override - public Double getInfoDouble(String world, String entryName, String path, - boolean isGroup, Comparator comparator) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Integer getInfoInteger(String world, String entryName, String path, - boolean isGroup) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getInfoInteger(entryName, path, isGroup); - } - - @Override - public Integer getInfoInteger(String world, String entryName, String path, - boolean isGroup, Comparator comparator) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public String getInfoString(String world, String entryName, String path, boolean isGroup) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getInfoString(entryName, path, isGroup); - } - - @Override - public String getInfoString(String world, String entryName, String path, - boolean isGroup, Comparator comparator) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Boolean getRawInfoBoolean(String world, String entryName, String path, - boolean isGroup) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Double getRawInfoDouble(String world, String entryName, String path, - boolean isGroup) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Integer getRawInfoInteger(String world, String entryName, String path, - boolean isGroup) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public String getRawInfoString(String world, String entryName, String path, - boolean isGroup) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Set getTracks(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public User getUserObject(String world, String name) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Collection getUsers(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Set getWorlds() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean has(String world, String playerName, String permission) { - if (permission == null || permission.isEmpty()) { - return false; - } - if (playerName == null || playerName.isEmpty()) { - GroupManager.logger.severe("A plugin is asking permission '" + permission + "' for a null player... Which plugin does that? Bastards!"); - return false; - } - if (world == null) { - GroupManager.logger.warning("The player " + playerName + " has a null world? Treating as default world!"); - return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().permission(playerName, permission); - } - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().permission(playerName, permission); - } - - @Override - public boolean inGroup(String world, String user, String groupWorld, String group) { - return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().inGroup(user, group); - } - - @Override - public boolean inSingleGroup(String world, String user, String group) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean inSingleGroup(String world, String user, String groupWorld, String group) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean permission(String world, String name, String node) { - return has(world, name, node); - } - - @Override - public Group safeGetGroup(String world, String name) throws Exception { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public User safeGetUser(String world, String name) throws Exception { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void save(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void saveAll() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Collection getGroups(String world) { - throw new UnsupportedOperationException("Not supported yet."); - } - - //@Override - public Group getPrimaryGroupObject(String arg0, String arg1) { - throw new UnsupportedOperationException("Not supported yet."); - } - -} diff --git a/EssentialsGroupBridge/src/plugin.yml b/EssentialsGroupBridge/src/plugin.yml deleted file mode 100644 index ca6e2b1dcb..0000000000 --- a/EssentialsGroupBridge/src/plugin.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: Permissions -version: 3.1.6 -main: com.nijikokun.bukkit.Permissions.Permissions -depend: [GroupManager] \ No newline at end of file diff --git a/EssentialsGroupManager/nbproject/build-impl.xml b/EssentialsGroupManager/nbproject/build-impl.xml index 8939aa2fa5..c0aa4cb1d8 100644 --- a/EssentialsGroupManager/nbproject/build-impl.xml +++ b/EssentialsGroupManager/nbproject/build-impl.xml @@ -12,9 +12,9 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup @@ -156,6 +156,7 @@ is divided into following sections: + @@ -200,6 +201,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -332,11 +354,52 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -345,32 +408,270 @@ is divided into following sections: - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -402,10 +703,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -463,6 +767,7 @@ is divided into following sections: + @@ -479,6 +784,7 @@ is divided into following sections: + @@ -486,6 +792,7 @@ is divided into following sections: + @@ -512,6 +819,9 @@ is divided into following sections: + + + @@ -557,7 +867,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -781,8 +1095,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -790,12 +1105,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -807,12 +1118,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -834,6 +1141,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -920,14 +1263,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -940,39 +1283,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1037,9 +1381,12 @@ is divided into following sections: - - - + + + + + + diff --git a/EssentialsGroupManager/nbproject/genfiles.properties b/EssentialsGroupManager/nbproject/genfiles.properties index d7341b85da..e05d95a66e 100644 --- a/EssentialsGroupManager/nbproject/genfiles.properties +++ b/EssentialsGroupManager/nbproject/genfiles.properties @@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=28e38971@1.38.2.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=a6709b83 -nbproject/build-impl.xml.script.CRC32=fe0fea25 -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 +nbproject/build-impl.xml.script.CRC32=3be9db7e +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/EssentialsGroupManager/nbproject/project.properties b/EssentialsGroupManager/nbproject/project.properties index 5b58a2c8c4..bc26273ba6 100644 --- a/EssentialsGroupManager/nbproject/project.properties +++ b/EssentialsGroupManager/nbproject/project.properties @@ -1,5 +1,6 @@ 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=EssentialsGroupManager @@ -11,7 +12,7 @@ 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.expand-tabs=true +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.indent-shift-width=4 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 @@ -39,11 +40,13 @@ dist.jar=${dist.dir}/EssentialsGroupManager.jar dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= -file.reference.craftbukkit.jar=../lib/craftbukkit.jar +file.reference.bukkit.jar=../lib/bukkit.jar includes=** +jar.archive.disabled=${jnlp.enabled} jar.compress=true +jar.index=${jnlp.enabled} javac.classpath=\ - ${file.reference.craftbukkit.jar} + ${file.reference.bukkit.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false @@ -67,6 +70,15 @@ 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 diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 4a3c232bea..f7c66782ae 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -34,10 +34,10 @@ v 1.3: (for all worlds named in config.yml) - Attempt to stop GM wiping groups/users yml's on a bad shut down. - Added event handling to manage new world creation at runtime. - - Added the ability to handle unknown worlds at server start. - (GM will create the data files for any worlds it finds which are not in the config.yml) + - Added the ability to handle unknown worlds at server start. + (GM will create the data files for any worlds it finds which are not in the config.yml) - Fix for Bukkit passing a null To location on a player Portaling - - Fixed manudelsub not correctly selecting the group to remove. + - Fixed manudelsub not correctly selecting the group to remove. - Added two new permission nodes - groupmanager.notify.self & groupmanager.notify.other These allow players/admins to be notified when players are moved between groups. v 1.4: @@ -183,4 +183,40 @@ v 2.0: - Re-initialize the WorldsHolder on a reload, as un-registering and re-registering a new holder means all plugins have to check for the new service on every quiery. - Prevent null perms getting past the GlobalGroups loader. - Fix forgetting sub groups on a manload. - - Allow 'manucheckp' to notify when superperms reports false but it is really negated. \ No newline at end of file + - Allow 'manucheckp' to notify when superperms reports false but it is really negated. + - Only output a Data update message if something has changed. + - Fix loading users with only numerals in their names to be seen as strings. + - Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). + - Throw a better error than 'null' when someone removes all groups from a yml. + - Stop force removing attachments and let Bukkit handle it's own mess. + - Change to our own Yaml parsing for globalgroups instead of using the YAMLConfiguration class in bukkit. + - Fix a cases sensitivity bug in world loading. + - Stop using the YamlConfiguration in bukkit for our config handling. We can now support periods in world names. + - Fix GlobalGroups not loading permission nodes. + - Fix an error with Logging set to 'OFF' triggering a cast exception. + - No more null errors from corrupt config.yml's. + - Give a better error when a subgroup is null. + - Include the GM version when logging errors. + - Fix Synchronization on adding subgroups (thanks snowleo). + - Remove info node support from GlobalGroups. It should not have them as GlobalGroups are only permission collections. + - Change order of data in Users.yml to [name, Group, SubGroup, Permissions, Info nodes]. + - Add alphabetically sorted user lists. + - allWorldsDataList now returns fully mirrored worlds which are not identical mirrors (fixes the /manselect list). + - Add support for Rcon. + - Prevent GM commands from being used on CommandBlocks. + - Clear our attachment map upon a manload so we correctly reconfigure a players new permissions. + - Synchronize the raising of GroupManager events to Bukkit.getServer() (should prevent deadlocks). + - Synchronize pushing to Bukkit perms to prevent any ConcurrentModificationException. + - Do not grant any permissions (nor update Bukkit) if the server is in offline mode and the player has the permission node 'groupmanager.noofflineperms'. + - Negate 'groupmanager.noofflineperms' by default in the owner group. + - Add support for BukkitForge using 'overworld' as the main world name. + - Prevent '*' permissions granting the 'groupmanager.noofflineperms' permission. + - Added '/mancheckw ' to inspect which permission files a world is referencing. + - Add config potion to set if GM commands should be allowed on CommnandBlocks. + - Catch the error when using an out of date config for 'allow_commandblocks' So it doesn't kill the whole config. + - '/manselect' will no longer list duplicate worlds. + - Added a new mirroring option in the config of 'all_unnamed_worlds'. This will cause all new or unnamed worlds to use this mirroring. + - Don't allow adding a node with '/manuaddp' and '/mangaddp' which is already negated. + - Warn when adding a node where an exception already exist. + - Only prevent adding nodes with '/manuaddp' and '/mangaddp' if they are exact matches (not wildcards). + - Store worldSelection indexed on the senders name rather than the object (fixes commandblocks using manselect). \ No newline at end of file diff --git a/EssentialsGroupManager/src/config.yml b/EssentialsGroupManager/src/config.yml index cc90bea6f8..44cfd62428 100644 --- a/EssentialsGroupManager/src/config.yml +++ b/EssentialsGroupManager/src/config.yml @@ -4,28 +4,33 @@ settings: # The user will be able to promote players to the same group or even above. opOverrides: true - # Default setting for 'mantoglevalidate' + # Default setting for 'mantogglevalidate' # true will cause GroupManager to attempt name matching by default. validate_toggle: true + # ************************************************************************************************************************************************************ + # *** NOTE: Having this feature enabled can allow improper use of Command Blocks which may lead to undesireable permission changes. You have been warned! *** + # ************************************************************************************************************************************************************ + allow_commandblocks: false data: save: - # How often GroupManager will save it's data back to groups and users.yml + # How often GroupManager will save it's data back to groups.yml and users.yml minutes: 10 # Number of hours to retain backups (plugins/GroupManager/backup) hours: 24 logging: - # level of detail GroupManager will use when logging. + # Level of detail GroupManager will use when logging. # Acceptable entries are - ALL,CONFIG,FINE,FINER,FINEST,INFO,OFF,SEVERE,WARNING level: INFO mirrors: # Worlds listed here have their settings mirrored in their children. - # The first element 'world' is the main worlds name + # The first element 'world' is the main worlds name, and is the parent world. # subsequent elements 'world_nether' and 'world_the_end' are worlds which will use # the same user/groups files as the parent. - # Each child world can be configured to mirror the 'groups', 'users' or both files from it's parent. + # the element 'all_unnamed_worlds' specifies all worlds that aren't listed, and automatically mirrors them to it's parent. + # Each child world can be configured to mirror the 'groups', 'users' or both files from its parent. world: world_nether: - users @@ -33,10 +38,13 @@ settings: world_the_end: - users - groups + all_unnamed_worlds: + - users + - groups # world2: (World2 would have it's own set of user and groups files) # world3: # - users (World3 would use the users.yml from world2, but it's own groups.yml) # world4: # - groups (World4 would use the groups.yml from world2, but it's own users.yml) # world5: - # - world6 (this would cause world6 to mirror both files from world5) \ No newline at end of file + # - world6 (this would cause world6 to mirror both files from world5) diff --git a/EssentialsGroupManager/src/globalgroups.yml b/EssentialsGroupManager/src/globalgroups.yml index 04b670ae7e..cec4d889d0 100644 --- a/EssentialsGroupManager/src/globalgroups.yml +++ b/EssentialsGroupManager/src/globalgroups.yml @@ -1,23 +1,25 @@ # These groups only contain permission nodes. # # **** You can NOT add anything other than permission nodes **** +# **** This is NOT where you set up the groups which you give to users! **** +# **** goto groupmanager/worlds/worldname/groups.yml if you want to set the actual groups! **** # # These collections are to be inherited in your different worlds groups.yml's # They can also be added as one of a users subgroups, but NOT as a primary group. # These collections are available to ALL group and user yml's. # -# Add to and customize these groups to fit yoru needs. +# Add to and customize these groups to fit your needs. groups: # Permission nodes for GroupManager # by ElgarL, snowleo, continued from gabrielcouto's original -# http://dev.bukkit.org/server-mods/essentials/ +# http://wiki.ess3.net g:groupmanager_default: permissions: - groupmanager.notify.self - + g:groupmanager_moderator: permissions: - groupmanager.listgroups @@ -28,7 +30,7 @@ groups: - groupmanager.manudel - groupmanager.manwhois - groupmanager.notify.other - + g:groupmanager_admin: permissions: - groupmanager.mantogglevalidate @@ -46,7 +48,7 @@ groups: permissions: - bukkit.broadcast.user - -bukkit.command.plugins - + g:bukkit_moderator: permissions: - bukkit.command.ban @@ -104,15 +106,20 @@ groups: - essentials.motd - essentials.rules - essentials.spawn - + - essentials.jail.allow.help + - essentials.jail.allow.helpop + - essentials.jail.allow.rules + g:essentials_builder: permissions: - essentials.afk + - essentials.afk.auto - essentials.back - essentials.back.ondeath - essentials.balance - essentials.balance.others - essentials.balancetop + - essentials.book - essentials.chat.color - essentials.chat.format - essentials.chat.shout @@ -120,12 +127,14 @@ groups: - essentials.compass - essentials.delhome - essentials.depth + - essentials.exp - essentials.getpos + - essentials.hat - essentials.home - essentials.ignore - essentials.itemdb - essentials.kit - - essentials.kit.tools + - essentials.kits.tools - essentials.mail - essentials.mail.send - essentials.me @@ -138,8 +147,10 @@ groups: - essentials.powertool - essentials.powertooltoggle - essentials.protect + - essentials.recipe - essentials.seen - essentials.sethome + - essentials.sethome.bed - essentials.sethome.multiple - essentials.signs.use.* - essentials.signs.create.disposal @@ -159,7 +170,10 @@ groups: - essentials.warp - essentials.warp.list - essentials.worth - + - essentials.jail.allow.mail + - essentials.jail.allow.ping + - essentials.jail.allow.seen + g:essentials_moderator: permissions: - -essentials.spawner.enderdragon @@ -167,17 +181,21 @@ groups: - essentials.ban - essentials.ban.notify - essentials.banip + - essentials.book.title + - essentials.book.others - essentials.broadcast - essentials.chat.url - essentials.chat.magic - essentials.clearinventory - essentials.delwarp - essentials.eco.loan + - essentials.exp.others - essentials.ext - essentials.fly + - essentials.fly.safelogin - essentials.getpos - essentials.getpos.others - - essentials.helpop.recieve + - essentials.helpop.receive - essentials.home.others - essentials.invsee - essentials.jails @@ -185,9 +203,10 @@ groups: - essentials.kick - essentials.kick.notify - essentials.kill - - essentials.kit.* + - essentials.kits.* - essentials.msg.magic - essentials.mute + - essentials.mute.notify - essentials.nick.color - essentials.nick.others - essentials.realname @@ -215,11 +234,17 @@ groups: - essentials.tptoggle - essentials.unban - essentials.unbanip + - essentials.vanish + - essentials.vanish.effect + - essentials.warps.* - essentials.weather - essentials.whois + - essentials.workbench - essentials.world - - essentials.world.* - + - essentials.worlds.* + - essentials.jail.allow.jails + - essentials.jail.allow.togglejail + g:essentials_admin: permissions: - -essentials.backup @@ -234,15 +259,10 @@ groups: g:towny_default: permissions: - - towny.chat.general - towny.chat.local g:towny_builder: permissions: - - towny.town.* - - towny.nation.* - - towny.chat.town - - towny.chat.nation - towny.wild.build.6 - towny.wild.destroy.6 - towny.wild.destroy.14 @@ -287,7 +307,7 @@ groups: - -towny.wild.destroy.119 - -towny.wild.destroy.120 - towny.chat.admin - + # Permission nodes for VanishNoPacket by mbaxter # http://dev.bukkit.org/server-mods/vanish/ @@ -306,4 +326,4 @@ groups: permissions: - vanish.silentjoin - vanish.silentquit - - vanish.silentchests + - vanish.silentchests \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java index 0832000f2a..fbf8109f6d 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java @@ -5,97 +5,203 @@ package org.anjocaido.groupmanager; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import org.anjocaido.groupmanager.utils.Tasks; -import org.bukkit.configuration.file.YamlConfiguration; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.reader.UnicodeReader; /** * * @author gabrielcouto */ public class GMConfiguration { + + private boolean allowCommandBlocks = false; + private boolean opOverride = true; + private boolean toggleValidate = true; + private Integer saveInterval = 10; + private Integer backupDuration = 24; + private String loggerLevel = "OFF"; + private Map mirrorsMap; + private GroupManager plugin; - private File configFile; - private YamlConfiguration GMconfig; + private Map GMconfig; public GMConfiguration(GroupManager plugin) { this.plugin = plugin; + + /* + * Set defaults + */ + allowCommandBlocks = false; + opOverride = true; + toggleValidate = true; + saveInterval = 10; + backupDuration = 24; + loggerLevel = "OFF"; + load(); } + @SuppressWarnings("unchecked") public void load() { if (!plugin.getDataFolder().exists()) { plugin.getDataFolder().mkdirs(); } - configFile = new File(plugin.getDataFolder(), "config.yml"); + + File configFile = new File(plugin.getDataFolder(), "config.yml"); if (!configFile.exists()) { try { Tasks.copy(plugin.getResourceAsStream("config.yml"), configFile); } catch (IOException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); + GroupManager.logger.log(Level.SEVERE, "Error creating a new config.yml", ex); } } - GMconfig = new YamlConfiguration(); + Yaml configYAML = new Yaml(new SafeConstructor()); try { - GMconfig.load(configFile); + FileInputStream configInputStream = new FileInputStream(configFile); + GMconfig = (Map) configYAML.load(new UnicodeReader(configInputStream)); + configInputStream.close(); + } catch (Exception ex) { throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex); } + /* + * Read our config settings ands store them for reading later. + */ + try { + Map config = getElement("config", getElement("settings", GMconfig)); + + try { + allowCommandBlocks = (Boolean) config.get("allow_commandblocks"); + } catch (Exception ex) { + GroupManager.logger.log(Level.SEVERE, "Missing or corrupt 'allow_commandblocks' node. Using default settings", ex); + } + + try { + opOverride = (Boolean) config.get("opOverrides"); + } catch (Exception ex) { + GroupManager.logger.log(Level.SEVERE, "Missing or corrupt 'opOverrides' node. Using default settings", ex); + } + + try { + toggleValidate = (Boolean) config.get("validate_toggle"); + } catch (Exception ex) { + GroupManager.logger.log(Level.SEVERE, "Missing or corrupt 'validate_toggle' node. Using default settings", ex); + } + + /* + * data node for save/backup timers. + */ + try { + Map save = getElement("save", getElement("data", getElement("settings", GMconfig))); + + try { + saveInterval = (Integer) save.get("minutes"); + } catch (Exception ex) { + GroupManager.logger.log(Level.SEVERE, "Missing or corrupt 'minutes' node. Using default setting", ex); + } + + try { + backupDuration = (Integer) save.get("hours"); + } catch (Exception ex) { + GroupManager.logger.log(Level.SEVERE, "Missing or corrupt 'hours' node. Using default setting", ex); + } + + } catch (Exception ex) { + GroupManager.logger.log(Level.SEVERE, "Missing or corrupt 'data' node. Using default settings", ex); + } + + + + Object level = ((Map) getElement("settings", GMconfig).get("logging")).get("level"); + if (level instanceof String) + loggerLevel = (String) level; + + /* + * Store our mirrors map for parsing later. + */ + mirrorsMap = (Map) ((Map) GMconfig.get("settings")).get("mirrors"); + + } catch (Exception ex) { + /* + * Flag the error and use defaults + */ + GroupManager.logger.log(Level.SEVERE, "There are errors in your config.yml. Using default settings", ex); + + mirrorsMap = new HashMap(); + } // Setup defaults adjustLoggerLevel(); plugin.setValidateOnlinePlayer(isToggleValidate()); } - - public boolean isOpOverride() { - - return GMconfig.getBoolean("settings.config.opOverrides", true); + + @SuppressWarnings("unchecked") + private Map getElement(String element, Map map) { + + if (!map.containsKey(element)) { + throw new IllegalArgumentException("The config.yml has no '" + element + ".\n"); + } + + return (Map) map.get(element); + } + public boolean isAllowCommandBlocks() { - public boolean isToggleValidate() { - - return GMconfig.getBoolean("settings.config.validate_toggle", true); + return allowCommandBlocks; } - public Map getMirrorsMap() { + public boolean isOpOverride() { - // Try to fetch the old mirror path first - if (GMconfig.isConfigurationSection("settings.permission.world.mirror")) { - return (Map) GMconfig.getConfigurationSection("settings.permission.world.mirror").getValues(false); - } else if (GMconfig.isConfigurationSection("settings.mirrors")) { - return (Map) GMconfig.getConfigurationSection("settings.mirrors").getValues(false); - } - return null; + return opOverride; + } + public boolean isToggleValidate() { + + return toggleValidate; } public Integer getSaveInterval() { - return GMconfig.getInt("settings.data.save.minutes", 10); + return saveInterval; } public Integer getBackupDuration() { - return GMconfig.getInt("settings.data.save.hours", 24); + return backupDuration; } public void adjustLoggerLevel() { try { - GroupManager.logger.setLevel(Level.parse(GMconfig.getString("settings.logging.level", "INFO"))); + GroupManager.logger.setLevel(Level.parse(loggerLevel)); return; } catch (Exception e) { } GroupManager.logger.setLevel(Level.INFO); } -} \ No newline at end of file + + public Map getMirrorsMap() { + + if (!mirrorsMap.isEmpty()) { + return mirrorsMap; + } + return null; + + } + +} diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java index 04d9e86be8..ea0e5bc7cd 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java @@ -1,28 +1,27 @@ package org.anjocaido.groupmanager; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; -import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.logging.Level; import org.anjocaido.groupmanager.data.Group; import org.anjocaido.groupmanager.events.GMGroupEvent; -import org.anjocaido.groupmanager.events.GroupManagerEventHandler; import org.anjocaido.groupmanager.utils.PermissionCheckResult; import org.anjocaido.groupmanager.utils.Tasks; -import org.bukkit.configuration.MemorySection; -import org.bukkit.configuration.file.YamlConfiguration; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.reader.UnicodeReader; /** * @author ElgarL @@ -31,9 +30,9 @@ public class GlobalGroups { private GroupManager plugin; - private YamlConfiguration GGroups; + //private Yaml GGroups; - private Map groups; + private final Map groups = Collections.synchronizedMap(new HashMap()); protected long timeStampGroups = 0; protected boolean haveGroupsChanged = false; @@ -53,11 +52,13 @@ public boolean haveGroupsChanged() { if (this.haveGroupsChanged) { return true; } + synchronized(groups) { for (Group g : groups.values()) { if (g.isChanged()) { return true; } } + } return false; } @@ -89,8 +90,9 @@ public void setGroupsChanged(boolean haveGroupsChanged) { @SuppressWarnings("unchecked") public void load() { - GGroups = new YamlConfiguration(); - + Yaml GGroupYAML = new Yaml(new SafeConstructor()); + Map GGroups; + GroupManager.setLoaded(false); // READ globalGroups FILE @@ -106,8 +108,13 @@ public void load() { } } + /* + * Load the YAML file. + */ try { - GGroups.load(GlobalGroupsFile); + FileInputStream groupsInputStream = new FileInputStream(GlobalGroupsFile); + GGroups = (Map) GGroupYAML.load(new UnicodeReader(groupsInputStream)); + groupsInputStream.close(); } catch (Exception ex) { throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + GlobalGroupsFile.getPath(), ex); } @@ -115,12 +122,12 @@ public void load() { // Clear out old groups resetGlobalGroups(); - if (!GGroups.getKeys(false).isEmpty()) { + if (!GGroups.keySet().isEmpty()) { // Read all global groups Map allGroups = new HashMap(); try { - allGroups = (Map) GGroups.getConfigurationSection("groups").getValues(false); + allGroups = (Map) GGroups.get("groups"); } catch (Exception ex) { // ex.printStackTrace(); throw new IllegalArgumentException("Your " + GlobalGroupsFile.getPath() + " file is invalid. See console for details.", ex); @@ -153,7 +160,11 @@ public void load() { Object element; // Permission nodes - element = GGroups.get("groups." + groupName + ".permissions"); + try { + element = ((Map)allGroups.get(groupName)).get("permissions"); + } catch ( Exception ex) { + throw new IllegalArgumentException("The GlobalGroup ' " + groupName + "' is formatted incorrectly: ", ex); + } if (element != null) if (element instanceof List) { @@ -171,18 +182,22 @@ public void load() { } else throw new IllegalArgumentException("Unknown type of permission node for global group: " + groupName); - // Info nodes - element = GGroups.get("groups." + groupName + ".info"); - - if (element != null) - if (element instanceof MemorySection) { - Map vars = new HashMap(); - for (String key : ((MemorySection) element).getKeys(false)) { - vars.put(key, ((MemorySection) element).get(key)); - } - newGroup.setVariables(vars); - } else - throw new IllegalArgumentException("Unknown type of info node for global group: " + groupName); +// // Info nodes +// try { +// element = ((Map)allGroups.get(groupName)).get("info"); +// } catch ( Exception ex) { +// throw new IllegalArgumentException("The GlobalGroup ' " + groupName + "' is formatted incorrectly: ", ex); +// } +// +// if (element != null) +// if (element instanceof MemorySection) { +// Map vars = new HashMap(); +// for (String key : ((MemorySection) element).getKeys(false)) { +// vars.put(key, ((MemorySection) element).get(key)); +// } +// newGroup.setVariables(vars); +// } else +// throw new IllegalArgumentException("Unknown type of info node for global group: " + groupName); // Push a new group addGroup(newGroup); @@ -211,6 +226,7 @@ public void writeGroups(boolean overwrite) { Map groupsMap = new HashMap(); root.put("groups", groupsMap); + synchronized(groups) { for (String groupKey : groups.keySet()) { Group group = groups.get(groupKey); @@ -218,17 +234,18 @@ public void writeGroups(boolean overwrite) { Map aGroupMap = new HashMap(); groupsMap.put(group.getName(), aGroupMap); - // Info nodes - Map infoMap = new HashMap(); - aGroupMap.put("info", infoMap); - - for (String infoKey : group.getVariables().getVarKeyList()) { - infoMap.put(infoKey, group.getVariables().getVarObject(infoKey)); - } +// // Info nodes +// Map infoMap = new HashMap(); +// aGroupMap.put("info", infoMap); +// +// for (String infoKey : group.getVariables().getVarKeyList()) { +// infoMap.put(infoKey, group.getVariables().getVarObject(infoKey)); +// } // Permission nodes aGroupMap.put("permissions", group.getPermissionList()); } + } if (!root.isEmpty()) { DumperOptions opt = new DumperOptions(); @@ -290,7 +307,7 @@ public void addGroup(Group groupToAdd) { newGroup(groupToAdd); haveGroupsChanged = true; if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED); + GroupManager.getGMEventHandler().callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED); } /** @@ -321,7 +338,7 @@ public boolean removeGroup(String groupName) { groups.remove(groupName.toLowerCase()); this.setGroupsChanged(true); if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(groupName.toLowerCase(), GMGroupEvent.Action.GROUP_REMOVED); + GroupManager.getGMEventHandler().callEvent(groupName.toLowerCase(), GMGroupEvent.Action.GROUP_REMOVED); return true; } return false; @@ -402,26 +419,26 @@ public List getGroupsPermissions(String groupName) { * * @return Set containing all group names. */ - public Set getGlobalGroups() { + /*public Set getGlobalGroups() { return groups.keySet(); - } + }*/ /** * Resets GlobalGroups. */ public void resetGlobalGroups() { - - this.groups = new HashMap(); + this.groups.clear(); } /** * * @return a collection of the groups */ - public Collection getGroupList() { - - return groups.values(); + public Group[] getGroupList() { + synchronized(groups) { + return groups.values().toArray(new Group[0]); + } } /** @@ -453,9 +470,11 @@ public File getGlobalGroupsFile() { public void removeGroupsChangedFlag() { setGroupsChanged(false); + synchronized(groups) { for (Group g : groups.values()) { g.flagAsSaved(); } + } } } \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 5f357641a0..c43c97b018 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -34,9 +34,12 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; +import org.bukkit.block.Block; +import org.bukkit.command.BlockCommandSender; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.command.RemoteConsoleCommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.ServicePriority; @@ -53,7 +56,7 @@ public class GroupManager extends JavaPlugin { private Runnable commiter; private ScheduledThreadPoolExecutor scheduler; private Map> overloadedUsers = new HashMap>(); - private Map selectedWorlds = new HashMap(); + private Map selectedWorlds = new HashMap(); private WorldsHolder worldsHolder; private boolean validateOnlinePlayer = true; @@ -63,6 +66,8 @@ public class GroupManager extends JavaPlugin { protected static GlobalGroups globalGroups; private GMLoggerHandler ch; + + private static GroupManagerEventHandler GMEventHandler; public static BukkitPermissions BukkitPermissions; private static GMWorldListener WorldEvents; public static final Logger logger = Logger.getLogger(GroupManager.class.getName()); @@ -81,7 +86,10 @@ public void onDisable() { @Override public void onEnable() { - + /* + * Initialize the event handler + */ + setGMEventHandler(new GroupManagerEventHandler(this)); onEnable(false); } @@ -134,7 +142,7 @@ public void onEnable(boolean restarting) { * reset local variables. */ overloadedUsers = new HashMap>(); - selectedWorlds = new HashMap(); + selectedWorlds = new HashMap(); lastError = ""; /* @@ -145,7 +153,7 @@ public void onEnable(boolean restarting) { ch = new GMLoggerHandler(); GroupManager.logger.addHandler(ch); } - logger.setLevel(Level.ALL); + GroupManager.logger.setLevel(Level.ALL); // Create the backup folder, if it doesn't exist. prepareFileFields(); @@ -246,7 +254,7 @@ private void saveErrorLog(Exception ex) { lastError = ex.getMessage(); GroupManager.logger.severe("==================================================="); - GroupManager.logger.severe("= ERROR REPORT START ="); + GroupManager.logger.severe("= ERROR REPORT START - " + this.getDescription().getVersion() + " ="); GroupManager.logger.severe("==================================================="); GroupManager.logger.severe("=== PLEASE COPY AND PASTE THE ERROR.LOG FROM THE =="); GroupManager.logger.severe("= GROUPMANAGER FOLDER TO AN ESSENTIALS DEVELOPER ="); @@ -258,7 +266,9 @@ private void saveErrorLog(Exception ex) { // Append this error to the error log. try { - String error = "=============================== GM ERROR LOG ===============================\n\n"; + String error = "=============================== GM ERROR LOG ===============================\n"; + error += "= ERROR REPORT START - " + this.getDescription().getVersion() + " =\n\n"; + error += Tasks.getStackTraceAsString(ex); error += "\n============================================================================\n"; @@ -324,8 +334,8 @@ public void enableScheduler() { public void run() { try { - worldsHolder.saveChanges(false); - GroupManager.logger.log(Level.INFO, " Data files refreshed."); + if (worldsHolder.saveChanges(false)) + GroupManager.logger.log(Level.INFO, " Data files refreshed."); } catch (IllegalStateException ex) { GroupManager.logger.log(Level.WARNING, ex.getMessage()); } @@ -378,13 +388,22 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, Group senderGroup = null; User senderUser = null; boolean isOpOverride = config.isOpOverride(); + boolean isAllowCommandBlocks = config.isAllowCommandBlocks(); + + // PREVENT GM COMMANDS BEING USED ON COMMANDBLOCKS + if (sender instanceof BlockCommandSender && !isAllowCommandBlocks) { + Block block = ((BlockCommandSender)sender).getBlock(); + GroupManager.logger.warning(ChatColor.RED + "GM Commands can not be called from CommandBlocks"); + GroupManager.logger.warning(ChatColor.RED + "Location: " + ChatColor.GREEN + block.getWorld().getName() + ", " + block.getX() + ", " + block.getY() + ", " + block.getZ()); + return true; + } // DETERMINING PLAYER INFORMATION if (sender instanceof Player) { senderPlayer = (Player) sender; if (!lastError.isEmpty() && !commandLabel.equalsIgnoreCase("manload")) { - sender.sendMessage(ChatColor.RED + "All commands are locked due to an error. Check the log and then try a '/manload'.)"); + sender.sendMessage(ChatColor.RED + "All commands are locked due to an error. " + ChatColor.BOLD + "" + ChatColor.UNDERLINE + "Check the log" + ChatColor.RESET + "" + ChatColor.RED + " and then try a '/manload'."); return true; } @@ -392,14 +411,13 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, senderGroup = senderUser.getGroup(); isOpOverride = (isOpOverride && (senderPlayer.isOp() || worldsHolder.getWorldPermissions(senderPlayer).has(senderPlayer, "groupmanager.op"))); - System.out.println("[PLAYER_COMMAND] " + senderPlayer.getName() + ": /" + commandLabel + " " + Tasks.join(args, " ")); if (isOpOverride || worldsHolder.getWorldPermissions(senderPlayer).has(senderPlayer, "groupmanager." + cmd.getName())) { playerCanDo = true; } - } else if (sender instanceof ConsoleCommandSender) { + } else if ((sender instanceof ConsoleCommandSender) || (sender instanceof RemoteConsoleCommandSender) || (sender instanceof BlockCommandSender)) { if (!lastError.isEmpty() && !commandLabel.equalsIgnoreCase("manload")) { - sender.sendMessage(ChatColor.RED + "All commands are locked due to an error. Check the log and then try a '/manload'.)"); + sender.sendMessage(ChatColor.RED + "All commands are locked due to an error. " + ChatColor.BOLD + "" + ChatColor.UNDERLINE + "Check the log" + ChatColor.RESET + "" + ChatColor.RED + " and then try a '/manload'."); return true; } @@ -414,7 +432,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, dataHolder = worldsHolder.getWorldData(senderPlayer); } - String selectedWorld = selectedWorlds.get(sender); + String selectedWorld = selectedWorlds.get(sender.getName()); if (selectedWorld != null) { dataHolder = worldsHolder.getWorldData(selectedWorld); } @@ -470,8 +488,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, // Validating arguments if ((args.length != 2) && (args.length != 3)) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ | optional [world])"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manuadd | optional [world])"); + return true; } // Select the relevant world (if specified) @@ -497,7 +515,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } auxGroup = dataHolder.getGroup(args[1]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "Group not found!"); + sender.sendMessage(ChatColor.RED + "'" + args[1] + "' Group doesnt exist!"); return false; } if (auxGroup.isGlobal()) { @@ -508,15 +526,15 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, // Validating permissions if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify a player with the same permissions as you, or higher."); - return false; + return true; } if (!isConsole && !isOpOverride && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher."); - return false; + return true; } if (!isConsole && !isOpOverride && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { sender.sendMessage(ChatColor.RED + "You can't modify a player involving a group that you don't inherit."); - return false; + return true; } // Seems OK @@ -534,8 +552,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manudel )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -549,7 +567,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, // Validating permission if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "You can't modify a player with same permissions as you, or higher."); - return false; + return true; } // Seems OK dataHolder.removeUser(auxUser.getName()); @@ -573,8 +591,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manuaddsub )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -587,13 +605,13 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } auxGroup = dataHolder.getGroup(args[1]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "Group not found!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[1] + "' Group doesnt exist!"); + return true; } // Validating permission if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "You can't modify a player with same permissions as you, or higher."); - return false; + return true; } // Seems OK if (auxUser.addSubGroup(auxGroup)) @@ -612,7 +630,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, // Validating arguments if (args.length != 2) { sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manudelsub )"); - return false; + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -625,14 +643,14 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } auxGroup = dataHolder.getGroup(args[1]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "Group not found!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[1] + "' Group doesnt exist!"); + return true; } // Validating permission if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "You can't modify a player with same permissions as you, or higher."); - return false; + return true; } // Seems OK auxUser.removeSubGroup(auxGroup); @@ -652,13 +670,13 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangadd )"); + return true; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup != null) { - sender.sendMessage(ChatColor.RED + "Group already exists!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group already exist!"); + return true; } // Seems OK auxGroup = dataHolder.createGroup(args[0]); @@ -674,13 +692,13 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangdel )"); return false; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "Group not exists!"); - return false; + sender.sendMessage(ChatColor.RED + "" + args[0] + " Group doesnt exist!"); + return true; } // Seems OK dataHolder.removeGroup(auxGroup.getName()); @@ -698,9 +716,16 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manuaddp )"); + return true; + } + + auxString = args[1]; + if (auxString.startsWith("'") && auxString.endsWith("'")) + { + auxString = auxString.substring(1, auxString.length() - 1); } + if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; } @@ -711,43 +736,54 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, auxUser = dataHolder.getUser(args[0]); } // Validating your permissions - if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same group than you, or higher."); - return false; + return true; } permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]); if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { sender.sendMessage(ChatColor.RED + "You can't add a permission you don't have."); - return false; + return true; } // Validating permissions of user permissionResult = permissionHandler.checkUserOnlyPermission(auxUser, args[1]); - if (args[1].startsWith("+")) { + if (auxString.startsWith("+")) { if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) { sender.sendMessage(ChatColor.RED + "The user already has direct access to that permission."); sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); - return false; + return true; } - } else if (args[1].startsWith("-")) { + } else if (auxString.startsWith("-")) { if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) { sender.sendMessage(ChatColor.RED + "The user already has an exception for this node."); sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); - return false; + return true; } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { - sender.sendMessage(ChatColor.RED + "The user already has a matching node "); + sender.sendMessage(ChatColor.RED + "The user already has a matching node."); sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); - return false; + return true; } } else { - if (permissionResult.resultType.equals(PermissionCheckResult.Type.FOUND)) { + if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) { + // Warn only while still allowing you to add the node. + sender.sendMessage(ChatColor.RED + "The user already has an exception for this node."); + sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); + } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.FOUND)) { sender.sendMessage(ChatColor.RED + "The user already has direct access to that permission."); sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); - return false; + if (permissionResult.accessLevel.equalsIgnoreCase(args[1])) + { + return true; + } + } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { + // Warn only while still allowing you to add the node. + sender.sendMessage(ChatColor.RED + "The user already has a matching Negated node."); + sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); } } // Seems OK - auxUser.addPermission(args[1]); - sender.sendMessage(ChatColor.YELLOW + "You added '" + args[1] + "' to player '" + auxUser.getName() + "' permissions."); + auxUser.addPermission(auxString); + sender.sendMessage(ChatColor.YELLOW + "You added '" + auxString + "' to player '" + auxUser.getName() + "' permissions."); targetPlayer = this.getServer().getPlayer(auxUser.getName()); if (targetPlayer != null) @@ -763,9 +799,16 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manudelp )"); + return true; } + + auxString = args[1]; + if (auxString.startsWith("'") && auxString.endsWith("'")) + { + auxString = auxString.substring(1, auxString.length() - 1); + } + if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; } @@ -778,27 +821,71 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, // Validating your permissions if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "You can't modify a player with same group as you, or higher."); - return false; + return true; } - permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]); + permissionResult = permissionHandler.checkFullUserPermission(senderUser, auxString); if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { sender.sendMessage(ChatColor.RED + "You can't remove a permission you don't have."); - return false; + return true; } // Validating permissions of user - permissionResult = permissionHandler.checkUserOnlyPermission(auxUser, args[1]); + permissionResult = permissionHandler.checkUserOnlyPermission(auxUser, auxString); if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { sender.sendMessage(ChatColor.RED + "The user doesn't have direct access to that permission."); - return false; + return true; } - if (!auxUser.hasSamePermissionNode(args[1])) { + if (!auxUser.hasSamePermissionNode(auxString)) { sender.sendMessage(ChatColor.RED + "This permission node doesn't match any node."); sender.sendMessage(ChatColor.RED + "But might match node: " + permissionResult.accessLevel); - return false; + return true; } // Seems OK - auxUser.removePermission(args[1]); - sender.sendMessage(ChatColor.YELLOW + "You removed '" + args[1] + "' from player '" + auxUser.getName() + "' permissions."); + auxUser.removePermission(auxString); + sender.sendMessage(ChatColor.YELLOW + "You removed '" + auxString + "' from player '" + auxUser.getName() + "' permissions."); + + targetPlayer = this.getServer().getPlayer(auxUser.getName()); + if (targetPlayer != null) + BukkitPermissions.updatePermissions(targetPlayer); + + return true; + + case manuclearp: + // Validating state of sender + if (dataHolder == null || permissionHandler == null) { + if (!setDefaultWorldHandler(sender)) + return true; + } + // Validating arguments + if (args.length != 1) { + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manuclearp )"); + return true; + } + + if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { + return false; + } + + if (match != null) { + auxUser = dataHolder.getUser(match.get(0)); + } else { + auxUser = dataHolder.getUser(args[0]); + } + // Validating your permissions + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + sender.sendMessage(ChatColor.RED + "You can't modify a player with same group as you, or higher."); + return true; + } + for (String perm : auxUser.getPermissionList()) { + permissionResult = permissionHandler.checkFullUserPermission(senderUser, perm); + if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { + sender.sendMessage(ChatColor.RED + "You can't remove a permission you don't have: '" + perm + "'."); + } + else + { + auxUser.removePermission(perm); + } + } + sender.sendMessage(ChatColor.YELLOW + "You removed all permissions from player '" + auxUser.getName() + "'."); targetPlayer = this.getServer().getPlayer(auxUser.getName()); if (targetPlayer != null) @@ -814,8 +901,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if ((args.length == 0) || (args.length > 2)) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ (+))"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manulistp (+))"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { @@ -879,8 +966,14 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manucheckp )"); + return true; + } + + auxString = args[1]; + if (auxString.startsWith("'") && auxString.endsWith("'")) + { + auxString = auxString.substring(1, auxString.length() - 1); } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { @@ -894,24 +987,24 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } targetPlayer = this.getServer().getPlayer(auxUser.getName()); // Validating permission - permissionResult = permissionHandler.checkFullGMPermission(auxUser, args[1], false); + permissionResult = permissionHandler.checkFullGMPermission(auxUser, auxString, false); if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { // No permissions found in GM so fall through and check Bukkit. - sender.sendMessage(ChatColor.RED + "The player doesn't have access to that permission"); + sender.sendMessage(ChatColor.YELLOW + "The player doesn't have access to that permission"); } else { // This permission was found in groupmanager. if (permissionResult.owner instanceof User) { if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { - sender.sendMessage(ChatColor.RED + "The user has directly a negation node for that permission."); + sender.sendMessage(ChatColor.YELLOW + "The user has directly a negation node for that permission."); } else { sender.sendMessage(ChatColor.YELLOW + "The user has directly this permission."); } sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel); } else if (permissionResult.owner instanceof Group) { if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { - sender.sendMessage(ChatColor.RED + "The user inherits a negation permission from group: " + permissionResult.owner.getName()); + sender.sendMessage(ChatColor.YELLOW + "The user inherits a negation permission from group: " + permissionResult.owner.getName()); } else { sender.sendMessage(ChatColor.YELLOW + "The user inherits the permission from group: " + permissionResult.owner.getName()); } @@ -934,48 +1027,67 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangaaddp )"); + return true; } + + auxString = args[1]; + if (auxString.startsWith("'") && auxString.endsWith("'")) + { + auxString = auxString.substring(1, auxString.length() - 1); + } + auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "The specified group does not exist!"); + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); return false; } // Validating your permissions permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]); - if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { + if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { sender.sendMessage(ChatColor.RED + "You can't add a permission you don't have."); - return false; + return true; } // Validating permissions of user permissionResult = permissionHandler.checkGroupOnlyPermission(auxGroup, args[1]); - if (args[1].startsWith("+")) { + if (auxString.startsWith("+")) { if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) { sender.sendMessage(ChatColor.RED + "The group already has direct access to that permission."); sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); - return false; + return true; } - } else if (args[1].startsWith("-")) { + } else if (auxString.startsWith("-")) { if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) { sender.sendMessage(ChatColor.RED + "The group already has an exception for this node."); sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); - return false; + return true; } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { sender.sendMessage(ChatColor.RED + "The group already has a matching node."); sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); - return false; + return true; } } else { - if (permissionResult.resultType.equals(PermissionCheckResult.Type.FOUND)) { + if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) { + // Warn only while still allowing you to add the node. + sender.sendMessage(ChatColor.RED + "The group already has an exception for this node."); + sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); + } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.FOUND)) { sender.sendMessage(ChatColor.RED + "The group already has direct access to that permission."); sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); - return false; + // Abort adding if the node is a direct match. + if (permissionResult.accessLevel.equalsIgnoreCase(args[1])) + { + return true; + } + } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { + // Warn only while still allowing you to add the node. + sender.sendMessage(ChatColor.RED + "The group already has a matching Negated node."); + sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel); } } // Seems OK - auxGroup.addPermission(args[1]); - sender.sendMessage(ChatColor.YELLOW + "You added '" + args[1] + "' to group '" + auxGroup.getName() + "' permissions."); + auxGroup.addPermission(auxString); + sender.sendMessage(ChatColor.YELLOW + "You added '" + auxString + "' to group '" + auxGroup.getName() + "' permissions."); BukkitPermissions.updateAllPlayers(); @@ -989,34 +1101,75 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangdelp )"); + return true; } + + auxString = args[1]; + if (auxString.startsWith("'") && auxString.endsWith("'")) + { + auxString = auxString.substring(1, auxString.length() - 1); + } + auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "The specified group does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } // Validating your permissions - permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]); - if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { + permissionResult = permissionHandler.checkFullUserPermission(senderUser, auxString); + if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have."); - return false; + return true; } // Validating permissions of user - permissionResult = permissionHandler.checkGroupOnlyPermission(auxGroup, args[1]); + permissionResult = permissionHandler.checkGroupOnlyPermission(auxGroup, auxString); if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { - sender.sendMessage(ChatColor.RED + "The group doesn't have direct access to that permission."); - return false; + sender.sendMessage(ChatColor.YELLOW + "The group doesn't have direct access to that permission."); + return true; } - if (!auxGroup.hasSamePermissionNode(args[1])) { + if (!auxGroup.hasSamePermissionNode(auxString)) { sender.sendMessage(ChatColor.RED + "This permission node doesn't match any node."); sender.sendMessage(ChatColor.RED + "But might match node: " + permissionResult.accessLevel); - return false; + return true; } // Seems OK - auxGroup.removePermission(args[1]); - sender.sendMessage(ChatColor.YELLOW + "You removed '" + args[1] + "' from group '" + auxGroup.getName() + "' permissions."); + auxGroup.removePermission(auxString); + sender.sendMessage(ChatColor.YELLOW + "You removed '" + auxString + "' from group '" + auxGroup.getName() + "' permissions."); + + BukkitPermissions.updateAllPlayers(); + + return true; + + case mangclearp: + // Validating state of sender + if (dataHolder == null || permissionHandler == null) { + if (!setDefaultWorldHandler(sender)) + return true; + } + // Validating arguments + if (args.length != 1) { + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangclearp )"); + return true; + } + + auxGroup = dataHolder.getGroup(args[0]); + if (auxGroup == null) { + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; + } + + for (String perm : auxGroup.getPermissionList()) { + permissionResult = permissionHandler.checkFullUserPermission(senderUser, perm); + if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { + sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have: '" + perm + "'."); + } + else + { + auxGroup.removePermission(perm); + } + } + sender.sendMessage(ChatColor.YELLOW + "You removed all permissions from group '" + auxGroup.getName() + "'."); BukkitPermissions.updateAllPlayers(); @@ -1030,13 +1183,13 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manglistp )"); + return true; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "The specified group does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } // Validating permission @@ -1079,25 +1232,32 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangcheckp )"); + return true; } + + auxString = args[1]; + if (auxString.startsWith("'") && auxString.endsWith("'")) + { + auxString = auxString.substring(1, auxString.length() - 1); + } + auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "The specified group does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } // Validating permission - permissionResult = permissionHandler.checkGroupPermissionWithInheritance(auxGroup, args[1]); + permissionResult = permissionHandler.checkGroupPermissionWithInheritance(auxGroup, auxString); if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { - sender.sendMessage(ChatColor.RED + "The group doesn't have access to that permission"); - return false; + sender.sendMessage(ChatColor.YELLOW + "The group doesn't have access to that permission"); + return true; } // Seems OK // auxString = permissionHandler.checkUserOnlyPermission(auxUser, args[1]); if (permissionResult.owner instanceof Group) { if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { - sender.sendMessage(ChatColor.RED + "The group inherits the a negation permission from group: " + permissionResult.owner.getName()); + sender.sendMessage(ChatColor.YELLOW + "The group inherits the negation permission from group: " + permissionResult.owner.getName()); } else { sender.sendMessage(ChatColor.YELLOW + "The user inherits the permission from group: " + permissionResult.owner.getName()); } @@ -1114,28 +1274,28 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangaddi )"); + return true; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "Group 1 does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } auxGroup2 = dataHolder.getGroup(args[1]); if (auxGroup2 == null) { - sender.sendMessage(ChatColor.RED + "Group 2 does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[1] + "' Group doesnt exist!"); + return true; } if (auxGroup.isGlobal()) { sender.sendMessage(ChatColor.RED + "GlobalGroups do NOT support inheritance."); - return false; + return true; } // Validating permission if (permissionHandler.hasGroupInInheritance(auxGroup, auxGroup2.getName())) { sender.sendMessage(ChatColor.RED + "Group " + auxGroup.getName() + " already inherits " + auxGroup2.getName() + " (might not be directly)"); - return false; + return true; } // Seems OK auxGroup.addInherits(auxGroup2); @@ -1153,32 +1313,32 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangdeli )"); + return true; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "Group 1 does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } auxGroup2 = dataHolder.getGroup(args[1]); if (auxGroup2 == null) { - sender.sendMessage(ChatColor.RED + "Group 2 does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[1] + "' Group doesnt exist!"); + return true; } if (auxGroup.isGlobal()) { sender.sendMessage(ChatColor.RED + "GlobalGroups do NOT support inheritance."); - return false; + return true; } // Validating permission if (!permissionHandler.hasGroupInInheritance(auxGroup, auxGroup2.getName())) { sender.sendMessage(ChatColor.RED + "Group " + auxGroup.getName() + " does not inherits " + auxGroup2.getName() + "."); - return false; + return true; } if (!auxGroup.getInherits().contains(auxGroup2.getName())) { sender.sendMessage(ChatColor.RED + "Group " + auxGroup.getName() + " does not inherits " + auxGroup2.getName() + " directly."); - return false; + return true; } // Seems OK auxGroup.removeInherits(auxGroup2.getName()); @@ -1196,8 +1356,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length < 3) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manuaddv )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1217,6 +1377,10 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, auxString += " "; } } + if (auxString.startsWith("'") && auxString.endsWith("'")) + { + auxString = auxString.substring(1, auxString.length() - 1); + } auxUser.getVariables().addVar(args[1], Variables.parseVariableValue(auxString)); sender.sendMessage(ChatColor.YELLOW + "Variable " + ChatColor.GOLD + args[1] + ChatColor.YELLOW + ":'" + ChatColor.GREEN + auxString + ChatColor.YELLOW + "' added to the user " + auxUser.getName()); @@ -1230,8 +1394,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manudelv )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1245,6 +1409,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, // Validating permission if (!auxUser.getVariables().hasVar(args[1])) { sender.sendMessage(ChatColor.RED + "The user doesn't have directly that variable!"); + return true; } // Seems OK auxUser.getVariables().removeVar(args[1]); @@ -1260,8 +1425,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manulistv )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1295,8 +1460,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manucheckv )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1319,8 +1484,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, continue; } if (auxGroup2 == null) { - sender.sendMessage(ChatColor.RED + "The user doesn't have access to that variable!"); - return false; + sender.sendMessage(ChatColor.YELLOW + "The user doesn't have access to that variable!"); + return true; } } // Seems OK @@ -1343,17 +1508,17 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length < 3) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangaddv )"); + return true; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "The specified group does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } if (auxGroup.isGlobal()) { sender.sendMessage(ChatColor.RED + "GlobalGroups do NOT support Info Nodes."); - return false; + return true; } // Validating permission // Seems OK @@ -1364,6 +1529,10 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, auxString += " "; } } + if (auxString.startsWith("'") && auxString.endsWith("'")) + { + auxString = auxString.substring(1, auxString.length() - 1); + } auxGroup.getVariables().addVar(args[1], Variables.parseVariableValue(auxString)); sender.sendMessage(ChatColor.YELLOW + "Variable " + ChatColor.GOLD + args[1] + ChatColor.YELLOW + ":'" + ChatColor.GREEN + auxString + ChatColor.YELLOW + "' added to the group " + auxGroup.getName()); @@ -1377,21 +1546,22 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangdelv )"); + return true; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "The specified group does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } if (auxGroup.isGlobal()) { sender.sendMessage(ChatColor.RED + "GlobalGroups do NOT support Info Nodes."); - return false; + return true; } // Validating permission if (!auxGroup.getVariables().hasVar(args[1])) { sender.sendMessage(ChatColor.RED + "The group doesn't have directly that variable!"); + return true; } // Seems OK auxGroup.getVariables().removeVar(args[1]); @@ -1407,17 +1577,17 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manglistv )"); + return true; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "The specified group does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } if (auxGroup.isGlobal()) { sender.sendMessage(ChatColor.RED + "GlobalGroups do NOT support Info Nodes."); - return false; + return true; } // Validating permission // Seems OK @@ -1450,17 +1620,17 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mangcheckv )"); + return true; } auxGroup = dataHolder.getGroup(args[0]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "The specified group does not exist!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } if (auxGroup.isGlobal()) { sender.sendMessage(ChatColor.RED + "GlobalGroups do NOT support Info Nodes."); - return false; + return true; } // Validating permission auxGroup2 = permissionHandler.nextGroupWithVariable(auxGroup, args[1]); @@ -1483,8 +1653,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manwhois )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1523,8 +1693,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/tempadd )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1535,9 +1705,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, auxUser = dataHolder.getUser(args[0]); } // Validating permission - if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher."); - return false; + return true; } // Seems OK if (overloadedUsers.get(dataHolder.getName().toLowerCase()) == null) { @@ -1545,7 +1715,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } dataHolder.overloadUser(auxUser.getName()); overloadedUsers.get(dataHolder.getName().toLowerCase()).add(dataHolder.getUser(auxUser.getName())); - sender.sendMessage(ChatColor.YELLOW + "Player overloaded!"); + sender.sendMessage(ChatColor.YELLOW + "Player set to overload mode!"); return true; @@ -1557,8 +1727,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/tempdel )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1569,9 +1739,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, auxUser = dataHolder.getUser(args[0]); } // Validating permission - if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "You can't modify a player with same permissions as you, or higher."); - return false; + return true; } // Seems OK if (overloadedUsers.get(dataHolder.getName().toLowerCase()) == null) { @@ -1581,7 +1751,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, if (overloadedUsers.get(dataHolder.getName().toLowerCase()).contains(auxUser)) { overloadedUsers.get(dataHolder.getName().toLowerCase()).remove(auxUser); } - sender.sendMessage(ChatColor.YELLOW + "You removed that player's overload. He's back to normal!"); + sender.sendMessage(ChatColor.YELLOW + "Player overload mode is now disabled."); return true; @@ -1652,7 +1822,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, try { worldsHolder.saveChanges(forced); - sender.sendMessage(ChatColor.YELLOW + " All changes were saved."); + sender.sendMessage(ChatColor.YELLOW + "All changes were saved."); } catch (IllegalStateException ex) { sender.sendMessage(ChatColor.RED + ex.getMessage()); } @@ -1666,7 +1836,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, if (args.length > 0) { if (!lastError.isEmpty()) { - sender.sendMessage(ChatColor.RED + "All commands are locked due to an error. Check the log and then try a '/manload'.)"); + sender.sendMessage(ChatColor.RED + "All commands are locked due to an error. " + ChatColor.BOLD + "" + ChatColor.UNDERLINE + "Check the log" + ChatColor.RESET + "" + ChatColor.RED + " and then try a '/manload'."); return true; } @@ -1687,7 +1857,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, isLoaded = true; - BukkitPermissions.updateAllPlayers(); + BukkitPermissions.reset(); } else { @@ -1708,7 +1878,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, * Fire an event as none will have been triggered in the reload. */ if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(GMSystemEvent.Action.RELOADED); + GroupManager.getGMEventHandler().callEvent(GMSystemEvent.Action.RELOADED); return true; @@ -1720,16 +1890,21 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // WORKING auxString = ""; + String auxString2 = ""; for (Group g : dataHolder.getGroupList()) { auxString += g.getName() + ", "; } for (Group g : getGlobalGroups().getGroupList()) { - auxString += g.getName() + ", "; + auxString2 += g.getName() + ", "; } if (auxString.lastIndexOf(",") > 0) { auxString = auxString.substring(0, auxString.lastIndexOf(",")); } - sender.sendMessage(ChatColor.YELLOW + " Groups Available: " + ChatColor.WHITE + auxString); + if (auxString2.lastIndexOf(",") > 0) { + auxString2 = auxString2.substring(0, auxString2.lastIndexOf(",")); + } + sender.sendMessage(ChatColor.YELLOW + "Groups Available: " + ChatColor.WHITE + auxString); + sender.sendMessage(ChatColor.YELLOW + "GlobalGroups Available: " + ChatColor.WHITE + auxString2); return true; @@ -1741,8 +1916,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manpromote )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1754,33 +1929,33 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } auxGroup = dataHolder.getGroup(args[1]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "Group not found!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } if (auxGroup.isGlobal()) { sender.sendMessage(ChatColor.RED + "Players may not be members of GlobalGroups directly."); - return false; + return true; } // Validating permission if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "You can't modify a player with same permissions as you, or higher."); - return false; + return true; } if (!isConsole && !isOpOverride && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher."); - return false; + return true; } if (!isConsole && !isOpOverride && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { sender.sendMessage(ChatColor.RED + "You can't modify a player involving a group that you don't inherit."); - return false; + return true; } - if (!isConsole && !isOpOverride && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { + if (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName())) { sender.sendMessage(ChatColor.RED + "You can't modify a player using groups with different heritage line."); - return false; + return true; } - if (!isConsole && !isOpOverride && (!permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { + if (!permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName())) { sender.sendMessage(ChatColor.RED + "The new group must be a higher rank."); - return false; + return true; } // Seems OK auxUser.setGroup(auxGroup); @@ -1797,8 +1972,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // Validating arguments if (args.length != 2) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); - return false; + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mandemote )"); + return true; } if ((validateOnlinePlayer) && ((match = validatePlayer(args[0], sender)) == null)) { return false; @@ -1810,33 +1985,33 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } auxGroup = dataHolder.getGroup(args[1]); if (auxGroup == null) { - sender.sendMessage(ChatColor.RED + "Group not found!"); - return false; + sender.sendMessage(ChatColor.RED + "'" + args[0] + "' Group doesnt exist!"); + return true; } if (auxGroup.isGlobal()) { sender.sendMessage(ChatColor.RED + "Players may not be members of GlobalGroups directly."); - return false; + return true; } // Validating permission if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "You can't modify a player with same permissions as you, or higher."); - return false; + return true; } if (!isConsole && !isOpOverride && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher."); - return false; + return true; } if (!isConsole && !isOpOverride && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { sender.sendMessage(ChatColor.RED + "You can't modify a player involving a group that you don't inherit."); - return false; + return true; } - if (!isConsole && !isOpOverride && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { - sender.sendMessage(ChatColor.RED + "You can't modify a player using groups with different heritage line."); - return false; + if (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName())) { + sender.sendMessage(ChatColor.RED + "You can't modify a player using groups with different inheritage line."); + return true; } - if (!isConsole && !isOpOverride && (permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { + if (permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName())) { sender.sendMessage(ChatColor.RED + "The new group must be a lower rank."); - return false; + return true; } // Seems OK auxUser.setGroup(auxGroup); @@ -1847,9 +2022,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, case mantogglevalidate: validateOnlinePlayer = !validateOnlinePlayer; - sender.sendMessage(ChatColor.YELLOW + "Validade if player is online, now set to: " + Boolean.toString(validateOnlinePlayer)); + sender.sendMessage(ChatColor.YELLOW + "Validate if player is online, now set to: " + Boolean.toString(validateOnlinePlayer)); if (!validateOnlinePlayer) { - sender.sendMessage(ChatColor.GOLD + "From now on you can edit players not connected... BUT:"); + sender.sendMessage(ChatColor.GOLD + "From now on you can edit players that are not connected... BUT:"); sender.sendMessage(ChatColor.LIGHT_PURPLE + "From now on you should type the whole name of the player, correctly."); } return true; @@ -1863,7 +2038,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } return true; case manworld: - auxString = selectedWorlds.get(sender); + auxString = selectedWorlds.get(sender.getName()); if (auxString != null) { sender.sendMessage(ChatColor.YELLOW + "You have the world '" + dataHolder.getName() + "' in your selection."); } else { @@ -1880,7 +2055,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, case manselect: if (args.length < 1) { - sender.sendMessage(ChatColor.RED + "Review your arguments count! (/ )"); + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/manselect )"); sender.sendMessage(ChatColor.YELLOW + "Worlds available: "); ArrayList worlds = worldsHolder.allWorldsDataList(); auxString = ""; @@ -1906,7 +2081,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } dataHolder = worldsHolder.getWorldData(auxString); permissionHandler = dataHolder.getPermissionsHandler(); - selectedWorlds.put(sender, dataHolder.getName()); + selectedWorlds.put(sender.getName(), dataHolder.getName()); sender.sendMessage(ChatColor.YELLOW + "You have selected world '" + dataHolder.getName() + "'."); return true; @@ -1916,17 +2091,53 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, sender.sendMessage(ChatColor.RED + "Review your arguments count!"); return false; } - selectedWorlds.remove(sender); + selectedWorlds.remove(sender.getName()); sender.sendMessage(ChatColor.YELLOW + "You have removed your world selection. Working with current world(if possible)."); return true; + + case mancheckw: + if (args.length < 1) { + sender.sendMessage(ChatColor.RED + "Review your arguments count! (/mancheckw )"); + sender.sendMessage(ChatColor.YELLOW + "Worlds available: "); + ArrayList worlds = worldsHolder.allWorldsDataList(); + auxString = ""; + for (int i = 0; i < worlds.size(); i++) { + auxString += worlds.get(i).getName(); + if ((i + 1) < worlds.size()) { + auxString += ", "; + } + } + sender.sendMessage(ChatColor.YELLOW + auxString); + return false; + } + + auxString = ""; + for (int i = 0; i < args.length; i++) { + if (args[i] == null) { + logger.warning("Bukkit gave invalid arguments array! Cmd: " + cmd.getName() + " args.length: " + args.length); + return false; + } + auxString += args[i]; + if (i < (args.length - 1)) { + auxString += " "; + } + } + dataHolder = worldsHolder.getWorldData(auxString); + + sender.sendMessage(ChatColor.YELLOW + "You have selected world '" + dataHolder.getName() + "'."); + sender.sendMessage(ChatColor.YELLOW + "This world is using the following data files.."); + sender.sendMessage(ChatColor.YELLOW + "Groups:" + ChatColor.GREEN + " " + dataHolder.getGroupsFile().getAbsolutePath()); + sender.sendMessage(ChatColor.YELLOW + "Users:" + ChatColor.GREEN + " " + dataHolder.getUsersFile().getAbsolutePath()); + + return true; default: break; } } sender.sendMessage(ChatColor.RED + "You are not allowed to use that command."); - return false; + return true; } /** @@ -1938,7 +2149,7 @@ private boolean setDefaultWorldHandler(CommandSender sender) { permissionHandler = dataHolder.getPermissionsHandler(); if ((dataHolder != null) && (permissionHandler != null)) { - selectedWorlds.put(sender, dataHolder.getName()); + selectedWorlds.put(sender.getName(), dataHolder.getName()); sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. Default world '" + worldsHolder.getDefaultWorld().getName() + "' selected."); return true; } @@ -2035,4 +2246,14 @@ public static GlobalGroups getGlobalGroups() { return globalGroups; } -} \ No newline at end of file + + public static GroupManagerEventHandler getGMEventHandler() { + + return GMEventHandler; + } + + public static void setGMEventHandler(GroupManagerEventHandler gMEventHandler) { + + GMEventHandler = gMEventHandler; + } +} diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java index bb04fa3d75..5cd07048ff 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java @@ -21,7 +21,7 @@ public abstract class DataUnit { private WorldDataHolder dataSource; private String name; private boolean changed, sorted = false; - private ArrayList permissions = new ArrayList(); + private List permissions = Collections.unmodifiableList(Collections.emptyList()); public DataUnit(WorldDataHolder dataSource, String name) { @@ -144,7 +144,9 @@ public boolean hasSamePermissionNode(String permission) { public void addPermission(String permission) { if (!hasSamePermissionNode(permission)) { - permissions.add(permission); + List clone = new ArrayList(permissions); + clone.add(permission); + permissions = Collections.unmodifiableList(clone); } flagAsChanged(); } @@ -152,7 +154,10 @@ public void addPermission(String permission) { public boolean removePermission(String permission) { flagAsChanged(); - return permissions.remove(permission); + List clone = new ArrayList(permissions); + boolean ret = clone.remove(permission); + permissions = Collections.unmodifiableList(clone); + return ret; } /** @@ -162,8 +167,7 @@ public boolean removePermission(String permission) { * @return a copy of the permission list */ public List getPermissionList() { - - return Collections.unmodifiableList(permissions); + return permissions; } public boolean isSorted() { @@ -174,7 +178,9 @@ public boolean isSorted() { public void sortPermissions() { if (!isSorted()) { - Collections.sort(permissions, StringPermissionComparator.getInstance()); + List clone = new ArrayList(permissions); + Collections.sort(clone, StringPermissionComparator.getInstance()); + permissions = Collections.unmodifiableList(clone); sorted = true; } } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java index 751dc8fd68..c0c19c9971 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java @@ -7,8 +7,6 @@ import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.dataholder.WorldDataHolder; import org.anjocaido.groupmanager.events.GMGroupEvent.Action; -import org.anjocaido.groupmanager.events.GroupManagerEventHandler; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -23,7 +21,7 @@ public class Group extends DataUnit implements Cloneable { /** * The group it inherits DIRECTLY! */ - private ArrayList inherits = new ArrayList(); + private List inherits = Collections.unmodifiableList(Collections.emptyList()); /** * This one holds the fields in INFO node. * like prefix = 'c' @@ -75,7 +73,9 @@ public Group clone() { clone = new Group(this.getName()); } else { clone = new Group(getDataSource(), this.getName()); - clone.inherits = new ArrayList(this.getInherits()); + clone.inherits = this.getInherits().isEmpty() ? + Collections.unmodifiableList(Collections.emptyList()) + : Collections.unmodifiableList(new ArrayList(this.getInherits())); } for (String perm : this.getPermissionList()) { @@ -102,7 +102,9 @@ public Group clone(WorldDataHolder dataSource) { // Don't add inheritance for GlobalGroups if (!isGlobal()) { - clone.inherits = new ArrayList(this.getInherits()); + clone.inherits = this.getInherits().isEmpty() ? + Collections.unmodifiableList(Collections.emptyList()) + : Collections.unmodifiableList(new ArrayList(this.getInherits())); } for (String perm : this.getPermissionList()) { clone.addPermission(perm); @@ -120,8 +122,7 @@ public Group clone(WorldDataHolder dataSource) { * @return the inherits */ public List getInherits() { - - return Collections.unmodifiableList(inherits); + return inherits; } /** @@ -134,12 +135,14 @@ public void addInherits(Group inherit) { getDataSource().addGroup(inherit); } if (!inherits.contains(inherit.getName().toLowerCase())) { - inherits.add(inherit.getName().toLowerCase()); + List clone = new ArrayList(inherits); + clone.add(inherit.getName().toLowerCase()); + inherits = Collections.unmodifiableList(clone); } flagAsChanged(); if (GroupManager.isLoaded()) { GroupManager.BukkitPermissions.updateAllPlayers(); - GroupManagerEventHandler.callEvent(this, Action.GROUP_INHERITANCE_CHANGED); + GroupManager.getGMEventHandler().callEvent(this, Action.GROUP_INHERITANCE_CHANGED); } } } @@ -148,9 +151,11 @@ public boolean removeInherits(String inherit) { if (!isGlobal()) { if (this.inherits.contains(inherit.toLowerCase())) { - this.inherits.remove(inherit.toLowerCase()); + List clone = new ArrayList(inherits); + clone.remove(inherit.toLowerCase()); + inherits = Collections.unmodifiableList(clone); flagAsChanged(); - GroupManagerEventHandler.callEvent(this, Action.GROUP_INHERITANCE_CHANGED); + GroupManager.getGMEventHandler().callEvent(this, Action.GROUP_INHERITANCE_CHANGED); return true; } } @@ -180,7 +185,7 @@ public void setVariables(Map varList) { flagAsChanged(); if (GroupManager.isLoaded()) { GroupManager.BukkitPermissions.updateAllPlayers(); - GroupManagerEventHandler.callEvent(this, Action.GROUP_INFO_CHANGED); + GroupManager.getGMEventHandler().callEvent(this, Action.GROUP_INFO_CHANGED); } } } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java index e08d1db7dd..588d501166 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java @@ -26,7 +26,8 @@ public GroupVariables(Group owner) { public GroupVariables(Group owner, Map varList) { super(owner); - variables = varList; + variables.clear(); + variables.putAll(varList); if (variables.get("prefix") == null) { variables.put("prefix", ""); owner.flagAsChanged(); @@ -54,9 +55,11 @@ public GroupVariables(Group owner, Map varList) { protected GroupVariables clone(Group newOwner) { GroupVariables clone = new GroupVariables(newOwner); + synchronized(variables) { for (String key : variables.keySet()) { clone.variables.put(key, variables.get(key)); } + } newOwner.flagAsChanged(); return clone; } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java index 6c74c2e508..adec183cd6 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java @@ -6,12 +6,12 @@ //import com.sun.org.apache.bcel.internal.generic.AALOAD; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.dataholder.WorldDataHolder; import org.anjocaido.groupmanager.events.GMUserEvent.Action; -import org.anjocaido.groupmanager.events.GroupManagerEventHandler; - import java.util.Map; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -26,7 +26,7 @@ public class User extends DataUnit implements Cloneable { * */ private String group = null; - private ArrayList subGroups = new ArrayList(); + private final List subGroups = Collections.synchronizedList(new ArrayList()); /** * This one holds the fields in INFO node. like prefix = 'c' or build = * false @@ -144,9 +144,9 @@ public void setGroup(Group group, Boolean updatePerms) { boolean notify = (!oldGroup.equalsIgnoreCase(defaultGroupName)) || ((oldGroup.equalsIgnoreCase(defaultGroupName)) && (!this.group.equalsIgnoreCase(defaultGroupName))); if (notify) - GroupManager.notify(this.getName(), String.format(" moved to the group %s.", group.getName())); + GroupManager.notify(this.getName(), String.format(" moved to the group %s in %s.", group.getName(), this.getDataSource().getName())); - GroupManagerEventHandler.callEvent(this, Action.USER_GROUP_CHANGED); + GroupManager.getGMEventHandler().callEvent(this, Action.USER_GROUP_CHANGED); } } @@ -170,7 +170,7 @@ public boolean addSubGroup(Group subGroup) { if (GroupManager.isLoaded()) { if (!GroupManager.BukkitPermissions.isPlayer_join()) GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer()); - GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED); + GroupManager.getGMEventHandler().callEvent(this, Action.USER_SUBGROUP_CHANGED); } return true; @@ -202,7 +202,7 @@ public boolean removeSubGroup(Group subGroup) { if (GroupManager.isLoaded()) if (!GroupManager.BukkitPermissions.isPlayer_join()) GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer()); - GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED); + GroupManager.getGMEventHandler().callEvent(this, Action.USER_SUBGROUP_CHANGED); return true; } } catch (Exception e) { @@ -213,6 +213,7 @@ public boolean removeSubGroup(Group subGroup) { public ArrayList subGroupListCopy() { ArrayList val = new ArrayList(); + synchronized(subGroups) { for (String gstr : subGroups) { Group g = getDataSource().getGroup(gstr); if (g == null) { @@ -221,12 +222,14 @@ public ArrayList subGroupListCopy() { } val.add(g); } + } return val; } public ArrayList subGroupListStringCopy() { - - return new ArrayList(subGroups); + synchronized(subGroups) { + return new ArrayList(subGroups); + } } /** @@ -252,7 +255,7 @@ public void setVariables(Map varList) { if (GroupManager.isLoaded()) { //if (!GroupManager.BukkitPermissions.isPlayer_join()) // GroupManager.BukkitPermissions.updatePlayer(this.getName()); - GroupManagerEventHandler.callEvent(this, Action.USER_INFO_CHANGED); + GroupManager.getGMEventHandler().callEvent(this, Action.USER_INFO_CHANGED); } } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java index f994595c16..05c3aecee2 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java @@ -23,7 +23,8 @@ public UserVariables(User owner) { public UserVariables(User owner, Map varList) { super(owner); - this.variables = varList; + this.variables.clear(); + this.variables.putAll(varList); this.owner = owner; } @@ -35,9 +36,11 @@ public UserVariables(User owner, Map varList) { protected UserVariables clone(User newOwner) { UserVariables clone = new UserVariables(newOwner); + synchronized(variables) { for (String key : variables.keySet()) { clone.variables.put(key, variables.get(key)); } + } newOwner.flagAsChanged(); return clone; } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java index 42ceba7e4d..8e1a54b98f 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java @@ -4,9 +4,9 @@ */ package org.anjocaido.groupmanager.data; +import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Set; /** * A class that holds variables of a user/group. @@ -21,7 +21,7 @@ public abstract class Variables implements Cloneable { private DataUnit owner; - protected Map variables = new HashMap(); + protected final Map variables = Collections.synchronizedMap(new HashMap()); public Variables(DataUnit owner) { @@ -126,9 +126,10 @@ public Double getVarDouble(String name) { * * @return Set of all variable names. */ - public Set getVarKeyList() { - - return variables.keySet(); + public String[] getVarKeyList() { + synchronized(variables) { + return variables.keySet().toArray(new String[0]); + } } /** diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java index eaaaace743..1ae4d06bc3 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java @@ -1,6 +1,7 @@ package org.anjocaido.groupmanager.dataholder; import java.io.File; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -23,7 +24,7 @@ public class GroupsDataHolder { /** * The actual groups holder */ - private Map groups = new HashMap(); + private final Map groups = Collections.synchronizedMap(new HashMap()); /** * Constructor @@ -36,8 +37,15 @@ public void setDataSource(WorldDataHolder dataSource) { this.dataSource = dataSource; //push this data source to the users, so they pull the correct groups data. + synchronized(groups) { for (Group group : groups.values()) group.setDataSource(this.dataSource); + } + } + + public WorldDataHolder getDataSource() { + + return this.dataSource; } /** @@ -57,6 +65,7 @@ public void setDefaultGroup(Group defaultGroup) { } /** + * Note: Iteration over this object has to be synchronized! * @return the groups */ public Map getGroups() { @@ -65,11 +74,10 @@ public Map getGroups() { } /** - * @param groups the groups to set + * Resets the Groups */ - public void setGroups(Map groups) { - - this.groups = groups; + public void resetGroups() { + this.groups.clear(); } /** @@ -120,4 +128,4 @@ public void setTimeStampGroups(long timeStampGroups) { this.timeStampGroups = timeStampGroups; } -} \ No newline at end of file +} diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java index 84561b6e53..ef9f605ed8 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.anjocaido.groupmanager.data.User; @@ -19,7 +20,7 @@ public class OverloadedWorldHolder extends WorldDataHolder { /** * */ - protected Map overloadedUsers = new HashMap(); + protected final Map overloadedUsers = Collections.synchronizedMap(new HashMap()); /** * @@ -112,29 +113,35 @@ public boolean removeGroup(String groupName) { if (groupName.equals(getDefaultGroup())) { return false; } + synchronized(getGroups()) { for (String key : getGroups().keySet()) { if (groupName.equalsIgnoreCase(key)) { getGroups().remove(key); + synchronized(getUsers()) { for (String userKey : getUsers().keySet()) { User user = getUsers().get(userKey); if (user.getGroupName().equalsIgnoreCase(key)) { user.setGroup(getDefaultGroup()); } + } } //OVERLOADED CODE + synchronized(overloadedUsers) { for (String userKey : overloadedUsers.keySet()) { User user = overloadedUsers.get(userKey); if (user.getGroupName().equalsIgnoreCase(key)) { user.setGroup(getDefaultGroup()); } + } } //END OVERLOAD setGroupsChanged(true); return true; } } + } return false; } @@ -146,6 +153,7 @@ public boolean removeGroup(String groupName) { public Collection getUserList() { Collection overloadedList = new ArrayList(); + synchronized(getUsers()) { Collection normalList = getUsers().values(); for (User u : normalList) { if (overloadedUsers.containsKey(u.getName().toLowerCase())) { @@ -154,6 +162,7 @@ public Collection getUserList() { overloadedList.add(u); } } + } return overloadedList; } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java index 665fe227dc..ee822f1aff 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java @@ -1,6 +1,7 @@ package org.anjocaido.groupmanager.dataholder; import java.io.File; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -22,7 +23,7 @@ public class UsersDataHolder { /** * The actual groups holder */ - private Map users = new HashMap(); + private final Map users = Collections.synchronizedMap(new HashMap()); /** * Constructor @@ -35,25 +36,31 @@ public void setDataSource(WorldDataHolder dataSource) { this.dataSource = dataSource; //push this data source to the users, so they pull the correct groups data. + synchronized(users) { for (User user : users.values()) user.setDataSource(this.dataSource); - + } } /** + * Note: Iteration over this object has to be synchronized! * @return the users */ public Map getUsers() { return users; } + + public WorldDataHolder getDataSource() { + + return this.dataSource; + } /** - * @param users the users to set + * Resets the Users */ - public void setUsers(Map users) { - - this.users = users; + public void resetUsers() { + this.users.clear(); } /** @@ -104,4 +111,4 @@ public void setTimeStampUsers(long timeStampUsers) { this.timeStampUsers = timeStampUsers; } -} \ No newline at end of file +} diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java index fefc698f92..095b99a50b 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java @@ -15,8 +15,10 @@ import java.util.Collection; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; import org.anjocaido.groupmanager.GroupManager; @@ -26,7 +28,6 @@ import org.anjocaido.groupmanager.events.GMSystemEvent; import org.anjocaido.groupmanager.events.GMUserEvent; import org.anjocaido.groupmanager.events.GMUserEvent.Action; -import org.anjocaido.groupmanager.events.GroupManagerEventHandler; import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler; import org.bukkit.Server; import org.bukkit.plugin.Plugin; @@ -37,9 +38,9 @@ import org.yaml.snakeyaml.reader.UnicodeReader; /** - * One instance of this should exist per world/mirror - * it contains all functions to manage these data sets - * and points to the relevant users and groups objects. + * One instance of this should exist per world/mirror it contains all functions + * to manage these data sets and points to the relevant users and groups + * objects. * * @author gabrielcouto, ElgarL */ @@ -100,8 +101,8 @@ public void updateDataSource() { } /** - * Search for a user. If it doesn't exist, create a new one with - * default group. + * Search for a user. If it doesn't exist, create a new one with default + * group. * * @param userName the name of the user * @return class that manage that user permission @@ -135,7 +136,7 @@ public void addUser(User theUser) { getUsers().put(theUser.getName().toLowerCase(), theUser); setUsersChanged(true); if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(theUser, Action.USER_ADDED); + GroupManager.getGMEventHandler().callEvent(theUser, Action.USER_ADDED); } /** @@ -150,7 +151,7 @@ public boolean removeUser(String userName) { getUsers().remove(userName.toLowerCase()); setUsersChanged(true); if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(userName, GMUserEvent.Action.USER_REMOVED); + GroupManager.getGMEventHandler().callEvent(userName, GMUserEvent.Action.USER_REMOVED); return true; } return false; @@ -179,7 +180,7 @@ public void setDefaultGroup(Group group) { groups.setDefaultGroup(getGroup(group.getName())); setGroupsChanged(true); if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(GMSystemEvent.Action.DEFAULT_GROUP_CHANGED); + GroupManager.getGMEventHandler().callEvent(GMSystemEvent.Action.DEFAULT_GROUP_CHANGED); } /** @@ -207,8 +208,8 @@ public Group getGroup(String groupName) { } /** - * Check if a group exists. - * Its the same of getGroup, but check if it is null. + * Check if a group exists. Its the same of getGroup, but check if it is + * null. * * @param groupName the name of the group * @return true if exists. false if not. @@ -230,7 +231,7 @@ public void addGroup(Group groupToAdd) { if (groupToAdd.getName().toLowerCase().startsWith("g:")) { GroupManager.getGlobalGroups().addGroup(groupToAdd); - GroupManagerEventHandler.callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED); + GroupManager.getGMEventHandler().callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED); return; } @@ -241,7 +242,7 @@ public void addGroup(Group groupToAdd) { getGroups().put(groupToAdd.getName().toLowerCase(), groupToAdd); setGroupsChanged(true); if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED); + GroupManager.getGMEventHandler().callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED); } /** @@ -264,7 +265,7 @@ public boolean removeGroup(String groupName) { getGroups().remove(groupName.toLowerCase()); setGroupsChanged(true); if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(groupName.toLowerCase(), GMGroupEvent.Action.GROUP_REMOVED); + GroupManager.getGMEventHandler().callEvent(groupName.toLowerCase(), GMGroupEvent.Action.GROUP_REMOVED); return true; } return false; @@ -272,8 +273,7 @@ public boolean removeGroup(String groupName) { } /** - * Creates a new User with the given name - * and adds it to this holder. + * Creates a new User with the given name and adds it to this holder. * * @param userName the username you want * @return null if user already exists. or new User @@ -291,8 +291,7 @@ public User createUser(String userName) { } /** - * Creates a new Group with the given name - * and adds it to this holder + * Creates a new Group with the given name and adds it to this holder * * @param groupName the groupname you want * @return null if group already exists. or new Group @@ -320,7 +319,9 @@ public Group createGroup(String groupName) { */ public Collection getGroupList() { - return getGroups().values(); + synchronized (getGroups()) { + return new ArrayList(getGroups().values()); + } } /** @@ -329,7 +330,9 @@ public Collection getGroupList() { */ public Collection getUserList() { - return getUsers().values(); + synchronized (getUsers()) { + return new ArrayList(getUsers().values()); + } } /** @@ -370,7 +373,7 @@ public void reloadGroups() { Logger.getLogger(WorldDataHolder.class.getName()).log(Level.WARNING, null, ex); } GroupManager.setLoaded(true); - GroupManagerEventHandler.callEvent(GMSystemEvent.Action.RELOADED); + GroupManager.getGMEventHandler().callEvent(GMSystemEvent.Action.RELOADED); } /** @@ -402,7 +405,7 @@ public void reloadUsers() { Logger.getLogger(WorldDataHolder.class.getName()).log(Level.WARNING, null, ex); } GroupManager.setLoaded(true); - GroupManagerEventHandler.callEvent(GMSystemEvent.Action.RELOADED); + GroupManager.getGMEventHandler().callEvent(GMSystemEvent.Action.RELOADED); } public void loadGroups(File groupsFile) { @@ -416,7 +419,7 @@ public void loadGroups(File groupsFile) { throw new IllegalArgumentException("The file which should contain groups does not exist!\n" + groupsFile.getPath()); } catch (IOException e) { e.printStackTrace(); - throw new IllegalArgumentException("Error access the groups file!\n" + groupsFile.getPath()); + throw new IllegalArgumentException("Error accessing the groups file!\n" + groupsFile.getPath()); } GroupManager.setLoaded(true); @@ -433,7 +436,7 @@ public void loadUsers(File usersFile) { throw new IllegalArgumentException("The file which should contain users does not exist!\n" + usersFile.getPath()); } catch (IOException e) { e.printStackTrace(); - throw new IllegalArgumentException("Error access the users file!\n" + usersFile.getPath()); + throw new IllegalArgumentException("Error accessing the users file!\n" + usersFile.getPath()); } GroupManager.setLoaded(true); @@ -509,13 +512,16 @@ protected static void loadGroups(WorldDataHolder ph, File groupsFile) throws Fil throw new IllegalArgumentException("Your " + groupsFile.getPath() + " file is invalid. See console for details.", ex); } + if (allGroupsNode == null) { + throw new IllegalArgumentException("You have no groups in " + groupsFile.getPath() + "."); + } + Iterator groupItr = allGroupsNode.keySet().iterator(); String groupKey; Integer groupCount = 0; /* - * loop each group entry - * and process it's data. + * loop each group entry and process it's data. */ while (groupItr.hasNext()) { @@ -539,8 +545,7 @@ protected static void loadGroups(WorldDataHolder ph, File groupsFile) throws Fil } /* - * Create a new group with this name - * in the assigned data source. + * Create a new group with this name in the assigned data source. */ Group thisGrp = ph.createGroup(groupKey); @@ -563,8 +568,8 @@ protected static void loadGroups(WorldDataHolder ph, File groupsFile) throws Fil */ } else if ((Boolean.parseBoolean(nodeData.toString()))) { /* - * Set this as the default group. - * Warn if some other group has already claimed that position. + * Set this as the default group. Warn if some other group has + * already claimed that position. */ if (ph.getDefaultGroup() != null) { GroupManager.logger.warning("The group '" + thisGrp.getName() + "' is claiming to be default where '" + ph.getDefaultGroup().getName() + "' already was."); @@ -584,8 +589,7 @@ protected static void loadGroups(WorldDataHolder ph, File groupsFile) throws Fil if (nodeData == null) { /* - * If no permissions node is found, or it's empty - * do nothing. + * If no permissions node is found, or it's empty do nothing. */ } else { /* @@ -671,8 +675,8 @@ protected static void loadGroups(WorldDataHolder ph, File groupsFile) throws Fil if (nodeData == null || nodeData instanceof List) { if (nodeData == null) { /* - * If no inheritance node is found, or it's empty - * do nothing. + * If no inheritance node is found, or it's empty do + * nothing. */ } else if (nodeData instanceof List) { @@ -775,20 +779,26 @@ protected static void loadUsers(WorldDataHolder ph, File usersFile) throws FileN Iterator usersItr = allUsersNode.keySet().iterator(); String usersKey; + Object node; Integer userCount = 0; while (usersItr.hasNext()) { try { userCount++; // Attempt to fetch the next user name. - usersKey = usersItr.next(); + node = usersItr.next(); + if (node instanceof Integer) + usersKey = Integer.toString((Integer) node); + else + usersKey = node.toString(); + } catch (Exception ex) { throw new IllegalArgumentException("Invalid node type for user entry (" + userCount + ") in file: " + usersFile.getPath(), ex); } Map thisUserNode = null; try { - thisUserNode = (Map) allUsersNode.get(usersKey); + thisUserNode = (Map) allUsersNode.get(node); } catch (Exception ex) { throw new IllegalArgumentException("Bad format found for user: " + usersKey + " in file: " + usersFile.getPath()); } @@ -809,28 +819,32 @@ protected static void loadUsers(WorldDataHolder ph, File usersFile) throws FileN if (nodeData == null) { /* - * If no permissions node is found, or it's empty - * do nothing. + * If no permissions node is found, or it's empty do + * nothing. */ } else { - if (nodeData instanceof List) { - for (Object o : ((List) nodeData)) { - /* - * Only add this permission if it's not empty - */ - if (!o.toString().isEmpty()) - thisUser.addPermission(o.toString()); - } - } else if (nodeData instanceof String) { - try { + try { + if (nodeData instanceof List) { + for (Object o : ((List) nodeData)) { + /* + * Only add this permission if it's not empty + */ + if (!o.toString().isEmpty()) { + thisUser.addPermission(o.toString()); + } + } + } else if (nodeData instanceof String) { + /* * Only add this permission if it's not empty */ - if (!nodeData.toString().isEmpty()) + if (!nodeData.toString().isEmpty()) { thisUser.addPermission(nodeData.toString()); - } catch (NullPointerException e) { - // Ignore this entry as it's null. + } + } + } catch (NullPointerException e) { + // Ignore this entry as it's null. } thisUser.sortPermissions(); } @@ -846,16 +860,19 @@ protected static void loadUsers(WorldDataHolder ph, File usersFile) throws FileN if (nodeData == null) { /* - * If no subgroups node is found, or it's empty - * do nothing. + * If no subgroups node is found, or it's empty do nothing. */ } else if (nodeData instanceof List) { for (Object o : ((List) nodeData)) { - Group subGrp = ph.getGroup(o.toString()); - if (subGrp != null) { - thisUser.addSubGroup(subGrp); + if (o == null) { + GroupManager.logger.warning("Invalid Subgroup data for user: " + thisUser.getName() + ". Ignoring entry in file: " + usersFile.getPath()); } else { - GroupManager.logger.warning("Subgroup '" + o.toString() + "' not found for user: " + thisUser.getName() + ". Ignoring entry in file: " + usersFile.getPath()); + Group subGrp = ph.getGroup(o.toString()); + if (subGrp != null) { + thisUser.addSubGroup(subGrp); + } else { + GroupManager.logger.warning("Subgroup '" + o.toString() + "' not found for user: " + thisUser.getName() + ". Ignoring entry in file: " + usersFile.getPath()); + } } } } else if (nodeData instanceof String) { @@ -878,8 +895,7 @@ protected static void loadUsers(WorldDataHolder ph, File usersFile) throws FileN if (nodeData == null) { /* - * If no info node is found, or it's empty - * do nothing. + * If no info node is found, or it's empty do nothing. */ } else if (nodeData instanceof Map) { thisUser.setVariables((Map) nodeData); @@ -930,27 +946,29 @@ public static void writeGroups(WorldDataHolder ph, File groupsFile) { Map groupsMap = new HashMap(); root.put("groups", groupsMap); - for (String groupKey : ph.getGroups().keySet()) { - Group group = ph.getGroups().get(groupKey); + synchronized (ph.getGroups()) { + for (String groupKey : ph.getGroups().keySet()) { + Group group = ph.getGroups().get(groupKey); - Map aGroupMap = new HashMap(); - groupsMap.put(group.getName(), aGroupMap); + Map aGroupMap = new HashMap(); + groupsMap.put(group.getName(), aGroupMap); - if (ph.getDefaultGroup() == null) { - GroupManager.logger.severe("There is no default group for world: " + ph.getName()); - } - aGroupMap.put("default", group.equals(ph.getDefaultGroup())); + if (ph.getDefaultGroup() == null) { + GroupManager.logger.severe("There is no default group for world: " + ph.getName()); + } + aGroupMap.put("default", group.equals(ph.getDefaultGroup())); - Map infoMap = new HashMap(); - aGroupMap.put("info", infoMap); + Map infoMap = new HashMap(); + aGroupMap.put("info", infoMap); - for (String infoKey : group.getVariables().getVarKeyList()) { - infoMap.put(infoKey, group.getVariables().getVarObject(infoKey)); - } + for (String infoKey : group.getVariables().getVarKeyList()) { + infoMap.put(infoKey, group.getVariables().getVarObject(infoKey)); + } - aGroupMap.put("inheritance", group.getInherits()); + aGroupMap.put("inheritance", group.getInherits()); - aGroupMap.put("permissions", group.getPermissionList()); + aGroupMap.put("permissions", group.getPermissionList()); + } } if (!root.isEmpty()) { @@ -987,21 +1005,12 @@ public static void writeGroups(WorldDataHolder ph, File groupsFile) { ph.removeGroupsChangedFlag(); if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED); + GroupManager.getGMEventHandler().callEvent(GMSystemEvent.Action.SAVED); /* - * FileWriter tx = null; - * try { - * tx = new FileWriter(groupsFile, false); - * tx.write(yaml.dump(root)); - * tx.flush(); - * } catch (Exception e) { - * } finally { - * try { - * tx.close(); - * } catch (IOException ex) { - * } - * } + * FileWriter tx = null; try { tx = new FileWriter(groupsFile, false); + * tx.write(yaml.dump(root)); tx.flush(); } catch (Exception e) { } + * finally { try { tx.close(); } catch (IOException ex) { } } */ } @@ -1014,37 +1023,45 @@ public static void writeGroups(WorldDataHolder ph, File groupsFile) { public static void writeUsers(WorldDataHolder ph, File usersFile) { Map root = new HashMap(); - - Map usersMap = new HashMap(); + LinkedHashMap usersMap = new LinkedHashMap(); + root.put("users", usersMap); - for (String userKey : ph.getUsers().keySet()) { - User user = ph.getUsers().get(userKey); - if ((user.getGroup() == null || user.getGroup().equals(ph.getDefaultGroup())) && user.getPermissionList().isEmpty() && user.getVariables().isEmpty() && user.isSubGroupsEmpty()) { - continue; - } + synchronized (ph.getUsers()) { + + // A sorted list of users. + for (String userKey : new TreeSet(ph.getUsers().keySet())) { + User user = ph.getUsers().get(userKey); + if ((user.getGroup() == null || user.getGroup().equals(ph.getDefaultGroup())) && user.getPermissionList().isEmpty() && user.getVariables().isEmpty() && user.isSubGroupsEmpty()) { + continue; + } - Map aUserMap = new HashMap(); - usersMap.put(user.getName(), aUserMap); + LinkedHashMap aUserMap = new LinkedHashMap(); + usersMap.put(user.getName(), aUserMap); - if (user.getGroup() == null) { - aUserMap.put("group", ph.getDefaultGroup().getName()); - } else { - aUserMap.put("group", user.getGroup().getName()); - } - // USER INFO NODE - BETA - if (user.getVariables().getSize() > 0) { - Map infoMap = new HashMap(); - aUserMap.put("info", infoMap); - for (String infoKey : user.getVariables().getVarKeyList()) { - infoMap.put(infoKey, user.getVariables().getVarObject(infoKey)); + // GROUP NODE + if (user.getGroup() == null) { + aUserMap.put("group", ph.getDefaultGroup().getName()); + } else { + aUserMap.put("group", user.getGroup().getName()); } - } - // END USER INFO NODE - BETA - aUserMap.put("permissions", user.getPermissionList()); - // SUBGROUPS NODE - BETA - aUserMap.put("subgroups", user.subGroupListStringCopy()); - // END SUBGROUPS NODE - BETA + // SUBGROUPS NODE + aUserMap.put("subgroups", user.subGroupListStringCopy()); + + // PERMISSIONS NODE + aUserMap.put("permissions", user.getPermissionList()); + + // USER INFO NODE - BETA + if (user.getVariables().getSize() > 0) { + Map infoMap = new HashMap(); + aUserMap.put("info", infoMap); + for (String infoKey : user.getVariables().getVarKeyList()) { + infoMap.put(infoKey, user.getVariables().getVarObject(infoKey)); + } + } + // END USER INFO NODE - BETA + + } } if (!root.isEmpty()) { @@ -1067,35 +1084,23 @@ public static void writeUsers(WorldDataHolder ph, File usersFile) { ph.removeUsersChangedFlag(); if (GroupManager.isLoaded()) - GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED); + GroupManager.getGMEventHandler().callEvent(GMSystemEvent.Action.SAVED); /* - * FileWriter tx = null; - * try { - * tx = new FileWriter(usersFile, false); - * tx.write(yaml.dump(root)); - * tx.flush(); - * } catch (Exception e) { - * } finally { - * try { - * tx.close(); - * } catch (IOException ex) { - * } - * } + * FileWriter tx = null; try { tx = new FileWriter(usersFile, false); + * tx.write(yaml.dump(root)); tx.flush(); } catch (Exception e) { } + * finally { try { tx.close(); } catch (IOException ex) { } } */ } /** * Don't use this. Unless you want to make this plugin to interact with - * original Nijikokun Permissions - * This method is supposed to make the original one reload the file, and - * propagate the changes made here. + * original Nijikokun Permissions This method is supposed to make the + * original one reload the file, and propagate the changes made here. * * Prefer to use the AnjoCaido's fake version of Nijikokun's Permission - * plugin. - * The AnjoCaido's Permission can propagate the changes made on this plugin - * instantly, - * without need to save the file. + * plugin. The AnjoCaido's Permission can propagate the changes made on this + * plugin instantly, without need to save the file. * * @param server the server that holds the plugin * @deprecated it is not used anymore... unless if you use original @@ -1145,9 +1150,11 @@ public boolean haveUsersChanged() { if (users.HaveUsersChanged()) { return true; } - for (User u : users.getUsers().values()) { - if (u.isChanged()) { - return true; + synchronized (users.getUsers()) { + for (User u : users.getUsers().values()) { + if (u.isChanged()) { + return true; + } } } return false; @@ -1170,9 +1177,11 @@ public boolean haveGroupsChanged() { if (groups.HaveGroupsChanged()) { return true; } - for (Group g : groups.getGroups().values()) { - if (g.isChanged()) { - return true; + synchronized (groups.getGroups()) { + for (Group g : groups.getGroups().values()) { + if (g.isChanged()) { + return true; + } } } return false; @@ -1184,8 +1193,10 @@ public boolean haveGroupsChanged() { public void removeUsersChangedFlag() { setUsersChanged(false); - for (User u : getUsers().values()) { - u.flagAsSaved(); + synchronized (getUsers()) { + for (User u : getUsers().values()) { + u.flagAsSaved(); + } } } @@ -1195,8 +1206,10 @@ public void removeUsersChangedFlag() { public void removeGroupsChangedFlag() { setGroupsChanged(false); - for (Group g : getGroups().values()) { - g.flagAsSaved(); + synchronized (getGroups()) { + for (Group g : getGroups().values()) { + g.flagAsSaved(); + } } } @@ -1246,7 +1259,7 @@ public String getName() { public void resetGroups() { // setDefaultGroup(null); - groups.setGroups(new HashMap()); + groups.resetGroups(); } /** @@ -1254,10 +1267,12 @@ public void resetGroups() { */ public void resetUsers() { - users.setUsers(new HashMap()); + users.resetUsers(); } /** + * Note: Iteration over this object has to be synchronized! + * * @return the groups */ public Map getGroups() { @@ -1266,6 +1281,8 @@ public Map getGroups() { } /** + * Note: Iteration over this object has to be synchronized! + * * @return the users */ public Map getUsers() { diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index 27a7d9a598..d173307f26 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -22,7 +22,6 @@ import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler; import org.anjocaido.groupmanager.utils.Tasks; import org.bukkit.World; -import org.bukkit.configuration.MemorySection; import org.bukkit.entity.Player; /** @@ -60,6 +59,28 @@ public WorldsHolder(GroupManager plugin) { resetWorldsHolder(); } + /** + * @return the mirrorsGroup + */ + public Map getMirrorsGroup() { + + return mirrorsGroup; + } + + + /** + * @return the mirrorsUser + */ + public Map getMirrorsUser() { + + return mirrorsUser; + } + + public boolean isWorldKnown(String name) { + + return worldsData.containsKey(name.toLowerCase()); + } + public void resetWorldsHolder() { worldsData = new HashMap(); @@ -93,29 +114,46 @@ private void initialWorldLoading() { private void loadAllSearchedWorlds() { /* - * Read all known worlds from Bukkit - * Create the data files if they don't already exist, - * and they are not mirrored. + * Read all known worlds from Bukkit Create the data files if they don't + * already exist, and they are not mirrored. */ - for (World world : plugin.getServer().getWorlds()) - if ((!worldsData.containsKey(world.getName().toLowerCase())) && ((!mirrorsGroup.containsKey(world.getName().toLowerCase())) || (!mirrorsUser.containsKey(world.getName().toLowerCase())))) + for (World world : plugin.getServer().getWorlds()) { + GroupManager.logger.log(Level.FINE, "Checking data for " + world.getName() + "."); + if ((!worldsData.containsKey(world.getName().toLowerCase())) && ((!mirrorsGroup.containsKey(world.getName().toLowerCase())) || (!mirrorsUser.containsKey(world.getName().toLowerCase())))) { + + if (worldsData.containsKey("all_unnamed_worlds")) { + + String usersMirror = mirrorsUser.get("all_unnamed_worlds"); + String groupsMirror = mirrorsGroup.get("all_unnamed_worlds"); + + if (usersMirror != null) + mirrorsUser.put(world.getName().toLowerCase(), usersMirror); + + if (groupsMirror != null) + mirrorsGroup.put(world.getName().toLowerCase(), groupsMirror); + + } + + GroupManager.logger.log(Level.FINE, "Creating folders for " + world.getName() + "."); setupWorldFolder(world.getName()); + } + } /* - * Loop over all folders within the worlds folder - * and attempt to load the world data + * Loop over all folders within the worlds folder and attempt to load + * the world data */ for (File folder : worldsFolder.listFiles()) { - if (folder.isDirectory()) { + if (folder.isDirectory() && !folder.getName().startsWith(".")) { GroupManager.logger.info("World Found: " + folder.getName()); /* - * don't load any worlds which are already loaded - * or fully mirrored worlds that don't need data. + * don't load any worlds which are already loaded or fully + * mirrored worlds that don't need data. */ if (!worldsData.containsKey(folder.getName().toLowerCase()) && ((!mirrorsGroup.containsKey(folder.getName().toLowerCase())) || (!mirrorsUser.containsKey(folder.getName().toLowerCase())))) { /* - * Call setupWorldFolder to check case sensitivity - * and convert to lower case, before we attempt to load this + * Call setupWorldFolder to check case sensitivity and + * convert to lower case, before we attempt to load this * world. */ setupWorldFolder(folder.getName()); @@ -164,12 +202,12 @@ public void mirrorSetUp() { } else GroupManager.logger.log(Level.WARNING, "Mirroring error with " + o.toString() + ". Recursive loop detected!"); } - } else if (mirrorsMap.get(source) instanceof MemorySection) { - MemorySection subSection = (MemorySection) mirrorsMap.get(source); + } else if (mirrorsMap.get(source) instanceof Map) { + Map subSection = (Map) mirrorsMap.get(source); - for (String key : subSection.getKeys(true)) { + for (Object key : subSection.keySet()) { - if (key.toLowerCase() != serverDefaultWorldName) { + if (((String)key).toLowerCase() != serverDefaultWorldName) { if (subSection.get(key) instanceof ArrayList) { ArrayList mirrorList = (ArrayList) subSection.get(key); @@ -179,28 +217,32 @@ public void mirrorSetUp() { String type = o.toString().toLowerCase(); try { if (type.equals("groups")) - mirrorsGroup.remove(key.toLowerCase()); + mirrorsGroup.remove(((String)key).toLowerCase()); if (type.equals("users")) - mirrorsUser.remove(key.toLowerCase()); + mirrorsUser.remove(((String)key).toLowerCase()); } catch (Exception e) { } - if (type.equals("groups")) - mirrorsGroup.put(key.toLowerCase(), getWorldData(source).getName()); + if (type.equals("groups")) { + mirrorsGroup.put(((String)key).toLowerCase(), getWorldData(source).getName()); + GroupManager.logger.log(Level.FINE, "Adding groups mirror for " + key + "."); + } - if (type.equals("users")) - mirrorsUser.put(key.toLowerCase(), getWorldData(source).getName()); + if (type.equals("users")) { + mirrorsUser.put(((String)key).toLowerCase(), getWorldData(source).getName()); + GroupManager.logger.log(Level.FINE, "Adding users mirror for " + key + "."); + } } // Track this world so we can create a datasource for it later - mirroredWorlds.add(key); + mirroredWorlds.add((String)key); } else - GroupManager.logger.log(Level.WARNING, "Mirroring error with " + key + ". Recursive loop detected!"); + throw new IllegalStateException("Unknown mirroring format for " + (String)key); } else { - throw new IllegalStateException("Unknown mirroring format for " + key); + GroupManager.logger.log(Level.WARNING, "Mirroring error with " + (String)key + ". Recursive loop detected!"); } } @@ -210,6 +252,7 @@ public void mirrorSetUp() { // Create a datasource for any worlds not already loaded for (String world : mirroredWorlds) { if (!worldsData.containsKey(world.toLowerCase())) { + GroupManager.logger.log(Level.FINE, "No data for " + world + "."); setupWorldFolder(world); loadWorld(world, true); } @@ -264,8 +307,9 @@ public void saveChanges() { /** * */ - public void saveChanges(boolean overwrite) { + public boolean saveChanges(boolean overwrite) { + boolean changed = false; ArrayList alreadyDone = new ArrayList(); Tasks.removeOldFiles(plugin, plugin.getBackupFolder()); @@ -294,6 +338,7 @@ public void saveChanges(boolean overwrite) { backupFile(w, true); WorldDataHolder.writeGroups(w, w.getGroupsFile()); + changed = true; //w.removeGroupsChangedFlag(); } else { // Newer file found. @@ -307,6 +352,7 @@ public void saveChanges(boolean overwrite) { // Backup Groups file backupFile(w, true); w.reloadGroups(); + changed = true; } } if (!mirrorsUser.containsKey(w.getName().toLowerCase())) @@ -316,6 +362,7 @@ public void saveChanges(boolean overwrite) { backupFile(w, false); WorldDataHolder.writeUsers(w, w.getUsersFile()); + changed = true; //w.removeUsersChangedFlag(); } else { // Newer file found. @@ -329,10 +376,12 @@ public void saveChanges(boolean overwrite) { // Backup Users file backupFile(w, false); w.reloadUsers(); + changed = true; } } alreadyDone.add(w); } + return changed; } /** @@ -369,8 +418,14 @@ public OverloadedWorldHolder getWorldData(String worldName) { // Find this worlds data if (worldsData.containsKey(worldNameLowered)) return getUpdatedWorldData(worldNameLowered); - - // Oddly no data source was found for this world so return the default. + + // Oddly no data source was found for this world so attempt to return the global mirror. + if (worldsData.containsKey("all_unnamed_worlds")) { + GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning all_unnamed_worlds world..."); + return getUpdatedWorldData("all_unnamed_worlds"); + } + + // Oddly no data source or global mirror was found for this world so return the default. GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world..."); return getDefaultWorld(); } @@ -463,14 +518,22 @@ public AnjoPermissionsHandler getWorldPermissionsByPlayerName(String playerName) private void verifyFirstRun() { - Properties server = new Properties(); - try { - server.load(new FileInputStream(new File("server.properties"))); - serverDefaultWorldName = server.getProperty("level-name").toLowerCase(); - setupWorldFolder(serverDefaultWorldName); - } catch (IOException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); + /* Do not use the folder name if this + * is a Bukkit Forge server. + */ + if (plugin.getServer().getName().equalsIgnoreCase("BukkitForge")) { + serverDefaultWorldName = "overworld"; + + } else { + Properties server = new Properties(); + try { + server.load(new FileInputStream(new File("server.properties"))); + serverDefaultWorldName = server.getProperty("level-name").toLowerCase(); + } catch (IOException ex) { + GroupManager.logger.log(Level.SEVERE, null, ex); + } } + setupWorldFolder(serverDefaultWorldName); } @@ -606,7 +669,7 @@ public void loadWorld(String worldName, Boolean isMirror) { throw new IllegalArgumentException("Users file for world '" + worldName + "' doesnt exist: " + usersFile.getPath()); } - WorldDataHolder tempHolder = new WorldDataHolder(worldName); + WorldDataHolder tempHolder = new WorldDataHolder(worldNameLowered); // Map the group object for any mirror if (mirrorsGroup.containsKey(worldNameLowered)) @@ -677,41 +740,53 @@ public OverloadedWorldHolder getDefaultWorld() { } /** - * Returns all physically loaded worlds which have at least - * one of their own data sets for users or groups. + * Returns all physically loaded worlds which have at least one of their own + * data sets for users or groups which isn't an identical mirror. * * @return ArrayList of all loaded worlds */ public ArrayList allWorldsDataList() { ArrayList list = new ArrayList(); - for (OverloadedWorldHolder data : worldsData.values()) { - if ((!list.contains(data)) && (!mirrorsGroup.containsKey(data.getName().toLowerCase()) || !mirrorsUser.containsKey(data.getName().toLowerCase()))) { - String worldNameLowered = data.getName().toLowerCase(); - String usersMirror = mirrorsUser.get(worldNameLowered); - String groupsMirror = mirrorsGroup.get(worldNameLowered); + for (String world : worldsData.keySet()) { + + if (!world.equalsIgnoreCase("all_unnamed_worlds")) { + + // Fetch the relevant world object + OverloadedWorldHolder data = getWorldData(world); + + if (!list.contains(data)) { + + String worldNameLowered = data.getName().toLowerCase(); + String usersMirror = mirrorsUser.get(worldNameLowered); + String groupsMirror = mirrorsGroup.get(worldNameLowered); + + // is users mirrored? + if (usersMirror != null) { - // is users mirrored? - if (usersMirror != null) { + // If both are mirrored + if (groupsMirror != null) { - // If both are mirrored - if (groupsMirror != null) { + // if the data sources are the same, return the parent + if (usersMirror == groupsMirror) { + data = getWorldData(usersMirror.toLowerCase()); - // if the data sources are the same, return the parent - if (usersMirror == groupsMirror) { - if (!list.contains(usersMirror.toLowerCase())) - list.add(worldsData.get(usersMirror.toLowerCase())); - continue; + // Only add the parent if it's not already listed. + if (!list.contains(data)) + list.add(data); + + continue; + } + // Both data sources are mirrors, but they are from different parents + // so fall through to add the actual data object. } - // Both data sources are mirrors, but they are from different parents - // so fall through to add the actual data object. + // Groups isn't a mirror so fall through to add this this worlds data source } - // Groups isn't a mirror so fall through to add this this worlds data source - } - // users isn't mirrored so we need to add this worlds data source - list.add(data); + // users isn't mirrored so we need to add this worlds data source + list.add(data); + } } } return list; diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java index af3fb6135d..fe7c98640e 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java @@ -2,7 +2,6 @@ import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.data.Group; -import org.bukkit.Bukkit; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -74,14 +73,16 @@ public enum Action { public void schedule(final GMGroupEvent event) { - if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() { - - @Override - public void run() { - - Bukkit.getServer().getPluginManager().callEvent(event); - } - }, 1) == -1) - GroupManager.logger.warning("Could not schedule GM Event."); + synchronized (GroupManager.getGMEventHandler().getServer()) { + if (GroupManager.getGMEventHandler().getServer().getScheduler().scheduleSyncDelayedTask(GroupManager.getGMEventHandler().getPlugin(), new Runnable() { + + @Override + public void run() { + + GroupManager.getGMEventHandler().getServer().getPluginManager().callEvent(event); + } + }, 1) == -1) + GroupManager.logger.warning("Could not schedule GM Event."); + } } } \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java index d11581356b..a04190d99f 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java @@ -1,7 +1,6 @@ package org.anjocaido.groupmanager.events; import org.anjocaido.groupmanager.GroupManager; -import org.bukkit.Bukkit; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -34,7 +33,7 @@ public static HandlerList getHandlerList() { public GMSystemEvent(Action action) { super(); - + this.action = action; } @@ -49,14 +48,16 @@ public enum Action { public void schedule(final GMSystemEvent event) { - if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() { - - @Override - public void run() { - - Bukkit.getServer().getPluginManager().callEvent(event); - } - }, 1) == -1) - GroupManager.logger.warning("Could not schedule GM Event."); + synchronized (GroupManager.getGMEventHandler().getServer()) { + if (GroupManager.getGMEventHandler().getServer().getScheduler().scheduleSyncDelayedTask(GroupManager.getGMEventHandler().getPlugin(), new Runnable() { + + @Override + public void run() { + + GroupManager.getGMEventHandler().getServer().getPluginManager().callEvent(event); + } + }, 1) == -1) + GroupManager.logger.warning("Could not schedule GM Event."); + } } } \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java index 361e7d4cc3..12c9baa0e8 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java @@ -2,7 +2,6 @@ import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.data.User; -import org.bukkit.Bukkit; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -74,14 +73,16 @@ public enum Action { public void schedule(final GMUserEvent event) { - if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() { - - @Override - public void run() { - - Bukkit.getServer().getPluginManager().callEvent(event); - } - }, 1) == -1) - GroupManager.logger.warning("Could not schedule GM Event."); + synchronized (GroupManager.getGMEventHandler().getServer()) { + if (GroupManager.getGMEventHandler().getServer().getScheduler().scheduleSyncDelayedTask(GroupManager.getGMEventHandler().getPlugin(), new Runnable() { + + @Override + public void run() { + + GroupManager.getGMEventHandler().getServer().getPluginManager().callEvent(event); + } + }, 1) == -1) + GroupManager.logger.warning("Could not schedule GM Event."); + } } } \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMWorldListener.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMWorldListener.java index f7a7109ab0..51937bd677 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMWorldListener.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMWorldListener.java @@ -35,8 +35,24 @@ public void onWorldInit(WorldInitEvent event) { if (GroupManager.isLoaded() && !plugin.getWorldsHolder().isInList(worldName)) { GroupManager.logger.info("New world detected..."); GroupManager.logger.info("Creating data for: " + worldName); + + if (plugin.getWorldsHolder().isWorldKnown("all_unnamed_worlds")) { + + String usersMirror = plugin.getWorldsHolder().getMirrorsUser().get("all_unnamed_worlds"); + String groupsMirror = plugin.getWorldsHolder().getMirrorsGroup().get("all_unnamed_worlds"); + + if (usersMirror != null) + plugin.getWorldsHolder().getMirrorsUser().put(worldName.toLowerCase(), usersMirror); + + if (groupsMirror != null) + plugin.getWorldsHolder().getMirrorsGroup().put(worldName.toLowerCase(), groupsMirror); + + } + plugin.getWorldsHolder().setupWorldFolder(worldName); plugin.getWorldsHolder().loadWorld(worldName); + + if (plugin.getWorldsHolder().isInList(worldName)) { GroupManager.logger.info("Don't forget to configure/mirror this world in config.yml."); } else diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java index 5fc555cc4a..d0df57aa78 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java @@ -1,7 +1,9 @@ package org.anjocaido.groupmanager.events; +import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.data.Group; import org.anjocaido.groupmanager.data.User; +import org.bukkit.Server; /** * @author ElgarL @@ -10,44 +12,73 @@ * */ public class GroupManagerEventHandler { + + private final Server server; + private final GroupManager plugin; + + + public GroupManagerEventHandler(GroupManager plugin) { + + this.plugin = plugin; + this.server = plugin.getServer(); + + } - protected static void callEvent(GMGroupEvent event) { + protected void callEvent(GMGroupEvent event) { event.schedule(event); } - protected static void callEvent(GMUserEvent event) { + protected void callEvent(GMUserEvent event) { event.schedule(event); } - protected static void callEvent(GMSystemEvent event) { + protected void callEvent(GMSystemEvent event) { event.schedule(event); } - public static void callEvent(Group group, GMGroupEvent.Action action) { + public void callEvent(Group group, GMGroupEvent.Action action) { callEvent(new GMGroupEvent(group, action)); } - public static void callEvent(String groupName, GMGroupEvent.Action action) { + public void callEvent(String groupName, GMGroupEvent.Action action) { callEvent(new GMGroupEvent(groupName, action)); } - public static void callEvent(User user, GMUserEvent.Action action) { + public void callEvent(User user, GMUserEvent.Action action) { callEvent(new GMUserEvent(user, action)); } - public static void callEvent(String userName, GMUserEvent.Action action) { + public void callEvent(String userName, GMUserEvent.Action action) { callEvent(new GMUserEvent(userName, action)); } - public static void callEvent(GMSystemEvent.Action action) { + public void callEvent(GMSystemEvent.Action action) { callEvent(new GMSystemEvent(action)); } + + /** + * @return the plugin + */ + public GroupManager getPlugin() { + + return plugin; + } + + /** + * @return the server + */ + public Server getServer() { + + return server; + } + + } \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java index efad11df47..bef2fb7130 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java @@ -16,6 +16,7 @@ import org.anjocaido.groupmanager.dataholder.WorldDataHolder; import org.anjocaido.groupmanager.data.User; import org.anjocaido.groupmanager.utils.PermissionCheckResult; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; /** @@ -171,6 +172,8 @@ private Set populatePerms(List permsList, boolean includeChildre permArray.addAll(GroupManager.BukkitPermissions.getAllRegisteredPermissions(includeChildren)); allPerms = true; perms.remove("*"); + // Remove the no offline perms node as this should not be given. + perms.remove("groupmanager.noofflineperms"); } for (String perm : perms) { @@ -705,6 +708,7 @@ public PermissionCheckResult checkUserOnlyPermission(User user, String permissio for (String access : user.getPermissionList()) { result.resultType = comparePermissionString(access, permission); if (result.resultType != PermissionCheckResult.Type.NOTFOUND) { + result.accessLevel = access; return result; } } @@ -729,6 +733,7 @@ public PermissionCheckResult checkGroupOnlyPermission(Group group, String permis for (String access : group.getPermissionList()) { result.resultType = comparePermissionString(access, permission); if (result.resultType != PermissionCheckResult.Type.NOTFOUND) { + result.accessLevel = access; return result; } } @@ -767,6 +772,9 @@ public PermissionCheckResult checkFullUserPermission(User user, String targetPer } /** + * Wrapper for offline server checks. + * Looks for the 'groupmanager.noofflineperms' permissions and reports no permissions on servers set to offline. + * * Check user and groups with inheritance and Bukkit if bukkit = true return * a PermissionCheckResult. * @@ -777,14 +785,42 @@ public PermissionCheckResult checkFullUserPermission(User user, String targetPer */ public PermissionCheckResult checkFullGMPermission(User user, String targetPermission, Boolean checkBukkit) { - PermissionCheckResult result = new PermissionCheckResult(); - result.accessLevel = targetPermission; - result.resultType = PermissionCheckResult.Type.NOTFOUND; - - if (user == null || targetPermission == null || targetPermission.isEmpty()) { + /* + * Report no permissions under the following conditions. + * + * We are in offline mode + * and the player has the 'groupmanager.noofflineperms' permission. + */ + if (user == null || targetPermission == null || targetPermission.isEmpty() + || (!Bukkit.getServer().getOnlineMode() + && (checkPermission(user, "groupmanager.noofflineperms", false).resultType == PermissionCheckResult.Type.FOUND))) { + + PermissionCheckResult result = new PermissionCheckResult(); + result.accessLevel = targetPermission; + result.resultType = PermissionCheckResult.Type.NOTFOUND; + return result; } + + return checkPermission(user, targetPermission, checkBukkit); + } + /** + * + * Check user and groups with inheritance and Bukkit if bukkit = true return + * a PermissionCheckResult. + * + * @param user + * @param targetPermission + * @param checkBukkit + * @return PermissionCheckResult + */ + private PermissionCheckResult checkPermission(User user, String targetPermission, Boolean checkBukkit) { + + PermissionCheckResult result = new PermissionCheckResult(); + result.accessLevel = targetPermission; + result.resultType = PermissionCheckResult.Type.NOTFOUND; + if (checkBukkit) { // Check Bukkit perms to support plugins which add perms via code // (Heroes). @@ -920,6 +956,7 @@ public PermissionCheckResult checkGroupPermissionWithInheritance(Group start, St Group now = stack.pop(); PermissionCheckResult resultNow = checkGroupOnlyPermission(now, targetPermission); if (!resultNow.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { + resultNow.accessLevel = targetPermission; return resultNow; } for (String sonName : now.getInherits()) { @@ -1002,6 +1039,15 @@ public PermissionCheckResult.Type comparePermissionString(String userAccessLevel userAccessLevelOffset = 1; result = PermissionCheckResult.Type.NEGATION; } + + if (fullPermissionName.equals(userAccessLevel)) { + return result; + } + + if ("groupmanager.noofflineperms".equals(fullPermissionName)) { + result = PermissionCheckResult.Type.NOTFOUND; + } + if ("*".regionMatches(0, userAccessLevel, userAccessLevelOffset, userAccessLevelLength - userAccessLevelOffset)) { return result; } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index 05e1522866..03742b023d 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -32,7 +31,6 @@ import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.data.User; - import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -40,7 +38,6 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginEnableEvent; @@ -57,7 +54,7 @@ */ public class BukkitPermissions { - protected WeakHashMap attachments = new WeakHashMap(); + protected WeakHashMap attachments = new WeakHashMap(); protected LinkedHashMap registeredPermissions = new LinkedHashMap(); protected GroupManager plugin; protected boolean dumpAllPermissions = true; @@ -105,6 +102,11 @@ public BukkitPermissions(GroupManager plugin) { } public void reset() { + + /* + * collect new permissions + * and register all attachments. + */ this.collectPermissions(); this.updateAllPlayers(); } @@ -134,8 +136,7 @@ public void updatePermissions(Player player) { /** * Push all permissions which are registered with GM for this player, on - * this world to Bukkit - * and make it update for the child nodes. + * this world to Bukkit and make it update for the child nodes. * * @param player * @param world @@ -145,20 +146,22 @@ public void updatePermissions(Player player, String world) { if (player == null || !GroupManager.isLoaded()) { return; } - + + String name = player.getName(); + // Reset the User objects player reference. - User user = plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(player.getName()); + User user = plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(name); if (user != null) user.updatePlayer(player); PermissionAttachment attachment; // Find the players current attachment, or add a new one. - if (this.attachments.containsKey(player)) { - attachment = this.attachments.get(player); + if (this.attachments.containsKey(name)) { + attachment = this.attachments.get(name); } else { attachment = player.addAttachment(plugin); - this.attachments.put(player, attachment); + this.attachments.put(name, attachment); } if (world == null) { @@ -167,10 +170,11 @@ public void updatePermissions(Player player, String world) { // Add all permissions for this player (GM only) // child nodes will be calculated by Bukkit. - List playerPermArray = new ArrayList(plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getAllPlayersPermissions(player.getName(), false)); + List playerPermArray = new ArrayList(plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getAllPlayersPermissions(name, false)); LinkedHashMap newPerms = new LinkedHashMap(); - // Sort the perm list by parent/child, so it will push to superperms correctly. + // Sort the perm list by parent/child, so it will push to superperms + // correctly. playerPermArray = sort(playerPermArray); Boolean value = false; @@ -178,27 +182,44 @@ public void updatePermissions(Player player, String world) { value = (!permission.startsWith("-")); newPerms.put((value ? permission : permission.substring(1)), value); } + + /* + * Do not push any perms to bukkit if... + * We are in offline mode + * and the player has the 'groupmanager.noofflineperms' permission. + */ + if (!Bukkit.getServer().getOnlineMode() + && (newPerms.containsKey("groupmanager.noofflineperms") && (newPerms.get("groupmanager.noofflineperms") == true))) { + removeAttachment(name); + return; + } + /** * This is put in place until such a time as Bukkit pull 466 is - * implemented - * https://github.com/Bukkit/Bukkit/pull/466 + * implemented https://github.com/Bukkit/Bukkit/pull/466 */ try { // Codename_B source - @SuppressWarnings("unchecked") - Map orig = (Map) permissions.get(attachment); - // Clear the map (faster than removing the attachment and recalculating) - orig.clear(); - // Then whack our map into there - orig.putAll(newPerms); - // That's all folks! - //attachment.getPermissible().recalculatePermissions(); - player.recalculatePermissions(); + synchronized (attachment.getPermissible()) { + + @SuppressWarnings("unchecked") + Map orig = (Map) permissions.get(attachment); + // Clear the map (faster than removing the attachment and + // recalculating) + orig.clear(); + // Then whack our map into there + orig.putAll(newPerms); + // That's all folks! + attachment.getPermissible().recalculatePermissions(); + + } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } + + GroupManager.logger.finest("Attachment updated for: " + name); } /** @@ -212,26 +233,31 @@ private List sort(List permList) { List result = new ArrayList(); for (String key : permList) { - String a = key.charAt(0) == '-' ? key.substring(1) : key; - Map allchildren = GroupManager.BukkitPermissions.getAllChildren(a, new HashSet()); - if (allchildren != null) { - - ListIterator itr = result.listIterator(); - - while (itr.hasNext()) { - String node = (String) itr.next(); - String b = node.charAt(0) == '-' ? node.substring(1) : node; - - // Insert the parent node before the child - if (allchildren.containsKey(b)) { - itr.set(key); - itr.add(node); - break; + /* + * Ignore stupid plugins which add empty permission nodes. + */ + if (!key.isEmpty()) { + String a = key.charAt(0) == '-' ? key.substring(1) : key; + Map allchildren = GroupManager.BukkitPermissions.getAllChildren(a, new HashSet()); + if (allchildren != null) { + + ListIterator itr = result.listIterator(); + + while (itr.hasNext()) { + String node = (String) itr.next(); + String b = node.charAt(0) == '-' ? node.substring(1) : node; + + // Insert the parent node before the child + if (allchildren.containsKey(b)) { + itr.set(key); + itr.add(node); + break; + } } } + if (!result.contains(key)) + result.add(key); } - if (!result.contains(key)) - result.add(key); } return result; @@ -373,18 +399,11 @@ public void updatePlayer(Player player) { * * @param player */ - private void removeAttachment(Player player) { - - if (attachments.containsKey(player)) { - try { - player.removeAttachment(attachments.get(player)); - } catch (IllegalArgumentException e) { - /* - * Failed to remove attachment - * This usually means Bukkit no longer knows of it. - */ - } - attachments.remove(player); + private void removeAttachment(String playerName) { + + if (attachments.containsKey(playerName)) { + attachments.get(playerName).remove(); + attachments.remove(playerName); } } @@ -393,18 +412,11 @@ private void removeAttachment(Player player) { */ public void removeAllAttachments() { - Iterator itr = attachments.keySet().iterator(); - - while (itr.hasNext()) { - Player player = itr.next(); - try { - player.removeAttachment(attachments.get(player)); - } catch (IllegalArgumentException e) { - /* - * Failed to remove attachment - * This usually means Bukkit no longer knows of it. - */ - } + /* + * Remove all attachments. + */ + for (String key : attachments.keySet()) { + attachments.get(key).remove(); } attachments.clear(); } @@ -420,13 +432,17 @@ protected class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.LOWEST) public void onPlayerJoin(PlayerJoinEvent event) { + + setPlayer_join(true); Player player = event.getPlayer(); + + GroupManager.logger.finest("Player Join event: " + player.getName()); /* * Tidy up any lose ends */ - removeAttachment(player); + removeAttachment(player.getName()); // force GM to create the player if they are not already listed. if (plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(player.getName()) != null) { @@ -441,19 +457,11 @@ public void onPlayerChangeWorld(PlayerChangedWorldEvent event) { // has changed updatePermissions(event.getPlayer(), event.getPlayer().getWorld().getName()); } - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerKick(PlayerKickEvent event) { - - Player player = event.getPlayer(); - - /* - * force remove any attachments as bukkit may not - */ - removeAttachment(player); - } - - @EventHandler(priority = EventPriority.LOWEST) + + /* + * Trigger at highest so we tidy up last. + */ + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerQuit(PlayerQuitEvent event) { if (!GroupManager.isLoaded()) @@ -464,7 +472,7 @@ public void onPlayerQuit(PlayerQuitEvent event) { /* * force remove any attachments as bukkit may not */ - removeAttachment(player); + removeAttachment(player.getName()); } } @@ -488,4 +496,4 @@ public void onPluginDisable(PluginDisableEvent event) { } } -} \ No newline at end of file +} diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GroupManagerPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GroupManagerPermissions.java index 4a7298b9c9..19d8d5ed07 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GroupManagerPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GroupManagerPermissions.java @@ -19,10 +19,12 @@ public enum GroupManagerPermissions { mangdel, manuaddp, manudelp, + manuclearp, manulistp, manucheckp, mangaddp, mangdelp, + mangclearp, manglistp, mangcheckp, mangaddi, @@ -49,5 +51,6 @@ public enum GroupManagerPermissions { mantogglesave, manworld, manselect, - manclear + manclear, + mancheckw } diff --git a/EssentialsGroupManager/src/plugin.yml b/EssentialsGroupManager/src/plugin.yml index f7faa58969..c3443f3bdc 100644 --- a/EssentialsGroupManager/src/plugin.yml +++ b/EssentialsGroupManager/src/plugin.yml @@ -9,7 +9,7 @@ authors: - ElgarL commands: manuadd: - description: Move a player to desired group.(Adds to the file if not exists) + description: Move a player to desired group. (Adds to the file if not exists) usage: / | optional [world] permissions: groupmanager.manuadd manudel: @@ -29,17 +29,21 @@ commands: usage: / permissions: groupmanager.mangadd mangdel: - description: Removes group from the system(all it's users become default) + description: Removes group from the system (all it's users become default) usage: / permissions: groupmanager.mangdel manuaddp: - description: Add permissions diretly to the player. + description: Add permissions directly to the player. usage: / permissions: groupmanager.manuaddp manudelp: - description: Removes permissions diretly from the player. + description: Removes permissions directly from the player. usage: / permissions: groupmanager.manudelp + manuclearp: + description: Removes all permissions of a player. + usage: / + permissions: groupmanager.manuclearp manulistp: description: List all permissionss from a player. usage: / @@ -56,6 +60,10 @@ commands: description: Removes permissions from a group. usage: / permissions: groupmanager.mangdelp + mangclearp: + description: Removes all permissions of a group. + usage: / + permissions: groupmanager.mangdelp manglistp: description: Lists all permissionss from a group. usage: / @@ -133,6 +141,7 @@ commands: usage: / [world] permissions: groupmanager.manload listgroups: + aliases: [manlistg] description: List the groups available. usage: / permissions: groupmanager.listgroups @@ -149,7 +158,7 @@ commands: usage: / permissions: groupmanager.mantogglevalidate mantogglesave: - description: Toggle on/ff the autosave. + description: Toggle on/off the autosave. usage: / permissions: groupmanager.mantogglesave manworld: @@ -164,8 +173,12 @@ commands: description: Clear world selection. Next commands will work on your world. usage: / permissions: groupmanager.manclear + mancheckw: + description: Obtain the paths to each file a world is storing it's data in (users/groups). + usage: / + permissions: groupmanager.mancheckw Permissions: groupmanager.op: description: User is treated as an op when using the GroupManager commands. - default: false \ No newline at end of file + default: false diff --git a/EssentialsGroupManager/src/users.yml b/EssentialsGroupManager/src/users.yml index 72a7b652fa..eaea6232d5 100644 --- a/EssentialsGroupManager/src/users.yml +++ b/EssentialsGroupManager/src/users.yml @@ -1,15 +1,18 @@ # "For a more advanced configuration example utilizing the advanced features of GroupManager, see http://pastebin.com/a8ZA0j5G" users: snowleo: - subgroups: [] - permissions: [] group: Builder - KHobbits: subgroups: [] - permissions: [] + permissions: + - groupmanager.noofflineperms + KHobbits: group: Moderator - ElgarL: subgroups: [] - permissions: [] + permissions: + - groupmanager.noofflineperms + ElgarL: group: Moderator + subgroups: [] + permissions: + - groupmanager.noofflineperms diff --git a/EssentialsProtect/build.xml b/EssentialsProtect/build.xml index 1f88786d0b..9d7571f4d3 100644 --- a/EssentialsProtect/build.xml +++ b/EssentialsProtect/build.xml @@ -75,7 +75,6 @@ - diff --git a/EssentialsProtect/nbproject/build-impl.xml b/EssentialsProtect/nbproject/build-impl.xml index 8cfd938772..19108f7b70 100644 --- a/EssentialsProtect/nbproject/build-impl.xml +++ b/EssentialsProtect/nbproject/build-impl.xml @@ -12,9 +12,9 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup @@ -181,6 +181,7 @@ is divided into following sections: + @@ -225,6 +226,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -357,11 +379,52 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -370,32 +433,270 @@ is divided into following sections: - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -427,10 +728,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -488,6 +792,7 @@ is divided into following sections: + @@ -504,6 +809,7 @@ is divided into following sections: + @@ -511,6 +817,7 @@ is divided into following sections: + @@ -537,6 +844,9 @@ is divided into following sections: + + + @@ -582,7 +892,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -813,8 +1127,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -822,12 +1137,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -839,12 +1150,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -866,6 +1173,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -952,14 +1295,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -972,39 +1315,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1076,9 +1420,12 @@ is divided into following sections: - - - + + + + + + diff --git a/EssentialsProtect/nbproject/genfiles.properties b/EssentialsProtect/nbproject/genfiles.properties index fe9ffd1a1f..94897cd6c2 100644 --- a/EssentialsProtect/nbproject/genfiles.properties +++ b/EssentialsProtect/nbproject/genfiles.properties @@ -4,5 +4,5 @@ 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=40644caa -nbproject/build-impl.xml.script.CRC32=cdb3fc6f -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 +nbproject/build-impl.xml.script.CRC32=eecff97a +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/EssentialsProtect/nbproject/project.properties b/EssentialsProtect/nbproject/project.properties index 77c12c2483..af6412bde0 100644 --- a/EssentialsProtect/nbproject/project.properties +++ b/EssentialsProtect/nbproject/project.properties @@ -64,14 +64,12 @@ dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= file.reference.bukkit.jar=../lib/bukkit.jar -file.reference.c3p0-0.9.1.2.jar=..\\lib\\c3p0-0.9.1.2.jar includes=** jar.archive.disabled=${jnlp.enabled} jar.compress=true jar.index=${jnlp.enabled} javac.classpath=\ ${reference.Essentials.jar}:\ - ${file.reference.c3p0-0.9.1.2.jar}:\ ${file.reference.bukkit.jar} # Space-separated list of extra javac options javac.compilerargs= diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsConnect.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsConnect.java index 7503c334cf..f19362ee2b 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsConnect.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsConnect.java @@ -1,122 +1,58 @@ -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; -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; - - -public class EssentialsConnect -{ - private static final Logger LOGGER = Logger.getLogger("Minecraft"); - private final transient IEssentials ess; - private final transient IProtect protect; - - public EssentialsConnect(Plugin essPlugin, Plugin essProtect) - { - if (!essProtect.getDescription().getVersion().equals(essPlugin.getDescription().getVersion())) - { - LOGGER.log(Level.WARNING, _("versionMismatchAll")); - } - ess = (IEssentials)essPlugin; - protect = (IProtect)essProtect; - ProtectReloader pr = new ProtectReloader(); - 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 ProtectReloader implements IConf - { - @Override - public void reloadConfig() - { - if (protect.getStorage() != null) - { - protect.getStorage().onPluginDeactivation(); - } - for (ProtectConfig protectConfig : ProtectConfig.values()) - { - if (protectConfig.isList()) - { - protect.getSettingsList().put(protectConfig, ess.getSettings().getProtectList(protectConfig.getConfigName())); - } - else if (protectConfig.isString()) - { - protect.getSettingsString().put(protectConfig, ess.getSettings().getProtectString(protectConfig.getConfigName())); - } - else - { - protect.getSettingsBoolean().put(protectConfig, ess.getSettings().getProtectBoolean(protectConfig.getConfigName(), protectConfig.getDefaultValueBoolean())); - } - - } - - if (protect.getSettingString(ProtectConfig.datatype).equalsIgnoreCase("mysql")) - { - try - { - protect.setStorage(new ProtectedBlockMySQL( - protect.getSettingString(ProtectConfig.mysqlDB), - protect.getSettingString(ProtectConfig.dbUsername), - protect.getSettingString(ProtectConfig.dbPassword))); - } - catch (PropertyVetoException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - else - { - try - { - protect.setStorage(new ProtectedBlockSQLite("jdbc:sqlite:plugins/Essentials/EssentialsProtect.db")); - } - catch (PropertyVetoException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (protect.getSettingBool(ProtectConfig.memstore)) - { - protect.setStorage(new ProtectedBlockMemory(protect.getStorage(), protect)); - } - - } - } -} +package com.earth2me.essentials.protect; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.IConf; +import com.earth2me.essentials.IEssentials; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.plugin.Plugin; + + +public class EssentialsConnect +{ + private static final Logger LOGGER = Logger.getLogger("Minecraft"); + private final IEssentials ess; + private final IProtect protect; + + public EssentialsConnect(Plugin essPlugin, Plugin essProtect) + { + if (!essProtect.getDescription().getVersion().equals(essPlugin.getDescription().getVersion())) + { + LOGGER.log(Level.WARNING, _("versionMismatchAll")); + } + ess = (IEssentials)essPlugin; + protect = (IProtect)essProtect; + ProtectReloader pr = new ProtectReloader(); + pr.reloadConfig(); + ess.addReloadListener(pr); + } + + public IEssentials getEssentials() + { + return ess; + } + + private class ProtectReloader implements IConf + { + @Override + public void reloadConfig() + { + for (ProtectConfig protectConfig : ProtectConfig.values()) + { + if (protectConfig.isList()) + { + protect.getSettingsList().put(protectConfig, ess.getSettings().getProtectList(protectConfig.getConfigName())); + } + else if (protectConfig.isString()) + { + protect.getSettingsString().put(protectConfig, ess.getSettings().getProtectString(protectConfig.getConfigName())); + } + else + { + protect.getSettingsBoolean().put(protectConfig, ess.getSettings().getProtectBoolean(protectConfig.getConfigName(), protectConfig.getDefaultValueBoolean())); + } + + } + } + } +} \ No newline at end of file diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java index 9c257662df..1e90134086 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java @@ -1,144 +1,93 @@ -package com.earth2me.essentials.protect; - -import com.earth2me.essentials.protect.data.IProtectedBlock; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Filter; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.java.JavaPlugin; - - -public class EssentialsProtect extends JavaPlugin implements IProtect -{ - private static final Logger LOGGER = Logger.getLogger("Minecraft"); - private static com.mchange.v2.log.MLogger C3P0logger; - private final transient Map settingsBoolean = new EnumMap(ProtectConfig.class); - private final transient Map settingsString = new EnumMap(ProtectConfig.class); - private final transient Map> settingsList = new EnumMap>(ProtectConfig.class); - private transient IProtectedBlock storage = null; - private transient EssentialsConnect ess = null; - - @Override - public void onLoad() - { - C3P0logger = com.mchange.v2.log.MLog.getLogger(com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.class); - C3P0logger.setFilter(new Filter() - { - public boolean isLoggable(LogRecord lr) - { - return lr.getLevel() != Level.INFO; - } - }); - } - - public void onEnable() - { - final PluginManager pm = this.getServer().getPluginManager(); - final Plugin essPlugin = pm.getPlugin("Essentials"); - if (essPlugin == null || !essPlugin.isEnabled()) - { - enableEmergencyMode(pm); - return; - } - ess = new EssentialsConnect(essPlugin, this); - - final EssentialsProtectPlayerListener playerListener = new EssentialsProtectPlayerListener(this); - pm.registerEvents(playerListener, this); - - final EssentialsProtectBlockListener blockListener = new EssentialsProtectBlockListener(this); - pm.registerEvents(blockListener, this); - - final EssentialsProtectEntityListener entityListener = new EssentialsProtectEntityListener(this); - pm.registerEvents(entityListener, this); - - final EssentialsProtectWeatherListener weatherListener = new EssentialsProtectWeatherListener(this); - pm.registerEvents(weatherListener, this); - } - - private void enableEmergencyMode(final PluginManager pm) - { - final EmergencyListener emListener = new EmergencyListener(); - pm.registerEvents(emListener, this); - - for (Player player : getServer().getOnlinePlayers()) - { - player.sendMessage("Essentials Protect is in emergency mode. Check your log for errors."); - } - 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 itemList = settingsList.get(list); - return itemList != null && !itemList.isEmpty() && itemList.contains(id); - } - - @Override - public IProtectedBlock getStorage() - { - return storage; - } - - @Override - public void setStorage(IProtectedBlock pb) - { - storage = pb; - } - - public EssentialsConnect getEssentialsConnect() - { - return ess; - } - - public Map getSettingsBoolean() - { - return settingsBoolean; - } - - public Map getSettingsString() - { - return settingsString; - } - - public Map> getSettingsList() - { - return settingsList; - } - - @Override - public boolean getSettingBool(final ProtectConfig protectConfig) - { - final Boolean bool = settingsBoolean.get(protectConfig); - return bool == null ? protectConfig.getDefaultValueBoolean() : bool; - } - - @Override - public String getSettingString(final ProtectConfig protectConfig) - { - final String str = settingsString.get(protectConfig); - return str == null ? protectConfig.getDefaultValueString() : str; - } - - public void onDisable() - { - if (storage != null) - { - storage.onPluginDeactivation(); - } - // Sleep for a second to allow the database to close. - try - { - Thread.sleep(1000); - } - catch (InterruptedException ex) - { - } - } -} +package com.earth2me.essentials.protect; + +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; + + +public class EssentialsProtect extends JavaPlugin implements IProtect +{ + private static final Logger LOGGER = Logger.getLogger("Minecraft"); + private final Map settingsBoolean = new EnumMap(ProtectConfig.class); + private final Map settingsString = new EnumMap(ProtectConfig.class); + private final Map> settingsList = new EnumMap>(ProtectConfig.class); + private EssentialsConnect ess = null; + + @Override + public void onEnable() + { + final PluginManager pm = this.getServer().getPluginManager(); + final Plugin essPlugin = pm.getPlugin("Essentials"); + if (essPlugin == null || !essPlugin.isEnabled()) + { + enableEmergencyMode(pm); + return; + } + ess = new EssentialsConnect(essPlugin, this); + + final EssentialsProtectBlockListener blockListener = new EssentialsProtectBlockListener(this); + pm.registerEvents(blockListener, this); + + final EssentialsProtectEntityListener entityListener = new EssentialsProtectEntityListener(this); + pm.registerEvents(entityListener, this); + + final EssentialsProtectWeatherListener weatherListener = new EssentialsProtectWeatherListener(this); + pm.registerEvents(weatherListener, this); + } + + private void enableEmergencyMode(final PluginManager pm) + { + final EmergencyListener emListener = new EmergencyListener(); + pm.registerEvents(emListener, this); + + for (Player player : getServer().getOnlinePlayers()) + { + player.sendMessage("Essentials Protect is in emergency mode. Check your log for errors."); + } + LOGGER.log(Level.SEVERE, "Essentials not installed or failed to load. Essenials Protect is in emergency mode now."); + } + + @Override + public EssentialsConnect getEssentialsConnect() + { + return ess; + } + + @Override + public Map getSettingsBoolean() + { + return settingsBoolean; + } + + @Override + public Map getSettingsString() + { + return settingsString; + } + + @Override + public Map> getSettingsList() + { + return settingsList; + } + + @Override + public boolean getSettingBool(final ProtectConfig protectConfig) + { + final Boolean bool = settingsBoolean.get(protectConfig); + return bool == null ? protectConfig.getDefaultValueBoolean() : bool; + } + + @Override + public String getSettingString(final ProtectConfig protectConfig) + { + final String str = settingsString.get(protectConfig); + return str == null ? protectConfig.getDefaultValueString() : str; + } +} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java index 8e5e9cca81..246d9a5837 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java @@ -1,485 +1,89 @@ -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; -import java.util.ArrayList; -import java.util.List; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.*; - - -public class EssentialsProtectBlockListener implements Listener -{ - final private transient IProtect prot; - final private transient IEssentials ess; - - public EssentialsProtectBlockListener(final IProtect parent) - { - this.prot = parent; - this.ess = prot.getEssentialsConnect().getEssentials(); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onBlockPlace(final BlockPlaceEvent event) - { - if (event.isCancelled()) - { - return; - } - - 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) - && prot.getSettingBool(ProtectConfig.prevent_block_on_rail) - && isProtected(below, user)) - { - event.setCancelled(true); - return; - } - - final List protect = new ArrayList(); - if ((blockPlaced.getType() == Material.RAILS || blockPlaced.getType() == Material.POWERED_RAIL || blockPlaced.getType() == Material.DETECTOR_RAIL) - && prot.getSettingBool(ProtectConfig.protect_rails) - && user.isAuthorized("essentials.protect")) - { - protect.add(blockPlaced); - if (prot.getSettingBool(ProtectConfig.protect_below_rails) - && !isProtected(blockPlaced.getRelative(BlockFace.DOWN), user)) - { - protect.add(blockPlaced.getRelative(BlockFace.DOWN)); - } - } - if ((blockPlaced.getType() == Material.SIGN_POST || blockPlaced.getType() == Material.WALL_SIGN) - && prot.getSettingBool(ProtectConfig.protect_signs) - && user.isAuthorized("essentials.protect")) - { - protect.add(blockPlaced); - if (prot.getSettingBool(ProtectConfig.protect_against_signs) - && event.getBlockAgainst().getType() != Material.SIGN_POST - && event.getBlockAgainst().getType() != Material.WALL_SIGN - && !isProtected(event.getBlockAgainst(), user)) - { - protect.add(event.getBlockAgainst()); - } - } - for (Block block : protect) - { - prot.getStorage().protectBlock(block, user.getName()); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onBlockIgnite(BlockIgniteEvent event) - { - if (event.isCancelled()) - { - return; - } - final Block block = event.getBlock(); - if ((block.getType() == Material.RAILS || block.getType() == Material.POWERED_RAIL || block.getType() == Material.DETECTOR_RAIL) - && prot.getSettingBool(ProtectConfig.protect_rails)) - { - event.setCancelled(true); - return; - } - if ((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) - && prot.getSettingBool(ProtectConfig.protect_signs)) - { - event.setCancelled(true); - return; - } - if (event.getBlock().getType() == Material.OBSIDIAN - || event.getBlock().getRelative(BlockFace.DOWN).getType() == Material.OBSIDIAN) - { - event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_portal_creation)); - return; - } - - if (event.getCause().equals(BlockIgniteEvent.IgniteCause.SPREAD)) - { - event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_fire_spread)); - return; - } - - if (event.getCause().equals(BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL)) - { - event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_flint_fire)); - return; - } - - if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LAVA)) - { - event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lava_fire_spread)); - return; - } - if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LIGHTNING)) - { - event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lightning_fire_spread)); - return; - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onBlockFromTo(final BlockFromToEvent event) - { - if (event.isCancelled()) - { - return; - } - final Block toBlock = event.getToBlock(); - if ((toBlock.getType() == Material.RAILS || toBlock.getType() == Material.POWERED_RAIL || toBlock.getType() == Material.DETECTOR_RAIL) - && prot.getSettingBool(ProtectConfig.protect_rails)) - { - event.setCancelled(true); - return; - } - if ((toBlock.getType() == Material.WALL_SIGN || toBlock.getType() == Material.SIGN_POST) - && prot.getSettingBool(ProtectConfig.protect_signs)) - { - event.setCancelled(true); - return; - } - - final Block block = event.getBlock(); - if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER) - { - event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_water_flow)); - return; - } - - if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) - { - event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lava_flow)); - return; - } - - if (block.getType() == Material.AIR) - { - event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_water_bucket_flow)); - return; - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onBlockBurn(final BlockBurnEvent event) - { - if (event.isCancelled()) - { - return; - } - final Block block = event.getBlock(); - if ((block.getType() == Material.RAILS || block.getType() == Material.POWERED_RAIL || block.getType() == Material.DETECTOR_RAIL) && prot.getSettingBool(ProtectConfig.protect_rails)) - { - event.setCancelled(true); - return; - } - if ((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) - && prot.getSettingBool(ProtectConfig.protect_signs)) - { - event.setCancelled(true); - return; - } - if (prot.getSettingBool(ProtectConfig.prevent_fire_spread)) - { - event.setCancelled(true); - return; - } - } - private final static BlockFace[] faces = new BlockFace[] - { - BlockFace.NORTH, - BlockFace.EAST, - BlockFace.SOUTH, - BlockFace.WEST, - BlockFace.UP, - BlockFace.DOWN, - BlockFace.SELF - }; - - @EventHandler(priority = EventPriority.HIGHEST) - public void onBlockBreak(final BlockBreakEvent event) - { - if (event.isCancelled()) - { - return; - } - 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")) - { - if (type == Material.WALL_SIGN || type == Material.SIGN_POST || type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL) - { - storage.unprotectBlock(block); - if (type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL || type == Material.SIGN_POST) - { - final Block below = block.getRelative(BlockFace.DOWN); - storage.unprotectBlock(below); - } - else - { - for (BlockFace blockFace : faces) - { - final Block against = block.getRelative(blockFace); - storage.unprotectBlock(against); - } - } - } - else - { - for (BlockFace blockFace : faces) - { - final Block against = block.getRelative(blockFace); - storage.unprotectBlock(against); - } - } - } - else - { - - final boolean isProtected = isProtected(block, user); - if (isProtected) - { - event.setCancelled(true); - } - else - { - if (type == Material.WALL_SIGN || type == Material.SIGN_POST || type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL) - { - storage.unprotectBlock(block); - if (type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL || type == Material.SIGN_POST) - { - final Block below = block.getRelative(BlockFace.DOWN); - storage.unprotectBlock(below); - } - else - { - for (BlockFace blockFace : faces) - { - final Block against = block.getRelative(blockFace); - storage.unprotectBlock(against); - } - } - } - else - { - for (BlockFace blockFace : faces) - { - final Block against = block.getRelative(blockFace); - storage.unprotectBlock(against); - } - } - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onBlockPistonExtend(BlockPistonExtendEvent event) - { - if (event.isCancelled()) - { - return; - } - 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 - || block.getType() == Material.POWERED_RAIL - || block.getRelative(BlockFace.UP).getType() == Material.DETECTOR_RAIL - || block.getType() == Material.DETECTOR_RAIL) - && prot.getSettingBool(ProtectConfig.protect_rails)) - { - event.setCancelled(true); - return; - } - if (prot.getSettingBool(ProtectConfig.protect_signs)) - { - for (BlockFace blockFace : faces) - { - if (blockFace == BlockFace.DOWN) - { - continue; - } - final Block sign = block.getRelative(blockFace); - if ((blockFace == BlockFace.UP || blockFace == BlockFace.SELF) - && sign.getType() == Material.SIGN_POST) - { - event.setCancelled(true); - return; - } - if ((blockFace == BlockFace.NORTH || blockFace == BlockFace.EAST - || blockFace == BlockFace.SOUTH || blockFace == BlockFace.WEST - || blockFace == BlockFace.SELF) - && sign.getType() == Material.WALL_SIGN) - { - 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(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 - || block.getType() == Material.POWERED_RAIL - || block.getRelative(BlockFace.UP).getType() == Material.DETECTOR_RAIL - || block.getType() == Material.DETECTOR_RAIL) - && prot.getSettingBool(ProtectConfig.protect_rails)) - { - event.setCancelled(true); - return; - } - if (prot.getSettingBool(ProtectConfig.protect_signs)) - { - for (BlockFace blockFace : faces) - { - if (blockFace == BlockFace.DOWN) - { - continue; - } - final Block sign = block.getRelative(blockFace); - if ((blockFace == BlockFace.UP || blockFace == BlockFace.SELF) - && sign.getType() == Material.SIGN_POST) - { - event.setCancelled(true); - return; - } - if ((blockFace == BlockFace.NORTH || blockFace == BlockFace.EAST - || blockFace == BlockFace.SOUTH || blockFace == BlockFace.WEST - || blockFace == BlockFace.SELF) - && sign.getType() == Material.WALL_SIGN) - { - event.setCancelled(true); - return; - } - } - } - } - - private boolean isProtected(final Block block, final User user) - { - final Material type = block.getType(); - if (prot.getSettingBool(ProtectConfig.protect_signs)) - { - if (type == Material.WALL_SIGN || type == Material.SIGN_POST) - { - return prot.getStorage().isProtected(block, user.getName()); - } - if (prot.getSettingBool(ProtectConfig.protect_against_signs)) - { - final Block up = block.getRelative(BlockFace.UP); - if (up != null && up.getType() == Material.SIGN_POST) - { - return prot.getStorage().isProtected(block, user.getName()); - } - 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) - { - return prot.getStorage().isProtected(block, user.getName()); - } - } - } - } - } - if (prot.getSettingBool(ProtectConfig.protect_rails)) - { - if (type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL) - { - return prot.getStorage().isProtected(block, user.getName()); - } - if (prot.getSettingBool(ProtectConfig.protect_below_rails)) - { - final Block up = block.getRelative(BlockFace.UP); - if (up != null && (type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL)) - { - return prot.getStorage().isProtected(block, user.getName()); - } - } - } - return false; - } -} +package com.earth2me.essentials.protect; + +import com.earth2me.essentials.IEssentials; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; + + +public class EssentialsProtectBlockListener implements Listener +{ + final private IProtect prot; + final private IEssentials ess; + + public EssentialsProtectBlockListener(final IProtect parent) + { + this.prot = parent; + this.ess = prot.getEssentialsConnect().getEssentials(); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockIgnite(BlockIgniteEvent event) + { + if (event.getBlock().getType() == Material.OBSIDIAN + || event.getBlock().getRelative(BlockFace.DOWN).getType() == Material.OBSIDIAN) + { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_portal_creation)); + return; + } + + if (event.getCause().equals(BlockIgniteEvent.IgniteCause.SPREAD)) + { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_fire_spread)); + return; + } + + if (event.getCause().equals(BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL)) + { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_flint_fire)); + return; + } + + if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LAVA)) + { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lava_fire_spread)); + return; + } + if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LIGHTNING)) + { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lightning_fire_spread)); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockFromTo(final BlockFromToEvent event) + { + final Block block = event.getBlock(); + + if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER) + { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_water_flow)); + return; + } + + if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_lava_flow)); + return; + } + + if (block.getType() == Material.AIR) + { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_water_bucket_flow)); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockBurn(final BlockBurnEvent event) + { + if (prot.getSettingBool(ProtectConfig.prevent_fire_spread)) + { + event.setCancelled(true); + } + } +} + \ No newline at end of file diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java index 7e558eb81f..faa2dd5c75 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java @@ -1,342 +1,329 @@ -package com.earth2me.essentials.protect; - -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; -import java.util.Locale; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; -import org.bukkit.event.entity.*; - - -public class EssentialsProtectEntityListener implements Listener -{ - private final transient IProtect prot; - private final transient IEssentials ess; - - public EssentialsProtectEntityListener(final IProtect prot) - { - this.prot = prot; - this.ess = prot.getEssentialsConnect().getEssentials(); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onEntityDamage(final EntityDamageEvent event) - { - if (event.isCancelled()) - { - return; - } - final Entity target = event.getEntity(); - - if (target instanceof Villager && prot.getSettingBool(ProtectConfig.prevent_villager_death)) - { - event.setCancelled(true); - return; - } - - final User user = ess.getUser(target); - if (event instanceof EntityDamageByBlockEvent) - { - final DamageCause cause = event.getCause(); - - if (prot.getSettingBool(ProtectConfig.disable_contactdmg) - && cause == DamageCause.CONTACT - && !(target instanceof Player - && user.isAuthorized("essentials.protect.damage.contact") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - if (prot.getSettingBool(ProtectConfig.disable_lavadmg) - && cause == DamageCause.LAVA - && !(target instanceof Player - && user.isAuthorized("essentials.protect.damage.lava") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - if (prot.getSettingBool(ProtectConfig.prevent_tnt_explosion) - && cause == DamageCause.BLOCK_EXPLOSION - && !(target instanceof Player - && user.isAuthorized("essentials.protect.damage.tnt") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - } - - if (event instanceof EntityDamageByEntityEvent) - { - final EntityDamageByEntityEvent edEvent = (EntityDamageByEntityEvent)event; - final Entity eAttack = edEvent.getDamager(); - final User attacker = ess.getUser(eAttack); - - // PVP Settings - if (target instanceof Player && eAttack instanceof Player - && prot.getSettingBool(ProtectConfig.disable_pvp) - && (!user.isAuthorized("essentials.protect.pvp") || !attacker.isAuthorized("essentials.protect.pvp"))) - { - event.setCancelled(true); - return; - } - - //Creeper explode prevention - if (eAttack instanceof Creeper && prot.getSettingBool(ProtectConfig.prevent_creeper_explosion) - && !(target instanceof Player - && user.isAuthorized("essentials.protect.damage.creeper") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - - if (eAttack instanceof Creeper && prot.getSettingBool(ProtectConfig.prevent_creeper_playerdmg) - && !(target instanceof Player - && user.isAuthorized("essentials.protect.damage.creeper") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - - if ((event.getEntity() instanceof Fireball || event.getEntity() instanceof SmallFireball) - && prot.getSettingBool(ProtectConfig.prevent_fireball_playerdmg) - && !(target instanceof Player - && user.isAuthorized("essentials.protect.damage.fireball") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - - if (eAttack instanceof TNTPrimed && prot.getSettingBool(ProtectConfig.prevent_tnt_playerdmg) - && !(target instanceof Player - && user.isAuthorized("essentials.protect.damage.tnt") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - - if (edEvent.getDamager() instanceof Projectile - && target instanceof Player - && ((prot.getSettingBool(ProtectConfig.disable_projectiles) - && !(user.isAuthorized("essentials.protect.damage.projectiles") - && !user.isAuthorized("essentials.protect.damage.disable"))) - || (((Projectile)edEvent.getDamager()).getShooter() instanceof Player - && prot.getSettingBool(ProtectConfig.disable_pvp) - && (!user.isAuthorized("essentials.protect.pvp") - || !ess.getUser(((Projectile)edEvent.getDamager()).getShooter()).isAuthorized("essentials.protect.pvp"))))) - { - event.setCancelled(true); - return; - } - } - - final DamageCause cause = event.getCause(); - if (target instanceof Player) - { - if (cause == DamageCause.FALL - && prot.getSettingBool(ProtectConfig.disable_fall) - && !(user.isAuthorized("essentials.protect.damage.fall") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - - if (cause == DamageCause.SUFFOCATION - && prot.getSettingBool(ProtectConfig.disable_suffocate) - && !(user.isAuthorized("essentials.protect.damage.suffocation") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - if ((cause == DamageCause.FIRE - || cause == DamageCause.FIRE_TICK) - && prot.getSettingBool(ProtectConfig.disable_firedmg) - && !(user.isAuthorized("essentials.protect.damage.fire") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - if (cause == DamageCause.DROWNING - && prot.getSettingBool(ProtectConfig.disable_drown) - && !(user.isAuthorized("essentials.protect.damage.drowning") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - if (cause == DamageCause.LIGHTNING - && prot.getSettingBool(ProtectConfig.disable_lightning) - && !(user.isAuthorized("essentials.protect.damage.lightning") - && !user.isAuthorized("essentials.protect.damage.disable"))) - { - event.setCancelled(true); - return; - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onEntityExplode(final EntityExplodeEvent event) - { - if (event.isCancelled() || event.getEntity() == null) - { - return; - } - final int maxHeight = ess.getSettings().getProtectCreeperMaxHeight(); - - if (event.getEntity() instanceof EnderDragon - && prot.getSettingBool(ProtectConfig.prevent_enderdragon_blockdmg)) - { - event.setCancelled(true); - if (prot.getSettingBool(ProtectConfig.enderdragon_fakeexplosions)) - { - event.getLocation().getWorld().createExplosion(event.getLocation(), 0F); - } - return; - } - else if (event.getEntity() instanceof Creeper - && (prot.getSettingBool(ProtectConfig.prevent_creeper_explosion) - || prot.getSettingBool(ProtectConfig.prevent_creeper_blockdmg) - || (maxHeight >= 0 && event.getLocation().getBlockY() > maxHeight))) - { - //Nicccccccccce plaaacccccccccce.. - event.setCancelled(true); - event.getLocation().getWorld().createExplosion(event.getLocation(), 0F); - return; - } - else if (event.getEntity() instanceof TNTPrimed - && prot.getSettingBool(ProtectConfig.prevent_tnt_explosion)) - { - event.setCancelled(true); - return; - } - else if ((event.getEntity() instanceof Fireball || event.getEntity() instanceof SmallFireball) - && prot.getSettingBool(ProtectConfig.prevent_fireball_explosion)) - { - event.setCancelled(true); - return; - } - // This code will prevent explosions near protected rails, signs or protected chests - // TODO: Use protect db instead of this code - - for (Block block : event.blockList()) - { - if ((block.getRelative(BlockFace.UP).getType() == Material.RAILS - || block.getType() == Material.RAILS - || block.getRelative(BlockFace.UP).getType() == Material.POWERED_RAIL - || block.getType() == Material.POWERED_RAIL - || block.getRelative(BlockFace.UP).getType() == Material.DETECTOR_RAIL - || block.getType() == Material.DETECTOR_RAIL) - && prot.getSettingBool(ProtectConfig.protect_rails)) - { - event.setCancelled(true); - return; - } - if ((block.getType() == Material.WALL_SIGN - || block.getRelative(BlockFace.NORTH).getType() == Material.WALL_SIGN - || block.getRelative(BlockFace.EAST).getType() == Material.WALL_SIGN - || block.getRelative(BlockFace.SOUTH).getType() == Material.WALL_SIGN - || block.getRelative(BlockFace.WEST).getType() == Material.WALL_SIGN - || block.getType() == Material.SIGN_POST - || block.getRelative(BlockFace.UP).getType() == Material.SIGN_POST) - && prot.getSettingBool(ProtectConfig.protect_signs)) - { - event.setCancelled(true); - return; - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onCreatureSpawn(final CreatureSpawnEvent event) - { - if (event.getEntity() instanceof Player) - { - return; - } - if (event.isCancelled()) - { - return; - } - final EntityType creature = event.getEntityType(); - if (creature == null) - { - return; - } - final String creatureName = creature.toString().toLowerCase(Locale.ENGLISH); - if (creatureName == null || creatureName.isEmpty()) - { - return; - } - if (ess.getSettings().getProtectPreventSpawn(creatureName)) - { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onEntityTarget(final EntityTargetEvent event) - { - if (event.isCancelled()) - { - return; - } - if (!(event.getTarget() instanceof Player)) - { - return; - } - final User user = ess.getUser(event.getTarget()); - if ((event.getReason() == TargetReason.CLOSEST_PLAYER - || event.getReason() == TargetReason.TARGET_ATTACKED_ENTITY - || event.getReason() == TargetReason.PIG_ZOMBIE_TARGET - || event.getReason() == TargetReason.RANDOM_TARGET - || event.getReason() == TargetReason.TARGET_ATTACKED_OWNER - || event.getReason() == TargetReason.OWNER_ATTACKED_TARGET) - && prot.getSettingBool(ProtectConfig.prevent_entitytarget) - && !user.isAuthorized("essentials.protect.entitytarget.bypass")) - { - event.setCancelled(true); - return; - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onExplosionPrime(ExplosionPrimeEvent event) - { - if ((event.getEntity() instanceof Fireball || event.getEntity() instanceof SmallFireball) - && prot.getSettingBool(ProtectConfig.prevent_fireball_fire)) - { - event.setFire(false); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onEntityChangeBlock(EntityChangeBlockEvent event) - { - if (event.isCancelled()) - { - return; - } - if (event.getEntityType() == EntityType.ENDERMAN && prot.getSettingBool(ProtectConfig.prevent_enderman_pickup)) - { - event.setCancelled(true); - return; - } - } -} +package com.earth2me.essentials.protect; + +import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.User; +import java.util.Locale; +import org.bukkit.entity.*; +import org.bukkit.entity.minecart.ExplosiveMinecart; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.*; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.EntityTargetEvent.TargetReason; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; +import org.bukkit.event.hanging.HangingBreakEvent; + + +public class EssentialsProtectEntityListener implements Listener +{ + private final IProtect prot; + private final IEssentials ess; + + public EssentialsProtectEntityListener(final IProtect prot) + { + this.prot = prot; + this.ess = prot.getEssentialsConnect().getEssentials(); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onEntityDamage(final EntityDamageEvent event) + { + final Entity target = event.getEntity(); + + if (target instanceof Villager && prot.getSettingBool(ProtectConfig.prevent_villager_death)) + { + event.setCancelled(true); + return; + } + + final User user = ess.getUser(target); + final DamageCause cause = event.getCause(); + + if (event instanceof EntityDamageByBlockEvent) + { + if (prot.getSettingBool(ProtectConfig.disable_contactdmg) + && cause == DamageCause.CONTACT + && !(target instanceof Player && shouldBeDamaged(user, "contact"))) + { + event.setCancelled(true); + return; + } + if (prot.getSettingBool(ProtectConfig.disable_lavadmg) + && cause == DamageCause.LAVA + && !(target instanceof Player && shouldBeDamaged(user, "lava"))) + { + event.setCancelled(true); + return; + } + if (prot.getSettingBool(ProtectConfig.prevent_tnt_explosion) + && cause == DamageCause.BLOCK_EXPLOSION + && !(target instanceof Player && shouldBeDamaged(user, "tnt"))) + { + event.setCancelled(true); + return; + } + } + + if (event instanceof EntityDamageByEntityEvent) + { + final EntityDamageByEntityEvent edEvent = (EntityDamageByEntityEvent)event; + final Entity eAttack = edEvent.getDamager(); + final User attacker = ess.getUser(eAttack); + + //Creeper explode prevention + if (eAttack instanceof Creeper + && (prot.getSettingBool(ProtectConfig.prevent_creeper_explosion) + || prot.getSettingBool(ProtectConfig.prevent_creeper_playerdmg)) + && !(target instanceof Player && shouldBeDamaged(user, "creeper"))) + { + event.setCancelled(true); + return; + } + + if ((event.getEntity() instanceof Fireball || event.getEntity() instanceof SmallFireball) + && prot.getSettingBool(ProtectConfig.prevent_fireball_playerdmg) + && !(target instanceof Player && shouldBeDamaged(user, "fireball"))) + { + event.setCancelled(true); + return; + } + + if (event.getEntity() instanceof WitherSkull + && prot.getSettingBool(ProtectConfig.prevent_witherskull_playerdmg) + && !(target instanceof Player && shouldBeDamaged(user, "witherskull"))) + { + event.setCancelled(true); + return; + } + + if (eAttack instanceof TNTPrimed && prot.getSettingBool(ProtectConfig.prevent_tnt_playerdmg) + && !(target instanceof Player && shouldBeDamaged(user, "tnt"))) + { + event.setCancelled(true); + return; + } + + if (eAttack instanceof ExplosiveMinecart && prot.getSettingBool(ProtectConfig.prevent_tntminecart_playerdmg) + && !(target instanceof Player && shouldBeDamaged(user, "tnt-minecart"))) + { + event.setCancelled(true); + return; + } + + // PVP Settings + if (target instanceof Player && eAttack instanceof Player + && prot.getSettingBool(ProtectConfig.disable_pvp) + && (!user.isAuthorized("essentials.protect.pvp") || !attacker.isAuthorized("essentials.protect.pvp"))) + { + event.setCancelled(true); + return; + } + + if (edEvent.getDamager() instanceof Projectile + && target instanceof Player + && ((prot.getSettingBool(ProtectConfig.disable_projectiles) && !shouldBeDamaged(user, "projectiles")) + || (((Projectile)edEvent.getDamager()).getShooter() instanceof Player + && prot.getSettingBool(ProtectConfig.disable_pvp) + && (!user.isAuthorized("essentials.protect.pvp") + || !ess.getUser(((Projectile)edEvent.getDamager()).getShooter()).isAuthorized("essentials.protect.pvp"))))) + { + event.setCancelled(true); + return; + } + } + + if (target instanceof Player) + { + if (cause == DamageCause.FALL + && prot.getSettingBool(ProtectConfig.disable_fall) + && !shouldBeDamaged(user, "fall")) + { + event.setCancelled(true); + return; + } + + if (cause == DamageCause.SUFFOCATION + && prot.getSettingBool(ProtectConfig.disable_suffocate) + && !shouldBeDamaged(user, "suffocation")) + { + event.setCancelled(true); + return; + } + if ((cause == DamageCause.FIRE || cause == DamageCause.FIRE_TICK) + && prot.getSettingBool(ProtectConfig.disable_firedmg) + && !shouldBeDamaged(user, "fire")) + { + event.setCancelled(true); + return; + } + if (cause == DamageCause.DROWNING + && prot.getSettingBool(ProtectConfig.disable_drown) + && !shouldBeDamaged(user, "drowning")) + { + event.setCancelled(true); + return; + } + if (cause == DamageCause.LIGHTNING + && prot.getSettingBool(ProtectConfig.disable_lightning) + && !shouldBeDamaged(user, "lightning")) + { + event.setCancelled(true); + return; + } + if (cause == DamageCause.WITHER + && prot.getSettingBool(ProtectConfig.disable_wither) + && !shouldBeDamaged(user, "wither")) + { + event.setCancelled(true); + } + } + } + + private boolean shouldBeDamaged(final User user, final String type) + { + return (user.isAuthorized("essentials.protect.damage.".concat(type)) + && !user.isAuthorized("essentials.protect.damage.disable")); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onEntityExplode(final EntityExplodeEvent event) + { + if (event.getEntity() == null) + { + return; + } + Entity entity = event.getEntity(); + final int maxHeight = ess.getSettings().getProtectCreeperMaxHeight(); + + if (entity instanceof EnderDragon + && prot.getSettingBool(ProtectConfig.prevent_enderdragon_blockdmg)) + { + event.setCancelled(true); + if (prot.getSettingBool(ProtectConfig.enderdragon_fakeexplosions)) + { + event.getLocation().getWorld().createExplosion(event.getLocation(), 0F); + } + return; + } + if (entity instanceof Wither + && prot.getSettingBool(ProtectConfig.prevent_wither_spawnexplosion)) + { + event.setCancelled(true); + } + else if (entity instanceof Creeper + && (prot.getSettingBool(ProtectConfig.prevent_creeper_explosion) + || prot.getSettingBool(ProtectConfig.prevent_creeper_blockdmg) + || (maxHeight >= 0 && event.getLocation().getBlockY() > maxHeight))) + { + //Nicccccccccce plaaacccccccccce.. + event.setCancelled(true); + event.getLocation().getWorld().createExplosion(event.getLocation(), 0F); + } + else if (entity instanceof TNTPrimed + && prot.getSettingBool(ProtectConfig.prevent_tnt_explosion)) + { + event.setCancelled(true); + + } + else if ((entity instanceof Fireball || entity instanceof SmallFireball) + && prot.getSettingBool(ProtectConfig.prevent_fireball_explosion)) + { + event.setCancelled(true); + + } + else if ((entity instanceof WitherSkull) + && prot.getSettingBool(ProtectConfig.prevent_witherskull_explosion)) + { + event.setCancelled(true); + } + else if ((entity instanceof ExplosiveMinecart) + && prot.getSettingBool(ProtectConfig.prevent_tntminecart_explosion)) + { + event.setCancelled(true); + } + + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onCreatureSpawn(final CreatureSpawnEvent event) + { + if (event.getEntity() instanceof Player) + { + return; + } + final EntityType creature = event.getEntityType(); + if (creature == null) + { + return; + } + final String creatureName = creature.toString().toLowerCase(Locale.ENGLISH); + if (creatureName == null || creatureName.isEmpty()) + { + return; + } + if (ess.getSettings().getProtectPreventSpawn(creatureName)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onEntityTarget(final EntityTargetEvent event) + { + if (!(event.getTarget() instanceof Player)) + { + return; + } + final User user = ess.getUser(event.getTarget()); + if ((event.getReason() == TargetReason.CLOSEST_PLAYER + || event.getReason() == TargetReason.TARGET_ATTACKED_ENTITY + || event.getReason() == TargetReason.PIG_ZOMBIE_TARGET + || event.getReason() == TargetReason.RANDOM_TARGET + || event.getReason() == TargetReason.DEFEND_VILLAGE + || event.getReason() == TargetReason.TARGET_ATTACKED_OWNER + || event.getReason() == TargetReason.OWNER_ATTACKED_TARGET) + && prot.getSettingBool(ProtectConfig.prevent_entitytarget) + && !user.isAuthorized("essentials.protect.entitytarget.bypass")) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onExplosionPrime(ExplosionPrimeEvent event) + { + if ((event.getEntity() instanceof Fireball || event.getEntity() instanceof SmallFireball) + && prot.getSettingBool(ProtectConfig.prevent_fireball_fire)) + { + event.setFire(false); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onEntityChangeBlock(EntityChangeBlockEvent event) + { + if (event.getEntityType() == EntityType.ENDERMAN && prot.getSettingBool(ProtectConfig.prevent_enderman_pickup)) + { + event.setCancelled(true); + return; + } + if (event.getEntityType() == EntityType.WITHER && prot.getSettingBool(ProtectConfig.prevent_wither_blockreplace)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPaintingBreak(HangingBreakByEntityEvent event) + { + if ((event.getCause() == HangingBreakEvent.RemoveCause.ENTITY) + && ((event.getRemover() instanceof Creeper) && prot.getSettingBool(ProtectConfig.prevent_creeper_explosion) + || (((event.getRemover() instanceof Fireball) || (event.getRemover() instanceof SmallFireball)) && prot.getSettingBool(ProtectConfig.prevent_fireball_explosion)) + || ((event.getRemover() instanceof TNTPrimed) && prot.getSettingBool(ProtectConfig.prevent_tnt_explosion)) + || ((event.getRemover() instanceof WitherSkull) && prot.getSettingBool(ProtectConfig.prevent_witherskull_explosion)))) + { + event.setCancelled(true); + } + } +} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java deleted file mode 100644 index 6e515e56d8..0000000000 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java +++ /dev/null @@ -1,92 +0,0 @@ -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 -{ - private final transient IProtect prot; - private final transient IEssentials ess; - - public EssentialsProtectPlayerListener(final IProtect prot) - { - this.prot = prot; - this.ess = prot.getEssentialsConnect().getEssentials(); - } - - @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(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(); - boolean first = true; - final Block blockClicked = event.getClickedBlock(); - for (String owner : prot.getStorage().getOwners(blockClicked)) - { - if (!first) - { - stringBuilder.append(", "); - } - first = false; - stringBuilder.append(owner); - } - final String ownerNames = stringBuilder.toString(); - if (ownerNames != null && !ownerNames.isEmpty()) - { - 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")); - } - } -} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectWeatherListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectWeatherListener.java index 1b8dd19ffe..ed621a6757 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectWeatherListener.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectWeatherListener.java @@ -1,52 +1,48 @@ -package com.earth2me.essentials.protect; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.weather.LightningStrikeEvent; -import org.bukkit.event.weather.ThunderChangeEvent; -import org.bukkit.event.weather.WeatherChangeEvent; - - -public class EssentialsProtectWeatherListener implements Listener -{ - private final transient IProtect prot; - - public EssentialsProtectWeatherListener(final IProtect prot) - { - this.prot = prot; - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onWeatherChange(final WeatherChangeEvent event) - { - if (!event.isCancelled() - && prot.getSettingBool(ProtectConfig.disable_weather_storm) - && event.toWeatherState()) - { - event.setCancelled(true); - } - - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onLightningStrike(final LightningStrikeEvent event) - { - if (!event.isCancelled() - && prot.getSettingBool(ProtectConfig.disable_weather_lightning)) - { - event.setCancelled(true); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onThunderChange(final ThunderChangeEvent event) - { - if (!event.isCancelled() - && prot.getSettingBool(ProtectConfig.disable_weather_thunder) - && event.toThunderState()) - { - event.setCancelled(true); - } - } -} +package com.earth2me.essentials.protect; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.weather.LightningStrikeEvent; +import org.bukkit.event.weather.ThunderChangeEvent; +import org.bukkit.event.weather.WeatherChangeEvent; + + +public class EssentialsProtectWeatherListener implements Listener +{ + private final IProtect prot; + + public EssentialsProtectWeatherListener(final IProtect prot) + { + this.prot = prot; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onWeatherChange(final WeatherChangeEvent event) + { + if (prot.getSettingBool(ProtectConfig.disable_weather_storm) + && event.toWeatherState()) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onLightningStrike(final LightningStrikeEvent event) + { + if (prot.getSettingBool(ProtectConfig.disable_weather_lightning)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onThunderChange(final ThunderChangeEvent event) + { + if (prot.getSettingBool(ProtectConfig.disable_weather_thunder) + && event.toThunderState()) + { + event.setCancelled(true); + } + } +} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/IProtect.java b/EssentialsProtect/src/com/earth2me/essentials/protect/IProtect.java index afcb6e8cef..e3acaabce8 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/IProtect.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/IProtect.java @@ -1,6 +1,5 @@ package com.earth2me.essentials.protect; -import com.earth2me.essentials.protect.data.IProtectedBlock; import java.util.List; import java.util.Map; import org.bukkit.plugin.Plugin; @@ -8,16 +7,10 @@ public interface IProtect extends Plugin { - boolean checkProtectionItems(final ProtectConfig list, final int id); - boolean getSettingBool(final ProtectConfig protectConfig); String getSettingString(final ProtectConfig protectConfig); - - IProtectedBlock getStorage(); - - void setStorage(IProtectedBlock pb); - + EssentialsConnect getEssentialsConnect(); Map getSettingsBoolean(); diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/ProtectConfig.java b/EssentialsProtect/src/com/earth2me/essentials/protect/ProtectConfig.java index bee8d0f4d6..2faef22edb 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/ProtectConfig.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/ProtectConfig.java @@ -3,15 +3,8 @@ public enum ProtectConfig { - datatype("protect.datatype", "sqlite"), - mysqlDB("protect.mysqlDb", "jdbc:mysql://localhost:3306/minecraft"), - dbUsername("protect.username", "root"), - dbPassword("protect.password", ""), - 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), @@ -19,6 +12,7 @@ public enum ProtectConfig disable_firedmg("protect.disable.firedmg", false), disable_lightning("protect.disable.lightning", false), disable_drown("protect.disable.drown", false), + disable_wither("protect.disable.wither", false), disable_weather_storm("protect.disable.weather.storm", false), disable_weather_lightning("protect.disable.weather.lightning", false), disable_weather_thunder("protect.disable.weather.thunder", false), @@ -33,9 +27,15 @@ public enum ProtectConfig prevent_block_on_rail("protect.protect.prevent-block-on-rails", false), prevent_tnt_explosion("protect.prevent.tnt-explosion", false), prevent_tnt_playerdmg("protect.prevent.tnt-playerdamage", false), + prevent_tntminecart_explosion("protect.prevent.tnt-minecart-explosion", false), + prevent_tntminecart_playerdmg("protect.prevent.tnt-minecart-playerdamage", false), prevent_fireball_explosion("protect.prevent.fireball-explosion", false), prevent_fireball_fire("protect.prevent.fireball-fire", false), prevent_fireball_playerdmg("protect.prevent.fireball-playerdamage", false), + prevent_witherskull_explosion("protect.prevent.witherskull-explosion", false), + prevent_witherskull_playerdmg("protect.prevent.witherskull-playerdamage", false), + prevent_wither_spawnexplosion("protect.prevent.wither-spawnexplosion", false), + prevent_wither_blockreplace("protect.prevent.wither-blockreplace", false), prevent_creeper_explosion("protect.prevent.creeper-explosion", true), prevent_creeper_playerdmg("protect.prevent.creeper-playerdamage", false), prevent_creeper_blockdmg("protect.prevent.creeper-blockdamage", false), @@ -43,18 +43,7 @@ public enum ProtectConfig prevent_villager_death("protect.prevent.villager-death", false), prevent_enderdragon_blockdmg("protect.prevent.enderdragon-blockdamage", true), prevent_entitytarget("protect.prevent.entitytarget", false), - protect_rails("protect.protect.rails", true), - 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; diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/IProtectedBlock.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/IProtectedBlock.java deleted file mode 100644 index 755bafaced..0000000000 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/data/IProtectedBlock.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.earth2me.essentials.protect.data; - -import java.util.List; -import org.bukkit.block.Block; - - -public interface IProtectedBlock -{ - public void clearProtections(); - - public void importProtections(List blocks); - - public List exportProtections(); - - public void protectBlock(Block block, String playerName); - - public boolean isProtected(Block block, String playerName); - - public List getOwners(Block block); - - public int unprotectBlock(Block block); - - public void onPluginDeactivation(); -} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/OwnedBlock.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/OwnedBlock.java deleted file mode 100644 index dc28feae8d..0000000000 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/data/OwnedBlock.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.earth2me.essentials.protect.data; - - -public class OwnedBlock -{ - final int x; - final int y; - final int z; - final String world; - final String playerName; - - public OwnedBlock(int x, int y, int z, String world, String playerName) - { - this.x = x; - this.y = y; - this.z = z; - this.world = world; - this.playerName = playerName; - } -} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockJDBC.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockJDBC.java deleted file mode 100644 index e24a71b80a..0000000000 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockJDBC.java +++ /dev/null @@ -1,426 +0,0 @@ -package com.earth2me.essentials.protect.data; - -import com.mchange.v2.c3p0.ComboPooledDataSource; -import java.beans.PropertyVetoException; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.bukkit.block.Block; - - -public abstract class ProtectedBlockJDBC implements IProtectedBlock -{ - protected static final Logger LOGGER = Logger.getLogger("Minecraft"); - protected final transient ComboPooledDataSource cpds; - - protected abstract PreparedStatement getStatementCreateTable(Connection conn) throws SQLException; - - protected abstract PreparedStatement getStatementUpdateFrom2_0Table(Connection conn) throws SQLException; - - protected abstract PreparedStatement getStatementDeleteAll(Connection conn) throws SQLException; - - protected abstract PreparedStatement getStatementInsert(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException; - - protected abstract PreparedStatement getStatementPlayerCountByLocation(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException; - - protected abstract PreparedStatement getStatementPlayersByLocation(Connection conn, String name, int x, int y, int z) throws SQLException; - - protected abstract PreparedStatement getStatementDeleteByLocation(Connection conn, String world, int x, int y, int z) throws SQLException; - - protected abstract PreparedStatement getStatementAllBlocks(Connection conn) throws SQLException; - - public ProtectedBlockJDBC(String driver, String url) throws PropertyVetoException - { - this(driver, url, null, null); - } - - public ProtectedBlockJDBC(String driver, String url, String username, String password) throws PropertyVetoException - { - cpds = new ComboPooledDataSource(); - cpds.setDriverClass(driver); - cpds.setJdbcUrl(url); - if (username != null) - { - cpds.setUser(username); - cpds.setPassword(password); - } - cpds.setMaxStatements(20); - createAndConvertTable(); - } - - private void createAndConvertTable() - { - Connection conn = null; - PreparedStatement ps = null; - try - { - conn = cpds.getConnection(); - ps = getStatementCreateTable(conn); - ps.execute(); - ps.close(); - ps = getStatementUpdateFrom2_0Table(conn); - ps.execute(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - finally - { - if (ps != null) - { - try - { - ps.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (conn != null) - { - try - { - conn.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - } - } - - public void clearProtections() - { - Connection conn = null; - PreparedStatement ps = null; - try - { - conn = cpds.getConnection(); - ps = getStatementDeleteAll(conn); - ps.executeUpdate(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - finally - { - if (ps != null) - { - try - { - ps.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (conn != null) - { - try - { - conn.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - } - } - - public void importProtections(List blocks) - { - for (OwnedBlock ownedBlock : blocks) - { - if (ownedBlock.playerName == null) - { - continue; - } - protectBlock(ownedBlock.world, ownedBlock.x, ownedBlock.y, ownedBlock.z, ownedBlock.playerName); - } - } - - public List exportProtections() - { - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - List blocks = new ArrayList(); - try - { - conn = cpds.getConnection(); - ps = getStatementAllBlocks(conn); - rs = ps.executeQuery(); - while (rs.next()) - { - OwnedBlock ob = new OwnedBlock( - rs.getInt(2), - rs.getInt(3), - rs.getInt(4), - rs.getString(1), - rs.getString(5)); - blocks.add(ob); - } - return blocks; - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - return blocks; - } - finally - { - if (rs != null) - { - try - { - rs.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (ps != null) - { - try - { - ps.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (conn != null) - { - try - { - conn.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - } - } - - public void protectBlock(Block block, String playerName) - { - protectBlock(block.getWorld().getName(), block.getX(), block.getY(), block.getZ(), playerName); - } - - private void protectBlock(String world, int x, int y, int z, String playerName) - { - Connection conn = null; - PreparedStatement ps = null; - try - { - conn = cpds.getConnection(); - ps = getStatementInsert(conn, world, x, y, z, playerName); - ps.executeUpdate(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - finally - { - if (ps != null) - { - try - { - ps.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (conn != null) - { - try - { - conn.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - } - } - - public boolean isProtected(Block block, String playerName) - { - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - try - { - conn = cpds.getConnection(); - ps = getStatementPlayerCountByLocation(conn, block.getWorld().getName(), block.getX(), block.getY(), block.getZ(), playerName); - rs = ps.executeQuery(); - return rs.next() && rs.getInt(1) > 0 && rs.getInt(2) == 0; - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - return true; - } - finally - { - if (rs != null) - { - try - { - rs.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (ps != null) - { - try - { - ps.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (conn != null) - { - try - { - conn.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - } - } - - public List getOwners(Block block) - { - Connection conn = null; - PreparedStatement ps = null; - ResultSet rs = null; - List owners = new ArrayList(); - try - { - conn = cpds.getConnection(); - ps = getStatementPlayersByLocation(conn, block.getWorld().getName(), block.getX(), block.getY(), block.getZ()); - rs = ps.executeQuery(); - while (rs.next()) - { - owners.add(rs.getString(1)); - } - return owners; - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - return owners; - } - finally - { - if (rs != null) - { - try - { - rs.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (ps != null) - { - try - { - ps.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (conn != null) - { - try - { - conn.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - } - } - - public int unprotectBlock(Block block) - { - Connection conn = null; - PreparedStatement ps = null; - try - { - conn = cpds.getConnection(); - ps = getStatementDeleteByLocation(conn, block.getWorld().getName(), block.getX(), block.getY(), block.getZ()); - return ps.executeUpdate(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - return 0; - } - finally - { - if (ps != null) - { - try - { - ps.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - if (conn != null) - { - try - { - conn.close(); - } - catch (SQLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - } - } - - public void onPluginDeactivation() - { - cpds.close(); - } -} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMemory.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMemory.java deleted file mode 100644 index 876c8a575d..0000000000 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMemory.java +++ /dev/null @@ -1,248 +0,0 @@ -package com.earth2me.essentials.protect.data; - -import java.util.Map.Entry; -import java.util.*; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.plugin.Plugin; - - -public class ProtectedBlockMemory implements IProtectedBlock -{ - private final transient List worlds = new ArrayList(); - private final transient List playerNames = new ArrayList(); - private final transient IProtectedBlock storage; - private final transient Plugin plugin; - - - static class ProtectedLocation - { - private final transient int x; - private final transient int y; - private final transient int z; - private final transient int w; - - public ProtectedLocation(final Block block, final int worldId) - { - this.x = block.getX(); - this.y = block.getY(); - this.z = block.getZ(); - this.w = worldId; - } - - public ProtectedLocation(final OwnedBlock ownedBlock, final int worldId) - { - this.x = ownedBlock.x; - this.y = ownedBlock.y; - this.z = ownedBlock.z; - this.w = worldId; - } - - @Override - public boolean equals(final Object object) - { - if (object instanceof ProtectedLocation) - { - final ProtectedLocation pLoc = (ProtectedLocation)object; - return x == pLoc.x && y == pLoc.y && z == pLoc.z && w == pLoc.w; - } - return false; - } - - @Override - public int hashCode() - { - return x ^ y ^ z ^ w; - } - } - - - static class ProtectedBy - { - private transient int playerId = -1; - private transient Set playerIds; - - public void add(final int playerId) - { - if (this.playerId == -1 || this.playerId == playerId) - { - this.playerId = playerId; - } - else - { - if (playerIds == null) - { - playerIds = new HashSet(4); - playerIds.add(this.playerId); - } - playerIds.add(playerId); - } - } - - public boolean contains(final int playerId) - { - if (playerIds == null) - { - return this.playerId == playerId; - } - return playerIds.contains(playerId); - } - - public List getPlayers(final List playerNames) - { - final List list = new ArrayList(2); - if (playerIds == null) - { - list.add(playerNames.get(playerId)); - } - else - { - for (Integer integer : playerIds) - { - list.add(playerNames.get(integer)); - } - } - return list; - } - - public int size() - { - if (playerIds == null) - { - return 1; - } - return playerIds.size(); - } - } - private final transient Map blocks = new HashMap(); - - public ProtectedBlockMemory(final IProtectedBlock storage, final Plugin plugin) - { - this.storage = storage; - this.plugin = plugin; - importProtections(storage.exportProtections()); - } - - public void clearProtections() - { - blocks.clear(); - } - - public final void importProtections(final List blocks) - { - for (OwnedBlock ownedBlock : blocks) - { - final ProtectedLocation pl = new ProtectedLocation(ownedBlock, getWorldId(ownedBlock.world)); - if (ownedBlock.playerName == null) - { - continue; - } - protectBlock(pl, ownedBlock.playerName); - } - } - - public List exportProtections() - { - final List blockList = new ArrayList(blocks.size()); - for (Entry entry : blocks.entrySet()) - { - for (String name : entry.getValue().getPlayers(playerNames)) - { - final OwnedBlock ob = new OwnedBlock( - entry.getKey().x, - entry.getKey().y, - entry.getKey().z, - worlds.get(entry.getKey().w), - name); - blockList.add(ob); - } - } - return blockList; - } - - public void protectBlock(final Block block, final String playerName) - { - final ProtectedLocation pl = new ProtectedLocation(block, getWorldId(block.getWorld())); - protectBlock(pl, playerName); - plugin.getServer().getScheduler().scheduleAsyncDelayedTask(plugin, new Runnable() - { - public void run() - { - storage.protectBlock(block, playerName); - } - }); - } - - private final void protectBlock(ProtectedLocation pl, String playerName) - { - int playerId = getPlayerId(playerName); - ProtectedBy pb = blocks.get(pl); - if (pb == null) - { - pb = new ProtectedBy(); - blocks.put(pl, pb); - } - pb.add(playerId); - } - - public boolean isProtected(Block block, String playerName) - { - int playerId = getPlayerId(playerName); - ProtectedLocation pl = new ProtectedLocation(block, getWorldId(block.getWorld())); - ProtectedBy pb = blocks.get(pl); - return !pb.contains(playerId); - } - - public List getOwners(Block block) - { - ProtectedLocation pl = new ProtectedLocation(block, getWorldId(block.getWorld())); - ProtectedBy pb = blocks.get(pl); - return pb.getPlayers(playerNames); - } - - public int unprotectBlock(final Block block) - { - ProtectedLocation pl = new ProtectedLocation(block, getWorldId(block.getWorld())); - ProtectedBy pb = blocks.remove(pl); - plugin.getServer().getScheduler().scheduleAsyncDelayedTask(plugin, new Runnable() - { - public void run() - { - storage.unprotectBlock(block); - } - }); - return pb.size(); - } - - private int getPlayerId(String playername) - { - int id = playerNames.indexOf(playername); - if (id < 0) - { - playerNames.add(playername); - id = playerNames.indexOf(playername); - } - return id; - } - - private int getWorldId(World world) - { - return getWorldId(world.getName()); - } - - private int getWorldId(String name) - { - int id = worlds.indexOf(name); - if (id < 0) - { - worlds.add(name); - id = worlds.indexOf(name); - } - return id; - } - - public void onPluginDeactivation() - { - storage.onPluginDeactivation(); - } -} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMySQL.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMySQL.java deleted file mode 100644 index 2a00776988..0000000000 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMySQL.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.earth2me.essentials.protect.data; - -import java.beans.PropertyVetoException; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.logging.Level; -import java.util.logging.Logger; - - -public class ProtectedBlockMySQL extends ProtectedBlockJDBC -{ - public ProtectedBlockMySQL(String url, String username, String password) throws PropertyVetoException - { - super("com.mysql.jdbc.Driver", url, username, password); - } - private static final String QueryCreateTable = - "CREATE TABLE IF NOT EXISTS `EssentialsProtect` (" - + "`worldName` varchar(60) NOT NULL," - + "`x` int(11) NOT NULL, `y` int(11) NOT NULL, `z` int(11) NOT NULL," - + "`playerName` varchar(150) DEFAULT NULL," - + "KEY `pos` (`worldName`,`x`,`z`,`y`)" - + ") ENGINE=MyISAM DEFAULT CHARSET=utf8"; - - @Override - protected PreparedStatement getStatementCreateTable(Connection conn) throws SQLException - { - return conn.prepareStatement(QueryCreateTable); - } - private static final String QueryUpdateFrom2_0TableCheck = - "SHOW COLUMNS FROM `EssentialsProtect` LIKE 'id';"; - private static final String QueryUpdateFrom2_0Table = - "ALTER TABLE `EssentialsProtect` " - + "CHARACTER SET = utf8, ENGINE = MyISAM," - + "DROP COLUMN `id`," - + "CHANGE COLUMN `playerName` `playerName` VARCHAR(150) NULL AFTER `z`," - + "CHANGE COLUMN `worldName` `worldName` VARCHAR(60) NOT NULL," - + "ADD INDEX `position` (`worldName` ASC, `x` ASC, `z` ASC, `y` ASC)," - + "DROP PRIMARY KEY ;"; - - @Override - protected PreparedStatement getStatementUpdateFrom2_0Table(Connection conn) throws SQLException - { - PreparedStatement testPS = null; - ResultSet testRS = null; - try - { - testPS = conn.prepareStatement(QueryUpdateFrom2_0TableCheck); - testRS = testPS.executeQuery(); - if (testRS.first()) - { - return conn.prepareStatement(QueryUpdateFrom2_0Table); - } - else - { - return conn.prepareStatement("SELECT 1;"); - } - } - finally - { - if (testRS != null) - { - try - { - testRS.close(); - } - catch (SQLException ex) - { - Logger.getLogger(ProtectedBlockMySQL.class.getName()).log(Level.SEVERE, null, ex); - } - } - if (testPS != null) - { - try - { - testPS.close(); - } - catch (SQLException ex) - { - Logger.getLogger(ProtectedBlockMySQL.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - } - private static final String QueryDeleteAll = "DELETE FROM EssentialsProtect;"; - - @Override - protected PreparedStatement getStatementDeleteAll(Connection conn) throws SQLException - { - return conn.prepareStatement(QueryDeleteAll); - } - private static final String QueryInsert = - "INSERT INTO EssentialsProtect (worldName, x, y, z, playerName) VALUES (?, ?, ?, ?, ?);"; - - @Override - protected PreparedStatement getStatementInsert(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException - { - PreparedStatement ps = conn.prepareStatement(QueryInsert); - ps.setString(1, world); - ps.setInt(2, x); - ps.setInt(3, y); - ps.setInt(4, z); - ps.setString(5, playerName); - return ps; - } - private static final String QueryCountByPlayer = - "SELECT COUNT(playerName), SUM(playerName = ?) FROM EssentialsProtect " - + "WHERE worldName = ? AND x = ? AND y = ? AND z = ? GROUP BY x;"; - - @Override - protected PreparedStatement getStatementPlayerCountByLocation(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException - { - PreparedStatement ps = conn.prepareStatement(QueryCountByPlayer); - ps.setString(1, playerName); - ps.setString(2, world); - ps.setInt(3, x); - ps.setInt(4, y); - ps.setInt(5, z); - return ps; - } - private static final String QueryPlayersByLocation = - "SELECT playerName FROM EssentialsProtect WHERE worldname = ? AND x = ? AND y = ? AND z = ?;"; - - @Override - protected PreparedStatement getStatementPlayersByLocation(Connection conn, String world, int x, int y, int z) throws SQLException - { - PreparedStatement ps = conn.prepareStatement(QueryPlayersByLocation); - ps.setString(1, world); - ps.setInt(2, x); - ps.setInt(3, y); - ps.setInt(4, z); - return ps; - } - private static final String QueryDeleteByLocation = - "DELETE FROM EssentialsProtect WHERE worldName = ? AND x = ? AND y = ? AND z = ?;"; - - @Override - protected PreparedStatement getStatementDeleteByLocation(Connection conn, String world, int x, int y, int z) throws SQLException - { - PreparedStatement ps = conn.prepareStatement(QueryDeleteByLocation); - ps.setString(1, world); - ps.setInt(2, x); - ps.setInt(3, y); - ps.setInt(4, z); - return ps; - } - private static final String QueryAllBlocks = - "SELECT worldName, x, y, z, playerName FROM EssentialsProtect;"; - - @Override - protected PreparedStatement getStatementAllBlocks(Connection conn) throws SQLException - { - return conn.prepareStatement(QueryAllBlocks); - } -} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockSQLite.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockSQLite.java deleted file mode 100644 index cf256f1ec2..0000000000 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockSQLite.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.earth2me.essentials.protect.data; - -import java.beans.PropertyVetoException; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; - - -public class ProtectedBlockSQLite extends ProtectedBlockJDBC -{ - public ProtectedBlockSQLite(String url) throws PropertyVetoException - { - super("org.sqlite.JDBC", url); - } - private static final String QueryCreateTable = - "CREATE TABLE IF NOT EXISTS EssentialsProtect (" - + "worldName TEXT ,playerName TEXT, " - + "x NUMERIC, y NUMERIC, z NUMERIC)"; - - @Override - protected PreparedStatement getStatementCreateTable(Connection conn) throws SQLException - { - return conn.prepareStatement(QueryCreateTable); - } - private static final String QueryUpdateFrom2_0Table = - "CREATE INDEX IF NOT EXISTS position ON EssentialsProtect (" - + "worldName, x, z, y)"; - - @Override - protected PreparedStatement getStatementUpdateFrom2_0Table(Connection conn) throws SQLException - { - return conn.prepareStatement(QueryUpdateFrom2_0Table); - } - private static final String QueryDeleteAll = "DELETE FROM EssentialsProtect;"; - - @Override - protected PreparedStatement getStatementDeleteAll(Connection conn) throws SQLException - { - return conn.prepareStatement(QueryDeleteAll); - } - private static final String QueryInsert = - "INSERT INTO EssentialsProtect (worldName, x, y, z, playerName) VALUES (?, ?, ?, ?, ?);"; - - @Override - protected PreparedStatement getStatementInsert(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException - { - PreparedStatement ps = conn.prepareStatement(QueryInsert); - ps.setString(1, world); - ps.setInt(2, x); - ps.setInt(3, y); - ps.setInt(4, z); - ps.setString(5, playerName); - return ps; - } - private static final String QueryPlayerCountByLocation = - "SELECT COUNT(playerName), SUM(playerName = ?) FROM EssentialsProtect " - + "WHERE worldName = ? AND x = ? AND y = ? AND z = ? GROUP BY x;"; - - @Override - protected PreparedStatement getStatementPlayerCountByLocation(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException - { - PreparedStatement ps = conn.prepareStatement(QueryPlayerCountByLocation); - ps.setString(1, playerName); - ps.setString(2, world); - ps.setInt(3, x); - ps.setInt(4, y); - ps.setInt(5, z); - return ps; - } - private static final String QueryPlayersByLocation = - "SELECT playerName FROM EssentialsProtect WHERE worldname = ? AND x = ? AND y = ? AND z = ?;"; - - @Override - protected PreparedStatement getStatementPlayersByLocation(Connection conn, String world, int x, int y, int z) throws SQLException - { - PreparedStatement ps = conn.prepareStatement(QueryPlayersByLocation); - ps.setString(1, world); - ps.setInt(2, x); - ps.setInt(3, y); - ps.setInt(4, z); - return ps; - } - private static final String QueryDeleteByLocation = - "DELETE FROM EssentialsProtect WHERE worldName = ? AND x = ? AND y = ? AND z = ?;"; - - @Override - protected PreparedStatement getStatementDeleteByLocation(Connection conn, String world, int x, int y, int z) throws SQLException - { - PreparedStatement ps = conn.prepareStatement(QueryDeleteByLocation); - ps.setString(1, world); - ps.setInt(2, x); - ps.setInt(3, y); - ps.setInt(4, z); - return ps; - } - private static final String QueryAllBlocks = - "SELECT worldName, x, y, z, playerName FROM EssentialsProtect;"; - - @Override - protected PreparedStatement getStatementAllBlocks(Connection conn) throws SQLException - { - return conn.prepareStatement(QueryAllBlocks); - } -} diff --git a/EssentialsProtect/src/plugin.yml b/EssentialsProtect/src/plugin.yml index 6407c45ee2..bf7389a913 100644 --- a/EssentialsProtect/src/plugin.yml +++ b/EssentialsProtect/src/plugin.yml @@ -3,7 +3,7 @@ name: EssentialsProtect main: com.earth2me.essentials.protect.EssentialsProtect # Note to developers: This next line cannot change, or the automatic versioning system will break. version: TeamCity -website: http://www.earth2me.net:8001/ +website: http://tiny.cc/EssentialsCommands description: Provides protection for various parts of the world. authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits] softdepend: [Essentials] \ No newline at end of file diff --git a/EssentialsSpawn/nbproject/build-impl.xml b/EssentialsSpawn/nbproject/build-impl.xml index cf349590c5..0164b44345 100644 --- a/EssentialsSpawn/nbproject/build-impl.xml +++ b/EssentialsSpawn/nbproject/build-impl.xml @@ -12,9 +12,9 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup @@ -181,6 +181,7 @@ is divided into following sections: + @@ -225,6 +226,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -357,11 +379,52 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -370,32 +433,270 @@ is divided into following sections: - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -427,10 +728,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -488,6 +792,7 @@ is divided into following sections: + @@ -504,6 +809,7 @@ is divided into following sections: + @@ -511,6 +817,7 @@ is divided into following sections: + @@ -537,6 +844,9 @@ is divided into following sections: + + + @@ -582,7 +892,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -813,8 +1127,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -822,12 +1137,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -839,12 +1150,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -866,6 +1173,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -952,14 +1295,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -972,39 +1315,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1076,9 +1420,12 @@ is divided into following sections: - - - + + + + + + diff --git a/EssentialsSpawn/nbproject/genfiles.properties b/EssentialsSpawn/nbproject/genfiles.properties index 15d04622b8..fea5f84496 100644 --- a/EssentialsSpawn/nbproject/genfiles.properties +++ b/EssentialsSpawn/nbproject/genfiles.properties @@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=28e38971@1.38.2.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=e7b96939 -nbproject/build-impl.xml.script.CRC32=f45f4172 -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 +nbproject/build-impl.xml.script.CRC32=731b5e85 +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java index 6335d6c69c..be34d39bd6 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java @@ -1,9 +1,11 @@ package com.earth2me.essentials.spawn; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.Console; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; import com.earth2me.essentials.commands.EssentialsCommand; +import com.earth2me.essentials.commands.NoChargeException; import com.earth2me.essentials.commands.NotEnoughArgumentsException; import org.bukkit.Location; import org.bukkit.Server; @@ -26,7 +28,7 @@ public void run(final Server server, final User user, final String commandLabel, if (args.length > 0 && user.isAuthorized("essentials.spawn.others")) { final User otherUser = getPlayer(server, args, 0); - respawn(otherUser, null); + respawn(otherUser, charge); if (!otherUser.equals(user)) { otherUser.sendMessage(_("teleportAtoB", user.getDisplayName(), "spawn")); @@ -35,8 +37,9 @@ public void run(final Server server, final User user, final String commandLabel, } else { - respawn(user, null); + respawn(user, charge); } + throw new NoChargeException(); } @Override @@ -48,7 +51,7 @@ protected void run(final Server server, final CommandSender sender, final String } final User user = getPlayer(server, args, 0); respawn(user, null); - user.sendMessage(_("teleportAtoB", user.getDisplayName(), "spawn")); + user.sendMessage(_("teleportAtoB", Console.NAME, "spawn")); sender.sendMessage(_("teleporting")); } diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java index f0c5ee4663..88be7169e5 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java @@ -23,6 +23,7 @@ public class EssentialsSpawn extends JavaPlugin private transient IEssentials ess; private transient SpawnStorage spawns; + @Override public void onEnable() { final PluginManager pluginManager = getServer().getPluginManager(); @@ -59,13 +60,13 @@ public void execute(final Listener ll, final Event event) throws EventException }, this); } + @Override public void onDisable() { } @Override - public boolean onCommand(final CommandSender sender, final Command command, - final String commandLabel, final String[] args) + public boolean onCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) { return ess.onCommandEssentials(sender, command, commandLabel, args, EssentialsSpawn.class.getClassLoader(), "com.earth2me.essentials.spawn.Command", "essentials.", spawns); } diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java index ba71c176f1..eecbe5b03f 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java @@ -1,7 +1,10 @@ package com.earth2me.essentials.spawn; -import com.earth2me.essentials.*; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.Kit; +import com.earth2me.essentials.OfflinePlayer; +import com.earth2me.essentials.User; import com.earth2me.essentials.textreader.IText; import com.earth2me.essentials.textreader.KeywordReplacer; import com.earth2me.essentials.textreader.SimpleTextPager; @@ -12,7 +15,7 @@ import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -45,7 +48,7 @@ public void onPlayerRespawn(final PlayerRespawnEvent event) { Location home; final Location bed = user.getBedSpawnLocation(); - if (bed != null && bed.getBlock().getType() == Material.BED_BLOCK) + if (bed != null) { home = bed; } @@ -68,42 +71,70 @@ public void onPlayerRespawn(final PlayerRespawnEvent event) public void onPlayerJoin(final PlayerJoinEvent event) { - if (event.getPlayer().hasPlayedBefore()) + ess.runTaskAsynchronously(new Runnable() + { + @Override + public void run() + { + delayedJoin(event.getPlayer()); + } + }); + } + + public void delayedJoin(Player player) + { + if (player.hasPlayedBefore()) { LOGGER.log(Level.FINE, "Old player join"); return; } - final User user = ess.getUser(event.getPlayer()); + final User user = ess.getUser(player); if (!"none".equalsIgnoreCase(ess.getSettings().getNewbieSpawn())) { ess.scheduleSyncDelayedTask(new NewPlayerTeleport(user), 1L); } - if (ess.getSettings().getAnnounceNewPlayers()) - { - final IText output = new KeywordReplacer(ess.getSettings().getAnnounceNewPlayerFormat(), user, ess); - final SimpleTextPager pager = new SimpleTextPager(output); - ess.broadcastMessage(user, pager.getString(0)); - } - - final String kitName = ess.getSettings().getNewPlayerKit(); - if (!kitName.isEmpty()) + ess.scheduleSyncDelayedTask(new Runnable() { - try - { - final Map kit = ess.getSettings().getKit(kitName.toLowerCase(Locale.ENGLISH)); - final List items = Kit.getItems(user, kit); - Kit.expandItems(ess, user, items); - } - catch (Exception ex) + @Override + public void run() { - LOGGER.log(Level.WARNING, ex.getMessage()); - } - } + if (!user.isOnline()) { + return; + } + + //This method allows for multiple line player announce messages using multiline yaml syntax #EasterEgg + if (ess.getSettings().getAnnounceNewPlayers()) + { + final IText output = new KeywordReplacer(ess.getSettings().getAnnounceNewPlayerFormat(), user, ess); + final SimpleTextPager pager = new SimpleTextPager(output); - LOGGER.log(Level.FINE, "New player join"); + for (String line : pager.getLines()) + { + ess.broadcastMessage(user, line); + } + } + + final String kitName = ess.getSettings().getNewPlayerKit(); + if (!kitName.isEmpty()) + { + try + { + final Map kit = ess.getSettings().getKit(kitName.toLowerCase(Locale.ENGLISH)); + final List items = Kit.getItems(user, kit); + Kit.expandItems(ess, user, items); + } + catch (Exception ex) + { + LOGGER.log(Level.WARNING, ex.getMessage()); + } + } + + LOGGER.log(Level.FINE, "New player join"); + } + }); } diff --git a/EssentialsUpdate/nbproject/genfiles.properties b/EssentialsUpdate/nbproject/genfiles.properties deleted file mode 100644 index 6e1d2aeac5..0000000000 --- a/EssentialsUpdate/nbproject/genfiles.properties +++ /dev/null @@ -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=94e69885 -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 diff --git a/EssentialsUpdate/nbproject/pmd.settings b/EssentialsUpdate/nbproject/pmd.settings deleted file mode 100644 index 6a34e356cc..0000000000 --- a/EssentialsUpdate/nbproject/pmd.settings +++ /dev/null @@ -1 +0,0 @@ -DoNotUseThreads diff --git a/EssentialsUpdate/nbproject/project.xml b/EssentialsUpdate/nbproject/project.xml deleted file mode 100644 index 6b0efd00f9..0000000000 --- a/EssentialsUpdate/nbproject/project.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - EssentialsUpdate - - - - - - - - - ../lib/nblibraries.properties - - - diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/AbstractWorkListener.java b/EssentialsUpdate/src/com/earth2me/essentials/update/AbstractWorkListener.java deleted file mode 100644 index d2cbb8a64b..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/AbstractWorkListener.java +++ /dev/null @@ -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; - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/EssentialsHelp.java b/EssentialsUpdate/src/com/earth2me/essentials/update/EssentialsHelp.java deleted file mode 100644 index 7dd46451a4..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/EssentialsHelp.java +++ /dev/null @@ -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.PlayerChatEvent; -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 commands = new HashMap(); - - 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 PlayerChatEvent event) - { - if (event.getPlayer() == chatUser) - { - final boolean success = sendChatMessage(event.getPlayer(), event.getMessage()); - event.setCancelled(success); - } - } - - @EventHandler - public void onPlayerQuit(final PlayerQuitEvent event) - { - closeConnection(); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/EssentialsUpdate.java b/EssentialsUpdate/src/com/earth2me/essentials/update/EssentialsUpdate.java deleted file mode 100644 index be6e42ce93..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/EssentialsUpdate.java +++ /dev/null @@ -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; - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/GetFile.java b/EssentialsUpdate/src/com/earth2me/essentials/update/GetFile.java deleted file mode 100644 index 06b414e938..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/GetFile.java +++ /dev/null @@ -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."); - } - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/ModuleInfo.java b/EssentialsUpdate/src/com/earth2me/essentials/update/ModuleInfo.java deleted file mode 100644 index 722fca3e1b..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/ModuleInfo.java +++ /dev/null @@ -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; - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/PastieUpload.java b/EssentialsUpdate/src/com/earth2me/essentials/update/PastieUpload.java deleted file mode 100644 index 6cad44e4d3..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/PastieUpload.java +++ /dev/null @@ -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 map = new HashMap(); - 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"); - } - } -} \ No newline at end of file diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/PostToUrl.java b/EssentialsUpdate/src/com/earth2me/essentials/update/PostToUrl.java deleted file mode 100644 index c8978961bc..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/PostToUrl.java +++ /dev/null @@ -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 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 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(); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateCheck.java b/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateCheck.java deleted file mode 100644 index 29afc4d3f4..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateCheck.java +++ /dev/null @@ -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 versions = updateFile.getVersions(); - final int bukkitVersion = getBukkitVersion(); - Version higher = null; - Version found = null; - Version lower = null; - int bukkitHigher = 0; - int bukkitLower = 0; - for (Entry 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; - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateFile.java b/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateFile.java deleted file mode 100644 index 3d465e2e83..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateFile.java +++ /dev/null @@ -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 versions = new TreeMap(); - - 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 getVersions() - { - return Collections.unmodifiableMap(versions.descendingMap()); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateProcess.java b/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateProcess.java deleted file mode 100644 index 9fa587f8f2..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/UpdateProcess.java +++ /dev/null @@ -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.PlayerChatEvent; -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 PlayerChatEvent 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(); - } - }); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/Version.java b/EssentialsUpdate/src/com/earth2me/essentials/update/Version.java deleted file mode 100644 index a82f49abf5..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/Version.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.earth2me.essentials.update; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -public class Version implements Comparable -{ - 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(); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/VersionInfo.java b/EssentialsUpdate/src/com/earth2me/essentials/update/VersionInfo.java deleted file mode 100644 index c06aa2e641..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/VersionInfo.java +++ /dev/null @@ -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 changelog; - private final transient int minBukkit; - private final transient int maxBukkit; - private final transient Map 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(); - final String modulesPath = path + ".modules"; - for (String module : updateConfig.getKeys(false)) - { - modules.put(module, new ModuleInfo(updateConfig, modulesPath + module)); - } - } - - public List getChangelog() - { - return Collections.unmodifiableList(changelog); - } - - public int getMinBukkit() - { - return minBukkit; - } - - public int getMaxBukkit() - { - return maxBukkit; - } - - public Map getModules() - { - return Collections.unmodifiableMap(modules); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/AbstractFileCommand.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/AbstractFileCommand.java deleted file mode 100644 index 7c99d28f64..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/AbstractFileCommand.java +++ /dev/null @@ -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()); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/Command.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/Command.java deleted file mode 100644 index ad4c75e432..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/Command.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.earth2me.essentials.update.chat; - -import org.bukkit.entity.Player; - - -public interface Command -{ - void run(final IrcBot ircBot, final Player player); -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ConfigCommand.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ConfigCommand.java deleted file mode 100644 index de2c6a8308..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ConfigCommand.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.earth2me.essentials.update.chat; - -import java.io.BufferedReader; -import java.io.IOException; -import java.util.logging.Level; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public class ConfigCommand extends AbstractFileCommand implements Command -{ - public ConfigCommand(final Plugin plugin) - { - super(plugin); - } - - @Override - public void run(final IrcBot ircBot, final Player player) - { - BufferedReader page = null; - try - { - page = getPluginConfig("Essentials", "config.yml"); - final StringBuilder input = new StringBuilder(); - do - { - final String line = page.readLine(); - if (line == null) - { - break; - } - else - { - input.append(line).append("\n"); - } - } - while (true); - page.close(); - final String message = "Essentials config.yml: " + uploadToPastie(input); - player.sendMessage("§6" + ircBot.getNick() + ": §7" + message); - ircBot.sendMessage(message); - } - catch (IOException ex) - { - Bukkit.getLogger().log(Level.SEVERE, null, ex); - player.sendMessage(ex.getMessage()); - } - finally - { - try - { - if (page != null) - { - page.close(); - } - } - catch (IOException ex) - { - Bukkit.getLogger().log(Level.SEVERE, null, ex); - player.sendMessage(ex.getMessage()); - } - } - - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ErrorsCommand.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ErrorsCommand.java deleted file mode 100644 index 41aa551c43..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ErrorsCommand.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.earth2me.essentials.update.chat; - -import java.io.BufferedReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.regex.Pattern; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public class ErrorsCommand extends AbstractFileCommand implements Command -{ - private final transient Pattern pattern = Pattern.compile("^[0-9 :-]+\\[INFO\\].*"); - - public ErrorsCommand(final Plugin plugin) - { - super(plugin); - } - - @Override - public void run(final IrcBot ircBot, final Player player) - { - BufferedReader page = null; - try - { - page = getServerLogReader(); - final StringBuilder input = new StringBuilder(); - do - { - final String line = page.readLine(); - if (line == null) - { - break; - } - else - { - if (!pattern.matcher(line).matches()) - { - input.append(line).append("\n"); - } - } - } - while (true); - page.close(); - final String message = "Errors: " + uploadToPastie(input); - player.sendMessage("§6" + ircBot.getNick() + ": §7" + message); - ircBot.sendMessage(message); - } - catch (IOException ex) - { - Bukkit.getLogger().log(Level.SEVERE, null, ex); - player.sendMessage(ex.getMessage()); - } - finally - { - try - { - if (page != null) - { - page.close(); - } - } - catch (IOException ex) - { - Bukkit.getLogger().log(Level.SEVERE, null, ex); - player.sendMessage(ex.getMessage()); - } - } - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/HelpCommand.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/HelpCommand.java deleted file mode 100644 index a6f76cece9..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/HelpCommand.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.earth2me.essentials.update.chat; - -import org.bukkit.entity.Player; - - -public class HelpCommand implements Command -{ - @Override - public void run(final IrcBot ircBot, final Player player) - { - player.sendMessage("Commands: (Note: Files send to the chat will be public viewable.)"); - player.sendMessage("!errors - Send the last server errors to the chat."); - player.sendMessage("!startup - Send the last startup messages to the chat."); - player.sendMessage("!config - Sends your Essentials config to the chat."); - player.sendMessage("!list - List all players in chat."); - player.sendMessage("!quit - Leave chat."); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/IrcBot.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/IrcBot.java deleted file mode 100644 index 31e9384ee9..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/IrcBot.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.earth2me.essentials.update.chat; - -import java.io.IOException; -import java.util.logging.Level; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.jibble.pircbot.Colors; -import org.jibble.pircbot.IrcException; -import org.jibble.pircbot.PircBot; -import org.jibble.pircbot.User; - - -public class IrcBot extends PircBot -{ - private static final String CHANNEL = "#essentials"; - private static final int PORT = 6667; - private static final String SERVER = "irc.esper.net"; - private transient boolean reconnect = true; - private final transient Player player; - private transient boolean kicked = false; - - public IrcBot(final Player player, final String nickName, final String versionString) - { - super(); - this.player = player; - setName(nickName); - setLogin("esshelp"); - setVersion(versionString); - connect(); - joinChannel(CHANNEL); - } - - private void connect() - { - try - { - connect(SERVER, PORT); - return; - } - catch (IOException ex) - { - Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex); - } - catch (IrcException ex) - { - Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex); - } - } - - public void quit() - { - reconnect = false; - disconnect(); - } - - @Override - protected void onConnect() - { - reconnect = true; - } - - @Override - protected void onDisconnect() - { - if (reconnect) - { - int tries = 10; - while (!isConnected()) - { - try - { - tries--; - reconnect(); - } - catch (Exception e) - { - Bukkit.getLogger().log(Level.WARNING, e.getMessage(), e); - try - { - Thread.sleep(10000); - } - catch (InterruptedException ex) - { - Bukkit.getLogger().log(Level.WARNING, e.getMessage(), e); - } - } - if (tries <= 0) - { - player.sendMessage("Connection lost to server."); - kicked = true; - break; - } - } - } - } - - @Override - protected void onKick(final String channel, final String kickerNick, - final String kickerLogin, final String kickerHostname, - final String recipientNick, final String reason) - { - if (recipientNick.equals(getNick())) - { - player.sendMessage("You have been kicked from the channel: " + reason); - quit(); - kicked = true; - } - } - - public boolean isKicked() - { - return kicked; - } - - @Override - protected void onMessage(final String channel, final String sender, - final String login, final String hostname, - final String message) - { - player.sendMessage(formatChatMessage(sender, message, false)); - } - - @Override - protected void onAction(final String sender, final String login, - final String hostname, final String target, - final String action) - { - player.sendMessage(formatChatMessage(sender, action, true)); - } - - @Override - protected void onNotice(final String sourceNick, final String sourceLogin, - final String sourceHostname, final String target, - final String notice) - { - player.sendMessage(formatChatMessage(sourceNick, notice, false)); - } - - @Override - protected void onTopic(final String channel, final String topic, - final String setBy, final long date, - final boolean changed) - { - player.sendMessage(formatChatMessage(channel, topic, false)); - } - - public String formatChatMessage(final String nick, final String message, final boolean action) - { - final StringBuilder builder = new StringBuilder(); - builder.append("§6"); - if (action) - { - builder.append('*'); - } - builder.append(nick); - if (!action) - { - builder.append(':'); - } - builder.append(" §7"); - builder.append(replaceColors(message)); - return builder.toString(); - } - - private String replaceColors(final String message) - { - String m = Colors.removeFormatting(message); - m = m.replaceAll("\u000310(,(0?[0-9]|1[0-5]))?", "§b"); - m = m.replaceAll("\u000311(,(0?[0-9]|1[0-5]))?", "§f"); - m = m.replaceAll("\u000312(,(0?[0-9]|1[0-5]))?", "§9"); - m = m.replaceAll("\u000313(,(0?[0-9]|1[0-5]))?", "§d"); - m = m.replaceAll("\u000314(,(0?[0-9]|1[0-5]))?", "§8"); - m = m.replaceAll("\u000315(,(0?[0-9]|1[0-5]))?", "§7"); - m = m.replaceAll("\u00030?1(,(0?[0-9]|1[0-5]))?", "§0"); - m = m.replaceAll("\u00030?2(,(0?[0-9]|1[0-5]))?", "§1"); - m = m.replaceAll("\u00030?3(,(0?[0-9]|1[0-5]))?", "§2"); - m = m.replaceAll("\u00030?4(,(0?[0-9]|1[0-5]))?", "§c"); - m = m.replaceAll("\u00030?5(,(0?[0-9]|1[0-5]))?", "§4"); - m = m.replaceAll("\u00030?6(,(0?[0-9]|1[0-5]))?", "§5"); - m = m.replaceAll("\u00030?7(,(0?[0-9]|1[0-5]))?", "§6"); - m = m.replaceAll("\u00030?8(,(0?[0-9]|1[0-5]))?", "§e"); - m = m.replaceAll("\u00030?9(,(0?[0-9]|1[0-5]))?", "§a"); - m = m.replaceAll("\u00030?0(,(0?[0-9]|1[0-5]))?", "§f"); - m = m.replace("\u000f", "§7"); - m = Colors.removeColors(m); - return m; - } - - public void sendMessage(final String message) - { - sendMessage(CHANNEL, message); - } - - public User[] getUsers() - { - return getUsers(CHANNEL); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ListCommand.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ListCommand.java deleted file mode 100644 index 9aa932efab..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/ListCommand.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.earth2me.essentials.update.chat; - -import org.bukkit.entity.Player; -import org.jibble.pircbot.User; - - -public class ListCommand implements Command -{ - @Override - public void run(final IrcBot ircBot, final Player player) - { - final User[] members = ircBot.getUsers(); - final StringBuilder message = new StringBuilder(); - for (User user : members) - { - if (message.length() > 0) - { - message.append("§f, "); - } - if (user.isOp() || user.hasVoice()) - { - message.append("§6"); - } - else - { - message.append("§7"); - } - message.append(user.getPrefix()).append(user.getNick()); - } - player.sendMessage(message.toString()); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/StartupCommand.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/StartupCommand.java deleted file mode 100644 index f244d6e3a5..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/StartupCommand.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.earth2me.essentials.update.chat; - -import java.io.BufferedReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.regex.Pattern; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public class StartupCommand extends AbstractFileCommand implements Command -{ - private final transient Pattern patternStart = Pattern.compile("^[0-9 :-]+\\[INFO\\] Starting minecraft server version.*"); - private final transient Pattern patternEnd = Pattern.compile("^[0-9 :-]+\\[INFO\\] Done \\([0-9.,]+s\\)! For help, type \"help\".*"); - - public StartupCommand(final Plugin plugin) - { - super(plugin); - } - - @Override - public void run(final IrcBot ircBot, final Player player) - { - BufferedReader page = null; - try - { - page = getServerLogReader(); - final StringBuilder input = new StringBuilder(); - String line; - boolean log = false; - while ((line = page.readLine()) != null) - { - if (patternStart.matcher(line).matches()) - { - if (input.length() > 0) - { - input.delete(0, input.length()); - } - log = true; - } - if (log) - { - input.append(line).append("\n"); - } - if (patternEnd.matcher(line).matches()) - { - log = false; - } - } - page.close(); - final String message = "Startup: " + uploadToPastie(input); - player.sendMessage("§6" + ircBot.getNick() + ": §7" + message); - ircBot.sendMessage(message); - } - catch (IOException ex) - { - Bukkit.getLogger().log(Level.SEVERE, null, ex); - player.sendMessage(ex.getMessage()); - } - finally - { - try - { - if (page != null) - { - page.close(); - } - } - catch (IOException ex) - { - Bukkit.getLogger().log(Level.SEVERE, null, ex); - player.sendMessage(ex.getMessage()); - } - } - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/UsernameUtil.java b/EssentialsUpdate/src/com/earth2me/essentials/update/chat/UsernameUtil.java deleted file mode 100644 index 3df6156528..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/chat/UsernameUtil.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.earth2me.essentials.update.chat; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.bukkit.Bukkit; -import org.bukkit.Server; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public final class UsernameUtil -{ - private static final Pattern CB_PATTERN = Pattern.compile("git-Bukkit-([0-9]+).([0-9]+).([0-9]+)-[0-9]+-[0-9a-z]+-b([0-9]+)jnks.*"); - - private UsernameUtil() - { - } - - public static String createUsername(final Player player) - { - final StringBuilder nameBuilder = new StringBuilder(); - final Server server = Bukkit.getServer(); - nameBuilder.append(player.getName()); - - addCraftBukkitVersion(server, nameBuilder); - addEssentialsVersion(server, nameBuilder); - addGroupManagerVersion(server, nameBuilder); - addPermissionsExVersion(server, nameBuilder); - addPermissionsBukkitVersion(server, nameBuilder); - addBPermissionsVersion(server, nameBuilder); - addPermissionsVersion(server, nameBuilder); - - return nameBuilder.toString(); - } - - private static void addPermissionsVersion(final Server server, final StringBuilder nameBuilder) - { - final Plugin perm = server.getPluginManager().getPlugin("Permissions"); - if (perm != null) - { - nameBuilder.append(" P"); - if (!perm.isEnabled()) - { - nameBuilder.append('!'); - } - nameBuilder.append(perm.getDescription().getVersion()); - } - } - - private static void addBPermissionsVersion(final Server server, final StringBuilder nameBuilder) - { - final Plugin bperm = server.getPluginManager().getPlugin("bPermissions"); - if (bperm != null) - { - nameBuilder.append(" BP"); - if (!bperm.isEnabled()) - { - nameBuilder.append('!'); - } - nameBuilder.append(bperm.getDescription().getVersion()); - } - } - - private static void addPermissionsBukkitVersion(final Server server, final StringBuilder nameBuilder) - { - final Plugin permb = server.getPluginManager().getPlugin("PermissionsBukkit"); - if (permb != null) - { - nameBuilder.append(" PB"); - if (!permb.isEnabled()) - { - nameBuilder.append('!'); - } - nameBuilder.append(permb.getDescription().getVersion()); - } - } - - private static void addPermissionsExVersion(final Server server, final StringBuilder nameBuilder) - { - final Plugin pex = server.getPluginManager().getPlugin("PermissionsEx"); - if (pex != null) - { - nameBuilder.append(" PEX"); - if (!pex.isEnabled()) - { - nameBuilder.append('!'); - } - nameBuilder.append(pex.getDescription().getVersion()); - } - } - - private static void addGroupManagerVersion(final Server server, final StringBuilder nameBuilder) - { - final Plugin groupManager = server.getPluginManager().getPlugin("GroupManager"); - if (groupManager != null) - { - nameBuilder.append(" GM"); - if (!groupManager.isEnabled()) - { - nameBuilder.append('!'); - } - } - } - - private static void addEssentialsVersion(final Server server, final StringBuilder nameBuilder) - { - final Plugin essentials = server.getPluginManager().getPlugin("Essentials"); - if (essentials != null) - { - nameBuilder.append(" ESS"); - nameBuilder.append(essentials.getDescription().getVersion()); - } - } - - private static void addCraftBukkitVersion(final Server server, final StringBuilder nameBuilder) - { - final Matcher versionMatch = CB_PATTERN.matcher(server.getVersion()); - if (versionMatch.matches()) - { - nameBuilder.append(" CB"); - nameBuilder.append(versionMatch.group(4)); - } - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/AbstractState.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/AbstractState.java deleted file mode 100644 index 2c85c39fdf..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/AbstractState.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.earth2me.essentials.update.states; - -import com.earth2me.essentials.update.AbstractWorkListener; -import org.bukkit.entity.Player; - - -public abstract class AbstractState -{ - private transient boolean abortion = false; - private final transient StateMap stateMap; - - public AbstractState(final StateMap stateMap) - { - this.stateMap = stateMap; - } - - public T getState(final Class stateClass) - { - if (!stateMap.containsKey(stateClass)) - { - try - { - final AbstractState state = stateClass.getConstructor(StateMap.class).newInstance(stateMap); - stateMap.put(stateClass, state); - } - catch (Exception ex) - { - /* - * This should never happen. All states, that are added to the map automatically, have to have a - * Constructor that accepts the StateMap. - */ - throw new RuntimeException(ex); - } - } - return (T)stateMap.get(stateClass); - } - - public abstract AbstractState getNextState(); - - /** - * Check if we already know the answer, so the user does not have to answer the question. - * - * @return true, if the answer could be guessed. - */ - public boolean guessAnswer() - { - return false; - } - - /** - * Ask the user the question. - * @param sender - */ - public abstract void askQuestion(Player sender); - - /** - * React on the answer and set internal variables - * @param answer - * @return true, if the answer could be recognized as a valid answer - */ - public abstract boolean reactOnAnswer(String answer); - - public final AbstractState reactOnAnswer(final Player sender, final String answer) - { - final String trimmedAnswer = answer.trim(); - if (trimmedAnswer.equalsIgnoreCase("quit") - || trimmedAnswer.equalsIgnoreCase("bye") - || trimmedAnswer.equalsIgnoreCase("abort") - || trimmedAnswer.equalsIgnoreCase("cancel") - || trimmedAnswer.equalsIgnoreCase("exit")) - { - abort(); - return null; - } - try - { - final boolean found = reactOnAnswer(trimmedAnswer); - if (found) - { - return getNextState(); - } - else - { - sender.sendMessage("Answer not recognized."); - return this; - } - } - catch (RuntimeException ex) - { - sender.sendMessage(ex.toString()); - return this; - } - } - - /** - * Do something based on the answer, that the user gave. - */ - public void doWork(final AbstractWorkListener listener) - { - listener.onWorkDone(); - } - - public boolean isAbortion() - { - return abortion; - } - - protected void abort() - { - abortion = true; - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/AbstractYesNoState.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/AbstractYesNoState.java deleted file mode 100644 index 67baf6bb63..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/AbstractYesNoState.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.earth2me.essentials.update.states; - - -public abstract class AbstractYesNoState extends AbstractState -{ - private boolean answer = false; - private final transient Class yesState; - private final transient Class noState; - - public AbstractYesNoState(final StateMap states, final Class nextState) - { - this(states, nextState, nextState); - } - - public AbstractYesNoState(final StateMap states, final Class yesState, final Class noState) - { - super(states); - this.yesState = yesState; - this.noState = noState; - } - - @Override - public AbstractState getNextState() - { - return answer - ? (yesState == null ? null : getState(yesState)) - : (noState == null ? null : getState(noState)); - } - - @Override - public boolean reactOnAnswer(final String answer) - { - if (answer.equalsIgnoreCase("yes") - || answer.equalsIgnoreCase("y")) - { - this.answer = true; - return true; - } - if (answer.equalsIgnoreCase("no") - || answer.equalsIgnoreCase("n")) - { - this.answer = false; - return true; - } - return false; - } - - public boolean getAnswer() - { - return answer; - } - - protected void setAnswer(final boolean answer) - { - this.answer = answer; - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/AdvancedMode.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/AdvancedMode.java deleted file mode 100644 index 88d9efc4ab..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/AdvancedMode.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.earth2me.essentials.update.states; - -import org.bukkit.entity.Player; - - -public class AdvancedMode extends AbstractYesNoState -{ - public AdvancedMode(final StateMap states) - { - super(states, EssentialsChat.class); - } - - @Override - public void askQuestion(final Player sender) - { - sender.sendMessage("This installation mode has a lot of options."); - sender.sendMessage("Do you want use the advanced mode to see all questions?"); - sender.sendMessage("Otherwise the default values will be used."); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/Changelog.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/Changelog.java deleted file mode 100644 index 10a4f33c54..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/Changelog.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.earth2me.essentials.update.states; - -import com.earth2me.essentials.update.UpdateCheck; -import com.earth2me.essentials.update.VersionInfo; -import java.util.List; -import org.bukkit.entity.Player; - - -public class Changelog extends AbstractState -{ - private static final int CHANGES_PER_PAGE = 5; - private transient int page = 0; - private transient boolean confirmed = false; - private transient final List changes; - private transient final int pages; - - public Changelog(final StateMap stateMap) - { - super(stateMap); - changes = getChanges(); - pages = changes.size() / CHANGES_PER_PAGE + (changes.size() % CHANGES_PER_PAGE > 0 ? 1 : 0); - } - - @Override - public AbstractState getNextState() - { - return confirmed ? getState(EssentialsChat.class) : this; - } - - @Override - public boolean guessAnswer() - { - if (pages == 0) - { - confirmed = true; - } - return confirmed; - } - - private List getChanges() - { - final UpdateCheck updateCheck = getState(UpdateOrInstallation.class).getUpdateCheck(); - final VersionInfo versionInfo = updateCheck.getNewVersionInfo(); - return versionInfo.getChangelog(); - } - - @Override - public void askQuestion(final Player sender) - { - if (pages > 1) - { - sender.sendMessage("Changelog, page " + page + " of " + pages + ":"); - } - else - { - sender.sendMessage("Changelog:"); - } - for (int i = page * CHANGES_PER_PAGE; i < Math.min(page * CHANGES_PER_PAGE + CHANGES_PER_PAGE, changes.size()); i++) - { - sender.sendMessage(changes.get(i)); - } - if (pages > 1) - { - sender.sendMessage("Select a page by typing the numbers 1 to " + pages + " to view all changes and then type confirm or abort."); - } - else - { - sender.sendMessage("Type confirm to update Essentials or abort to cancel the update."); - } - } - - @Override - public boolean reactOnAnswer(final String answer) - { - if (answer.equalsIgnoreCase("confirm")) - { - confirmed = true; - return true; - } - if (answer.matches("[0-9]+")) - { - final int page = Integer.parseInt(answer); - if (page <= pages && page > 0) - { - this.page = page - 1; - return true; - } - } - return false; - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsChat.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsChat.java deleted file mode 100644 index 6aaed634a0..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsChat.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.earth2me.essentials.update.states; - -import com.earth2me.essentials.update.AbstractWorkListener; -import com.earth2me.essentials.update.tasks.InstallModule; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public class EssentialsChat extends AbstractYesNoState -{ - public EssentialsChat(final StateMap states) - { - super(states, EssentialsChatSettings.class, EssentialsSpawn.class); - } - - @Override - public boolean guessAnswer() - { - final Plugin plugin = Bukkit.getPluginManager().getPlugin("EssentialsChat"); - if (plugin != null) - { - setAnswer(true); - return true; - } - return false; - } - - @Override - public void askQuestion(final Player sender) - { - sender.sendMessage("Do you want to install EssentialsChat? (yes/no)"); - sender.sendMessage("EssentialsChat is a simple chat formatting plugin"); - sender.sendMessage("It allows you to make user prefixes and coloured text."); - } - - @Override - public void doWork(final AbstractWorkListener listener) - { - if (getAnswer()) - { - new InstallModule(listener, "EssentialsChat").start(); - return; - } - listener.onWorkDone(); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsChatSettings.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsChatSettings.java deleted file mode 100644 index 6666ff3718..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsChatSettings.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.earth2me.essentials.update.states; - -import org.bukkit.entity.Player; - - -public class EssentialsChatSettings extends AbstractYesNoState -{ - public EssentialsChatSettings(final StateMap states) - { - super(states, EssentialsSpawn.class); - } - - @Override - public boolean guessAnswer() - { - if (getState(AdvancedMode.class).getAnswer()) - { - setAnswer(false); - return true; - } - return false; - } - - @Override - public void askQuestion(final Player sender) - { - sender.sendMessage("Would you like to configure EssentialsChat to prefix ingame messages with their group?"); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsGeoIP.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsGeoIP.java deleted file mode 100644 index a91a44787b..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsGeoIP.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.earth2me.essentials.update.states; - -import com.earth2me.essentials.update.AbstractWorkListener; -import com.earth2me.essentials.update.tasks.InstallModule; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public class EssentialsGeoIP extends AbstractYesNoState -{ - public EssentialsGeoIP(final StateMap states) - { - super(states, null); - } - - @Override - public boolean guessAnswer() - { - final Plugin plugin = Bukkit.getPluginManager().getPlugin("EssentialsGeoIP"); - if (plugin != null) - { - setAnswer(true); - return true; - } - return false; - } - - @Override - public void askQuestion(final Player sender) - { - sender.sendMessage("Do you want to install EssentialsGeoIP? (yes/no)"); - sender.sendMessage("EssentialsGeoIP performs a IP lookup on joining players"); - sender.sendMessage("It allows you get a rough idea of where a player is from."); - } - - @Override - public void doWork(final AbstractWorkListener listener) - { - if (getAnswer()) - { - new InstallModule(listener, "EssentialsGeoIP").start(); - return; - } - listener.onWorkDone(); - } -} \ No newline at end of file diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsProtect.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsProtect.java deleted file mode 100644 index ca0337d30c..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsProtect.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.earth2me.essentials.update.states; - -import com.earth2me.essentials.update.AbstractWorkListener; -import com.earth2me.essentials.update.tasks.InstallModule; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public class EssentialsProtect extends AbstractYesNoState -{ - public EssentialsProtect(final StateMap states) - { - super(states, null); - } - - @Override - public boolean guessAnswer() - { - final Plugin plugin = Bukkit.getPluginManager().getPlugin("EssentialsProtect"); - if (plugin != null) - { - setAnswer(true); - return true; - } - return false; - } - - @Override - public void askQuestion(final Player sender) - { - sender.sendMessage("Do you want to install EssentialsProtect? (yes/no)"); - sender.sendMessage("EssentialsProtect is a basic world protection system"); - sender.sendMessage("It allows you to set server wide rules, such as disabling creeper explosions, and preventing fire spread."); - } - - @Override - public void doWork(final AbstractWorkListener listener) - { - if (getAnswer()) - { - new InstallModule(listener, "EssentialsProtect").start(); - return; - } - listener.onWorkDone(); - } -} \ No newline at end of file diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsSpawn.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsSpawn.java deleted file mode 100644 index 2a87638ba1..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/EssentialsSpawn.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.earth2me.essentials.update.states; - -import com.earth2me.essentials.update.AbstractWorkListener; -import com.earth2me.essentials.update.tasks.InstallModule; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public class EssentialsSpawn extends AbstractYesNoState -{ - public EssentialsSpawn(final StateMap states) - { - super(states, null); - } - - @Override - public boolean guessAnswer() - { - final Plugin plugin = Bukkit.getPluginManager().getPlugin("EssentialsSpawn"); - if (plugin != null) - { - setAnswer(true); - return true; - } - return false; - } - - @Override - public void askQuestion(final Player sender) - { - sender.sendMessage("Do you want to install EssentialsSpawn? (yes/no)"); - sender.sendMessage("EssentialsSpawn lets you control player spawning"); - sender.sendMessage("It allows you to set different places where players spawn on death, new players join and allows players to return to spawn."); - } - - @Override - public void doWork(final AbstractWorkListener listener) - { - if (getAnswer()) - { - new InstallModule(listener, "EssentialsSpawn").start(); - return; - } - listener.onWorkDone(); - } -} \ No newline at end of file diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/InstallationFinishedEvent.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/InstallationFinishedEvent.java deleted file mode 100644 index 82d9ee627a..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/InstallationFinishedEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.earth2me.essentials.update.states; - -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; - - -public class InstallationFinishedEvent extends Event -{ - public InstallationFinishedEvent() - { - super(); - } - - @Override - public HandlerList getHandlers() - { - throw new UnsupportedOperationException("Not supported yet."); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java deleted file mode 100644 index 6ce926f923..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMachine.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.earth2me.essentials.update.states; - -import com.earth2me.essentials.update.AbstractWorkListener; -import com.earth2me.essentials.update.UpdateCheck; -import java.util.Iterator; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - - -public class StateMachine extends AbstractWorkListener implements Runnable -{ - public enum MachineResult - { - ABORT, WAIT, DONE, NONE - } - private final transient StateMap states = new StateMap(); - private transient AbstractState current; - private transient Player player; - private transient MachineResult result = MachineResult.NONE; - - public StateMachine(final Plugin plugin, final Player player, final UpdateCheck updateCheck) - { - super(plugin, updateCheck.getNewVersionInfo()); - this.player = player; - states.clear(); - final UpdateOrInstallation state = new UpdateOrInstallation(states, updateCheck); - current = states.put(UpdateOrInstallation.class, state); - } - - public MachineResult askQuestion() - { - try - { - while (current.guessAnswer()) - { - current = current.getNextState(); - if (current == null) - { - result = MachineResult.DONE; - break; - } - } - if (current != null) - { - if (player.isOnline()) - { - current.askQuestion(player); - } - result = MachineResult.WAIT; - } - } - catch (RuntimeException ex) - { - player.sendMessage(ex.getMessage()); - finish(); - result = MachineResult.ABORT; - } - return result; - } - - public MachineResult reactOnMessage(final String message) - { - result = MachineResult.NONE; - final AbstractState next = current.reactOnAnswer(player, message); - if (next == null) - { - if (current.isAbortion()) - { - finish(); - result = MachineResult.ABORT; - } - else - { - result = MachineResult.DONE; - } - } - else - { - current = next; - askQuestion(); - } - return result; - } - private transient Iterator iterator; - - public void startWork() - { - iterator = states.values().iterator(); - Bukkit.getScheduler().scheduleAsyncDelayedTask(getPlugin(), this); - } - - @Override - public void run() - { - if (!iterator.hasNext()) - { - Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() - { - @Override - public void run() - { - if (StateMachine.this.player.isOnline()) - { - StateMachine.this.player.sendMessage("Installation done. Reloading server."); - } - finish(); - Bukkit.getServer().reload(); - } - }); - return; - } - final AbstractState state = iterator.next(); - state.doWork(this); - } - - @Override - public void onWorkAbort(final String message) - { - finish(); - Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() - { - @Override - public void run() - { - if (message != null && !message.isEmpty() && StateMachine.this.player.isOnline()) - { - StateMachine.this.player.sendMessage(message); - } - } - }); - } - - @Override - public void onWorkDone(final String message) - { - Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() - { - @Override - public void run() - { - if (message != null && !message.isEmpty() && StateMachine.this.player.isOnline()) - { - StateMachine.this.player.sendMessage(message); - } - Bukkit.getScheduler().scheduleAsyncDelayedTask(getPlugin(), StateMachine.this); - } - }); - } - - private void finish() - { - current = null; - iterator = null; - states.clear(); - getPlugin().getServer().getPluginManager().callEvent(new InstallationFinishedEvent()); - } - - public void resumeInstallation(final Player player) - { - this.player = player; - if (result == MachineResult.WAIT) - { - if (current == null) - { - throw new RuntimeException("State is WAIT, but current state is null!"); - } - current.askQuestion(player); - } - if (result == MachineResult.DONE && iterator != null) - { - player.sendMessage("Installation is still running."); - } - if (result == MachineResult.ABORT) - { - throw new RuntimeException("Player should not be able to resume an aborted installation."); - } - if (result == MachineResult.NONE) - { - throw new RuntimeException("State machine in an undefined state."); - } - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMap.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMap.java deleted file mode 100644 index cca4223d6a..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/StateMap.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.earth2me.essentials.update.states; - -import java.util.LinkedHashMap; - - -public class StateMap extends LinkedHashMap, AbstractState> -{ - public StateMap() - { - super(50); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/states/UpdateOrInstallation.java b/EssentialsUpdate/src/com/earth2me/essentials/update/states/UpdateOrInstallation.java deleted file mode 100644 index 6b48f90be7..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/states/UpdateOrInstallation.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.earth2me.essentials.update.states; - -import com.earth2me.essentials.update.UpdateCheck; -import org.bukkit.entity.Player; - - -public class UpdateOrInstallation extends AbstractState -{ - private final transient UpdateCheck updateCheck; - private transient boolean update = false; - - public UpdateOrInstallation(final StateMap stateMap, final UpdateCheck updateCheck) - { - super(stateMap); - this.updateCheck = updateCheck; - } - - @Override - public boolean guessAnswer() - { - if (getUpdateCheck().isEssentialsInstalled()) - { - update = true; - } - return update; - } - - @Override - public AbstractState getNextState() - { - return update ? getState(Changelog.class) : getState(EssentialsChat.class); - } - - @Override - public void askQuestion(final Player sender) - { - sender.sendMessage("Thank you for choosing Essentials."); - sender.sendMessage("The following installation wizard will guide you through the installation of Essentials."); - sender.sendMessage("Your answers will be saved for a later update."); - sender.sendMessage("Please answer the messages with yes or no, if not otherwise stated."); - sender.sendMessage("Write bye/exit/quit if you want to exit the wizard at anytime."); - sender.sendMessage("Type ok to continue..."); - } - - @Override - public boolean reactOnAnswer(final String answer) - { - return answer.equalsIgnoreCase("ok") || answer.equalsIgnoreCase("k") || answer.equalsIgnoreCase("continue"); - } - - public UpdateCheck getUpdateCheck() - { - return updateCheck; - } - - public boolean isUpdate() - { - return update; - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/InstallModule.java b/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/InstallModule.java deleted file mode 100644 index 778f5172f8..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/InstallModule.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.earth2me.essentials.update.tasks; - -import com.earth2me.essentials.update.AbstractWorkListener; -import com.earth2me.essentials.update.GetFile; -import com.earth2me.essentials.update.ModuleInfo; -import com.earth2me.essentials.update.VersionInfo; -import java.io.File; -import java.net.URL; -import java.util.logging.Level; -import org.bukkit.Bukkit; - - -public class InstallModule implements Runnable, Task -{ - protected final transient AbstractWorkListener listener; - private final transient String moduleName; - private final transient String fileName; - - public InstallModule(final AbstractWorkListener listener, final String moduleName) - { - this(listener, moduleName, moduleName + ".jar"); - } - - public InstallModule(final AbstractWorkListener listener, final String moduleName, final String fileName) - { - this.listener = listener; - this.moduleName = moduleName; - this.fileName = fileName; - } - - @Override - public void start() - { - Bukkit.getScheduler().scheduleAsyncDelayedTask(listener.getPlugin(), this); - } - - @Override - public void run() - { - final VersionInfo info = listener.getNewVersionInfo(); - final ModuleInfo module = info.getModules().get(moduleName); - if (module == null) - { - listener.onWorkAbort("Module " + moduleName + " not found in VersionInfo."); - return; - } - try - { - final URL downloadUrl = module.getUrl(); - final GetFile getFile = new GetFile(downloadUrl); - getFile.saveTo(new File(listener.getPlugin().getServer().getUpdateFolderFile(), fileName), module.getHash()); - listener.onWorkDone("Module " + moduleName + " downloaded."); - } - catch (Exception ex) - { - Bukkit.getLogger().log(Level.SEVERE, "Failed to download module " + moduleName + " to " + fileName, ex); - listener.onWorkAbort("An error occured, please check your server log."); - return; - } - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/SelfUpdate.java b/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/SelfUpdate.java deleted file mode 100644 index 3baf86be7d..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/SelfUpdate.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.earth2me.essentials.update.tasks; - -import com.earth2me.essentials.update.AbstractWorkListener; -import org.bukkit.Bukkit; - - -public class SelfUpdate extends AbstractWorkListener implements Task, Runnable -{ - private final transient AbstractWorkListener listener; - - public SelfUpdate(final AbstractWorkListener listener) - { - super(listener.getPlugin(), listener.getNewVersionInfo()); - this.listener = listener; - } - - @Override - public void onWorkAbort(final String message) - { - listener.onWorkAbort(message); - } - - @Override - public void onWorkDone(final String message) - { - listener.onWorkDone(message); - Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() - { - @Override - public void run() - { - Bukkit.getServer().reload(); - } - }); - } - - @Override - public void start() - { - Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), this); - } - - @Override - public void run() - { - Bukkit.getScheduler().scheduleAsyncDelayedTask(getPlugin(), new Runnable() - { - @Override - public void run() - { - new InstallModule(SelfUpdate.this, "EssentialsUpdate").start(); - } - }); - } -} diff --git a/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/Task.java b/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/Task.java deleted file mode 100644 index 3f1d572ed8..0000000000 --- a/EssentialsUpdate/src/com/earth2me/essentials/update/tasks/Task.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.earth2me.essentials.update.tasks; - - -public interface Task -{ - void start(); -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/Colors.java b/EssentialsUpdate/src/org/jibble/pircbot/Colors.java deleted file mode 100755 index c763cba220..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/Colors.java +++ /dev/null @@ -1,293 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - - -package org.jibble.pircbot; - -/** - * The Colors class provides several static fields and methods that you may - * find useful when writing an IRC Bot. - *

- * This class contains constants that are useful for formatting lines - * sent to IRC servers. These constants allow you to apply various - * formatting to the lines, such as colours, boldness, underlining - * and reverse text. - *

- * The class contains static methods to remove colours and formatting - * from lines of IRC text. - *

- * Here are some examples of how to use the contants from within a - * class that extends PircBot and imports org.jibble.pircbot.*; - * - *

 sendMessage("#cs", Colors.BOLD + "A bold hello!");
- *     A bold hello!
- * sendMessage("#cs", Colors.RED + "Red" + Colors.NORMAL + " text");
- *     Red text
- * sendMessage("#cs", Colors.BOLD + Colors.RED + "Bold and red");
- *     Bold and red
- * - * Please note that some IRC channels may be configured to reject any - * messages that use colours. Also note that older IRC clients may be - * unable to correctly display lines that contain colours and other - * control characters. - *

- * Note that this class name has been spelt in the American style in - * order to remain consistent with the rest of the Java API. - * - * - * @since 0.9.12 - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public class Colors { - - - /** - * Removes all previously applied color and formatting attributes. - */ - public static final String NORMAL = "\u000f"; - - - /** - * Bold text. - */ - public static final String BOLD = "\u0002"; - - - /** - * Underlined text. - */ - public static final String UNDERLINE = "\u001f"; - - - /** - * Reversed text (may be rendered as italic text in some clients). - */ - public static final String REVERSE = "\u0016"; - - - /** - * White coloured text. - */ - public static final String WHITE = "\u000300"; - - - /** - * Black coloured text. - */ - public static final String BLACK = "\u000301"; - - - /** - * Dark blue coloured text. - */ - public static final String DARK_BLUE = "\u000302"; - - - /** - * Dark green coloured text. - */ - public static final String DARK_GREEN = "\u000303"; - - - /** - * Red coloured text. - */ - public static final String RED = "\u000304"; - - - /** - * Brown coloured text. - */ - public static final String BROWN = "\u000305"; - - - /** - * Purple coloured text. - */ - public static final String PURPLE = "\u000306"; - - - /** - * Olive coloured text. - */ - public static final String OLIVE = "\u000307"; - - - /** - * Yellow coloured text. - */ - public static final String YELLOW = "\u000308"; - - - /** - * Green coloured text. - */ - public static final String GREEN = "\u000309"; - - - /** - * Teal coloured text. - */ - public static final String TEAL = "\u000310"; - - - /** - * Cyan coloured text. - */ - public static final String CYAN = "\u000311"; - - - /** - * Blue coloured text. - */ - public static final String BLUE = "\u000312"; - - - /** - * Magenta coloured text. - */ - public static final String MAGENTA = "\u000313"; - - - /** - * Dark gray coloured text. - */ - public static final String DARK_GRAY = "\u000314"; - - - /** - * Light gray coloured text. - */ - public static final String LIGHT_GRAY = "\u000315"; - - - /** - * This class should not be constructed. - */ - private Colors() { - - } - - - /** - * Removes all colours from a line of IRC text. - * - * @since PircBot 1.2.0 - * - * @param line the input text. - * - * @return the same text, but with all colours removed. - */ - public static String removeColors(String line) { - int length = line.length(); - StringBuffer buffer = new StringBuffer(); - int i = 0; - while (i < length) { - char ch = line.charAt(i); - if (ch == '\u0003') { - i++; - // Skip "x" or "xy" (foreground color). - if (i < length) { - ch = line.charAt(i); - if (Character.isDigit(ch)) { - i++; - if (i < length) { - ch = line.charAt(i); - if (Character.isDigit(ch)) { - i++; - } - } - // Now skip ",x" or ",xy" (background color). - if (i < length) { - ch = line.charAt(i); - if (ch == ',') { - i++; - if (i < length) { - ch = line.charAt(i); - if (Character.isDigit(ch)) { - i++; - if (i < length) { - ch = line.charAt(i); - if (Character.isDigit(ch)) { - i++; - } - } - } - else { - // Keep the comma. - i--; - } - } - else { - // Keep the comma. - i--; - } - } - } - } - } - } - else if (ch == '\u000f') { - i++; - } - else { - buffer.append(ch); - i++; - } - } - return buffer.toString(); - } - - - /** - * Remove formatting from a line of IRC text. - * - * @since PircBot 1.2.0 - * - * @param line the input text. - * - * @return the same text, but without any bold, underlining, reverse, etc. - */ - public static String removeFormatting(String line) { - int length = line.length(); - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < length; i++) { - char ch = line.charAt(i); - if (ch == '\u000f' || ch == '\u0002' || ch == '\u001f' || ch == '\u0016') { - // Don't add this character. - } - else { - buffer.append(ch); - } - } - return buffer.toString(); - } - - - /** - * Removes all formatting and colours from a line of IRC text. - * - * @since PircBot 1.2.0 - * - * @param line the input text. - * - * @return the same text, but without formatting and colour characters. - * - */ - public static String removeFormattingAndColors(String line) { - return removeFormatting(removeColors(line)); - } - -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/InputThread.java b/EssentialsUpdate/src/org/jibble/pircbot/InputThread.java deleted file mode 100755 index a248152101..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/InputThread.java +++ /dev/null @@ -1,169 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - - -package org.jibble.pircbot; - -import java.io.*; -import java.net.Socket; -import java.util.StringTokenizer; - -/** - * A Thread which reads lines from the IRC server. It then - * passes these lines to the PircBot without changing them. - * This running Thread also detects disconnection from the server - * and is thus used by the OutputThread to send lines to the server. - * - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public class InputThread extends Thread { - - /** - * The InputThread reads lines from the IRC server and allows the - * PircBot to handle them. - * - * @param bot An instance of the underlying PircBot. - * @param breader The BufferedReader that reads lines from the server. - * @param bwriter The BufferedWriter that sends lines to the server. - */ - InputThread(PircBot bot, Socket socket, BufferedReader breader, BufferedWriter bwriter) { - _bot = bot; - _socket = socket; - _breader = breader; - _bwriter = bwriter; - this.setName(this.getClass() + "-Thread"); - } - - - /** - * Sends a raw line to the IRC server as soon as possible, bypassing the - * outgoing message queue. - * - * @param line The raw line to send to the IRC server. - */ - void sendRawLine(String line) { - OutputThread.sendRawLine(_bot, _bwriter, line); - } - - - /** - * Returns true if this InputThread is connected to an IRC server. - * The result of this method should only act as a rough guide, - * as the result may not be valid by the time you act upon it. - * - * @return True if still connected. - */ - boolean isConnected() { - return _isConnected; - } - - - /** - * Called to start this Thread reading lines from the IRC server. - * When a line is read, this method calls the handleLine method - * in the PircBot, which may subsequently call an 'onXxx' method - * in the PircBot subclass. If any subclass of Throwable (i.e. - * any Exception or Error) is thrown by your method, then this - * method will print the stack trace to the standard output. It - * is probable that the PircBot may still be functioning normally - * after such a problem, but the existance of any uncaught exceptions - * in your code is something you should really fix. - */ - public void run() { - try { - boolean running = true; - while (running) { - try { - String line = null; - while ((line = _breader.readLine()) != null) { - try { - _bot.handleLine(line); - } - catch (Throwable t) { - // Stick the whole stack trace into a String so we can output it nicely. - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - t.printStackTrace(pw); - pw.flush(); - StringTokenizer tokenizer = new StringTokenizer(sw.toString(), "\r\n"); - synchronized (_bot) { - _bot.log("### Your implementation of PircBot is faulty and you have"); - _bot.log("### allowed an uncaught Exception or Error to propagate in your"); - _bot.log("### code. It may be possible for PircBot to continue operating"); - _bot.log("### normally. Here is the stack trace that was produced: -"); - _bot.log("### "); - while (tokenizer.hasMoreTokens()) { - _bot.log("### " + tokenizer.nextToken()); - } - } - } - } - if (line == null) { - // The server must have disconnected us. - running = false; - } - } - catch (InterruptedIOException iioe) { - // This will happen if we haven't received anything from the server for a while. - // So we shall send it a ping to check that we are still connected. - this.sendRawLine("PING " + (System.currentTimeMillis() / 1000)); - // Now we go back to listening for stuff from the server... - } - } - } - catch (Exception e) { - // Do nothing. - } - - // If we reach this point, then we must have disconnected. - try { - _socket.close(); - } - catch (Exception e) { - // Just assume the socket was already closed. - } - - if (!_disposed) { - _bot.log("*** Disconnected."); - _isConnected = false; - _bot.onDisconnect(); - } - - } - - - /** - * Closes the socket without onDisconnect being called subsequently. - */ - public void dispose () { - try { - _disposed = true; - _socket.close(); - } - catch (Exception e) { - // Do nothing. - } - } - - private PircBot _bot = null; - private Socket _socket = null; - private BufferedReader _breader = null; - private BufferedWriter _bwriter = null; - private boolean _isConnected = true; - private boolean _disposed = false; - - public static final int MAX_LINE_LENGTH = 512; - -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/IrcException.java b/EssentialsUpdate/src/org/jibble/pircbot/IrcException.java deleted file mode 100755 index d07d8a9562..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/IrcException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - -package org.jibble.pircbot; - -/** - * An IrcException class. - * - * @since 0.9 - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public class IrcException extends Exception { - - /** - * Constructs a new IrcException. - * - * @param e The error message to report. - */ - public IrcException(String e) { - super(e); - } - -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/NickAlreadyInUseException.java b/EssentialsUpdate/src/org/jibble/pircbot/NickAlreadyInUseException.java deleted file mode 100755 index 33887be34b..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/NickAlreadyInUseException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - - -package org.jibble.pircbot; - -/** - * A NickAlreadyInUseException class. This exception is - * thrown when the PircBot attempts to join an IRC server - * with a user name that is already in use. - * - * @since 0.9 - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public class NickAlreadyInUseException extends IrcException { - - /** - * Constructs a new IrcException. - * - * @param e The error message to report. - */ - public NickAlreadyInUseException(String e) { - super(e); - } - -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/OutputThread.java b/EssentialsUpdate/src/org/jibble/pircbot/OutputThread.java deleted file mode 100755 index 7eddee873c..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/OutputThread.java +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - - -package org.jibble.pircbot; - -import java.io.BufferedWriter; - -/** - * A Thread which is responsible for sending messages to the IRC server. - * Messages are obtained from the outgoing message queue and sent - * immediately if possible. If there is a flood of messages, then to - * avoid getting kicked from a channel, we put a small delay between - * each one. - * - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public class OutputThread extends Thread { - - - /** - * Constructs an OutputThread for the underlying PircBot. All messages - * sent to the IRC server are sent by this OutputThread to avoid hammering - * the server. Messages are sent immediately if possible. If there are - * multiple messages queued, then there is a delay imposed. - * - * @param bot The underlying PircBot instance. - * @param outQueue The Queue from which we will obtain our messages. - */ - OutputThread(PircBot bot, Queue outQueue) { - _bot = bot; - _outQueue = outQueue; - this.setName(this.getClass() + "-Thread"); - } - - - /** - * A static method to write a line to a BufferedOutputStream and then pass - * the line to the log method of the supplied PircBot instance. - * - * @param bot The underlying PircBot instance. - * @param out The BufferedOutputStream to write to. - * @param line The line to be written. "\r\n" is appended to the end. - * @param encoding The charset to use when encoing this string into a - * byte array. - */ - static void sendRawLine(PircBot bot, BufferedWriter bwriter, String line) { - if (line.length() > bot.getMaxLineLength() - 2) { - line = line.substring(0, bot.getMaxLineLength() - 2); - } - synchronized(bwriter) { - try { - bwriter.write(line + "\r\n"); - bwriter.flush(); - bot.log(">>>" + line); - } - catch (Exception e) { - // Silent response - just lose the line. - } - } - } - - - /** - * This method starts the Thread consuming from the outgoing message - * Queue and sending lines to the server. - */ - public void run() { - try { - boolean running = true; - while (running) { - // Small delay to prevent spamming of the channel - Thread.sleep(_bot.getMessageDelay()); - - String line = (String) _outQueue.next(); - if (line != null) { - _bot.sendRawLine(line); - } - else { - running = false; - } - } - } - catch (InterruptedException e) { - // Just let the method return naturally... - } - } - - private PircBot _bot = null; - private Queue _outQueue = null; - -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/PircBot.java b/EssentialsUpdate/src/org/jibble/pircbot/PircBot.java deleted file mode 100755 index 28148075f1..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/PircBot.java +++ /dev/null @@ -1,2809 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - - -package org.jibble.pircbot; - -import java.io.*; -import java.net.InetAddress; -import java.net.Socket; -import java.util.*; - -/** - * PircBot is a Java framework for writing IRC bots quickly and easily. - *

- * It provides an event-driven architecture to handle common IRC - * events, flood protection, DCC support, ident support, and more. - * The comprehensive logfile format is suitable for use with pisg to generate - * channel statistics. - *

- * Methods of the PircBot class can be called to send events to the IRC server - * that it connects to. For example, calling the sendMessage method will - * send a message to a channel or user on the IRC server. Multiple servers - * can be supported using multiple instances of PircBot. - *

- * To perform an action when the PircBot receives a normal message from the IRC - * server, you would override the onMessage method defined in the PircBot - * class. All onXYZ methods in the PircBot class are automatically called - * when the event XYZ happens, so you would override these if you wish - * to do something when it does happen. - *

- * Some event methods, such as onPing, should only really perform a specific - * function (i.e. respond to a PING from the server). For your convenience, such - * methods are already correctly implemented in the PircBot and should not - * normally need to be overridden. Please read the full documentation for each - * method to see which ones are already implemented by the PircBot class. - *

- * Please visit the PircBot homepage at - * http://www.jibble.org/pircbot.php - * for full revision history, a beginners guide to creating your first PircBot - * and a list of some existing Java IRC bots and clients that use the PircBot - * framework. - * - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public abstract class PircBot implements ReplyConstants { - - - /** - * The definitive version number of this release of PircBot. - * (Note: Change this before automatically building releases) - */ - public static final String VERSION = "1.5.0"; - - - private static final int OP_ADD = 1; - private static final int OP_REMOVE = 2; - private static final int VOICE_ADD = 3; - private static final int VOICE_REMOVE = 4; - - - /** - * Constructs a PircBot with the default settings. Your own constructors - * in classes which extend the PircBot abstract class should be responsible - * for changing the default settings if required. - */ - public PircBot() {} - - - /** - * Attempt to connect to the specified IRC server. - * The onConnect method is called upon success. - * - * @param hostname The hostname of the server to connect to. - * - * @throws IOException if it was not possible to connect to the server. - * @throws IrcException if the server would not let us join it. - * @throws NickAlreadyInUseException if our nick is already in use on the server. - */ - public final synchronized void connect(String hostname) throws IOException, IrcException, NickAlreadyInUseException { - this.connect(hostname, 6667, null); - } - - - /** - * Attempt to connect to the specified IRC server and port number. - * The onConnect method is called upon success. - * - * @param hostname The hostname of the server to connect to. - * @param port The port number to connect to on the server. - * - * @throws IOException if it was not possible to connect to the server. - * @throws IrcException if the server would not let us join it. - * @throws NickAlreadyInUseException if our nick is already in use on the server. - */ - public final synchronized void connect(String hostname, int port) throws IOException, IrcException, NickAlreadyInUseException { - this.connect(hostname, port, null); - } - - - /** - * Attempt to connect to the specified IRC server using the supplied - * password. - * The onConnect method is called upon success. - * - * @param hostname The hostname of the server to connect to. - * @param port The port number to connect to on the server. - * @param password The password to use to join the server. - * - * @throws IOException if it was not possible to connect to the server. - * @throws IrcException if the server would not let us join it. - * @throws NickAlreadyInUseException if our nick is already in use on the server. - */ - public final synchronized void connect(String hostname, int port, String password) throws IOException, IrcException, NickAlreadyInUseException { - - _server = hostname; - _port = port; - _password = password; - - if (isConnected()) { - throw new IOException("The PircBot is already connected to an IRC server. Disconnect first."); - } - - // Don't clear the outqueue - there might be something important in it! - - // Clear everything we may have know about channels. - this.removeAllChannels(); - - // Connect to the server. - Socket socket = new Socket(hostname, port); - this.log("*** Connected to server."); - - _inetAddress = socket.getLocalAddress(); - - InputStreamReader inputStreamReader = null; - OutputStreamWriter outputStreamWriter = null; - if (getEncoding() != null) { - // Assume the specified encoding is valid for this JVM. - inputStreamReader = new InputStreamReader(socket.getInputStream(), getEncoding()); - outputStreamWriter = new OutputStreamWriter(socket.getOutputStream(), getEncoding()); - } - else { - // Otherwise, just use the JVM's default encoding. - inputStreamReader = new InputStreamReader(socket.getInputStream()); - outputStreamWriter = new OutputStreamWriter(socket.getOutputStream()); - } - - BufferedReader breader = new BufferedReader(inputStreamReader); - BufferedWriter bwriter = new BufferedWriter(outputStreamWriter); - - // Attempt to join the server. - if (password != null && !password.equals("")) { - OutputThread.sendRawLine(this, bwriter, "PASS " + password); - } - String nick = this.getName(); - OutputThread.sendRawLine(this, bwriter, "NICK " + nick); - OutputThread.sendRawLine(this, bwriter, "USER " + this.getLogin() + " 8 * :" + this.getVersion()); - - _inputThread = new InputThread(this, socket, breader, bwriter); - - // Read stuff back from the server to see if we connected. - String line = null; - int tries = 1; - while ((line = breader.readLine()) != null) { - - this.handleLine(line); - - int firstSpace = line.indexOf(" "); - int secondSpace = line.indexOf(" ", firstSpace + 1); - if (secondSpace >= 0) { - String code = line.substring(firstSpace + 1, secondSpace); - - if (code.equals("004")) { - // We're connected to the server. - break; - } - else if (code.equals("433")) { - if (_autoNickChange) { - tries++; - nick = getName() + tries; - OutputThread.sendRawLine(this, bwriter, "NICK " + nick); - } - else { - socket.close(); - _inputThread = null; - throw new NickAlreadyInUseException(line); - } - } - else if (code.equals("439")) { - // No action required. - } - else if (code.startsWith("5") || code.startsWith("4")) { - socket.close(); - _inputThread = null; - throw new IrcException("Could not log into the IRC server: " + line); - } - } - this.setNick(nick); - - } - - this.log("*** Logged onto server."); - - // This makes the socket timeout on read operations after 5 minutes. - // Maybe in some future version I will let the user change this at runtime. - socket.setSoTimeout(5 * 60 * 1000); - - // Now start the InputThread to read all other lines from the server. - _inputThread.start(); - - // Now start the outputThread that will be used to send all messages. - if (_outputThread == null) { - _outputThread = new OutputThread(this, _outQueue); - _outputThread.start(); - } - - this.onConnect(); - - } - - - /** - * Reconnects to the IRC server that we were previously connected to. - * If necessary, the appropriate port number and password will be used. - * This method will throw an IrcException if we have never connected - * to an IRC server previously. - * - * @since PircBot 0.9.9 - * - * @throws IOException if it was not possible to connect to the server. - * @throws IrcException if the server would not let us join it. - * @throws NickAlreadyInUseException if our nick is already in use on the server. - */ - public final synchronized void reconnect() throws IOException, IrcException, NickAlreadyInUseException{ - if (getServer() == null) { - throw new IrcException("Cannot reconnect to an IRC server because we were never connected to one previously!"); - } - connect(getServer(), getPort(), getPassword()); - } - - - /** - * This method disconnects from the server cleanly by calling the - * quitServer() method. Providing the PircBot was connected to an - * IRC server, the onDisconnect() will be called as soon as the - * disconnection is made by the server. - * - * @see #quitServer() quitServer - * @see #quitServer(String) quitServer - */ - public final synchronized void disconnect() { - this.quitServer(); - } - - - /** - * When you connect to a server and your nick is already in use and - * this is set to true, a new nick will be automatically chosen. - * This is done by adding numbers to the end of the nick until an - * available nick is found. - * - * @param autoNickChange Set to true if you want automatic nick changes - * during connection. - */ - public void setAutoNickChange(boolean autoNickChange) { - _autoNickChange = autoNickChange; - } - - /** - * Joins a channel. - * - * @param channel The name of the channel to join (eg "#cs"). - */ - public final void joinChannel(String channel) { - this.sendRawLine("JOIN " + channel); - } - - - /** - * Joins a channel with a key. - * - * @param channel The name of the channel to join (eg "#cs"). - * @param key The key that will be used to join the channel. - */ - public final void joinChannel(String channel, String key) { - this.joinChannel(channel + " " + key); - } - - - /** - * Parts a channel. - * - * @param channel The name of the channel to leave. - */ - public final void partChannel(String channel) { - this.sendRawLine("PART " + channel); - } - - - /** - * Parts a channel, giving a reason. - * - * @param channel The name of the channel to leave. - * @param reason The reason for parting the channel. - */ - public final void partChannel(String channel, String reason) { - this.sendRawLine("PART " + channel + " :" + reason); - } - - - /** - * Quits from the IRC server. - * Providing we are actually connected to an IRC server, the - * onDisconnect() method will be called as soon as the IRC server - * disconnects us. - */ - public final void quitServer() { - this.quitServer(""); - } - - - /** - * Quits from the IRC server with a reason. - * Providing we are actually connected to an IRC server, the - * onDisconnect() method will be called as soon as the IRC server - * disconnects us. - * - * @param reason The reason for quitting the server. - */ - public final void quitServer(String reason) { - this.sendRawLine("QUIT :" + reason); - } - - - /** - * Sends a raw line to the IRC server as soon as possible, bypassing the - * outgoing message queue. - * - * @param line The raw line to send to the IRC server. - */ - public final synchronized void sendRawLine(String line) { - if (isConnected()) { - _inputThread.sendRawLine(line); - } - } - - /** - * Sends a raw line through the outgoing message queue. - * - * @param line The raw line to send to the IRC server. - */ - public final synchronized void sendRawLineViaQueue(String line) { - if (line == null) { - throw new NullPointerException("Cannot send null messages to server"); - } - if (isConnected()) { - _outQueue.add(line); - } - } - - - /** - * Sends a message to a channel or a private message to a user. These - * messages are added to the outgoing message queue and sent at the - * earliest possible opportunity. - *

- * Some examples: - - *

    // Send the message "Hello!" to the channel #cs.
-     *    sendMessage("#cs", "Hello!");
-     *    
-     *    // Send a private message to Paul that says "Hi".
-     *    sendMessage("Paul", "Hi");
- * - * You may optionally apply colours, boldness, underlining, etc to - * the message by using the Colors class. - * - * @param target The name of the channel or user nick to send to. - * @param message The message to send. - * - * @see Colors - */ - public final void sendMessage(String target, String message) { - _outQueue.add("PRIVMSG " + target + " :" + message); - } - - - /** - * Sends an action to the channel or to a user. - * - * @param target The name of the channel or user nick to send to. - * @param action The action to send. - * - * @see Colors - */ - public final void sendAction(String target, String action) { - sendCTCPCommand(target, "ACTION " + action); - } - - - /** - * Sends a notice to the channel or to a user. - * - * @param target The name of the channel or user nick to send to. - * @param notice The notice to send. - */ - public final void sendNotice(String target, String notice) { - _outQueue.add("NOTICE " + target + " :" + notice); - } - - - /** - * Sends a CTCP command to a channel or user. (Client to client protocol). - * Examples of such commands are "PING ", "FINGER", "VERSION", etc. - * For example, if you wish to request the version of a user called "Dave", - * then you would call sendCTCPCommand("Dave", "VERSION");. - * The type of response to such commands is largely dependant on the target - * client software. - * - * @since PircBot 0.9.5 - * - * @param target The name of the channel or user to send the CTCP message to. - * @param command The CTCP command to send. - */ - public final void sendCTCPCommand(String target, String command) { - _outQueue.add("PRIVMSG " + target + " :\u0001" + command + "\u0001"); - } - - - /** - * Attempt to change the current nick (nickname) of the bot when it - * is connected to an IRC server. - * After confirmation of a successful nick change, the getNick method - * will return the new nick. - * - * @param newNick The new nick to use. - */ - public final void changeNick(String newNick) { - this.sendRawLine("NICK " + newNick); - } - - - /** - * Identify the bot with NickServ, supplying the appropriate password. - * Some IRC Networks (such as freenode) require users to register and - * identify with NickServ before they are able to send private messages - * to other users, thus reducing the amount of spam. If you are using - * an IRC network where this kind of policy is enforced, you will need - * to make your bot identify itself to NickServ before you can send - * private messages. Assuming you have already registered your bot's - * nick with NickServ, this method can be used to identify with - * the supplied password. It usually makes sense to identify with NickServ - * immediately after connecting to a server. - *

- * This method issues a raw NICKSERV command to the server, and is therefore - * safer than the alternative approach of sending a private message to - * NickServ. The latter approach is considered dangerous, as it may cause - * you to inadvertently transmit your password to an untrusted party if you - * connect to a network which does not run a NickServ service and where the - * untrusted party has assumed the nick "NickServ". However, if your IRC - * network is only compatible with the private message approach, you may - * typically identify like so: - *

sendMessage("NickServ", "identify PASSWORD");
- * - * @param password The password which will be used to identify with NickServ. - */ - public final void identify(String password) { - this.sendRawLine("NICKSERV IDENTIFY " + password); - } - - - /** - * Set the mode of a channel. - * This method attempts to set the mode of a channel. This - * may require the bot to have operator status on the channel. - * For example, if the bot has operator status, we can grant - * operator status to "Dave" on the #cs channel - * by calling setMode("#cs", "+o Dave"); - * An alternative way of doing this would be to use the op method. - * - * @param channel The channel on which to perform the mode change. - * @param mode The new mode to apply to the channel. This may include - * zero or more arguments if necessary. - * - * @see #op(String,String) op - */ - public final void setMode(String channel, String mode) { - this.sendRawLine("MODE " + channel + " " + mode); - } - - - /** - * Sends an invitation to join a channel. Some channels can be marked - * as "invite-only", so it may be useful to allow a bot to invite people - * into it. - * - * @param nick The nick of the user to invite - * @param channel The channel you are inviting the user to join. - * - */ - public final void sendInvite(String nick, String channel) { - this.sendRawLine("INVITE " + nick + " :" + channel); - } - - - /** - * Bans a user from a channel. An example of a valid hostmask is - * "*!*compu@*.18hp.net". This may be used in conjunction with the - * kick method to permanently remove a user from a channel. - * Successful use of this method may require the bot to have operator - * status itself. - * - * @param channel The channel to ban the user from. - * @param hostmask A hostmask representing the user we're banning. - */ - public final void ban(String channel, String hostmask) { - this.sendRawLine("MODE " + channel + " +b " + hostmask); - } - - - /** - * Unbans a user from a channel. An example of a valid hostmask is - * "*!*compu@*.18hp.net". - * Successful use of this method may require the bot to have operator - * status itself. - * - * @param channel The channel to unban the user from. - * @param hostmask A hostmask representing the user we're unbanning. - */ - public final void unBan(String channel, String hostmask) { - this.sendRawLine("MODE " + channel + " -b " + hostmask); - } - - - /** - * Grants operator privilidges to a user on a channel. - * Successful use of this method may require the bot to have operator - * status itself. - * - * @param channel The channel we're opping the user on. - * @param nick The nick of the user we are opping. - */ - public final void op(String channel, String nick) { - this.setMode(channel, "+o " + nick); - } - - - /** - * Removes operator privilidges from a user on a channel. - * Successful use of this method may require the bot to have operator - * status itself. - * - * @param channel The channel we're deopping the user on. - * @param nick The nick of the user we are deopping. - */ - public final void deOp(String channel, String nick) { - this.setMode(channel, "-o " + nick); - } - - - /** - * Grants voice privilidges to a user on a channel. - * Successful use of this method may require the bot to have operator - * status itself. - * - * @param channel The channel we're voicing the user on. - * @param nick The nick of the user we are voicing. - */ - public final void voice(String channel, String nick) { - this.setMode(channel, "+v " + nick); - } - - - /** - * Removes voice privilidges from a user on a channel. - * Successful use of this method may require the bot to have operator - * status itself. - * - * @param channel The channel we're devoicing the user on. - * @param nick The nick of the user we are devoicing. - */ - public final void deVoice(String channel, String nick) { - this.setMode(channel, "-v " + nick); - } - - - /** - * Set the topic for a channel. - * This method attempts to set the topic of a channel. This - * may require the bot to have operator status if the topic - * is protected. - * - * @param channel The channel on which to perform the mode change. - * @param topic The new topic for the channel. - * - */ - public final void setTopic(String channel, String topic) { - this.sendRawLine("TOPIC " + channel + " :" + topic); - } - - - /** - * Kicks a user from a channel. - * This method attempts to kick a user from a channel and - * may require the bot to have operator status in the channel. - * - * @param channel The channel to kick the user from. - * @param nick The nick of the user to kick. - */ - public final void kick(String channel, String nick) { - this.kick(channel, nick, ""); - } - - - /** - * Kicks a user from a channel, giving a reason. - * This method attempts to kick a user from a channel and - * may require the bot to have operator status in the channel. - * - * @param channel The channel to kick the user from. - * @param nick The nick of the user to kick. - * @param reason A description of the reason for kicking a user. - */ - public final void kick(String channel, String nick, String reason) { - this.sendRawLine("KICK " + channel + " " + nick + " :" + reason); - } - - - /** - * Issues a request for a list of all channels on the IRC server. - * When the PircBot receives information for each channel, it will - * call the onChannelInfo method, which you will need to override - * if you want it to do anything useful. - * - * @see #onChannelInfo(String,int,String) onChannelInfo - */ - public final void listChannels() { - this.listChannels(null); - } - - - /** - * Issues a request for a list of all channels on the IRC server. - * When the PircBot receives information for each channel, it will - * call the onChannelInfo method, which you will need to override - * if you want it to do anything useful. - *

- * Some IRC servers support certain parameters for LIST requests. - * One example is a parameter of ">10" to list only those channels - * that have more than 10 users in them. Whether these parameters - * are supported or not will depend on the IRC server software. - * - * @param parameters The parameters to supply when requesting the - * list. - * - * @see #onChannelInfo(String,int,String) onChannelInfo - */ - public final void listChannels(String parameters) { - if (parameters == null) { - this.sendRawLine("LIST"); - } - else { - this.sendRawLine("LIST " + parameters); - } - } - - /** - * Adds a line to the log. This log is currently output to the standard - * output and is in the correct format for use by tools such as pisg, the - * Perl IRC Statistics Generator. You may override this method if you wish - * to do something else with log entries. - * Each line in the log begins with a number which - * represents the logging time (as the number of milliseconds since the - * epoch). This timestamp and the following log entry are separated by - * a single space character, " ". Outgoing messages are distinguishable - * by a log entry that has ">>>" immediately following the space character - * after the timestamp. DCC events use "+++" and warnings about unhandled - * Exceptions and Errors use "###". - *

- * This implementation of the method will only cause log entries to be - * output if the PircBot has had its verbose mode turned on by calling - * setVerbose(true); - * - * @param line The line to add to the log. - */ - public void log(String line) { - if (_verbose) { - System.out.println(System.currentTimeMillis() + " " + line); - } - } - - - /** - * This method handles events when any line of text arrives from the server, - * then calling the appropriate method in the PircBot. This method is - * protected and only called by the InputThread for this instance. - *

- * This method may not be overridden! - * - * @param line The raw line of text from the server. - */ - protected void handleLine(String line) { - this.log(line); - - // Check for server pings. - if (line.startsWith("PING ")) { - // Respond to the ping and return immediately. - this.onServerPing(line.substring(5)); - return; - } - - String sourceNick = ""; - String sourceLogin = ""; - String sourceHostname = ""; - - StringTokenizer tokenizer = new StringTokenizer(line); - String senderInfo = tokenizer.nextToken(); - String command = tokenizer.nextToken(); - String target = null; - - int exclamation = senderInfo.indexOf("!"); - int at = senderInfo.indexOf("@"); - if (senderInfo.startsWith(":")) { - if (exclamation > 0 && at > 0 && exclamation < at) { - sourceNick = senderInfo.substring(1, exclamation); - sourceLogin = senderInfo.substring(exclamation + 1, at); - sourceHostname = senderInfo.substring(at + 1); - } - else { - - if (tokenizer.hasMoreTokens()) { - String token = command; - - int code = -1; - try { - code = Integer.parseInt(token); - } - catch (NumberFormatException e) { - // Keep the existing value. - } - - if (code != -1) { - String errorStr = token; - String response = line.substring(line.indexOf(errorStr, senderInfo.length()) + 4, line.length()); - this.processServerResponse(code, response); - // Return from the method. - return; - } - else { - // This is not a server response. - // It must be a nick without login and hostname. - // (or maybe a NOTICE or suchlike from the server) - sourceNick = senderInfo; - target = token; - } - } - else { - // We don't know what this line means. - this.onUnknown(line); - // Return from the method; - return; - } - - } - } - - command = command.toUpperCase(Locale.ENGLISH); - if (sourceNick.startsWith(":")) { - sourceNick = sourceNick.substring(1); - } - if (target == null) { - target = tokenizer.nextToken(); - } - if (target.startsWith(":")) { - target = target.substring(1); - } - - // Check for CTCP requests. - if (command.equals("PRIVMSG") && line.indexOf(":\u0001") > 0 && line.endsWith("\u0001")) { - String request = line.substring(line.indexOf(":\u0001") + 2, line.length() - 1); - if (request.equals("VERSION")) { - // VERSION request - this.onVersion(sourceNick, sourceLogin, sourceHostname, target); - } - else if (request.startsWith("ACTION ")) { - // ACTION request - this.onAction(sourceNick, sourceLogin, sourceHostname, target, request.substring(7)); - } - else if (request.startsWith("PING ")) { - // PING request - this.onPing(sourceNick, sourceLogin, sourceHostname, target, request.substring(5)); - } - else if (request.equals("TIME")) { - // TIME request - this.onTime(sourceNick, sourceLogin, sourceHostname, target); - } - else if (request.equals("FINGER")) { - // FINGER request - this.onFinger(sourceNick, sourceLogin, sourceHostname, target); - } - else { - // An unknown CTCP message - ignore it. - this.onUnknown(line); - } - } - else if (command.equals("PRIVMSG") && _channelPrefixes.indexOf(target.charAt(0)) >= 0) { - // This is a normal message to a channel. - this.onMessage(target, sourceNick, sourceLogin, sourceHostname, line.substring(line.indexOf(" :") + 2)); - } - else if (command.equals("PRIVMSG")) { - // This is a private message to us. - this.onPrivateMessage(sourceNick, sourceLogin, sourceHostname, line.substring(line.indexOf(" :") + 2)); - } - else if (command.equals("JOIN")) { - // Someone is joining a channel. - String channel = target; - this.addUser(channel, new User("", sourceNick)); - this.onJoin(channel, sourceNick, sourceLogin, sourceHostname); - } - else if (command.equals("PART")) { - // Someone is parting from a channel. - this.removeUser(target, sourceNick); - if (sourceNick.equals(this.getNick())) { - this.removeChannel(target); - } - this.onPart(target, sourceNick, sourceLogin, sourceHostname); - } - else if (command.equals("NICK")) { - // Somebody is changing their nick. - String newNick = target; - this.renameUser(sourceNick, newNick); - if (sourceNick.equals(this.getNick())) { - // Update our nick if it was us that changed nick. - this.setNick(newNick); - } - this.onNickChange(sourceNick, sourceLogin, sourceHostname, newNick); - } - else if (command.equals("NOTICE")) { - // Someone is sending a notice. - this.onNotice(sourceNick, sourceLogin, sourceHostname, target, line.substring(line.indexOf(" :") + 2)); - } - else if (command.equals("QUIT")) { - // Someone has quit from the IRC server. - if (sourceNick.equals(this.getNick())) { - this.removeAllChannels(); - } - else { - this.removeUser(sourceNick); - } - this.onQuit(sourceNick, sourceLogin, sourceHostname, line.substring(line.indexOf(" :") + 2)); - } - else if (command.equals("KICK")) { - // Somebody has been kicked from a channel. - String recipient = tokenizer.nextToken(); - if (recipient.equals(this.getNick())) { - this.removeChannel(target); - } - this.removeUser(target, recipient); - this.onKick(target, sourceNick, sourceLogin, sourceHostname, recipient, line.substring(line.indexOf(" :") + 2)); - } - else if (command.equals("MODE")) { - // Somebody is changing the mode on a channel or user. - String mode = line.substring(line.indexOf(target, 2) + target.length() + 1); - if (mode.startsWith(":")) { - mode = mode.substring(1); - } - this.processMode(target, sourceNick, sourceLogin, sourceHostname, mode); - } - else if (command.equals("TOPIC")) { - // Someone is changing the topic. - this.onTopic(target, line.substring(line.indexOf(" :") + 2), sourceNick, System.currentTimeMillis(), true); - } - else if (command.equals("INVITE")) { - // Somebody is inviting somebody else into a channel. - this.onInvite(target, sourceNick, sourceLogin, sourceHostname, line.substring(line.indexOf(" :") + 2)); - } - else { - // If we reach this point, then we've found something that the PircBot - // Doesn't currently deal with. - this.onUnknown(line); - } - - } - - - /** - * This method is called once the PircBot has successfully connected to - * the IRC server. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.6 - */ - protected void onConnect() {} - - - /** - * This method carries out the actions to be performed when the PircBot - * gets disconnected. This may happen if the PircBot quits from the - * server, or if the connection is unexpectedly lost. - *

- * Disconnection from the IRC server is detected immediately if either - * we or the server close the connection normally. If the connection to - * the server is lost, but neither we nor the server have explicitly closed - * the connection, then it may take a few minutes to detect (this is - * commonly referred to as a "ping timeout"). - *

- * If you wish to get your IRC bot to automatically rejoin a server after - * the connection has been lost, then this is probably the ideal method to - * override to implement such functionality. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - */ - protected void onDisconnect() {} - - - /** - * This method is called by the PircBot when a numeric response - * is received from the IRC server. We use this method to - * allow PircBot to process various responses from the server - * before then passing them on to the onServerResponse method. - *

- * Note that this method is private and should not appear in any - * of the javadoc generated documenation. - * - * @param code The three-digit numerical code for the response. - * @param response The full response from the IRC server. - */ - private final void processServerResponse(int code, String response) { - - if (code == RPL_LIST) { - // This is a bit of information about a channel. - int firstSpace = response.indexOf(' '); - int secondSpace = response.indexOf(' ', firstSpace + 1); - int thirdSpace = response.indexOf(' ', secondSpace + 1); - int colon = response.indexOf(':'); - String channel = response.substring(firstSpace + 1, secondSpace); - int userCount = 0; - try { - userCount = Integer.parseInt(response.substring(secondSpace + 1, thirdSpace)); - } - catch (NumberFormatException e) { - // Stick with the value of zero. - } - String topic = response.substring(colon + 1); - this.onChannelInfo(channel, userCount, topic); - } - else if (code == RPL_TOPIC) { - // This is topic information about a channel we've just joined. - int firstSpace = response.indexOf(' '); - int secondSpace = response.indexOf(' ', firstSpace + 1); - int colon = response.indexOf(':'); - String channel = response.substring(firstSpace + 1, secondSpace); - String topic = response.substring(colon + 1); - - _topics.put(channel, topic); - - // For backwards compatibility only - this onTopic method is deprecated. - this.onTopic(channel, topic); - } - else if (code == RPL_TOPICINFO) { - StringTokenizer tokenizer = new StringTokenizer(response); - tokenizer.nextToken(); - String channel = tokenizer.nextToken(); - String setBy = tokenizer.nextToken(); - long date = 0; - try { - date = Long.parseLong(tokenizer.nextToken()) * 1000; - } - catch (NumberFormatException e) { - // Stick with the default value of zero. - } - - String topic = (String) _topics.get(channel); - _topics.remove(channel); - - this.onTopic(channel, topic, setBy, date, false); - } - else if (code == RPL_NAMREPLY) { - // This is a list of nicks in a channel that we've just joined. - int channelEndIndex = response.indexOf(" :"); - String channel = response.substring(response.lastIndexOf(' ', channelEndIndex - 1) + 1, channelEndIndex); - - StringTokenizer tokenizer = new StringTokenizer(response.substring(response.indexOf(" :") + 2)); - while (tokenizer.hasMoreTokens()) { - String nick = tokenizer.nextToken(); - String prefix = ""; - if (nick.startsWith("@")) { - // User is an operator in this channel. - prefix = "@"; - } - else if (nick.startsWith("+")) { - // User is voiced in this channel. - prefix = "+"; - } - else if (nick.startsWith(".")) { - // Some wibbly status I've never seen before... - prefix = "."; - } - nick = nick.substring(prefix.length()); - this.addUser(channel, new User(prefix, nick)); - } - } - else if (code == RPL_ENDOFNAMES) { - // This is the end of a NAMES list, so we know that we've got - // the full list of users in the channel that we just joined. - String channel = response.substring(response.indexOf(' ') + 1, response.indexOf(" :")); - User[] users = this.getUsers(channel); - this.onUserList(channel, users); - } - - this.onServerResponse(code, response); - } - - - /** - * This method is called when we receive a numeric response from the - * IRC server. - *

- * Numerics in the range from 001 to 099 are used for client-server - * connections only and should never travel between servers. Replies - * generated in response to commands are found in the range from 200 - * to 399. Error replies are found in the range from 400 to 599. - *

- * For example, we can use this method to discover the topic of a - * channel when we join it. If we join the channel #test which - * has a topic of "I am King of Test" then the response - * will be "PircBot #test :I Am King of Test" - * with a code of 332 to signify that this is a topic. - * (This is just an example - note that overriding the - * onTopic method is an easier way of finding the - * topic for a channel). Check the IRC RFC for the full list of other - * command response codes. - *

- * PircBot implements the interface ReplyConstants, which contains - * contstants that you may find useful here. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param code The three-digit numerical code for the response. - * @param response The full response from the IRC server. - * - * @see ReplyConstants - */ - protected void onServerResponse(int code, String response) {} - - - /** - * This method is called when we receive a user list from the server - * after joining a channel. - *

- * Shortly after joining a channel, the IRC server sends a list of all - * users in that channel. The PircBot collects this information and - * calls this method as soon as it has the full list. - *

- * To obtain the nick of each user in the channel, call the getNick() - * method on each User object in the array. - *

- * At a later time, you may call the getUsers method to obtain an - * up to date list of the users in the channel. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 1.0.0 - * - * @param channel The name of the channel. - * @param users An array of User objects belonging to this channel. - * - * @see User - */ - protected void onUserList(String channel, User[] users) {} - - - /** - * This method is called whenever a message is sent to a channel. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param channel The channel to which the message was sent. - * @param sender The nick of the person who sent the message. - * @param login The login of the person who sent the message. - * @param hostname The hostname of the person who sent the message. - * @param message The actual message sent to the channel. - */ - protected void onMessage(String channel, String sender, String login, String hostname, String message) {} - - - /** - * This method is called whenever a private message is sent to the PircBot. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param sender The nick of the person who sent the private message. - * @param login The login of the person who sent the private message. - * @param hostname The hostname of the person who sent the private message. - * @param message The actual message. - */ - protected void onPrivateMessage(String sender, String login, String hostname, String message) {} - - - /** - * This method is called whenever an ACTION is sent from a user. E.g. - * such events generated by typing "/me goes shopping" in most IRC clients. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param sender The nick of the user that sent the action. - * @param login The login of the user that sent the action. - * @param hostname The hostname of the user that sent the action. - * @param target The target of the action, be it a channel or our nick. - * @param action The action carried out by the user. - */ - protected void onAction(String sender, String login, String hostname, String target, String action) {} - - - /** - * This method is called whenever we receive a notice. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param sourceNick The nick of the user that sent the notice. - * @param sourceLogin The login of the user that sent the notice. - * @param sourceHostname The hostname of the user that sent the notice. - * @param target The target of the notice, be it our nick or a channel name. - * @param notice The notice message. - */ - protected void onNotice(String sourceNick, String sourceLogin, String sourceHostname, String target, String notice) {} - - - /** - * This method is called whenever someone (possibly us) joins a channel - * which we are on. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param channel The channel which somebody joined. - * @param sender The nick of the user who joined the channel. - * @param login The login of the user who joined the channel. - * @param hostname The hostname of the user who joined the channel. - */ - protected void onJoin(String channel, String sender, String login, String hostname) {} - - - /** - * This method is called whenever someone (possibly us) parts a channel - * which we are on. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param channel The channel which somebody parted from. - * @param sender The nick of the user who parted from the channel. - * @param login The login of the user who parted from the channel. - * @param hostname The hostname of the user who parted from the channel. - */ - protected void onPart(String channel, String sender, String login, String hostname) {} - - - /** - * This method is called whenever someone (possibly us) changes nick on any - * of the channels that we are on. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param oldNick The old nick. - * @param login The login of the user. - * @param hostname The hostname of the user. - * @param newNick The new nick. - */ - protected void onNickChange(String oldNick, String login, String hostname, String newNick) {} - - - /** - * This method is called whenever someone (possibly us) is kicked from - * any of the channels that we are in. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param channel The channel from which the recipient was kicked. - * @param kickerNick The nick of the user who performed the kick. - * @param kickerLogin The login of the user who performed the kick. - * @param kickerHostname The hostname of the user who performed the kick. - * @param recipientNick The unfortunate recipient of the kick. - * @param reason The reason given by the user who performed the kick. - */ - protected void onKick(String channel, String kickerNick, String kickerLogin, String kickerHostname, String recipientNick, String reason) {} - - - /** - * This method is called whenever someone (possibly us) quits from the - * server. We will only observe this if the user was in one of the - * channels to which we are connected. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param sourceNick The nick of the user that quit from the server. - * @param sourceLogin The login of the user that quit from the server. - * @param sourceHostname The hostname of the user that quit from the server. - * @param reason The reason given for quitting the server. - */ - protected void onQuit(String sourceNick, String sourceLogin, String sourceHostname, String reason) {} - - - /** - * This method is called whenever a user sets the topic, or when - * PircBot joins a new channel and discovers its topic. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param channel The channel that the topic belongs to. - * @param topic The topic for the channel. - * - * @deprecated As of 1.2.0, replaced by {@link #onTopic(String,String,String,long,boolean)} - */ - protected void onTopic(String channel, String topic) {} - - - /** - * This method is called whenever a user sets the topic, or when - * PircBot joins a new channel and discovers its topic. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param channel The channel that the topic belongs to. - * @param topic The topic for the channel. - * @param setBy The nick of the user that set the topic. - * @param date When the topic was set (milliseconds since the epoch). - * @param changed True if the topic has just been changed, false if - * the topic was already there. - * - */ - protected void onTopic(String channel, String topic, String setBy, long date, boolean changed) {} - - - /** - * After calling the listChannels() method in PircBot, the server - * will start to send us information about each channel on the - * server. You may override this method in order to receive the - * information about each channel as soon as it is received. - *

- * Note that certain channels, such as those marked as hidden, - * may not appear in channel listings. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param channel The name of the channel. - * @param userCount The number of users visible in this channel. - * @param topic The topic for this channel. - * - * @see #listChannels() listChannels - */ - protected void onChannelInfo(String channel, int userCount, String topic) {} - - - /** - * Called when the mode of a channel is set. We process this in - * order to call the appropriate onOp, onDeop, etc method before - * finally calling the override-able onMode method. - *

- * Note that this method is private and is not intended to appear - * in the javadoc generated documentation. - * - * @param target The channel or nick that the mode operation applies to. - * @param sourceNick The nick of the user that set the mode. - * @param sourceLogin The login of the user that set the mode. - * @param sourceHostname The hostname of the user that set the mode. - * @param mode The mode that has been set. - */ - private final void processMode(String target, String sourceNick, String sourceLogin, String sourceHostname, String mode) { - - if (_channelPrefixes.indexOf(target.charAt(0)) >= 0) { - // The mode of a channel is being changed. - String channel = target; - StringTokenizer tok = new StringTokenizer(mode); - String[] params = new String[tok.countTokens()]; - - int t = 0; - while (tok.hasMoreTokens()) { - params[t] = tok.nextToken(); - t++; - } - - char pn = ' '; - int p = 1; - - // All of this is very large and ugly, but it's the only way of providing - // what the users want :-/ - for (int i = 0; i < params[0].length(); i++) { - char atPos = params[0].charAt(i); - - if (atPos == '+' || atPos == '-') { - pn = atPos; - } - else if (atPos == 'o') { - if (pn == '+') { - this.updateUser(channel, OP_ADD, params[p]); - onOp(channel, sourceNick, sourceLogin, sourceHostname, params[p]); - } - else { - this.updateUser(channel, OP_REMOVE, params[p]); - onDeop(channel, sourceNick, sourceLogin, sourceHostname, params[p]); - } - p++; - } - else if (atPos == 'v') { - if (pn == '+') { - this.updateUser(channel, VOICE_ADD, params[p]); - onVoice(channel, sourceNick, sourceLogin, sourceHostname, params[p]); - } - else { - this.updateUser(channel, VOICE_REMOVE, params[p]); - onDeVoice(channel, sourceNick, sourceLogin, sourceHostname, params[p]); - } - p++; - } - else if (atPos == 'k') { - if (pn == '+') { - onSetChannelKey(channel, sourceNick, sourceLogin, sourceHostname, params[p]); - } - else { - onRemoveChannelKey(channel, sourceNick, sourceLogin, sourceHostname, params[p]); - } - p++; - } - else if (atPos == 'l') { - if (pn == '+') { - onSetChannelLimit(channel, sourceNick, sourceLogin, sourceHostname, Integer.parseInt(params[p])); - p++; - } - else { - onRemoveChannelLimit(channel, sourceNick, sourceLogin, sourceHostname); - } - } - else if (atPos == 'b') { - if (pn == '+') { - onSetChannelBan(channel, sourceNick, sourceLogin, sourceHostname,params[p]); - } - else { - onRemoveChannelBan(channel, sourceNick, sourceLogin, sourceHostname, params[p]); - } - p++; - } - else if (atPos == 't') { - if (pn == '+') { - onSetTopicProtection(channel, sourceNick, sourceLogin, sourceHostname); - } - else { - onRemoveTopicProtection(channel, sourceNick, sourceLogin, sourceHostname); - } - } - else if (atPos == 'n') { - if (pn == '+') { - onSetNoExternalMessages(channel, sourceNick, sourceLogin, sourceHostname); - } - else { - onRemoveNoExternalMessages(channel, sourceNick, sourceLogin, sourceHostname); - } - } - else if (atPos == 'i') { - if (pn == '+') { - onSetInviteOnly(channel, sourceNick, sourceLogin, sourceHostname); - } - else { - onRemoveInviteOnly(channel, sourceNick, sourceLogin, sourceHostname); - } - } - else if (atPos == 'm') { - if (pn == '+') { - onSetModerated(channel, sourceNick, sourceLogin, sourceHostname); - } - else { - onRemoveModerated(channel, sourceNick, sourceLogin, sourceHostname); - } - } - else if (atPos == 'p') { - if (pn == '+') { - onSetPrivate(channel, sourceNick, sourceLogin, sourceHostname); - } - else { - onRemovePrivate(channel, sourceNick, sourceLogin, sourceHostname); - } - } - else if (atPos == 's') { - if (pn == '+') { - onSetSecret(channel, sourceNick, sourceLogin, sourceHostname); - } - else { - onRemoveSecret(channel, sourceNick, sourceLogin, sourceHostname); - } - } - } - - this.onMode(channel, sourceNick, sourceLogin, sourceHostname, mode); - } - else { - // The mode of a user is being changed. - String nick = target; - this.onUserMode(nick, sourceNick, sourceLogin, sourceHostname, mode); - } - } - - - /** - * Called when the mode of a channel is set. - *

- * You may find it more convenient to decode the meaning of the mode - * string by overriding the onOp, onDeOp, onVoice, onDeVoice, - * onChannelKey, onDeChannelKey, onChannelLimit, onDeChannelLimit, - * onChannelBan or onDeChannelBan methods as appropriate. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param channel The channel that the mode operation applies to. - * @param sourceNick The nick of the user that set the mode. - * @param sourceLogin The login of the user that set the mode. - * @param sourceHostname The hostname of the user that set the mode. - * @param mode The mode that has been set. - * - */ - protected void onMode(String channel, String sourceNick, String sourceLogin, String sourceHostname, String mode) {} - - - /** - * Called when the mode of a user is set. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 1.2.0 - * - * @param targetNick The nick that the mode operation applies to. - * @param sourceNick The nick of the user that set the mode. - * @param sourceLogin The login of the user that set the mode. - * @param sourceHostname The hostname of the user that set the mode. - * @param mode The mode that has been set. - * - */ - protected void onUserMode(String targetNick, String sourceNick, String sourceLogin, String sourceHostname, String mode) {} - - - - /** - * Called when a user (possibly us) gets granted operator status for a channel. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param recipient The nick of the user that got 'opped'. - */ - protected void onOp(String channel, String sourceNick, String sourceLogin, String sourceHostname, String recipient) {} - - - /** - * Called when a user (possibly us) gets operator status taken away. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param recipient The nick of the user that got 'deopped'. - */ - protected void onDeop(String channel, String sourceNick, String sourceLogin, String sourceHostname, String recipient) {} - - - /** - * Called when a user (possibly us) gets voice status granted in a channel. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param recipient The nick of the user that got 'voiced'. - */ - protected void onVoice(String channel, String sourceNick, String sourceLogin, String sourceHostname, String recipient) {} - - - /** - * Called when a user (possibly us) gets voice status removed. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param recipient The nick of the user that got 'devoiced'. - */ - protected void onDeVoice(String channel, String sourceNick, String sourceLogin, String sourceHostname, String recipient) {} - - - /** - * Called when a channel key is set. When the channel key has been set, - * other users may only join that channel if they know the key. Channel keys - * are sometimes referred to as passwords. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param key The new key for the channel. - */ - protected void onSetChannelKey(String channel, String sourceNick, String sourceLogin, String sourceHostname, String key) {} - - - /** - * Called when a channel key is removed. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param key The key that was in use before the channel key was removed. - */ - protected void onRemoveChannelKey(String channel, String sourceNick, String sourceLogin, String sourceHostname, String key) {} - - - /** - * Called when a user limit is set for a channel. The number of users in - * the channel cannot exceed this limit. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param limit The maximum number of users that may be in this channel at the same time. - */ - protected void onSetChannelLimit(String channel, String sourceNick, String sourceLogin, String sourceHostname, int limit) {} - - - /** - * Called when the user limit is removed for a channel. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onRemoveChannelLimit(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a user (possibly us) gets banned from a channel. Being - * banned from a channel prevents any user with a matching hostmask from - * joining the channel. For this reason, most bans are usually directly - * followed by the user being kicked :-) - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param hostmask The hostmask of the user that has been banned. - */ - protected void onSetChannelBan(String channel, String sourceNick, String sourceLogin, String sourceHostname, String hostmask) {} - - - /** - * Called when a hostmask ban is removed from a channel. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - * @param hostmask - */ - protected void onRemoveChannelBan(String channel, String sourceNick, String sourceLogin, String sourceHostname, String hostmask) {} - - - /** - * Called when topic protection is enabled for a channel. Topic protection - * means that only operators in a channel may change the topic. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onSetTopicProtection(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when topic protection is removed for a channel. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onRemoveTopicProtection(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel is set to only allow messages from users that - * are in the channel. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onSetNoExternalMessages(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel is set to allow messages from any user, even - * if they are not actually in the channel. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onRemoveNoExternalMessages(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel is set to 'invite only' mode. A user may only - * join the channel if they are invited by someone who is already in the - * channel. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onSetInviteOnly(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel has 'invite only' removed. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onRemoveInviteOnly(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel is set to 'moderated' mode. If a channel is - * moderated, then only users who have been 'voiced' or 'opped' may speak - * or change their nicks. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onSetModerated(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel has moderated mode removed. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onRemoveModerated(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel is marked as being in private mode. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onSetPrivate(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel is marked as not being in private mode. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onRemovePrivate(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel is set to be in 'secret' mode. Such channels - * typically do not appear on a server's channel listing. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onSetSecret(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when a channel has 'secret' mode removed. - *

- * This is a type of mode change and is also passed to the onMode - * method in the PircBot class. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param channel The channel in which the mode change took place. - * @param sourceNick The nick of the user that performed the mode change. - * @param sourceLogin The login of the user that performed the mode change. - * @param sourceHostname The hostname of the user that performed the mode change. - */ - protected void onRemoveSecret(String channel, String sourceNick, String sourceLogin, String sourceHostname) {} - - - /** - * Called when we are invited to a channel by a user. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @since PircBot 0.9.5 - * - * @param targetNick The nick of the user being invited - should be us! - * @param sourceNick The nick of the user that sent the invitation. - * @param sourceLogin The login of the user that sent the invitation. - * @param sourceHostname The hostname of the user that sent the invitation. - * @param channel The channel that we're being invited to. - */ - protected void onInvite(String targetNick, String sourceNick, String sourceLogin, String sourceHostname, String channel) {} - - - /** - * This method used to be called when a DCC SEND request was sent to the PircBot. - * Please use the onIncomingFileTransfer method to receive files, as it - * has better functionality and supports resuming. - * - * @deprecated As of PircBot 1.2.0, use {@link #onIncomingFileTransfer(DccFileTransfer)} - */ - protected void onDccSendRequest(String sourceNick, String sourceLogin, String sourceHostname, String filename, long address, int port, int size) {} - - - /** - * This method used to be called when a DCC CHAT request was sent to the PircBot. - * Please use the onIncomingChatRequest method to accept chats, as it - * has better functionality. - * - * @deprecated As of PircBot 1.2.0, use {@link #onIncomingChatRequest(DccChat)} - */ - protected void onDccChatRequest(String sourceNick, String sourceLogin, String sourceHostname, long address, int port) {} - - - /** - * This method is called whenever we receive a VERSION request. - * This abstract implementation responds with the PircBot's _version string, - * so if you override this method, be sure to either mimic its functionality - * or to call super.onVersion(...); - * - * @param sourceNick The nick of the user that sent the VERSION request. - * @param sourceLogin The login of the user that sent the VERSION request. - * @param sourceHostname The hostname of the user that sent the VERSION request. - * @param target The target of the VERSION request, be it our nick or a channel name. - */ - protected void onVersion(String sourceNick, String sourceLogin, String sourceHostname, String target) { - this.sendRawLine("NOTICE " + sourceNick + " :\u0001VERSION " + _version + "\u0001"); - } - - - /** - * This method is called whenever we receive a PING request from another - * user. - *

- * This abstract implementation responds correctly, so if you override this - * method, be sure to either mimic its functionality or to call - * super.onPing(...); - * - * @param sourceNick The nick of the user that sent the PING request. - * @param sourceLogin The login of the user that sent the PING request. - * @param sourceHostname The hostname of the user that sent the PING request. - * @param target The target of the PING request, be it our nick or a channel name. - * @param pingValue The value that was supplied as an argument to the PING command. - */ - protected void onPing(String sourceNick, String sourceLogin, String sourceHostname, String target, String pingValue) { - this.sendRawLine("NOTICE " + sourceNick + " :\u0001PING " + pingValue + "\u0001"); - } - - - /** - * The actions to perform when a PING request comes from the server. - *

- * This sends back a correct response, so if you override this method, - * be sure to either mimic its functionality or to call - * super.onServerPing(response); - * - * @param response The response that should be given back in your PONG. - */ - protected void onServerPing(String response) { - this.sendRawLine("PONG " + response); - } - - - /** - * This method is called whenever we receive a TIME request. - *

- * This abstract implementation responds correctly, so if you override this - * method, be sure to either mimic its functionality or to call - * super.onTime(...); - * - * @param sourceNick The nick of the user that sent the TIME request. - * @param sourceLogin The login of the user that sent the TIME request. - * @param sourceHostname The hostname of the user that sent the TIME request. - * @param target The target of the TIME request, be it our nick or a channel name. - */ - protected void onTime(String sourceNick, String sourceLogin, String sourceHostname, String target) { - this.sendRawLine("NOTICE " + sourceNick + " :\u0001TIME " + new Date().toString() + "\u0001"); - } - - - /** - * This method is called whenever we receive a FINGER request. - *

- * This abstract implementation responds correctly, so if you override this - * method, be sure to either mimic its functionality or to call - * super.onFinger(...); - * - * @param sourceNick The nick of the user that sent the FINGER request. - * @param sourceLogin The login of the user that sent the FINGER request. - * @param sourceHostname The hostname of the user that sent the FINGER request. - * @param target The target of the FINGER request, be it our nick or a channel name. - */ - protected void onFinger(String sourceNick, String sourceLogin, String sourceHostname, String target) { - this.sendRawLine("NOTICE " + sourceNick + " :\u0001FINGER " + _finger + "\u0001"); - } - - - /** - * This method is called whenever we receive a line from the server that - * the PircBot has not been programmed to recognise. - *

- * The implementation of this method in the PircBot abstract class - * performs no actions and may be overridden as required. - * - * @param line The raw line that was received from the server. - */ - protected void onUnknown(String line) { - // And then there were none :) - } - - - /** - * Sets the verbose mode. If verbose mode is set to true, then log entries - * will be printed to the standard output. The default value is false and - * will result in no output. For general development, we strongly recommend - * setting the verbose mode to true. - * - * @param verbose true if verbose mode is to be used. Default is false. - */ - public final void setVerbose(boolean verbose) { - _verbose = verbose; - } - - - /** - * Sets the name of the bot, which will be used as its nick when it - * tries to join an IRC server. This should be set before joining - * any servers, otherwise the default nick will be used. You would - * typically call this method from the constructor of the class that - * extends PircBot. - *

- * The changeNick method should be used if you wish to change your nick - * when you are connected to a server. - * - * @param name The new name of the Bot. - */ - protected final void setName(String name) { - _name = name; - } - - - /** - * Sets the internal nick of the bot. This is only to be called by the - * PircBot class in response to notification of nick changes that apply - * to us. - * - * @param nick The new nick. - */ - private final void setNick(String nick) { - _nick = nick; - } - - - /** - * Sets the internal login of the Bot. This should be set before joining - * any servers. - * - * @param login The new login of the Bot. - */ - protected final void setLogin(String login) { - _login = login; - } - - - /** - * Sets the internal version of the Bot. This should be set before joining - * any servers. - * - * @param version The new version of the Bot. - */ - protected final void setVersion(String version) { - _version = version; - } - - - /** - * Sets the interal finger message. This should be set before joining - * any servers. - * - * @param finger The new finger message for the Bot. - */ - protected final void setFinger(String finger) { - _finger = finger; - } - - - /** - * Gets the name of the PircBot. This is the name that will be used as - * as a nick when we try to join servers. - * - * @return The name of the PircBot. - */ - public final String getName() { - return _name; - } - - - /** - * Returns the current nick of the bot. Note that if you have just changed - * your nick, this method will still return the old nick until confirmation - * of the nick change is received from the server. - *

- * The nick returned by this method is maintained only by the PircBot - * class and is guaranteed to be correct in the context of the IRC server. - * - * @since PircBot 1.0.0 - * - * @return The current nick of the bot. - */ - public String getNick() { - return _nick; - } - - - /** - * Gets the internal login of the PircBot. - * - * @return The login of the PircBot. - */ - public final String getLogin() { - return _login; - } - - - /** - * Gets the internal version of the PircBot. - * - * @return The version of the PircBot. - */ - public final String getVersion() { - return _version; - } - - - /** - * Gets the internal finger message of the PircBot. - * - * @return The finger message of the PircBot. - */ - public final String getFinger() { - return _finger; - } - - - /** - * Returns whether or not the PircBot is currently connected to a server. - * The result of this method should only act as a rough guide, - * as the result may not be valid by the time you act upon it. - * - * @return True if and only if the PircBot is currently connected to a server. - */ - public final synchronized boolean isConnected() { - return _inputThread != null && _inputThread.isConnected(); - } - - - /** - * Sets the number of milliseconds to delay between consecutive - * messages when there are multiple messages waiting in the - * outgoing message queue. This has a default value of 1000ms. - * It is a good idea to stick to this default value, as it will - * prevent your bot from spamming servers and facing the subsequent - * wrath! However, if you do need to change this delay value (not - * recommended), then this is the method to use. - * - * @param delay The number of milliseconds between each outgoing message. - * - */ - public final void setMessageDelay(long delay) { - if (delay < 0) { - throw new IllegalArgumentException("Cannot have a negative time."); - } - _messageDelay = delay; - } - - - /** - * Returns the number of milliseconds that will be used to separate - * consecutive messages to the server from the outgoing message queue. - * - * @return Number of milliseconds. - */ - public final long getMessageDelay() { - return _messageDelay; - } - - - /** - * Gets the maximum length of any line that is sent via the IRC protocol. - * The IRC RFC specifies that line lengths, including the trailing \r\n - * must not exceed 512 bytes. Hence, there is currently no option to - * change this value in PircBot. All lines greater than this length - * will be truncated before being sent to the IRC server. - * - * @return The maximum line length (currently fixed at 512) - */ - public final int getMaxLineLength() { - return InputThread.MAX_LINE_LENGTH; - } - - - /** - * Gets the number of lines currently waiting in the outgoing message Queue. - * If this returns 0, then the Queue is empty and any new message is likely - * to be sent to the IRC server immediately. - * - * @since PircBot 0.9.9 - * - * @return The number of lines in the outgoing message Queue. - */ - public final int getOutgoingQueueSize() { - return _outQueue.size(); - } - - - /** - * Returns the name of the last IRC server the PircBot tried to connect to. - * This does not imply that the connection attempt to the server was - * successful (we suggest you look at the onConnect method). - * A value of null is returned if the PircBot has never tried to connect - * to a server. - * - * @return The name of the last machine we tried to connect to. Returns - * null if no connection attempts have ever been made. - */ - public final String getServer() { - return _server; - } - - - /** - * Returns the port number of the last IRC server that the PircBot tried - * to connect to. - * This does not imply that the connection attempt to the server was - * successful (we suggest you look at the onConnect method). - * A value of -1 is returned if the PircBot has never tried to connect - * to a server. - * - * @since PircBot 0.9.9 - * - * @return The port number of the last IRC server we connected to. - * Returns -1 if no connection attempts have ever been made. - */ - public final int getPort() { - return _port; - } - - - /** - * Returns the last password that we used when connecting to an IRC server. - * This does not imply that the connection attempt to the server was - * successful (we suggest you look at the onConnect method). - * A value of null is returned if the PircBot has never tried to connect - * to a server using a password. - * - * @since PircBot 0.9.9 - * - * @return The last password that we used when connecting to an IRC server. - * Returns null if we have not previously connected using a password. - */ - public final String getPassword() { - return _password; - } - - - /** - * A convenient method that accepts an IP address represented as a - * long and returns an integer array of size 4 representing the same - * IP address. - * - * @since PircBot 0.9.4 - * - * @param address the long value representing the IP address. - * - * @return An int[] of size 4. - */ - public int[] longToIp(long address) { - int[] ip = new int[4]; - for (int i = 3; i >= 0; i--) { - ip[i] = (int) (address % 256); - address = address / 256; - } - return ip; - } - - - /** - * A convenient method that accepts an IP address represented by a byte[] - * of size 4 and returns this as a long representation of the same IP - * address. - * - * @since PircBot 0.9.4 - * - * @param address the byte[] of size 4 representing the IP address. - * - * @return a long representation of the IP address. - */ - public long ipToLong(byte[] address) { - if (address.length != 4) { - throw new IllegalArgumentException("byte array must be of length 4"); - } - long ipNum = 0; - long multiplier = 1; - for (int i = 3; i >= 0; i--) { - int byteVal = (address[i] + 256) % 256; - ipNum += byteVal*multiplier; - multiplier *= 256; - } - return ipNum; - } - - - /** - * Sets the encoding charset to be used when sending or receiving lines - * from the IRC server. If set to null, then the platform's default - * charset is used. You should only use this method if you are - * trying to send text to an IRC server in a different charset, e.g. - * "GB2312" for Chinese encoding. If a PircBot is currently connected - * to a server, then it must reconnect before this change takes effect. - * - * @since PircBot 1.0.4 - * - * @param charset The new encoding charset to be used by PircBot. - * - * @throws UnsupportedEncodingException If the named charset is not - * supported. - */ - public void setEncoding(String charset) throws UnsupportedEncodingException { - // Just try to see if the charset is supported first... - "".getBytes(charset); - - _charset = charset; - } - - - /** - * Returns the encoding used to send and receive lines from - * the IRC server, or null if not set. Use the setEncoding - * method to change the encoding charset. - * - * @since PircBot 1.0.4 - * - * @return The encoding used to send outgoing messages, or - * null if not set. - */ - public String getEncoding() { - return _charset; - } - - /** - * Returns the InetAddress used by the PircBot. - * This can be used to find the I.P. address from which the PircBot is - * connected to a server. - * - * @since PircBot 1.4.4 - * - * @return The current local InetAddress, or null if never connected. - */ - public InetAddress getInetAddress() { - return _inetAddress; - } - - - /** - * Sets the InetAddress to be used when sending DCC chat or file transfers. - * This can be very useful when you are running a bot on a machine which - * is behind a firewall and you need to tell receiving clients to connect - * to a NAT/router, which then forwards the connection. - * - * @since PircBot 1.4.4 - * - * @param dccInetAddress The new InetAddress, or null to use the default. - */ - public void setDccInetAddress(InetAddress dccInetAddress) { - _dccInetAddress = dccInetAddress; - } - - - /** - * Returns the InetAddress used when sending DCC chat or file transfers. - * If this is null, the default InetAddress will be used. - * - * @since PircBot 1.4.4 - * - * @return The current DCC InetAddress, or null if left as default. - */ - public InetAddress getDccInetAddress() { - return _dccInetAddress; - } - - - /** - * Returns the set of port numbers to be used when sending a DCC chat - * or file transfer. This is useful when you are behind a firewall and - * need to set up port forwarding. The array of port numbers is traversed - * in sequence until a free port is found to listen on. A DCC tranfer will - * fail if all ports are already in use. - * If set to null, any free port number will be used. - * - * @since PircBot 1.4.4 - * - * @return An array of port numbers that PircBot can use to send DCC - * transfers, or null if any port is allowed. - */ - public int[] getDccPorts() { - if (_dccPorts == null || _dccPorts.length == 0) { - return null; - } - // Clone the array to prevent external modification. - return (int[]) _dccPorts.clone(); - } - - - /** - * Sets the choice of port numbers that can be used when sending a DCC chat - * or file transfer. This is useful when you are behind a firewall and - * need to set up port forwarding. The array of port numbers is traversed - * in sequence until a free port is found to listen on. A DCC tranfer will - * fail if all ports are already in use. - * If set to null, any free port number will be used. - * - * @since PircBot 1.4.4 - * - * @param ports The set of port numbers that PircBot may use for DCC - * transfers, or null to let it use any free port (default). - * - */ - public void setDccPorts(int[] ports) { - if (ports == null || ports.length == 0) { - _dccPorts = null; - } - else { - // Clone the array to prevent external modification. - _dccPorts = (int[]) ports.clone(); - } - } - - - /** - * Returns true if and only if the object being compared is the exact - * same instance as this PircBot. This may be useful if you are writing - * a multiple server IRC bot that uses more than one instance of PircBot. - * - * @since PircBot 0.9.9 - * - * @return true if and only if Object o is a PircBot and equal to this. - */ - public boolean equals(Object o) { - // This probably has the same effect as Object.equals, but that may change... - if (o instanceof PircBot) { - PircBot other = (PircBot) o; - return other == this; - } - return false; - } - - - /** - * Returns the hashCode of this PircBot. This method can be called by hashed - * collection classes and is useful for managing multiple instances of - * PircBots in such collections. - * - * @since PircBot 0.9.9 - * - * @return the hash code for this instance of PircBot. - */ - public int hashCode() { - return super.hashCode(); - } - - - /** - * Returns a String representation of this object. - * You may find this useful for debugging purposes, particularly - * if you are using more than one PircBot instance to achieve - * multiple server connectivity. The format of - * this String may change between different versions of PircBot - * but is currently something of the form - * - * Version{PircBot x.y.z Java IRC Bot - www.jibble.org} - * Connected{true} - * Server{irc.dal.net} - * Port{6667} - * Password{} - * - * - * @since PircBot 0.9.10 - * - * @return a String representation of this object. - */ - public String toString() { - return "Version{" + _version + "}" + - " Connected{" + isConnected() + "}" + - " Server{" + _server + "}" + - " Port{" + _port + "}" + - " Password{" + _password + "}"; - } - - - /** - * Returns an array of all users in the specified channel. - *

- * There are some important things to note about this method:- - *

    - *
  • This method may not return a full list of users if you call it - * before the complete nick list has arrived from the IRC server. - *
  • - *
  • If you wish to find out which users are in a channel as soon - * as you join it, then you should override the onUserList method - * instead of calling this method, as the onUserList method is only - * called as soon as the full user list has been received. - *
  • - *
  • This method will return immediately, as it does not require any - * interaction with the IRC server. - *
  • - *
  • The bot must be in a channel to be able to know which users are - * in it. - *
  • - *
- * - * @since PircBot 1.0.0 - * - * @param channel The name of the channel to list. - * - * @return An array of User objects. This array is empty if we are not - * in the channel. - * - * @see #onUserList(String,User[]) onUserList - */ - public final User[] getUsers(String channel) { - channel = channel.toLowerCase(Locale.ENGLISH); - User[] userArray = new User[0]; - synchronized (_channels) { - Hashtable users = (Hashtable) _channels.get(channel); - if (users != null) { - userArray = new User[users.size()]; - Enumeration enumeration = users.elements(); - for (int i = 0; i < userArray.length; i++) { - User user = (User) enumeration.nextElement(); - userArray[i] = user; - } - } - } - return userArray; - } - - - /** - * Returns an array of all channels that we are in. Note that if you - * call this method immediately after joining a new channel, the new - * channel may not appear in this array as it is not possible to tell - * if the join was successful until a response is received from the - * IRC server. - * - * @since PircBot 1.0.0 - * - * @return A String array containing the names of all channels that we - * are in. - */ - public final String[] getChannels() { - String[] channels = new String[0]; - synchronized (_channels) { - channels = new String[_channels.size()]; - Enumeration enumeration = _channels.keys(); - for (int i = 0; i < channels.length; i++) { - channels[i] = (String) enumeration.nextElement(); - } - } - return channels; - } - - - /** - * Disposes of all thread resources used by this PircBot. This may be - * useful when writing bots or clients that use multiple servers (and - * therefore multiple PircBot instances) or when integrating a PircBot - * with an existing program. - *

- * Each PircBot runs its own threads for dispatching messages from its - * outgoing message queue and receiving messages from the server. - * Calling dispose() ensures that these threads are - * stopped, thus freeing up system resources and allowing the PircBot - * object to be garbage collected if there are no other references to - * it. - *

- * Once a PircBot object has been disposed, it should not be used again. - * Attempting to use a PircBot that has been disposed may result in - * unpredictable behaviour. - * - * @since 1.2.2 - */ - public synchronized void dispose() { - //System.out.println("disposing..."); - _outputThread.interrupt(); - _inputThread.dispose(); - } - - - /** - * Add a user to the specified channel in our memory. - * Overwrite the existing entry if it exists. - */ - private final void addUser(String channel, User user) { - channel = channel.toLowerCase(Locale.ENGLISH); - synchronized (_channels) { - Hashtable users = (Hashtable) _channels.get(channel); - if (users == null) { - users = new Hashtable(); - _channels.put(channel, users); - } - users.put(user, user); - } - } - - - /** - * Remove a user from the specified channel in our memory. - */ - private final User removeUser(String channel, String nick) { - channel = channel.toLowerCase(Locale.ENGLISH); - User user = new User("", nick); - synchronized (_channels) { - Hashtable users = (Hashtable) _channels.get(channel); - if (users != null) { - return (User) users.remove(user); - } - } - return null; - } - - - /** - * Remove a user from all channels in our memory. - */ - private final void removeUser(String nick) { - synchronized (_channels) { - Enumeration enumeration = _channels.keys(); - while (enumeration.hasMoreElements()) { - String channel = (String) enumeration.nextElement(); - this.removeUser(channel, nick); - } - } - } - - - /** - * Rename a user if they appear in any of the channels we know about. - */ - private final void renameUser(String oldNick, String newNick) { - synchronized (_channels) { - Enumeration enumeration = _channels.keys(); - while (enumeration.hasMoreElements()) { - String channel = (String) enumeration.nextElement(); - User user = this.removeUser(channel, oldNick); - if (user != null) { - user = new User(user.getPrefix(), newNick); - this.addUser(channel, user); - } - } - } - } - - - /** - * Removes an entire channel from our memory of users. - */ - private final void removeChannel(String channel) { - channel = channel.toLowerCase(Locale.ENGLISH); - synchronized (_channels) { - _channels.remove(channel); - } - } - - - /** - * Removes all channels from our memory of users. - */ - private final void removeAllChannels() { - synchronized(_channels) { - _channels = new Hashtable(); - } - } - - - private final void updateUser(String channel, int userMode, String nick) { - channel = channel.toLowerCase(Locale.ENGLISH); - synchronized (_channels) { - Hashtable users = (Hashtable) _channels.get(channel); - User newUser = null; - if (users != null) { - Enumeration enumeration = users.elements(); - while(enumeration.hasMoreElements()) { - User userObj = (User) enumeration.nextElement(); - if (userObj.getNick().equalsIgnoreCase(nick)) { - if (userMode == OP_ADD) { - if (userObj.hasVoice()) { - newUser = new User("@+", nick); - } - else { - newUser = new User("@", nick); - } - } - else if (userMode == OP_REMOVE) { - if(userObj.hasVoice()) { - newUser = new User("+", nick); - } - else { - newUser = new User("", nick); - } - } - else if (userMode == VOICE_ADD) { - if(userObj.isOp()) { - newUser = new User("@+", nick); - } - else { - newUser = new User("+", nick); - } - } - else if (userMode == VOICE_REMOVE) { - if(userObj.isOp()) { - newUser = new User("@", nick); - } - else { - newUser = new User("", nick); - } - } - } - } - } - if (newUser != null) { - users.put(newUser, newUser); - } - else { - // just in case ... - newUser = new User("", nick); - users.put(newUser, newUser); - } - } - } - - - // Connection stuff. - private InputThread _inputThread = null; - private OutputThread _outputThread = null; - private String _charset = null; - private InetAddress _inetAddress = null; - - // Details about the last server that we connected to. - private String _server = null; - private int _port = -1; - private String _password = null; - - // Outgoing message stuff. - private Queue _outQueue = new Queue(); - private long _messageDelay = 1000; - - // A Hashtable of channels that points to a selfreferential Hashtable of - // User objects (used to remember which users are in which channels). - private Hashtable _channels = new Hashtable(); - - // A Hashtable to temporarily store channel topics when we join them - // until we find out who set that topic. - private Hashtable _topics = new Hashtable(); - - private int[] _dccPorts = null; - private InetAddress _dccInetAddress = null; - - // Default settings for the PircBot. - private boolean _autoNickChange = false; - private boolean _verbose = false; - private String _name = "PircBot"; - private String _nick = _name; - private String _login = "PircBot"; - private String _version = "PircBot " + VERSION + " Java IRC Bot - www.jibble.org"; - private String _finger = "You ought to be arrested for fingering a bot!"; - - private String _channelPrefixes = "#&+!"; -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/Queue.java b/EssentialsUpdate/src/org/jibble/pircbot/Queue.java deleted file mode 100755 index fd8d477816..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/Queue.java +++ /dev/null @@ -1,146 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - - -package org.jibble.pircbot; - -import java.util.Vector; - -/** - * Queue is a definition of a data structure that may - * act as a queue - that is, data can be added to one end of the - * queue and data can be requested from the head end of the queue. - * This class is thread safe for multiple producers and a single - * consumer. The next() method will block until there is data in - * the queue. - * - * This has now been modified so that it is compatible with - * the earlier JDK1.1 in order to be suitable for running on - * mobile appliances. This means replacing the LinkedList with - * a Vector, which is hardly ideal, but this Queue is typically - * only polled every second before dispatching messages. - * - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public class Queue { - - - /** - * Constructs a Queue object of unlimited size. - */ - public Queue() { - - } - - - /** - * Adds an Object to the end of the Queue. - * - * @param o The Object to be added to the Queue. - */ - public void add(Object o) { - synchronized(_queue) { - _queue.addElement(o); - _queue.notify(); - } - } - - - /** - * Adds an Object to the front of the Queue. - * - * @param o The Object to be added to the Queue. - */ - public void addFront(Object o) { - synchronized(_queue) { - _queue.insertElementAt(o, 0); - _queue.notify(); - } - } - - - /** - * Returns the Object at the front of the Queue. This - * Object is then removed from the Queue. If the Queue - * is empty, then this method shall block until there - * is an Object in the Queue to return. - * - * @return The next item from the front of the queue. - */ - public Object next() { - - Object o = null; - - // Block if the Queue is empty. - synchronized(_queue) { - if (_queue.size() == 0) { - try { - _queue.wait(); - } - catch (InterruptedException e) { - return null; - } - } - - // Return the Object. - try { - o = _queue.firstElement(); - _queue.removeElementAt(0); - } - catch (ArrayIndexOutOfBoundsException e) { - throw new InternalError("Race hazard in Queue object."); - } - } - - return o; - } - - - /** - * Returns true if the Queue is not empty. If another - * Thread empties the Queue before next() is - * called, then the call to next() shall block - * until the Queue has been populated again. - * - * @return True only if the Queue not empty. - */ - public boolean hasNext() { - return (this.size() != 0); - } - - - /** - * Clears the contents of the Queue. - */ - public void clear() { - synchronized(_queue) { - _queue.removeAllElements(); - } - } - - - /** - * Returns the size of the Queue. - * - * @return The current size of the queue. - */ - public int size() { - return _queue.size(); - } - - - private Vector _queue = new Vector(); - -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/ReplyConstants.java b/EssentialsUpdate/src/org/jibble/pircbot/ReplyConstants.java deleted file mode 100755 index 2d8e696d5b..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/ReplyConstants.java +++ /dev/null @@ -1,176 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - - -package org.jibble.pircbot; - -/** - * This interface contains the values of all numeric replies specified - * in section 6 of RFC 1459. Refer to RFC 1459 for further information. - *

- * If you override the onServerResponse method in the PircBot class, - * you may find these constants useful when comparing the numeric - * value of a given code. - * - * @since 1.0.0 - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public interface ReplyConstants { - - - // Error Replies. - public static final int ERR_NOSUCHNICK = 401; - public static final int ERR_NOSUCHSERVER = 402; - public static final int ERR_NOSUCHCHANNEL = 403; - public static final int ERR_CANNOTSENDTOCHAN = 404; - public static final int ERR_TOOMANYCHANNELS = 405; - public static final int ERR_WASNOSUCHNICK = 406; - public static final int ERR_TOOMANYTARGETS = 407; - public static final int ERR_NOORIGIN = 409; - public static final int ERR_NORECIPIENT = 411; - public static final int ERR_NOTEXTTOSEND = 412; - public static final int ERR_NOTOPLEVEL = 413; - public static final int ERR_WILDTOPLEVEL = 414; - public static final int ERR_UNKNOWNCOMMAND = 421; - public static final int ERR_NOMOTD = 422; - public static final int ERR_NOADMININFO = 423; - public static final int ERR_FILEERROR = 424; - public static final int ERR_NONICKNAMEGIVEN = 431; - public static final int ERR_ERRONEUSNICKNAME = 432; - public static final int ERR_NICKNAMEINUSE = 433; - public static final int ERR_NICKCOLLISION = 436; - public static final int ERR_USERNOTINCHANNEL = 441; - public static final int ERR_NOTONCHANNEL = 442; - public static final int ERR_USERONCHANNEL = 443; - public static final int ERR_NOLOGIN = 444; - public static final int ERR_SUMMONDISABLED = 445; - public static final int ERR_USERSDISABLED = 446; - public static final int ERR_NOTREGISTERED = 451; - public static final int ERR_NEEDMOREPARAMS = 461; - public static final int ERR_ALREADYREGISTRED = 462; - public static final int ERR_NOPERMFORHOST = 463; - public static final int ERR_PASSWDMISMATCH = 464; - public static final int ERR_YOUREBANNEDCREEP = 465; - public static final int ERR_KEYSET = 467; - public static final int ERR_CHANNELISFULL = 471; - public static final int ERR_UNKNOWNMODE = 472; - public static final int ERR_INVITEONLYCHAN = 473; - public static final int ERR_BANNEDFROMCHAN = 474; - public static final int ERR_BADCHANNELKEY = 475; - public static final int ERR_NOPRIVILEGES = 481; - public static final int ERR_CHANOPRIVSNEEDED = 482; - public static final int ERR_CANTKILLSERVER = 483; - public static final int ERR_NOOPERHOST = 491; - public static final int ERR_UMODEUNKNOWNFLAG = 501; - public static final int ERR_USERSDONTMATCH = 502; - - - // Command Responses. - public static final int RPL_TRACELINK = 200; - public static final int RPL_TRACECONNECTING = 201; - public static final int RPL_TRACEHANDSHAKE = 202; - public static final int RPL_TRACEUNKNOWN = 203; - public static final int RPL_TRACEOPERATOR = 204; - public static final int RPL_TRACEUSER = 205; - public static final int RPL_TRACESERVER = 206; - public static final int RPL_TRACENEWTYPE = 208; - public static final int RPL_STATSLINKINFO = 211; - public static final int RPL_STATSCOMMANDS = 212; - public static final int RPL_STATSCLINE = 213; - public static final int RPL_STATSNLINE = 214; - public static final int RPL_STATSILINE = 215; - public static final int RPL_STATSKLINE = 216; - public static final int RPL_STATSYLINE = 218; - public static final int RPL_ENDOFSTATS = 219; - public static final int RPL_UMODEIS = 221; - public static final int RPL_STATSLLINE = 241; - public static final int RPL_STATSUPTIME = 242; - public static final int RPL_STATSOLINE = 243; - public static final int RPL_STATSHLINE = 244; - public static final int RPL_LUSERCLIENT = 251; - public static final int RPL_LUSEROP = 252; - public static final int RPL_LUSERUNKNOWN = 253; - public static final int RPL_LUSERCHANNELS = 254; - public static final int RPL_LUSERME = 255; - public static final int RPL_ADMINME = 256; - public static final int RPL_ADMINLOC1 = 257; - public static final int RPL_ADMINLOC2 = 258; - public static final int RPL_ADMINEMAIL = 259; - public static final int RPL_TRACELOG = 261; - public static final int RPL_NONE = 300; - public static final int RPL_AWAY = 301; - public static final int RPL_USERHOST = 302; - public static final int RPL_ISON = 303; - public static final int RPL_UNAWAY = 305; - public static final int RPL_NOWAWAY = 306; - public static final int RPL_WHOISUSER = 311; - public static final int RPL_WHOISSERVER = 312; - public static final int RPL_WHOISOPERATOR = 313; - public static final int RPL_WHOWASUSER = 314; - public static final int RPL_ENDOFWHO = 315; - public static final int RPL_WHOISIDLE = 317; - public static final int RPL_ENDOFWHOIS = 318; - public static final int RPL_WHOISCHANNELS = 319; - public static final int RPL_LISTSTART = 321; - public static final int RPL_LIST = 322; - public static final int RPL_LISTEND = 323; - public static final int RPL_CHANNELMODEIS = 324; - public static final int RPL_NOTOPIC = 331; - public static final int RPL_TOPIC = 332; - public static final int RPL_TOPICINFO = 333; - public static final int RPL_INVITING = 341; - public static final int RPL_SUMMONING = 342; - public static final int RPL_VERSION = 351; - public static final int RPL_WHOREPLY = 352; - public static final int RPL_NAMREPLY = 353; - public static final int RPL_LINKS = 364; - public static final int RPL_ENDOFLINKS = 365; - public static final int RPL_ENDOFNAMES = 366; - public static final int RPL_BANLIST = 367; - public static final int RPL_ENDOFBANLIST = 368; - public static final int RPL_ENDOFWHOWAS = 369; - public static final int RPL_INFO = 371; - public static final int RPL_MOTD = 372; - public static final int RPL_ENDOFINFO = 374; - public static final int RPL_MOTDSTART = 375; - public static final int RPL_ENDOFMOTD = 376; - public static final int RPL_YOUREOPER = 381; - public static final int RPL_REHASHING = 382; - public static final int RPL_TIME = 391; - public static final int RPL_USERSSTART = 392; - public static final int RPL_USERS = 393; - public static final int RPL_ENDOFUSERS = 394; - public static final int RPL_NOUSERS = 395; - - - // Reserved Numerics. - public static final int RPL_TRACECLASS = 209; - public static final int RPL_STATSQLINE = 217; - public static final int RPL_SERVICEINFO = 231; - public static final int RPL_ENDOFSERVICES = 232; - public static final int RPL_SERVICE = 233; - public static final int RPL_SERVLIST = 234; - public static final int RPL_SERVLISTEND = 235; - public static final int RPL_WHOISCHANOP = 316; - public static final int RPL_KILLDONE = 361; - public static final int RPL_CLOSING = 362; - public static final int RPL_CLOSEEND = 363; - public static final int RPL_INFOSTART = 373; - public static final int RPL_MYPORTIS = 384; - public static final int ERR_YOUWILLBEBANNED = 466; - public static final int ERR_BADCHANMASK = 476; - public static final int ERR_NOSERVICEHOST = 492; - -} diff --git a/EssentialsUpdate/src/org/jibble/pircbot/User.java b/EssentialsUpdate/src/org/jibble/pircbot/User.java deleted file mode 100755 index 37f981b197..0000000000 --- a/EssentialsUpdate/src/org/jibble/pircbot/User.java +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ - -This file is part of PircBot. - -This software is dual-licensed, allowing you to choose between the GNU -General Public License (GPL) and the www.jibble.org Commercial License. -Since the GPL may be too restrictive for use in a proprietary application, -a commercial license is also provided. Full license information can be -found at http://www.jibble.org/licenses/ - -*/ - -package org.jibble.pircbot; - -import java.util.Locale; - -/** - * This class is used to represent a user on an IRC server. - * Instances of this class are returned by the getUsers method - * in the PircBot class. - *

- * Note that this class no longer implements the Comparable interface - * for Java 1.1 compatibility reasons. - * - * @since 1.0.0 - * @author Paul James Mutton, - * http://www.jibble.org/ - * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) - */ -public class User { - - - /** - * Constructs a User object with a known prefix and nick. - * - * @param prefix The status of the user, for example, "@". - * @param nick The nick of the user. - */ - User(String prefix, String nick) { - _prefix = prefix; - _nick = nick; - _lowerNick = nick.toLowerCase(Locale.ENGLISH); - } - - - /** - * Returns the prefix of the user. If the User object has been obtained - * from a list of users in a channel, then this will reflect the user's - * status in that channel. - * - * @return The prefix of the user. If there is no prefix, then an empty - * String is returned. - */ - public String getPrefix() { - return _prefix; - } - - - /** - * Returns whether or not the user represented by this object is an - * operator. If the User object has been obtained from a list of users - * in a channel, then this will reflect the user's operator status in - * that channel. - * - * @return true if the user is an operator in the channel. - */ - public boolean isOp() { - return _prefix.indexOf('@') >= 0; - } - - - /** - * Returns whether or not the user represented by this object has - * voice. If the User object has been obtained from a list of users - * in a channel, then this will reflect the user's voice status in - * that channel. - * - * @return true if the user has voice in the channel. - */ - public boolean hasVoice() { - return _prefix.indexOf('+') >= 0; - } - - - /** - * Returns the nick of the user. - * - * @return The user's nick. - */ - public String getNick() { - return _nick; - } - - - /** - * Returns the nick of the user complete with their prefix if they - * have one, e.g. "@Dave". - * - * @return The user's prefix and nick. - */ - public String toString() { - return this.getPrefix() + this.getNick(); - } - - - /** - * Returns true if the nick represented by this User object is the same - * as the argument. A case insensitive comparison is made. - * - * @return true if the nicks are identical (case insensitive). - */ - public boolean equals(String nick) { - return nick.toLowerCase(Locale.ENGLISH).equals(_lowerNick); - } - - - /** - * Returns true if the nick represented by this User object is the same - * as the nick of the User object given as an argument. - * A case insensitive comparison is made. - * - * @return true if o is a User object with a matching lowercase nick. - */ - public boolean equals(Object o) { - if (o instanceof User) { - User other = (User) o; - return other._lowerNick.equals(_lowerNick); - } - return false; - } - - - /** - * Returns the hash code of this User object. - * - * @return the hash code of the User object. - */ - public int hashCode() { - return _lowerNick.hashCode(); - } - - - /** - * Returns the result of calling the compareTo method on lowercased - * nicks. This is useful for sorting lists of User objects. - * - * @return the result of calling compareTo on lowercased nicks. - */ - public int compareTo(Object o) { - if (o instanceof User) { - User other = (User) o; - return other._lowerNick.compareTo(_lowerNick); - } - return -1; - } - - - private String _prefix; - private String _nick; - private String _lowerNick; - -} diff --git a/EssentialsUpdate/src/plugin.yml b/EssentialsUpdate/src/plugin.yml deleted file mode 100644 index b8dbe8e25a..0000000000 --- a/EssentialsUpdate/src/plugin.yml +++ /dev/null @@ -1,21 +0,0 @@ -# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.) -name: EssentialsUpdate -main: com.earth2me.essentials.update.EssentialsUpdate -# Note to developers: This next line cannot change, or the automatic versioning system will break. -version: TeamCity -description: This plugin allows to install or update all Essentials plugins -authors: [snowleo] -commands: - essentialsupdate: - description: Install or update the Essentials plugins. - usage: / - essentialshelp: - description: Get help from the Essentials support chat. - usage: / -permissions: - essentials.update: - description: Allows you to update Essentials - default: op - essentials.helpchat: - description: Allows you to join Essentials help chat - default: op \ No newline at end of file diff --git a/EssentialsUpdate/test/com/earth2me/essentials/update/UploadTest.java b/EssentialsUpdate/test/com/earth2me/essentials/update/UploadTest.java deleted file mode 100644 index a51f03bd71..0000000000 --- a/EssentialsUpdate/test/com/earth2me/essentials/update/UploadTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.earth2me.essentials.update; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; -import junit.framework.TestCase; -import org.junit.Test; - - -public class UploadTest extends TestCase -{ - @Test - public void testPastieUpload() - { - try - { - final PastieUpload pastie = new PastieUpload(); - assertNotNull(pastie); - //final String url = pastie.send("test"); - //System.out.println(url); - } - catch (IOException ex) - { - Logger.getLogger(UploadTest.class.getName()).log(Level.SEVERE, null, ex); - } - } -} diff --git a/EssentialsUpdate/test/com/earth2me/essentials/update/VersionTest.java b/EssentialsUpdate/test/com/earth2me/essentials/update/VersionTest.java deleted file mode 100644 index 024f2248bf..0000000000 --- a/EssentialsUpdate/test/com/earth2me/essentials/update/VersionTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.earth2me.essentials.update; - -import com.earth2me.essentials.update.Version.Type; -import java.util.TreeSet; -import junit.framework.TestCase; -import org.junit.Test; - - -public class VersionTest extends TestCase -{ - @Test - public void testStable() - { - final Version instance = new Version("1.2.3"); - assertEquals("Testing Major", 1, instance.getMajor()); - assertEquals("Testing Minor", 2, instance.getMinor()); - assertEquals("Testing Build", 3, instance.getBuild()); - assertEquals("Testing Type", Type.STABLE, instance.getType()); - } - - @Test - public void testDev() - { - final Version instance = new Version("Dev2.3.4"); - assertEquals("Testing Major", 2, instance.getMajor()); - assertEquals("Testing Minor", 3, instance.getMinor()); - assertEquals("Testing Build", 4, instance.getBuild()); - assertEquals("Testing Type", Type.DEVELOPER, instance.getType()); - } - - @Test - public void testTeamCity() - { - final Version instance = new Version("Teamcity"); - assertEquals("Testing Type", Type.DEVELOPER, instance.getType()); - } - - @Test - public void testPre() - { - final Version instance = new Version("Pre5.7.400.2"); - assertEquals("Testing Major", 5, instance.getMajor()); - assertEquals("Testing Minor", 7, instance.getMinor()); - assertEquals("Testing Build", 400, instance.getBuild()); - assertEquals("Testing Type", Type.PREVIEW, instance.getType()); - } - - @Test - public void testCompareTo() - { - final Version verA = new Version("1.1.1"); - final Version verB = new Version("Dev1.1.2"); - final Version verC = new Version("1.1.2"); - final Version verD = new Version("1.2.0"); - final Version verE = new Version("2.0.0"); - final Version verF = new Version("Pre1.1.1.1"); - final Version verG = new Version("Dev1.2.2"); - assertTrue("Testing dev", verA.compareTo(verB) < 0); - assertTrue("Testing dev", verB.compareTo(verA) > 0); - assertTrue("Testing build", verA.compareTo(verC) < 0); - assertTrue("Testing build", verC.compareTo(verA) > 0); - assertTrue("Testing minor", verA.compareTo(verD) < 0); - assertTrue("Testing minor", verD.compareTo(verA) > 0); - assertTrue("Testing major", verA.compareTo(verE) < 0); - assertTrue("Testing major", verE.compareTo(verA) > 0); - assertTrue("Testing pre", verF.compareTo(verA) < 0); - assertTrue("Testing pre", verA.compareTo(verF) > 0); - assertTrue("Testing dev vs dev", verB.compareTo(verG) < 0); - assertTrue("Testing dev vs dev", verG.compareTo(verB) > 0); - final TreeSet set = new TreeSet(); - set.add(verA); - set.add(verB); - set.add(verC); - set.add(verD); - set.add(verE); - set.add(verF); - set.add(verG); - assertEquals("Testing sorting", verF, set.pollFirst()); - assertEquals("Testing sorting", verA, set.pollFirst()); - assertEquals("Testing sorting", verC, set.pollFirst()); - assertEquals("Testing sorting", verD, set.pollFirst()); - assertEquals("Testing sorting", verE, set.pollFirst()); - assertEquals("Testing sorting", verB, set.pollFirst()); - assertEquals("Testing sorting", verG, set.pollFirst()); - } -} diff --git a/EssentialsXMPP/nbproject/build-impl.xml b/EssentialsXMPP/nbproject/build-impl.xml index 3293bd7098..7e2958bc2b 100644 --- a/EssentialsXMPP/nbproject/build-impl.xml +++ b/EssentialsXMPP/nbproject/build-impl.xml @@ -12,9 +12,9 @@ is divided into following sections: - execution - debugging - javadoc - - junit compilation - - junit execution - - junit debugging + - test compilation + - test execution + - test debugging - applet - cleanup @@ -181,6 +181,7 @@ is divided into following sections: + @@ -225,6 +226,27 @@ is divided into following sections: + + + + + + + + + + + + + + + + + + + + + @@ -357,11 +379,52 @@ is divided into following sections: - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -370,32 +433,270 @@ is divided into following sections: - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -427,10 +728,13 @@ is divided into following sections: - + Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + @@ -488,6 +792,7 @@ is divided into following sections: + @@ -504,6 +809,7 @@ is divided into following sections: + @@ -511,6 +817,7 @@ is divided into following sections: + @@ -537,6 +844,9 @@ is divided into following sections: + + + @@ -582,7 +892,7 @@ is divided into following sections: - + - + + + This target only works when run from inside the NetBeans IDE. @@ -813,8 +1127,9 @@ is divided into following sections: - + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. @@ -822,12 +1137,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -839,12 +1150,8 @@ is divided into following sections: - - + + This target only works when run from inside the NetBeans IDE. @@ -866,6 +1173,42 @@ is divided into following sections: + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + @@ -952,14 +1295,14 @@ is divided into following sections: - + Some tests failed; see details above. @@ -972,39 +1315,40 @@ is divided into following sections: Must select some files in the IDE or set test.includes - + Some tests failed; see details above. + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + - + Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + @@ -1076,9 +1420,12 @@ is divided into following sections: - - - + + + + + + diff --git a/EssentialsXMPP/nbproject/genfiles.properties b/EssentialsXMPP/nbproject/genfiles.properties index ae2a6f9620..744ffaed21 100644 --- a/EssentialsXMPP/nbproject/genfiles.properties +++ b/EssentialsXMPP/nbproject/genfiles.properties @@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=28e38971@1.42.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=1012a5dd -nbproject/build-impl.xml.script.CRC32=8cccbe45 -nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46 +nbproject/build-impl.xml.script.CRC32=db083724 +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/EssentialsXMPP/nbproject/project.properties b/EssentialsXMPP/nbproject/project.properties index 66d780451c..ace5022d0d 100644 --- a/EssentialsXMPP/nbproject/project.properties +++ b/EssentialsXMPP/nbproject/project.properties @@ -1,5 +1,6 @@ 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=EssentialsXMPP @@ -64,14 +65,14 @@ dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= file.reference.bukkit.jar=../lib/bukkit.jar -file.reference.smack-3.2.1.jar=../lib/smack-3.2.1.jar +file.reference.smack-3.2.2.jar=../lib/smack-3.2.2.jar includes=** jar.archive.disabled=${jnlp.enabled} jar.compress=true jar.index=${jnlp.enabled} javac.classpath=\ ${reference.Essentials.jar}:\ - ${file.reference.smack-3.2.1.jar}:\ + ${file.reference.smack-3.2.2.jar}:\ ${file.reference.bukkit.jar} # Space-separated list of extra javac options javac.compilerargs=-Xlint:unchecked diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java index 1fa5a243ca..c0913e6a93 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java @@ -2,10 +2,12 @@ import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; +import java.util.List; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -20,21 +22,21 @@ class EssentialsXMPPPlayerListener implements Listener this.ess = ess; } - @EventHandler(priority= EventPriority.MONITOR) + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(final PlayerJoinEvent event) { final User user = ess.getUser(event.getPlayer()); sendMessageToSpyUsers("Player " + user.getDisplayName() + " joined the game"); } - @EventHandler(priority= EventPriority.MONITOR) - public void onPlayerChat(final PlayerChatEvent event) + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerChat(final AsyncPlayerChatEvent event) { final User user = ess.getUser(event.getPlayer()); sendMessageToSpyUsers(String.format(event.getFormat(), user.getDisplayName(), event.getMessage())); } - @EventHandler(priority= EventPriority.MONITOR) + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerQuit(final PlayerQuitEvent event) { final User user = ess.getUser(event.getPlayer()); @@ -45,9 +47,22 @@ private void sendMessageToSpyUsers(final String message) { try { - for (String address : EssentialsXMPP.getInstance().getSpyUsers()) + List users = EssentialsXMPP.getInstance().getSpyUsers(); + synchronized (users) { - EssentialsXMPP.getInstance().sendMessage(address, message); + for (final String address : users) + { + Bukkit.getScheduler().scheduleSyncDelayedTask(ess, new Runnable() + { + @Override + public void run() + { + EssentialsXMPP.getInstance().sendMessage(address, message); + } + + }); + + } } } catch (Exception ex) diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/UserManager.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/UserManager.java index a35312129a..6439c9b9da 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/UserManager.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/UserManager.java @@ -9,7 +9,7 @@ public class UserManager implements IConf { private final transient EssentialsConf users; - private final transient List spyusers = new ArrayList(); + private final transient List spyusers = Collections.synchronizedList(new ArrayList()); private final static String ADDRESS = "address"; private final static String SPY = "spy"; diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java index 164f40c2ac..ffe651d5bd 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java @@ -11,9 +11,10 @@ import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; import org.bukkit.entity.Player; -import org.jivesoftware.smack.Roster.SubscriptionMode; import org.jivesoftware.smack.*; +import org.jivesoftware.smack.Roster.SubscriptionMode; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.util.StringUtils; @@ -22,6 +23,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManagerListener, IConf { private static final Logger LOGGER = Logger.getLogger("Minecraft"); + private static final SimpleFormatter formatter = new SimpleFormatter(); private final transient EssentialsConf config; private transient XMPPConnection connection; private transient ChatManager chatManager; @@ -117,6 +119,7 @@ private boolean connect() connConf.setSASLAuthenticationEnabled(config.getBoolean("xmpp.sasl-enabled", false)); connConf.setSendPresence(true); connConf.setReconnectionAllowed(true); + connConf.setDebuggerEnabled(config.getBoolean("debug", false)); connection = new XMPPConnection(connConf); try { @@ -262,8 +265,8 @@ public void run() XMPPManager.this.startChat(user); for (LogRecord logRecord : copy) { - final String message = String.format("[" + logRecord.getLevel().getLocalizedName() + "] " + logRecord.getMessage(), logRecord.getParameters()); - if (!XMPPManager.this.sendMessage(user, message)) + final String message = formatter.format(logRecord); + if (!XMPPManager.this.sendMessage(user, Util.stripLogColorFormat(message))) { failedUsers.add(user); break; diff --git a/EssentialsXMPP/src/config.yml b/EssentialsXMPP/src/config.yml index 82e2887aa6..64b9a539fd 100644 --- a/EssentialsXMPP/src/config.yml +++ b/EssentialsXMPP/src/config.yml @@ -6,6 +6,8 @@ xmpp: # port: 5222 # sasl-enabled: false +debug: false + op-users: # - 'name@example.com' diff --git a/README.markdown b/README.markdown index 1913e1ba1a..89be0a7b48 100644 --- a/README.markdown +++ b/README.markdown @@ -11,6 +11,21 @@ Recommended NetBeans plugins: * Git * PMD & FindBugs ( http://kenai.com/projects/sqe/pages/Home ) +Commit Guidelines +----------------- + +Commits should fall into one of 3 areas: + +[Feature] Commits which are features should start with '[Feature]' and followed by a quick summary on the top line, followed by some extra details in the commit body. + +[Fix] Commits which fix bugs, or minor improvements to existing features should start with '[Fix]' and followed by a quick summary on the top line, followed by some extra details in the commit body. + +Commits which fix bugs caused by previous commits (since last release), or otherwise make no functionality changes, should have no prefix. These will not be added to the project change log. + +Coding Guidelines +----------------- + + Please follow the format guidelines that are saved in the project properties. Windows users, please read this: http://help.github.com/line-endings/ @@ -20,4 +35,4 @@ To build all jars, select the BuildAll project and build that. You'll find all j If you create pull requests, always make them for the master branch. -The essentials bug tracker can be found at http://www.assembla.com/spaces/essentials/tickets \ No newline at end of file +The essentials bug tracker can be found at http://www.assembla.com/spaces/essentials/tickets diff --git a/build.xml b/build.xml index c69c0f075b..5cddcb4440 100644 --- a/build.xml +++ b/build.xml @@ -8,7 +8,6 @@ - @@ -16,6 +15,7 @@ + diff --git a/examples/bpermissions.yml b/examples/bpermissions.yml index 6b7900c4fd..a6ca8d8d01 100644 --- a/examples/bpermissions.yml +++ b/examples/bpermissions.yml @@ -1,13 +1,17 @@ default: Default groups: - Default: + Default: + permissions: - essentials.spawn - essentials.rules - essentials.motd - essentials.list - essentials.helpop - essentials.help - Builder: + groups: [] + meta: [] + Builder: + permissions: - essentials.build - essentials.afk - essentials.back @@ -23,7 +27,7 @@ groups: - essentials.home - essentials.ignore - essentials.kit - - essentials.kit.tools + - essentials.kits.tools - essentials.mail - essentials.mail.send - essentials.me @@ -52,8 +56,12 @@ groups: - essentials.warp - essentials.warp.list - essentials.worth - Moderator: - - essentials.build + groups: + - Default + meta: + priority: '20' + Moderator: + permissions: - essentials.ban - essentials.ban.notify - essentials.banip @@ -70,6 +78,7 @@ groups: - essentials.jump - essentials.kick - essentials.kick.notify + - essentials.kits.* - essentials.kill - essentials.mute - essentials.nick.others @@ -94,10 +103,17 @@ groups: - essentials.tptoggle - essentials.unban - essentials.unbanip + - essentials.warps.* - essentials.weather - essentials.whois - essentials.world - Admin: + - essentials.worlds.* + groups: + - Builder + meta: + priority: '40' + Admin: + permissions: # Since we use essentials.* permission here, we can still disable commands like this # This can be done with any pemission nodes - ^essentials.backup @@ -105,15 +121,14 @@ groups: - ^essentials.setspawn - ^essentials.reloadall - essentials.* - Owner: + groups: + - Moderator + meta: + priority: '80' + Owner: + permissions: - essentials.* -players: - notch: - - Default - snowleo: + groups: - Admin - - Moderator - - Builder - - Default - KHobbits: - - Owner + meta: + priority: '100' diff --git a/examples/permissionsbukkit.yml b/examples/permissionsbukkit.yml index 515256ef1a..490be0398e 100644 --- a/examples/permissionsbukkit.yml +++ b/examples/permissionsbukkit.yml @@ -29,7 +29,7 @@ groups: essentials.home: true essentials.ignore: true essentials.kit: true - essentials.kit.tools: true + essentials.kits.tools: true essentials.mail: true essentials.mail.send: true essentials.me: true @@ -105,6 +105,7 @@ groups: essentials.weather: true essentials.whois: true essentials.world: true + essentials.worlds.*: true inheritance: - Builder Admin: diff --git a/examples/permissionsex.yml b/examples/permissionsex.yml index 3dc6354fbe..8c5eabd2aa 100644 --- a/examples/permissionsex.yml +++ b/examples/permissionsex.yml @@ -29,7 +29,7 @@ groups: - essentials.home - essentials.ignore - essentials.kit - - essentials.kit.tools + - essentials.kits.tools - essentials.mail - essentials.mail.send - essentials.me @@ -109,6 +109,7 @@ groups: - essentials.weather - essentials.whois - essentials.world + - essentials.worlds.* - permissions.user.promote.default - permissions.user.demote.default - permissions.manage.membership diff --git a/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar b/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar index 01aed63a2a..38246fd270 100644 Binary files a/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar and b/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar differ diff --git a/lib/SimplyPerms.jar b/lib/SimplyPerms.jar new file mode 100644 index 0000000000..c7c5ec64ec Binary files /dev/null and b/lib/SimplyPerms.jar differ diff --git a/lib/bukkit.jar b/lib/bukkit.jar index cc304c6ddd..132be4eeee 100644 Binary files a/lib/bukkit.jar and b/lib/bukkit.jar differ diff --git a/lib/c3p0-0.9.1.2.jar b/lib/c3p0-0.9.1.2.jar deleted file mode 100644 index 0f42d60e31..0000000000 Binary files a/lib/c3p0-0.9.1.2.jar and /dev/null differ diff --git a/lib/craftbukkit.jar b/lib/craftbukkit.jar index 39c783fa36..4fa6effd5c 100644 Binary files a/lib/craftbukkit.jar and b/lib/craftbukkit.jar differ diff --git a/lib/nblibraries.properties b/lib/nblibraries.properties index 0380a6c75f..dfbfc5e2eb 100644 --- a/lib/nblibraries.properties +++ b/lib/nblibraries.properties @@ -1,5 +1,7 @@ libs.CopyLibs.classpath=\ ${base}/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar +libs.CopyLibs.displayName=CopyLibs Task +libs.CopyLibs.prop-version=1.0 libs.junit_4.10.classpath=\ ${base}/junit_4.10/junit-4.10.jar libs.junit_4.10.src=\ diff --git a/lib/smack-3.2.2.jar b/lib/smack-3.2.2.jar new file mode 100644 index 0000000000..f9cb4da95a Binary files /dev/null and b/lib/smack-3.2.2.jar differ