Compare commits

..
108 Commits
Author SHA1 Message Date
md678685 f57557b43a Bump version to 2.16.1 2019-03-01 22:45:25 +00:00
md678685 0711fd6f9e Add #version line to allow automatic items.json updates 2019-03-01 12:04:08 +00:00
md678685 b5ecbd1739 Remove Vault repo
Fixes Travis builds and slow builds - Maven pauses while trying to reach the repo and so Travis assumes that the build has failed.
2019-03-01 11:41:29 +00:00
md678685 dda5e4e333 Merge pull request #2402 from Techno3600/patch-1
Pull Request for #2282
2019-03-01 11:32:46 +00:00
md678685 dde4a36df0 Economy API: Attempt to find users by UUID if username not present (#2432)
Attempt to find user by UUID if username not present. Fixes (maybe) #2400.

https://github.com/EssentialsX/Essentials/issues/2400#issuecomment-466043896
2019-02-22 18:10:36 +00:00
triagonal 31b98fb9f3 allow console to use color codes when sending mail (#2435) @triagonal 2019-02-22 14:34:56 +00:00
kashike 289d34d96c Relocate PaperLib in EssentialsXSpawn too
fixes #2433
2019-02-22 09:58:02 +00:00
md678685 eafd110ed0 Update items.json
Add spawner aliases that end in "spawner".
2019-02-20 14:50:43 +00:00
md678685 e72644abf4 Update items.json
* Add mooshroom spawners
* Add new aliases for red sandstone, sandstone, stone and prismarine variants
2019-02-20 14:42:22 +00:00
md678685 b267103274 Remove getMap(short) method from FakeServer 2019-02-20 12:45:37 +00:00
DoNotSpamPls 3856a690eb Use PaperLib to load chunks and teleport players async (#2409)
* Remove outdated permission plugin handlers, minor test fixes

* Re-add PermissionEX handler

* Use PaperLib to load chunks async whenever possible

* Revert "Use PaperLib to load chunks async whenever possible"

This reverts commit db4df6f3cf.

* Use PaperLib to load chunks and teleport players async

* Resolve some PR issues

* Update PaperLib, return teleport causes

* Remove useless PaperLib usage in LocationUtil

* Fix FakeServer spacing
2019-02-20 12:25:05 +00:00
md678685 f214696664 Check Protect/AntiBuild config materials against Material enum (#2431) 2019-02-20 12:24:30 +00:00
md678685 9e73c29b40 Fix creating and using kits on legacy versions (#2428)
* Attempt to look up legacy items in Material enum
* Use name method when serializing ItemStacks
* Make name uppercase before looking up in Material enum
2019-02-20 12:24:07 +00:00
md678685 aca83bd462 Switch Vault dependency to VaultAPI (#2430)
* Switch Vault dependency to VaultAPI
* Remove direct Vault class usage from VaultEco
2019-02-20 11:28:20 +00:00
md678685 189d6a23c6 Add README section about depending on EssX 2019-02-19 21:58:43 +00:00
md678685 441f88deea Implement missing FakeServer methods 2019-02-17 19:01:47 +00:00
Wiz_Techno 6d6666dace Pull Request for #2282
"Obsolete entries in items.csv should be removed"
2019-01-31 23:14:21 -05:00
Rafał Pokrywka fb779533e6 Replace nbsp with a space when formatting messages (#2394) @ravkr 2019-01-27 12:15:03 +00:00
DoNotSpamPls 7325113a8c Remove outdated permission plugin handlers, minor test fixes (#2367) @DoNotSpamPls
* Remove outdated permission plugin handlers, minor test fixes

* Re-add PermissionEX handler

* Use PaperLib to load chunks async whenever possible

* Revert "Use PaperLib to load chunks async whenever possible"

This reverts commit db4df6f3cf.
2019-01-27 12:14:16 +00:00
Glare Masters 827217823e Add the ability to make spectator gamemode signs (#2386) @darbyjack
Fixes #2383.
2019-01-20 10:14:20 +00:00
md678685 060dfc69f4 Update items.json
Fixed regression of unspawnable items not being marked as such, impacting the alias generation process. This fix also retains the ability to specify non-item blocks in the EssentialsX Protect material lists.
2019-01-12 22:07:03 +00:00
md678685 b831713737 Check whether item is spawnable in FlatItemDb 2019-01-12 21:43:36 +00:00
md678685 7da90b3a6b Load item spawn blacklist after item DB
Partially resolves #2360.
2019-01-12 21:43:36 +00:00
md678685 32540c23ab Add IItemDb#isReady to check if item database is available 2019-01-12 21:43:36 +00:00
md678685 d24b0616f8 Hide ServerListPingEvent exceptions thrown by CB's LegacyPingHandler (#2378)
Fixes #2327.
2019-01-12 17:19:11 +00:00
md678685 9aef2ef883 Update items.json
Add several new aliases. Closes #2348.
2019-01-09 15:10:38 +00:00
md678685 727d473319 Fix Enchantments on 1.12.2 and lower 2019-01-09 14:23:55 +00:00
md678685 8225e51867 Fix XMPP metrics reporting
The XMPP config was being reported as valid when it wasn't valid.
2019-01-09 13:57:18 +00:00
md678685 1ba6c2a596 Properly fix language mappings 2019-01-08 22:19:16 +00:00
md678685 60a166aeb0 Fix language mapping in Crowdin config 2019-01-08 21:45:46 +00:00
md678685 65c2155bca Update Crowdin config
Map most locales to the existing locale files.
2019-01-08 21:36:16 +00:00
md678685 6031c01584 Update Crowdin config
Fix file placement and map locale codes to existing translations
2019-01-08 21:21:35 +00:00
md678685 da8e8c8a25 Update Crowdin config
Crowdin should only use `messages.properties` as the "source" and this file will get copied to all the other language files like `messages_de.properties` for the German translation, `messages_ro.properties` for the Romanian translation etc.
2019-01-08 21:14:56 +00:00
Trent Hensler 70a750a32d Update Crowdin configuration file 2019-01-08 12:48:25 -08:00
md678685 7c63324504 Fix allow-old-id-signs allowing creation of signs with IDs 2019-01-07 22:38:13 +00:00
md678685 dd41b10522 attempt to fix Essentials overriding Skulls (#2356) @kennyrkun 2019-01-05 18:48:33 +00:00
triagonal 7948e764d4 disallow setting bed homes in non-overworld dimensions (#2335) @triagonal 2019-01-05 18:43:27 +00:00
DoNotSpamPls 82ede4530a Lots of little fixes in the Essentials modules (#2337) @DoNotSpamPls
Look at changed files for the changes
2019-01-05 18:42:09 +00:00
md678685 e8ab2db8e8 Improve ServerListPingEvent warning handling 2019-01-05 18:12:04 +00:00
md678685 8882e0214c Add bStats metrics for each EssentialsX module (#2333)
Does what it says on the tin.
2019-01-05 17:48:44 +00:00
md678685 4adb669cdd Add support for spawners with entities on 1.13+ 2019-01-05 17:35:29 +00:00
md678685 7e1d258dd3 Cache BukkitVersion in getServerBukkitVersion 2019-01-05 16:29:11 +00:00
md678685 417fe29e21 Remove duplicated item IDs in messages 2019-01-05 16:28:53 +00:00
md678685 bd8ef2a25d Only show available warps in tab complete
Fixes #2353 by only displaying warps where the player has the permission `essentials.warps.<warp>`.
2019-01-05 15:45:34 +00:00
md678685 fd01b75c33 Wrap UnsafeValues.fromLegacy() in try/catch for older versions
Should address #2352.
2019-01-05 15:27:07 +00:00
md678685 1388755d2a Wrap Enchantment.getByKey in try/catch for older versions
Should address #2351.
2019-01-05 15:17:58 +00:00
md678685 97cc3d0066 Update items.json
* Fix wrong harming potion mapping (fixes #2349)
* Add mob spawner aliases (not complete, related to #2347)
* Closes #2348:
  - Fix log aliases mistakenly pointing to stripped logs
  - Fix sandstone alias
  - Add shorter concrete powder aliases
2019-01-05 15:04:59 +00:00
md678685 694cf7a79e Revert 1.13 API hacks in LegacyItemDb
Earlier changes broke the items.csv database on older versions - this should now be fixed.
2019-01-04 15:01:18 +00:00
md678685 da89efb79f Make VersionUtil not explode when patch is not present 2019-01-03 22:16:14 +00:00
md678685 04ec013407 Update README to reflect 1.13 support 2019-01-03 21:25:48 +00:00
md678685 023cf6a1aa Merge pull request #2278 from EssentialsX/1.13
Full 1.13 support + 2.16.0 release
2019-01-03 20:56:14 +00:00
md678685 f7cbb141f8 Release 2.16.0
🎉
2019-01-03 20:47:24 +00:00
md678685 5690952516 Implement missing OfflinePlayer methods 2019-01-03 20:42:03 +00:00
md678685 e94202c55a Use 1.8-friendly User#getItemInHand method in commands 2019-01-03 20:33:08 +00:00
md678685 aa6ad271a0 Remove redundant metricsEnabled field from Settings 2019-01-03 20:33:08 +00:00
md678685 3b41bb47b6 Improve Travis build script (#2338)
I've added a new script at `scripts/buildtools.sh` that is responsible for:
* Checking whether CraftBukkit 1.8 and 1.8.3 are already available in the local Maven repo
* Downloading BuildTools if not already present
* Running BuildTools if necessary

This improves Travis build times as it now doesn't run BuildTools twice for *every single build*, instead running it only if the Travis cache fails and CraftBukkit is missing for some other reason.
2019-01-01 16:13:50 +00:00
md678685 e7bdb7fabc Improve the wording of the README's "Building" section 2019-01-01 15:42:45 +00:00
md678685 110698223d Travis: make build prep script executable 2019-01-01 15:23:35 +00:00
md678685 437be593b9 Add new build preparation script 2019-01-01 15:10:59 +00:00
md678685 502d37b574 Update Lombok to compile on Java 9+ 2018-12-31 17:44:08 +00:00
md678685 df59f9f859 Merge remote-tracking branch 'origin/2.x' into 1.13 2018-12-31 14:59:12 +00:00
md678685 f436fbab6b Remove redundant BuildTools runs 2018-12-31 14:54:59 +00:00
seema84 8404720501 change typos (#2328) @seema84
* change typos

* format text

* remove double color
2018-12-31 13:08:57 +00:00
md678685 4431d452f1 Bump to 2.16-pre4
Pretty much there now.
2018-12-31 13:02:08 +00:00
md678685 6a529d6671 Update EssentialsX Protect with cross-version enum lookups 2018-12-31 12:54:43 +00:00
md678685 78fca9a67a Updates signs with cross-version enum lookups 2018-12-31 12:53:41 +00:00
md678685 0114b5e4f6 Update several commands with cross-version enum lookups 2018-12-31 12:53:23 +00:00
md678685 5a14a64b6c Add cross-version support to SpawnMob 2018-12-31 12:24:41 +00:00
md678685 b555ea6350 Add cross-version support to MobData 2018-12-31 12:20:05 +00:00
md678685 361ae1dd16 Use constant field for "harp"/"piano" sound 2018-12-31 12:19:22 +00:00
md678685 58117eba88 Remove redundant BuildTools instructions 2018-12-31 12:18:45 +00:00
md678685 6260b49b4f Restore item ID messages in /itemdb 2018-12-31 11:57:15 +00:00
md678685 988239267b Restore durability permissions checks in AntiBuild 2018-12-31 11:56:50 +00:00
md678685 19cffe3872 Restore ID-based charges in /repair 2018-12-31 11:39:08 +00:00
md678685 3b1cef918e Simplify item spawn permission checks; restore ID-based item spawn perms 2018-12-31 11:29:27 +00:00
md678685 3553328f7a Bump to 2.16-pre3 2018-12-29 21:22:08 +00:00
md678685 0202271f00 Add missing FakeWorld methods 2018-12-29 21:16:17 +00:00
md678685 d91d6a419c Update items.json
* Fix incorrect "cobblestone" and "stone" aliases
* Fix stripped log aliases not appearing
* Fix meat/fish aliases pointing to spawn eggs
2018-12-28 16:40:39 +00:00
md678685 5173090474 Update items.json
Adds more minecart, meat, fish and hay aliases.
2018-12-26 21:05:48 +00:00
md678685 c26df8318f Update items.json
* Add more shorter spawn egg aliases
* Add new trapdoor aliases
* Add new infested block aliases and stone brick variants
2018-12-26 19:24:50 +00:00
md678685 7b44f0088a Update items.json
* Add spawn eggs aliases
* Add new aliases for several items and blocks like beetroot, pumpkins and crafting tables
* Remove `WALL_` materials (these are unspawnable)
2018-12-26 18:05:55 +00:00
md678685 aa4d3cc9fd Bump to 2.16-pre2 2018-12-25 00:27:54 +00:00
md678685 246fd03265 Fix typo in README 2018-12-23 23:33:46 +00:00
md678685 55074872fe Add setting to enable item ID recognition on signs
Item IDs can now be enabled for existing signs by manually changing a config option, but there is no facility to create new signs with item IDs.
2018-12-23 23:02:36 +00:00
md678685 28559dda3a Lowercase the provided ID in FlatItemDb#get 2018-12-23 19:45:23 +00:00
md678685 cbcfad5b2e Merge branch '2.x' into 1.13 2018-12-23 19:33:20 +00:00
md678685 a9ad440860 Overhaul AbstractItemDb.serialize to use MaterialUtil methods 2018-12-23 19:32:10 +00:00
md678685 5104463593 Add MaterialUtil.getColorOf 2018-12-23 19:31:33 +00:00
md678685 4b1c51c21d Reword IItemDb#serialize docs 2018-12-23 18:02:38 +00:00
md678685 236ef52980 Improved README (#2293)
I've made several improvements to the README, including:
* Overall rewording to make phrasing feel less awkward
* Added links to Patreon
* More consistent images for links at top
* Consolidated "Why you should use it" and "Other info" into "Why use EssentialsX?"
* More specific about version support
* Moved "Support" section above "Building" and added explanation
* Removed redundant "Commit Guidelines" section
  - It has been totally ignored for years, and it doesn't make much sense to keep it
* Added a new "Contributing" section near the bottom
2018-12-23 17:21:31 +00:00
md678685 f220c5b406 Update Estonian sudoExempt message
Thanks to @Madis0 for [pointing this out and translating it](https://github.com/EssentialsX/Essentials/pull/2228#issuecomment-449586891).
2018-12-22 17:47:39 +00:00
Thomas 9415582fe1 Update messages_nl.properties (#2129) @DutchUser
* Update messages_nl.properties

* Update messages_nl.properties

* Update messages_nl.properties

* Update messages_nl.properties

* Update messages_nl.properties
2018-12-22 17:42:42 +00:00
Sprungente a5a3630727 [Finish] Improving German localization (#2198) @Sprungente
* Improving 

I found some stuff to improve the translation. I'm not done yet but i think it's ready to get an eye on it. 

Hope it will be used :)

Greets Sprungente/enterih

* mistake^^

^

* Part 2

Adding more Improvements
Hope it helps other serverowners^^

* Part 2 fixes

* Part 3 



Notice for me 
a-d finished
\u00f6 ö    \u00e4 ä  \u00fc ü

* Part 4

Notice for me 
a-i finished
\u00f6 ö    \u00e4 ä  \u00fc ü

* Last part 

is line 456
requiredBukkit=\u00a76* \! * Du brauchst mindestens CraftBukkit Build \#{0}, lade es von http\://dl.bukkit.org/downloads/craftbukkit/
still exist? If yes, could a reference to spigot be added?

It's ready to merge. Can i take care on it in the future?

* small polishing

* Update messages_de.properties

* Update messages_de.properties

* Adding new strings 

added strings from #2278
2018-12-22 17:39:44 +00:00
Madis f4c36d9c43 Estonian translation update (#2228)
* Initial improvements

* Half done

* Almost done

* Translation done

* Encode umlauts

* Additional refinements

* Minor fix

* Some more tweaks

* Minor wording change

* 1.13 strings
2018-12-22 17:36:47 +00:00
md678685 492005d00a Fix LegacyItemID method override 2018-12-15 19:11:41 +00:00
md678685 149d9b61cc Add methods to facilitate conversion from IDs to new Materials 2018-12-15 18:54:01 +00:00
md678685 77ffb6a3d5 Slightly simplify FlatItemDb 2018-12-15 18:53:06 +00:00
md678685 d95b632884 Merge branch '2.x' into 1.13 2018-12-11 14:31:42 +00:00
md678685 579f554edb Update nickname again after toggling AFK status 2018-12-11 13:26:15 +00:00
md678685 050287f306 Add 1.13 enchantments
Fixes #2254.
2018-12-11 10:04:38 +00:00
md678685 dafe156212 Merge branch '2.x' into 1.13 2018-12-09 15:25:31 +00:00
md678685 48bf264178 Fix discrepancies between default and EN locale 2018-12-09 15:21:07 +00:00
md678685 769dbe8852 Fix BukkitVersion's toString and equals 2018-12-09 15:16:44 +00:00
md678685 67bccb865a Remove colour codes from serverUnsupported in EN locale 2018-12-09 15:16:18 +00:00
md678685 d1e60de04a Ignore kits.yml created during tests 2018-12-09 15:15:55 +00:00
md678685 89d592ce43 Improve item-spawn-blacklist load logging 2018-12-09 14:58:56 +00:00
md678685 c06dda886d Actually use the force-enable-recipe option from the config 2018-12-09 14:58:36 +00:00
md678685 7b67b3b858 Don't send empty line join/quit messages
GitHub meta: fixes #991 fixes #2289
2018-12-06 14:06:25 +00:00
158 changed files with 7688 additions and 3444 deletions

No files matched your search

+18 -52
View File
@@ -1,52 +1,18 @@
.DS_Store
/BuildAll/nbproject/private/
/EssentialsProtect/nbproject/private/
/EssentialsChat/nbproject/private/
/EssentialsGroupBridge/nbproject/private/
/EssentialsGeoIP/nbproject/private/
/EssentialsSpawn/nbproject/private/
/EssentialsXMPP/nbproject/private/
/BuildAll/build/
/EssentialsGroupBridge/dist/
/EssentialsGroupBridge/build/
/EssentialsGeoIP/dist/
/EssentialsGeoIP/build/
/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
/EssentialsAntiBuild/nbproject/private/
/EssentialsAntiBuild/dist/
/EssentialsAntiBuild/build/
/jars
/out
.idea/
*.iml
*.classpath
*.project
*.settings/
target/
dependency-reduced-pom.xml
/Essentials/config.yml
/Essentials/userdata/testplayer1.yml
/Essentials/usermap.csv
/Essentials/userdata
/EssentialsGroupManager/target/
# IDE files
*.classpath
*.project
*.settings/
.idea/
*.iml
.DS_Store
# Essentials files
/Essentials/userdata
/Essentials/config.yml
/Essentials/kits.yml
/Essentials/userdata/testplayer1.yml
/Essentials/usermap.csv
# Build files
target/
jars/
+2 -15
View File
@@ -1,23 +1,10 @@
language: java
branches:
only:
- 2.x
- 1.13
cache:
directories:
- .buildtools
- $HOME/.m2
before_install:
- mkdir -p .buildtools
- cd .buildtools
- wget -O BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
- rm -r work/
- java -jar BuildTools.jar --rev 1.8
- java -jar BuildTools.jar --rev 1.8.3
- java -jar BuildTools.jar --rev 1.9
- java -jar BuildTools.jar --rev 1.9.4
- java -jar BuildTools.jar --rev 1.13.1
- cd ..
- chmod +x scripts/buildtools.sh
- scripts/buildtools.sh
+27 -31
View File
@@ -6,25 +6,18 @@
<parent>
<groupId>net.ess3</groupId>
<artifactId>EssentialsXParent</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
</parent>
<artifactId>EssentialsX</artifactId>
<licenses>
<license>
<name>GPLv3</name>
<url>http://www.gnu.org/copyleft/gpl.html</url>
</license>
</licenses>
<build>
<finalName>EssentialsX-${full.version}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<version>3.8.0</version>
<configuration>
<showDeprecation>false</showDeprecation>
</configuration>
@@ -32,7 +25,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
@@ -41,6 +34,15 @@
</goals>
</execution>
</executions>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
<relocation>
<pattern>io.papermc.lib</pattern>
<shadedPattern>com.earth2me.essentials.paperlib</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>
@@ -48,26 +50,32 @@
<dependencies>
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>Vault</artifactId>
<version>1.5.6</version>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId>
<version>1.0.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>NMSProvider</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>UpdatedMetaProvider</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>1_8_R1Provider</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
<scope>compile</scope>
<exclusions>
<exclusion>
@@ -79,7 +87,7 @@
<dependency>
<groupId>net.ess3</groupId>
<artifactId>1_8_R2Provider</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
<scope>compile</scope>
<exclusions>
<exclusion>
@@ -91,32 +99,20 @@
<dependency>
<groupId>net.ess3</groupId>
<artifactId>LegacyProvider</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>ReflectionProvider</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>FlattenedProvider</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>vault-repo</id>
<url>http://nexus.hc.to/content/repositories/pub_releases</url>
</repository>
</repositories>
</project>
@@ -1,7 +1,5 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.NumberUtil;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
@@ -15,6 +13,7 @@ import java.util.Set;
public class Enchantments {
private static final Map<String, Enchantment> ENCHANTMENTS = new HashMap<String, Enchantment>();
private static final Map<String, Enchantment> ALIASENCHANTMENTS = new HashMap<String, Enchantment>();
private static boolean isFlat;
static {
ENCHANTMENTS.put("alldamage", Enchantment.DAMAGE_ALL);
@@ -199,10 +198,55 @@ public class Enchantments {
ALIASENCHANTMENTS.put("sweeping", sweeping);
}
} catch (IllegalArgumentException ignored) {}
try { // 1.13
Enchantment loyalty = Enchantment.getByName("LOYALTY");
if (loyalty != null) {
ENCHANTMENTS.put("loyalty", loyalty);
ALIASENCHANTMENTS.put("loyal", loyalty);
ALIASENCHANTMENTS.put("return", loyalty);
}
Enchantment impaling = Enchantment.getByName("IMPALING");
if (impaling != null) {
ENCHANTMENTS.put("impaling", impaling);
ALIASENCHANTMENTS.put("impale", impaling);
ALIASENCHANTMENTS.put("oceandamage", impaling);
ALIASENCHANTMENTS.put("oceandmg", impaling);
}
Enchantment riptide = Enchantment.getByName("RIPTIDE");
if (riptide != null) {
ENCHANTMENTS.put("riptide", riptide);
ALIASENCHANTMENTS.put("rip", riptide);
ALIASENCHANTMENTS.put("tide", riptide);
ALIASENCHANTMENTS.put("launch", riptide);
}
Enchantment channelling = Enchantment.getByName("CHANNELING");
if (channelling != null) {
ENCHANTMENTS.put("channelling", channelling);
ALIASENCHANTMENTS.put("chanelling", channelling);
ALIASENCHANTMENTS.put("channeling", channelling);
ALIASENCHANTMENTS.put("chaneling", channelling);
ALIASENCHANTMENTS.put("channel", channelling);
}
} catch (IllegalArgumentException ignored) {}
try {
Class<?> namespacedKeyClass = Class.forName("org.bukkit.NamespacedKey");
Class<?> enchantmentClass = Class.forName("org.bukkit.enchantments.Enchantment");
enchantmentClass.getDeclaredMethod("getByKey", namespacedKeyClass);
isFlat = true;
} catch (ClassNotFoundException | NoSuchMethodException e) {
isFlat = false;
}
}
public static Enchantment getByName(String name) {
Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(name.toLowerCase()));
Enchantment enchantment = null;
if (isFlat) { // 1.13+ only
enchantment = Enchantment.getByKey(NamespacedKey.minecraft(name.toLowerCase()));
}
if (enchantment == null) {
enchantment = Enchantment.getByName(name.toUpperCase());
}
@@ -196,27 +196,34 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
final EssentialsUpgrade upgrade = new EssentialsUpgrade(this);
upgrade.beforeSettings();
execTimer.mark("Upgrade");
confList = new ArrayList<>();
settings = new Settings(this);
confList.add(settings);
execTimer.mark("Settings");
userMap = new UserMap(this);
confList.add(userMap);
execTimer.mark("Init(Usermap)");
kits = new Kits(this);
confList.add(kits);
upgrade.convertKits();
execTimer.mark("Kits");
upgrade.afterSettings();
execTimer.mark("Upgrade2");
warps = new Warps(getServer(), this.getDataFolder());
confList.add(warps);
execTimer.mark("Init(Spawn/Warp)");
worth = new Worth(this.getDataFolder());
confList.add(worth);
itemDb = getItemDbFromConfig();
confList.add(itemDb);
execTimer.mark("Init(Worth/ItemDB)");
jails = new Jails(this);
confList.add(jails);
execTimer.mark("Init(Jails)");
@@ -241,6 +248,10 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
), "potion meta").getProvider();
execTimer.mark("Init(Providers)");
reload();
// The item spawn blacklist is loaded with all other settings, before the item
// DB, but it depends on the item DB, so we need to reload it again here:
((Settings) settings)._lateLoadItemSpawnBlacklist();
} catch (YAMLException exception) {
if (pm.getPlugin("EssentialsUpdate") != null) {
LOGGER.log(Level.SEVERE, tl("essentialsHelp2"));
@@ -7,6 +7,7 @@ import com.earth2me.essentials.textreader.TextPager;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.LocationUtil;
import com.earth2me.essentials.utils.MaterialUtil;
import io.papermc.lib.PaperLib;
import net.ess3.api.IEssentials;
import org.bukkit.BanEntry;
@@ -14,6 +15,7 @@ import org.bukkit.BanList;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
@@ -152,7 +154,12 @@ public class EssentialsPlayerListener implements Listener {
event.setQuitMessage(null);
} else if (ess.getSettings().isCustomQuitMessage() && event.getQuitMessage() != null) {
final Player player = event.getPlayer();
event.setQuitMessage(ess.getSettings().getCustomQuitMessage().replace("{PLAYER}", player.getDisplayName()).replace("{USERNAME}", player.getName()).replace("{ONLINE}", NumberFormat.getInstance().format(ess.getOnlinePlayers().size())));
final String msg = ess.getSettings().getCustomQuitMessage()
.replace("{PLAYER}", player.getDisplayName())
.replace("{USERNAME}", player.getName())
.replace("{ONLINE}", NumberFormat.getInstance().format(ess.getOnlinePlayers().size()));
event.setQuitMessage(msg.isEmpty() ? null : msg);
}
user.startTransaction();
@@ -260,7 +267,9 @@ public class EssentialsPlayerListener implements Listener {
.replace("{PLAYER}", player.getDisplayName()).replace("{USERNAME}", player.getName())
.replace("{UNIQUE}", NumberFormat.getInstance().format(ess.getUserMap().getUniqueUsers()))
.replace("{ONLINE}", NumberFormat.getInstance().format(ess.getOnlinePlayers().size()));
ess.getServer().broadcastMessage(msg);
if (!msg.isEmpty()) {
ess.getServer().broadcastMessage(msg);
}
} else if (ess.getSettings().allowSilentJoinQuit()) {
ess.getServer().broadcastMessage(message);
}
@@ -594,7 +603,7 @@ public class EssentialsPlayerListener implements Listener {
case RIGHT_CLICK_BLOCK:
if (!event.isCancelled() && MaterialUtil.isBed(event.getClickedBlock().getType()) && ess.getSettings().getUpdateBedAtDaytime()) {
User player = ess.getUser(event.getPlayer());
if (player.isAuthorized("essentials.sethome.bed")) {
if (player.isAuthorized("essentials.sethome.bed") && player.getWorld().getEnvironment().equals(World.Environment.NORMAL)) {
player.getBase().setBedSpawnLocation(event.getClickedBlock().getLocation());
player.sendMessage(tl("bedSet", player.getLocation().getWorld().getName(), player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()));
}
@@ -634,7 +643,7 @@ public class EssentialsPlayerListener implements Listener {
while (LocationUtil.isBlockDamaging(loc.getWorld(), loc.getBlockX(), loc.getBlockY() - 1, loc.getBlockZ())) {
loc.setY(loc.getY() + 1d);
}
user.getBase().teleport(loc, TeleportCause.PLUGIN);
PaperLib.teleportAsync(user.getBase(), loc, TeleportCause.PLUGIN);
}
}
ess.scheduleSyncDelayedTask(new DelayedClickJumpTask());
@@ -720,6 +729,7 @@ public class EssentialsPlayerListener implements Listener {
} else if (clickedInventory != null && clickedInventory.getType() == InventoryType.PLAYER) {
if (ess.getSettings().isDirectHatAllowed() && event.getClick() == ClickType.LEFT && event.getSlot() == 39
&& event.getCursor().getType() != Material.AIR && event.getCursor().getType().getMaxDurability() == 0
&& !MaterialUtil.isSkull(event.getCursor().getType())
&& ess.getUser(event.getWhoClicked()).isAuthorized("essentials.hat")) {
event.setCancelled(true);
final PlayerInventory inv = (PlayerInventory) clickedInventory;
@@ -10,12 +10,17 @@ import org.bukkit.event.server.ServerListPingEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
public class EssentialsServerListener implements Listener {
private static List<String> ignoredSLPECallers = Arrays.asList(
".LegacyPingHandler.channelRead(" // CB responding to pings from pre-Netty clients
);
private final transient IEssentials ess;
private boolean unsupportedLogged = false;
private boolean npeWarned = false;
@@ -31,13 +36,13 @@ public class EssentialsServerListener implements Listener {
setSampleText = ReflUtil.getMethodCached(ServerListPingEvent.class, "setSampleText", List.class);
getSampleText = ReflUtil.getMethodCached(ServerListPingEvent.class, "getSampleText");
if (setSampleText != null && getSampleText != null) {
ess.getLogger().info("Using Paper 1.12+ ServerListPingEvent methods");
ess.getLogger().info("ServerListPingEvent: Paper 1.12.2 setSampleText API");
isPaperSample = true;
return;
}
}
ess.getLogger().info("Using Spigot 1.7.10+ ServerListPingEvent iterator");
ess.getLogger().info("ServerListPingEvent: Spigot iterator API");
isPaperSample = false;
}
@@ -46,22 +51,16 @@ public class EssentialsServerListener implements Listener {
if (isPaperSample) {
try {
List<String> playerNames = (List<String>) getSampleText.invoke(event, null);
Iterator<String> iterator = playerNames.iterator();
while (iterator.hasNext()) {
String player = iterator.next();
if (ess.getUser(player).isVanished()) {
iterator.remove();
}
}
playerNames.removeIf(player -> ess.getUser(player).isVanished());
setSampleText.invoke(event, playerNames);
} catch (IllegalAccessException | InvocationTargetException | ClassCastException e) {
if (!unsupportedLogged) {
if (!unsupportedLogged && shouldWarnSLPECaller(e)) {
ess.getLogger().log(Level.WARNING, "Unable to hide players from server list ping "
+ "using Paper 1.12+ method!", e);
+ "using Paper 1.12 method!", e);
unsupportedLogged = true;
}
} catch (NullPointerException e) {
if (!npeWarned) {
if (!npeWarned && shouldWarnSLPECaller(e)) {
npeWarned = true;
Exception ex = new Exception("A plugin has fired a ServerListPingEvent "
+ "without implementing Paper's methods. Point the author to https://git.io/v7Xzl.");
@@ -79,12 +78,38 @@ public class EssentialsServerListener implements Listener {
}
}
} catch (UnsupportedOperationException e) {
if (!unsupportedLogged) {
ess.getLogger().warning("Current server implementation does not support "
+ "hiding players from server list ping. Update or contact the maintainers.");
if (!unsupportedLogged && shouldWarnSLPECaller(e)) {
ess.getLogger().log(Level.WARNING, "Could not hide vanished players while handling " + event.getClass().getName(), e);
unsupportedLogged = true;
}
}
}
}
/**
* Should we warn about this SLPE caller, or should we silently ignore it?
* This checks against the ignoredSLPECallers strings, and if it matches one of those, we
* return false.
*
* @param throwable A throwable caught by a catch block
* @return Whether or not to send a warning about this particular caller
*/
private boolean shouldWarnSLPECaller(Throwable throwable) {
final int maxStackDepth = 20; // Limit the depth when searching through the stack trace
int depth = 0;
for (StackTraceElement element : throwable.getStackTrace()) {
depth++;
if (depth > maxStackDepth) {
break;
}
for (String ignoredString : ignoredSLPECallers) {
if (element.toString().contains(ignoredString)) {
return false; // We know about this error and should ignore it, so don't warn
}
}
}
return true; // We don't know for certain that we can ignore this, so warn just to be safe
}
}
@@ -93,7 +93,7 @@ public class I18n implements net.ess3.api.II18n {
}
messageFormatCache.put(format, messageFormat);
}
return messageFormat.format(objects);
return messageFormat.format(objects).replace(' ', ' '); // replace nbsp with a space
}
public void updateLocale(final String loc) {
@@ -320,4 +320,6 @@ public interface ISettings extends IConf {
String getItemDbType();
boolean isForceEnableRecipe();
boolean allowOldIdSigns();
}
@@ -1,6 +1,7 @@
package com.earth2me.essentials;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.StringUtil;
import org.bukkit.DyeColor;
import org.bukkit.Material;
@@ -53,9 +54,9 @@ public enum MobData {
BAY_HORSE("bay", EntityType.HORSE, Horse.Color.BROWN, true),
BROWN_HORSE("brown", EntityType.HORSE, Horse.Color.BROWN, false),
SADDLE_HORSE("saddle", EntityType.HORSE, Data.HORSESADDLE, true),
GOLD_ARMOR_HORSE("goldarmor", EntityType.HORSE, Material.GOLDEN_HORSE_ARMOR, true),
DIAMOND_ARMOR_HORSE("diamondarmor", EntityType.HORSE, Material.DIAMOND_HORSE_ARMOR, true),
ARMOR_HORSE("armor", EntityType.HORSE, Material.IRON_HORSE_ARMOR, true),
GOLD_ARMOR_HORSE("goldarmor", EntityType.HORSE, EnumUtil.getMaterial("GOLDEN_HORSE_ARMOR", "GOLD_BARDING"), true),
DIAMOND_ARMOR_HORSE("diamondarmor", EntityType.HORSE, EnumUtil.getMaterial("DIAMOND_HORSE_ARMOR", "DIAMOND_BARDING"), true),
ARMOR_HORSE("armor", EntityType.HORSE, EnumUtil.getMaterial("IRON_HORSE_ARMOR", "IRON_BARDING"), true),
SIAMESE_CAT("siamese", EntityType.OCELOT, Ocelot.Type.SIAMESE_CAT, true),
WHITE_CAT("white", EntityType.OCELOT, Ocelot.Type.SIAMESE_CAT, false),
RED_CAT("red", EntityType.OCELOT, Ocelot.Type.RED_CAT, true),
@@ -66,12 +67,12 @@ public enum MobData {
BABY_ZOMBIE("baby", EntityType.ZOMBIE.getEntityClass(), Data.BABYZOMBIE, true),
ADULT_ZOMBIE("adult", EntityType.ZOMBIE.getEntityClass(), Data.ADULTZOMBIE, true),
DIAMOND_SWORD_ZOMBIE("diamondsword", EntityType.ZOMBIE.getEntityClass(), Material.DIAMOND_SWORD, true),
GOLD_SWORD_ZOMBIE("goldsword", EntityType.ZOMBIE.getEntityClass(), Material.GOLDEN_SWORD, true),
GOLD_SWORD_ZOMBIE("goldsword", EntityType.ZOMBIE.getEntityClass(), EnumUtil.getMaterial("GOLDEN_SWORD", "GOLD_SWORD"), true),
IRON_SWORD_ZOMBIE("ironsword", EntityType.ZOMBIE.getEntityClass(), Material.IRON_SWORD, true),
STONE_SWORD_ZOMBIE("stonesword", EntityType.ZOMBIE.getEntityClass(), Material.STONE_SWORD, false),
SWORD_ZOMBIE("sword", EntityType.ZOMBIE.getEntityClass(), Material.STONE_SWORD, true),
DIAMOND_SWORD_SKELETON("diamondsword", EntityType.SKELETON, Material.DIAMOND_SWORD, true),
GOLD_SWORD_SKELETON("goldsword", EntityType.SKELETON, Material.GOLDEN_SWORD, true),
GOLD_SWORD_SKELETON("goldsword", EntityType.SKELETON, EnumUtil.getMaterial("GOLDEN_SWORD", "GOLD_SWORD"), true),
IRON_SWORD_SKELETON("ironsword", EntityType.SKELETON, Material.IRON_SWORD, true),
STONE_SWORD_SKELETON("stonesword", EntityType.SKELETON, Material.STONE_SWORD, false),
SWORD_SKELETON("sword", EntityType.SKELETON, Material.STONE_SWORD, true),
@@ -787,6 +787,21 @@ public class OfflinePlayer implements Player {
public void setBedSpawnLocation(Location lctn, boolean force) {
}
@Override
public boolean sleep(Location location, boolean force) {
return false;
}
@Override
public void wakeup(boolean setSpawnLocation) {
}
@Override
public Location getBedLocation() {
return null;
}
@Override
public void playEffect(EntityEffect ee) {
}
@@ -1,10 +1,12 @@
package com.earth2me.essentials;
import com.earth2me.essentials.api.IItemDb;
import com.earth2me.essentials.commands.IEssentialsCommand;
import com.earth2me.essentials.signs.EssentialsSign;
import com.earth2me.essentials.signs.Signs;
import com.earth2me.essentials.textreader.IText;
import com.earth2me.essentials.textreader.SimpleTextInput;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.FormatUtil;
import com.earth2me.essentials.utils.NumberUtil;
@@ -36,7 +38,6 @@ public class Settings implements net.ess3.api.ISettings {
private final transient EssentialsConf config;
private static final Logger logger = Logger.getLogger("Essentials");
private final transient IEssentials ess;
private boolean metricsEnabled = true;
public Settings(IEssentials ess) {
this.ess = ess;
@@ -539,9 +540,14 @@ public class Settings implements net.ess3.api.ISettings {
isAllowWorldInBroadcastworld = _isAllowWorldInBroadcastworld();
itemDbType = _getItemDbType();
forceEnableRecipe = _isForceEnableRecipe();
allowOldIdSigns = _allowOldIdSigns();
}
private List<Material> itemSpawnBl = new ArrayList<Material>();
void _lateLoadItemSpawnBlacklist() {
itemSpawnBl = _getItemSpawnBlacklist();
}
private List<Material> itemSpawnBl = new ArrayList<>();
@Override
public List<Material> itemSpawnBlacklist() {
@@ -550,8 +556,9 @@ public class Settings implements net.ess3.api.ISettings {
private List<Material> _getItemSpawnBlacklist() {
final List<Material> epItemSpwn = new ArrayList<>();
if (ess.getItemDb() == null) {
logger.log(Level.FINE, "Aborting ItemSpawnBL read, itemDB not yet loaded.");
final IItemDb itemDb = ess.getItemDb();
if (itemDb == null || !itemDb.isReady()) {
logger.log(Level.FINE, "Skipping item spawn blacklist read; item DB not yet loaded.");
return epItemSpwn;
}
for (String itemName : config.getString("item-spawn-blacklist", "").split(",")) {
@@ -560,10 +567,10 @@ public class Settings implements net.ess3.api.ISettings {
continue;
}
try {
final ItemStack iStack = ess.getItemDb().get(itemName);
final ItemStack iStack = itemDb.get(itemName);
epItemSpwn.add(iStack.getType());
} catch (Exception ex) {
logger.log(Level.SEVERE, tl("unknownItemInList", itemName, "item-spawn-blacklist"));
logger.log(Level.SEVERE, tl("unknownItemInList", itemName, "item-spawn-blacklist"), ex);
}
}
return epItemSpwn;
@@ -685,12 +692,20 @@ public class Settings implements net.ess3.api.ISettings {
if (itemName.isEmpty()) {
continue;
}
ItemStack itemStack;
try {
itemStack = ess.getItemDb().get(itemName);
list.add(itemStack.getType());
} catch (Exception ex) {
Material mat = EnumUtil.getMaterial(itemName.toUpperCase());
if (mat == null) {
try {
ItemStack itemStack = ess.getItemDb().get(itemName);
mat = itemStack.getType();
} catch (Exception ignored) {}
}
if (mat == null) {
logger.log(Level.SEVERE, tl("unknownItemInList", itemName, configName));
} else {
list.add(mat);
}
}
return list;
@@ -1488,6 +1503,17 @@ public class Settings implements net.ess3.api.ISettings {
@Override
public boolean isForceEnableRecipe() {
return false;
return forceEnableRecipe;
}
private boolean allowOldIdSigns;
private boolean _allowOldIdSigns() {
return config.getBoolean("allow-old-id-signs", false);
}
@Override
public boolean allowOldIdSigns() {
return allowOldIdSigns;
}
}
@@ -2,6 +2,7 @@ package com.earth2me.essentials;
import com.earth2me.essentials.Mob.MobException;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.LocationUtil;
import com.earth2me.essentials.utils.StringUtil;
import net.ess3.api.IEssentials;
@@ -19,6 +20,13 @@ import static com.earth2me.essentials.I18n.tl;
public class SpawnMob {
private static final Material GOLDEN_HELMET = EnumUtil.getMaterial("GOLDEN_HELMET", "GOLD_HELMET");
private static final Material GOLDEN_CHESTPLATE = EnumUtil.getMaterial("GOLDEN_CHESTPLATE", "GOLD_CHESTPLATE");
private static final Material GOLDEN_LEGGINGS = EnumUtil.getMaterial("GOLDEN_LEGGINGS", "GOLD_LEGGINGS");
private static final Material GOLDEN_BOOTS = EnumUtil.getMaterial("GOLDEN_BOOTS", "GOLD_BOOTS");
private static final Material GOLDEN_SWORD = EnumUtil.getMaterial("GOLDEN_SWORD", "GOLD_SWORD");
public static String mobList(final User user) {
final Set<String> mobList = Mob.getMobList();
final Set<String> availableList = new HashSet<String>();
@@ -191,10 +199,10 @@ public class SpawnMob {
invent.setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE, 1));
invent.setHelmet(new ItemStack(Material.DIAMOND_HELMET, 1));
} else if (inputData.contains("gold")) {
invent.setBoots(new ItemStack(Material.GOLDEN_BOOTS, 1));
invent.setLeggings(new ItemStack(Material.GOLDEN_LEGGINGS, 1));
invent.setChestplate(new ItemStack(Material.GOLDEN_CHESTPLATE, 1));
invent.setHelmet(new ItemStack(Material.GOLDEN_HELMET, 1));
invent.setBoots(new ItemStack(GOLDEN_BOOTS, 1));
invent.setLeggings(new ItemStack(GOLDEN_LEGGINGS, 1));
invent.setChestplate(new ItemStack(GOLDEN_CHESTPLATE, 1));
invent.setHelmet(new ItemStack(GOLDEN_HELMET, 1));
} else if (inputData.contains("leather")) {
invent.setBoots(new ItemStack(Material.LEATHER_BOOTS, 1));
invent.setLeggings(new ItemStack(Material.LEATHER_LEGGINGS, 1));
@@ -228,7 +236,7 @@ public class SpawnMob {
InventoryWorkaround.setItemInMainHand(invent, new ItemStack(Material.BOW, 1));
InventoryWorkaround.setItemInMainHandDropChance(invent, 0.1f);
invent.setBoots(new ItemStack(Material.GOLDEN_BOOTS, 1));
invent.setBoots(new ItemStack(GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
@@ -237,10 +245,10 @@ public class SpawnMob {
setVillager(zombie, false);
final EntityEquipment invent = zombie.getEquipment();
InventoryWorkaround.setItemInMainHand(invent, new ItemStack(Material.GOLDEN_SWORD, 1));
InventoryWorkaround.setItemInMainHand(invent, new ItemStack(GOLDEN_SWORD, 1));
InventoryWorkaround.setItemInMainHandDropChance(invent, 0.1f);
invent.setBoots(new ItemStack(Material.GOLDEN_BOOTS, 1));
invent.setBoots(new ItemStack(GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
@@ -249,7 +257,7 @@ public class SpawnMob {
setVillager(zombie, false);
final EntityEquipment invent = zombie.getEquipment();
invent.setBoots(new ItemStack(Material.GOLDEN_BOOTS, 1));
invent.setBoots(new ItemStack(GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
@@ -2,7 +2,9 @@ package com.earth2me.essentials;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.LocationUtil;
import io.papermc.lib.PaperLib;
import net.ess3.api.IEssentials;
import net.ess3.api.ITeleport;
import net.ess3.api.IUser;
import net.ess3.api.events.UserWarpEvent;
import org.bukkit.Bukkit;
@@ -18,7 +20,7 @@ import java.util.GregorianCalendar;
import static com.earth2me.essentials.I18n.tl;
public class Teleport implements net.ess3.api.ITeleport {
public class Teleport implements ITeleport {
private final IUser teleportOwner;
private final IEssentials ess;
private TimedTeleport timedTeleport;
@@ -49,7 +51,7 @@ public class Teleport implements net.ess3.api.ITeleport {
final long earliestLong = earliestTime.getTimeInMillis();
// When was the last teleportPlayer used?
final Long lastTime = teleportOwner.getLastTeleportTimestamp();
final long lastTime = teleportOwner.getLastTeleportTimestamp();
if (lastTime > time.getTimeInMillis()) {
// This is to make sure time didn't get messed up on last teleportPlayer use.
@@ -124,21 +126,21 @@ public class Teleport implements net.ess3.api.ITeleport {
if (LocationUtil.isBlockUnsafeForUser(teleportee, loc.getWorld(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())) {
if (ess.getSettings().isTeleportSafetyEnabled()) {
if (ess.getSettings().isForceDisableTeleportSafety()) {
teleportee.getBase().teleport(loc, cause);
PaperLib.teleportAsync(teleportee.getBase(), loc, cause);
} else {
teleportee.getBase().teleport(LocationUtil.getSafeDestination(ess, teleportee, loc), cause);
PaperLib.teleportAsync(teleportee.getBase(), LocationUtil.getSafeDestination(ess, teleportee, loc), cause);
}
} else {
throw new Exception(tl("unsafeTeleportDestination", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
}
} else {
if (ess.getSettings().isForceDisableTeleportSafety()) {
teleportee.getBase().teleport(loc, cause);
PaperLib.teleportAsync(teleportee.getBase(), loc, cause);
} else {
if (ess.getSettings().isTeleportToCenterLocation()) {
loc = LocationUtil.getRoundedDestination(loc);
}
teleportee.getBase().teleport(loc, cause);
PaperLib.teleportAsync(teleportee.getBase(), loc, cause);
}
}
}
@@ -231,7 +233,7 @@ public class Teleport implements net.ess3.api.ITeleport {
initTimer((long) (delay * 1000.0), teleportOwner, null, chargeFor, cause, true);
}
protected void respawnNow(IUser teleportee, TeleportCause cause) throws Exception {
void respawnNow(IUser teleportee, TeleportCause cause) throws Exception {
final Player player = teleportee.getBase();
Location bed = player.getBedSpawnLocation();
if (bed != null) {
@@ -16,9 +16,9 @@ public class TimedTeleport implements Runnable {
private final IEssentials ess;
private final Teleport teleport;
private final UUID timer_teleportee;
private int timer_task = -1;
private final long timer_started; // time this task was initiated
private final long timer_delay; // how long to delay the teleportPlayer
private int timer_task;
private final long timer_started; // time this task was initiated
private final long timer_delay; // how long to delay the teleportPlayer
private double timer_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)
@@ -32,8 +32,7 @@ public class TimedTeleport implements Runnable {
private final Trade timer_chargeFor;
private final TeleportCause timer_cause;
public TimedTeleport(IUser user, IEssentials ess, Teleport teleport, long delay, IUser teleportUser, ITarget target, Trade chargeFor, TeleportCause cause, boolean respawn) {
TimedTeleport(IUser user, IEssentials ess, Teleport teleport, long delay, IUser teleportUser, ITarget target, Trade chargeFor, TeleportCause cause, boolean respawn) {
this.teleportOwner = user;
this.ess = ess;
this.teleport = teleport;
@@ -111,8 +110,7 @@ public class TimedTeleport implements Runnable {
if (timer_chargeFor != null) {
timer_chargeFor.charge(teleportOwner);
}
} catch (Exception ex) {
}
} catch (Exception ignored) {}
} catch (Exception ex) {
ess.showError(teleportOwner.getSource(), ex, "\\ teleport");
@@ -124,7 +122,7 @@ public class TimedTeleport implements Runnable {
}
//If we need to cancelTimer a pending teleportPlayer call this method
public void cancelTimer(boolean notifyUser) {
void cancelTimer(boolean notifyUser) {
if (timer_task == -1) {
return;
}
@@ -8,6 +8,7 @@ import com.earth2me.essentials.register.payment.Methods;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.FormatUtil;
import com.earth2me.essentials.utils.NumberUtil;
import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
import net.ess3.api.events.AfkStatusChangeEvent;
@@ -27,12 +28,7 @@ import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.WeakHashMap;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -224,7 +220,18 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
@Override
public Boolean canSpawnItem(final Material material) {
return !ess.getSettings().itemSpawnBlacklist().contains(material);
if (ess.getSettings().permissionBasedItemSpawn()) {
final String name = material.toString().toLowerCase(Locale.ENGLISH).replace("_", "");
if (isAuthorized("essentials.itemspawn.item-all") || isAuthorized("essentials.itemspawn.item-" + name)) return true;
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
final int id = material.getId();
if (isAuthorized("essentials.itemspawn.item-" + id)) return true;
}
}
return isAuthorized("essentials.itemspawn.exempt") || !ess.getSettings().itemSpawnBlacklist().contains(material);
}
@Override
@@ -872,7 +879,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
* Returns the {@link ItemStack} in the main hand or off-hand. If the main hand is empty then the offhand item is returned - also nullable.
*/
public ItemStack getItemInHand() {
if (ReflUtil.getNmsVersionObject().isLowerThan(ReflUtil.V1_9_R1)) {
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_9_R01)) {
return getBase().getInventory().getItemInHand();
} else {
PlayerInventory inventory = getBase().getInventory();
@@ -8,6 +8,7 @@ import com.earth2me.essentials.utils.StringUtil;
import com.google.common.base.Charsets;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
import org.bukkit.entity.Player;
import java.io.File;
import java.math.BigDecimal;
@@ -18,7 +19,7 @@ import java.util.logging.Logger;
/**
* Instead of using this api directly, we recommend to use the register plugin: http://bit.ly/RegisterMethod
* You should use Vault instead of directly using this class.
*/
public class Economy {
public Economy() {
@@ -64,7 +65,24 @@ public class Economy {
if (name == null) {
throw new RuntimeException("Economy username cannot be null");
}
return ess.getUser(name);
User user = ess.getUser(name);
if (user == null) {
/*
Attempt lookup using UUID - this prevents balance resets when accessing economy
via Vault during player join.
See: https://github.com/EssentialsX/Essentials/issues/2400
*/
Player player = ess.getServer().getPlayerExact(name);
if (player != null) {
user = ess.getUser(player.getUniqueId());
if (user != null) {
logger.info(String.format("[Economy] Found player %s by UUID %s but not by their actual name - they may have changed their username", name, player.getUniqueId().toString()));
}
}
}
return user;
}
/**
@@ -1,33 +1,163 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.NumberUtil;
import com.earth2me.essentials.utils.StringUtil;
import net.ess3.api.IEssentials;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
public interface IItemDb {
ItemStack get(final String name, final int quantity) throws Exception;
/**
* Create a stack from the given name with the given quantity.
*
* @param name Item name to look up in the database
* @param quantity Quantity of the item stack
* @return The requested item stack
* @throws Exception if the item stack cannot be created
*/
default ItemStack get(final String name, final int quantity) throws Exception {
final ItemStack stack = get(name.toLowerCase(Locale.ENGLISH));
stack.setAmount(quantity);
return stack;
}
/**
* Create a stack from the given name with the maximum stack size for that material.
*
* @param name Item name to look up in the database
* @return The requested item stack with the maximum stack size
* @throws Exception if the item stack cannot be created
*/
ItemStack get(final String name) throws Exception;
String names(ItemStack item);
/**
* Get a comma-separated string list of up to 15 aliases for the given stack.
*
* @param item Item stack whose names to find
* @return Comma-separated list of up to 15 item names
*/
default String names(ItemStack item) {
List<String> nameList = nameList(item);
if (nameList.size() > 15) {
nameList = nameList.subList(0, 14);
}
return StringUtil.joinList(", ", nameList);
};
/**
* Get a List of all aliases for the given item stack.
*
* @param item Item stack whose names to find
* @return List of all names
*/
List<String> nameList(ItemStack item);
/**
* Get the primary name for the given item stack.
*
* @param item Item stack whose name to find
* @return Primary name of the item
*/
String name(ItemStack item);
/**
* Get all stacks in a given User's inventory that matches the given arguments.
*
* @param user The user with the player inventory to search
* @param args Either an item name, or one of the following:
* hand (default), inventory/invent/all, blocks
* @return A List of all matching ItemStacks
* @throws Exception if the given args are invalid or no blocks are found
*/
List<ItemStack> getMatching(User user, String[] args) throws Exception;
/**
* Serialise an ItemStack into a format that can be decoded by
* {@link #get(String) get} and
* {@link com.earth2me.essentials.MetaItemStack#parseStringMeta(CommandSource, boolean, String[], int, IEssentials)} MetaItemStack#parseStringMeta}.
* Used to encode items for kits.
*
* @param is Stack to serialise
* @return Serialised stack
*/
String serialize(ItemStack is);
/**
* Return names recognised by the database, intended for tab-completion.
*
* @return Collection of all item names
*/
Collection<String> listNames();
/**
* Get the material matching the given legacy ID. Used for conversion from item IDs to
* modern names.
*
* @param id Legacy ID of material to find
* @return Updated material
*/
@Deprecated
Material getFromLegacyId(int id);
default Material getFromLegacyId(int id) {
return getFromLegacy(id, (byte) 0);
}
/**
* Get the legacy ID for the given material.
*
* @param material Material to look up
* @return Legacy ID of given material
* @throws Exception if the ID cannot be looked up
* @deprecated Item IDs are no longer supported.
*/
@Deprecated
int getLegacyId(Material material) throws Exception;
/**
* Convert colon syntax (eg. "13", "1:5") legacy IDs to Material. Used for conversion from
* item IDs to modern names.
*
* @param item Legacy ID in colon syntax.
* @return
*/
default Material getFromLegacy(String item) {
final String[] split = item.split(":");
final int id = Integer.parseInt(split[0]);
byte damage = 0;
if (split.length > 1 && NumberUtil.isInt(split[1])) {
damage = Byte.parseByte(split[1]);
}
return getFromLegacy(id, damage);
}
/**
* Convert legacy ID and damage value to Material. Used for conversion from item IDs to
* modern names.
*
* @param id Legacy ID
* @param damage Damage value
* @return Material
*/
default Material getFromLegacy(final int id, final byte damage) {
return MaterialUtil.convertFromLegacy(id, damage);
}
/**
* Check whether the item database is loaded and ready for use.
*
* @return Whether items have finished loading
*/
boolean isReady();
}
@@ -79,6 +79,7 @@ public class Commandafk extends EssentialsCommand {
if (!msg.isEmpty()) {
ess.broadcastMessage(user, msg);
}
user.setDisplayNick(); // Set this again after toggling
}
@Override
@@ -2,6 +2,7 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.User;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.utils.EnumUtil;
import com.google.common.collect.Lists;
import org.bukkit.Material;
import org.bukkit.Server;
@@ -15,6 +16,9 @@ import static com.earth2me.essentials.I18n.tl;
public class Commandbook extends EssentialsCommand {
private static final Material WRITABLE_BOOK = EnumUtil.getMaterial("WRITABLE_BOOK", "BOOK_AND_QUILL");
public Commandbook() {
super("book");
}
@@ -44,7 +48,7 @@ public class Commandbook extends EssentialsCommand {
}
} else {
if (isAuthor(bmeta, player) || user.isAuthorized("essentials.book.others")) {
ItemStack newItem = new ItemStack(Material.WRITABLE_BOOK, item.getAmount());
ItemStack newItem = new ItemStack(WRITABLE_BOOK, item.getAmount());
newItem.setItemMeta(bmeta);
InventoryWorkaround.setItemInMainHand(user.getBase(), newItem);
user.sendMessage(tl("editBookContents"));
@@ -52,7 +56,7 @@ public class Commandbook extends EssentialsCommand {
throw new Exception(tl("denyBookEdit"));
}
}
} else if (item.getType() == Material.WRITABLE_BOOK) {
} else if (item.getType() == WRITABLE_BOOK) {
BookMeta bmeta = (BookMeta) item.getItemMeta();
if (!user.isAuthorized("essentials.book.author")) {
bmeta.setAuthor(player);
@@ -4,7 +4,6 @@ import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.EssentialsUpgrade;
import com.earth2me.essentials.User;
import com.earth2me.essentials.UserMap;
import com.earth2me.essentials.metrics.Metrics;
import com.earth2me.essentials.utils.*;
import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
@@ -17,13 +16,15 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
import java.io.IOException;
import java.util.*;
import static com.earth2me.essentials.I18n.tl;
// This command has 4 undocumented behaviours #EasterEgg
public class Commandessentials extends EssentialsCommand {
private final Sound NOTE_HARP = EnumUtil.valueOf(Sound.class, "BLOCK_NOTE_HARP", "NOTE_PIANO");
public Commandessentials() {
super("essentials");
}
@@ -154,15 +155,9 @@ public class Commandessentials extends EssentialsCommand {
if (note == null || note.isEmpty()) {
return;
}
Sound noteHarp;
try {
noteHarp = Sound.valueOf("NOTE_PIANO"); // pre-1.9, referenced internally as note.harp
} catch (IllegalArgumentException e) {
noteHarp = Sound.valueOf("BLOCK_NOTE_HARP"); // 1.9
}
for (Player onlinePlayer : ess.getOnlinePlayers()) {
onlinePlayer.playSound(onlinePlayer.getLocation(), noteHarp, 1, noteMap.get(note));
onlinePlayer.playSound(onlinePlayer.getLocation(), NOTE_HARP, 1, noteMap.get(note));
}
}
}, 20, 2);
@@ -2,6 +2,7 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.MetaItemStack;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.NumberUtil;
import com.google.common.collect.Lists;
import org.bukkit.DyeColor;
@@ -43,8 +44,8 @@ public class Commandfirework extends EssentialsCommand {
@Override
protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception {
final ItemStack stack = user.getBase().getInventory().getItemInMainHand();
if (stack.getType() == Material.FIREWORK_ROCKET || stack.getType() == Material.FIREWORK_STAR) {
final ItemStack stack = user.getItemInHand();
if (MaterialUtil.isFirework(stack.getType())) {
if (args.length > 0) {
if (args[0].equalsIgnoreCase("clear")) {
FireworkMeta fmeta = (FireworkMeta) stack.getItemMeta();
@@ -31,9 +31,9 @@ public class Commandgive extends EssentialsCommand {
}
ItemStack stack = ess.getItemDb().get(args[1]);
final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", "");
if (sender.isPlayer() && (ess.getSettings().permissionBasedItemSpawn() ? (!ess.getUser(sender.getPlayer()).isAuthorized("essentials.itemspawn.item-all") && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.itemspawn.item-" + itemname)) : (!ess.getUser(sender.getPlayer()).isAuthorized("essentials.itemspawn.exempt") && !ess.getUser(sender.getPlayer()).canSpawnItem(stack.getType())))) {
if (sender.isPlayer() && !ess.getUser(sender.getPlayer()).canSpawnItem(stack.getType())) {
throw new Exception(tl("cantSpawnItem", itemname));
}
@@ -33,8 +33,8 @@ public class Commandhat extends EssentialsCommand {
user.sendMessage(tl("hatRemoved"));
}
} else {
if (user.getBase().getInventory().getItemInMainHand().getType() != Material.AIR) {
final ItemStack hand = user.getBase().getInventory().getItemInMainHand();
final ItemStack hand = user.getItemInHand();
if (hand != null && hand.getType() != Material.AIR) {
if (hand.getType().getMaxDurability() == 0) {
final PlayerInventory inv = user.getBase().getInventory();
final ItemStack head = inv.getHelmet();
@@ -29,9 +29,10 @@ public class Commanditem extends EssentialsCommand {
ItemStack stack = ess.getItemDb().get(args[0]);
final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", "");
if (ess.getSettings().permissionBasedItemSpawn() ? (!user.isAuthorized("essentials.itemspawn.item-all") && !user.isAuthorized("essentials.itemspawn.item-" + itemname)) : (!user.isAuthorized("essentials.itemspawn.exempt") && !user.canSpawnItem(stack.getType()))) {
if (!user.canSpawnItem(stack.getType())) {
throw new Exception(tl("cantSpawnItem", itemname));
}
try {
if (args.length > 1 && Integer.parseInt(args[1]) > 0) {
stack.setAmount(Integer.parseInt(args[1]));
@@ -1,6 +1,7 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.utils.VersionUtil;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.inventory.ItemStack;
@@ -23,7 +24,7 @@ public class Commanditemdb extends EssentialsCommand {
if (args.length < 1) {
if (sender.isPlayer() && sender.getPlayer() != null) {
itemHeld = true;
itemStack = sender.getPlayer().getInventory().getItemInMainHand();
itemStack = ess.getUser(sender.getPlayer()).getItemInHand();
}
if (itemStack == null) {
throw new NotEnoughArgumentsException();
@@ -32,7 +33,18 @@ public class Commanditemdb extends EssentialsCommand {
itemStack = ess.getItemDb().get(args[0]);
}
sender.sendMessage(tl("itemType", itemStack.getType().toString()));
String itemId = "none";
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
itemId = itemStack.getType().getId() + ":" + itemStack.getDurability();
}
sender.sendMessage(tl("itemType", itemStack.getType().toString(), itemId));
// Don't send IDs twice
if (!tl("itemType").contains("{1}") && !itemId.equals("none")) {
sender.sendMessage(tl("itemId", itemId));
}
if (itemHeld && itemStack.getType() != Material.AIR) {
int maxuses = itemStack.getType().getMaxDurability();
@@ -105,11 +105,11 @@ public class Commandmail extends EssentialsCommand {
if (u == null) {
throw new Exception(tl("playerNeverOnServer", args[1]));
}
u.addMail(tl("mailFormat", "Server", getFinalArg(args, 2)));
u.addMail(tl("mailFormat", "Server", FormatUtil.replaceFormat(getFinalArg(args, 2))));
sender.sendMessage(tl("mailSent"));
return;
} else if (args.length >= 2 && "sendall".equalsIgnoreCase(args[0])) {
ess.runTaskAsynchronously(new SendAll(tl("mailFormat", "Server", getFinalArg(args, 1))));
ess.runTaskAsynchronously(new SendAll(tl("mailFormat", "Server", FormatUtil.replaceFormat(getFinalArg(args, 1)))));
sender.sendMessage(tl("mailSent"));
return;
} else if (args.length >= 2) {
@@ -118,7 +118,7 @@ public class Commandmail extends EssentialsCommand {
if (u == null) {
throw new Exception(tl("playerNeverOnServer", args[0]));
}
u.addMail(tl("mailFormat", "Server", getFinalArg(args, 1)));
u.addMail(tl("mailFormat", "Server", FormatUtil.replaceFormat(getFinalArg(args, 1))));
sender.sendMessage(tl("mailSent"));
return;
}
@@ -16,7 +16,7 @@ public class Commandmore extends EssentialsCommand {
@Override
public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception {
final ItemStack stack = user.getBase().getInventory().getItemInMainHand();
final ItemStack stack = user.getItemInHand();
if (stack == null) {
throw new Exception(tl("cantSpawnItem", "Air"));
}
@@ -25,7 +25,7 @@ public class Commandmore extends EssentialsCommand {
throw new Exception(tl("fullStack"));
}
final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", "");
if (ess.getSettings().permissionBasedItemSpawn() ? (!user.isAuthorized("essentials.itemspawn.item-all") && !user.isAuthorized("essentials.itemspawn.item-" + itemname)) : (!user.isAuthorized("essentials.itemspawn.exempt") && !user.canSpawnItem(stack.getType()))) {
if (!user.canSpawnItem(stack.getType())) {
throw new Exception(tl("cantSpawnItem", itemname));
}
if (user.isAuthorized("essentials.oversizedstacks")) {
@@ -2,6 +2,7 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.NumberUtil;
import com.earth2me.essentials.utils.VersionUtil;
import org.bukkit.Material;
@@ -20,6 +21,11 @@ import net.ess3.nms.refl.ReflUtil;
public class Commandrecipe extends EssentialsCommand {
private static final Material FIREWORK_ROCKET = EnumUtil.getMaterial("FIREWORK_ROCKET", "FIREWORK");
private static final Material FIREWORK_STAR = EnumUtil.getMaterial("FIREWORK_STAR", "FIREWORK_CHARGE");
private static final Material GUNPOWDER = EnumUtil.getMaterial("GUNPOWDER", "SULPHUR");
public Commandrecipe() {
super("recipe");
}
@@ -67,11 +73,11 @@ public class Commandrecipe extends EssentialsCommand {
} else if (selectedRecipe instanceof ShapedRecipe) {
shapedRecipe(sender, (ShapedRecipe) selectedRecipe, sender.isPlayer());
} else if (selectedRecipe instanceof ShapelessRecipe) {
if (recipesOfType.size() == 1 && (itemType.getType() == Material.FIREWORK_ROCKET || itemType.getType() == Material.FIREWORK_STAR)) {
if (recipesOfType.size() == 1 && (itemType.getType() == FIREWORK_ROCKET)) {
ShapelessRecipe shapelessRecipe = new ShapelessRecipe(itemType);
shapelessRecipe.addIngredient(Material.LEGACY_SULPHUR);
shapelessRecipe.addIngredient(GUNPOWDER);
shapelessRecipe.addIngredient(Material.PAPER);
shapelessRecipe.addIngredient(Material.FIREWORK_ROCKET);
shapelessRecipe.addIngredient(FIREWORK_STAR);
shapelessRecipe(sender, shapelessRecipe, sender.isPlayer());
} else {
shapelessRecipe(sender, (ShapelessRecipe) selectedRecipe, sender.isPlayer());
@@ -4,6 +4,7 @@ import com.earth2me.essentials.ChargeException;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.StringUtil;
import com.earth2me.essentials.utils.VersionUtil;
import com.google.common.collect.Lists;
import net.ess3.api.IUser;
import org.bukkit.Material;
@@ -38,7 +39,7 @@ public class Commandrepair extends EssentialsCommand {
}
public void repairHand(User user) throws Exception {
final ItemStack item = user.getBase().getInventory().getItemInMainHand();
final ItemStack item = user.getItemInHand();
if (item == null || item.getType().isBlock() || item.getDurability() == 0) {
throw new Exception(tl("repairInvalidType"));
}
@@ -48,7 +49,7 @@ public class Commandrepair extends EssentialsCommand {
}
final String itemName = item.getType().toString().toLowerCase(Locale.ENGLISH);
final Trade charge = new Trade("repair-" + itemName.replace('_', '-'), new Trade("repair-item", ess), ess);
final Trade charge = getCharge(item.getType());
charge.isAffordableFor(user);
@@ -95,7 +96,8 @@ public class Commandrepair extends EssentialsCommand {
}
final String itemName = item.getType().toString().toLowerCase(Locale.ENGLISH);
final Trade charge = new Trade("repair-" + itemName.replace('_', '-'), new Trade("repair-item", ess), ess);
final Trade charge = getCharge(item.getType());
try {
charge.isAffordableFor(user);
} catch (ChargeException ex) {
@@ -120,6 +122,16 @@ public class Commandrepair extends EssentialsCommand {
}
}
private Trade getCharge(final Material material) {
final String itemName = material.toString().toLowerCase(Locale.ENGLISH);
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
final int itemId = material.getId();
return new Trade("repair-" + itemName.replace('_', '-'), new Trade("repair-" + itemId, new Trade("repair-item", ess), ess), ess);
} else {
return new Trade("repair-" + itemName.replace('_', '-'), new Trade("repair-item", ess), ess);
}
}
@Override
protected List<String> getTabCompleteOptions(Server server, User user, String commandLabel, String[] args) {
if (args.length == 1) {
@@ -2,6 +2,8 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.User;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.MaterialUtil;
import com.google.common.collect.Lists;
import org.bukkit.Material;
import org.bukkit.Server;
@@ -14,6 +16,9 @@ import java.util.List;
import static com.earth2me.essentials.I18n.tl;
public class Commandskull extends EssentialsCommand {
private static final Material SKULL_ITEM = EnumUtil.getMaterial("PLAYER_HEAD", "SKULL_ITEM");
public Commandskull() {
super("skull");
}
@@ -31,14 +36,14 @@ public class Commandskull extends EssentialsCommand {
owner = user.getName();
}
ItemStack itemSkull = user.getBase().getInventory().getItemInMainHand();
ItemStack itemSkull = user.getItemInHand();
SkullMeta metaSkull = null;
boolean spawn = false;
if (itemSkull != null && itemSkull.getType() == Material.LEGACY_SKULL_ITEM && itemSkull.getDurability() == 3) {
if (itemSkull != null && MaterialUtil.isPlayerHead(itemSkull.getType(), itemSkull.getDurability())) {
metaSkull = (SkullMeta) itemSkull.getItemMeta();
} else if (user.isAuthorized("essentials.skull.spawn")) {
itemSkull = new ItemStack(Material.LEGACY_SKULL_ITEM, 1, (byte) 3);
itemSkull = new ItemStack(SKULL_ITEM, 1, (byte) 3);
metaSkull = (SkullMeta) itemSkull.getItemMeta();
spawn = true;
} else {
@@ -13,9 +13,9 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import static com.earth2me.essentials.I18n.tl;
@@ -64,17 +64,8 @@ public class Commandwarp extends EssentialsCommand {
//TODO: Use one of the new text classes, like /help ?
private void warpList(final CommandSource sender, final String[] args, final IUser user) throws Exception {
final IWarps warps = ess.getWarps();
final List<String> warpNameList = new ArrayList<>(warps.getList());
final List<String> warpNameList = getAvailableWarpsFor(user);
if (user != null) {
final Iterator<String> iterator = warpNameList.iterator();
while (iterator.hasNext()) {
final String warpName = iterator.next();
if (ess.getSettings().getPerWarpPermission() && !user.isAuthorized("essentials.warps." + warpName)) {
iterator.remove();
}
}
}
if (warpNameList.isEmpty()) {
throw new Exception(tl("noWarpsDefined"));
}
@@ -112,10 +103,20 @@ public class Commandwarp extends EssentialsCommand {
owner.getTeleport().warp(user, name, charge, TeleportCause.COMMAND);
}
private List<String> getAvailableWarpsFor(final IUser user) {
if (ess.getSettings().getPerWarpPermission() && user != null) {
return ess.getWarps().getList().stream()
.filter(warpName -> user.isAuthorized("essentials.warps." + warpName))
.collect(Collectors.toList());
}
return new ArrayList<>(ess.getWarps().getList());
}
@Override
protected List<String> getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) {
if (args.length == 1 && user.isAuthorized("essentials.warp.list")) {
return new ArrayList<>(ess.getWarps().getList());
return getAvailableWarpsFor(user);
} else if (args.length == 2 && (user.isAuthorized("essentials.warp.otherplayers") || user.isAuthorized("essentials.warp.others"))) {
//TODO: Remove 'otherplayers' permission.
return getPlayers(server, user);
@@ -17,13 +17,12 @@ import static com.earth2me.essentials.I18n.tl;
public class Commandwhois extends EssentialsCommand {
private final Statistic playOneTick;
// For some reason, in 1.13 PLAY_ONE_MINUTE = ticks played = what used to be PLAY_ONE_TICK
// https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/b848d8ce633871b52115247b089029749c02f579
private static final Statistic PLAY_ONE_TICK = EnumUtil.getStatistic("PLAY_ONE_MINUTE", "PLAY_ONE_TICK");
public Commandwhois() {
super("whois");
// For some reason, in 1.13 PLAY_ONE_MINUTE = ticks played
// https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/b848d8ce633871b52115247b089029749c02f579
playOneTick = EnumUtil.getStatistic("PLAY_ONE_MINUTE", "PLAY_ONE_TICK");
}
@Override
@@ -42,7 +41,7 @@ public class Commandwhois extends EssentialsCommand {
sender.sendMessage(tl("whoisHunger", user.getBase().getFoodLevel(), user.getBase().getSaturation()));
sender.sendMessage(tl("whoisExp", SetExpFix.getTotalExperience(user.getBase()), user.getBase().getLevel()));
sender.sendMessage(tl("whoisLocation", user.getLocation().getWorld().getName(), user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ()));
long playtimeMs = System.currentTimeMillis() - (user.getBase().getStatistic(playOneTick) * 50);
long playtimeMs = System.currentTimeMillis() - (user.getBase().getStatistic(PLAY_ONE_TICK) * 50);
sender.sendMessage(tl("whoisPlaytime", DateUtil.formatDateDiff(playtimeMs)));
if (!ess.getSettings().isEcoDisabled()) {
sender.sendMessage(tl("whoisMoney", NumberUtil.displayCurrency(user.getMoney(), ess)));
@@ -137,6 +137,21 @@ public class FakeWorld implements World {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isChunkForceLoaded(int x, int z) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setChunkForceLoaded(int x, int z, boolean forced) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Collection<Chunk> getForceLoadedChunks() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Item dropItem(Location lctn, ItemStack is) {
throw new UnsupportedOperationException("Not supported yet.");
@@ -164,7 +179,7 @@ public class FakeWorld implements World {
@Override
public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) {
return false;
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
@@ -1,9 +1,13 @@
package com.earth2me.essentials.items;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.IConf;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.StringUtil;
import com.earth2me.essentials.utils.VersionUtil;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.FireworkEffect;
import org.bukkit.Material;
import org.bukkit.block.Banner;
@@ -23,12 +27,7 @@ import static com.earth2me.essentials.I18n.tl;
public abstract class AbstractItemDb implements IConf, net.ess3.api.IItemDb {
@Override
public ItemStack get(final String id, final int quantity) throws Exception {
final ItemStack retval = get(id.toLowerCase(Locale.ENGLISH));
retval.setAmount(quantity);
return retval;
}
protected boolean ready = false;
@Override
public List<ItemStack> getMatching(User user, String[] args) throws Exception {
@@ -63,20 +62,10 @@ public abstract class AbstractItemDb implements IConf, net.ess3.api.IItemDb {
return is;
}
@Override
public String names(ItemStack item) {
List<String> nameList = nameList(item);
if (nameList.size() > 15) {
nameList = nameList.subList(0, 14);
}
return StringUtil.joinList(", ", nameList);
}
@Override
public String serialize(ItemStack is) {
String mat = is.getType().name();
if (is.getData().getData() != 0) {
String mat = name(is);
if (VersionUtil.getServerBukkitVersion().isLowerThanOrEqualTo(VersionUtil.v1_12_2_R01) && is.getData().getData() != 0) {
mat = mat + ":" + is.getData().getData();
}
int quantity = is.getAmount();
@@ -125,7 +114,9 @@ public abstract class AbstractItemDb implements IConf, net.ess3.api.IItemDb {
}
}
switch (is.getType()) {
final Material material = is.getType();
switch (material) {
case WRITTEN_BOOK:
// Everything from http://wiki.ess3.net/wiki/Item_Meta#Books in that order.
// Interesting as I didn't see a way to do pages or chapters.
@@ -144,106 +135,100 @@ public abstract class AbstractItemDb implements IConf, net.ess3.api.IItemDb {
sb.append(e.getName().toLowerCase()).append(":").append(enchantmentStorageMeta.getStoredEnchantLevel(e)).append(" ");
}
break;
case FIREWORK_ROCKET:
case FIREWORK_STAR:
// Everything from http://wiki.ess3.net/wiki/Item_Meta#Fireworks in that order.
FireworkMeta fireworkMeta = (FireworkMeta) is.getItemMeta();
if (fireworkMeta.hasEffects()) {
for (FireworkEffect effect : fireworkMeta.getEffects()) {
if (effect.getColors() != null && !effect.getColors().isEmpty()) {
sb.append("color:");
boolean first = true;
for (Color c : effect.getColors()) {
if (!first) {
sb.append(","); // same thing as above.
}
sb.append(c.toString());
first = false;
}
sb.append(" ");
}
}
sb.append("shape: ").append(effect.getType().name()).append(" ");
if (effect.getFadeColors() != null && !effect.getFadeColors().isEmpty()) {
sb.append("fade:");
boolean first = true;
for (Color c : effect.getFadeColors()) {
if (!first) {
sb.append(","); // same thing as above.
}
sb.append(c.toString());
first = false;
if (MaterialUtil.isFirework(material)) {
// Everything from http://wiki.ess3.net/wiki/Item_Meta#Fireworks in that order.
FireworkMeta fireworkMeta = (FireworkMeta) is.getItemMeta();
if (fireworkMeta.hasEffects()) {
for (FireworkEffect effect : fireworkMeta.getEffects()) {
if (effect.getColors() != null && !effect.getColors().isEmpty()) {
sb.append("color:");
boolean first = true;
for (Color c : effect.getColors()) {
if (!first) {
sb.append(","); // same thing as above.
}
sb.append(" ");
sb.append(c.toString());
first = false;
}
sb.append(" ");
}
sb.append("shape:").append(effect.getType().name()).append(" ");
if (effect.getFadeColors() != null && !effect.getFadeColors().isEmpty()) {
sb.append("fade:");
boolean first = true;
for (Color c : effect.getFadeColors()) {
if (!first) {
sb.append(","); // same thing as above.
}
sb.append(c.toString());
first = false;
}
sb.append(" ");
}
sb.append("power: ").append(fireworkMeta.getPower()).append(" ");
}
break;
case POTION:
Potion potion = Potion.fromItemStack(is);
for (PotionEffect e : potion.getEffects()) {
// long but needs to be effect:speed power:2 duration:120 in that order.
sb.append("splash:").append(potion.isSplash()).append(" ").append("effect:").append(e.getType().getName().toLowerCase()).append(" ").append("power:").append(e.getAmplifier()).append(" ").append("duration:").append(e.getDuration() / 20).append(" ");
sb.append("power:").append(fireworkMeta.getPower()).append(" ");
}
} else if (MaterialUtil.isPotion(material)) {
Potion potion = Potion.fromItemStack(is);
for (PotionEffect e : potion.getEffects()) {
// long but needs to be effect:speed power:2 duration:120 in that order.
sb.append("splash:").append(potion.isSplash()).append(" ").append("effect:").append(e.getType().getName().toLowerCase()).append(" ").append("power:").append(e.getAmplifier()).append(" ").append("duration:").append(e.getDuration() / 20).append(" ");
}
} else if (MaterialUtil.isPlayerHead(material, is.getData().getData())) {
// item stack with meta
SkullMeta skullMeta = (SkullMeta) is.getItemMeta();
if (skullMeta != null && skullMeta.hasOwner()) {
sb.append("player:").append(skullMeta.getOwner()).append(" ");
}
} else if (MaterialUtil.isBanner(material)) {
if (material.toString().contains("SHIELD")) {
// Hacky fix for accessing Shield meta - https://github.com/drtshock/Essentials/pull/745#issuecomment-234843795
BlockStateMeta shieldMeta = (BlockStateMeta) is.getItemMeta();
Banner shieldBannerMeta = (Banner) shieldMeta.getBlockState();
DyeColor baseDyeColor = shieldBannerMeta.getBaseColor();
if (baseDyeColor != null) {
int basecolor = baseDyeColor.getColor().asRGB();
sb.append("basecolor:").append(basecolor).append(" ");
}
break;
case SKELETON_SKULL:
case WITHER_SKELETON_SKULL:
// item stack with meta
SkullMeta skullMeta = (SkullMeta) is.getItemMeta();
if (skullMeta != null && skullMeta.hasOwner()) {
sb.append("player:").append(skullMeta.getOwner()).append(" ");
for (org.bukkit.block.banner.Pattern p : shieldBannerMeta.getPatterns()) {
String type = p.getPattern().getIdentifier();
int color = p.getColor().getColor().asRGB();
sb.append(type).append(",").append(color).append(" ");
}
break;
case LEATHER_HELMET:
case LEATHER_CHESTPLATE:
case LEATHER_LEGGINGS:
case LEATHER_BOOTS:
LeatherArmorMeta leatherArmorMeta = (LeatherArmorMeta) is.getItemMeta();
int rgb = leatherArmorMeta.getColor().asRGB();
sb.append("color:").append(rgb).append(" ");
break;
case BLACK_BANNER:
case BLUE_BANNER:
case BROWN_BANNER:
case CYAN_BANNER:
case GRAY_BANNER:
case GREEN_BANNER:
case LIGHT_BLUE_BANNER:
case LIGHT_GRAY_BANNER:
case LIME_BANNER:
case MAGENTA_BANNER:
case ORANGE_BANNER:
case PINK_BANNER:
case PURPLE_BANNER:
case RED_BANNER:
case WHITE_BANNER:
case YELLOW_BANNER:
} else {
BannerMeta bannerMeta = (BannerMeta) is.getItemMeta();
if (bannerMeta != null) {
int basecolor = bannerMeta.getBaseColor().getColor().asRGB();
sb.append("basecolor:").append(basecolor).append(" ");
DyeColor baseDyeColor = bannerMeta.getBaseColor();
if (baseDyeColor == null) {
baseDyeColor = MaterialUtil.getColorOf(material);
}
if (baseDyeColor != null) {
int basecolor = baseDyeColor
.getColor()
.asRGB();
sb.append("basecolor:").append(basecolor).append(" ");
}
for (org.bukkit.block.banner.Pattern p : bannerMeta.getPatterns()) {
String type = p.getPattern().getIdentifier();
int color = p.getColor().getColor().asRGB();
sb.append(type).append(",").append(color).append(" ");
}
}
break;
case SHIELD:
// Hacky fix for accessing Shield meta - https://github.com/drtshock/Essentials/pull/745#issuecomment-234843795
BlockStateMeta shieldMeta = (BlockStateMeta) is.getItemMeta();
Banner shieldBannerMeta = (Banner) shieldMeta.getBlockState();
int basecolor = shieldBannerMeta.getBaseColor().getColor().asRGB();
sb.append("basecolor:").append(basecolor).append(" ");
for (org.bukkit.block.banner.Pattern p : shieldBannerMeta.getPatterns()) {
String type = p.getPattern().getIdentifier();
int color = p.getColor().getColor().asRGB();
sb.append(type).append(",").append(color).append(" ");
}
break;
}
} else if (MaterialUtil.isLeatherArmor(material)) {
LeatherArmorMeta leatherArmorMeta = (LeatherArmorMeta) is.getItemMeta();
int rgb = leatherArmorMeta.getColor().asRGB();
sb.append("color:").append(rgb).append(" ");
}
return sb.toString().trim().replaceAll("§", "&");
}
@Override
public boolean isReady() {
return ready;
}
}
@@ -1,17 +1,18 @@
package com.earth2me.essentials.items;
import com.earth2me.essentials.ManagedFile;
import com.earth2me.essentials.utils.MaterialUtil;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import net.ess3.api.IEssentials;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.inventory.meta.Repairable;
import org.bukkit.potion.PotionData;
import java.util.*;
@@ -23,10 +24,8 @@ import static com.earth2me.essentials.I18n.tl;
public class FlatItemDb extends AbstractItemDb {
protected static final Logger LOGGER = Logger.getLogger("Essentials");
private final transient IEssentials ess;
private static Gson gson = new Gson();
private final transient IEssentials ess;
// Maps primary name to ItemData
private final transient Map<String, ItemData> items = new HashMap<>();
@@ -56,13 +55,16 @@ public class FlatItemDb extends AbstractItemDb {
this.reset();
String json = file.getLines().stream()
.filter(line -> !line.startsWith("#"))
.collect(Collectors.joining());
.filter(line -> !line.startsWith("#"))
.collect(Collectors.joining());
this.loadJSON(String.join("\n", json));
ready = true;
}
private void reset() {
ready = false;
items.clear();
itemAliases.clear();
allAliases.clear();
@@ -97,7 +99,8 @@ public class FlatItemDb extends AbstractItemDb {
}
@Override
public ItemStack get(final String id) throws Exception {
public ItemStack get(String id) throws Exception {
id = id.toLowerCase();
final String[] split = id.split(":");
ItemData data = getByName(split[0]);
@@ -106,12 +109,14 @@ public class FlatItemDb extends AbstractItemDb {
throw new Exception(tl("unknownItemName", id));
}
PotionData potionData = data.getPotionData();
Material material = data.getMaterial();
if (!material.isItem()) throw new Exception(tl("unableToSpawnItem", id));
ItemStack stack = new ItemStack(material);
stack.setAmount(material.getMaxStackSize());
PotionData potionData = data.getPotionData();
ItemMeta meta = stack.getItemMeta();
if (potionData != null && meta instanceof PotionMeta) {
@@ -128,6 +133,13 @@ public class FlatItemDb extends AbstractItemDb {
stack.setItemMeta(meta);
// The spawner provider will update the meta again, so we need to call it after
// setItemMeta to prevent a race condition
EntityType entity = data.getEntity();
if (entity != null && material.toString().contains("SPAWNER")) {
ess.getSpawnerProvider().setEntityType(stack, entity);
}
return stack;
}
@@ -159,14 +171,7 @@ public class FlatItemDb extends AbstractItemDb {
@Override
public String name(ItemStack item) {
Material type = item.getType();
PotionData potion = null;
if ((type.name().contains("POTION") || type.name().equals("TIPPED_ARROW")) && item.getItemMeta() instanceof PotionMeta) {
potion = ((PotionMeta) item.getItemMeta()).getBasePotionData();
}
ItemData data = new ItemData(type, potion);
ItemData data = lookup(item);
for (Map.Entry<String, ItemData> entry : items.entrySet()) {
if (entry.getValue().equals(data)) {
@@ -179,14 +184,22 @@ public class FlatItemDb extends AbstractItemDb {
@Override
@Deprecated
public Material getFromLegacyId(int id) {
throw new UnsupportedOperationException("Legacy IDs aren't supported on this version of EssentialsX.");
public int getLegacyId(Material material) throws Exception {
throw new UnsupportedOperationException("Legacy IDs aren't supported on this version.");
}
@Override
@Deprecated
public int getLegacyId(Material material) throws Exception {
throw new UnsupportedOperationException("Legacy IDs aren't supported on this version of EssentialsX.");
public ItemData lookup(ItemStack item) {
Material type = item.getType();
if (MaterialUtil.isPotion(type) && item.getItemMeta() instanceof PotionMeta) {
PotionData potion = ((PotionMeta) item.getItemMeta()).getBasePotionData();
return new ItemData(type, potion);
} else if (type.toString().contains("SPAWNER")) {
EntityType entity = ess.getSpawnerProvider().getEntityType(item);
return new ItemData(type, entity);
} else {
return new ItemData(type);
}
}
@Override
@@ -195,15 +208,24 @@ public class FlatItemDb extends AbstractItemDb {
}
public static class ItemData {
private String itemName;
private Material material;
private PotionData potionData;
private final Material material;
private PotionData potionData = null;
private EntityType entity = null;
public ItemData(Material material) {
this.material = material;
}
public ItemData(Material material, PotionData potionData) {
this.material = material;
this.potionData = potionData;
}
public ItemData(Material material, EntityType entity) {
this.material = material;
this.entity = entity;
}
@Override
public int hashCode() {
return (31 * material.hashCode()) ^ potionData.hashCode();
@@ -218,11 +240,7 @@ public class FlatItemDb extends AbstractItemDb {
return false;
}
ItemData that = (ItemData) o;
return this.material == that.getMaterial() && potionDataEquals(that);
}
public String getItemName() {
return itemName;
return this.material == that.getMaterial() && potionDataEquals(that) && entityEquals(that);
}
public Material getMaterial() {
@@ -233,6 +251,10 @@ public class FlatItemDb extends AbstractItemDb {
return this.potionData;
}
public EntityType getEntity() {
return this.entity;
}
private boolean potionDataEquals(ItemData o) {
if (this.potionData == null && o.getPotionData() == null) {
return true;
@@ -242,5 +264,15 @@ public class FlatItemDb extends AbstractItemDb {
return false;
}
}
private boolean entityEquals(ItemData o) {
if (this.entity == null && o.getEntity() == null) { // neither have an entity
return true;
} else if (this.entity != null && o.getEntity() != null) { // both have an entity; check if it's the same one
return this.entity.equals(o.getEntity());
} else { // one has an entity but the other doesn't, so they can't be equal
return false;
}
}
}
}
@@ -44,6 +44,7 @@ public class LegacyItemDb extends AbstractItemDb {
return;
}
ready = false;
durabilities.clear();
items.clear();
names.clear();
@@ -90,18 +91,13 @@ public class LegacyItemDb extends AbstractItemDb {
continue;
}
Material material = Material.matchMaterial(itemName);
if (material == null) {
LOGGER.warning(String.format("Failed to find material for %s", itemName));
continue;
}
durabilities.put(itemName, data);
items.put(itemName, numeric);
if (nbt != null) {
nbtData.put(itemName, nbt);
}
ItemData itemData = new ItemData(material, numeric, data);
ItemData itemData = new ItemData(numeric, data);
if (names.containsKey(itemData)) {
List<String> nameList = names.get(itemData);
nameList.add(itemName);
@@ -120,6 +116,8 @@ public class LegacyItemDb extends AbstractItemDb {
}
LOGGER.info(String.format("Loaded %s items from items.csv.", listNames().size()));
ready = true;
}
@Override
@@ -152,6 +150,13 @@ public class LegacyItemDb extends AbstractItemDb {
}
}
if (itemid < 1) {
Material matFromName = EnumUtil.getMaterial(itemname.toUpperCase());
if (matFromName != null) {
itemid = matFromName.getId();
}
}
if (itemid < 1) {
throw new Exception(tl("unknownItemName", itemname));
}
@@ -161,7 +166,7 @@ public class LegacyItemDb extends AbstractItemDb {
throw new Exception(tl("unknownItemId", itemid));
}
Material mat = data.getMaterial();
Material mat = getFromLegacy(itemid, (byte) metaData);
ItemStack retval = new ItemStack(mat);
if (nbtData.containsKey(itemname)) {
String nbt = nbtData.get(itemname);
@@ -198,10 +203,10 @@ public class LegacyItemDb extends AbstractItemDb {
@Override
public List<String> nameList(ItemStack item) {
ItemData itemData = new ItemData(item.getType(), item.getDurability());
ItemData itemData = new ItemData(item.getType().getId(), item.getDurability());
List<String> nameList = names.get(itemData);
if (nameList == null) {
itemData = new ItemData(item.getType(), (short) 0);
itemData = new ItemData(item.getType().getId(), (short) 0);
nameList = names.get(itemData);
if (nameList == null) {
return null;
@@ -213,10 +218,10 @@ public class LegacyItemDb extends AbstractItemDb {
@Override
public String name(ItemStack item) {
ItemData itemData = new ItemData(item.getType(), item.getDurability());
ItemData itemData = new ItemData(item.getType().getId(), item.getDurability());
String name = primaryName.get(itemData);
if (name == null) {
itemData = new ItemData(item.getType(), (short) 0);
itemData = new ItemData(item.getType().getId(), (short) 0);
name = primaryName.get(itemData);
if (name == null) {
return null;
@@ -225,16 +230,6 @@ public class LegacyItemDb extends AbstractItemDb {
return name;
}
@Override
public Material getFromLegacyId(int id) {
ItemData data = this.legacyIds.get(id);
if(data == null) {
return null;
}
return data.getMaterial();
}
@Override
public int getLegacyId(Material material) throws Exception {
for(Map.Entry<String, Integer> entry : items.entrySet()) {
@@ -252,29 +247,16 @@ public class LegacyItemDb extends AbstractItemDb {
}
static class ItemData {
final private Material material;
private int legacyId;
private int itemNo;
final private short itemData;
ItemData(Material material, short itemData) {
this.material = material;
ItemData(final int itemNo, final short itemData) {
this.itemNo = itemNo;
this.itemData = itemData;
}
@Deprecated
ItemData(Material material, final int legacyId, final short itemData) {
this.material = material;
this.legacyId = legacyId;
this.itemData = itemData;
}
public Material getMaterial() {
return material;
}
@Deprecated
public int getItemNo() {
return legacyId;
return itemNo;
}
public short getItemData() {
@@ -283,7 +265,7 @@ public class LegacyItemDb extends AbstractItemDb {
@Override
public int hashCode() {
return (31 * material.hashCode()) ^ itemData;
return (31 * itemNo) ^ itemData;
}
@Override
@@ -295,7 +277,7 @@ public class LegacyItemDb extends AbstractItemDb {
return false;
}
ItemData pairo = (ItemData) o;
return this.material == pairo.getMaterial() && this.itemData == pairo.getItemData();
return this.itemNo == pairo.getItemNo() && this.itemData == pairo.getItemData();
}
}
@@ -2,7 +2,6 @@ package com.earth2me.essentials.messaging;
import static com.earth2me.essentials.I18n.tl;
import com.earth2me.essentials.Console;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.IUser;
import com.earth2me.essentials.User;
@@ -189,7 +189,7 @@ public class Metrics {
public JSONObject getPluginData() {
JSONObject data = new JSONObject();
String pluginName = "EssentialsX";
String pluginName = plugin.getDescription().getName().replace("Essentials", "EssentialsX");
String pluginVersion = plugin.getDescription().getVersion();
data.put("pluginName", pluginName); // Append the name of the plugin
@@ -13,7 +13,7 @@ public class PermissionsHandler implements IPermissionsHandler {
private transient IPermissionsHandler handler = null;
private transient String defaultGroup = "default";
private final transient Essentials ess;
private transient boolean useSuperperms = false;
private transient boolean useSuperperms;
private Class<?> lastHandler = null;
@@ -92,10 +92,7 @@ public class PermissionsHandler implements IPermissionsHandler {
public void checkPermissions() {
// load and assign a handler
List<Class<? extends SuperpermsHandler>> providerClazz = Arrays.asList(
BPermissions2Handler.class,
PermissionsExHandler.class,
PrivilegesHandler.class,
SimplyPermsHandler.class,
GenericVaultHandler.class,
SuperpermsHandler.class
);
@@ -158,7 +155,4 @@ public class PermissionsHandler implements IPermissionsHandler {
}
}
private void checkPermLag(long start) {
checkPermLag(start, "not defined");
}
}
@@ -13,7 +13,7 @@ public abstract class AbstractVaultHandler extends SuperpermsHandler {
protected static Permission perms = null;
protected static Chat chat = null;
public boolean setupProviders() {
private boolean setupProviders() {
try {
Class.forName("net.milkbowl.vault.permission.Permission");
Class.forName("net.milkbowl.vault.chat.Chat");
@@ -65,7 +65,7 @@ public abstract class AbstractVaultHandler extends SuperpermsHandler {
}
}
protected boolean canLoad() {
boolean canLoad() {
if (Bukkit.getPluginManager().getPlugin("Vault") == null) return false;
try {
return setupProviders();
@@ -1,17 +0,0 @@
package com.earth2me.essentials.perm.impl;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class BPermissions2Handler extends AbstractVaultHandler {
@Override
public boolean canBuild(final Player base, final String group) {
return hasPermission(base, "bPermissions.build");
}
@Override
public boolean tryProvider() {
return super.canLoad() && Bukkit.getPluginManager().getPlugin("bPermissions") != null;
}
}
@@ -1,16 +0,0 @@
package com.earth2me.essentials.perm.impl;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class PrivilegesHandler extends AbstractVaultHandler {
@Override
public boolean canBuild(Player base, String group) {
return hasPermission(base, "privileges.build");
}
@Override
public boolean tryProvider() {
return super.canLoad() && Bukkit.getPluginManager().getPlugin("Privileges") != null;
}
}
@@ -1,16 +0,0 @@
package com.earth2me.essentials.perm.impl;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class SimplyPermsHandler extends AbstractVaultHandler {
@Override
public boolean canBuild(Player base, String group) {
return hasPermission(base, "permissions.allow.build");
}
@Override
public boolean tryProvider() {
return super.canLoad() && Bukkit.getPluginManager().getPlugin("SimplyPerms") != null;
}
}
@@ -5,10 +5,10 @@ import org.bukkit.plugin.Plugin;
/**
* Interface to be implemented by a payment method.
* Copyright (C) 2011
* AOL license <http://aol.nexua.org>
*
* @author Nijikokun <nijikokun@shortmail.com> (@nijikokun)
* @copyright Copyright (C) 2011
* @license AOL license <http://aol.nexua.org>
*/
public interface Method {
/**
@@ -22,7 +22,7 @@ import java.util.Set;
* preferred: "iConomy"
* </pre></blockquote>
*
* @author: Nijikokun <nijikokun@shortmail.com> (@nijikokun) @copyright: Copyright (C) 2011 @license: AOL license
* @author Nijikokun <nijikokun@shortmail.com> (@nijikokun) @copyright: Copyright (C) 2011 @license: AOL license
* <http://aol.nexua.org>
*/
public class Methods {
@@ -30,9 +30,9 @@ public class Methods {
private static boolean self = false;
private static Method Method = null;
private static String preferred = "";
private static final Set<Method> Methods = new HashSet<Method>();
private static final Set<String> Dependencies = new HashSet<String>();
private static final Set<Method> Attachables = new HashSet<Method>();
private static final Set<Method> Methods = new HashSet<>();
private static final Set<String> Dependencies = new HashSet<>();
private static final Set<Method> Attachables = new HashSet<>();
static {
_init();
@@ -79,7 +79,7 @@ public class Methods {
*
* @return <code>Set<String></code> - Array of payment methods that are loaded.
*
* @see #setMethod(org.bukkit.plugin.Plugin)
* @see #setMethod(PluginManager)
*/
public static Set<String> getDependencies() {
return Dependencies;
@@ -114,8 +114,8 @@ public class Methods {
*
* @return <code>boolean</code>
*
* @see #setMethod(org.bukkit.plugin.Plugin)
* @see #checkDisabled(org.bukkit.plugin.Plugin)
* @see #setMethod(PluginManager)
* @see #checkDisabled(Plugin)
*/
public static boolean hasMethod() {
return (Method != null);
@@ -124,7 +124,7 @@ public class Methods {
/**
* Checks Plugin Class against a multitude of checks to verify it's usability as a payment method.
*
* @param <code>PluginManager</code> the plugin manager for the server
* @param manager the plugin manager for the server
*
* @return <code>boolean</code> True on success, False on failure.
*/
@@ -140,7 +140,7 @@ public class Methods {
int count = 0;
boolean match = false;
Plugin plugin = null;
Plugin plugin;
for (String name : getDependencies()) {
if (hasMethod()) {
@@ -1,18 +1,17 @@
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;
public class VaultEco implements Method {
private Vault vault;
private Plugin vault;
private Economy economy;
@Override
public Vault getPlugin() {
public Plugin getPlugin() {
return this.vault;
}
@@ -108,17 +107,15 @@ public class VaultEco implements Method {
public boolean isCompatible(Plugin plugin) {
try {
RegisteredServiceProvider<Economy> ecoPlugin = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
return plugin instanceof Vault && ecoPlugin != null && !ecoPlugin.getProvider().getName().equals("Essentials Economy");
} catch (LinkageError e) {
return false;
} catch (Exception e) {
return plugin.getName().equals("Vault") && ecoPlugin != null && !ecoPlugin.getProvider().getName().equals("Essentials Economy");
} catch (LinkageError | Exception e) {
return false;
}
}
@Override
public void setPlugin(Plugin plugin) {
this.vault = (Vault) plugin;
this.vault = plugin;
RegisteredServiceProvider<Economy> economyProvider = this.vault.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
if (economyProvider != null) {
this.economy = economyProvider.getProvider();
@@ -130,7 +127,7 @@ public class VaultEco implements Method {
private final String name;
private final Economy economy;
public VaultAccount(String name, Economy economy) {
VaultAccount(String name, Economy economy) {
this.name = name;
this.economy = economy;
}
@@ -1,6 +1,7 @@
package com.earth2me.essentials.signs;
import com.earth2me.essentials.*;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.NumberUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
@@ -25,6 +26,7 @@ import static com.earth2me.essentials.I18n.tl;
public class EssentialsSign {
private static final Material SIGN_POST = EnumUtil.getMaterial("SIGN", "SIGN_POST");
private static final Set<Material> EMPTY_SET = new HashSet<Material>();
protected static final BigDecimal MINTRANSACTION = new BigDecimal("0.01");
protected transient final String signName;
@@ -58,9 +60,7 @@ public class EssentialsSign {
sign.setLine(0, getSuccessName(ess));
}
return ret;
} catch (ChargeException ex) {
showError(ess, user.getSource(), ex, signName);
} catch (SignException ex) {
} catch (ChargeException | SignException ex) {
showError(ess, user.getSource(), ex, signName);
}
// Return true, so the player sees the wrong sign.
@@ -115,9 +115,6 @@ public class EssentialsSign {
}
return onSignInteract(sign, user, getUsername(user), ess);
} catch (ChargeException ex) {
showError(ess, user.getSource(), ex, signName);
return false;
} catch (Exception ex) {
showError(ess, user.getSource(), ex, signName);
return false;
@@ -161,9 +158,7 @@ public class EssentialsSign {
User user = ess.getUser(player);
try {
return onBlockPlace(block, user, getUsername(user), ess);
} catch (ChargeException ex) {
showError(ess, user.getSource(), ex, signName);
} catch (SignException ex) {
} catch (ChargeException | SignException ex) {
showError(ess, user.getSource(), ex, signName);
}
return false;
@@ -173,9 +168,7 @@ public class EssentialsSign {
User user = ess.getUser(player);
try {
return onBlockInteract(block, user, getUsername(user), ess);
} catch (ChargeException ex) {
showError(ess, user.getSource(), ex, signName);
} catch (SignException ex) {
} catch (ChargeException | SignException ex) {
showError(ess, user.getSource(), ex, signName);
}
return false;
@@ -213,7 +206,7 @@ public class EssentialsSign {
protected static boolean checkIfBlockBreaksSigns(final Block block) {
final Block sign = block.getRelative(BlockFace.UP);
if (sign.getType() == Material.SIGN && isValidSign(new BlockSign(sign))) {
if (sign.getType() == SIGN_POST && isValidSign(new BlockSign(sign))) {
return true;
}
final BlockFace[] directions = new BlockFace[]{BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST};
@@ -304,12 +297,16 @@ public class EssentialsSign {
}
protected final Trade getTrade(final ISign sign, final int amountIndex, final int itemIndex, final User player, final IEssentials ess) throws SignException {
return getTrade(sign, amountIndex, itemIndex, player, false, ess);
}
protected final Trade getTrade(final ISign sign, final int amountIndex, final int itemIndex, final User player, final boolean allowId, final IEssentials ess) throws SignException {
final String itemType = getSignText(sign, itemIndex);
if (itemType.equalsIgnoreCase("exp") || itemType.equalsIgnoreCase("xp")) {
final int amount = getIntegerPositive(getSignText(sign, amountIndex));
return new Trade(amount, ess);
}
final ItemStack item = getItemStack(itemType, 1, ess);
final ItemStack item = getItemStack(itemType, 1, allowId, ess);
final int amount = Math.min(getIntegerPositive(getSignText(sign, amountIndex)), item.getType().getMaxStackSize() * player.getBase().getInventory().getSize());
if (item.getType() == Material.AIR || amount < 1) {
throw new SignException(tl("moreThanZero"));
@@ -346,6 +343,17 @@ public class EssentialsSign {
}
protected final ItemStack getItemStack(final String itemName, final int quantity, final IEssentials ess) throws SignException {
return getItemStack(itemName, quantity, false, ess);
}
protected final ItemStack getItemStack(final String itemName, final int quantity, final boolean allowId, final IEssentials ess) throws SignException {
if (allowId && ess.getSettings().allowOldIdSigns()) {
final Material newMaterial = ess.getItemDb().getFromLegacy(itemName);
if (newMaterial != null) {
return new ItemStack(newMaterial, quantity);
}
}
try {
final ItemStack item = ess.getItemDb().get(itemName);
item.setAmount(quantity);
@@ -398,6 +406,10 @@ public class EssentialsSign {
}
protected final Trade getTrade(final ISign sign, final int index, final int decrement, final IEssentials ess) throws SignException {
return getTrade(sign, index, decrement, false, ess);
}
protected final Trade getTrade(final ISign sign, final int index, final int decrement, final boolean allowId, final IEssentials ess) throws SignException {
final String line = getSignText(sign, index);
if (line.isEmpty()) {
return new Trade(signName.toLowerCase(Locale.ENGLISH) + "sign", ess);
@@ -420,7 +432,7 @@ public class EssentialsSign {
sign.setLine(index, quantity + " exp");
return new Trade(quantity, ess);
} else {
final ItemStack stack = getItemStack(item, quantity, ess);
final ItemStack stack = getItemStack(item, quantity, allowId, ess);
sign.setLine(index, quantity + " " + item);
return new Trade(stack, ess);
}
@@ -2,6 +2,7 @@ package com.earth2me.essentials.signs;
import com.earth2me.essentials.I18n;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.FormatUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
@@ -22,7 +23,7 @@ import java.util.logging.Logger;
public class SignBlockListener implements Listener {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private static final Material WALL_SIGN = Material.WALL_SIGN;
private static final Material SIGN_POST = Material.SIGN;
private static final Material SIGN_POST = EnumUtil.getMaterial("SIGN", "SIGN_POST");
private final transient IEssentials ess;
public SignBlockListener(IEssentials ess) {
@@ -1,5 +1,6 @@
package com.earth2me.essentials.signs;
import com.earth2me.essentials.utils.EnumUtil;
import net.ess3.api.IEssentials;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -11,6 +12,8 @@ import org.bukkit.event.entity.EntityExplodeEvent;
public class SignEntityListener implements Listener {
private static final Material SIGN_POST = EnumUtil.getMaterial("SIGN", "SIGN_POST");
private final transient IEssentials ess;
public SignEntityListener(final IEssentials ess) {
@@ -25,7 +28,7 @@ public class SignEntityListener implements Listener {
}
for (Block block : event.blockList()) {
if (((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN) && EssentialsSign.isValidSign(ess, new EssentialsSign.BlockSign(block))) || EssentialsSign.checkIfBlockBreaksSigns(block)) {
if (((block.getType() == Material.WALL_SIGN || block.getType() == SIGN_POST) && EssentialsSign.isValidSign(ess, new EssentialsSign.BlockSign(block))) || EssentialsSign.checkIfBlockBreaksSigns(block)) {
event.setCancelled(true);
return;
}
@@ -46,7 +49,7 @@ public class SignEntityListener implements Listener {
}
final Block block = event.getBlock();
if (((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN) && EssentialsSign.isValidSign(ess, new EssentialsSign.BlockSign(block))) || EssentialsSign.checkIfBlockBreaksSigns(block)) {
if (((block.getType() == Material.WALL_SIGN || block.getType() == SIGN_POST) && EssentialsSign.isValidSign(ess, new EssentialsSign.BlockSign(block))) || EssentialsSign.checkIfBlockBreaksSigns(block)) {
event.setCancelled(true);
return;
}
@@ -54,6 +54,8 @@ public class SignGameMode extends EssentialsSign {
player.setGameMode(GameMode.CREATIVE);
} else if (mode.contains("advent") || mode.equalsIgnoreCase("2")) {
player.setGameMode(GameMode.ADVENTURE);
} else if (mode.contains("spec") || mode.equalsIgnoreCase("3")) {
player.setGameMode(GameMode.SPECTATOR);
} else {
throw new SignException(tl("invalidSignLine", 2));
}
@@ -1,5 +1,6 @@
package com.earth2me.essentials.signs;
import com.earth2me.essentials.utils.MaterialUtil;
import net.ess3.api.IEssentials;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -54,7 +55,7 @@ public class SignPlayerListener implements Listener {
}
final Material mat = block.getType();
if (mat == Material.SIGN || mat == Material.WALL_SIGN) {
if (MaterialUtil.isSign(mat)) {
final String csign = ((Sign) block.getState()).getLine(0);
for (EssentialsSign sign : ess.getSettings().enabledSigns()) {
if (csign.equalsIgnoreCase(sign.getSuccessName(ess))) {
@@ -4,7 +4,9 @@ import com.earth2me.essentials.ChargeException;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.Trade.OverflowType;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.FormatUtil;
import com.earth2me.essentials.utils.MaterialUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
import org.bukkit.Location;
@@ -21,13 +23,14 @@ import static com.earth2me.essentials.I18n.tl;
@Deprecated // This sign will be removed soon
public class SignProtection extends EssentialsSign {
private final transient Set<Material> protectedBlocks = EnumSet.noneOf(Material.class);
private final transient Set<Material> protectedBlocks = EnumUtil.getAllMatching(Material.class,
"CHEST",
"FURNACE",
"BURNING_FURNACE",
"DISPENSER");
public SignProtection() {
super("Protection");
protectedBlocks.add(Material.CHEST);
protectedBlocks.add(Material.FURNACE);
protectedBlocks.add(Material.DISPENSER);
}
@Override
@@ -102,7 +105,7 @@ public class SignProtection extends EssentialsSign {
}
private SignProtectionState checkProtectionSign(final Block block, final User user, final String username) {
if (block.getType() == Material.SIGN || block.getType() == Material.WALL_SIGN) {
if (MaterialUtil.isSign(block.getType())) {
final BlockSign sign = new BlockSign(block);
if (sign.getLine(0).equals(this.getSuccessName())) { // TODO call getSuccessName(IEssentials)
return checkProtectionSign(sign, user, username);
@@ -159,7 +162,7 @@ public class SignProtection extends EssentialsSign {
public boolean isBlockProtected(final Block block) {
final Block[] faces = getAdjacentBlocks(block);
for (Block b : faces) {
if (b.getType() == Material.SIGN || b.getType() == Material.WALL_SIGN) {
if (MaterialUtil.isSign(b.getType())) {
final Sign sign = (Sign) b.getState();
if (sign.getLine(0).equalsIgnoreCase("§1[Protection]")) {
return true;
@@ -169,7 +172,7 @@ public class SignProtection extends EssentialsSign {
final Block[] faceChest = getAdjacentBlocks(b);
for (Block a : faceChest) {
if (a.getType() == Material.SIGN || a.getType() == Material.WALL_SIGN) {
if (MaterialUtil.isSign(a.getType())) {
final Sign sign = (Sign) a.getState();
if (sign.getLine(0).equalsIgnoreCase("§1[Protection]")) {
return true;
@@ -26,8 +26,8 @@ public class SignTrade extends EssentialsSign {
protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException {
validateTrade(sign, 1, false, ess);
validateTrade(sign, 2, true, ess);
final Trade trade = getTrade(sign, 2, AmountType.ROUNDED, true, ess);
final Trade charge = getTrade(sign, 1, AmountType.ROUNDED, false, ess);
final Trade trade = getTrade(sign, 2, AmountType.ROUNDED, true, true, ess);
final Trade charge = getTrade(sign, 1, AmountType.ROUNDED, false, true, ess);
if (trade.getType() == charge.getType() && (trade.getType() != TradeType.ITEM || trade.getItemStack().isSimilar(charge.getItemStack()))) {
throw new SignException("You cannot trade for the same item type.");
}
@@ -44,7 +44,7 @@ public class SignTrade extends EssentialsSign {
final Trade store = rechargeSign(sign, ess, player);
Trade stored;
try {
stored = getTrade(sign, 1, AmountType.TOTAL, true, ess);
stored = getTrade(sign, 1, AmountType.TOTAL, true, true, ess);
subtractAmount(sign, 1, stored, ess);
Map<Integer, ItemStack> withdraw = stored.pay(player, OverflowType.RETURN);
@@ -62,8 +62,8 @@ public class SignTrade extends EssentialsSign {
}
Trade.log("Sign", "Trade", "Deposit", username, store, username, null, sign.getBlock().getLocation(), ess);
} else {
final Trade charge = getTrade(sign, 1, AmountType.COST, false, ess);
final Trade trade = getTrade(sign, 2, AmountType.COST, true, ess);
final Trade charge = getTrade(sign, 1, AmountType.COST, false, true, ess);
final Trade trade = getTrade(sign, 2, AmountType.COST, true, true, ess);
charge.isAffordableFor(player);
addAmount(sign, 1, charge, ess);
subtractAmount(sign, 2, trade, ess);
@@ -80,7 +80,7 @@ public class SignTrade extends EssentialsSign {
}
private Trade rechargeSign(final ISign sign, final IEssentials ess, final User player) throws SignException, ChargeException {
final Trade trade = getTrade(sign, 2, AmountType.COST, false, ess);
final Trade trade = getTrade(sign, 2, AmountType.COST, false, true, ess);
if (trade.getItemStack() != null && player.getBase().getItemInHand() != null && trade.getItemStack().getType() == player.getBase().getItemInHand().getType() && trade.getItemStack().getDurability() == player.getBase().getItemInHand().getDurability() && trade.getItemStack().getEnchantments().equals(player.getBase().getItemInHand().getEnchantments())) {
int amount = player.getBase().getItemInHand().getAmount();
amount -= amount % trade.getItemStack().getAmount();
@@ -106,8 +106,8 @@ public class SignTrade extends EssentialsSign {
if (canBreak) {
try {
final Trade stored1 = getTrade(sign, 1, AmountType.TOTAL, false, ess);
final Trade stored2 = getTrade(sign, 2, AmountType.TOTAL, false, ess);
final Trade stored1 = getTrade(sign, 1, AmountType.TOTAL, false, true, ess);
final Trade stored2 = getTrade(sign, 2, AmountType.TOTAL, false, true, ess);
if (!canCollect) {
Trade.log("Sign", "Trade", "Destroy", signOwner, stored2, username, stored1, sign.getBlock().getLocation(), ess);
@@ -206,6 +206,10 @@ public class SignTrade extends EssentialsSign {
}
protected final Trade getTrade(final ISign sign, final int index, final AmountType amountType, final boolean notEmpty, final IEssentials ess) throws SignException {
return getTrade(sign, index, amountType, notEmpty, false, ess);
}
protected final Trade getTrade(final ISign sign, final int index, final AmountType amountType, final boolean notEmpty, final boolean allowId, final IEssentials ess) throws SignException {
final String line = sign.getLine(index).trim();
if (line.isEmpty()) {
throw new SignException("Empty line");
@@ -237,7 +241,7 @@ public class SignTrade extends EssentialsSign {
return new Trade((amountType == AmountType.COST ? stackamount : amount), ess);
} else {
final int stackamount = getIntegerPositive(split[0]);
final ItemStack item = getItemStack(split[1], stackamount, ess);
final ItemStack item = getItemStack(split[1], stackamount, allowId, ess);
int amount = getInteger(split[2]);
if (amountType == AmountType.ROUNDED) {
amount -= amount % stackamount;
@@ -12,7 +12,7 @@ public class EnumUtil {
/**
* Returns the field matching the first provided enum name that exists within the given
* enum class.
* enum class. If no field is found, this method returns null.
*
* @param enumClass The class to search through
* @param names The names of the fields to search for
@@ -17,7 +17,7 @@ import static com.earth2me.essentials.I18n.tl;
public class LocationUtil {
// The player can stand inside these materials
public static final Set<Material> HOLLOW_MATERIALS = new HashSet<>();
private static final Set<Material> HOLLOW_MATERIALS = new HashSet<>();
private static final Set<Material> TRANSPARENT_MATERIALS = new HashSet<>();
static {
@@ -32,8 +32,7 @@ public class LocationUtil {
TRANSPARENT_MATERIALS.add(Material.WATER);
try {
TRANSPARENT_MATERIALS.add(Material.valueOf("FLOWING_WATER"));
} catch (Exception ignored) { // 1.13 WATER uses Levelled
}
} catch (Exception ignored) {} // 1.13 WATER uses Levelled
}
public static final int RADIUS = 3;
@@ -49,7 +48,7 @@ public class LocationUtil {
public int y;
public int z;
public Vector3D(int x, int y, int z) {
Vector3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
@@ -57,7 +56,7 @@ public class LocationUtil {
}
static {
List<Vector3D> pos = new ArrayList<Vector3D>();
List<Vector3D> pos = new ArrayList<>();
for (int x = -RADIUS; x <= RADIUS; x++) {
for (int y = -RADIUS; y <= RADIUS; y++) {
for (int z = -RADIUS; z <= RADIUS; z++) {
@@ -65,30 +64,22 @@ public class LocationUtil {
}
}
}
Collections.sort(pos, new Comparator<Vector3D>() {
@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);
}
});
pos.sort(Comparator.comparingInt(a -> (a.x * a.x + a.y * a.y + a.z * a.z)));
VOLUME = pos.toArray(new Vector3D[0]);
}
@SuppressWarnings("deprecation")
public static Location getTarget(final LivingEntity entity) throws Exception {
Block block = null;
try {
block = entity.getTargetBlock(TRANSPARENT_MATERIALS, 300);
} catch (NoSuchMethodError e) {
// failing now :(
}
} catch (NoSuchMethodError ignored) {} // failing now :(
if (block == null) {
throw new Exception("Not targeting a block");
}
return block.getLocation();
}
static boolean isBlockAboveAir(final World world, final int x, final int y, final int z) {
public static boolean isBlockAboveAir(final World world, final int x, final int y, final int z) {
return y > world.getMaxHeight() || HOLLOW_MATERIALS.contains(world.getBlockAt(x, y - 1, z).getType());
}
@@ -124,8 +115,7 @@ public class LocationUtil {
if (below.getType() == Material.valueOf("FLOWING_LAVA")) {
return true;
}
} catch (Exception ignored) { // 1.13 LAVA uses Levelled
}
} catch (Exception ignored) {} // 1.13 LAVA uses Levelled
Material PORTAL = EnumUtil.getMaterial("NETHER_PORTAL", "PORTAL");
@@ -159,7 +149,6 @@ public class LocationUtil {
user.getBase().setFlying(true);
}
// ess can be null if old deprecated method is calling it.
System.out.println((ess == null) + " " + ess.getSettings().isTeleportToCenterLocation());
if (ess == null || ess.getSettings().isTeleportToCenterLocation()) {
return getRoundedDestination(loc);
} else {
@@ -1,7 +1,12 @@
package com.earth2me.essentials.utils;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.material.MaterialData;
import java.util.EnumSet;
import java.util.Optional;
import java.util.Set;
public class MaterialUtil {
@@ -97,4 +102,26 @@ public class MaterialUtil {
return isPlayerHead(material, -1) || isMobHead(material, -1);
}
public static Material convertFromLegacy(int id, byte damage) {
for (Material material : EnumSet.allOf(Material.class)) {
if (material.getId() == id) {
try {
return Bukkit.getUnsafe().fromLegacy(new MaterialData(material, damage));
} catch (NoSuchMethodError error) {
return material;
}
}
}
return null;
}
public static DyeColor getColorOf(Material material) {
for (DyeColor color : DyeColor.values()) {
if (material.toString().contains(color.name())) {
return color;
}
}
return DyeColor.WHITE;
}
}
@@ -12,6 +12,7 @@ import java.util.regex.Pattern;
public class VersionUtil {
public static final BukkitVersion v1_8_8_R01 = BukkitVersion.fromString("1.8.8-R0.1-SNAPSHOT");
public static final BukkitVersion v1_9_R01 = BukkitVersion.fromString("1.9-R0.1-SNAPSHOT");
public static final BukkitVersion v1_9_4_R01 = BukkitVersion.fromString("1.9.4-R0.1-SNAPSHOT");
public static final BukkitVersion v1_10_2_R01 = BukkitVersion.fromString("1.10.2-R0.1-SNAPSHOT");
public static final BukkitVersion v1_11_2_R01 = BukkitVersion.fromString("1.11.2-R0.1-SNAPSHOT");
@@ -22,8 +23,13 @@ public class VersionUtil {
private static final Set<BukkitVersion> supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01);
private static BukkitVersion serverVersion = null;
public static BukkitVersion getServerBukkitVersion() {
return BukkitVersion.fromString(Bukkit.getServer().getBukkitVersion());
if (serverVersion == null) {
serverVersion = BukkitVersion.fromString(Bukkit.getServer().getBukkitVersion());
}
return serverVersion;
}
public static boolean isServerSupported() {
@@ -48,7 +54,16 @@ public class VersionUtil {
matcher = VERSION_PATTERN.matcher(v1_13_2_R01.toString());
Preconditions.checkArgument(matcher.matches(), string + " is not in valid version format. e.g. 1.8.8-R0.1");
}
return new BukkitVersion(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)), Integer.parseInt(matcher.group(3)), Double.parseDouble(matcher.group(4)));
return from(matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(4));
}
private static BukkitVersion from(String major, String minor, String patch, String revision) {
if (patch.isEmpty()) patch = "0";
return new BukkitVersion(Integer.parseInt(major),
Integer.parseInt(minor),
Integer.parseInt(patch),
Double.parseDouble(revision));
}
private BukkitVersion(int major, int minor, int patch, double revision) {
@@ -102,7 +117,7 @@ public class VersionUtil {
return major == that.major &&
minor == that.minor &&
patch == that.patch &&
revision == that.patch;
revision == that.revision;
}
@Override
@@ -112,7 +127,7 @@ public class VersionUtil {
@Override
public String toString() {
return major + "+" + minor + "+" + patch + "-R" + revision;
return major + "." + minor + "." + patch + "-R" + revision;
}
@Override
+5
View File
@@ -322,6 +322,11 @@ enabledSigns:
# Lower numbers will reduce the possibility of lag, but may annoy players.
sign-use-per-second: 4
# Allow item IDs on pre-existing signs on 1.13 and above.
# You cannot use item IDs on new signs, but this will allow players to interact with signs that
# were placed before 1.13.
allow-old-id-signs: false
# List of sign names Essentials should not protect. This feature is especially useful when
# another plugin provides a sign that EssentialsX provides, but Essentials overrides.
# For example, if a plugin provides a [kit] sign, and you wish to use theirs instead of
-3
View File
@@ -1901,9 +1901,6 @@ plantren,91,0
glowpumpkin,91,0
gpumpkin,91,0
lpumpkin,91,0
lockedchest,95,0
lockchest,95,0
jokechest,95,0
whiteglass,95,0
whitesglass,95,0
whitestainedglass,95,0
1 #version: ${full.version}
1901 glowpumpkin,91,0
1902 gpumpkin,91,0
1903 lpumpkin,91,0
lockedchest,95,0
lockchest,95,0
jokechest,95,0
1904 whiteglass,95,0
1905 whitesglass,95,0
1906 whitestainedglass,95,0
+4753 -488
View File
File diff suppressed because it is too large. Load diff
+3 -2
View File
@@ -211,6 +211,7 @@ is=is
isIpBanned=\u00a76IP \u00a7c{0} \u00a76is banned.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74That item cannot be sold to the server.
itemId=\u00a76ID\:\u00a7c {0}
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.
@@ -467,7 +468,7 @@ sellBulkPermission=\u00a76You do not have permission to bulk sell.
sellHandPermission=\u00a76You do not have permission to hand sell.
serverFull=Server is full\!
serverTotal=\u00a76Server Total\:\u00a7c {0}
serverUnsupported=\u00a7cYou are running an unsupported server version!
serverUnsupported=You are running an unsupported server version!
setBal=\u00a7aYour balance was set to {0}.
setBalOthers=\u00a7aYou set {0}\u00a7a''s balance to {1}.
setSpawner=\u00a76Changed spawner type to\u00a7c {0}\u00a76.
@@ -544,7 +545,7 @@ typeTpacancel=\u00a76To cancel this request, type \u00a7c/tpacancel\u00a76.
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.
unableToSpawnItem=\u00a74Cannot spawn \u00a7c{0}\u00a74, this is not a spawnable item.
unableToSpawnItem=\u00a74Cannot spawn \u00a7c{0}\u00a74; this is not a spawnable item.
unableToSpawnMob=\u00a74Unable to spawn mob.
unignorePlayer=\u00a76You are not ignoring player\u00a7c {0} \u00a76anymore.
unknownItemId=\u00a74Unknown item id\:\u00a7r {0}\u00a74.
+1
View File
@@ -211,6 +211,7 @@ is=je
isIpBanned=\u00a76IP \u00a7c{0} \u00a76je zabanovana.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74Tento predmet nelze prodat serveru.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74Predmety musi byt vymeneny ve stacku.
itemNames=\u00a76Zkracene nazvy predmetu\:\u00a7r {0}
itemNotEnough1=\u00a74Nemas dostatek, aby jsi jej mohl prodat.
+1
View File
@@ -211,6 +211,7 @@ is=er
isIpBanned=\u00a76IP \u00a7c{0} \u00a76er banlyst.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74Det element kan ikke s\u00e6lges til serveren.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74Elementet skal forhandles i form at stakke. En m\u00e6ngde af 2s vil v\u00e6re 2 stakke, osv.
itemNames=\u00a76Elementforkortelser\:\u00a7r {0}
itemNotEnough1=\u00a74Du har ikke nok af det element til at s\u00e6lge det.
+248 -241
View File
@@ -2,11 +2,11 @@
#version: ${full.version}
# Single quotes have to be doubled: ''
# Translations start here
# by:
# Germantranslation by enterih and a lot of other guys. Feel free to donate EssentialsX.
action=\u00a75* {0} \u00a75{1}
addedToAccount=\u00a7a{0} wurde zu deinem Konto hinzugef\u00fcgt.
addedToOthersAccount=\u00a7a{0} wurde dem Konto von {1} \u00a7agutgeschrieben. Aktueller Kontostand\: {2}
adventure=Abenteuer
addedToAccount=\u00a7c{0} \u00a7awurden deinem Konto hinzugef\u00fcgt.
addedToOthersAccount=\u00a7aAuf \u00a76{1} \u00A7A´s Konto wurden \u00a7c{0} \u00A7agutgeschrieben. Neuer Kontostand\: \u00A76{2}
adventure=Abenteuermodus
alertBroke=zerst\u00f6rt\:
alertFormat=\u00a73[{0}] \u00a7r {1} \u00a76 {2} bei\: {3}
alertPlaced=platziert\:
@@ -18,38 +18,38 @@ antiBuildDrop=\u00a74Du darfst \u00a7c {0}\u00a74 nicht wegwerfen.
antiBuildInteract=\u00a74Du darfst mit\u00a7c {0}\u00a74 nicht interagieren.
antiBuildPlace=\u00a74Du darfst\u00a7c {0} \u00a74hier nicht platzieren.
antiBuildUse=\u00a74Du darfst\u00a7c {0} \u00a74nicht benutzen.
autoAfkKickReason=Du wurdest rausgeworfen, weil du f\u00fcr {0} Minuten inaktiv warst.
backAfterDeath=\u00a76Benutze den Befehl /back um zu deinem Todespunkt zur\u00fcck zu kehren.
autoAfkKickReason=Da du l\u00e4nger als {0} Minuten inaktiv bist, haben wir die Verbindung getrennt.
backAfterDeath=\u00a76Verwende den Befehl \u00A7c/back\u00A76, um zu deinem Todespunkt zur\u00fcck zu kehren.
backupDisabled=\u00a74Ein externes Backup-Skript wurde nicht konfiguriert.
backupFinished=\u00a76Backup beendet.
backupStarted=\u00a76Backup gestartet.
backUsageMsg=\u00a76Kehre zur letzten Position zur\u00fcck.
backUsageMsg=\u00a76Du kehrst zur letzten Position zur\u00fcck.
balance=\u00a7aKontostand\:\u00a7c {0}
balanceOther=\u00a7aKontostand von {0}\u00a7a\:\u00a7c {1}
balanceTop=\u00a76Die h\u00f6chsten Kontost\u00e4nde ({0})
banExempt=\u00a74Du kannst diesen Spieler nicht bannen.
banExemptOffline=\u00a74Du darfst abgemeldete Spieler nicht verbannen.
banExemptOffline=\u00a74Du darfst abgemeldete Spieler nicht bannen.
banFormat=\u00a74Gebannt\: \u00a7r{0}
banIpJoin=Deine IP-Adresse ist auf diesem Server gebannt. Grund: {0}
banIpJoin=Deine IP-Adresse ist auf diesem Server gesperrt. Grund: {0}
banJoin=Du bist von diesem Server gebannt. Grund: {0}
bed=\u00a7oBett\u00a7r
bedMissing=\u00a74Dein Bett ist entweder nicht gesetzt, fehlt oder ist blockiert.
bedNull=\u00a7mBett\u00a7r
bedSet=\u00a76Bett-Spawn gesetzt\!
bigTreeFailure=\u00a74Fehler beim Pflanzen eines gro\u00dfen Baums. Versuch es auf Gras oder Dreck.
bigTreeFailure=\u00a74Beim Pflanzen eines grossen Baumes ist ein Fehler aufgetreten. Versuch es auf Gras oder Dreck.
bigTreeSuccess=\u00a76Gro\u00dfer Baum gepflanzt.
blockList=\u00a76Essentials hat die folgenden Befehle an ein anderes Plugin weiter gegeben\:
bookAuthorSet=\u00a76Autor des Buchs auf {0} ge\u00e4ndert.
bookLocked=\u00a76Dieses Buch ist jetzt versiegelt.
bookTitleSet=\u00a76Buchtitel auf {0} ge\u00e4ndert.
broadcast=\u00a7r\u00a76[\u00a74Rundruf\u00a76]\u00a7a {0}
buildAlert=\u00a74Du hast keine Rechte zum Bauen.
buildAlert=\u00a74Du hast keine Bauberechtigung.
bukkitFormatChanged=Bukkit-Versionsformat hat sich ge\u00e4ndert. Version nicht kontrolliert.
burnMsg=\u00a76Du hast {0} f\u00fcr {1} Sekunden in Brand gesetzt.
cannotStackMob=\u00a74Du hast nicht das Recht, mehrere Mobs zu stapeln.
canTalkAgain=\u00a76Du kannst wieder sprechen.
cannotStackMob=\u00a74Du bist nicht berechtigt, mehrere Mobs zu stapeln.
canTalkAgain=\u00a76Du kannst wieder den Chat ruinieren.
cantFindGeoIpDB=Kann GeoIP-Datenbank nicht finden\!
cantGamemode=\u00a74Du hast keine Permission, um zum Spielmodus {0} zu wechseln.
cantGamemode=\u00a74Du hast keine Berechtigung, um zum Spielmodus {0} zu wechseln.
cantReadGeoIpDB=Fehler beim Einlesen der GeoIP-Datenbank\!
cantSpawnItem=\u00a74Du darfst Gegenstand\u00a7c {0}\u00a74 nicht erzeugen.
chatTypeAdmin=[A]
@@ -57,131 +57,131 @@ chatTypeLocal=[L]
chatTypeSpy=[Spion]
cleaned=Spielerdateien geleert.
cleaning=S\u00e4ubere Spielerdateien.
clearInventoryConfirmToggleOff=\u00a76You will no longer be prompted to confirm inventory clears.
clearInventoryConfirmToggleOn=\u00a76You will now be prompted to confirm inventory clears.
clearInventoryConfirmToggleOff=\u00a76Du musst ab jetzt nicht mehr best\u00c4tigen, ob du das Inventar leeren m\u00F6chtest.
clearInventoryConfirmToggleOn=\u00a76Du musst ab jetzt best\u00c4tigen, ob du das Inventar leeren m\u00F6chtest.
commandCooldown=\u00a7cDu kannst diesen Command nicht ausf\u00FChren f\u00FCr {0}.
commandFailed=Befehl {0} scheiterte\:
commandHelpFailedForPlugin=Fehler beim Abrufen der Hilfe f\u00fcr\: {0}
commandFailed=Befehl {0} ist fehlgeschlagen\:
commandHelpFailedForPlugin=Beim Abruf der Hilfe f\u00fcr\: {0} hat etwas nicht funktioniert.
commandNotLoaded=\u00a74Befehl {0} ist nicht richtig geladen.
compassBearing=\u00a76Peilung\: {0} ({1} Grad).
configFileMoveError=Fehler beim Verschieben der config.yml in das Backupverzeichnis.
configFileRenameError=Verschieben einer tempor\u00e4ren Datei nach config.yml gescheitert.
confirmClear=\u00a77To \u00a7lCONFIRM\u00a77 inventory clear, please repeat command: \u00a76{0}
confirmPayment=\u00a77Um die Zahlung in H\u00f6he von \u00a76{0}\u00a77 zu \u00a7lBEST\u00c4TIGEN\u00a77, wiederhole bitte den Befehl: \u00a76{1}
configFileMoveError=Es ist ein Fehler beim Verschieben der config.yml in das Backupverzeichnis aufgetreten.
configFileRenameError=Das Verschieben einer tempor\u00e4ren Datei nach config.yml gescheitert.
confirmClear=\u00a77Um das Inventar zu leeren, musst du zuerst \u00a7lBEST\u00e4TIGEN\u00a77. Wiederhole daf\u00fcr bitte \u00a76{0}\u00a77.
confirmPayment=\u00a77Um die Zahlung in der H\u00f6he von \u00a76{0}\u00a77 zu \u00a7lBEST\u00c4TIGEN\u00a77, wiederhole bitte den Befehl: \u00a76{1}
connectedPlayers=\u00a76Verbundene Spieler\u00a7r
connectionFailed=Fehler beim Verbindungsaufbau.
connectionFailed=Beim Verbindungsaufbau ist ein Fehler aufgetreten.
cooldownWithMessage=\u00a74Abklingzeit\: {0}
coordsKeyword={0}, {1}, {2}
corruptNodeInConfig=\u00a74Hinweis\: Deine Konfigurationsdatei hat eine ung\u00fcltige Node {0}.
couldNotFindTemplate=\u00a74Vorlage {0} konnte nicht gefunden werden.
createdKit=\u00a76Kit \u00a7c{0} \u00a76erstellt mit \u00a7c{1} \u00a76Eintr\u00E4gen und Verz\u00F6gerung \u00a7c{2}
createdKit=\u00a76Das Kit \u00a7c{0} \u00a76wurde mit \u00a7c{1} \u00a76Eintr\u00E4gen und einer Verz\u00F6gerung von \u00a7c{2} \u00a76erstellt.
createKitFailed=\u00a74Beim Erstellen des Kits ist ein Fehler aufgetreten {0}.
createKitSeparator=\u00a7m-----------------------
createKitSuccess=\u00a76Erstelltes Kit: \u00a7f{0}\n\u00a76Verz\u00F6gerung: \u00a7f{1}\n\u00a76Link: \u00a7f{2}\n\u00a76Kopiere Inhalte aus dem oben stehenden Link in deine kits.yml.
creatingConfigFromTemplate=Erstelle Konfiguration aus Vorlage\: {0}
creatingEmptyConfig=Erstelle leere Konfiguration\: {0}
createKitSuccess=\u00a76Erstelltes Kit: \u00a7f{0}\n\u00a76Verz\u00F6gerung: \u00a7f{1}\n\u00a76Link: \u00a7f{2}\n\u00a76Es werden Inhalte aus dem oben stehenden Link in deine kits.yml kopiert.
creatingConfigFromTemplate=Erstelle Konfiguration aus der Vorlage\: {0}
creatingEmptyConfig=Erstelle eine leere Konfiguration\: {0}
creative=Kreativmodus
currency={0}{1}
currentWorld=\u00a76Aktuelle Welt\:\u00a7c {0}
day=Tag
days=Tage
defaultBanReason=Der Bann-Hammer hat gesprochen\!
deleteFileError=Konnte Datei nicht l\u00f6schen\: {0}
deleteHome=\u00a76Zuhause\u00a7c {0} \u00a76wurde gel\u00f6scht.
deleteJail=\u00a76Gef\u00e4ngnis\u00a7c {0} \u00a76wurde gel\u00f6scht.
deleteWarp=\u00a76Warp-Punkt \u00a7c{0} \u00a76wurde gel\u00f6scht.
defaultBanReason=B\u00c4\u00c4m, Der Bann-Hammer hat gesprochen.\!
deleteFileError=Die Datei {0} konnte nicht gel\u00f6scht werden.\
deleteHome=\u00a76Die Heimat\u00a7c {0} \u00a76wurde gel\u00f6scht.
deleteJail=\u00a76Das Gef\u00e4ngnis\u00a7c {0} \u00a76wurde gel\u00f6scht.
deleteWarp=\u00a76Der Warp-Punkt \u00a7c{0} \u00a76wurde gel\u00f6scht.
deniedAccessCommand=\u00a7c{0} \u00a74hat keinen Zugriff auf diesen Befehl.
denyBookEdit=\u00a74Du kannst dieses Buch nicht entsiegeln.
denyChangeAuthor=\u00a74Du kannst den Autor dieses Buches nicht \u00e4ndern.
denyChangeTitle=\u00a74Du kannst den Titel dieses Buches nicht \u00e4ndern.
depth=\u00a76Du bist auf Meeresh\u00f6he.
depthAboveSea=\u00a76Du bist\u00a7c {0} \u00a76Bl\u00f6cke \u00fcber Meeresh\u00f6he.
depthBelowSea=\u00a76Du bist\u00a7c {0} \u00a76Bl\u00f6cke unter Meeresh\u00f6he.
destinationNotSet=Ziel nicht gesetzt\!
depth=\u00a76Du bist auf derMeeresh\u00f6he.
depthAboveSea=\u00a76Du bist\u00a7c {0} \u00a76Bl\u00f6cke \u00fcber Meer.
depthBelowSea=\u00a76Du bist\u00a7c {0} \u00a76Bl\u00f6cke unter Meer.
destinationNotSet=Das Ziel ist nicht gesetzt\!
disabled=deaktiviert
disabledToSpawnMob=\u00a74Das Spawnen dieses Mobs wurde in der Konfigurationsdatei deaktiviert.
disableUnlimited=\u00a76Deaktiviere unbegrenztes Platzieren von\u00a7c {0} \u00a76f\u00fcr {1}.
disabledToSpawnMob=\u00a74Das Spawnen dieses Mobs ist in der Konfigurationsdatei deaktiviert.
disableUnlimited=\u00a76Das unbegrenzte Platzieren von\u00a7c {0} \u00a76f\u00fcr \u00a7c{1} \u00a76wurde deaktiviert.
distance=\u00a76Entfernung\: {0}
dontMoveMessage=\u00a76Teleportvorgang startet in {0}. Bewege dich nicht.
downloadingGeoIp=Lade GeoIP-Datenbank ... dies kann etwas dauern (country\: 1.7 MB, city\: 30MB)
dontMoveMessage=\u00a76Teleportvorgang startet in \u00a7c{0}\u00a76. Eine Bewegung bricht die Teleportation ab.
downloadingGeoIp=GeoIP-Datenbank wird geladen... Das kann einen Moment in Anspruch nehmen. (country\: 1.7 MB, city\: 30MB)
duplicatedUserdata=Doppelte Datei in userdata\: {0} und {1}.
durability=\u00a76Dieses Werkzeug kann noch \u00a7c{0}\u00a76 mal benutzt werden.
east=E
editBookContents=\u00a7eDu darfst jetzt den Inhalt dieses Buches bearbeiten.
east=O
editBookContents=\u00a7eDu darfst den Inhalt dieses Buches jetzt bearbeiten.
enabled=aktiviert
enableUnlimited=\u00a76Gebe \u00a7c{1}\u00a76. unendlichen einen Stack\u00a7c {0} \u00a76.
enableUnlimited=\u00a76Du gibst \u00a7c{1}\u00a76 eine unbegrenzte Menge an\u00a7c {0} \u00a76.
enchantmentApplied=\u00a76Der Gegenstand in deiner Hand wurde mit\u00a7c {0} \u00a76verzaubert.
enchantmentNotFound=\u00a74Verzauberung nicht gefunden\!
enchantmentPerm=\u00a74Du hast keine Rechte f\u00fcr\u00a7c {0}\u00a74.
enchantmentNotFound=\u00a74Diese Verzauberung konnte nicht gefunden werden\!
enchantmentPerm=\u00a74Du bist f\u00fcr\u00a7c {0}\u00a74 nicht berechtigt.
enchantmentRemoved=\u00a76Dem Gegenstand in deiner Hand wurde die Verzauberung\u00a7c {0} \u00a76entfernt.
enchantments=\u00a76Verzauberungen\:\u00a7r {0}
errorCallingCommand=Fehler beim Aufrufen des Befehls /{0}
errorCallingCommand=Beim Aufrufen des Befehls {0} ist ein Fehler aufgetreten.
errorWithMessage=\u00a7cFehler\:\u00a74 {0}
essentialsHelp1=Die Datei ist besch\u00e4digt und Essentials kann sie nicht \u00f6ffnen. Essentials ist jetzt deaktiviert. Wenn du die Datei selbst nicht reparieren kannst, gehe auf http\://tiny.cc/EssentialsChat
essentialsHelp2=Die Datei ist besch\u00e4digt und Essentials kann sie nicht \u00f6ffnen. Essentials ist jetzt deaktiviert. Wenn du die Datei selbst nicht reparieren kannst, versuche /essentialshelp oder gehe auf http\://tiny.cc/EssentialsChat
essentialsReload=\u00a76Essentials neu geladen\u00a7c {0}.
exp=\u00a7c{0} \u00a76hat\u00a7c {1} \u00a76Exp (Level\u00a7c {2}\u00a76) und braucht\u00a7c {3} \u00a76Punkte f\u00fcr den n\u00e4chsten Level.
essentialsReload=\u00a76Essentials wurde neu geladen\u00a7c {0}.
exp=\u00a7c{0} \u00a76hat\u00a7c {1} \u00a76Exp (Level\u00a7c {2}\u00a76) und braucht\u00a7c {3} \u00a76Punkte f\u00fcr das n\u00e4chste Level.
expSet=\u00a7c{0} \u00a76hat jetzt\u00a7c {1} \u00a76Exp.
extinguish=\u00a76Du hast dich selbst gel\u00f6scht.
extinguishOthers=\u00a76Du hast {0}\u00a76 gel\u00f6scht.
failedToCloseConfig=Fehler beim Schlie\u00dfen der Konfiguration {0}.
failedToCreateConfig=Fehler beim Erstellen der Konfiguration {0}.
failedToWriteConfig=Fehler beim Schreiben der Konfiguration {0}.
false=\u00a74falsch\u00a7r
failedToCloseConfig=Beim Schliessen der Config ist ein Fehler aufgetreten {0}.
failedToCreateConfig=Beim Erstellen der Config ist ein Fehler aufgetreten {0}.
failedToWriteConfig=Beim Schreiben der Config ist ein Fehler aufgetreten {0}.
false=\u00a74Nein\u00a7r
feed=\u00a76Dein Hunger wurde gestillt.
feedOther=\u00a76Du hast dein Hunger von \u00a7c{0}\u00a76gestillt.
fileRenameError=Umbenennen von {0} gescheitert\!
fireworkColor=\u00a74Ung\u00fcltige Feuerwerksparameter angegeben, setze zuerst eine Farbe.
fireworkEffectsCleared=\u00a76Alle Effekte vom Stapel in der Hand entfernt.
fireworkSyntax=\u00a76Feuerwerk-Parameter\:\u00a7c color\:<Farbe> [fade\:<Farbe>] [shape\:<Form>] [effect\:<Effekt>]\n\u00a76Um mehrere Farben/Effekte zu benutzen, mit Komma trennen\: \u00a7cred,blue,pink\n\u00a76Formen\:\u00a7c star, ball, large, creeper, burst \u00a76Effekte\:\u00a7c trail, twinkle.
feedOther=\u00a76Du hast den Hunger von \u00a7c{0}\u00a76gestillt.
fileRenameError=\u00a7cDu konntest \u00a7e{0} \u00a7cnicht umbenennen.\!
fireworkColor=\u00a74Ung\u00fcltige Feuerwerksparameter angegeben. Du musst zuerst eine Farbe festlegen.
fireworkEffectsCleared=\u00a76Alle Effekte wurden vom Stapel, den du in der Hand hast, entfernt.
fireworkSyntax=\u00a76Feuerwerk-Parameter\:\u00a7c color\:<Farbe> [fade\:<Farbe>] [shape\:<Form>] [effect\:<Effekt>]\n\u00a76Um mehrere Farben/Effekte zu benutzen, musst du sie mit Komma trennen\: \u00a7cred,blue,pink\n\u00a76Formen\:\u00a7c star, ball, large, creeper, burst \u00a76Effekte\:\u00a7c trail, twinkle.
flying=fliegt
flyMode=\u00a76Flugmodus\u00a7c {0} \u00a76f\u00fcr {1} \u00a76gesetzt.
flyMode=\u00A76Du hast den Flugmodus bei \u00a7c{1} {0}\u00a76.
foreverAlone=\u00a7cDu hast niemanden, dem du antworten kannst.
fullStack=\u00a74Du hast bereits einen vollen Stapel.
gameMode=\u00a76Spielmodus\u00a7c {0} \u00a76f\u00fcr {1} \u00a76gesetzt.
gameModeInvalid=\u00a74Sie m\u00fcssen einen g\u00fcltigen Spieler/Modus angeben.
gameMode=\u00a76Du hast \u00a7c{1}\u00a76 in den \u00a7c{0}\u00a76 versetzt.
gameModeInvalid=\u00a74Du m\u00fcsst einen g\u00fcltigen Spieler/Modus angeben.
gcfree=\u00a76Freier Speicher\:\u00a7c {0} MB
gcmax=\u00a76Maximaler Speicher\:\u00a7c {0} MB
gctotal=\u00a76Reservierter Speicher\:\u00a7c {0} MB
gcWorld=\u00a76 {0} "\u00a7c {1} \u00a76"\: \u00a7c {2} \u00a76 Chunks, \u00a7c {3} \u00a76 Einheiten, \u00a7c {4} \u00a76 Tiles.
geoipJoinFormat=\u00a76Spieler \u00a7c{0} \u00a76kommt aus \u00a7c{1}\u00a76.
geoipJoinFormat=\u00a7c{0} \u00a76kommt aus \u00a7c{1}\u00a76.
geoIpUrlEmpty=GeoIP Download-URL ist leer.
geoIpUrlInvalid=GeoIP Download-URL ist ung\u00fcltig.
givenSkull=\u00a76Dir wurde der Kopf von \u00a7c{0}\u00a76 gegeben.
giveSpawn=\u00a76Gebe \u00a7c{2} {0}\u00a76x\u00a7c {1}\u00a76.
giveSpawn=\u00a76Du gibst \u00a7c{2} {0}\u00a76x\u00a7c {1}\u00a76.
giveSpawnFailure=\u00a74Nicht genug Platz, \u00a7c{0} \u00a7c{1} \u00a74verloren.
godDisabledFor=\u00a7cdeaktiviert\u00a76 f\u00fcr\u00a7c {0}
godEnabledFor=\u00a7aaktiviert\u00a76 f\u00fcr\u00a7c {0}
godDisabledFor=\u00a76f\u00fcr\u00a7c {0}\u00a7cdeaktiviert\u00a76.
godEnabledFor=\u00a76f\u00fcr\u00a7c {0} \u00a7aaktiviert\u00a76.
godMode=\u00a76Unsterblichkeit\u00a7c {0}\u00a76.
groupDoesNotExist=\u00a74Kein Mitglied dieser Gruppe ist online\!
groupNumber=\u00a7c{0}\u00a7f online, f\u00fcr die ganze Liste\:\u00a7c /{1} {2}
hatArmor=\u00a74Du kannst diesen Gegenstand nicht als Hut nutzen\!
groupDoesNotExist=\u00a74Von dieser Gruppe ist kein Mitglied online\!
groupNumber=\u00a7c{0}\u00a7f Online. F\u00fcr die ganze Liste\:\u00a7c /{1} {2}
hatArmor=\u00a74Du kannst diesen Gegenstand nicht als Hut verwenden\!
hatEmpty=\u00a74Du tr\u00e4gst keinen Hut.
hatFail=\u00a74Du musst einen Gegenstand in der Hand halten.
hatPlaced=\u00a76Viel Spa\u00df mit deinem neuen Hut\!
hatRemoved=\u00a76Dein Hut wurde entfernt.
haveBeenReleased=\u00a76Du wurdest frei gelassen.
heal=\u00a76Du wurdest geheilt.
healDead=\u00a74Du kannst Tote nicht heilen\!
healOther=\u00a7c{0}\u00a76 geheilt.
helpConsole=Um die Hilfe der Konsole zu sehen, schreibe ?.
healDead=\u00a74Du kannst keine Toten heilen\!
healOther=\u00a7c{0}\u00a76 wurde geheilt.
helpConsole=Damit du die Hilfe der Konsole sehen kannst, muss du ? schreiben.
helpFrom=\u00a76Befehle von {0}\:
helpLine=\u00a76/{0}\u00a7r\: {1}
helpMatching=\u00a76Befehle \u00e4hnlich zu "\u00a7c{0}\u00a76"\:
helpMatching=\u00a76Befehle \u00e4hnlich wie "\u00a7c{0}\u00a76"\:
helpOp=\u00a74[Hilfe]\u00a7r \u00a76{0}\:\u00a7r {1}
helpPlugin=\u00a74{0}\u00a7r\: Plugin-Hilfe\: /help {1}
holdBook=\u00a74Du hast kein beschreibbares Buch in deiner Hand.
holdFirework=\u00a74Du musst Feuerwerk in deiner Hand halten um einen Effekt hinzuzuf\u00fcgen.
holdPotion=\u00a74Du musst einen Trank in der Hand haben, um ihm Effekte zu geben.
holeInFloor=\u00a74Loch im Boden\!
homes=\u00a76Homes\:\u00a7r {0}
homeSet=\u00a76Zuhause gesetzt.
holdFirework=\u00a74Damit du einen Effekt hinzzuf\u00fcgen kannst, musst du ein Feuerwerk in deiner Hand halten.
holdPotion=\u00a74Du du dem Trank einem Effekt geben kannst, musst du ihn zuerst in der Hand halten.
holeInFloor=\u00a74Wooops... Da ist ein Loch im Boden\!
homes=\u00a76Deine Heimaten\:\u00a7r {0}
homeSet=\u00a76Heimat festgelegt
hour=Stunde
hours=Stunden
ignoredList=\u00a76Ignoriert\:\u00a7r {0}
ignoreExempt=\u00a74Du kannst diesen Spieler nicht ignorieren.
ignorePlayer=\u00a76Du ignorierst ab jetzt Spieler\u00a7c {0}\u00a76.
illegalDate=Ung\u00fcltiges Datumsformat.
ignoreExempt=\u00a74Du kannst den Spieler nicht ignorieren.
ignorePlayer=\u00a76Du ignorierst ab jetzt\u00a7c {0}\u00a76.
illegalDate=Ung\u00fcltiges Datumformat.
infoChapter=\u00a76Kapitel ausw\u00e4hlen\:
infoChapterPages=\u00a7e---\u00a76 {0} \u00a7e--\u00a76 Seite \u00a7c{1}\u00a76 von \u00a7c{2} \u00a7e---
infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Seite \u00a7c{0}\u00a76/\u00a7c{1} \u00a7e----
@@ -190,9 +190,9 @@ insufficientFunds=\u00a74Nicht genug Guthaben.
invalidBanner=\u00a74Ung\u00fcltige Banner-Syntax.
invalidCharge=\u00a74Ung\u00fcltige Kosten.
invalidFireworkFormat=\u00a76Die Option \u00a74{0} \u00a76ist kein g\u00fcltiger Wert f\u00fcr \u00a74{1}\u00a76.
invalidHome=\u00a74Zuhause\u00a7c {0} \u00a74existiert nicht\!
invalidHome=\u00a74Die Heimat\u00a7c {0} \u00a74existiert nicht\!
invalidHomeName=\u00a74Ung\u00fcltiger Name\!
invalidItemFlagMeta=\u00a74Invalid itemflag meta\: \u00a7c{0}\u00a74.
invalidItemFlagMeta=\u00a74Ung\u00fcltige itemflag meta\: \u00a7c{0}\u00a74.
invalidMob=\u00a74Unbekannter Mob-Typ.
invalidNumber=Ung\u00fcltige Nummer.
invalidPotion=\u00a74Ung\u00fcltiger Trank.
@@ -201,29 +201,30 @@ invalidSignLine=\u00a74Die Zeile\u00a7c {0} \u00a74auf dem Schild ist ung\u00fcl
invalidSkull=\u00a74Bitte halte einen Spielerkopf in der Hand.
invalidWarpName=\u00a74Ung\u00fcltiger Warp-Punkt-Name\!
invalidWorld=\u00a74Ung\u00fcltige Welt.
inventoryClearFail=\u00a74Spieler {0} \u00a74hat keine\u00a7c {1} {2}\u00a74.
inventoryClearingAllArmor=\u00a76Alle Gegenst\u00e4nde im Inventar und R\u00fcstung von {0} \u00a76entfernt.
inventoryClearingAllItems=\u00a76Alle Gegenst\u00e4nde im Inventar von {0} \u00a76entfernt.
inventoryClearingAllStack=\u00a76Alle\u00a7c {0} \u00a76von {1} \u00a76entfernt.
inventoryClearingFromAll=\u00a76Leere das Inventar aller Spieler...
inventoryClearFail=\u00a74Der Spieler {0} \u00a74hat keine\u00a7c {1} {2}\u00a74.
inventoryClearingAllArmor=\u00a76Es wurden alle Gegenst\u00e4nde im Inventar sowie die R\u00fcstung von \u00A7c{0} \u00a76entfernt.
inventoryClearingAllItems=\u00a76Es wurden alle Gegenst\u00e4nde im Inventar von \u00A7c{0} \u00a76entfernt.
inventoryClearingAllStack=\u00a76Es wurden alle\u00a7c {0} \u00a76von \u00A7c{1} \u00a76entfernt.
inventoryClearingFromAll=\u00a76Die Inventare aller Spieler wurden geleert...
inventoryClearingStack=\u00a7c {0} {1} \u00a76von {2} \u00a76entfernt.
is=ist
isIpBanned=\u00a76IP \u00a7c{0} \u00a76wurde gesperrt.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
internalError=\u00a7cBeim ausf\u00fchren des Befehls ist ein interner Fehler aufgetreten.
itemCannotBeSold=\u00a74Dieser Gegenstand kann nicht verkauft werden.
itemMustBeStacked=\u00a74Gegenstand muss als Stapel verkauft werden. Eine Anzahl von 2s verkauft 2 Stapel, usw.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74Gegenstand muss als Stapel verkauft werden. Eine Anzahl von 2s verkauft 2 Stapel usw.
itemNames=\u00a76Kurze Gegenstandsnamen\:\u00a7r {0}
itemNotEnough1=\u00a74Du hast nicht genug Gegenst\u00e4nde zum Verkaufen.
itemNotEnough2=\u00a76Wenn du alles von dieser Art verkaufen m\u00f6chtest, nutze /sell itemname.
itemNotEnough3=\u00a76/sell itemname -1 verkauft alles bis auf eins, usw.
itemsConverted=\u00a76Alle Items in Bl\u00f6cke konvertiert.
itemsCsvNotLoaded=Konnte items.csv nicht laden\!
itemSellAir=Du versuchst Luft zu verkaufen? Nimm einen Gegenstand in die Hand.
itemsNotConverted=\u00a74Du hast keine Items die in Bl\u00f6cke konvertiert werden k\u00f6nnen.
itemNotEnough1=\u00a74Du hast nicht genug Gegenst\u00e4nde zu verkaufen.
itemNotEnough2=\u00a76Wenn du alles von dieser Art verkaufen m\u00f6chtest, solltest du /sell itemname nutzen.
itemNotEnough3=\u00a76/sell itemname -1 verkauft alles bis auf eins usw.
itemsConverted=\u00a76Alle Items wurden in Bl\u00f6cke konvertiert.
itemsCsvNotLoaded=items.csv konnte nicht geladen werden\!
itemSellAir=Du versuchst Luft zu verkaufen?! Nimm einen Gegenstand in die Hand.
itemsNotConverted=\u00a74Du hast keine Items, die in Bl\u00f6cke konvertiert werden k\u00f6nnen.
itemSold=\u00a7aVerkauft f\u00fcr \u00a7c{0}\u00a7a ({1} {2} Einheiten je {3})
itemSoldConsole=\u00a7a{0} $averkauft {1} f\u00fcr \u00a7a{2} \u00a7a({3} Einheiten je {4})
itemSpawn=\u00a76Gebe\u00a7c {0}\u00a76x\u00a7c {1}
itemType=\u00a76Gegenstand\:\u00a7c {0}
itemSpawn=\u00a76Du gibst dir\u00a7c {0}\u00a76x\u00a7c {1}
itemType=\u00a76Gegenstand\:\u00a7c {0} \u00a76
jailAlreadyIncarcerated=\u00a74Spieler ist bereits im Gef\u00e4ngnis\:\u00a7c {0}
jailList=\u00a76Jails\:\u00a7r {0}
jailMessage=\u00a74Du hast ein Verbrechen begangen, also musst du deine Zeit absitzen.
@@ -233,122 +234,122 @@ jailReleasedPlayerNotify=\u00a76Du wurdest freigelassen\!
jailSentenceExtended=\u00a76Gef\u00e4ngniszeit erweitert auf\: {0}
jailSet=\u00a76Gef\u00e4ngnis\u00a7c {0} \u00a76wurde erstellt.
jumpError=\u00a74Das w\u00fcrde deinen Computer \u00fcberlasten.
kickDefault=Vom Server geworfen.
kickedAll=\u00a74Alle Spieler vom Server geworfen.
kickDefault=Du wurdest vom Server geworfen.
kickedAll=\u00a74Alle Spieler wurden vom Server geworfen.
kickExempt=\u00a74Du kannst diesen Spieler nicht rauswerfen.
kill=\u00a7c{0} \u00a76get\u00f6tet.
killExempt=\u00a74Du kannst \u00a7c{0}\u00a74 nicht t\u00f6ten.
kitContains=\u00a76Ausr\u00fcstung \u00a7c{0} \u00a76enth\u00e4lt:
kitCost=\ \u00a77\u00a7o({0})\u00a7r
kitDelay=\u00a7m{0}\u00a7r
kitError=\u00a74Es gibt keine g\u00fcltigen Ausr\u00fcstungen.
kitError2=\u00a74Diese Ausr\u00fcstung ist nicht korrekt definiert. Kontaktiere einen Administrator.
kitGiveTo=\u00a76Gebe \u00a7c{1}\u00a76 \u00a7c{0}\u00a76-Ausr\u00fcstung.
kitInvFull=\u00a74Dein Inventar ist voll, lege Ausr\u00fcstung auf den Boden.
kitError=\u00a74Es gibt keine g\u00fcltigen Kits.
kitError2=\u00a74Dieses Kit ist nicht korrekt definiert. Kontaktiere einen Administrator.
kitGiveTo=\u00a76Du gibst \u00a7c{1}\u00a76 \u00a7c{0}\u00a76-Ausr\u00fcstung.
kitInvFull=\u00a74Dein Inventar ist voll. Das Kit wird auf den Boden gelegt.
kitItem=\u00a76- \u00a7f{0}
kitNotFound=\u00a74Diese Ausr\u00fcstung gibt es nicht.
kitOnce=\u00a74Du kannst diese Ausr\u00fcstung nicht nochmals bekommen.
kitReceive=\u00a7c{0}\u00a76-Ausr\u00fcstung erhalten.
kits=\u00a76Ausr\u00fcstungen\: \u00a7r{0}
kitTimed=\u00a74Du kannst diese Ausr\u00fcstung nicht innerhalb von\u00a7c {0}\u00a74 anfordern.
leatherSyntax=\u00a76Leder-Farbdefinition\: color\:<red>,<green>,<blue> z.B.\: color\:255,0,0.
kitNotFound=\u00a74Dieses Kit gibt es nicht.
kitOnce=\u00a74Du kannst diese Kit nicht nochmals bekommen.
kitReceive=\u00a7c{0}\u00a76-Kit erhalten.
kits=\u00a76Kits\: \u00a7r{0}
kitTimed=\u00a74Du kannst dieses Kit nicht innerhalb von\u00a7c {0}\u00a74 anfordern.
leatherSyntax=\u00a76Leder-Farberkl\u00e4rung\: color\:<red>,<green>,<blue> z.B.\: color\:255,0,0.
lightningSmited=\u00a76Du wurdest gepeinigt.
lightningUse=\u00a76Peinige {0}
lightningUse=\u00a76Peinige \u00A7c{0}
listAfkTag=\u00a77[Abwesend]\u00a7r
listAmount=\u00a76Es sind \u00a7c{0}\u00a76 von maximal \u00a7c{1}\u00a76 Spielern online.
listAmountHidden=\u00a76Es sind \u00a7c{0}\u00a76/{1}\u00a76 von maximal \u00a7c{2}\u00a76 Spielern online.
listGroupTag=\u00a76{0}\u00a7r\: \u00a7r
listHiddenTag=\u00a77[Versteckt]\u00a7r
loadWarpError=\u00a74Fehler beim Laden von Warp-Punkt {0}.
loadWarpError=\u00a74Beim Laden vom Warp-Punkt \u00A7c{0}\u00a76 ist ein Fehler aufgetreten.
localFormat=[L]<{0}> {1}
localNoOne=
mailClear=\u00a76Um deine Nachrichten zu l\u00f6schen, schreibe\u00a7c /mail clear.
mailCleared=\u00a76Nachrichten gel\u00f6scht\!
mailCleared=\u00a76Nachrichten wurden gel\u00f6scht\!
mailDelay=In der letzten Minute wurden zu viele Mails gesendet. Maximum\: {0}
mailFormat=\u00a76[\u00a7r{0}\u00a76] \u00a7r{1}
mailMessage={0}
mailSent=\u00a76Nachricht gesendet\!
mailSent=\u00a76Nachricht wurde gesendet\!
mailSentTo=\u00a7c{0}\u00a76 wurde diese Mail gesendet\:
mailTooLong=\u00a74Nachricht zu lang. Schreibe nicht mehr als 1000 Zeichen.
markedAsAway=\u00a76Du wirst als abwesend angezeigt.
mailTooLong=\u00a74Die Nachricht ist zu lang. Benutze weniger als 1000 Zeichen.
markedAsAway=\u00a76Du wirst jetzt als abwesend angezeigt.
markedAsNotAway=\u00a76Du wirst nicht mehr als abwesend angezeigt.
markMailAsRead=\u00a76Um deine Nachrichten zu l\u00f6schen, schreibe\u00a7c /mail clear.
matchingIPAddress=\u00a76Die folgenden Spieler haben sich vorher schonmal mit der IP-Adresse eingeloggt\:
maxHomes=\u00a74Du kannst nicht mehr als\u00a7c {0} \u00a74Homes setzen.
maxHomes=\u00a74Du kannst nicht mehr als\u00a7c {0} \u00a74Heimaten setzen.
maxMoney=\u00a74Diese \u00dcberweisung \u00fcberschreitet das Limit des Empf\u00e4ngers.
mayNotJail=\u00a74Du kannst diese Person nicht einsperren.
mayNotJailOffline=\u00a74Du darfst abgemeldete Spieler nicht einsperren.
me=Du
minimumPayAmount=\u00a7cThe minimum amount you can pay is {0}.
minimumPayAmount=\u00a7c{0}\u00a74 ist der Mindestbetrag, den du f\u00fcr eine \u00fcberweisung aufbringen musst.
minute=Minute
minutes=Minuten
missingItems=\u00a74Du hast nicht \u00a7c{0}x {1}\u00a74.
mobDataList=\u00a76G\u00fcltige Mob Daten\:\u00a7r {0}
mobsAvailable=\u00a76Mobs\:\u00a7r {0}
mobSpawnError=\u00a74Fehler beim \u00c4ndern des Monster-Spawner.
mobSpawnLimit=Anzahl an Monster auf Serverlimit beschr\u00e4nkt.
mobSpawnError=\u00a74Beim \u00c4ndern des Monster-Spawners ist ein Fehler aufgetreten.
mobSpawnLimit=Die Anzahl an Monstern wurde auf das festgelegte Limit beschr\u00e4nkt.
mobSpawnTarget=\u00a74Zielblock muss ein Monster-Spawner sein.
moneyRecievedFrom=\u00a7a{1} \u00a7ahat dir {0} gegeben.
moneySentTo=\u00a7aDu hast {1}\u00a7a {0} gegeben.
moneySentTo=\u00a7aDu hast \u00a76{1} {0} \u00A7agegeben.
month=Monat
months=Monate
moreThanZero=\u00a74Anzahl muss gr\u00f6\u00dfer als 0 sein.
moveSpeed=\u00a76Setze {0}-Geschwindigkeit f\u00fcr \u00a7c{2} \u00a76auf \u00a7c{1}.
msgDisabled=\u00a76Receiving messages \u00a7cdisabled\u00a76.
msgDisabledFor=\u00a76Receiving messages \u00a7cdisabled \u00a76for \u00a7c{0}\u00a76.
msgEnabled=\u00a76Receiving messages \u00a7cenabled\u00a76.
msgEnabledFor=\u00a76Receiving messages \u00a7cenabled \u00a76for \u00a7c{0}\u00a76.
msgFormat=\u00a76[\u00a7c{0}\u00a76 -> \u00a7c{1}\u00a76] \u00a7r{2}
msgIgnore=\u00a7c{0} \u00a74has messages disabled.
moveSpeed=\u00a76Die {0}-Geschwindigkeit f\u00fcr \u00a7c{2} \u00a76wurde auf \u00a7c{1} \u00a76gesetzt.
msgDisabled=\u00a76Das Empfangen von Nachrichten wurde \u00a7cdeaktiviert\u00a76.
msgDisabledFor=\u00a76Das Empfangen von Nachrichten wurde f\u00fcr \u00a7a{0} \u00a7cdeaktiviert\u00a76.
msgEnabled=\u00a76Das Empfangen von Nachrichten wurde \u00a7caktiviert\u00a76.
msgEnabledFor=\u00a76Das Empfangen von Nachrichten wurden \u00fcr\u00a7a{0} \u00a7aktiviert\u00a76.
msgFormat=\u00a76[\u00a7c{0}\u00a76 --> \u00a7c{1}\u00a76] \u00a7r{2}
msgIgnore=\u00a7c{0} \u00a74hat Benachrichtigungen deaktiviert.
multipleCharges=\u00a74Du kannst einem Feuerwerk nur einen Feuerwerksstern geben.
multiplePotionEffects=\u00a74Du kannst diesem Trank nur einen Effekt geben.
mutedPlayer=\u00a76Spieler\u00a7c {0}\u00a76 ist nicht mehr stumm.
mutedPlayerFor=\u00a76Spieler\u00a7c {0} \u00a76ist nun stumm f\u00fcr\u00a7c {1} \u00a76.
mutedUserSpeaks={0} versuchte zu sprechen, aber ist stumm geschaltet.
muteExempt=\u00a74Du darfst diesen Spieler nicht muten.
muteExempt=\u00a74Du darfst diesen Spieler nicht stumm schalten.
muteExemptOffline=\u00a74Du darfst abgemeldete Spieler nicht stummschalten.
muteNotify=\u00a7c{0} \u00a76hat Spieler \u00a7c{1}\u00a76 stumm geschaltet.
muteNotifyFor=\u00a7c{0} \u00a76has muted player \u00a7c{1}\u00a76 for\u00a7c {2}\u00a76.
muteNotifyFor=\u00a7c{0} \u00a76hat den Spieler \u00a7c{1}\u00a76 f\u00fcr\u00a7c {2}\u00a76stumm geschaltet.
nearbyPlayers=\u00a76Spieler in der N\u00e4he\:\u00a7r {0}
negativeBalanceError=\u00a74Spieler darf keine Schulden machen.
negativeBalanceError=\u00a74Spieler d\u00fcrfen keine Schulden machen.
nickChanged=\u00a76Spitzname ge\u00e4ndert.
nickDisplayName=\u00a74Du musst change-displayname in der Essentials-Konfiguration aktivieren.
nickInUse=\u00a74Dieser Name wird bereits verwendet.
nickNamesAlpha=\u00a74Nicknamen d\u00fcrfen nur alphanumerische Zeichen enthalten.
nickNamesOnlyColorChanges=\u00a74Nicknames can only have their colors changed.
nickNamesOnlyColorChanges=\u00a74Beim Spitznamen darf nur die Farbe ge\u00e4ndert werden.
nickNoMore=\u00a76Du hast keinen Spitznamen mehr.
nickSet=\u00a76Dein Spitzname ist nun \u00a7c{0}.
nickSet=\u00a76Dein Spitzname lautet nun \u00a7c{0}.
nickTooLong=\u00a74Dieser Spitzname ist zu lang.
noAccessCommand=\u00a74Du hast keinen Zugriff auf diesen Befehl.
noAccessPermission=\u00a74Du hast keine Rechte, um dies zu betreten \u00a7c{0}\u00a74.
noAccessCommand=\u00a74Dir ist es nicht erlaubt, den Befehl zu verwenden.
noAccessPermission=\u00a74Dir ist es nicht erlaubt, das zu betreten. \u00a7c{0}\u00a74.
noBreakBedrock=\u00a74Du darfst Grundgestein nicht zerst\u00f6ren.
noDestroyPermission=\u00a74Du hast keine Rechte, um dies zu zerst\u00f6ren \u00a7c{0}\u00a74.
noDestroyPermission=\u00a74Du bist nicht berechtigt, um dies zu zerst\u00f6ren \u00a7c{0}\u00a74.
noDurability=\u00a74Dieser Gegenstand hat keine Haltbarkeit.
northEast=NE
northEast=NO
north=N
northWest=NW
noGodWorldWarning=\u00a74Warnung\! Unsterblichkeitsmodus ist in dieser Welt deaktiviert.
noHelpFound=\u00a74Keine \u00fcbereinstimmenden Befehle.
noHomeSetPlayer=\u00a76Spieler hat kein Zuhause gesetzt.
noHomeSetPlayer=\u00a76Der Spieler hat keine Heimat festgelegt.
noIgnored=\u00a76Du ignorierst niemanden.
noJailsDefined=\u00a76No jails defined.
noKitGroup=\u00a74Du hast auf diese Ausr\u00fcstung keinen Zugriff.
noKitPermission=\u00a74Du brauchst die Berechtigung \u00a7c{0}\u00a74 um diese Ausr\u00fcstung anzufordern.
noKits=\u00a76Es sind keine Ausr\u00fcstungen verf\u00fcgbar.
noLocationFound=\u00a74Keine g\u00fcltige Position gefunden.
noJailsDefined=\u00a76Es ist kein Gef\u00c4ngnis erstellt.
noKitGroup=\u00a74Du hast auf dieses Kit keinen Zugriff.
noKitPermission=\u00a74Du brauchst die Berechtigung \u00a7c{0}\u00a74 um dieses Kit anzufordern.
noKits=\u00a76Es sind keine Kits verf\u00fcgbar.
noLocationFound=\u00a74Es wurde keine g\u00fcltige Position gefunden.
noMail=\u00a76Du hast keine Nachrichten.
noMatchingPlayers=\u00a76Keine \u00fcbereinstimmenden Spieler gefunden.
noMetaFirework=\u00a74Du darfst keine Berechtigung Feuerwerk-Metadaten zu bearbeiten.
noMetaFirework=\u00a74Du hast keine Berechtigung Feuerwerk-Metadaten zu bearbeiten.
noMetaJson=JSON MetaDaten werden in dieser Bukkit-Version nicht unterst\u00fctzt.
noMetaPerm=\u00a74Du darfst dem Gegenstand \u00a7c{0}\u00a74 keine Metadaten geben.
none=keine
noNewMail=\u00a76Du hast keine neue Nachrichten.
noPendingRequest=\u00a74Du hast keine Teleportierungsanfragen.
noPerm=\u00a74Du hast die Berechtigung \u00a7c{0}\u00a74 nicht.
noPermissionSkull=$4Du hast nicht die Berechtigung diesen Kopf zu \u00e4ndern.
noPermissionSkull=$4Du bist nicht berechtigt, diesen Kopf zu \u00e4ndern.
noPermToAFKMessage=\u00a74Du bist nicht berechtigt eine AFK-Nachricht zu setzen.
noPermToSpawnMob=\u00a74Du bist nicht berechtigt diesen Mob zu spawnen.
noPlacePermission=\u00a7cDu hast keine Rechte einen Block in der N\u00e4he des Schildes zu platzieren.
noPlacePermission=\u00a7cDu bist nicht berechtigt, einen Block in der N\u00e4he des Schildes zu platzieren.
noPotionEffectPerm=\u00a74Du darfst den Zaubertrankeffekt \u00a7c{0} \u00a74diesem Trank nicht hinzuf\u00fcgen.
noPowerTools=\u00a76Du hast keine Powertools zugewiesen.
notAcceptingPay=\u00a74{0} \u00a74akzeptiert keine Zahlungen.
@@ -361,37 +362,37 @@ nothingInHand=\u00a74Du hast nichts in der Hand.
notRecommendedBukkit=\u00a74* \! * Die verwendete Bukkit-Version ist nicht f\u00fcr Essentials empfohlen.
notSupportedYet=Noch nicht verf\u00fcgbar.
now=jetzt
noWarpsDefined=\u00a76Keine Warp-Punkte erstellt.
nuke=\u00a75M\u00f6ge der Tod auf Euch hernieder prasseln\!
numberRequired=Ein Zahl wird ben\u00f6tigt.
noWarpsDefined=\u00a76Es sind keine Warp-Punkte erstellt.
nuke=\u00a75M\u00f6ge der Tod auf Euch hernieder prasseln und euch vernichten :>\!
numberRequired=Du musst eine Zahl angeben.
onlyDayNight=/time unterst\u00fctzt nur day und night.
onlyPlayers=\u00a74Nur Ingame-Spieler k\u00f6nnen \u00a7c{0} \u00a74benutzen.
onlyPlayerSkulls=\u00a74Du kannst nur den Besitzer von Spielerk\u00f6pfen (\u00a7c397\:3\u00a74) \u00e4ndern.
onlySunStorm=\u00a74/weather unterst\u00fctzt nur sun und storm.
openingDisposal=\u00a76Opening disposal menu...
openingDisposal=\u00a76\u00f6ffne das Entsorgungsmen\u00fc...
orderBalances=\u00a76Ordne die Kontost\u00e4nde von\u00a7c {0} \u00a76Benutzern, bitte warten ...
oversizedTempban=\u00a74Du darfst einen Spieler nicht f\u00fcr so eine lange Zeit bannen.
payConfirmToggleOff=\u00a76You will no longer be prompted to confirm payments.
payConfirmToggleOn=\u00a76You will now be prompted to confirm payments.
payConfirmToggleOff=\u00a76Du wirst nicht l\u00c4nger aufgefordert, Zahlungen zu best\u00e4tigen.
payConfirmToggleOn=\u00a76Du wirst ab jetzt aufgefordert, Zahlungen zu best\u00e4tigen.
payMustBePositive=\u00a74Du kannst nur positive Betr\u00e4ge \u00FCberweisen.
payToggleOff=\u00a76Du akzeptierst keine Zahlungen mehr.
payToggleOn=\u00a76Du akzeptierst nun Zahlungen.
pendingTeleportCancelled=\u00a74Laufende Teleportation abgebrochen.
pendingTeleportCancelled=\u00a74Die laufende Teleportation wurde abgebrochen.
playerBanIpAddress=\u00a76Spieler\u00a7c {0} \u00a76hat die IP-Adresse\u00a7c {1} \u00a76f\u00fcr\: \u00a7c{2} \u00a76gesperrt.
playerBanned=\u00a76Spieler\u00a7c {0} \u00a76bannte\u00a7c {1} \u00a76wegen\: \u00a7c{2}\u00a76.
playerInJail=\u00a74Spieler ist bereits in Gef\u00e4ngnis\u00a7c {0}\u00a76.
playerBanned=\u00a76Spieler\u00a7c {0} \u00a76hat\u00a7c {1} \u00a76wegen\: \u00a7c{2}\u00a76 gebannt.
playerInJail=\u00a74Spieler ist bereits im Gef\u00e4ngnis\u00a7c {0}\u00a76.
playerJailed=\u00a76Spieler\u00a7c {0} \u00a76eingesperrt.
playerJailedFor=\u00a76Spieler\u00a7c {0} \u00a76eingesperrt f\u00fcr {1}.
playerKicked=\u00a76Spieler\u00a7c {0} \u00a76hat\u00a7c {1} \u00a76für \u00a7c {2} \u00a76rausgeworfen.
playerJailedFor=\u00a76Spieler\u00a7c {0} \u00a76wurde f\u00fcr {1} eingesperrt.
playerKicked=\u00a76Spieler\u00a7c {0} \u00a76hat\u00a7c {1} \u00a76f\u00fcr \u00a7c {2} \u00a76rausgeworfen.
playerMuted=\u00a76Du bist jetzt stumm\!
playerMutedFor=\u00a76Du bist jetzt stumm f\u00fcr\u00a7c {0}.
playerMutedFor=\u00a76Du bist jetzt f\u00fcr\u00a7c {0} \u00a76stumm.
playerNeverOnServer=\u00a74Spieler\u00a7c {0} \u00a74war niemals auf diesem Server.
playerNotFound=\u00a74Spieler nicht gefunden.
playerTempBanned=\u00a76Spieler \u00a7c{0}\u00a76 hat \u00a7c{1}\u00a76 f\u00fcr \u00a7c{2} \u00a76 gebannt wegen: \u00a7c{3}\u00a76.
playerTempBanned=\u00a76Spieler \u00a7c{0}\u00a76 hat \u00a7c{1}\u00a76 f\u00fcr \u00a7c{2} \u00a76 gebannt. Grund: \u00a7c{3}\u00a76.
playerUnbanIpAddress=\u00a76Spieler\u00a7c {0} \u00a76hat die IP-Adresse {1} \u00a76entsperrt.
playerUnbanned=\u00a76Spieler\u00a7c {0} \u00a76hat {1}\u00a76 entbannt.
playerUnmuted=\u00a76Du bist nicht mehr stumm.
pong=Pong\!
pong=\u00A7b..::\u00a74Pông\u00A7b::..\!
posPitch=\u00a76Pitch\: {0} (Neigewinkel)
possibleWorlds=\u00a76M\u00f6gliche Welten sind die Nummern \u00a7c0\u00a76 bis \u00a7c{0}\u00a76.
posX=\u00a76X\: {0} (+Ost <-> -West)
@@ -401,35 +402,35 @@ posZ=\u00a76Z\: {0} (+S\u00fcd <-> -Nord)
potions=\u00a76Zaubertr\u00e4nke\:\u00a7r {0}\u00a76.
powerToolAir=\u00a74Befehl kann nicht mit Luft verbunden werden.
powerToolAlreadySet=\u00a74Der Befehl \u00a7c{0}\u00a74 ist bereits \u00a7c{c{1}\u00a74 zugewiesen.
powerToolAttach=\u00a76Befehl \u00a7c{0}\u00a7f erfolgreich an {1} gebunden.
powerToolAttach=\u00a76Befehl \u00a7c{0}\u00a7f wurde erfolgreich an {1} gebunden.
powerToolClearAll=\u00a76Alle Powertoolbefehle wurden entfernt.
powerToolList=\u00a76Gegenstand \u00a7c{1} \u00a76hat die folgenden Befehle\: \u00a7c{0}\u00a76.
powerToolListEmpty=\u00a74Gegenstand \u00a7c{0} $4hat keinen Befehl.
powerToolNoSuchCommandAssigned=\u00a74Der Befehl \u00a7c{0}\u00a74 wurde nicht \u00a7c{1}\u00a74 zugewiesen.
powerToolRemove=\u00a76Der Befehl \u00a7c{0}\u00a76 wurde von \u00a7c{1}\u00a76 entfernt.
powerToolRemoveAll=\u00a76Alle Befehle von \u00a7c{0}\u00a76 entfernt.
powerToolsDisabled=\u00a76Alle deine Powertools wurden deaktiviert.
powerToolsEnabled=\u00a76Alle deine Powertools wurden aktiviert.
powerToolRemoveAll=\u00a76Alle Befehle von \u00a7c{0}\u00a76 wurden entfernt.
powerToolsDisabled=\u00a76All deine Powertools wurden deaktiviert.
powerToolsEnabled=\u00a76All deine Powertools wurden aktiviert.
pTimeCurrent=\u00a76Die Zeit f\u00fcr\u00a7c {0} \u00a76ist\u00a7c {1}\u00a76.
pTimeCurrentFixed=\u00a76Die Zeit f\u00fcr \u00a7c{0}\u00a76 wurde auf \u00a7c{1}\u00a76 gesetzt.
pTimeNormal=\u00a76Die Zeit f\u00fcr \u00a7c{0}\u00a76 ist normal und entspricht der Serverzeit.
pTimeOthersPermission=\u00a74Du hast keine Berechtigung die Zeit von anderen Spielern zu \u00e4ndern.
pTimePlayers=\u00a76Diese Spieler haben ihre eigene Zeit\:\u00a7r
pTimeReset=\u00a76Zeit wurde zur\u00fcckgesetzt f\u00fcr\: \u00a7c{0}
pTimeSet=\u00a76Zeit wurde f\u00fcr \u00a7c{1}\u00a76 auf \u00a7c{0}\u00a76 gesetzt.
pTimeSetFixed=\u00a76Spielerzeit ist festgesetzt auf \u00a7c{0}\u00a76 f\u00fcr\: \u00a7c{1}
pTimeReset=\u00a76Die Zeit wurde f\u00fcr \u00a7c{0} \u00a76zur\u00fcckgesetzt.
pTimeSet=\u00a76DieZeit wurde f\u00fcr \u00a7c{1}\u00a76 auf \u00a7c{0}\u00a76 gesetzt.
pTimeSetFixed=\u00a76Spielerzeit ist f\u00fcr\: \u00a7c{1} auf \u00a7c{0}\u00a76 fixiert.
pWeatherCurrent=\u00a76Das Wetter von\u00a7c {0} \u00a76ist\u00a7c {1}\u00a76.
pWeatherInvalidAlias=\u00a74Ung\u00fcltiger Wettertyp
pWeatherNormal=\u00a7cDas Wetter von \u00a7c{0}\u00a76 ist normal, wie auf dem Server.
pWeatherOthersPermission=\u00a74Du darfst keinem Spieler das Wetter ver\u00e4ndern.
pWeatherNormal=\u00a7cDas Wetter von \u00a7c{0}\u00a76 ist normal. (Entspricht dem Wetter auf dem Server).
pWeatherOthersPermission=\u00a74Du darfst das Wetter bei Spielern nicht ver\u00e4ndern.
pWeatherPlayers=\u00a76Diese Spieler haben ihr eigenes Wetter\:\u00a7r
pWeatherReset=\u00a76Das Spielerwetter wurde zur\u00fcckgesetzt f\u00fcr\: \u00a7c{0}
pWeatherSet=\u00a76Spielerwetter gesetzt auf \u00a7c{0}\u00a76 f\u00fcr\: \u00a7c{1}.
pWeatherReset=\u00a76Das Spielerwetter wurde f\u00fcr\: \u00a7c{0}\u00a76 zur\u00fcckgesetzt.
pWeatherSet=\u00a76Spielerwetter f\u00fcr\: \u00a7c{1}\u00a76 wurde auf \u00a7c{0}\u00a76 gesetzt.
questionFormat=\u00a72[Frage]\u00a7r {0}
radiusTooBig=\u00a74Radius ist zu gro\u00df\! Maximaler Radius ist {0}.
radiusTooBig=\u00a74Der Radius ist zu gro\u00df\! Maximaler Radius ist {0}.
readNextPage=\u00a76Tippe\u00a7c /{0} {1} \u00a76f\u00fcr die n\u00e4chste Seite.
realName=\u00a7f{0}\u00a7r\u00a76 ist \u00a7f{1}
recentlyForeverAlone=\u00a74{0} ging vor Kurzem offline.
recentlyForeverAlone=\u00a74{0} ging vor kurzem Offline.
recipe=\u00a76Rezept f\u00fcr \u00a7c{0}\u00a75 (\u00a7c{1}\u00a76 von \u00a7c{2}\u00a76)
recipeBadIndex=Es gibt kein Rezept mit dieser Nummer.
recipeFurnace=\u00a76Schmelzen\: \u00a7c{0}\u00a76.
@@ -446,120 +447,121 @@ repairAlreadyFixed=\u00a74Dieser Gegenstand ben\u00f6tigt keine Reparatur.
repairEnchanted=\u00a74Du darfst keine verzauberten Gegenst\u00e4nde reparieren.
repairInvalidType=\u00a74Dieser Gegenstand kann nicht repariert werden.
repairNone=\u00a74Es sind keine Gegenst\u00e4nde vorhanden, die repariert werden k\u00f6nnen.
requestAccepted=\u00a77Teleportierungsanfrage akzeptiert.
requestAccepted=\u00a77Du hast die Teleportierungsanfrage \u00a7aangenommen.
requestAcceptedFrom=\u00a7c{0} \u00a76hat deine Teleportierungsanfrage angenommen.
requestDenied=\u00a76Teleportierungsanfrage verweigert.
requestDenied=\u00a76Du hast die Teleportierungsanfrage \u00a7cabgelehnt.
requestDeniedFrom=\u00a7c{0} \u00a76hat deine Teleportierungsanfrage abgelehnt.
requestSent=\u00a76Anfrage gesendet an\u00a7c {0}\u00a76.
requestSent=\u00a76Eine Anfrage wurde an\u00a7c {0}\u00a76 gesendet.
requestSentAlready=\u00a74Du hast {0}\u00a74 bereits eine Teleportierungsanfrage gesendet.
requestTimedOut=\u00a74Teleportierungsanfrage ist abgelaufen.
requestTimedOut=\u00a74Die Teleportierungsanfrage ist abgelaufen.
requiredBukkit=\u00a76* \! * Du brauchst mindestens CraftBukkit Build \#{0}, lade es von http\://dl.bukkit.org/downloads/craftbukkit/
resetBal=\u00a76Kontostand aller Spieler auf dem Server auf \u00a7a{0} \u00a76gesetzt.
resetBal=\u00a76Du hast den Kontostand aller Spieler auf \u00a7a{0} \u00a76gesetzt.
resetBalAll=\u00a76Guthaben wurde f\u00fcr alle Spieler auf \u00a7c{0} zur\u00fcckgesetzt.
returnPlayerToJailError=\u00a74Fehler beim zur\u00fccksetzen von\u00a7c {0} \u00a74in Gef\u00e4ngis\: {1}\!
returnPlayerToJailError=\u00a74Fehler beim zur\u00fccksetzen von\u00a7c {0} \u00a74im Gef\u00e4ngis\: {1}\!
runningPlayerMatch=\u00a76Suche nach Spielern mit ''\u00a7c{0}\u00a76'' im Namen (das kann etwas dauern)
second=Sekunde
seconds=Sekunden
seenAccounts=\u00a76Spieler ist auch bekannt als\:\u00a7c {0}
seenOffline=\u00a76Spieler\u00a7c {0} \u00a76ist \u00a74offline\u00a76 seit \u00a7c{1}\u00a76.
seenOffline=\u00a76Spieler\u00a7c {0} \u00a76ist seit \u00a7c{1}\u00a74 offline\u00a76.
seenOnline=\u00a76Spieler\u00a7c {0} \u00a76ist seit \u00a7c{1}\u00a7a online.
sellBulkPermission=\u00a76Du hast keine Permission, in Massen zu verkaufen.
sellHandPermission=\u00a76Du hast keine Permission, einzeln zu verkaufen.
sellBulkPermission=\u00a76Du hast keine Berechtigung, in Massen zu verkaufen.
sellHandPermission=\u00a76Du hast keine Berechtigung, einzeln zu verkaufen.
serverFull=Server ist voll
serverTotal=\u00a76Server insgesamt\:\u00a7c {0}
setBal=\u00a7aDein Kontostand wurde auf {0} gesetzt.
setBalOthers=\u00a7aDu hast den Kontostand von {0}\u00a7a auf {1} gesetzt.
setSpawner=\u00a76Mob-Spawner-Typ zu \u00a7c{0}\u00a76 ge\u00e4ndert.
serverUnsupported=\u00a7cDu verwendest eine Serverversion, die nicht unterst\u00fctzt wird!
setBal=\u00a7aDein Kontostand wurde auf \u00a7c{0} \u00a7agesetzt.
setBalOthers=\u00a7aDu hast den Kontostand von \u00A76{0}\u00a7a auf \u00A7c{1} \u00a7a gesetzt.
setSpawner=\u00a76Mob-Spawner-Typ ge\u00e4ndert zu \u00a7c{0}\u00a76.
sheepMalformedColor=\u00a74Ung\u00fcltige Farbe.
shoutFormat=\u00a76[Schrei]\u00a7r {0}
signFormatFail=\u00a74[{0}]
signFormatSuccess=\u00a71[{0}]
signFormatTemplate=[{0}]
signProtectInvalidLocation=\u00a74Du hast keine Rechte ein Schild hier zu setzen.
signProtectInvalidLocation=\u00a74Du hast keine Berechtigung hier ein Schild zu platzieren.
similarWarpExist=\u00a74Ein Warp-Punkt mit einem \u00e4hnlichen Namen existiert bereits.
southEast=SE
southEast=SO
south=S
southWest=SW
skullChanged=\u00a76Kopf zu \u00a7c{0} \u00a76ge\u00e4ndert.
slimeMalformedSize=\u00a74Ung\u00fcltige Gr\u00f6\u00dfe.
socialSpy=\u00a76SocialSpy f\u00fcr \u00a7c{0}\u00a76\ \u00a7c{1}\u00a76.
socialSpyMsgFormat=\u00a76[\u00a7c{0}\u00a76 -> \u00a7c{1}\u00a76] \u00a77{2}
socialSpyMsgFormat=\u00a76[\u00a7c{0}\u00a76 --> \u00a7c{1}\u00a76] \u00a77{2}
socialSpyMutedPrefix=\u00a7f[\u00a76SS\u00a7f] \u00a77(muted) \u00a7r
socialSpyPrefix=\u00a7f[\u00a76SS\u00a7f] \u00a7r
soloMob=\u00a74Das Monster m\u00f6chte allein sein.
spawned=erzeugt
spawnSet=\u00a76Spawn-Punkt gesetzt f\u00fcr Gruppe \u00a7c{0}\u00a76.
spectator=Zuschauer
sudoExempt=\u00a74Du kannst f\u00fcr diesen Spieler kein sudo-Kommando ausf\u00fchren.
spawnSet=\u00a76Du hast denSpawn-Punkt f\u00fcr die Gruppe \u00a7c{0}\u00a76 gesetzt.
spectator=Zuschauermodus
sudoExempt=\u00a74Du kannst f\u00fcr diesen Spieler keine Sudo-Befehle ausf\u00fchren.
sudoRun=\u00a7c {0} \u00a76 wurde gezwungen \u00a7r /{1} \u00a76auszuf\u00fchren
suicideMessage=\u00a76Ad\u00e9, du schn\u00f6de Welt...
suicideSuccess=\u00a76{0} \u00a76hat sich das Leben genommen.
suicideSuccess=\u00a76{0} \u00a76ist von uns gegangen. Rest in Peace :-(
survival=\u00dcberleben
takenFromAccount=\u00a7a{0} wurden von deinem Konto abgezogen.
takenFromOthersAccount=\u00a7a{0} genommen von {1}\u00a7a. Neuer Kontostand\: {2}.
teleportAAll=\u00a76Teleportierungsanfrage zu allen Spielern gesendet...
teleportAll=\u00a76Teleportiere alle Spieler...
takenFromAccount=\u00a7aVon deinem Konto wurden \u00a7c{0} \u00a7aabgezogen.
takenFromOthersAccount=\u00A7aDu hast\u00a76 {1} \u00a7c{0} \u00a7aweggenommen. Neuer Kontostand\: \u00a7c{2}.
teleportAAll=\u00a76Du hast an allen Spielern eine Teleportationsanfrage geschickt.
teleportAll=\u00a76Teleportation l\u00e4uft f\u00fcr alle Spieler...
teleportationCommencing=\u00a76Teleportation gestartet...
teleportationDisabled=\u00a76Teleportation \u00a7cdeaktiviert\u00a76.
teleportationDisabledFor=\u00a76Teleportation f\u00fcr \u00a7c{0} deaktiviert\u00a76.
teleportationEnabled=\u00a76Teleportation \u00a7caktiviert\u00a76.
teleportationEnabledFor=\u00a76Teleportation f\u00fcr \u00a7c{0} aktiviert\u00a76.
teleportAtoB=\u00a7c{0}\u00a76 teleportiert dich zu {1}\u00a76.
teleportDisabled=\u00a7c{0} \u00a74verweigert die Teleportierung.
teleportHereRequest=\u00a7c{0}\u00a76 fragt, ob du dich zu ihm teleportierst.
teleporting=\u00a76Teleportiere...
teleportDisabled=\u00a7c{0} \u00a74verweigert die Teleportation.
teleportHereRequest=\u00a7c{0}\u00a76 fragt, ob du dich zu ihm teleportieren m\u00f6chtest.
teleporting=\u00a76Teleportation l\u00e4uft...
teleportInvalidLocation=Der Wert der angegebenen Koordinaten darf nicht \u00fcber 30000000 sein
teleportNewPlayerError=\u00a74Fehler beim Teleportieren eines neuen Spielers\!
teleportRequest=\u00a7c{0}\u00a76 fragt, ob er sich zu dir teleportieren darf.
teleportRequestAllCancelled=\u00a76Alle ausstehenden Teleportationsanfragen wurden abgebrochen.
teleportRequestSpecificCancelled=\u00a76Ausstehende Teleportationsanfrage mit {0} wurde abgebrochen.
teleportRequestTimeoutInfo=\u00a76Diese Anfrage wird nach\u00a7c {0} Sekunden\u00a76 ung\u00fcltig.
teleportTop=\u00a76Teleportiere nach oben.
teleportToPlayer=\u00a76teleportieren zu \u00a7c{0}\u00a76.
teleportRequestSpecificCancelled=\u00a76Ausstehende Teleportationsanfrage mit \u00a7c{0}\u00a76 wurde abgebrochen.
teleportRequestTimeoutInfo=\u00a76Diese Anfrage wird nach\u00a7c {0} Sekunden\u00a76 ung\u00fcltig sein.
teleportTop=\u00a76Zum h\u00f6chsten Punkt teleportieren.
teleportToPlayer=\u00a76Du teleportierst dich zu \u00a7c{0}\u00a76.
tempbanExempt=\u00a74Du kannst diesen Spieler nicht zeitlich bannen.
tempbanExemptOffline=\u00a74Du darfst abgemeldete Spieler nicht tempor\u00e4r verbannen.
tempbanJoin=You are banned from this server for {0}. Reason: {1}
tempBanned=\u00a7cDu wurdest f\u00fcr {0} verbannt\:\n\u00a7r{2}
thunder=\u00a76Es donnert nun in deiner Welt \u00a7c{0}\u00a76.
thunderDuration=\u00a76Es donnert nun f\u00fcr\u00a7c {1} \u00a76Sekunden in deiner Welt\u00a7c {0}\u00a76.
tempbanExemptOffline=\u00a74Du darfst abgemeldete Spieler nicht zeitlich sperren.
tempbanJoin=\u00a74Du bist auf diesem Server gabennt. \nDauer: {0} \nGrund: {1}
tempBanned=\u00a7cDu wurdest f\u00fcr {0} gebannt. \:\n\u00a7r{2}
thunder=\u00a76Es donnert jetzt in deiner Welt \u00a7c{0}\u00a76.
thunderDuration=\u00a76Es donnert jetzt f\u00fcr\u00a7c {1} \u00a76Sekunden in der Welt\u00a7c {0}\u00a76.
timeBeforeHeal=\u00a74Zeit bis zur n\u00e4chsten Heilung\:\u00a7c {0}\u00a76.
timeBeforeTeleport=\u00a74Zeit bis zum n\u00e4chsten Teleport\:\u00a7c {0}
timeFormat=\u00a7c{0}\u00a76 oder \u00a7c{1}\u00a76 oder \u00a7c{2}\u00a76
timeSetPermission=\u00a74Du hast keine Berechtigung die Zeit zu \u00e4ndern.
timeSetWorldPermission=\u00a74You are not authorized to set the time in world ''{0}''.
timeSetWorldPermission=\u00a74Du bist nicht berechtigt in der Welt \u00a7c''{0}''\u00a74 die Zeit zu \u00e4ndern.
timeWorldCurrent=\u00a76Die aktuelle Zeit in\u00a7c {0} \u00a76ist \u00a7c{1}
timeWorldSet=\u00a76Die Zeit in \u00a7c{1}\u00a76 wurde zu \u00a7c{0} \u00a76gesetzt.
timeWorldSet=\u00a76Die Zeit in \u00a7c{1}\u00a76 wurde auf \u00a7c{0} \u00a76gesetzt.
totalSellableAll=\u00a7aDer Gesamtwert von allen Bl\u00f6cken und Items ist \u00a7c{1}\u00a7a.
totalSellableBlocks=\u00a7aDer Gesamtwert der verkaufbaren Bl\u00f6cke ist \u00a7c{1}\u00a7a.
totalWorthAll=\u00a7aAlle Gegenst\u00e4nde und Bl\u00f6cke f\u00fcr einen Gesamtwert von \u00a7c{1}\u00a7a verkauft.
totalWorthBlocks=\u00a7aAlle Bl\u00f6cke f\u00fcr einen Gesamtwert von \u00a7c{1}\u00a7a verkauft.
totalWorthAll=\u00a7aDu hast alle Gegenst\u00e4nde und Bl\u00f6cke f\u00fcr einen Gesamtwert von \u00a7c{1}\u00a7a verkauft.
totalWorthBlocks=\u00a7aDu hast alle Bl\u00f6cke f\u00fcr einen Gesamtwert von \u00a7c{1}\u00a7a verkauft.
tps=\u00a76Aktuelle TPS \= {0}
tradeSignEmpty=Der Bestand des Trade-Schild ist aufgebraucht.
tradeSignEmptyOwner=Es gibt nichts mehr zu Sammeln von diesem Trade-Schild.
tradeSignEmptyOwner=Es gibt nichts mehr von diesem Trade-Schild zu sammeln.
treeFailure=\u00a74Baumpflanzung gescheitert. Versuche es nochmal auf Gras oder Erde.
treeSpawned=\u00a76Baum gepflanzt.
treeSpawned=\u00a76Baum wurde gepflanzt.
true=\u00a7aja\u00a7r
typeTpacancel=\u00a76To cancel this request, type \u00a7c/tpacancel\u00a76.
typeTpaccept=\u00a76Um zu teleportieren, schreibe \u00a7c/tpaccept\u00a76.
typeTpdeny=\u00a76Um diese Anfrage abzulehnen, schreibe \u00a7c/tpdeny\u00a76.
typeTpacancel=\u00a76Du kannst die Anfrage mit \u00a7c/tpacancel\u00a76 ablehnen.
typeTpaccept=\u00a76Du kannst die Teleportationsanfrage mit \u00a7c/tpaccept\u00a76 annehmen.
typeTpdeny=\u00a76Du kannst diese Anfrage mit \u00a7c/tpdeny\u00a76 ablehnen.
typeWorldName=\u00a76Du kannst auch den Namen der Welt eingeben.
unableToSpawnItem=\u00a74Kann nicht \u00a7c{0}\u00a74 spawnen, es ist ein nicht spawnbares Item.
unableToSpawnMob=\u00a74Fehler beim Erzeugen des Monsters.
unignorePlayer=\u00a76Du ignorierst Spieler\u00a7c {0} \u00a76nicht mehr.
unableToSpawnItem=\u00a7c{0}\u00a74 Kann nicht gespawnt werde, da es ein nicht spawnbares Item ist.
unableToSpawnMob=\u00a74Beim Erschaffen des Monsters ist ein Fehler aufgetreten.
unignorePlayer=\u00a76Du ignorierst \u00a7c {0} \u00a76nicht mehr.
unknownItemId=\u00a74Unbekannte Gegenstandsnummer\:\u00a7r {0}\u00a74.
unknownItemInList=\u00a74Unbekannter Gegenstand {0} in Liste {1}.
unknownItemInList=\u00a74Unbekannter Gegenstand {0} in der Liste {1}.
unknownItemName=\u00a74Unbekannter Gegenstand\: {0}.
unlimitedItemPermission=\u00a74Keine Permission f\u00fcr unendlich Items \u00a7c{0}\u00a74.
unlimitedItemPermission=\u00a74Keine Berechtigung f\u00fcr unendliche Items \u00a7c{0}\u00a74.
unlimitedItems=\u00a76Unbegrenzte Objekte\:\u00a7r
unmutedPlayer=\u00a76Spieler\u00a7c {0}\u00a76 ist nicht mehr stumm.
unsafeTeleportDestination=\u00a74Das Teleport-Ziel ist nicht sicher und der Teleportschutz ist nicht aktiv.
unvanishedReload=\u00a74Ein Neuladen des Servers hat dich sichtbar gemacht.
unvanishedReload=\u00a74Das Neuladen des Servers hat dich sichtbar gemacht.
upgradingFilesError=Fehler beim Aktualisieren der Dateien
uptime=\u00a76Laufzeit\:\u00a7c {0}
userAFK=\u00a77{0} \u00a75ist gerade nicht da und antwortet wahrscheinlich nicht.
userAFKWithMessage=\u00a77{0} \u00a75ist gerade nicht da und antwortet wahrscheinlich nicht. Grund: {1}
userdataMoveBackError=Verschieben von userdata/{0}.tmp nach userdata/{1} gescheitert.
userdataMoveError=Verschieben von userdata/{0} nach userdata/{1}.tmp gescheitert.
userdataMoveBackError=Verschieben von userdata/{0}.tmp nach userdata/{1} ist gescheitert.
userdataMoveError=Verschieben von userdata/{0} nach userdata/{1}.tmp ist gescheitert.
userDoesNotExist=\u00a74Spieler\u00a7c {0} \u00a74existiert nicht.
userIsAway=\u00a77* {0} \u00a77ist nun abwesend.
userIsAwayWithMessage=\u00a77* {0} \u00a77ist nun abwesend.
@@ -569,25 +571,30 @@ userUnknown=\u00a74Warnung\: Der Spieler ''\u00a7c{0}\u00a74'' war nie auf diese
usingTempFolderForTesting=Benutze tempor\u00e4ren Ordner zum Testen\:
vanish=\u00a76Unsichtbar f\u00fcr {0} \u00a76\: {1}
vanished=\u00a76Du bist nun vollst\u00e4ndig unsichtbar f\u00fcr normale Benutzer und ihre Befehle.
versionMismatch=\u00a74Versionen nicht identisch\! Bitte aktualisiere {0}.
versionMismatchAll=\u00a74Versionen ungleich\! Bitte aktualisiere alle Essentials jar-Dateien auf die gleiche Version.
voiceSilenced=\u00a76Du bist nun stumm\!
versionOutputVaultMissing=\u00a74Vault ist nicht installiert. Der Chat und die Permission k\u00F6nnten nicht funktionieren.
versionOutputFine=\u00a76{0} Version: \u00a7a{1}
versionOutputWarn=\u00a76{0} Version: \u00a7c{1}
versionOutputUnsupported=\u00a7d{0} \u00a76Version: \u00a7d{1}
versionOutputUnsupportedPlugins=\u00a76Du verwendest Plugins, die \u00A7dnicht \u00a76unterst\u00fctzt werden!
versionMismatch=\u00a74Versionen sind nicht gleich\! Bitte aktualisiere {0}.
versionMismatchAll=\u00a74Versionen sind nicht gleich\! Bitte aktualisiere alle Essentials jar-Dateien auf die gleiche Version.
voiceSilenced=\u00a76Du bist nun stummgeschaltet\!
walking=gehend
warpDeleteError=\u00a74Fehler beim L\u00f6schen der Warp-Datei.
warpingTo=\u00a76Teleportiere zu Warp-Punkt\u00a7c {0}\u00a76.
warpDeleteError=\u00a74Beim L\u00f6schen der Warp-Datei ist ein Fehler aufgetreten.
warpingTo=\u00a76Du teleportierst dich nach\u00a7c {0}\u00a76.
warpList={0}
warpListPermission=\u00a74Du hast keine Berechtigung, die Warp-Punkte anzuzeigen.
warpListPermission=\u00a74Du hast keine Berechtigung die Warp-Punkte anzuzeigen.
warpNotExist=\u00a74Warp-Punkt existiert nicht.
warpOverwrite=\u00a74Du kannst diesen Warp-Punkt nicht ersetzen.
warps=\u00a76Warp-Punkte\:\u00a7r {0}
warpsCount=\u00a76Es existieren\u00a7c {0} \u00a76Warps. Zeige \u00a7c{1} \u00a76von \u00a7c{2}\u00a76.
warpsCount=\u00a76Es existieren\u00a7c {0} \u00a76Warps. Zeige \u00a7c{1} \u00a76von \u00a7c{2}\u00a76 an.
warpSet=\u00a76Warp-Punkt\u00a7c {0} \u00a76wurde erstellt.
warpUsePermission=\u00a74Du hast keinen Zugriff f\u00fcr diesen Warp-Punkt.
weatherInvalidWorld=Welt mit dem Namen {0} wurde nicht gefunden\!
weatherStorm=\u00a76In \u00a7c{0} \u00a76st\u00fcrmt es nun.
weatherStormFor=\u00a76In \u00a7c{0} \u00a76st\u00fcrmt es nun f\u00fcr {1} Sekunden.
weatherSun=\u00a76In \u00a7c{0}\u00a76 scheint nun die \u00a7cSonne\u00a76.
weatherSunFor=\u00a76In \u00a7c{0} \u00a76scheint nun f\u00fcr {1} Sekunden die \u00a7cSonne\u00a76.
warpUsePermission=\u00a74Du bist f\u00fcr diesen Warp-Punkt nicht berechtigt.
weatherInvalidWorld=Die Welt mit dem Namen {0} wurde nicht gefunden\!
weatherStorm=\u00a76In \u00a7c{0} \u00a76st\u00fcrmt es jetzt.
weatherStormFor=\u00a76In \u00a7c{0} \u00a76st\u00fcrmt es jetzt f\u00fcr {1} Sekunden.
weatherSun=\u00a76In \u00a7c{0}\u00a76 scheint jetzt die \u00a7cSonne\u00a76.
weatherSunFor=\u00a76In \u00a7c{0} \u00a76scheint jetzt f\u00fcr {1} Sekunden die \u00a7cSonne\u00a76.
west=W
whoisAFK=\u00a76 - Abwesend\:\u00a7r {0}
whoisAFKSince=\u00a76 - AFK\:\u00a7r {0} (Seit {1})
@@ -606,14 +613,14 @@ whoisMoney=\u00a76 - Kontostand\:\u00a7r {0}
whoisMuted=\u00a76 - Stumm\:\u00a7r {0}
whoisNick=\u00a76 - Spitzname\:\u00a7r {0}
whoisOp=\u00a76 - OP\:\u00a7r {0}
whoisPlaytime=\u00a76 - Playtime\:\u00a7r {0}
whoisPlaytime=\u00a76 - Spielzeit\:\u00a7r {0}
whoisTempBanned=\u00a76 - Bann endet:\u00a7r {0}
whoisTop=\u00a76 \=\=\=\=\=\= WhoIs\:\u00a7c {0} \u00a76\=\=\=\=\=\=
whoisUuid=\u00a76 - UUID\:\u00a7r {0}
worth=\u00a7aEin Stapel {0} ist \u00a7c{1}\u00a7a wert ({2} Einheiten je {3})
worthMeta=\u00a7aEin Stapel von {0} mit Metadaten {1} ist \u00a7c{2}\u00a7a wert. ({3} Einheiten je {4})
worth=\u00a7aEin Stapel {0} ist \u00a7c{1}\u00a7a wert. ({2} St\u00fcck je {3})
worthMeta=\u00a7aEin Stapel von {0} mit Metadaten {1} ist \u00a7c{2}\u00a7a wert. ({3} St\u00fcck je {4})
worthSet=\u00a76Wert des Gegenstands gesetzt.
year=Jahr
years=Jahre
youAreHealed=\u00a76Du wurdest geheilt.
youHaveNewMail=\u00a76Du hast \u00a7c{0} \u00a76Nachrichten\! Schreibe \u00a7c/mail read\u00a76 um deine Nachrichten anzuzeigen.
youHaveNewMail=\u00a76Du hast \u00a7c{0} \u00a76Nachrichten\! Schreibe \u00a7c/mail read\u00a76 damit du deine Nachrichten lesen kannst.
+12 -6
View File
@@ -211,6 +211,7 @@ is=is
isIpBanned=\u00a76IP \u00a7c{0} \u00a76is banned.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74That item cannot be sold to the server.
itemId=\u00a76ID\:\u00a7c {0}
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.
@@ -251,7 +252,7 @@ kitOnce=\u00a74You can''t use that kit again.
kitReceive=\u00a76Received kit\u00a7c {0}\u00a76.
kits=\u00a76Kits\:\u00a7r {0}
kitTimed=\u00a74You can''t use that kit again for another\u00a7c {0}\u00a74.
leatherSyntax=\u00a76Leather color syntax\: color\:<red>,<green>,<blue> eg\: color\:255,0,0.
leatherSyntax=\u00a76Leather color syntax\: color\:<red>,<green>,<blue> eg\: color\:255,0,0 OR color\:<rgb int> eg\: color\:16777011
lightningSmited=\u00a76Thou hast been smitten\!
lightningUse=\u00a76Smiting\u00a7c {0}
listAfkTag=\u00a77[AFK]\u00a7r
@@ -262,7 +263,7 @@ listHiddenTag=\u00a77[HIDDEN]\u00a7r
loadWarpError=\u00a74Failed to load warp {0}.
localFormat=[L]<{0}> {1}
localNoOne=
mailClear=\u00a76To mark your mail as read, type\u00a7c /mail clear\u00a76.
mailClear=\u00a76To clear your mail, type\u00a7c /mail clear\u00a76.
mailCleared=\u00a76Mail cleared\!
mailDelay=Too many mails have been sent within the last minute. Maximum\: {0}
mailFormat=\u00a76[\u00a7r{0}\u00a76] \u00a7r{1}
@@ -304,7 +305,7 @@ multipleCharges=\u00a74You cannot apply more than one charge to this firework.
multiplePotionEffects=\u00a74You cannot apply more than one effect to this potion.
mutedPlayer=\u00a76Player\u00a7c {0} \u00a76muted.
mutedPlayerFor=\u00a76Player\u00a7c {0} \u00a76muted for\u00a7c {1}\u00a76.
mutedUserSpeaks={0} tried to speak, but is muted.
mutedUserSpeaks={0} tried to speak, but is muted: {1}
muteExempt=\u00a74You may not mute that player.
muteExemptOffline=\u00a74You may not mute offline players.
muteNotify=\u00a7c{0} \u00a76has muted player \u00a7c{1}\u00a76.
@@ -467,7 +468,7 @@ sellBulkPermission=\u00a76You do not have permission to bulk sell.
sellHandPermission=\u00a76You do not have permission to hand sell.
serverFull=Server is full\!
serverTotal=\u00a76Server Total\:\u00a7c {0}
serverUnsupported=\u00a76You are running an \u00a74unsupported server version\u00a76.
serverUnsupported=You are running an unsupported server version!
setBal=\u00a7aYour balance was set to {0}.
setBalOthers=\u00a7aYou set {0}\u00a7a''s balance to {1}.
setSpawner=\u00a76Changed spawner type to\u00a7c {0}\u00a76.
@@ -491,7 +492,7 @@ soloMob=\u00a74That mob likes to be alone.
spawned=spawned
spawnSet=\u00a76Spawn location set for group\u00a7c {0}\u00a76.
spectator=spectator
sudoExempt=\u00a74You cannot sudo this user.
sudoExempt=\u00a74You cannot sudo \u00a7c{0}.
sudoRun=\u00a76Forcing\u00a7c {0} \u00a76to run\:\u00a7r /{1}
suicideMessage=\u00a76Goodbye cruel world...
suicideSuccess=\u00a76Player \u00a7c{0} \u00a76took their own life.
@@ -544,7 +545,7 @@ typeTpacancel=\u00a76To cancel this request, type \u00a7c/tpacancel\u00a76.
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.
unableToSpawnItem=\u00a74Cannot spawn \u00a7c{0}\u00a74, this is not a spawnable item.
unableToSpawnItem=\u00a74Cannot spawn \u00a7c{0}\u00a74; this is not a spawnable item.
unableToSpawnMob=\u00a74Unable to spawn mob.
unignorePlayer=\u00a76You are not ignoring player\u00a7c {0} \u00a76anymore.
unknownItemId=\u00a74Unknown item id\:\u00a7r {0}\u00a74.
@@ -570,6 +571,11 @@ userUnknown=\u00a74Warning\: The user ''\u00a7c{0}\u00a74'' has never joined thi
usingTempFolderForTesting=Using temp folder for testing\:
vanish=\u00a76Vanish for {0}\u00a76\: {1}
vanished=\u00a76You are now completely invisible to normal users, and hidden from in-game commands.
versionOutputVaultMissing=\u00a74Vault is not installed. Chat and permissions may not work.
versionOutputFine=\u00a76{0} version: \u00a7a{1}
versionOutputWarn=\u00a76{0} version: \u00a7c{1}
versionOutputUnsupported=\u00a7d{0} \u00a76version: \u00a7d{1}
versionOutputUnsupportedPlugins=\u00a76You are running \u00a7dunsupported plugins\u00a76!
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\!
File diff suppressed because it is too large. Load diff
+1
View File
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00a76Eliminado\u00a7c {0} \u00a76de\u00a7c {1} \u00a76d
is=es
isIpBanned=\u00a76IP \u00a7c{0} \u00a76est\u00e1 baneada.
itemCannotBeSold=\u00a74\u00a1Ese objeto no puede ser vendido al servidor\!
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemMustBeStacked=El objeto tiene que ser intercambiado en montones. Una cantidad de 2s ser\u00edan dos montones, etc.
itemNames=\u00a76Nombre corto del \u00edtem\:\u00a7r {0}
File diff suppressed because it is too large. Load diff
+1
View File
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00a76Removed\u00a7c {0} \u00a76of\u00a7c {1} \u00a76fro
is=on
isIpBanned=\u00a76IP \u00a7c {0} \u00a76On karkoitettu.
itemCannotBeSold=Tuota tavaraa ei voi myyd\u00e4 t\u00e4ll\u00e4 palvelimella.
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemMustBeStacked=Tavara pit\u00e4\u00e4 vaihtaa pakattuina. M\u00e4\u00e4r\u00e4 2s olisi kaksi pakettia, jne.
itemNames=\u00a76Item short names\:\u00a7r {0}
+1
View File
@@ -211,6 +211,7 @@ is=est
isIpBanned=\u00a76L''IP \u00a7c{0} \u00a76est bannie.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=Cet objet ne peut \u00eatre vendu au serveur.
itemId=\u00a76ID\:\u00a7c {0}
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.
+1
View File
@@ -211,6 +211,7 @@ is=van
isIpBanned=\u00a76IP \u00a7c{0} \u00a76m\u00e1r ki van tiltva.
internalError=\u00a7cBels\u00f5 hiba t\u00f6rt\u00e9nt a parancs v\u00e9grehajt\u00e1sa k\u00f6zben.
itemCannotBeSold=\u00a74Ezt nem adhatod el a szerveren.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74A t\u00e1rgyat k\u00f6tegben kell \u00e9rt\u00e9kes\u00edteni. A 2s mennyis\u00e9ge k\u00e9t stack lenne, stb.
itemNames=\u00a76T\u00e1rgy r\u00f6vid nevei\:\u00a7r {0}
itemNotEnough1=\u00a74Nincs el\u00e9g eladni val\u00f3 t\u00e1rgyad.
+1
View File
@@ -211,6 +211,7 @@ is=\u00E8
isIpBanned=\u00a76L''IP \u00a7c{0} \u00a76\u00e8 bannato.
internalError=\u00a7cSi \u00e8 verificato un errore durante l''esecuzione di questo comando.
itemCannotBeSold=\u00a74Quell''oggetto non pu\u00F2 essere venduto al server.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74L''oggetto deve essere scambiato in stack. Una quantit\u00E0 di 2 sarebbero due stack, etc.
itemNames=\u00a76Nomi corti oggetti\:\u00a7r {0}
itemNotEnough1=\u00a74Non hai abbastanza di quell''oggetto per venderlo.
+1
View File
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00a76Removed\u00a7c {0} \u00a76of\u00a7c {1} \u00a76fro
is=\uc740/\ub294
isIpBanned=\u00a76IP \u00a7c{0} \u00a76\ub294 \ucc28\ub2e8 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.
itemCannotBeSold=\uadf8 \uc544\uc774\ud15c\uc740 \uc11c\ubc84\uc5d0 \ud314 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemMustBeStacked=\uc544\uc774\ud15c\uc744 \uac70\ub798\ud558\uae30 \uc704\ud574\uc11c 2\uac1c \uc774\uc0c1\uc758 \uac19\uc740\uc544\uc774\ud15c\uc744 \uac00\uc9c0\uace0\uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4.
itemNames=\u00a76\uc9e7\uc740 \uc544\uc774\ud15c \uc774\ub984\:\u00a7r {0}
+1
View File
@@ -211,6 +211,7 @@ is=is
isIpBanned=\u00a76IP \u00a7c{0} \u00a76yra u\u017eblokuotas.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74\u0160is daiktas negali b\u016bti parduotas serveryje.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74Daiktas turi buti parduotas po 1 stack.
itemNames=\u00a76Daikt\u0173 trumpi pavadinimai\:\u00a7r {0}
itemNotEnough1=\u00a74Tu neturi pakankamai daiktu pardavimui.
+17 -16
View File
@@ -2,10 +2,10 @@
#version: ${full.version}
# Single quotes have to be doubled: ''
# Translations start here
# by:
# by: DutchUser
action=\u00a75* {0} \u00a75{1}
addedToAccount=\u00a7a{0} is gestort op uw rekening.
addedToOthersAccount=\u00a7a{0} toegevoegd aan {1}\u00a7a zijn rekening. Nieuw saldo\: {2}
addedToOthersAccount=\u00a7a{0} is toegevoegd aan {1}\u00a7a zijn rekening. Nieuw saldo\: {2}
adventure=avontuur
alertBroke=gebroken\:
alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} bij\: {3}
@@ -77,7 +77,7 @@ couldNotFindTemplate=Het sjabloon kon niet worden gevonden {0}.
createdKit=\u00a76Kit \u00a7c{0} \u00a76gemaakt met \u00a7c{1} \u00a76items en met \u00a7c{2} \u00a76seconden afkoeltijd.
createKitFailed=\u00a74Fout opgetreden tijdens het maken van kit {0}.
createKitSeparator=\u00a7m-----------------------
createKitSuccess=\u00a76Created Kit: \u00a7f{0}\n\u00a76Delay: \u00a7f{1}\n\u00a76Link: \u00a7f{2}\n\u00a76Copy contents in the link above into your config.yml.
createKitSuccess=\u00a76Gemaakte Kit: \u00a7f{0}\n\u00a76Vertraging \u00a7f{1}\n\u00a76Link: \u00a7f{2}\n\u00a76Kopieer wat in de link staat in de kits.yml
creatingConfigFromTemplate=Bezig met aanmaken van een config vanaf sjabloon\: {0}
creatingEmptyConfig=Bezig met het aanmaken van een lege configuratie\: {0}
creative=creatief
@@ -139,7 +139,7 @@ flyMode=\u00a77Zet vliegen {0} voor {1}.
foreverAlone=\u00a7cU heeft niemand naar wie u kan reageren.
fullStack=\u00a74U heeft al een volledige stapel.
gameMode=De gamemodus van {1} is veranderd naar {0}.
gameModeInvalid=\u00a74U moet een geldige speler/mode opgeven.
gameModeInvalid=\u00a74U moet een geldige speler/gamemodus opgeven.
gcfree=Vrij geheugen\: {0} MB
gcmax=Maximaal geheugen\: {0} MB
gctotal=Toegewezen geheugen\: {0} MB
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00a76\u00a7c {0} \u00a76stuks\u00a7c {1} \u00a76zijn ve
is=is
isIpBanned=\u00a76IP \u00a7c {0} \u00a76is verbannen.
itemCannotBeSold=Dat voorwerp kan niet aan de server worden verkocht.
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemMustBeStacked=Voorwerp moet geruild worden als stapel. Een hoeveelheid van 2 moet dus geruild worden als twee stapels, etc.
itemNames=Kortere namen voor het item\: {0}
@@ -225,7 +226,7 @@ itemSoldConsole={0} verkocht {1} voor \u00a77{2} \u00a77({3} voorwerpen voor {4}
itemSpawn=\u00a77Geeft {0} {1}
itemType=\u00a76Voorwerp\:\u00a7c {0}
jailAlreadyIncarcerated=\u00a74Deze persoon zit al in de gevangenis\:\u00a7c {0}
jailList=\u00a76Jails\:\u00a7r {0}
jailList=\u00a76Gevangenissen\:\u00a7r {0}
jailMessage=\u00a74U begaat een misdrijf, U zit uw tijd uit.
jailNotExist=\u00a74Die gevangenis bestaat niet.
jailReleased=\u00a76Speler \u00a7c{0}\u00a76 vrijgelaten.
@@ -238,13 +239,13 @@ kickedAll=\u00a74Alle spelers van de server afgeschopt.
kickExempt=\u00a74U kunt die speler niet van de server afschoppen.
kill=\u00a76U vermoorde\u00a7c {0}\u00a76.
killExempt=\u00a74Je kan niet vermoorden\u00a7c{0}\u00a74.\n
kitContains=\u00a76Kit \u00a7c{0} \u00a76contains:
kitContains=\u00a76Kit \u00a7c{0} \u00a76bevat:
kitCost=\ \u00a77\u00a7o({0})\u00a7r
kitDelay=\u00a7m{0}\u00a7r
kitError=\u00a74Er zijn geen geldige kits.
kitError2=\u00a74Die kit is niet goed ingesteld. Neem contact op met een administrator.
kitGiveTo=\u00a76Geeft kit\u00a7c {0}\u00a76 aan \u00a7c{1}\u00a76.\n
kitInvFull=\u00a74Uw inventaris was vol, de kit wordt op de grond geplaatst.
kitInvFull=\u00a74Uw inventaris is vol, de kit wordt op de grond geplaatst.
kitItem=\u00a76- \u00a7f{0}
kitNotFound=\u00a74Deze kit bestaat niet.
kitOnce=\u00a74U kunt deze kit niet opnieuw gebruiken.
@@ -263,11 +264,11 @@ loadWarpError=\u00a74Fout bij het laden van warp {0}.
localFormat=[L]<{0}> {1}
localNoOne=
mailClear=\u00a76Om je mail te markeren als gelezen, typ\u00a7c /mail clear\u00a76.\n
mailCleared=\u00a76Berichten verwijderd\!
mailDelay=Er zijn teveel mails verzonden in een minuut. Het maximale aantal berichten\: {0}
mailCleared=\u00a76Mails verwijderd\!
mailDelay=Er zijn teveel mails verzonden in een minuut. Het maximale aantal mails\: {0}
mailFormat=\u00a76[\u00a7r{0}\u00a76] \u00a7r{1}
mailMessage={0}
mailSent=\u00a76Bericht verzonden\!
mailSent=\u00a76Mail verzonden\!
mailSentTo=\u00a7c{0}\u00a76 is de volgende mail gestuurd\:
mailTooLong=\u00a74Mail bericht te lang. Probeer om het onder 1000 tekens te houden.
markedAsAway=\u00a76U staat nu als afwezig gemarkeerd.
@@ -299,7 +300,7 @@ msgDisabledFor=\u00a76Berichten ontvangen \u00a7cuitgeschakelt \u00a76voor \u00a
msgEnabled=\u00a76Berichten ontvangen \u00a7caingeschakelt\u00a76.
msgEnabledFor=\u00a76Berichten ontvangen \u00a7cingeschakelt \u00a76voor \u00a7c{0}\u00a76.
msgFormat=\u00a76[\u00a7c{0}\u00a76 -> \u00a7c{1}\u00a76] \u00a7r{2}
msgIgnore=\u00a7c{0} \u00a74heeft berichten uitstaan.
msgIgnore=\u00a7c{0} \u00a74heeft u genegeerd.
multipleCharges=\u00a74U kunt niet meer dan \u00e9\u00e9n lading aan dit vuurwerk toevoegen.
multiplePotionEffects=\u00a74U kunt niet meer dan \u00e9\u00e9n effect aan dit toverdrankje toevoegen.
mutedPlayer=\u00a76Speler\u00a7c {0} \u00a76gedempt.
@@ -308,7 +309,7 @@ mutedUserSpeaks={0} probeerde te praten, maar is gedempt.
muteExempt=\u00a74U kunt deze speler niet dempen.
muteExemptOffline=\u00a74U mag spelers die offline zijn niet dempen.
muteNotify=\u00a7c{0} \u00a76heeft \u00a7c{1} \u00a76gedempt.
muteNotifyFor=\u00a7c{0} \u00a76has muted player \u00a7c{1}\u00a76 for\u00a7c {2}\u00a76.
muteNotifyFor=\u00a7c{0} \u00a76heeft speler \u00a7c{1}\u00a76 gedempt voor\u00a7c {2}\u00a76.
nearbyPlayers=\u00a76Spelers dichtbij\:\u00a7r {0}
negativeBalanceError=Het is voor deze gebruiker niet toegestaan om een negatief saldo te hebben.
nickChanged=Bijnaam veranderd.
@@ -331,7 +332,7 @@ north=N
northWest=NW
noHomeSetPlayer=Speler heeft geen home.
noIgnored=\u00a76U negeert niemand.
noJailsDefined=\u00a76No jails defined.
noJailsDefined=\u00a76Geen gevangenis gedefinieerd.
noKitGroup=\u00a74U heeft geen toestemming om deze kit te gebruiken.
noKitPermission=\u00a74U heeft de \u00a7c{0}\u00a74 toestemming nodig om die kit te gebruiken.
noKits=\u00a77Er zijn nog geen kits beschikbaar.
@@ -377,7 +378,7 @@ payMustBePositive=\u00a74De aantal wat je wilt betalen moet positief zijn.
payToggleOff=\u00a76Je accepteert niet langer betalingen.
payToggleOn=\u00a76Je accepteert betalen weer.
pendingTeleportCancelled=\u00a74Afwachtende teleportatie afgelast.
playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address\u00a7c {1} \u00a76for\: \u00a7c{2}\u00a76.
playerBanIpAddress=\u00a76Speler\u00a7c {0} \u00a76heeft IP\u00a7c {1} \u00a76verbannen voor\: \u00a7c{2}\u00a76.
playerBanned=\u00a74Speler \u00a7c{0} \u00a74is verbannen voor {2}
playerInJail=\u00a74De speler is al in de gevangenis \u00a7c{0}\u00a74.
playerJailed=\u00a76Speler\u00a7c {0} \u00a76is in de gevangenis gezet.
@@ -511,8 +512,8 @@ teleporting=\u00a76Bezig met teleporteren...
teleportInvalidLocation=De waarde van co\u00f6rdinaten kan niet hoger dan 30000000 zijn
teleportNewPlayerError=\u00a74Fout bij het teleporteren van nieuwe speler\!
teleportRequest=\u00a7c{0}\u00a76 vraagt of hij naar u kan teleporteren.
teleportRequestAllCancelled=\u00a76All outstanding teleport requests cancelled.
teleportRequestSpecificCancelled=\u00a76Outstanding teleport request with {0} cancelled.
teleportRequestAllCancelled=\u00a76Alle openstaaande teleport verzoeken zijn geannuleerd.
teleportRequestSpecificCancelled=\u00a76Openstaande teleport verzoeken van {0} zijn geannuleerd.
teleportRequestTimeoutInfo=\u00a76Dit verzoekt verloopt na\u00a7c {0} seconde(n)\u00a76.
teleportTop=\u00a77Bezig met teleporteren naar het hoogste punt.
teleportToPlayer=\u00a76Teleporteren naar \u00a7c{0}\u00a76.
+1
View File
@@ -211,6 +211,7 @@ is=jest
isIpBanned=\u00a77IP \u00a7c{0} \u00a77jest zbanowany.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a7rNie mo\u017Cesz sprzeda\u0107 tego przedmiotu serwerowi.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74Przedmiotem handluje si\u0119 w stackach. Wielko\u015B\u0107 2s to dwa stacki itd.
itemNames=\u00a77Kr\u00F3tka nazwa\:\u00a7r {0}
itemNotEnough1=\u00a74Masz za ma\u0142o tego przedmiotu, aby go sprzeda\u0107.
+1
View File
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00A76Removido\u00A7c {0} \u00A76de\u00A7c {1} \u00A76de
is=\u00E9
isIpBanned=\u00A76IP \u00A7c{0} \u00A76 est\u00E1 banido.
itemCannotBeSold=\u00A74Esse item n\u00E3o pode ser vendido ao servidor.
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemMustBeStacked=\u00A74O item tem de ser trocado em stacks. A quantidade de 2 deveria ser 2 stacks, etc.
itemNames=\u00A76Nomes pequenos para o itens:\u00A7r {0}
+1
View File
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00A76Removido\u00A7c {0} \u00A76de\u00A7c {1} \u00A76de
is=\u00E9
isIpBanned=\u00A76IP \u00A7c{0} \u00A76 est\u00E1 banido.
itemCannotBeSold=\u00A74Esse item n\u00E3o pode ser vendido para o servidor.
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemMustBeStacked=\u00A74O item deve ser trocado em packs. A quantidade de 2 deveria ser 2 packs, etc.
itemNames=\u00A76Nomes pequenos para o item\:\u00A7r {0}
+1
View File
@@ -211,6 +211,7 @@ is=este
isIpBanned=\u00a76IP-ul \u00a7c {0} \u00a76este interzis.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74Acest obiect nu poate fi vandut pe server.
itemId=\u00a76ID\:\u00a7c {0}
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.
+1
View File
@@ -211,6 +211,7 @@ is=\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f
isIpBanned=\u00a76IP \u00a7c{0} \u00a76\u0437\u0430\u0431\u0430\u043d\u0435\u043d.
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74\u042d\u0442\u043e\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0434\u0430\u043d.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74\u041f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u0441\u0442\u0430\u043a\u0435. A quantity of 2s would be two stacks, etc.
itemNames=\u00a76\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\:\u00a7r {0}
itemNotEnough1=\u00a74\u0423 \u0412\u0430\u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u0436\u0438.
+1
View File
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00a76Tog bort \u00a7c {0} \u00a76av\u00a7c {1} \u00a76f
is=\u00e4r
isIpBanned=\u00a76IP \u00a7c {0} \u00a76\u00e4r bannad.
itemCannotBeSold=Det objektet kan inte s\u00e4ljas till servern.
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
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}
+1
View File
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00a76Silindi\u00a7c {0} \u00a76of\u00a7c {1} \u00a76Tar
is=olan
isIpBanned=\u00a76IP \u00a7c{0} \u00a76yasaklandi.
itemCannotBeSold=\u00a74Bu Esyayi Sunucuya Satamazsiniz\!
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemMustBeStacked=\u00a74Esya Takasi Icin Elindeki Esyanin Bir Stack(Dolu 64) Olmasi Gerekir.
itemNames=\u00a76Esya Kisaltmalari\:\u00a7r {0}
+1
View File
@@ -188,6 +188,7 @@ invalidWarpName=\u00a74\u0054\u00ea\u006e \u006b\u0068\u0075 \u0076\u1ef1\u0063
invalidWorld=\u00a74\u0054\u0068\u1ebf \u0067\u0069\u1edb\u0069 \u006b\u0068\u00f4\u006e\u0067 \u0068\u1ee3\u0070 \u006c\u1ec7.
is=\u006c\u01b0\u0075 \u0067\u0069\u1eef
itemCannotBeSold=\u00a74\u0056\u1ead\u0074 \u0070\u0068\u1ea9\u006d \u006e\u00e0\u0079 \u006b\u0068\u00f4\u006e\u0067 \u0074\u0068\u1ec3 \u0062\u00e1\u006e \u0074\u0072\u00ea\u006e \u006d\u00e1\u0079 \u0063\u0068\u1ee7.
itemId=\u00a76ID\:\u00a7c {0}
itemMustBeStacked=\u00a74\u0056\u1ead\u0074 \u0070\u0068\u1ea9\u006d \u0111\u1ed5\u0069 \u0111\u01b0\u1ee3\u0063 \u0070\u0068\u1ea3\u0069 \u0111\u1ea7\u0079\u002e \u004d\u1ed9\u0074 \u0073\u1ed1 \u006c\u01b0\u1ee3\u006e\u0067 \u0111\u1ea7\u0079 \u0068\u01a1\u006e \u006e\u00f3 \u0073\u1ebd \u0074\u0068\u00e0\u006e\u0068 \u0068\u0061\u0069\u002c \u0076\u002e\u0076\u002e\u002e\u002e.
itemNames=\u00a76\u0054\u00ea\u006e \u0074\u0068\u0075 \u0067\u1ecd\u006e\:\u00a7r {0}
itemNotEnough1=\u00a74\u0042\u1ea1\u006e \u006b\u0068\u00f4\u006e\u0067 \u0063\u00f3 \u0111\u1ee7 \u0076\u1ead\u0074 \u0070\u0068\u1ea9\u006d \u0111\u1ec3 \u0062\u00e1\u006e.
+1
View File
@@ -210,6 +210,7 @@ inventoryClearingStack=\u00a76\u79fb\u9664\u00a7c {0} \u00a76\u4e2a\u00a7c {1} \
is=\u662f
isIpBanned=\u00a76IP\u5730\u5740 \u00a7c{0} \u00a76\u5df2\u88ab\u5c01\u7981.
itemCannotBeSold=\u00a74\u8be5\u7269\u54c1\u65e0\u6cd5\u5356\u7ed9\u670d\u52a1\u5668
itemId=\u00a76ID\:\u00a7c {0}
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemMustBeStacked=\u00a74\u7269\u54c1\u5fc5\u987b\u6210\u7ec4\u7684\u8fdb\u884c\u4ea4\u6613,2s\u4ee3\u8868\u7684\u6570\u91cf\u662f2\u7ec4\u7269\u54c1,\u4ee5\u6b64\u7c7b\u63a8
itemNames=\u00a76\u7269\u54c1\u7b80\u6613\u540d\u79f0\:\u00a7r {0}
+1
View File
@@ -211,6 +211,7 @@ is=\u662f
isIpBanned=\u00a76IP \u00a7c{0} \u00a76\u5df2\u88ab\u5c01\u9396\u3002
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74\u8a72\u7269\u54c1\u7121\u6cd5\u8ce3\u7d66\u670d\u52d9\u5668
itemId=\u00a76ID\:\u00a7c {0}
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
+1
View File
@@ -211,6 +211,7 @@ is=\u662f
isIpBanned=\u00a76IP \u00a7c{0} \u00a76\u5df2\u88ab\u5c01\u9396\u3002
internalError=\u00a7cAn internal error occurred while attempting to perform this command.
itemCannotBeSold=\u00a74\u8a72\u7269\u54c1\u7121\u6cd5\u8ce3\u7d66\u4f3a\u670d\u5668
itemId=\u00a76ID\:\u00a7c {0}
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
@@ -5,34 +5,33 @@ import com.earth2me.essentials.api.UserDoesNotExistException;
import com.earth2me.essentials.commands.IEssentialsCommand;
import com.earth2me.essentials.commands.NoChargeException;
import junit.framework.TestCase;
import net.ess3.api.Economy;
import org.bukkit.World.Environment;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.InvalidDescriptionException;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
public class EconomyTest extends TestCase {
public class EconomyTest {
private final transient Essentials ess;
private static final String NPCNAME = "npc1";
private static final String PLAYERNAME = "testPlayer1";
private static final String PLAYERNAME2 = "testPlayer2";
private final FakeServer server;
public EconomyTest(final String testName) {
super(testName);
public EconomyTest() {
this.server = new FakeServer();
server.createWorld("testWorld", Environment.NORMAL);
ess = new Essentials(server);
try {
ess.setupForTesting(server);
} catch (InvalidDescriptionException ex) {
fail("InvalidDescriptionException");
Assert.fail("InvalidDescriptionException");
} catch (IOException ex) {
fail("IOException");
Assert.fail("IOException");
}
server.addPlayer(new OfflinePlayer(PLAYERNAME, ess.getServer()));
server.addPlayer(new OfflinePlayer(PLAYERNAME2, ess.getServer()));
@@ -42,66 +41,63 @@ public class EconomyTest extends TestCase {
@Test
public void testEconomy() {
// test NPC
assertFalse("NPC does not exists", Economy.playerExists(NPCNAME));
assertTrue("Create NPC", Economy.createNPC(NPCNAME));
assertTrue("NPC exists", Economy.playerExists(NPCNAME));
assertNotNull("NPC can be accessed", ess.getOfflineUser(NPCNAME));
Assert.assertFalse("NPC does not exists", Economy.playerExists(NPCNAME));
Assert.assertTrue("Create NPC", Economy.createNPC(NPCNAME));
Assert.assertTrue("NPC exists", Economy.playerExists(NPCNAME));
Assert.assertNotNull("NPC can be accessed", ess.getOfflineUser(NPCNAME));
try {
Economy.removeNPC(NPCNAME);
} catch (UserDoesNotExistException ex) {
fail(ex.getMessage());
Assert.fail(ex.getMessage());
}
assertFalse("NPC can be removed", Economy.playerExists(NPCNAME));
Assert.assertFalse("NPC can be removed", Economy.playerExists(NPCNAME));
//test Math
try {
assertTrue("Player exists", Economy.playerExists(PLAYERNAME));
Assert.assertTrue("Player exists", Economy.playerExists(PLAYERNAME));
Economy.resetBalance(PLAYERNAME);
assertEquals("Player has no money", 0.0, Economy.getMoney(PLAYERNAME));
Assert.assertEquals("Player has no money", 0.0, Economy.getMoney(PLAYERNAME), 0);
Economy.add(PLAYERNAME, 10.0);
assertEquals("Add money", 10.0, Economy.getMoney(PLAYERNAME));
Assert.assertEquals("Add money", 10.0, Economy.getMoney(PLAYERNAME),0);
Economy.subtract(PLAYERNAME, 5.0);
assertEquals("Subtract money", 5.0, Economy.getMoney(PLAYERNAME));
Assert.assertEquals("Subtract money", 5.0, Economy.getMoney(PLAYERNAME),0);
Economy.multiply(PLAYERNAME, 2.0);
assertEquals("Multiply money", 10.0, Economy.getMoney(PLAYERNAME));
Assert.assertEquals("Multiply money", 10.0, Economy.getMoney(PLAYERNAME),0);
Economy.divide(PLAYERNAME, 2.0);
assertEquals("Divide money", 5.0, Economy.getMoney(PLAYERNAME));
Assert.assertEquals("Divide money", 5.0, Economy.getMoney(PLAYERNAME),0);
Economy.setMoney(PLAYERNAME, 10.0);
assertEquals("Set money", 10.0, Economy.getMoney(PLAYERNAME));
} catch (NoLoanPermittedException ex) {
fail(ex.getMessage());
} catch (UserDoesNotExistException ex) {
fail(ex.getMessage());
Assert.assertEquals("Set money", 10.0, Economy.getMoney(PLAYERNAME),0);
} catch (NoLoanPermittedException | UserDoesNotExistException ex) {
Assert.fail(ex.getMessage());
}
//test Format
assertEquals("Format $1,000", "$1,000", 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.1000001));
assertEquals("Format $10.10", "$10.10", Economy.format(10.1099999));
Assert.assertEquals("Format $1,000", "$1,000", Economy.format(1000.0));
Assert.assertEquals("Format $10", "$10", Economy.format(10.0));
Assert.assertEquals("Format $10.10", "$10.10", Economy.format(10.10));
Assert.assertEquals("Format $10.10", "$10.10", Economy.format(10.1000001));
Assert.assertEquals("Format $10.10", "$10.10", Economy.format(10.1099999));
//test Exceptions
try {
assertTrue("Player exists", Economy.playerExists(PLAYERNAME));
Assert.assertTrue("Player exists", Economy.playerExists(PLAYERNAME));
Economy.resetBalance(PLAYERNAME);
assertEquals("Reset balance", 0.0, Economy.getMoney(PLAYERNAME));
Assert.assertEquals("Reset balance", 0.0, Economy.getMoney(PLAYERNAME),0);
Economy.subtract(PLAYERNAME, 5.0);
fail("Did not throw exception");
} catch (NoLoanPermittedException ex) {
Assert.fail("Did not throw exception");
} catch (NoLoanPermittedException ignored) {
} catch (UserDoesNotExistException ex) {
fail(ex.getMessage());
Assert.fail(ex.getMessage());
}
try {
Economy.resetBalance("UnknownPlayer");
fail("Did not throw exception");
Assert.fail("Did not throw exception");
} catch (NoLoanPermittedException ex) {
fail(ex.getMessage());
} catch (UserDoesNotExistException ex) {
}
Assert.fail(ex.getMessage());
} catch (UserDoesNotExistException ignored) {}
}
private void runCommand(String command, User user, String args) throws Exception {
@@ -116,8 +112,7 @@ public class EconomyTest extends TestCase {
.loadClass("com.earth2me.essentials.commands.Command" + command).newInstance();
cmd.setEssentials(ess);
cmd.run(server, user, command, null, args);
} catch (NoChargeException ex) {
}
} catch (NoChargeException ignored) {}
}
@@ -135,16 +130,16 @@ public class EconomyTest extends TestCase {
.loadClass("com.earth2me.essentials.commands.Command" + command).newInstance();
cmd.setEssentials(ess);
cmd.run(server, new CommandSource(sender), command, null, args);
} catch (NoChargeException ex) {
}
} catch (NoChargeException ignored) {}
}
public void testNegativePayCommand() throws Exception {
@Test
public void testNegativePayCommand() {
User user1 = ess.getUser(PLAYERNAME);
try {
runCommand("pay", user1, PLAYERNAME2 + " -123");
} catch (Exception e) {
assertEquals(I18n.tl("payMustBePositive"), e.getMessage());
Assert.assertEquals(I18n.tl("payMustBePositive"), e.getMessage());
}
}
}
@@ -39,7 +39,6 @@ import org.bukkit.util.CachedServerIcon;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
@@ -48,11 +47,11 @@ import java.util.logging.Logger;
public class FakeServer implements Server {
private List<Player> players = new ArrayList<Player>();
private final List<World> worlds = new ArrayList<World>();
PluginManager pluginManager = new FakePluginManager();
private List<Player> players = new ArrayList<>();
private final List<World> worlds = new ArrayList<>();
private PluginManager pluginManager = new FakePluginManager();
public FakeServer() {
FakeServer() {
if (Bukkit.getServer() == null) {
Bukkit.setServer(this);
}
@@ -139,7 +138,7 @@ public class FakeServer implements Server {
@Override
public List<Player> matchPlayer(String string) {
List<Player> matches = new ArrayList<Player>();
List<Player> matches = new ArrayList<>();
for (Player player : players) {
if (player.getName().substring(0, Math.min(player.getName().length(), string.length())).equalsIgnoreCase(string)) {
matches.add(player);
@@ -390,12 +389,12 @@ public class FakeServer implements Server {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addPlayer(Player base1) {
void addPlayer(Player base1) {
players.add(base1);
pluginManager.callEvent(new PlayerJoinEvent(base1, null));
}
public OfflinePlayer createPlayer(String name) {
OfflinePlayer createPlayer(String name) {
OfflinePlayer player = new OfflinePlayer(name, this);
player.setLocation(new Location(worlds.get(0), 0, 0, 0, 0, 0));
return player;
@@ -445,6 +444,10 @@ public class FakeServer implements Server {
throw new UnsupportedOperationException("Not supported yet.");
}
public MapView getMap(int id) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int getViewDistance() {
throw new UnsupportedOperationException("Not supported yet.");
@@ -460,11 +463,6 @@ public class FakeServer implements Server {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public MapView getMap(short s) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public MapView createMap(World world) {
throw new UnsupportedOperationException("Not supported yet.");
@@ -502,7 +500,12 @@ public class FakeServer implements Server {
@Override
public Player getPlayerExact(String string) {
throw new UnsupportedOperationException("Not supported yet.");
for (Player player : players) {
if (player.getName().equals(string)) {
return player;
}
}
return null;
}
@Override
@@ -589,14 +592,15 @@ public class FakeServer implements Server {
@Override
public UUID getUniqueId() {
if (string == "testPlayer1") {
return UUID.fromString("3c9ebe1a-9098-43fd-bc0c-a369b76817ba");
} else if (string == "testPlayer2") {
return UUID.fromString("2c9ebe1a-9098-43fd-bc0c-a369b76817ba");
} else if (string == "npc1") {
return null;
switch (string) {
case "testPlayer1":
return UUID.fromString("3c9ebe1a-9098-43fd-bc0c-a369b76817ba");
case "testPlayer2":
return UUID.fromString("2c9ebe1a-9098-43fd-bc0c-a369b76817ba");
case "npc1":
return null;
}
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
throw new UnsupportedOperationException("Not supported yet.");
}
};
}
@@ -754,7 +758,7 @@ public class FakeServer implements Server {
}
@Override
public Set getOperators() {
public Set<org.bukkit.OfflinePlayer> getOperators() {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -919,12 +923,12 @@ public class FakeServer implements Server {
}
@Override
public CachedServerIcon loadServerIcon(File file) throws Exception {
public CachedServerIcon loadServerIcon(File file) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public CachedServerIcon loadServerIcon(BufferedImage bufferedImage) throws Exception {
public CachedServerIcon loadServerIcon(BufferedImage bufferedImage) {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -969,6 +973,7 @@ public class FakeServer implements Server {
}
@Override
@SuppressWarnings("deprecation")
public UnsafeValues getUnsafe() {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -1049,8 +1054,12 @@ public class FakeServer implements Server {
throw new UnsupportedOperationException("Not supported yet.");
}
public <T extends Keyed> Iterable<Tag<T>> getTags(String registry, Class<T> clazz) {
throw new UnsupportedOperationException("Not supported yet.");
}
class FakePluginManager implements PluginManager {
ArrayList<RegisteredListener> listeners = new ArrayList<RegisteredListener>();
ArrayList<RegisteredListener> listeners = new ArrayList<>();
@Override
public void registerInterface(Class<? extends PluginLoader> loader) throws IllegalArgumentException {
@@ -1078,7 +1087,7 @@ public class FakeServer implements Server {
}
@Override
public Plugin loadPlugin(File file) throws InvalidPluginException, InvalidDescriptionException, UnknownDependencyException {
public Plugin loadPlugin(File file) throws UnknownDependencyException {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -1210,9 +1219,14 @@ public class FakeServer implements Server {
}
}
@Override
@Override
public LootTable getLootTable(NamespacedKey arg0) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
@Override
public List<Entity> selectEntities(CommandSender sender, String selector) throws IllegalArgumentException {
throw new UnsupportedOperationException("Not supported yet.");
}
}
@@ -49,8 +49,7 @@ public class MessagingTest {
.loadClass("com.earth2me.essentials.commands.Command" + command).newInstance();
cmd.setEssentials(ess);
cmd.run(server, user, command, null, args);
} catch (NoChargeException ex) {
}
} catch (NoChargeException ignored) {}
}
@@ -68,8 +67,7 @@ public class MessagingTest {
.loadClass("com.earth2me.essentials.commands.Command" + command).newInstance();
cmd.setEssentials(ess);
cmd.run(server, new CommandSource(sender), command, null, args);
} catch (NoChargeException ex) {
}
} catch (NoChargeException ignored) {}
}
@Test(expected = Exception.class) // I really don't like this, but see note below about console reply
@@ -1,19 +1,19 @@
package com.earth2me.essentials;
import junit.framework.TestCase;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.plugin.InvalidDescriptionException;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
public class StorageTest extends TestCase {
Essentials ess;
FakeServer server;
World world;
public class StorageTest {
private Essentials ess;
private FakeServer server;
private World world;
public StorageTest() {
server = new FakeServer();
@@ -22,9 +22,9 @@ public class StorageTest extends TestCase {
try {
ess.setupForTesting(server);
} catch (InvalidDescriptionException ex) {
fail("InvalidDescriptionException");
Assert.fail("InvalidDescriptionException");
} catch (IOException ex) {
fail("IOException");
Assert.fail("IOException");
}
}
@@ -39,8 +39,7 @@ public class ToggleTest extends TestCase {
cmd = (IEssentialsCommand) Essentials.class.getClassLoader().loadClass("com.earth2me.essentials.commands.Command" + command).newInstance();
cmd.setEssentials(ess);
cmd.run(server, user, command, null, args);
} catch (NoChargeException ex) {
}
} catch (NoChargeException ignored) {}
}
@@ -53,8 +52,7 @@ public class ToggleTest extends TestCase {
cmd = (IEssentialsCommand) Essentials.class.getClassLoader().loadClass("com.earth2me.essentials.commands.Command" + command).newInstance();
cmd.setEssentials(ess);
cmd.run(server, new CommandSource(sender), command, null, args);
} catch (NoChargeException ex) {
}
} catch (NoChargeException ignored) {}
}
@@ -2,6 +2,7 @@ package com.earth2me.essentials;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.LocationUtil;
import com.earth2me.essentials.utils.VersionUtil;
import junit.framework.TestCase;
import org.bukkit.World.Environment;
import org.bukkit.plugin.InvalidDescriptionException;
@@ -14,13 +15,11 @@ import java.util.Set;
public class UtilTest extends TestCase {
private final Essentials ess;
private final FakeServer server;
public UtilTest() {
server = new FakeServer();
FakeServer server = new FakeServer();
server.createWorld("testWorld", Environment.NORMAL);
ess = new Essentials(server);
Essentials ess = new Essentials(server);
try {
ess.setupForTesting(server);
} catch (InvalidDescriptionException ex) {
@@ -31,7 +30,7 @@ public class UtilTest extends TestCase {
}
public void testSafeLocation() {
Set<String> testSet = new HashSet<String>();
Set<String> testSet = new HashSet<>();
int count = 0;
int x, y, z, origX, origY, origZ;
x = y = z = origX = origY = origZ = 0;
@@ -62,132 +61,146 @@ public class UtilTest extends TestCase {
public void testFDDfuture() {
Calendar a, b;
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 10, 0, 1);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 1);
assertEquals("1 second", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 10, 0, 2);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 2);
assertEquals("2 seconds", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 10, 0, 3);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 3);
assertEquals("3 seconds", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 10, 1, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 1, 0);
assertEquals("1 minute", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 10, 2, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 2, 0);
assertEquals("2 minutes", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 10, 3, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 3, 0);
assertEquals("3 minutes", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 11, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 11, 0, 0);
assertEquals("1 hour", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 12, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 12, 0, 0);
assertEquals("2 hours", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 13, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 13, 0, 0);
assertEquals("3 hours", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 2, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 2, 10, 0, 0);
assertEquals("1 day", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 3, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 3, 10, 0, 0);
assertEquals("2 days", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 4, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 4, 10, 0, 0);
assertEquals("3 days", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 2, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.MARCH, 1, 10, 0, 0);
assertEquals("1 month", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 3, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.APRIL, 1, 10, 0, 0);
assertEquals("2 months", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 4, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.MAY, 1, 10, 0, 0);
assertEquals("3 months", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2011, 1, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2011, Calendar.FEBRUARY, 1, 10, 0, 0);
assertEquals("1 year", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2012, 1, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2012, Calendar.FEBRUARY, 1, 10, 0, 0);
assertEquals("2 years", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2013, 1, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2013, Calendar.FEBRUARY, 1, 10, 0, 0);
assertEquals("3 years", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2011, 4, 5, 23, 38, 12);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2011, Calendar.MAY, 5, 23, 38, 12);
assertEquals("1 year 3 months 4 days", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 9, 17, 23, 45, 45);
b = new GregorianCalendar(2015, 3, 7, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.OCTOBER, 17, 23, 45, 45);
b = new GregorianCalendar(2015, Calendar.APRIL, 7, 10, 0, 0);
assertEquals("4 years 5 months 20 days", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2011, 4, 31, 10, 0, 0);
b = new GregorianCalendar(2011, 4, 31, 10, 5, 0);
a = new GregorianCalendar(2011, Calendar.MAY, 31, 10, 0, 0);
b = new GregorianCalendar(2011, Calendar.MAY, 31, 10, 5, 0);
assertEquals("5 minutes", DateUtil.formatDateDiff(a, b));
}
public void testFDDpast() {
Calendar a, b;
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 9, 59, 59);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 9, 59, 59);
assertEquals("1 second", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 9, 59, 58);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 9, 59, 58);
assertEquals("2 seconds", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 9, 59, 57);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 9, 59, 57);
assertEquals("3 seconds", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 9, 59, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 9, 59, 0);
assertEquals("1 minute", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 9, 58, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 9, 58, 0);
assertEquals("2 minutes", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 9, 57, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 9, 57, 0);
assertEquals("3 minutes", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 9, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 9, 0, 0);
assertEquals("1 hour", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 8, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 8, 0, 0);
assertEquals("2 hours", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 1, 7, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 7, 0, 0);
assertEquals("3 hours", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 5, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 4, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 5, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 4, 10, 0, 0);
assertEquals("1 day", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 5, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 3, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 5, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 3, 10, 0, 0);
assertEquals("2 days", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 5, 10, 0, 0);
b = new GregorianCalendar(2010, 1, 2, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 5, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.FEBRUARY, 2, 10, 0, 0);
assertEquals("3 days", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 5, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 4, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.JUNE, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.MAY, 1, 10, 0, 0);
assertEquals("1 month", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 5, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 3, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.JUNE, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.APRIL, 1, 10, 0, 0);
assertEquals("2 months", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 5, 1, 10, 0, 0);
b = new GregorianCalendar(2010, 2, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.JUNE, 1, 10, 0, 0);
b = new GregorianCalendar(2010, Calendar.MARCH, 1, 10, 0, 0);
assertEquals("3 months", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2009, 1, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2009, Calendar.FEBRUARY, 1, 10, 0, 0);
assertEquals("1 year", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2008, 1, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2008, Calendar.FEBRUARY, 1, 10, 0, 0);
assertEquals("2 years", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2007, 1, 1, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2007, Calendar.FEBRUARY, 1, 10, 0, 0);
assertEquals("3 years", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 1, 1, 10, 0, 0);
b = new GregorianCalendar(2009, 4, 5, 23, 38, 12);
a = new GregorianCalendar(2010, Calendar.FEBRUARY, 1, 10, 0, 0);
b = new GregorianCalendar(2009, Calendar.MAY, 5, 23, 38, 12);
assertEquals("8 months 26 days 10 hours", DateUtil.formatDateDiff(a, b));
a = new GregorianCalendar(2010, 9, 17, 23, 45, 45);
b = new GregorianCalendar(2000, 3, 7, 10, 0, 0);
a = new GregorianCalendar(2010, Calendar.OCTOBER, 17, 23, 45, 45);
b = new GregorianCalendar(2000, Calendar.APRIL, 7, 10, 0, 0);
assertEquals("10 years 6 months 10 days", DateUtil.formatDateDiff(a, b));
}
public void testVer() {
VersionUtil.BukkitVersion v;
v = VersionUtil.BukkitVersion.fromString("1.13.2-R0.1");
assertEquals(v.getMajor(), 1);
assertEquals(v.getMinor(), 13);
assertEquals(v.getPatch(), 2);
assertEquals(v.getRevision(), 0.1);
v = VersionUtil.BukkitVersion.fromString("1.9-R1.4");
assertEquals(v.getMajor(), 1);
assertEquals(v.getMinor(), 9);
assertEquals(v.getPatch(), 0);
assertEquals(v.getRevision(), 1.4);
}
}
+1 -8
View File
@@ -6,18 +6,11 @@
<parent>
<groupId>net.ess3</groupId>
<artifactId>EssentialsXParent</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
</parent>
<artifactId>EssentialsXAntiBuild</artifactId>
<licenses>
<license>
<name>GPLv3</name>
<url>http://www.gnu.org/copyleft/gpl.html</url>
</license>
</licenses>
<build>
<finalName>EssentialsXAntiBuild-${full.version}</finalName>
</build>
@@ -1,5 +1,6 @@
package com.earth2me.essentials.antibuild;
import com.earth2me.essentials.metrics.Metrics;
import org.bukkit.Material;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
@@ -14,6 +15,7 @@ public class EssentialsAntiBuild extends JavaPlugin implements IAntiBuild {
private final transient Map<AntiBuildConfig, Boolean> settingsBoolean = new EnumMap<>(AntiBuildConfig.class);
private final transient Map<AntiBuildConfig, List<Material>> settingsList = new EnumMap<>(AntiBuildConfig.class);
private transient EssentialsConnect ess = null;
private transient Metrics metrics = null;
@Override
public void onEnable() {
@@ -26,6 +28,10 @@ public class EssentialsAntiBuild extends JavaPlugin implements IAntiBuild {
final EssentialsAntiBuildListener blockListener = new EssentialsAntiBuildListener(this);
pm.registerEvents(blockListener, this);
if (metrics == null) {
metrics = new Metrics(this);
}
}
@Override
@@ -1,6 +1,7 @@
package com.earth2me.essentials.antibuild;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.api.IEssentials;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -21,15 +22,18 @@ import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class EssentialsAntiBuildListener implements Listener {
private static final Logger logger = Logger.getLogger("EssentialsAntiBuild");
final private transient IAntiBuild prot;
final private transient IEssentials ess;
public EssentialsAntiBuildListener(final IAntiBuild parent) {
EssentialsAntiBuildListener(final IAntiBuild parent) {
this.prot = parent;
this.ess = prot.getEssentialsConnect().getEssentials();
@@ -52,18 +56,36 @@ public class EssentialsAntiBuildListener implements Listener {
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.");
logger.log(Level.INFO, "AntiBuild permission check failed, invalid block.");
}
return false;
}
return metaPermCheck(user, action, block.getType());
return metaPermCheck(user, action, block.getType(), block.getData());
}
private boolean metaPermCheck(final User user, final String action, final Material material) {
public boolean metaPermCheck(final User user, final String action, final Material material) {
final String blockPerm = "essentials.build." + action + "." + material;
return user.isAuthorized(blockPerm);
}
private boolean metaPermCheck(final User user, final String action, final Material material, final short data) {
final String blockPerm = "essentials.build." + action + "." + material;
final String dataPerm = blockPerm + ":" + data;
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
if (user.getBase().isPermissionSet(dataPerm)) {
return user.isAuthorized(dataPerm);
} else {
if (ess.getSettings().isDebug()) {
logger.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());
@@ -181,7 +203,7 @@ public class EssentialsAntiBuildListener implements Listener {
}
if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.build")) {
if (event.hasItem() && !metaPermCheck(user, "interact", item.getType())) {
if (event.hasItem() && !metaPermCheck(user, "interact", item.getType(), item.getDurability())) {
event.setCancelled(true);
if (ess.getSettings().warnOnBuildDisallow()) {
user.sendMessage(tl("antiBuildUse", item.getType().toString()));
@@ -206,7 +228,7 @@ public class EssentialsAntiBuildListener implements Listener {
final ItemStack item = event.getRecipe().getResult();
if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.build")) {
if (!metaPermCheck(user, "craft", item.getType())) {
if (!metaPermCheck(user, "craft", item.getType(), item.getDurability())) {
event.setCancelled(true);
if (ess.getSettings().warnOnBuildDisallow()) {
user.sendMessage(tl("antiBuildCraft", item.getType().toString()));
@@ -223,7 +245,7 @@ public class EssentialsAntiBuildListener implements Listener {
final ItemStack item = event.getItemDrop().getItemStack();
if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.build")) {
if (!metaPermCheck(user, "drop", item.getType())) {
if (!metaPermCheck(user, "drop", item.getType(), item.getDurability())) {
event.setCancelled(true);
user.getBase().updateInventory();
if (ess.getSettings().warnOnBuildDisallow()) {
@@ -250,7 +272,7 @@ public class EssentialsAntiBuildListener implements Listener {
final ItemStack item = event.getItem().getItemStack();
if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.build")) {
if (!metaPermCheck(user, "pickup", item.getType())) {
if (!metaPermCheck(user, "pickup", item.getType(), item.getDurability())) {
event.setCancelled(true);
event.getItem().setPickupDelay(50);
}
@@ -266,7 +288,7 @@ public class EssentialsAntiBuildListener implements Listener {
final ItemStack item = event.getItem().getItemStack();
if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild() && !user.isAuthorized("essentials.build")) {
if (!metaPermCheck(user, "pickup", item.getType())) {
if (!metaPermCheck(user, "pickup", item.getType(), item.getDurability())) {
event.setCancelled(true);
event.getItem().setPickupDelay(50);
}
@@ -13,14 +13,14 @@ import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class EssentialsConnect {
private static final Logger LOGGER = Logger.getLogger("Minecraft");
class EssentialsConnect {
private static final Logger logger = Logger.getLogger("EssentialsAntiBuild");
private final transient IEssentials ess;
private final transient IAntiBuild protect;
public EssentialsConnect(Plugin essPlugin, Plugin essProtect) {
EssentialsConnect(Plugin essPlugin, Plugin essProtect) {
if (!essProtect.getDescription().getVersion().equals(essPlugin.getDescription().getVersion())) {
LOGGER.log(Level.WARNING, tl("versionMismatchAll"));
logger.log(Level.WARNING, tl("versionMismatchAll"));
}
ess = (IEssentials) essPlugin;
protect = (IAntiBuild) essProtect;
@@ -29,17 +29,14 @@ public class EssentialsConnect {
ess.addReloadListener(pr);
}
public void onDisable() {
}
public IEssentials getEssentials() {
IEssentials getEssentials() {
return ess;
}
public void alert(final User user, final String item, final String type) {
void alert(final User user, final String item, final String type) {
final Location loc = user.getLocation();
final String warnMessage = tl("alertFormat", user.getName(), type, item, loc.getWorld().getName() + "," + loc.getBlockX() + "," + loc.getBlockY() + "," + loc.getBlockZ());
LOGGER.log(Level.WARNING, warnMessage);
logger.log(Level.WARNING, warnMessage);
for (Player p : ess.getServer().getOnlinePlayers()) {
final User alertUser = ess.getUser(p);
if (alertUser.isAuthorized("essentials.protect.alerts")) {
@@ -48,7 +45,6 @@ public class EssentialsConnect {
}
}
private class AntiBuildReloader implements IConf {
@Override
public void reloadConfig() {
+1 -1
View File
@@ -6,5 +6,5 @@ version: ${full.version}
website: http://tiny.cc/EssentialsCommands
description: Provides build protection.
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, Iaccidentally]
api-version: 1.13
depend: [Essentials]
api-version: 1.13
+1 -8
View File
@@ -6,18 +6,11 @@
<parent>
<groupId>net.ess3</groupId>
<artifactId>EssentialsXParent</artifactId>
<version>2.16.0</version>
<version>2.16.1</version>
</parent>
<artifactId>EssentialsXChat</artifactId>
<licenses>
<license>
<name>GPLv3</name>
<url>http://www.gnu.org/copyleft/gpl.html</url>
</license>
</licenses>
<build>
<finalName>EssentialsXChat-${full.version}</finalName>
</build>
@@ -5,7 +5,7 @@ import com.earth2me.essentials.User;
import net.ess3.api.IEssentials;
public class ChatStore {
class ChatStore {
private final User user;
private final String type;
private final Trade charge;
@@ -17,27 +17,27 @@ public class ChatStore {
this.charge = new Trade(getLongType(), ess);
}
public User getUser() {
User getUser() {
return user;
}
public Trade getCharge() {
Trade getCharge() {
return charge;
}
public String getType() {
String getType() {
return type;
}
public final String getLongType() {
final String getLongType() {
return type.length() == 0 ? "chat" : "chat-" + type;
}
public long getRadius() {
long getRadius() {
return radius;
}
public void setRadius(long radius) {
void setRadius(long radius) {
this.radius = radius;
}
}
Loaded 100 of 158 files, more files were not shown because too many files have changed in this diff. Show more