Compare commits

...
2621 Commits
Author SHA1 Message Date
md678685 aa4d3cc9fd Bump to 2.16-pre2 2018-12-25 00:27:54 +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 23d92fac63 Bump version to 2.16.0 and release 2.16-pre1 2018-12-09 14:33:53 +00:00
md678685 5922b85290 Move SHIELD to from MetaItemStack to MaterialUtil 2018-12-09 13:47:52 +00:00
md678685 814e5a643e Add SIGNS and SPAWNER to MaterialUtil 2018-12-09 13:47:22 +00:00
md678685 3db3a272d5 Update default kits.yml file
Item IDs are no longer supported in 1.13+, so remove them from the default kits section.
2018-12-09 13:07:11 +00:00
md678685 2d703fbc80 Add damage value support to FlatItemDb
...in case you wanted to give players broken swords, or something?
2018-12-09 13:04:21 +00:00
md678685 b49d3cc21c Remove unnecessary kits file
This is a leftover from dev environments and is *not* the one copied into the jar during build.
2018-12-09 13:02:44 +00:00
md678685 02b5d2357a Add missing FakeServer methods 2018-12-09 12:29:28 +00:00
md678685 1206178eca Use utility methods in MetaItemStack 2018-12-09 12:17:13 +00:00
md678685 3df3f8a812 Add several cross-version item type checks to MaterialUtil 2018-12-09 12:17:13 +00:00
md678685 7049952b07 Load forceEnableRecipe during Settings.reloadConfig 2018-12-09 12:17:13 +00:00
Mark Vadeika a18ce40921 Hiding display names (#2248) @AllTheMegahertz
Prevents a user's nickname from appearing if they are hidden, if `hide-displayname-in-vanish: true` in the config. Closes #2221.

* Does not return display name if user is hidden

* Added hide-displayname-in-vanish field

* Added hideDisplayNameInVanish()

* Changed to only hide display name if specified in config

* Changed hideDisplayNameInVanish to default to false if not specified in config.yml
2018-12-09 11:02:45 +00:00
md678685 6a6383462d Allow admins to force enable /recipe if they want
Add `force-enable-recipe`, which allows server admins to manually enable `/recipe` despite potential duplication exploits. Use this at your own risk!

Related: #1397
2018-12-08 16:41:24 +00:00
md678685 44301fae4f Fix Worth.setPrice on 1.13+; add Javadocs to Worth 2018-12-08 16:32:09 +00:00
md678685 6ee84510ea Update bStats-Metrics 2018-12-06 17:49:08 +00:00
md678685 6ecdc8d7fc Enu-moo-til 2018-12-06 17:44:22 +00:00
md678685 35a2a4d803 Add several version warning messages 2018-12-06 17:41:32 +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
md678685 4011810536 Correctly use LegacyItemDb after detecting version < 1.13 2018-11-19 22:51:07 +00:00
md678685 85ea07c97e Fix VersionUtil regex matching and BukkitVersion.toString 2018-11-19 22:48:33 +00:00
md678685 41b2449cdd Change /enchant's default level from -1 to 1 2018-11-19 21:11:25 +00:00
md678685 ec83a5fff2 Add EntityPickupItemEvent listener to AntiBuild 2018-11-19 20:20:10 +00:00
md678685 ded6f06ed2 Merge remote-tracking branch 'origin/2.x' into 1.13 2018-11-19 19:48:38 +00:00
md678685 2605e050a0 Deduplicate ItemDb code 2018-11-19 19:41:01 +00:00
md678685 19b1e19e42 Remove extraneous imports 2018-11-19 19:30:35 +00:00
md678685 f7a1149cac Port old ItemDb back 2018-11-19 14:13:05 +00:00
md678685 7dd52dab32 Add non-NMS VersionUtil
*Should* work on Glowstone. TODO: use this instead of ReflUtil where appropriate.
2018-11-19 14:12:10 +00:00
md678685 937aec600a Implement more FakeServer methods 2018-11-19 12:52:19 +00:00
md678685 4802053da6 Rename en-GB to en_GB for consistency 2018-11-19 12:51:26 +00:00
md678685 0105dff7ac Update AntiBuild default entries to enum names 2018-11-19 12:49:34 +00:00
md678685 8cc448efcf Remove meta/durability checks from AntiBuild 2018-11-19 11:38:50 +00:00
md678685 982b358bf8 Bump AntiBuild and Protect to api-version: 1.13 2018-11-19 11:28:31 +00:00
md678685 ffc80d61af Implement missing FakeWorld and OfflinePlayer methods 2018-11-19 11:26:05 +00:00
md678685 f55956612c Add messages_en-GB.properties (#2206)
Tins what it does on the say.
2018-11-19 08:38:37 +00:00
md678685 cd3b342d74 Target Bukkit 1.13.2 2018-10-31 15:00:54 +00:00
md678685 ba959586e2 Merge remote-tracking branch 'games647/java9' into 1.13 2018-10-31 14:53:49 +00:00
md678685 4c07e584b7 Default to max stack size 2018-10-31 14:47:45 +00:00
Banbeucmas 280d1215de Adding EssentialsWarpEvent (#1921) @Banbeucmas
* Adding EssentialsWarpEvent for checking if player is wrapping

* Spacing

* Adding Trade parameter

* Refactoring

* Adding #setWarp() to the Event

* Spacing

* Documenting the purpose of the Event

* Javadoc?
2018-10-28 18:53:52 +00:00
montlikadani a2a95ed840 Added acacia and dark oak tree types (#2001) @montlikadani
* Update Commandbigtree.java

* Update Commandbigtree.java

* Update Commandtree.java
2018-10-28 18:41:46 +00:00
md678685 4bd9461282 Rename help-.md to help.md 2018-10-28 10:54:01 +00:00
md678685 96adef5269 Update issue templates (#2045)
* Update issue templates

Add new issue templates - I didn't even know GitHub had these now

* Remove duplicate bug template

* Remove duplicate feature template

* Update help-.md

* Update report-a-bug.md

* Update request-a-feature.md

* Delete ISSUE_TEMPLATE.md
2018-10-27 15:42:56 +01:00
md678685 9576ea25a6 Use reflection-based detection for pickup listener in player listener (#2151)
Allows the plugin to start up on Glowstone correctly.

Tested on Spigot 1.12.2, Spigot 1.9.4 and Glowstone 2018.7.0, works correctly on all.
2018-10-27 15:37:29 +01:00
md678685 a7fcafb245 Filter out comment lines when loading items.json 2018-10-27 15:00:04 +01:00
md678685 73bb41d579 Merge branch '1.13-items' into 1.13 2018-10-26 15:59:51 +01:00
md678685 0a90d76493 Remove item IDs from Worth 2018-10-15 13:56:36 +01:00
md678685 010981d3c8 Remove ID-based charges in /repair 2018-10-15 13:51:04 +01:00
md678685 3353061e76 Remove ID-based permission checks in /more 2018-10-15 13:49:16 +01:00
md678685 79bc34047b Allow multiple item names in /clearinventory
Allow a comma-separated list of item names in /clearinventory.
2018-10-15 13:46:12 +01:00
md678685 60c90408e7 Remove ID-based permission checks in /give and /item 2018-10-15 13:16:10 +01:00
md678685 1218c3e226 Merge branch '1.13' into 1.13-items 2018-10-13 18:23:58 +01:00
md678685 a05fc9d08e Remove duplicated OfflinePlayer method 2018-10-13 17:14:10 +01:00
md678685 6906ef2154 Merge branch '1.13' into 1.13-items 2018-10-13 16:59:57 +01:00
md678685 7d25e84ebc Merge branch '2.x' into 1.13 2018-10-13 16:59:44 +01:00
md678685 121d935315 Implement missing FakeServer methods 2018-10-13 16:55:49 +01:00
md678685 2f66a866d8 Implement missing FakeWorld and OfflinePlayer methods 2018-10-13 16:55:42 +01:00
md678685 0e088c17a8 Remove IdProvider dependency 2018-10-13 16:45:20 +01:00
md678685 4cd8a6636b Log invalid JSON entries 2018-10-13 16:44:50 +01:00
md678685 5c7fc763fc Formatting 2018-10-13 16:44:24 +01:00
md678685 1e381a59be Throw meaningful exception when item not found 2018-10-13 16:32:21 +01:00
md678685 85111f25cb Use ItemData#equals when finding item name
Avoids accidentally causing an NPE while comparing potion data.
2018-10-13 16:09:45 +01:00
md678685 f78887a02e Remove item IDs from /itemdb 2018-10-13 15:59:25 +01:00
md678685 feba535637 Actually assign the ManagedFile to file 2018-10-13 15:38:45 +01:00
md678685 3262143c73 Implement missing FakeServer methods 2018-10-13 15:30:27 +01:00
md678685 18feb7967a Implement missing FakeWorld and OfflinePlayer methods 2018-10-13 15:26:58 +01:00
md678685 e9b1511117 Remove item ID support in Worth 2018-10-12 17:26:41 +01:00
md678685 177e5f62f7 Remove providers; move JSON support into ItemDb 2018-10-12 17:26:22 +01:00
md678685 f3f4395da7 Reset BuildTools work directory on Travis 2018-10-09 20:32:40 +01:00
md678685 442e46b012 Return to root after BuildTools on Travis 2018-10-09 20:25:36 +01:00
md678685 37d699d05b mkdir -p in Travis 2018-10-09 19:54:31 +01:00
md678685 77ed1e1d4a Ensure Travis runs BuildTools before mvn install 2018-10-09 19:52:42 +01:00
md678685 50e4cd67b5 Fix typo in Travis config 2018-10-09 19:47:57 +01:00
md678685 83a90eb553 Update .travis.yml 2018-10-09 19:45:28 +01:00
md678685 c29599d39a Create .travis.yml 2018-10-09 19:34:07 +01:00
md678685 692e0adde4 Use MONSTER_EGG in SpawnEggRefl 2018-09-09 16:37:02 +01:00
md678685 cdba518bae Revert "Implement 1.13 item support (#2153)" 2018-09-09 16:35:20 +01:00
md678685 b70b67fa1f Remove unnecessary CraftBukkit dependency 2018-09-09 16:34:15 +01:00
md678685 ff0ca9bc7b Remove unnecessary CraftBukkit dependency 2018-09-05 19:20:18 +01:00
md678685 320bc25d94 Implement 1.13 item support (#2153)
Uses two distinct providers to support items on 1.13 while falling back to `items.csv` for previous versions of Minecraft.
2018-09-05 14:23:16 +01:00
md678685 425e955b5d Update items.json
Add some more aliases to the file
2018-09-05 14:19:09 +01:00
pop4959 33ae9a2597 Fix TropicalFish spawning (#2159)
The name can't have a space in it or it won't be matched by any commands.
2018-09-05 13:26:33 +01:00
pop4959 19913d3612 Implement abstract method Entity::getFacing in OfflinePlayer (#2157) @pop4959
Allows EssentialsX to compile against the latest Spigot version.

Reference: [https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/8ab814cd5c415258aa0ab7617051ee4ea9f4e7bd](https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/8ab814cd5c415258aa0ab7617051ee4ea9f4e7bd)
2018-09-05 11:00:27 +01:00
pop4959 a3eb58724f Add a way to use unsafe nicknames (#2152) @pop4959
Pretty much what the title says. Closes #1630.

This is a fun little feature that I'm sure many people have always wanted. I can understand that the original authors of Essentials were probably concerned about users entering names that cannot display correctly in the chat, and that is understandable.

I have added a new permission "essentials.nick.allowunsafe", which must be given to anyone who is allowed to use characters outside of the alphanumeric set. The name of the permission is inspired from "essentials.enchantments.allowunsafe", which allows unsafe enchantment levels to be applied to items without guaranteed behaviour. Similarly, the permission "essentials.nick.allowunsafe" allows unsafe characters to be entered for the user's nickname without making any guarantee that those characters will show up in chat correctly.
2018-09-02 12:14:26 +01:00
md678685 0afa00779c Add some comments to LegacyItemDbProvider 2018-09-01 19:31:32 +01:00
md678685 17d5545804 Update items.json
Fix incorrect type for Uncraftable Potions
2018-09-01 16:46:55 +01:00
md678685 cd70662f01 Update items.json
Fixes some potions spawning incorrectly where the vanilla name didn't match the Bukkit enum name
2018-09-01 16:27:28 +01:00
md678685 a89c97409b Use potion data when looking up items 2018-09-01 15:48:14 +01:00
md678685 102cb6d949 Merge branch '1.13' into 1.13-items 2018-09-01 10:46:27 +01:00
md678685 6c9c9ad42a Use enum methods throughout plugin for cross-version enum lookups 2018-09-01 10:35:08 +01:00
md678685 acbc96fd55 Add enum utility helpers for Statistic and Material 2018-09-01 10:34:11 +01:00
md678685 ca721c1acb Add V1_13_R2 to ReflUtil 2018-08-27 21:29:30 +01:00
md678685 3bf669c42a ItemDbProvider#resolve returns ItemData
More useful than just returning the Material.
2018-08-27 21:21:06 +01:00
md678685 cdc5f75fcb Remove unnecessary equals method on abstract ItemData 2018-08-27 21:19:36 +01:00
md678685 d74f19970b Strip out legacy ItemDb code, pt 1928371236123897 2018-08-27 21:19:15 +01:00
md678685 2ddde37771 Improve FlatItemData#equals 2018-08-27 21:02:27 +01:00
md678685 c1c422e03d Update items.json 2018-08-27 21:00:57 +01:00
md678685 7608b7d658 Merge branch '1.13' into 1.13-items 2018-08-27 20:01:48 +01:00
md678685 d1d5ae814f Merge branch '2.x' into 1.13 2018-08-27 20:01:01 +01:00
md678685 452fa61717 Change tryProvider test values 2018-08-27 19:58:19 +01:00
md678685 825f697fd2 Update items.json 2018-08-27 19:30:05 +01:00
md678685 4ea71ae88e Implement missing methods in FakeWorld 2018-08-27 14:10:06 +01:00
md678685 bdb32f5878 Bump Bukkit version to 1.13.1 2018-08-27 13:10:15 +01:00
md678685 e3c726b8f6 Log total loaded items on reload 2018-08-27 13:06:27 +01:00
md678685 96c6c7b1ca Add per-provider implementations of ItemData 2018-08-27 11:23:47 +01:00
md678685 634d62f9ef Fix typo in /kickall 2018-08-27 10:30:29 +01:00
md678685 2806156cf4 Add "allow-world-in-broadcastworld" option
Allows players to send broadcasts to a specified world by running `/broadcastworld [world] <message>` if enabled.

This is disabled by default in old configs to avoid confusion between updates.
2018-08-27 10:26:54 +01:00
md678685 e642192461 Kick players in /banip
The four-year-old to-do has finally been done!

Closes #2143.
2018-08-26 22:54:00 +01:00
md678685 959c788f22 Don't kick exempt players when running /kickall 2018-08-26 21:03:17 +01:00
montlikadani cda520589a Revert "Doesn't kick all players if the player has permission (#2145) @montlikadani"
This reverts commit 5c1db129d3.
2018-08-26 20:59:46 +01:00
montlikadani 5c1db129d3 Doesn't kick all players if the player has permission (#2145) @montlikadani
So, if a player has permission (eg, an operator or more), they will not kick them out because of permission.
2018-08-26 20:13:05 +01:00
Leomixer17 c718962426 Update messages_it.properties (#2144) @Leomixer17 2018-08-26 17:07:05 +01:00
Thomas 575a11b645 Updated "createKitSuccess=" (#2133) @DutchUser
* Updated "createKitSuccess="

They have the old one, its now in the "kits.yml" not in "config.yml"

* Update messages_da.properties

* Update messages_de.properties

* Update messages_es.properties

* Update messages_en.properties

* Update messages_et.properties

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess=

* Updated "createKitSuccess=

* Updated "createKitSuccess=

* Updated "createKitSuccess=

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Updated "createKitSuccess="

* Update messages_vi.properties

Going add the other later today, 

* invalidItemFlagMeta
* noJailsDefined
* openingDisposal
* socialSpyMsgFormat
* socialSpyMutedPrefix
* tempbanJoin
* whoisUuid

* Update messages_vi.properties

* Update messages_vi.properties @md678685

I have no idea why this whole file is in `\u` codes

* Update messages.properties @md678685
2018-08-26 16:12:13 +01:00
Xeyame f97c5fc1ff Make /realname configurable (#1952) @Xeyame
Closes #1810.

@md678685: I've added colour codes to the `realName` messages by default, which was not originally part of this PR.
2018-08-26 15:39:37 +01:00
montlikadani 81397d98b8 Added editable messages (#2072) @montlikadani
**If it is accepted then I will add it to the other message files.**
2018-08-26 15:17:07 +01:00
Leomixer17 82b2ff0b3f Update messages_it.properties (#2142) @Leomixer17 2018-08-26 15:13:33 +01:00
md678685 05fcb7b1aa Refactor to allow items to be added after first load 2018-08-25 18:38:50 +01:00
md678685 c79db98978 Add more debug logging to Settings (#2140)
Adds debug logging for `getChatFormat` and `getCommandCooldownEntry`, which makes it much easier to track down issues with group formats in EssentialsX Chat and command cooldowns respectively.
2018-08-25 18:09:08 +01:00
md678685 303aa77901 Add missing import 2018-08-25 16:55:12 +01:00
md678685 65a4ef7ee5 Use items that actually exist in tryProvider 2018-08-25 16:54:50 +01:00
md678685 1be7fbd8a6 Remove hash comment when rebuilding JSON database 2018-08-25 16:54:09 +01:00
Max Roncace 935b5cfe0f Fix unbreakable attribute for kits (#2071) @caseif
This PR fixes the `unbreakable` attribute on kit items. Previously, Essentials was exclusively using an internal Spigot method to set this on `ItemMeta` objects; however, this solution seems to be non-functional on more recent Spigot builds (1.12.2).

I have altered the `MetaItemStack#setUnbreakable` method to use the native Bukkit method, available for [some time now](https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/d986a3f), by default. Essentials will still use the old solution as a fallback in case of an older Bukkit version which does not have native support for the attribute.
2018-08-25 11:33:17 +01:00
md678685 bad02729db Allow /eco take to subtract a user's exact balance 2018-08-24 15:42:17 +01:00
md678685 80f7ded687 SPECTATOR mode is safe for teleporting everywhere. (#2049)
Teleporting in spectator mode is as safe as creative mode for every target.
2018-08-24 15:24:26 +01:00
Max Lee f569b89d8f Round down balance when converting to double (#2135) 2018-08-21 23:45:58 +01:00
md678685 fec655a29c Implement ItemDbProviders, pt 7
Implement getStack and resolve for FlatItemDbProvider
2018-08-19 23:12:27 +01:00
md678685 610774b0b9 Remove default getStack implementation 2018-08-19 23:11:30 +01:00
md678685 9487665fae Use Bukkit PotionData instead of our own 2018-08-19 23:10:23 +01:00
md678685 d5b43b7162 Include JSON files in jar at build time 2018-08-19 23:09:02 +01:00
md678685 718d9d9d3a Initialise provider and file during first reload 2018-08-19 21:55:29 +01:00
md678685 3705dbdd2b Add items.json
TODO: should we auto-download from the CI on build?
2018-08-19 21:43:53 +01:00
md678685 c37d516980 Use MONSTER_EGG in SpawnEggRefl 2018-08-19 21:16:16 +01:00
md678685 b27a6b5b8e Add additional timer marks 2018-08-19 21:11:51 +01:00
md678685 98809fafd7 Strip out legacy ItemDb code, pt 4 2018-08-19 21:10:54 +01:00
md678685 dd9a0de98d Implement ItemDbProviders, pt 6 2018-08-19 20:58:45 +01:00
md678685 de2298cf0a Strip out legacy ItemDb code, pt 3 2018-08-19 20:58:23 +01:00
md678685 56fb8b06cd Add listNames to abstract ItemDbProvider 2018-08-19 20:55:56 +01:00
md678685 3b1eb683e1 Merge branch 'patch-20' into 2.x @montlikadani 2018-08-19 20:17:32 +01:00
md678685 1029305382 Implement ItemDbProviders, pt 5 2018-08-19 19:23:20 +01:00
md678685 9b39509e88 Misc changes 2018-08-19 18:30:44 +01:00
md678685 9da58dde5c Strip out legacy ItemDb code, pt 2 2018-08-19 18:04:13 +01:00
md678685 e2507d2ff1 Implement ItemDbProviders, pt 4 2018-08-19 18:03:53 +01:00
md678685 b867f121c9 Implement ItemDbProviders, pt 3 2018-08-19 17:49:34 +01:00
montlikadani 3c6a869336 Fix iron armor bug (#2054) 2018-08-19 16:57:14 +01:00
RikoDEV f357e76980 Small corrections in the Polish translation (#2103) 2018-08-19 16:56:16 +01:00
gb2233 946a1fbb7c Fixed unicode characters in HU locale (#2130) 2018-08-19 16:55:14 +01:00
Oliver Ni 37acdc18f2 Fix Easter egg config typo (#2124) @oliver-ni
Left clicking mobs with a milk bucket turns them into a baby, not right clicking.
2018-08-16 20:24:53 +01:00
Ali Moghnieh 4dc1d2c50e Merge branch '2.x' into 1.13 2018-08-16 17:47:37 +01:00
Aerodog ed72d117a5 Add {ONLINE} variable to custom join message (#2043) 2018-08-16 17:42:14 +01:00
md678685 a302913130 Clean up unused files 2018-08-15 20:08:22 +01:00
md678685 659f1a271a Merge branch '1.13' into 1.13-items 2018-08-15 19:51:35 +01:00
md678685 3fb4b7958d Strip out legacy ItemDb code, pt 1 2018-08-15 19:50:15 +01:00
md678685 3ef0f20b0d Add tipped arrows support on 1.9/1.10
On a side note, need to investigate why the potion provider is only needed on 1.10 and below - I don't remember what changed in 1.11?
2018-08-15 19:42:12 +01:00
md678685 340baa9703 Add IEssentials#getItemDbProvider method 2018-08-15 19:40:35 +01:00
md678685 0e9232ba81 Remove breaking import 2018-08-15 19:40:08 +01:00
md678685 299afdc6a1 Add V1_13_R1 to ReflUtil 2018-08-15 18:05:44 +01:00
md678685 04feed8524 Add 1.13+ spawn egg provider
Not sure how necessary this is, but I've done it anyway
2018-08-15 17:46:55 +01:00
md678685 773979cb37 Provide ItemDb provider with other providers
Provide providers to the provider that needs the providers. Provider provider provider provide provider.
2018-08-15 16:56:46 +01:00
md678685 c27d05fd4b Fix dependency on IdProvider 2018-08-15 16:40:01 +01:00
md678685 52d814f2cc Properly fix inaccurate playtime measurement
https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/b848d8ce633871b52115247b089029749c02f579
2018-08-15 15:26:11 +01:00
md678685 5009b3b545 Revert "Fix playtime calculation"
This reverts commit 4e165d375c.
2018-08-15 15:15:30 +01:00
md678685 4e165d375c Fix playtime calculation 2018-08-14 19:29:28 +01:00
md678685 306f7a7872 Merge pull request #2119 from lagnat/1.13
Add missing methods for OfflinePlayer, FakeWorld, and FakeServer.
2018-08-14 19:20:21 +01:00
md678685 6c11569ac9 Merge branch '2.x' into 1.13 2018-08-14 18:58:06 +01:00
md678685 4be28ba193 Implement ItemDbProviders, pt 2 2018-08-14 18:57:47 +01:00
Steve Green a1e98f898b Add missing methods for OfflinePlayer, FakeWorld, and FakeServer. 2018-08-14 08:35:33 -04:00
md678685 c5376d3088 Implement ItemDbProviders, pt 1 2018-08-10 22:07:02 +01:00
md678685 3e1857b966 Add module for FlattenedProvider 2018-08-08 15:42:29 +01:00
md678685 b8a8232bc3 Wrap all constructScalar calls with reflection
Allows configs to function with both SnakeYAML 1.19 and 1.21.
2018-08-06 18:19:30 +01:00
md678685 504a7aef0f Add 1.13 mobs 2018-08-06 17:09:50 +01:00
md678685 1ddb1822ef Merge branch '2.x' into 1.13 2018-08-05 23:02:11 +01:00
md678685 d3cd4e356d Add missing OfflinePlayer 1.13 methods 2018-08-05 20:51:39 +01:00
md678685 bef440760a Remove deprecated economy libs and support
None of these economy plugins are supported any more, and removing these allows EssentialsX to be used as a dependency without locally `mvn install`ing the plugin.
2018-08-05 20:51:19 +01:00
Ali Moghnieh 768b92749f update bukkit to 1.13-R0.1-SNAPSHOT.
This commit just fixes compilation errors.
2018-07-29 17:39:32 +01:00
DoNotSpamPls 03b25a0f06 Set target to Java 8 (for 1.13) & update Maven plugins (#1922) @DoNotSpamPls
This is the same PR as the last one (PR #1823), but I messed that one up accidently, sorry for that!
2018-07-17 09:38:01 +01:00
md678685 a44775cafb Prevent users being duplicated in the ignore list
Fixes #2064, as well as alleviating the issue encountered in kangarko/ChatControl-Pro#627 for EssentialsX users.
2018-07-17 07:33:14 +01:00
montlikadani 187c4eb371 Update messages_hu.properties 2018-06-28 18:27:02 +02:00
montlikadani 49201b9945 Update messages_hu.properties 2018-06-28 17:48:27 +02:00
montlikadani 6225dc8ed1 Update messages_hu.properties 2018-06-21 14:39:25 +02:00
Brokkonaut aa622f8d27 SPECTATOR mode is safe for teleporting everywhere. 2018-06-18 23:38:54 +02:00
md678685 849efa9756 Merge branch '2.x' of https://github.com/EssentialsX/Essentials into 2.x-upstream 2018-06-15 19:44:45 +01:00
md678685 8aa764f69f Check whether nick equals "off" before formatting
Fixes #1910.
2018-06-15 19:41:56 +01:00
md678685 de57a8c602 Disable EssProtect emergency mode when Ess loads late (#1954)
Related: EssentialsX/Essentials#1951.
2018-06-15 19:21:18 +01:00
md678685 4873beb100 Allow updating the compass target to be optional (#1937)
If `compass-towards-home-perm` is enabled in the EssentialsX config, then the permission `essentials.home.compass` is checked before changing the player's compass target.

Closes #1918.
2018-06-15 19:20:06 +01:00
md678685 27d9f3725a Wrap constructScalar for SnakeYAML 1.21 (#2040)
In theory, fixes #1974, fixes #1975 and fixes #1976, and also means that
Spigot are free to upgrade SnakeYAML to 1.21 again when ready.
2018-06-15 19:18:55 +01:00
md678685 16b2c3dee3 Reset pending confirmations on login (#2033)
On login, resets any pending confirmations for the user. Fixes #2021,
closes #2023.
2018-06-15 19:09:27 +01:00
BaoKunVN 2ced9469d7 Vietnamese Translation (#1824) @BauKunVN 2018-06-13 21:23:00 +01:00
montlikadani 45c806128a Updated the messages_hu.properties file 2018-05-31 20:23:48 +02:00
md678685 3d60aa1747 Fix build errors (#2018)
Fixes build errors caused by the warp owner PRs (#1961 and #2017)
2018-05-28 12:21:23 -07:00
FlashLight34 967bb44d94 Update IWarps.java (#2017) @FlashLight34
Maybe the compilation fails because that :P
2018-05-27 07:33:37 +01:00
Xeyame 7298393ec9 Add permission to bypass other's msgtoggle (#1955) @Xeyame
* Add permission to bypass other's msgtoggle

Also thanks to MD for helping me with the code :)

* Correct comment

* Remove checking for console in favour of the already existing IUser check

* Fix comments, again

* Re add isIgnoreMsg() check

Accidently removed it, sorry

* Combine 2 checks
2018-05-26 20:43:31 +01:00
FlashLight34 817caf299f setwarp owner uuid in yml file (#1961) @FlashLight34
* Update Warps.java

its not a real change i dont know if user.getuuid() exist or onother possible cmd maybe

* Update Warps.java

* Update Commandsetwarp.java

* Update Warps.java

* Update Warps.java

* Update Commandsetwarp.java

* Update Warps.java

* Update Warps.java

* Update Commandsetwarp.java

* Update Warps.java
2018-05-26 20:42:51 +01:00
montlikadani 2ff29dab80 Update Commanddeljail.java (#2002) @montlikadani
When the user entered a word to delete the jail, deleted it, but removed anything because no jail existed.
2018-05-26 20:40:45 +01:00
Brokkonaut 030eb3375b Block ignite only for PvP, not for PvE (#1967) @Brokkonaut
Players with god mode enabled could not ignite mobs with bows while only igniting players should be blocked.
2018-05-26 20:34:31 +01:00
md678685 3237632eb4 Fix versioning of NMS modules (#1971)
Resolves numerous build errors that emerged in 613e852ffd and for some reason didn't cause a build error on ender.zone, but did everywhere else.

Fixes #1970
2018-05-18 01:23:20 -07:00
Joseph Hirschfeld b29f98c525 [Feature] Add world specific /back dest. perms (#1948) @Ichbinjoe
Adds world specific perms for whether a player may use /back to teleport
back to a given world. Adds logic to default
essentials.back.into.<world> permissions for loaded worlds to true to
maintain backwards compatibility.
2018-04-29 15:49:49 +01:00
md678685 b2a5280971 Avoid build version being overridden by Jenkins (#1936) 2018-03-29 14:19:19 -07:00
md678685 613e852ffd Implement new versioning as per #1873 (#1882) 2018-03-28 20:00:19 -07:00
Rodrigo Aguilar 823f1c2ee3 cancel-afk-on-interact and cancel-afk-on-move are now separate settings (#1804) 2018-03-26 00:50:42 -07:00
Trent Hensler 7d7c58fa7c Merge branch 'SupaHam-default-confirm-command-prompt' into 2.x 2018-03-26 00:37:08 -07:00
Trent Hensler a468ec5e08 Default setting to be enabled confirm commands by default with commented out list of possible options 2018-03-26 00:24:10 -07:00
Trent Hensler ce1e584266 Merge branch 'default-confirm-command-prompt' of https://github.com/SupaHam/Essentials into SupaHam-default-confirm-command-prompt 2018-03-26 00:19:23 -07:00
Minecrell ecd6c5f81a Avoid using ServerListPingEvent workaround on fixed Paper builds (#1925)
Fixes #1924

PaperMC/Paper#884 has been fixed in recent Paper builds (1368+),
which means the workaround is no longer necessary. Disable it when
running a fixed build.
2018-03-26 00:15:55 -07:00
md678685 61c1485083 Replace vanishedPlayers list with set (#1796)
* Replace vanishedPlayers list with set

Not sure if there is any particular reason to keep it ordered, but for now I've used a LinkedHashSet.

* Change return of new method from Set to Collection

Also makes return of old method an unmodifiable list, but this is just as breaking as just changing the method return type as far as I can see
2018-03-25 22:12:36 +01:00
Thomas D 9f6d0fa2d6 Update messages_nl.properties (#1888) @DutchUser
* Update messages_nl.properties

Changed English lines to Dutch.

* Update messages_nl.properties

* Update messages_nl.properties

* Update messages_nl.properties

* Update messages_nl.properties

* Update messages_nl.properties
2018-03-25 22:02:28 +01:00
RikoDEV 1c398f819e Update messages_pl.properties (#1901) @RikoDEV
Smaller corrections and supplementing the missing translations.
2018-03-25 21:39:14 +01:00
games647 c7000846cd Replace Reflection with setter implementation 2018-03-21 11:16:27 +01:00
Johnny Cao d3c4c2ba6a Fixes #1866 (#1867) 2018-03-20 21:51:16 -07:00
Max Lee 95ac4a4853 Extra permissions for /seen and /whois information (#735)
* Implemented separate permissions for seen extras

* Add an extra permission to the whois command too.
IPs are sensitive information that should only be accessible to an as small as possible amount of people
2018-03-20 21:50:42 -07:00
Luck 0d5da063fb Upload createkit configs to hastebin instead of GitHub Gist (#1916) 2018-03-20 21:42:12 -07:00
md678685 06f04b8fba Update issue template to match actual command (#1892)
Update the issue template to accommodate for the actual `/ess version` command's output.
2018-03-15 11:51:17 -07:00
games647 d24fbc9f55 Remove final modifier to fix illegal reflective access warning
Java 9 runtimes report warnings for reflective access on JRE
classes (in this case Field.modifiers). Future versions of Java
may deny the access completely.

Since we access our own code here, we could just remove the final modifier.
With it's current visibility (of private) it's unlikely that it will be
modified from somewhere else except our Settings class.
2018-03-13 16:46:25 +01:00
games647 7e40d13947 Update lombok and remove antrun to fix compiling with JDK9
* Lombok: Older version resulted in NoSuchFieldEx: pid (fixed since 1.16.8)

* JDK9 no longer has a tools.jar because of it's modular system, but ant is
no longer required. It was introduced in 3e9a2377a8
for GroupManager. Now GM is no longer maintained and removed in
    * 5ca02e6596 (calling the build.xml)
    * fa0bbde236 (removing the remaining module)
2018-03-13 16:06:39 +01:00
md678685 43e520a03e Update issue template for new version command 2018-03-07 07:56:03 +00:00
md678685 4e8e7bec3f Add /ess version subcommand (#1514) 2018-03-06 19:25:51 -08:00
md678685 fe7b6097c9 Fix kit reloading (#1855) 2018-02-17 09:42:58 -08:00
montlikadani 0d634853b6 Updated messages_hu.properties file (#1835) @montlikadani 2018-02-14 19:11:16 +00:00
Lucas2107 29b05eb167 Update messages_fr.properties (#1807) @lucas2107
* Update messages_fr.properties

New translations

* Update messages_fr.properties

* Update messages_fr.properties
2018-02-14 19:09:59 +00:00
Leomixer17 834454491e Update messages_it.properties (#1806) @Leomixer17 2018-02-14 19:08:56 +00:00
Jacek Maciejak a9a80b5766 Update messages_pl.properties (#1803) @RikoDEV 2018-02-14 19:08:37 +00:00
md678685 b21f42ee7c Update issue template 2018-02-13 15:29:57 +00:00
k-jiang d92884800b Fix #1799 locale not found in GeoIP2 database. Optimize code. Clean up old files. (#1817) 2018-02-11 23:44:59 +00:00
Lax e57d0e96e2 Proper version command. (#1838) 2018-02-10 21:45:25 -08:00
md678685 983f3a7935 Clear item in offhand slot in /clearinventory
GitHub fancy things: Fixes #950. Fixes #1426. Fixes #1834.
2018-02-10 16:03:56 +00:00
Trent Hensler 37dfd81cc9 EssentialsX invite link 2018-02-05 21:00:36 -07:00
Lax 05400429db Cancel target event on vanished players. Fixes #1809 (#1829) 2018-02-03 19:26:43 +00:00
Johnny Cao e4a8222d48 Fixes #1794: Hides error message if no MOTD present (#1811)
* Fixes #1794
2018-01-31 17:01:51 -08:00
Johnny Cao fb5ebdb0c2 Fixes #1637: Correctly handle /mail permissions (#1743) @AgentTroll
Fixes #1637

/mail stripped colors from the entire message before as reported by the issue. The desired fix was to only strip the color from the sent message rather than from the entire message format (e.g. prefixes coming before the message itself).

Fixed by formatting only the message before passing it to the localization.

Also had a minor issue with FormatUtil in which it failed to strip ampersand (&)-formatted color codes, which was amended by stripping both VANILLA_*_PATTERN as well as REPLACE_*_PATTERN in FormatUtil#formatString(...). It's not necessary to actualy strip any vanilla (i.e. section-prefixed) color codes since that's already done by FormatUtil#stripFormat(String), but I'd like to keep the changes as non-invasive as possible at the current moment.

Demo: git-Spigot-d20369f-7fc5cd8 (MC: 1.9) (Implementing API version 1.9-R0.1-SNAPSHOT)
https://streamable.com/umyi8

This is my first time contributing so please be gentle :)
2018-01-29 18:01:20 +00:00
Ali Moghnieh 1ef1cd98db Add default toggle for confirm commands in config.yml. 2018-01-28 17:23:43 +00:00
k-jiang d581f48cd1 Detect and update the old config.yml. Fixes #1783. (#1784) 2018-01-28 14:24:30 +00:00
md678685 752565b8f1 Add nickNamesOnlyColorChanges to messages files 2018-01-24 19:23:00 +00:00
md678685 8e61753894 Format prefixes and suffixes properly in Chat
Related: #1792
2018-01-23 08:32:55 +00:00
Trent Hensler ba35efd021 Properly check for empty set 2018-01-22 16:38:01 -08:00
Trent Hensler 09af6ad186 Don't add itemflags if none are present 2018-01-22 16:37:01 -08:00
md678685 16a496c706 Fix args order in GodStatusChangeEvent (#1790)
Fixes #1107
2018-01-22 21:01:12 +00:00
MD678685 71d50f4e1e Properly rename CommandDisposal 2018-01-22 14:56:17 +00:00
md678685 8a815b42d3 Fix disposal command class name
Fixes #1791.
2018-01-22 14:16:11 +00:00
Mitchell Cook d69e3a2f48 [Feature] Added disposal command. (#1729) @Mishyy
Added a portable disposal menu.

Closes #1721, and also closes #310.
2018-01-22 12:58:00 +00:00
md678685 e38b15531d Add jailList and noJailsDefined to messages and Commandjails (#1732)
* Add jailList and noJailsDefined to messages and Commandjails

* Sort message keys alphabetically
2018-01-22 09:20:31 +00:00
U-NIFLHEIM\Lax fcc7c3af78 Per-user toggles disabled by default 2018-01-21 18:40:13 -08:00
md678685 738efe8c50 Add Vault prefix/suffix support to EssXChat (#1663)
* Add Vault prefix/suffix support to EssXChat

Includes an example of how to use it in the config.
2018-01-21 01:37:30 -08:00
k-jiang 938f94e130 Upgrade to GeoIP2, add db update. (#1748) 2018-01-20 19:29:48 +00:00
Trent Hensler ace361af60 Compile against 1.13 preview.
Still a lot of work to do. One thing to note is that I used LEGACY materials in a few spots where I didn't know what the new ones are as I'm not very familiar with the 1.13 update and what it changes.
2018-01-18 17:52:44 -08:00
Trent Hensler d4138ce843 Match default to what's in the config. Resolves #1775 2018-01-18 10:34:02 -08:00
Trent Hensler 377c716d52 Add itemflag support to kits. Resolves #795.
Syntax is "itemflags:HIDE_ATTRIBUTES,HIDE_ENCHANTS"
2018-01-18 00:26:40 -08:00
Trent Hensler cd43355d4c Move kits to kits.yml (#1774)
* Move kits to kits.yml
We will now use a separate kits.yml file.
Any kits that were defined in the config.yml will be migrated over to the kits.yml file automatically on startup.
2018-01-18 00:25:00 -08:00
Trent Hensler 1f0f77ff72 Merge pull request #1757 from SupaHam/fix-metaitemstack-keyword-replacer
Allow KeywordReplacer to input replacements with underscore spacers.
2018-01-16 15:12:45 -08:00
Trent Hensler 147c5e0ddf Merge branch '2.x' into fix-metaitemstack-keyword-replacer 2018-01-16 15:11:05 -08:00
DoNotSpamPls 1518db17f8 Delete .travis.yml (#1739) 2018-01-16 15:39:12 +00:00
Johnny Cao ef1e57f445 Performs pagination bounds check. Fixes #1509 (#1754)
Adds pagination bounds check Fixes #1509
2018-01-16 12:56:39 +00:00
Johnny Cao 87c6672212 Add ignore check for /me (#1768). Resolves #1767 2018-01-16 12:33:35 +00:00
Leomixer17 ab087e941e Update messages_cs.properties (#1760) @Leomixer17
Based on #1664 - thanks to @Uranusak for submitting the original PR.
2018-01-11 18:21:20 +00:00
Leomixer17 4f70d623a1 Update messages_pl.properties (#1759)
Includes translations by @RikoDEV.
2018-01-07 17:51:53 +00:00
md678685 ba143f8657 Move instructions to top of issue template
People weren't reading them when they were at the bottom, so they have been moved to the top to encourage people to read them. This has the tradeoff of filling up the Discord webhook embed, so I've added another instruction that doubles as proof of reading the instructions.
2018-01-07 14:55:25 +00:00
Ali Moghnieh b6aea0a5f8 Fix splash potion support for /potion. Resolves #1166 2018-01-07 02:22:31 +00:00
Drew Mitchell 50e2d27d5b Fix NPE in /clearinventory. Fixes #1755 (#1756)
Issue was a NullPointerException due to senderUser not being null-checked. I opted to place the couple of lines of code into the sender.isPlayer() check as opposed to null-checking.
2018-01-07 01:45:19 +00:00
Ali Moghnieh f0bf359df3 Allow KeywordReplacer to input replacements with underscore spacers.
Resolves #1725 and provides a less breaking fix for #1722.

----

Revert "Consume everything after lore as lore in MetaItemStack. Fixes #1722."

This reverts commit 5fa2ce7d9e.
2018-01-07 01:22:42 +00:00
Marten fd6717d06d Fixed a spelling mistake (#1752) @MartenM
Saw this when using the Dutch language file. Decided to update it.
2018-01-06 20:02:39 +00:00
Leomixer17 126046a039 Added missing translations (#1704)
* Added missing translations

* Update messages_da.properties

* Update messages_da.properties

* Update messages_de.properties

* Update messages_en.properties

* Update messages_es.properties

* Update messages_et.properties

* Update messages_fi.properties

* Update messages_fr.properties

* Update messages_hu.properties

* Update messages_ko.properties

* Update messages_lt.properties

* Update messages_nl.properties

* Update messages_nl.properties

* Update messages_pt.properties

* Update messages_pt_BR.properties

* Update messages_ro.properties

* Update messages_ru.properties

* Update messages_sv.properties

* Update messages_tr.properties

* Update messages_zh.properties

* Update messages_zh_HK.properties

* Update messages_zh_TW.properties

* Update messages.properties

* Update messages_da.properties

* Update messages_de.properties

* Update messages_en.properties

* Update messages_es.properties

* Update messages_et.properties

* Update messages_fi.properties

* Update messages_fr.properties

* Update messages_hu.properties

* Update messages_ko.properties

* Update messages_lt.properties

* Update messages_nl.properties

* Update messages_pt.properties

* Update messages_pt_BR.properties

* Update messages_ro.properties

* Update messages_ru.properties

* Update messages_sv.properties

* Update messages_tr.properties

* Update messages_zh.properties

* Update messages_zh_HK.properties

* Update messages_zh_TW.properties
2018-01-06 19:59:50 +00:00
seema84 6705513cb3 Add [world] to /tppos usage (#1744) 2018-01-03 20:39:12 +00:00
Leomixer17 28fb18b6c7 Added a missing translation to messages_it.properties (#1740) 2018-01-02 10:18:36 +00:00
Leomixer17 17bb5fe1da Update messages_it.properties (#1656)
* Update messages_it.properties

* Added missing translation

* Fixed double "="
2018-01-02 00:33:55 +00:00
md678685 3e908b9c01 Update issue template to give clearer instructions 2017-12-31 18:18:28 +00:00
Trent Hensler 8977425475 Merge pull request #1734 from N3FS/sort-messages
Sort messages keys alphabetically
2017-12-29 13:49:30 -06:00
Dylan Keir 8f92e3f217 Fix JDK9 issue (#1713) 2017-12-29 14:46:09 +00:00
md678685 f07f132cfd Sort messages keys alphabetically 2017-12-28 13:56:14 +00:00
Trent Hensler cd7e0963ce Merge pull request #1724 from Drkmaster83/2.x
Implements PR#1516 - TPPos World-Teleport Permissions
2017-12-25 18:24:01 -06:00
Drkmaster83 9dc58948b2 Implements PR#1516 - TPPos World-Teleport Permissions
https://github.com/EssentialsX/Essentials/issues/1516
Considerations:
• TPPos on a target doesn't consider the target's world access permissions, reminiscent of the TP A to B command.
2017-12-25 01:08:08 -06:00
Ali Moghnieh d16e67c51e Remove debug message. 2017-12-22 20:01:58 +00:00
Ali Moghnieh 5fa2ce7d9e Consume everything after lore as lore in MetaItemStack. Fixes #1722. 2017-12-22 19:50:33 +00:00
Ali Moghnieh 0a0c45238c Merge branch '2.x' of github.com:EssentialsX/Essentials into 2.x 2017-12-22 19:46:41 +00:00
Trent Hensler ea36ee37a2 Use correct value 2017-12-19 00:22:00 -08:00
md678685 a907dab432 Show tempban expiry on join. Fixes #1680
Outputs a different message with the expiry included.

Add unlocalised tempbanJoin to locale files

Outputs a different message with the expiry included.
2017-12-19 00:08:42 -08:00
Francois Robinson 9a3b4db387 Added quotes to afk-list-name (#1696)
The custom text may not parse properly if the quotes are missing. By adding them to the default config, just like on lines `443` & `447`, it will discourage making the typo by mistake.
2017-12-18 16:40:59 +00:00
Trent Hensler cdabe4a46e Readme update 2017-12-14 12:30:13 -08:00
Trent Hensler 29bc7ca19e Update live support 2017-12-14 12:26:16 -08:00
Trent Hensler 36ee10a52b Add discord and update links in readme 2017-12-14 11:55:28 -08:00
Trent Hensler 1a820ad9b7 Initial removal of item IDs.
We do not rely on Bukkit's item ids anymore, though we still support them in commands via a mapping built off of the items.csv.
2017-12-12 22:06:25 -08:00
md678685 dcbc106e62 Fix powertools when clicking in air (#1657)
Should restore behaviour prior to #1534 and fix #1622.
2017-12-06 08:37:52 +00:00
Lax cdf777384e Add server logs to the issue template. (#1669) 2017-12-03 15:26:39 +00:00
md678685 3a6f04e461 Fix Commandclearinventoryconfirmtoggle class 2017-11-15 18:17:29 +00:00
Marten d36f6e45de Added 4 messages to messages_NL (#1629)
Added 4 missing messages to the language file.
Only did those that were also found in the EN file.
2017-11-14 10:49:45 +00:00
Ali 'SupaHam' M f8ddb50140 Rename Commandclearconfirmtoggle.java to Commandclearinventoryconfirmtoggle.java 2017-11-13 12:46:15 +00:00
Ali 'SupaHam' M be076509f2 Implement clear confirmation (#1623)
Introduces:
- `clearinventoryconfirmtoggle` command with shorter aliases
- `confirmClear` boolean in UserData
2017-11-12 16:44:53 +00:00
Minecrell 73457453bb Avoid using reflection for things SnakeYAML supports directly now (#1634)
Fixes #1631 properly.

e7ebc94a9e added a workaround to the
SnakeYAML constructor to avoid errors when unknown properties are
used in the storage files. Back then, it was necessary to copy the
method to catch the exception thrown when an unknown property was
encountered.

However, SnakeYAML 1.12 (included in Spigot 1.6.2+) added a method
to ignore missing properties without overriding parts of the
SnakeYAML implementation.

Delete the old workaround and make use of
PropertyUtils.setSkipMissingProperties(true) to achieve the same
effect.
2017-11-10 18:01:29 +00:00
Ali Moghnieh 3091849ff8 Improve confirmPay documentation. 2017-11-04 11:41:26 +00:00
João Paulo 5136eb84f4 Update messages_pt_BR.properties (#1616) 2017-11-01 22:03:37 +00:00
Ali 'SupaHam' M c14d565b56 Support mail chat formatting via essentials.mail base permission. (#1611)
`essentials.mail.url`, `essentials.mail.color`, etc.
2017-10-29 01:16:04 +00:00
Ali 'SupaHam' M 57e87d9d4e Switch ci repository to ci.ender.zone. (#1610) 2017-10-29 01:11:28 +00:00
Ali 'SupaHam' M c1eccf499e Add Mirror link to README (#1598) 2017-10-22 18:11:43 +01:00
Ali 'SupaHam' M e5b76083b7 Change CI link to ci.ender.zone (#1597) 2017-10-22 18:04:39 +01:00
Azewilous a8d9139b6c [Feature] Added new property 'socialSpyMsgFormat'
This feature allows the user to alter the format in which a socialSpy direct messages is seen.
2017-10-22 14:32:17 +01:00
Jacek Maciejak 703186e931 Update messages_pl.properties (#1493) 2017-10-22 10:28:49 +01:00
Andronachi Marian e6fc459080 Update player activity on PlayerInteractEvent. 2017-10-22 10:25:49 +01:00
Francois Robinson 90feb9941f Fixed 'sumbol' typo in config.yml 2017-10-22 10:04:54 +01:00
Minecrell 2c4ff35796 Ensure LOGGER is not equal to plugin logger before setting parent (#1570) 2017-09-30 16:51:32 +01:00
Platinteufel 13ccabecf2 Update messages_de.properties (#1520)
* Update messages_de.properties

* Update messages_de.properties
2017-09-27 12:16:29 +01:00
md678685 ed5aa1f469 Alter config options for EssentialsX Spawn listeners (#1491)
* Add spawn-join-listener-priority setting
* Make "none" an option for priority settings
* Register each listener with separate priorities
* Add note to spawn-join-listener priority
    Warns about effect on spawn-on-join
2017-09-16 15:23:56 +01:00
Josh b34697040a Update spawner blockstates (#1536)
Fixes #1525.
2017-09-14 07:36:39 +01:00
Luck 430f08b25f Add LuckPerms to "specialCasePlugins" in SuperpermsHandler (#1518) 2017-08-27 22:20:48 +01:00
md678685 f85170eea3 "1.7.10 is no longer supported" in README (#1512) 2017-08-24 12:34:01 +01:00
Lax 5a0ec91159 Link to new support IRC channel (#1511) 2017-08-24 12:33:43 +01:00
md678685 a049a03faa Catch NullPointerExceptions in SLPE (#1463)
* Catch NullPointerExceptions in SLPE
* Use the caught NPE's stacktrace
    Makes thrown exception actually useful
2017-08-21 10:40:23 +01:00
Ali Moghnieh 365ae356bd Format currency correctly by placing negative sign at beginning.
This is forcefully placed at the beginning of the formatted currency because of how `currency` message is customisable. Until a better solution arises this shall stay.
2017-08-19 20:11:21 +01:00
md678685 04755cee33 Fix version replacements and add version to config (#1492)
* Add version to newly created config files
* Fix version replacement in item map and messages
* Add EssX version number
2017-08-19 10:47:47 +01:00
md678685 e4fbe28f95 Add EssX version 2017-08-18 11:32:04 +01:00
md678685 1bc0768683 Fix version replacement in item map and messages 2017-08-18 11:24:29 +01:00
md678685 1f42e1e2c1 Add version to newly created config files 2017-08-18 11:24:04 +01:00
flcmc 91b2622ba2 Turn off god mode on login if player doesn't have the permission (closes #1445) (#1475) 2017-08-13 16:42:59 +01:00
flcmc eb341c0704 Make {player} referencing powertools activate only when the user has powertools enabled (#1474) 2017-08-13 16:03:46 +01:00
Leomixer17 09eecb1c3b Translated banJoin and banIpJoin (#1470) 2017-08-12 18:13:31 +01:00
flcmc 1562a8f3ca Implement tab completion for seen and whois. (#1440) 2017-08-12 14:42:57 +01:00
Ashazi 13fbd31124 Prevent flaming arrows damage from vanished and godmode players. (#1462) 2017-08-12 14:27:51 +01:00
Daniel Saukel 433ebe4a21 Fix a few GER translation issues (#1421) 2017-08-12 14:23:33 +01:00
Ali Moghnieh e5c7ba72e5 Add custom join ban messages. #420
blaze it
2017-08-12 13:46:27 +01:00
Ali Moghnieh 203d6561ac Allow unbreakable to not take any arguments, defaulting to true. Fixes #377 2017-08-07 14:05:20 +01:00
Florian CUNY 117704b0bc Added missing translations to messages_fr.properties (#1444)
Related to https://github.com/drtshock/Essentials/issues/1380
2017-08-07 13:25:03 +01:00
md678685 7958cd0b88 Add ability to click helmet slot to equip item. #960 2017-08-04 17:24:43 +01:00
Ali Moghnieh 51f2a04958 Fix import errors. 2017-08-04 16:26:57 +01:00
md678685 a27eb17684 Merge remote-tracking branch 'upstream/2.x' into 2.x-upstream 2017-08-04 12:09:03 +01:00
md678685 05d2b6ccda Fix 1.12.1+ NSME in /lightning 2017-08-04 12:08:55 +01:00
md678685 ec61ffcaad Fix 1.12.1+ NoSuchMethodError in /break (fixes #1438) 2017-08-04 12:08:40 +01:00
md678685 ed0ad87632 Use Paper's new ServerListPingEvent methods if present (#1436)
* Use Paper's new ServerListPingEvent methods if present
2017-08-04 12:00:25 +01:00
Adam Williams 4802744ce7 Spacing for antibuild place message in German (#1175)
#drtshock 2017-03-22 20:59:27 UTC
2017-08-04 00:47:06 +01:00
Uranusak adf7e22324 Update messages_cs.properties (#1216) 2017-08-04 00:43:07 +01:00
Esteban Juarez Rodriguez 09f63364dc Update of messages_es.properties (#1254)
Some of the current translations were modified and the new content was translated.
2017-08-04 00:41:50 +01:00
core.equip 8c256664b2 Fix escaping in german translation. (#1262) 2017-08-04 00:35:11 +01:00
EmanhMC 0354ffa4f8 Clarify java version requirements in README.md (#1299) 2017-08-04 00:28:41 +01:00
Leomixer17 d5f15b8283 Update messages_it.properties (#1316)
* Update messages_it.properties
2017-08-04 00:27:39 +01:00
NyanMeow c4009233a3 Update messages_zh.properties (#1330)
* Update messages_zh.properties
2017-08-04 00:25:09 +01:00
Leomixer17 e02bceaf5d Clarify mailClear deletion of mails (#1383)
* Update messages.properties
2017-08-04 00:11:47 +01:00
Kaleb M 8796dbeb56 [Fix] Essentials signs validity (#1402)
* [Fix] Essentials signs validity

Any sign in the format of &1[...] was a valid sign according to essentials, but 3rd party plugins with the same sign format would be treated equally (cancelling nearby explosions, etc)

Valid signs after this fix are:
- In the format of &1[...] as before
- Are essentials signs and enabled in the essentials config

* Revert "[Fix] Essentials signs validity"

This reverts commit 60d95b6585.

* [Fix - v2] Essentials signs validity

Any sign in the format of &1[...] was a valid sign according to essentials, but 3rd party plugins with the same sign format would be treated equally (cancelling nearby explosions, etc)
2017-08-04 00:09:12 +01:00
Florian CUNY fd63a7df4e [Feature] Added an option to spy chat messages from muted players (#1430)
Related to https://github.com/drtshock/Essentials/issues/1420
2017-08-04 00:04:42 +01:00
md678685 7fbc721db6 Fix usage of deprecated getTargetBlock (#1435) 2017-08-03 23:33:55 +01:00
Ali Moghnieh 210494d0d1 Support EntityPickupItemEvent. 2017-07-28 20:13:59 +01:00
Ali Moghnieh 9963476218 Write NMSVersion parsing special case for FakeServer. 2017-07-28 20:13:13 +01:00
md678685 50f2e7a95f Add a delay for sending the MOTD (#1396)
* Add delay-motd setting
* Move MOTD to Runnable
* Refactored according to comments
* Delay motd loading as well as sending
2017-07-28 19:20:44 +01:00
md678685 d7685dc1bc Add UUID to /whois (#1394)
* Add UUID to /whois

* Add untranslated English messages

I'm not sure whether "UUID" necessarily needs translating for most languages, but I've put it in all of them so that they can be translated if needed.

* Hi there o/
2017-07-15 18:38:09 +01:00
md678685 301a3a72df Check for essentials.warp.list permission on /warp tab complete (#1378) 2017-07-10 23:07:54 +01:00
CreedTheFreak 518a43db9c [Fix] Disallow muted players to use /r (#1375) 2017-07-09 15:17:07 +01:00
Ali Moghnieh 243e69649f Be more verbose in handleCrash(Throwable). 2017-07-03 14:24:43 +01:00
Ali Moghnieh 781204aa20 Trim comma separation in items.csv parsing. 2017-07-03 14:23:36 +01:00
md678685 9a714eb537 Add an issue template (#1362) 2017-07-03 04:14:58 +01:00
Ali Moghnieh d5cbfefc21 Set use-bukkit-permissions to true by default.
See #1356 for more information.

This change was made with the confident presumption that the use of built-in EssentialsX permissions is very very low compared to those who use feature-complete permission plugins.
2017-06-30 21:12:55 +01:00
Ali Moghnieh 12930cfce4 Return online players instead of nothing when tab completing. (Fixes #1331) 2017-06-29 03:41:13 +01:00
Ali Moghnieh 298c292ffb Amend items.csv to support potions in all items.
This commit makes use of 3fba6e9a which implements the ability to parse NBT in `items.csv`.
2017-06-29 03:30:35 +01:00
NJDaeger 341263b934 Removed null value from AbstractVaultHandler (#1327)
I'm in the process of writing a permissions plugin, and every time I try to talk it threw an error. The error was caused by this null value that was existing. I removed it and changed it to get the Player's world name. This should fix my error.
2017-06-24 15:41:51 +01:00
Ali Moghnieh 11a03bbce9 Add notify-player-of-mail-cooldown config option.
This feature allows for the ability to specify a cooldown for how often individual players are notified of their outstanding unread mails.
2017-06-22 22:54:51 +01:00
Ali Moghnieh 3831464665 Fix /condense functionality after 1.12. (#1298)
Prior to this commit `/condense` would return the first best item to condense an ItemStack into, with no consideration of better forms of condensation.

This commit adds a local variable `bestRecipes` which stores all the valid recipes and sorts through them for the best, then picks out the best. The best recipe is defined by a compare(o2, o1) where o1 and o2 are integers of the SimpleRecipe's input ItemStack amount.
2017-06-22 22:21:42 +01:00
Ali Moghnieh 2fe05b4ff4 Fix silent error when creating signs.
If the signFormatSuccess message is empty an error occurs silently that prevents the sign from being created from Essentials behalf. This commit tackles that issue by creating `getSuccessName(IEssentials)` and invoking it where possible to notify the console when this error occurs.
2017-06-19 05:18:33 +01:00
Ali Moghnieh ec3dc50e20 Fix typo in OfflinePlayer#setBanned(boolean). 2017-06-18 21:32:24 +01:00
Ali Moghnieh 171b2b6a37 Capitalise Parrot in Mob. 2017-06-18 21:00:02 +01:00
Ali Moghnieh 14a02c0602 Update to 1.12. :D
To the best of my knowledge ;)
2017-06-18 19:54:04 +01:00
Ali Moghnieh 34e3582557 Reorder items.csv based on item id (and date of creation). 2017-06-18 19:24:55 +01:00
Ali Moghnieh 01592e9770 Rename darkgreeysclay to darkgreysclay in items.csv. 2017-06-18 16:53:19 +01:00
Ali 'SupaHam' M 3fba6e9ad0 Add NBT support in items.csv (#1276)
This commit adds a new 4th column reading in `items.csv` to enable the ability to specify NBT data for newly constructed items.
2017-06-18 16:30:54 +01:00
Ali 'SupaHam' M bbe0ca9302 Implement tab completion for all commands. (#1282)
List of supported commands:
```
/afk
/balance
/balancetop
/ban
/banip
/bigtree
/book
/broadcastworld
/burn
/clearinventory
/condense
/delhome
/deljail
/delwarp
/eco
/enchant
/enderchest
/essentials
/exp
/ext
/feed
/fireball
/firework
/gamemode
/getpos
/give
/hat
/heal
/help
/helpop
/home
/ignore
/invsee
/item
/itemdb
/jump
/kick
/kill
/kit
/lightning
/list
/mail
/me
/msg
/mute
/near
/nick
/nuke
/pay
/potion
/powertool
/ptime
/pweather
/recipe
/remove
/repair
/sell
/showkit
/skull
/speed
/tempban
/thunder
/time
/togglejail
/tp
/tpa
/tpaall
/tpahere
/tpall
/tphere
/tpo
/tpohere
/tppos
/tree
/warp
/weather
/world
/worth```
2017-06-11 01:17:43 +01:00
Ali Moghnieh e572788a8c Disable /recipe for 1.12 until duplication bug can be fixed. #1289 2017-06-09 15:02:56 +01:00
Pokechu22 4c0857fbb5 Implement tab completion framework (#1203) 2017-06-06 01:31:41 +01:00
Pokechu22 44ed1e2d44 Add eclipse files to .gitignore 2017-06-06 01:08:34 +01:00
Ali Moghnieh 8fd532c648 Translate now instead of static "now" in DateUtil. 2017-06-04 20:57:06 +01:00
Ali Moghnieh 7c0fa46b4d Add playtime to /whois. #1212 Courtesy of @molor. 2017-06-03 09:31:53 +01:00
Ali Moghnieh 85d0644868 Readd messages from c28d749. 2017-05-31 14:19:18 +01:00
md678685 4bd3cffc4e Readd missing messages (#1271) 2017-05-31 14:05:18 +01:00
md678685 3ecebdc758 Add missing enable and disable functions to Metrics class (#1270)
* Replace mcstats with bStats

Won't show up on the bStats website, until @drtshock or someone else signs up and creates a Bukkit plugin named "EssentialsX" on the bStats website. If you want to test, you can change `pluginName` to `"EssXmdtest"`, or any other value as desired.

* Add missing enable and disable functions to Metrics class
2017-05-31 11:31:08 +01:00
md678685 f13e355010 Replace mcstats with bStats
Won't show up on the bStats website, until @drtshock or someone else signs up and creates a Bukkit plugin named "EssentialsX" on the bStats website. If you want to test, you can change `pluginName` to `"EssXmdtest"`, or any other value as desired.
2017-05-31 03:50:01 +01:00
Ali Moghnieh c28d749548 Create /tpacancel.
`/tpacancel` allows tp requesters to cancel sent requests before the target client can accept them. This aids in combatting long-lived tp requests in PvP environment.

`/tpacancel <player>` cancels all a tp request sent to <player> only.
2017-05-31 03:30:05 +01:00
Ali 'SupaHam' M d0760ddd04 Register SWEEPING_EDGE enchantment. Resolves #1263 2017-05-25 01:36:33 +01:00
Ali Moghnieh af5d2c2fca Remove Supervisor support.
This reverts commit 442d97a1b1, fcbd3deb6b, and 6231a25413.

Due to the lack of proper dependency deployment and availability users are unable to build EssentialsX without doing some manual installations. Until issue is resolved Supervisor support is dropped.
2017-05-04 13:55:18 +01:00
Ali Moghnieh 4bfabaa1d3 Check if getTeleportRequest() is null in /tpdeny. Fixes #1229. 2017-05-04 13:46:31 +01:00
Platinteufel 747420b4c8 Update messages_de.properties (#1091) 2017-02-12 09:52:20 -06:00
Maxetto 78b710dc22 Set PORTAL as an Unsafe Destination 2017-01-20 09:17:11 -06:00
vemacs 7973f544ff Revert "Fix broken add-prefix-in-playerlist behavior", as it seems to break more things for other users 2017-01-20 09:08:36 -06:00
vemacs 0b1e1676d0 Add iron nugget to items.csv (resolves #1049) 2017-01-17 21:55:35 -06:00
md_5 705c1c60c8 Fix erroneous usage of setAmount(0) on mirrored ItemStacks 2017-01-17 21:49:05 -06:00
vemacs abfec5a60f Revert "Fix getItemInMainHand behavior breaking /worth (#1053)" 2017-01-17 21:46:04 -06:00
vemacs ca28d8aa84 Fix getItemInMainHand behavior breaking /worth (#1053) 2017-01-05 12:13:08 -05:00
Maxetto 198d852995 Fix broken add-prefix-in-playerlist behavior 2017-01-04 11:48:01 -05:00
Ali Moghnieh 5f83766dc1 Implement player based toggle for pay confirmation prompts. Fixes #1032
This commit adds a new `/payconfirmtoggle` command with `/payconfirmon` and `/payconfirmoff` as well.
2016-12-25 18:08:16 +00:00
Ali Moghnieh 442d97a1b1 Add Supervisor to softdepend in plugin.yml.
Add SupaHam to authors list.
2016-12-18 15:58:58 +00:00
Ali Moghnieh fcbd3deb6b Exclude Spigot from Supervisor dependency. 2016-12-18 15:14:43 +00:00
Ali 'SupaHam' M dadc6b2d3a Implement confirmation dialogue for /pay. (#1002) 2016-12-18 15:03:03 +00:00
Ali Moghnieh 6231a25413 Initial implementation of Supervisor.
EssentialsReportContext provides all online players' userdata files if report level is 400 or higher, as well as config.yml if report level is over 200.
2016-12-18 15:00:22 +00:00
Ali Moghnieh bc08b11011 NOOP sendTitle in OfflinePlayer. 2016-12-18 14:17:16 +00:00
vemacs 36b08e9b1d Fix compile 2016-12-12 10:09:43 -06:00
vemacs d73ec779e0 Fix #1015 2016-12-09 19:11:04 -06:00
Ali Moghnieh 6bc9f2140c Catch Exception in Commandpay for payUser call. 2016-12-03 15:23:53 +00:00
Luke Anderson a6f1e305ef [Fix] When the minimum pay amount is zero, users are unable to pay zero. 2016-12-03 14:32:50 +00:00
Ali Moghnieh 5fda1d018b Add support for spawn_egg durability value in Minecraft 1.11. 2016-12-02 17:02:04 +00:00
vemacs c919eba206 Fix missing setVillager call 2016-11-28 17:25:29 -06:00
vemacs 61b3ca531c Fix build 2016-11-28 17:20:24 -06:00
vemacs 96164f5851 Restore basic pre-1.11 compat 2016-11-28 17:13:36 -06:00
Roy Curtis 4102b11f15 More items.csv fixes (#992)
* Adjust ID for beetroot soup from Pocket Edition ID (459) to Java ID (436)
* Fix two IDs for strength arrows
2016-11-27 17:53:39 +00:00
Ali Moghnieh 3c18efc4a6 Fix /tpaccept timing out requests too soon. 2016-11-23 13:41:11 +00:00
Roy Curtis cfc2b7ff2f Add 3rd column to Purpur Stairs items.csv entries
Purpur Stairs in items.csv are missing their data column. This breaks code that parses `items.csv` and expects a consistent number of columns.

For example, this breaks the Levitate command library: https://github.com/KennethWussmann/Levitate/blob/a8a57e95126ca62087a88a18c26ee7f1e846fe04/src/main/java/de/ketrwu/levitate/syntax/ItemStackSyntax.java#L94
2016-11-22 20:55:04 +00:00
Ali Moghnieh ad94cca95b Check for timeout in /tpa and /tpaccept. Fixes #818.
This commit adds a method called hasOutstandingTeleportRequest() in IUser - implemented fully in User.
2016-11-22 20:39:31 +00:00
Ali Moghnieh 6ade8132af Implement NOOP openMerchant(Merchant, boolean) in OfflinePlayer. 2016-11-21 18:11:40 +00:00
Ali Moghnieh e5b5994593 Disallow negative number input for /pay. 2016-11-21 18:05:17 +00:00
Ali Moghnieh 944ddf8d70 Further changes for 1.11 update.
- Dropped usage of deprecated methods for a cleaner future.
- Zombies no longer throw errors in SpawnMob due to setVillager(false).
- Removed MobData where they have been replaced with actual entities.
2016-11-20 20:23:01 +00:00
Ali Moghnieh 8b0659a2b4 Update to 1.11.
- Support new enchantments.
- Support new mobs.
- Rename MobData WHITHER_SKELETON to WITHER_SKELETON.
- implement NOOP methods of new API methods for fake classes.
- Amend item dictionary.
2016-11-20 16:03:56 +00:00
Ali Moghnieh 35388c3b19 Add spawn-on-join examples in config.yml. 2016-10-30 13:47:56 +00:00
Ali Moghnieh 27ab90ab2a Improve spawn-on-join with ability to specify groups. 2016-10-30 13:29:21 +00:00
vemacs d41af02ade Fix cache invalidation when resetting user 2016-10-14 08:25:53 -04:00
vemacs e0a578d06c Fix #857 2016-10-12 12:35:25 -05:00
Trent Hensler db47460a79 Too much http 2016-09-08 13:07:13 -07:00
Trent Hensler a1bcbdc181 Remove ess3 repo and use our own. 2016-09-08 12:58:39 -07:00
NDGAM3R d1dda6a166 Add normal fire resistance potion to items.csv (#875) 2016-09-05 22:28:51 -05:00
Trent Hensler 7290dbc5a5 Merge pull request #861 from Markersx/fix-version
[Fix] Versions
2016-08-31 10:28:44 -07:00
Mark 8bc47c45a4 Fix version EssentialsXMPP 2016-08-30 19:31:09 -07:00
Mark 1f5b659f2d Fix version EssentialsSpawn 2016-08-30 19:30:42 -07:00
Mark a591dba8ef Fix version EssentialsProtect 2016-08-30 19:30:13 -07:00
Mark 85d6c836a8 Fix version EssentialsGeoIP 2016-08-30 19:29:45 -07:00
Mark 7498a5f983 Fix version EssentialsChat 2016-08-30 19:29:07 -07:00
Mark 63b5068591 Fix version EssentialsAntiBuild 2016-08-30 19:28:37 -07:00
Trent Hensler c54da35a39 Fix version 2016-08-29 18:44:55 -07:00
Trent Hensler 6789e5c0de Merge pull request #850 from md678685/patch-1
Remove extraneous + from Commandfly
2016-08-29 18:15:50 -07:00
md678685 1fed66d652 Remove extraneous + in Commandfly 2016-08-27 10:01:26 +01:00
Faris Rehman f42904e5ae Add FlyStatusChangeEvent (#835) 2016-08-26 21:45:38 -05:00
Ryan 58828d7924 Don't force player out of vehicle on teleport. Fixes #582 (#833) 2016-08-26 21:29:22 -05:00
md678685 ee64f7c4ff [Fix] Remove vanished players from server list ping (#837) (#841)
Add listener for ServerListPingEvent and remove any vanished players.
Also refactored EssentialsPluginListener serverListener to
pluginListener
2016-08-26 21:27:52 -05:00
Nathan Guedes 3c0424226e Update messages_pt_BR.properties. (#778) 2016-08-20 21:16:13 -04:00
Ryan dd226dfdcf Implement MuteStatusChangeEvent. Fixes #819 (#832) 2016-08-20 21:13:26 -04:00
Ryan 16e05cc17b Remove double locale set call. (#826) 2016-08-19 09:23:44 -04:00
Blinky™ 13bceb9f5d Update Vault repo 2016-08-17 14:41:00 -06:00
Ali Moghnieh 03c652cd55 Fix command cooldowns command matching. 2016-08-07 15:58:34 +01:00
Ali Moghnieh 00301b26e6 Add debug for command cooldowns. 2016-08-06 17:53:24 +01:00
Ali Moghnieh 611429b6f6 Use afk player-list name in User#setDisplayName(). 2016-08-06 17:45:54 +01:00
Platinteufel 34979c8e84 Update messages_de.properties 2016-08-05 02:25:00 +02:00
Ali Moghnieh 3a6da5cd26 Add 1.10 blocks and Polar Bear egg entries in items.csv. 2016-08-04 17:41:14 +01:00
Ali Moghnieh 9c18b94ec8 Fix shulkeregg entries in items.csv 2016-08-04 17:19:39 +01:00
Ali Moghnieh 5187be5d02 Set default currency-symbol-format-locale to US locale. 2016-08-04 16:38:31 +01:00
Nathan Guedes 1c009e1ebc Update messages_pt_BR.properties.
Translate the last lines that was in english and a line in european portuguese.
2016-07-28 23:57:33 +01:00
Ali Moghnieh 8927fe9ea9 Remove isHidden() check for idling kick. Resolves #773 2016-07-28 19:58:04 +01:00
Ali Moghnieh 63b5cb9ec7 Add prefix/suffix toggle for playerlist. Resolves #771
This commit adds two new configurable options:
- `add-prefix-in-playerlist`: enable prefix in playerlist
- `add-suffix-in-playerlist`: enable suffix in playerlist

These were added to prevent very long names in the playerlist.
2016-07-28 17:17:26 +01:00
Ali Moghnieh 30d5fbdf8d Revert "Add mending enchantment to serializer."
This reverts commit 743ac51c4c.
2016-07-28 16:57:06 +01:00
Ali Moghnieh 5960f55339 Fix banner/shield deserializer with PatternType. 2016-07-26 22:03:33 +01:00
Ali Moghnieh 743ac51c4c Add mending enchantment to serializer. 2016-07-26 22:02:50 +01:00
Ali Moghnieh 2493c655f8 Create /paytoggle command. Resolves #413 2016-07-26 16:23:34 +01:00
Ali Moghnieh f1d9cda5eb Create allow-bulk-buy-sell config option. Resolves #765. 2016-07-26 12:25:20 +01:00
Ali Moghnieh a76b20f1b5 Display time since AFK in /whois. Resolves #761.
This commit adds a getAfkSince() method to IUser.

This commit adds a whoisAFKSince message which is sent when a player is AFK, it follows the same format as whoisAFK which is still used. whoisAFK remains unchanged but is sent only when the player is not AFK.
2016-07-26 01:36:29 +01:00
Ali Moghnieh 017082c07a Check recipient socialspy exempt during PMs. Resolves #166 2016-07-25 13:10:06 +01:00
Ali Moghnieh 352c92b880 Implement Shield item serialization. 2016-07-25 12:06:24 +01:00
Ali Moghnieh 948cce4ceb Remove whitespace before colon in SocialSpy broadcast. 2016-07-23 14:59:20 +01:00
Ali Moghnieh 6fe87184ae Add socialSpyPrefix message. 2016-07-23 00:30:49 +01:00
Ali Moghnieh c4c303dbfb Don't socialspy broadcast raw /msg and /r. 2016-07-23 00:09:18 +01:00
Ali Moghnieh 87adbb477d Allow bulk buy/sell when sneaking. Resolves #65 2016-07-22 23:56:26 +01:00
Ali Moghnieh 3245ce10ac Prevent multiple tpa requests in a row. Resolves #59 2016-07-22 20:51:47 +01:00
Ali Moghnieh 5540683013 Remove +180 on yaw in . 2016-07-22 16:26:56 +01:00
Ali Moghnieh 75d1254dda Implement better PM social spy. Resolves #27 2016-07-22 15:52:53 +01:00
Ali Moghnieh 83b944eb4b Use User#isAuthorized() instead of Player#hasPermission(). 2016-07-22 15:33:26 +01:00
Ali Moghnieh 6cbb8c846b Make old /createkit toggleable in config. 2016-07-13 23:25:20 +01:00
Ali Moghnieh e0d69d05eb Format {UNIQUE} in KeywordReplacer. 2016-07-13 22:54:52 +01:00
Ali Moghnieh 4f971ad8e5 Change /createkit functionality.
/createkit pastebins the current inventory into gist.github.com and returns a URL with the kit code.
2016-07-13 22:43:20 +01:00
Ali Moghnieh fa59a3f65c Fix up messages_pt_BR.properties. 2016-07-13 22:08:19 +01:00
Ali Moghnieh 8d921d78c5 AHHHH it's Hydra! 2016-07-13 22:04:44 +01:00
Ali Moghnieh 953e44c4a4 Remove the HEAD! 2016-07-13 21:53:46 +01:00
MisterSanglad b664159231 Update messages_fr 2016-07-13 14:32:17 +02:00
Ali Moghnieh 5867cd2e1b Merge branch '2.x' of github.com:drtshock/Essentials into 2.x 2016-07-12 20:39:09 +01:00
Ali Moghnieh 535fb43915 Format {UNIQUE} in custom join message. 2016-07-12 20:36:55 +01:00
Blinky™ 0952115776 Switch to transparent images for our dark mode users 2016-07-12 11:12:01 -06:00
Ali Moghnieh 79401c3cf7 There's a reason we test code. Thanks, hobbit! 2016-07-12 00:46:08 +01:00
Ali Moghnieh 0ab9f04ea4 Document no-god-in-worlds feature usage in code. 2016-07-12 00:03:08 +01:00
Ali Moghnieh 04f14285e7 Directly teleport Player in EssentialsSpawn when joining. 2016-07-11 15:12:47 +01:00
Ali Moghnieh 2a2aef53fb This is the real fix for MessagingTests. 2016-07-11 00:47:25 +01:00
Ali Moghnieh 3651e672d4 Fix MessagingTest units. 2016-07-11 00:43:43 +01:00
Ali Moghnieh 9dfa650d7e Merge branch 'create-afk-message' into 2.x 2016-07-10 22:47:54 +01:00
Blinky™ a0a166b553 Properly align logo 2016-07-10 14:38:21 -06:00
Blinky™ e7f4b46de8 Bold logo font 2016-07-10 14:25:02 -06:00
Blinky™ b5148cd0ec Update logo in readme 2016-07-10 14:23:36 -06:00
Ali Moghnieh e90b0c28c6 Disallow mute players and unauthorized players from setting AFK message. 2016-07-10 20:27:48 +01:00
Ali Moghnieh 3a439bcdb5 Merge branch '2.x' into create-afk-message 2016-07-10 19:56:23 +01:00
Ali Moghnieh 23e8498b47 Clear trailing whitespaces in ISettings and Settings. 2016-07-10 17:58:15 +01:00
Ali Moghnieh c9f1b0fdc5 Add the option to disable disabled-sign name protection. (#699)
This allows EssentialsX users to use other plugins that provide signs such as [Kit] and not have EssentialsX interfere with the final sign name.
2016-07-10 17:45:43 +01:00
Ali 'SupaHam' M 19f6510840 Create VanishStatusChangeEvent. (#661) 2016-07-10 09:09:53 -06:00
vemacs 0a1feaf044 Fix Vault-based permission logging (forgot after refactor) 2016-07-09 18:42:42 -06:00
Guilherme Penedo 890c32949d Updated and changed most of the pt translation 2016-07-08 13:53:49 +01:00
Dima Melikhov 8b37bb5bd7 Update messages_ru.properties 2016-07-07 20:52:43 +01:00
Guilherme Penedo 1aff0c2dcb Update messages_pt_BR.properties
Fixed special characters, spelling mistakes, (some) gramatical mistakes. Added invalidBanner and commandCooldown messages
2016-07-07 20:34:19 +01:00
Nathan Guedes a7f137d122 Update messages_pt_BR.properties with corrections in accents, spaces, commas and dots. 2016-07-07 19:12:06 +01:00
Benjozork 148fa7d6da Fixed french translations 2016-07-07 18:13:35 +01:00
Ali Moghnieh 20594d2523 Add essentials.commandcooldowns.bypass permission. 2016-07-07 17:24:28 +01:00
Ali Moghnieh 142315140e Implement NOOPs in OfflinePlayer instead of throwing exceptions.
This resolves issues like #721.
2016-07-07 16:58:44 +01:00
Ali Moghnieh 8d3d2ebd50 Enable longer display names/player list-names feature
For 1.8 servers and above.
2016-07-07 04:59:09 +01:00
Ali Moghnieh e674056b3a Create NMSVersion for better backwards compatibility. 2016-07-07 04:45:27 +01:00
Trent Hensler 785bd5bfcf Merge branch 'SupaHam-custom-currency-formatting' into 2.x 2016-07-06 15:44:37 -07:00
Ali Moghnieh fb72555e6b Merge branch '2.x' into custom-currency-formatting 2016-07-06 21:22:23 +01:00
Ali Moghnieh 42f4d43682 Make _isNpcsInBalanceRanking private. 2016-07-06 21:22:13 +01:00
Ali Moghnieh caeb59ede4 Merge branch '2.x' into custom-currency-formatting 2016-07-06 21:21:24 +01:00
Ali Moghnieh 992ef5dc91 Add npcs-in-balance-ranking configurable option. Resolves #716. 2016-07-06 19:34:25 +01:00
Ali Moghnieh d37433e81c Merge branch '2.x' into custom-currency-formatting 2016-07-05 18:46:01 +01:00
vemacs d75e0ce26e Use string comparison for gamemode, fixes #703 2016-07-02 12:00:31 -06:00
Ali Moghnieh 09acbcdb05 Implement Command Cooldowns. Resolves #110 2016-06-30 12:52:28 -07:00
Ali Moghnieh 864dadab80 Add debug message in EssentialsSign. 2016-06-27 21:46:32 +01:00
Ali Moghnieh d174cea42e Do not apply starting balance for NPCs. Resolves #191
NPC balances are usually banks e.g. Factions plugin depending on EssentialsEco to provide economy functionality for the Faction.
2016-06-27 21:45:31 +01:00
Ali Moghnieh e95fad0453 Don't list NPCs in /baltop output. 2016-06-26 22:10:36 +01:00
Ali Moghnieh ebe6abd885 Make /tp parse arguments as double instead of integer. 2016-06-26 15:25:52 +01:00
Ali Moghnieh 0a563b91a2 Create teleport-to-center configuration option.
This option toggles whether essentials should rounds all teleportations off to the center of the block.
2016-06-26 15:21:35 +01:00
vemacs 5cbcd7469b Nullcheck user iteration in EssentialsTimer (fixes #675) 2016-06-25 09:47:06 -06:00
Ali Moghnieh dabcb51034 Allow colour codes in nickname-prefix. 2016-06-24 11:24:54 +01:00
Ali Moghnieh 0237d485bf Merge branch '2.x' into custom-currency-formatting. 2016-06-20 12:55:31 +01:00
Ali Moghnieh b673630a7e Implement spawn-on-join configuration.
Admins can now specify whether all joining players should be teleported to the user's group spawn when joining the server. Players can be assigned the essentials.spawn-on-join.exempt permission to become exempt from this feature.
2016-06-19 21:07:45 +01:00
Ali Moghnieh 282ec81af1 Implement configurable currency formatting.
This commit enables users of different countries around the world to configure currency formatting displayed to users in a familiar manner.

Prior to this commit US formatting (symbols) was forced upon users. This is now configurable via locale values e.g. en-US, de, fr-ch.

This commit adds two new configurations:
- currency-format
- currency-symbol-format-locale

One method ISettings#getCurrencyFormat()
2016-06-19 20:03:54 +01:00
Ali Moghnieh a267fb16b8 Ignore flight check on spectator mode.
If a player is in Spectator mode, we should not interfere with their flight. This is an extension to the already existing creative mode check.
2016-06-19 03:33:48 +01:00
Ali Moghnieh 795ffec8b8 Remove trailing space. 2016-06-18 21:38:20 +01:00
Ali Moghnieh dba9dab985 Make UserBalanceUpdateEvent's new balance mutable.
This commit makes it reliable to modify user balance from within events.
2016-06-18 18:33:51 +01:00
Ali Moghnieh abfa815cf1 Add space in userAFKWithMessage in messages_nl. 2016-06-18 18:21:36 +01:00
Ali Moghnieh 872b25e0c5 Merge branch '2.x' into create-afk-message 2016-06-18 18:20:45 +01:00
Ali Moghnieh 3fa810e329 Add space in userAFK messages_nl.properties. 2016-06-18 18:14:59 +01:00
Ali Moghnieh 4951c4822e Rename userIsAwayWithReason and userAFKWithReason to userIsAwayWithMessage and userAFKWithMessage respectively. 2016-06-18 17:54:21 +01:00
Ali Moghnieh 5842b5f51d Implement AFK messages.
This commit makes it possible for players to set an afk message to detail their reasoning for being away to other players. This can be especially useful for the /msg command; instead of replying the user is afk, it will specify why they are afk so the sender can act further on that information.

Two methods have been added to IUser: getAfkMessage() and setAFKMessage(String).

All locale files have two new messages: userAFKWithReason and userIsAwayWithReason. They all use the messages that do not have the suffix WithReason, i.e. userAFK and userIsAway. Furthermore, the userIsAwayWithReason will not utilise the second parameter, the reason, to prevent spam and unnecessary text in global chat. However, the second parameter ({1}) is available for use in userIsAwayWithReason. userAFKWithReason, which is sent to /msg senders, does use the {1} as it controllable spam by the command sender themselves.

/afk usage is now: /afk [player/message...]
2016-06-18 17:44:17 +01:00
Ali Moghnieh ac4a1565a1 Implement empty OfflinePlayer methods instead of NSY exceptions. 2016-06-18 14:08:58 +01:00
Ali Moghnieh 203e8b0a75 Broadcast mute notify with mute duration if present.
This commit adds a new locale message code muteNotifyFor, which takes three parameters: muter, muted, duration.
2016-06-18 14:00:51 +01:00
Ali Moghnieh c75594f314 Fix piston bug with AntiBuild.
Prior to this commit, BlockPistonRetractEvent#getRetractLocation() was being used, which is now deprecated after 4 years of when this code was written.
2016-06-18 04:08:15 +01:00
vemacs 690dbea924 Fix compile 2016-06-12 09:25:14 -06:00
vemacs e7c81504a9 Force legacy spawn egg provider for 1.8.x due to client rendering bug 2016-06-12 09:23:25 -06:00
vemacs fdd5bc5a8e Use more cached methods 2016-06-10 07:44:16 -06:00
vemacs 91bebabc7f Add polar bear spawning support 2016-06-09 20:19:59 -06:00
vemacs 5eec83f726 Remove old spawn egg providers in favor of reflection-based implementation 2016-06-09 19:25:45 -06:00
vemacs 827891f10a Add reflection based spawn egg provider 2016-06-09 19:18:07 -06:00
Trent Hensler f4fa24cd7f Build against 1.10 2016-06-09 10:07:22 -07:00
vemacs 2bf1f24db2 Update spawn egg provider to 1.10 2016-06-08 20:33:03 -06:00
Blinky™ 34c6155fe9 Update build instructions 2016-05-21 14:46:49 -06:00
vemacs 3ead31ef14 Update human name 2016-05-21 14:43:36 -06:00
vemacs d0ea32dfa1 1.9.4 spawn egg support 2016-05-21 14:15:07 -06:00
Trent Hensler 7c1a0ed719 Fix elytra wing item id. Resolves #578 2016-04-17 12:41:51 -07:00
Taybosquee b050b13aa3 Add 1.9 entries to item.csv 2016-04-10 11:32:25 -06:00
vemacs 60548e4523 Cleanup 2016-04-01 20:52:20 -06:00
vemacs 8fe002f820 Fix giving normal water bottles for 1.9 2016-04-01 20:50:03 -06:00
vemacs 65a2e942c4 Attempt fixing kit/createkit for splash potions in 1.9 2016-03-31 11:54:19 -06:00
Trent Hensler 4adb59ab98 Don't make artifact for GM 2016-03-29 17:09:22 -07:00
Trent Hensler fa0bbde236 Not more distributing groupmanager. 2016-03-29 16:59:36 -07:00
vemacs e5b1e6c0ad Stick override annotation 2016-03-28 19:51:16 -06:00
vemacs 731455649e [Experimental] Attempt supporting lingering potion type by passing it through 2016-03-28 19:38:53 -06:00
vemacs ec1215b227 Restore 1.8 compatibility 2016-03-28 17:42:33 -06:00
vemacs dcb14170b9 Fix meta setting (works for 1.9) 2016-03-28 17:31:25 -06:00
vemacs c266778c1e [Likely breaks 1.8 compatibility, will be fixed] Use non-deprecated methods 2016-03-28 17:21:57 -06:00
vemacs 8116ce39d7 [Experimental] Attempt restoring potion effect ID compatibility to 1.9 2016-03-28 16:54:17 -06:00
vemacs 8167002092 Fix compile 2016-03-28 10:36:02 -06:00
Trent Hensler 5cddb84a58 Update travis 2016-03-27 11:16:54 -07:00
Literallie a9e41841e9 Fix that annoying extra "6" in German /mem
This has been bothering me and my staff forever, it's just that there's an extra number 6 in front of the word "entities" in the German translation of /mem. This commit fixes that issue by prepending that with a section sign so it gets correctly interpreted as color code.
2016-03-25 17:50:50 +01:00
Trent Hensler 37f6deab85 Add children for gamemode perms so super perms work correctly. Solves #156. 2016-03-23 18:08:22 -07:00
vemacs a4aa6a22b7 Fix compile 2016-03-18 10:19:16 -06:00
vemacs d57f7af453 Fix compile 2016-03-18 10:18:13 -06:00
vemacs 7f8c801c07 Throw some more unsupported ops 2016-03-11 17:44:14 -07:00
vemacs c627b26f49 Fix compile 2016-03-11 17:39:10 -07:00
vemacs 7c788dfa31 Switch back to CI 2016-03-11 07:58:29 -07:00
vemacs 3896b27c54 Update README 2016-03-10 16:20:17 -07:00
vemacs 97561667a0 Java 7-ize this class 2016-03-10 12:36:57 -07:00
vemacs bdb81123d6 Refactor spawn egg provider to separate classes 2016-03-10 09:28:08 -07:00
vemacs f1c57371a3 Refactor providers to a generic implementation in preparation for future spawn egg APIs 2016-03-10 08:54:07 -07:00
vemacs 873f9404bf Restore old inventory clear behavior for 1.9 2016-03-08 18:07:04 -07:00
vemacs 7eac272386 Fix clone(), formatting tweaks 2016-03-08 17:44:57 -07:00
Trent Hensler e6d177c09a Revert "Don't require extra argument to see armor with invsee. Resolves #472."
Handling this with armor and without NMS isn't clean. Advise using OpenInv if players want extended capability.

This reverts commit 6eb63fd3fd.
2016-03-08 15:38:50 -08:00
vemacs 65f2051e87 Add spawn egg NMS for 1.9 2016-03-08 12:28:23 -07:00
vemacs 767abe83f9 Fix giving spawn eggs in 1.9 (use SpawnEgg API) 2016-03-08 12:12:21 -07:00
Trent Hensler 6eb63fd3fd Don't require extra argument to see armor with invsee. Resolves #472.
Before, you had to do  to see armor. Now it just adds it if you have the permission.
2016-03-07 15:37:42 -08:00
Trent Hensler 03c59a9f17 Remove outdated netbeans styles. 2016-03-07 11:45:29 -08:00
Trent Hensler 3fd925c1fd Use proper AFK toggle to make test pass. 2016-03-07 11:19:16 -08:00
Trent Hensler 6ea8f7b621 Update vault version.
This solves the issue of trying to resolve old dependencies that led to 1m+ compile time for me.
2016-03-07 11:10:43 -08:00
vemacs 4e77fc0f0b Update potions to 1.9 2016-03-06 16:19:06 -07:00
vemacs 6d347881b7 Formatting 2016-03-06 11:14:08 -07:00
vemacs 73ad945101 Simplify copy operation 2016-03-06 11:02:05 -07:00
vemacs d39615d906 Try correcting overflow behavior for non-sign situations 2016-03-06 10:49:16 -07:00
vemacs dcc6e2f23f Correct overflow behavior after https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/c44c41ef02307f87bd978a6021a10d9b3d751d5e 2016-03-05 09:29:53 -07:00
vemacs 24e068b94d Send invalid message when attempting to spawn unavailable mob 2016-03-05 09:03:32 -07:00
vemacs 6b6cf41782 Also do a nullcheck on enchants 2016-03-05 09:01:15 -07:00
vemacs d17bd144a2 Add 1.9 Enchantments (FROST_WALKER, MENDING) 2016-03-05 08:49:46 -07:00
Trent Hensler a5686a17e2 Proper directory structure with this maven project. 2016-03-04 10:06:28 -08:00
Trent Hensler 2fab3b9957 EssentialsXGroupManager 2016-03-03 17:39:29 -08:00
Trent Hensler 9e2a9abee1 Have GM be consistent with other modules. 2016-03-03 17:38:29 -08:00
Trent Hensler 10eed23430 Add GroupManager
This doesn't mean we are actively supporting it, just means I wanted to appease people begging for a binary that works on 1.9.
2016-03-03 17:18:27 -08:00
vemacs 7967f62131 Deduplicate toggle argument handling code 2016-03-03 12:54:18 -07:00
vemacs 8102bab3ff Add our 1.9 changes to the readme 2016-03-03 08:45:06 -07:00
vemacs dd026700be Minor cleanup 2016-03-03 07:57:37 -07:00
vemacs 0001665ece Don't spam startup logs for PermissionsHandler 2016-03-03 07:44:49 -07:00
vemacs d0a7c5a0ec Remove PEX binary from repo, as we use Vault metadata now 2016-03-02 20:59:17 -07:00
vemacs ba97e5fff5 Don't allow double loads 2016-03-02 08:48:32 -07:00
vemacs e90455463f Better solution than synchronization 2016-03-02 08:46:29 -07:00
vemacs 72760096f5 Never write empty names file 2016-03-02 08:33:11 -07:00
vemacs 148cbd06e0 1.9 -> 1.9-R0.1 2016-03-01 19:11:49 -07:00
vemacs 62c2c57d4d [Experimental] Support Unbreakable meta tag 2016-03-01 18:16:13 -07:00
vemacs b8f7918a4a [Experimental] Rewrite UUIDMap to use one single ScheduledExecutorService 2016-03-01 17:52:39 -07:00
vemacs 526118e7d3 Update sounds to 1.9, fix compile 2016-03-01 17:05:57 -07:00
vemacs 37c20d5b6d Update API to 1.9-SNAPSHOT (note: compatibility is retained) 2016-03-01 16:53:08 -07:00
vemacs 5b60998b0a Use try-with-resources 2016-03-01 11:52:29 -07:00
vemacs 833713bee2 setAccessible(true) on legacy cache methods 2016-03-01 11:49:54 -07:00
vemacs cf1f2f8f03 Don't hardcode inv length 2016-03-01 10:21:04 -07:00
vemacs f6cbda0e04 Also limit maxYears in parser 2016-03-01 09:43:28 -07:00
vemacs 7d33814d5b Change to Vault Metadata API for PEX build perms 2016-03-01 09:29:45 -07:00
vemacs 7c59d61b32 Limit max time delta in years to 100k 2016-03-01 09:24:06 -07:00
vemacs 844a4a0574 Truncate contents length for 36 to playerInventory 2016-03-01 08:51:09 -07:00
vemacs 5968a6bc27 Run seen fallback code asynchronously, and clean it up 2016-03-01 08:36:41 -07:00
vemacs f94e242a75 Change spectator mode string matching to be consistent with other gamemodes 2016-03-01 08:05:00 -07:00
vemacs ddee7d1b94 Add 1.9 mobs (just one) to Mob 2016-02-29 20:52:02 -07:00
Blinky™ 30fce436dd Merge pull request #408 from AdamQpzm/2.x
Add fix for enchants & kits on 1.7
2016-02-06 07:35:56 -05:00
AdamQpzm dfdc6a52be Add fix for enchants & kits on 1.7 2016-02-06 11:24:36 +00:00
Ali Moghnieh ba5ce33464 Test for updateActivity all the time in PlayerCommandPreprocessEvent. 2016-01-30 16:07:14 +00:00
Ali Moghnieh 7809615896 Fix /time permissions to allow players to check time with just essentials.time. Remvoe timeSetAllPermission message as it is no longer used. 2016-01-25 01:17:47 +00:00
Ali Moghnieh 27a297a18d Move last-message-reply-recipient-timeout to a more appropriate position in the config.yml. 2016-01-20 16:02:41 +00:00
Ali Moghnieh bbf657e251 Add afk-list-name config property for changing the player list name of AFK players. 2016-01-20 14:15:53 +00:00
Ali Moghnieh c6d2746959 Add world-time-permissions configurable variable (false by default) that justifies whether /time should check for per world permissions. This was recommended by Khobbits as newbies might get confused by this feature. 2016-01-20 11:46:37 +00:00
vemacs d895d40fbf Move legacy field to class 2016-01-19 11:01:09 -07:00
Blinky™ a1d40f24a7 Update README.md 2016-01-19 08:57:03 -07:00
vemacs fd697aeb83 Restore spawnmob compatibility to 1.7.x, also provide framework for future version support 2016-01-19 08:45:52 -07:00
vemacs 6e05327934 Ship full Metrics (might help fix our graphing issues) 2016-01-19 08:09:44 -07:00
vemacs a4871cac36 [Experimental] Attempt to implement compatibility for 1.7 servers 2016-01-18 21:05:49 -07:00
vemacs b17f5d32c9 Add configuration option for toggling "fly mode enabled" message on login 2016-01-18 19:21:29 -07:00
vemacs 3896bcbd64 Allow skipping version check per request 2016-01-18 15:49:43 -07:00
vemacs 9c986aa25f Forcibly load OfflinePlayer class per @Byteflux's suggestions to prevent LinkageError 2016-01-18 15:02:20 -07:00
Ali Moghnieh 419d2d8282 Prettify currency display further. 2016-01-14 18:20:06 +00:00
Ali Moghnieh d570570394 In Commandtime:
- Make world name normalization lowercase the name as well.
- Permission checks will now always consider essentials.time.world.all for convenience.
2016-01-14 18:16:36 +00:00
Ali Moghnieh 0347badeda Update time world permissions prefix from essentials.time.set to essentials.time.world. 2016-01-14 17:56:41 +00:00
Ali Moghnieh eb924b9861 Add per world permission for setting world time.
Add two new locale messages: timeSetWorldPermission and timeSetAllPermission.
Add two new permissions essentials.time.set.all and essentials.time.set.<world>.
2016-01-14 12:32:48 +00:00
Ali Moghnieh 38c8a8e666 /Vanish no longer broadcasts user activity on PlayerCommandPreProcessEvent.
Implement more hard coded customizability with commands that shouldn't broadcast afk activity on PlayerCommandPreProcessEvent.
2016-01-12 23:53:09 +00:00
AdamQpzm 9f75f1aad3 Add bypass permission to nick command
This should allow users of wildcard permissions to be able to change their nicks as intended, without any changes to their current setup.
2016-01-04 21:32:19 +00:00
drtshock a669163196 Remove colour in permission checks.
As @supaham pointed out, this can cause issues with giving a player a wildcard permission and then negating the specific node if both nodes aren't negated.
2016-01-02 12:17:43 -08:00
Tux 87842a36ba Allow color-only nickname changes. 2016-01-02 12:11:17 -08:00
Ali Moghnieh 2d3691107d Create broadcastworld command for broadcasting to a world instead of the whole server. 2016-01-02 12:57:37 +00:00
Ali Moghnieh 134fbdf1df Fix Essentials Signs abuse using colours. Prior to this commit, the sign creation stage could be bypassed by typing &1&1[Test] assuming that was the success-name of the Essentials Sign. This commit prevents this by checking if the top line contains any of the success-name, without color. And so if anyone tries to type &1[repair] it will be displayed as [repair], but if someone tried &1[repairs] it will be displayed as §1[repairs], as repairs is not an Essentials Sign. It might be worth noting that all signs are checked including disabled signs to prevent abuse ahead of time. So even if [repair] is disabled all colours will still be stripped from [repair]. 2016-01-02 11:51:11 +00:00
Ali Moghnieh ab490cd588 Make 'Prevent sign destruction' message print on debug to prevent spam. 2016-01-02 11:36:48 +00:00
Ali Moghnieh 2e903acbaa Add support for using /seen with UUID. 2016-01-02 10:46:42 +00:00
Ali Moghnieh 06417910e2 Add 10 seconds of graceful time before doing first check to prevent misinterpretation of lack of activity. 2016-01-02 10:16:34 +00:00
Blinky™ c56dd6e302 Merge pull request #328 from AdamQpzm/2.x
Prevent extra colour codes from creating Essentials signs
2015-12-28 15:15:49 -07:00
AdamQpzm 19dcb33eb7 Prevent extra colour codes from creating...
...Essentials signs
2015-12-28 22:06:04 +00:00
Ali Moghnieh 540fa98a44 Ensure signsEnabled boolean is reset when reloading config. 2015-12-25 23:24:51 +00:00
drtshock 7428b7f981 Add groupmanager to gitignore. 2015-12-06 12:31:58 -08:00
drtshock 6fc19b92eb Turn off socialspy on login if player doesn't have the permission.
This fixes the case where players had socialspy enabled, lost the permission for it (got demoted) and then someone had to manually check and disable it for them as described in #299.
2015-12-06 12:30:55 -08:00
vemacs 1a701e69ca Add configuration option for the "#EasterEgg" regarding milk buckets and animals.
Requested by @prplz
2015-12-01 17:41:56 -07:00
vemacs 569c848764 Merge branch '2.x' of https://github.com/drtshock/Essentials into 2.x 2015-12-01 17:33:20 -07:00
vemacs ad93d15197 Only utilize usercache lookup for seen command 2015-12-01 17:32:53 -07:00
Ali Moghnieh 4a0507a838 Clone map of name->uuid when writing to file. Educated-guess for a fix for #213. 2015-11-30 19:51:22 +00:00
vemacs bc4737562d Use Essentials server instance instead of static Bukkit reference 2015-11-29 17:25:57 -07:00
vemacs 55f3a14343 Fix EconomyTest passing 2015-11-29 17:01:19 -07:00
vemacs 72e99a8833 Fall back to CraftBukkit userCache or Mojang for UUID lookups 2015-11-29 16:25:26 -07:00
Ali Moghnieh 0eb5063332 Duplicated code is so boring, ugh. Fixes #280. 2015-11-25 17:25:34 +00:00
Ali Moghnieh ca387687a5 Add last-message-reply-recipient-timeout setting for timing out reply-recipient in private messaging. 2015-11-24 22:48:18 +00:00
vemacs 2d376bc72f Restore LocationUtil compatibility with 1_8_R1 2015-11-15 07:59:19 -07:00
Blinky™ 58948b45b3 Merge pull request #273 from Fleodas/patch-1
Update messages_fr.properties
2015-11-10 17:33:29 -07:00
Fleodas 514f9b90f0 Update messages_fr.properties
Updated with last translations from crowdin, translation of the latest messages in French.
2015-11-11 01:20:32 +01:00
vemacs 0c41363914 Merge branch 'patch-2' of https://github.com/Androkai/Essentials into 2.x 2015-11-08 08:11:44 -07:00
vemacs 9bf0b65016 Merge branch 'issue-232' of https://github.com/sainttx/Essentials into 2.x 2015-11-08 07:59:47 -07:00
Ali 'SupaHam' M cdfe2b1487 Merge pull request #267 from EvilOlaf/patch-3
Fixes https://github.com/drtshock/Essentials/issues/265
2015-11-08 13:17:05 +00:00
Very Evil Olaf fe936a683f Fixes https://github.com/drtshock/Essentials/issues/265 2015-11-08 09:18:58 +01:00
Androkai e3cc5f2df8 add 4 missing strings
updated file with new strings from messages.properties
2015-11-07 22:36:31 +01:00
Blinky™ 3c0dc1e455 Merge pull request #263 from Androkai/patch-1
Translated missing strings and fixed some mistakes
2015-11-07 13:46:37 -07:00
Androkai d5b781fd60 Translated missing strings and fixed some mistakes
I downloaded a newer version from crowdin, compared it with this one, translated additional strings and fixed some old mistakes and inconsistencies in German word choice.
2015-11-07 21:45:22 +01:00
Ali Moghnieh 0a876c33a7 Add minimum-pay-amount setting to limit how little you can /pay someone.
Add 'minimumPayAmount' translatable message.
Create NumberUtil#displayCurrencyExactly(BigDecimal, IEssentials).
2015-11-07 17:23:40 +00:00
Ali Moghnieh fc8ee7f25f WHERE ARE THE BRAKES? Fix sending both UNREACHABLE and MESSAGES_IGNORED messages to /msg sender. 2015-11-03 23:39:18 +00:00
Ali Moghnieh cf448cd1cc Always set the message sender's reply-recipient when they send a message. 2015-11-03 00:40:56 +00:00
Ali Moghnieh 928f05ca8f Fix logic behind setting reply-recipient when receiving a message. 2015-10-31 23:28:05 +00:00
Ali Moghnieh 7b60552ec1 /tppos shouldn't add 180 to yaw. Fixes #225 2015-10-31 20:47:04 +00:00
Ali Moghnieh 26045e2ec0 Add isReachable API to IMessageRecipient.
Add translatable message recentlyForeverAlone.
Add behaviour that preserves reply-recipient only if they are reachable, and update reply-recipient if they are not reachable.
Fixes #248
2015-10-30 19:58:30 +00:00
Ali Moghnieh e5ebeaf724 Merge branch '2.x' of github.com:drtshock/Essentials into 2.x 2015-10-30 19:23:00 +00:00
Ali Moghnieh dc24bb53c2 Use recipient's display name instead of sender's name in messaging notifications. Fixes #249. 2015-10-30 19:22:39 +00:00
Matthew Steglinski 2175cb8a44 Group allowShortName check when checking if the short form version of 'splash' was used 2015-10-29 16:42:19 -04:00
Matthew Steglinski 756ea346e6 [Fix] Add option to not show one time use kits described in #188
* Adds toggleable config option 'skip-used-one-time-kits-from-kit-list' to exclude used kits with delay < 0 from displaying in the /kit list
2015-10-28 13:29:30 -06:00
Matthew Steglinski 23f3d69d38 [Fix] Call JailStatusChangeEvent when jailing and unjailing players. Fixes #161 2015-10-28 13:29:29 -06:00
Matthew Steglinski a134e99c8c [Fix] Listen to PortalCreateEvent to cancel portal creation by fire. Fixes #164 2015-10-28 11:35:29 -04:00
Matthew Steglinski 607f1980a1 [Fix] Adds splash potion persistence when serializing items. Fixes #232 2015-10-28 10:59:11 -04:00
Ali Moghnieh fb4af9fefc Rename and fix MessagingTest. 2015-10-28 13:37:17 +00:00
Ali Moghnieh 447b9db397 Rewrote messaging structure for more abstractness.
This commit adds a new boolean-configurable feature called last-message-reply-recipient, defaults to true for new installs and false for old installs, which states whether to use the new messaging functionality or not.
This commit deprecates Console#getCommandSender(Server) and provides Console#getInstance()#getCommandSender() for future usability.
2015-10-27 20:46:58 -06:00
Matthew Steglinski 77eb430b0b [Fix] Fixes drtshock/Essentials#189, adds toggleable config option 'ignore-colors-in-max-nick-length' to exclude ChatColors from nickname length 2015-10-27 22:37:33 -04:00
Ali Moghnieh d4ab25b200 Merge branch '2.x' of github.com:drtshock/Essentials into 2.x 2015-10-26 17:22:33 +00:00
Ali Moghnieh faaa4a4b1e Fix typo in German language file. Fixes #236 2015-10-26 17:22:10 +00:00
mickare a844e8b5ad Fix for offline player functionality (including /seen), implement automatic usermap repair 2015-10-17 08:20:33 -06:00
Taras 84143d06fa Revised config 2015-10-17 08:20:31 -06:00
Ali Moghnieh 9805f3f4d1 Add support for HEX RGB values. 2015-10-08 19:33:14 +01:00
Ali 'SupaHam' M bae6f89fa5 Merge pull request #221 from SupaHam/fix-item-color-deserialization
Add support for deserializing item color RGB values as integers.
2015-10-08 19:21:30 +01:00
Ali Moghnieh a721e04119 Add support for deserializing item color RGB values as integers. 2015-10-08 19:14:04 +01:00
Ali Moghnieh 6360c690cf Increment pendingDiskWrites every time we save please. 2015-10-08 18:47:10 +01:00
Ali Moghnieh aa75a3f20d Remove GroupManager from here! 2015-10-08 18:16:41 +01:00
Blinky™ 3edfec2491 Merge pull request #210 from ShadowRanger/2.x
[Fix] Properly apply damage causes
2015-09-27 20:37:47 -06:00
ShadowRanger c364adcf00 Updated & refactored LocationUtil 2015-09-28 12:25:46 +10:00
ShadowRanger 7d6714f713 Properly apply damage causes 2015-09-28 11:45:25 +10:00
drtshock 8485bd44f9 Correct check on bulk sell permission. 2015-09-23 15:02:44 -05:00
drtshock c0800afeeb Add configurable message for messaging someone with messages turned off. Adds #180
This message can also be removed to not send a message at all, keeping previous functionality.
2015-09-01 12:53:07 -05:00
Jikoo 046752f8c2 Fixes for graphical /recipe issues. Closes #134
- Fixed shaped recipe ItemStacks displaying 0s
- Fixed recipes supporting any data value of blocks missing textures
2015-08-19 10:42:16 -06:00
Blinky™ 9307f9b9c1 Update README.md 2015-08-19 10:42:15 -06:00
drtshock ee2018416e Add gamemode check when game moding self. 2015-08-10 09:58:20 -05:00
drtshock 6c38b6c6fb Hand sell message should be different from bulk sell. 2015-08-08 21:42:21 -05:00
drtshock cafb297594 Add essentials.chat.spy.exempt permission. Implements #83 2015-08-07 17:05:19 -05:00
drtshock 8bec43f7a2 New permission for changing all gamemodes. Fixes #79.
Need to give players essentials.gamemode.all or each gamemode permission on top of essentials.gamemode to be able to change.
2015-08-07 16:54:08 -05:00
drtshock fe1dd0d0f3 Add separate permission for bulk sell and hand sell. 2015-08-07 16:53:20 -05:00
drtshock b066d4dd83 Send emotes to yourself. 2015-08-01 19:24:23 -05:00
drtshock 792c7d5e91 Have me command respect chat radius. Implements #118.
Adds similar functionality to that of chat in essentials chat.
2015-08-01 16:38:09 -05:00
drtshock 76498e86f5 Add X naming to parent module. 2015-07-29 16:22:10 -05:00
vemacs 540a15160c Fix enable/disable message ordering in /msgtoggle 2015-07-29 11:26:36 -06:00
vemacs 6eb5aded38 Add msgtoggle to plugin.yml 2015-07-29 10:31:41 -06:00
vemacs 891605380f Add /msgtoggle command, untested (implements #89) 2015-07-28 20:29:17 -06:00
vemacs fe9348b3fb Add silent msg ignoring in msg command 2015-07-28 19:49:13 -06:00
vemacs c592a9d361 Add IgnoreMsg API 2015-07-28 19:45:33 -06:00
vemacs fae159cdbd Merge branch '2.x' of https://github.com/drtshock/Essentials into 2.x 2015-07-28 19:20:49 -06:00
vemacs d7b0f74a75 Give money back to sender if MaxMoneyException thrown (fixes #106) 2015-07-28 19:20:47 -06:00
drtshock d5301824fc Use Bukkit ChatColor instead of ess regex to strip colors. 2015-07-23 15:23:47 -05:00
vemacs 28607ce58c Fix compile 2015-07-23 15:23:47 -05:00
vemacs 9fb0ab57e6 Fix compile 2015-07-18 20:05:36 -06:00
Blinky™ 6143b088c3 Merge pull request #96 from CoolV1994/2.x
Fix Issue #91
2015-07-18 16:15:03 -06:00
CoolV1994 06e24b3bc2 [Fix]: tppos for Console
Use the correct arguments when using from Console
2015-07-18 18:02:21 -04:00
CoolV1994 3283b8c0a3 [Feature]: Add world argument to /tppos 2015-07-16 19:09:19 -04:00
CoolV1994 f43501e828 [Fix]: Relative Coordinates
Fixes the error when trying to do something like:
/tp ~ ~10 ~
2015-07-16 18:36:10 -04:00
vemacs 192ced4e4c Revert "Make disable-eco option visible in default config. Adds option requested multiple times."
This reverts commit dd65a1e76c.
2015-07-08 07:26:31 -06:00
drtshock dd65a1e76c Make disable-eco option visible in default config. Adds option requested multiple times.
This is apparently already in there but not visible. https://github.com/drtshock/Essentials/blob/cf9c9f707324826b0d1468a24ca42362ab2959bf/Essentials/src/com/earth2me/essentials/Settings.java#L644
2015-07-06 23:42:26 -05:00
drtshock 0b042dad43 Add separate permission for notifying ban ip. Resolves #60.
Permission is essentials.banip.notify and old one is essentials.ban.notify.
2015-07-06 16:19:32 -05:00
vemacs 14384f6bfa Put whole block into try-catch (just in case) 2015-07-05 09:41:11 -06:00
vemacs b9f293f8a7 Fix plugin startup 2015-07-05 09:37:17 -06:00
vemacs d03d85b52b Start metrics async 2015-07-05 09:27:53 -06:00
vemacs cf9c9f7073 Use metrics-lite, use global PluginMetrics config to control disable 2015-07-05 09:26:36 -06:00
vemacs 7fb263e75c Assign permissions in plugin.yml since they aren't assignable from player-commands 2015-07-05 09:10:04 -06:00
vemacs 1d20184f0b Implement #70 (untested), TODO assign default permissions 2015-07-03 13:07:25 -04:00
Blinky™ 500384abf3 Fix somehow removed drop-items-if-full option 2015-07-01 23:56:31 -05:00
Blinky™ d1b18da36e Clarify more 2015-07-01 23:53:52 -05:00
Blinky™ 3b3acbcfda Update README.md 2015-07-01 23:53:10 -05:00
Blinky™ 6c35dfcb3d Expose use-bukkit-permissions in config 2015-07-01 23:50:17 -05:00
vemacs 01ad006ca3 No magic numbers 2015-07-01 08:16:45 -05:00
Blinky™ 7e580920f6 Pig, not creeper 2015-06-30 17:20:11 -05:00
Blinky™ 5227824608 Default to pig spawner, fixes #67 2015-06-30 17:15:13 -05:00
vemacs 1c78f5cc3b Update metrics implementation, report to mcstats instead of Essentials metrics 2015-06-28 21:53:38 -05:00
vemacs 306aab0d8d Implement drop-items-if-full for /give command (default false) 2015-06-28 10:30:21 -05:00
vemacs e33c42e123 Optimizate imporst 2015-06-21 09:16:49 -04:00
vemacs 9ccfd4aac0 Fix compile, class definitions 2015-06-21 08:45:01 -04:00
vemacs 549da08f87 OCD message tweaking. Last thing. 2015-06-19 21:59:17 -04:00
vemacs b6c7799cc2 Fix compile, consider this stable 2015-06-19 21:48:11 -04:00
vemacs d063b5a894 Apply setUseSuperperms() to correct handler 2015-06-19 21:44:11 -04:00
vemacs cd78211cdf Remove redundant checkPermissions() call from poorly named listener 2015-06-19 21:39:42 -04:00
vemacs 4e9d6d22dd Actually fix no-Vault situation 2015-06-19 21:34:52 -04:00
vemacs 3a3d1a5981 Fix no-Vault situation 2015-06-19 21:30:27 -04:00
vemacs b15d868f77 Failing test? Delete it, not failing anymore 2015-06-19 20:56:55 -04:00
vemacs a6232b6bb6 [Untested] [Experimental] PermissionsHandler cleanup, add specific logging to detect Vault with no perms plugin 2015-06-19 15:47:58 -04:00
vemacs 6ca3712b79 Attempt PermissionsHandler cleanup, attempt to support Vault installed but no working perms/chat setup situations 2015-06-19 09:14:46 -04:00
vemacs db6724acdf Fix indentation, update getHumanName 2015-06-18 13:46:55 -04:00
vemacs 16c7bf2eb3 Add v1_8R2 to support 1.8.3 users not on the latest 1.8.3 build 2015-06-18 13:43:39 -04:00
vemacs 0331fafa77 Move common name setting stuff to superclass 2015-06-17 16:58:57 -04:00
vemacs 1d63209691 Rename this class to match the others 2015-06-17 15:22:00 -04:00
vemacs 140ece68d3 Cleanup dependencies, still waiting on build server to be fixed 2015-06-17 13:01:01 -04:00
vemacs e95ca8444e Simplify loadProvider method 2015-06-17 11:09:13 -04:00
vemacs dce381fb28 Advertise in readme 2015-06-17 11:00:23 -04:00
vemacs 121b262d1b Use returned value for setEntityType, attempt fixing name setting 2015-06-17 10:54:23 -04:00
vemacs 51b52ac343 [Experimental] Also catch provider instanciation exceptions 2015-06-17 10:38:25 -04:00
vemacs 8793add589 [Untested] [Experimental] [Need @drtshock to fix build server] Fully support all versions of Spigot and CraftBukkit from 1.8+ 2015-06-17 10:25:46 -04:00
vemacs e4f6bb363d Compile against Spigot's Bukkit maven repo 2015-06-17 09:02:28 -04:00
vemacs 6bd34f44ef Move downloads to top 2015-06-16 17:01:21 -04:00
vemacs be60e10ebd Bring back this? 2015-06-12 11:32:32 -06:00
vemacs 56cfffb2ef Fix double dependency, offlineplayer override 2015-06-12 11:28:41 -06:00
vemacs 20a59ddb6e Catch throwable for spawnerutil, move nasty warning to spawnerutil 2015-06-12 11:22:11 -06:00
vemacs bfa93cc189 Move initialization code to top 2015-06-05 16:49:05 -06:00
vemacs 480055b3d7 Give actually helpful error message for attempts to load on 1.7 2015-06-05 16:46:33 -06:00
drtshock 5e605f992a Reformat floatutil. 2015-06-05 10:38:06 -05:00
vemacs 3634cab1a5 Apply patch "Fixed exp for 1.8" from Spigot-Essentials, fixes #3 2015-06-04 20:44:02 -06:00
vemacs 8e2ffe08f8 Use items.csv from Spigot-Essentials (recommended to delete your current items.csv if you haven't made changes) 2015-06-04 20:41:32 -06:00
vemacs b6957db352 Apply patch "Fix float parsing issues" from Spigot-Essentials 2015-06-04 20:32:36 -06:00
vemacs ff3b1e810f Fix MetaItemStack canSpawn() method to try it on a clone, readd check to /give and /i 2015-06-04 11:18:47 -06:00
vemacs 14c4ed8379 Merge branch '2.x' of https://github.com/drtshock/Essentials into 2.x 2015-06-04 08:42:58 -06:00
vemacs a224894380 Fix inverted boolean value, fixes #53 2015-06-04 08:41:19 -06:00
vemacs f5a4c8f11e We require 1.8 2015-06-03 17:23:28 -06:00
vemacs 73ac6488ce Run IntelliJ IDEA inspections 2015-06-03 14:11:56 -06:00
vemacs c03765803c Move to switch statement (Java 7 sugar) 2015-06-03 14:03:26 -06:00
vemacs 65fc8a9c41 Don't spam fallback message 2015-06-03 13:20:42 -06:00
vemacs e8e15d2cd4 Merge branch '2.x' of https://github.com/drtshock/Essentials into 2.x 2015-06-03 13:12:22 -06:00
vemacs d7849f4120 Build against java 7 2015-06-03 13:11:43 -06:00
vemacs c48f68f0dc Update README.markdown 2015-06-03 10:06:29 -06:00
vemacs fe49e08340 Force superperms based permissions if a supported perms plugin is installed, but Vault isn't 2015-06-03 09:53:24 -06:00
vemacs 5051f3c4d7 Jungle -> SMALL_JUNGLE handling 2015-06-03 08:08:28 -06:00
vemacs 0c8695a888 Fix compile, avoid hardcoding tree values 2015-06-03 08:05:38 -06:00
vemacs d63e342f78 Remove version matching, it's pointless now 2015-06-03 07:44:18 -06:00
vemacs 9f4ccf9eaf Remove unused dependencies, add Vault softdepend 2015-06-03 07:08:21 -06:00
vemacs 1f14ac5c18 Copy logic from pre-refactor, should fix everything PermissionsHandler related, add Vault dependency to readme 2015-06-03 07:04:39 -06:00
vemacs 8f71261646 Fix issues relating to refactor 2015-06-02 18:08:44 -06:00
vemacs 1a9954428b Make Commandgive behavior more similar to Commanditem, fix shutdown spam 2015-06-02 17:57:20 -06:00
vemacs e43ae47a78 Simplify handler registration logic 2015-06-02 17:34:38 -06:00
vemacs 57213dd625 call setupProviders() for all handlers 2015-06-02 17:12:53 -06:00
vemacs ce5ffb9bd7 Call superclass constructor for GroupManager, fixes #48 2015-06-02 17:09:03 -06:00
vemacs 5375ff3790 Add reset color code before name (duplicate legacy vanilla behavior) 2015-06-02 14:02:08 -06:00
vemacs 37d4dc70e5 Set display name for given spawners 2015-06-02 13:56:54 -06:00
drtshock e7337d06b5 Merge branch '2.x' of https://github.com/drtshock/Essentials into 2.x 2015-06-02 14:47:53 -05:00
drtshock bcc76aff63 Build number in version. 2015-06-02 14:47:42 -05:00
vemacs 154d43819a Make permissions-plugin specific implementations extend Vault, fix build permission checks 2015-06-02 13:21:40 -06:00
vemacs 318e0eabea Make PermissionsEX handler use UUIDs 2015-06-02 13:20:34 -06:00
vemacs 0a2f1a3dfe Fix PrivilegesHandler 2015-06-02 13:09:54 -06:00
vemacs b19dbb1b8f Make permissions-plugin specific implementations extend Vault, fix build permission checks 2015-06-02 13:08:53 -06:00
vemacs 904a9700b2 Update README.markdown 2015-06-02 12:21:46 -06:00
vemacs f5daf7085e Add logo 2015-06-02 12:18:44 -06:00
vemacs f500e2ce9a Add wiki link to readme 2015-06-02 12:09:24 -06:00
drtshock e2a67365f9 Add CI link to readme. 2015-06-02 12:18:49 -05:00
vemacs 2273329e29 Add SpawnerUtil with primary Spigot 1.8.3+ EntityType setting, legacy data fallback. Fixes #22 2015-06-02 11:28:38 -05:00
vemacs be1acfdccd Don't override SuperpermsHandler hasPermission, fixes #45 2015-06-01 18:50:20 -06:00
vemacs 2f39811a46 Properly set default for force-disable-teleport-safety to false 2015-06-01 14:00:06 -05:00
vemacs f995676fad Add force-disable-teleport-safety option (default false). This option is useful for preventing "teleport-glitching" in Factions servers. 2015-06-01 14:00:06 -05:00
vemacs ea4c966003 Rename Vault setup method to be more descriptive, check if Chat class is available 2015-06-01 11:03:11 -06:00
vemacs fe5de8a854 Fix #35, implement prefix and suffix methods for VaultHandler 2015-06-01 10:19:11 -06:00
vemacs fa43f39015 Use UUID methods for zPermissions (merged from Spigot fork) 2015-06-01 09:11:41 -06:00
drtshock 4d0e6254dd Fix typo in Guardian. Fixes #40. 2015-06-01 08:44:49 -05:00
Paul Sauve e94e908bed Fix dependencies 2015-05-24 18:02:40 -05:00
drtshock 179dbe19fd Use separate config option for near radius.
We were using chat radius, which upset me when I wanted to change it but didn't want to start using local chat.
2015-05-16 19:36:57 -05:00
drtshock d6eb846488 Add blacklist of commands for muted players. Adds #30. 2015-05-12 21:44:36 -05:00
drtshock 6796d460dc Add option to put unique players in join message. 2015-05-08 15:55:02 -05:00
drtshock 4be2fc1a90 Update pom of EssentialsX 2015-05-03 15:09:22 -05:00
drtshock 20f79f117f Make sudo a loop command. Adds #23. 2015-05-03 15:08:32 -05:00
drtshock 4169996e7a Name the jars EssentialsX. 2015-04-24 15:32:50 -05:00
drtshock 667fc18abf Return at correct spot. 2015-04-24 12:35:29 -05:00
drtshock 4f72ff47bc More informative permission lag notices. 2015-04-22 11:26:41 -05:00
drtshock b7704a4ea8 Simplify a few things in EssentialsChat. 2015-04-22 10:58:04 -05:00
drtshock ac0858dcdb Add PermissionsHandler for Vault.
We'll use the VaultAPI if it's there for group checks.
This will also allow us to default to Player#hasPermission from Bukkit instead of going through each permission plugin.
2015-04-22 10:42:27 -05:00
drtshock 7439dc01a5 Update other info. 2015-04-20 18:26:03 -05:00
drtshock 090e0b6757 Add banner meta. Resolves #8. 2015-04-20 18:09:52 -05:00
drtshock effad664d5 Print stack trace if debug is enabled. 2015-04-20 17:49:23 -05:00
drtshock 01bf7d1389 Update readme 2015-04-20 14:51:56 -05:00
drtshock b7c7e4ad23 Add /showkit to view kit contents. 2015-04-20 14:33:36 -05:00
drtshock 5ca02e6596 Don't build groupmanager. 2015-04-20 13:09:56 -05:00
drtshock 6b2f87c5a9 Consistent versioning. 2015-04-20 12:51:51 -05:00
drtshock 9a265aac48 Add /createkit.
Allows you to create a kit in game using your inventory.
2015-04-20 12:51:22 -05:00
drtshock 5b052c170f Per gamemode permissions. Adds #16. 2015-04-17 16:54:25 -05:00
drtshock 555f151692 Allow commands in kits. Adds #15.
Syntax is /<command> with the ability to add {player} as an argument.
2015-04-17 14:48:23 -05:00
drtshock c22978c3f9 Add missing aliases to plugin.yml 2015-04-16 09:28:05 -05:00
drtshock 54b3a23ae2 Update items for 1.8.3 2015-04-16 09:25:40 -05:00
drtshock f5b40dba34 Add option to not send no new mail message on join. 2015-04-16 09:25:29 -05:00
drtshock f8160c6318 1.8.3 update. 2015-04-16 09:08:22 -05:00
drtshock b113bb59d4 Spectate gamemode. 2015-04-16 08:54:46 -05:00
drtshock 15bd41fefc Add new mobs. Update child to 1.8.3 2015-04-16 08:52:29 -05:00
drtshock 4e6aef3d24 Add Depth Strider enchantment. Resolves #4. 2015-04-16 08:50:43 -05:00
drtshock c798f995ca 1.8.3 2015-04-16 08:46:00 -05:00
drtshock 9bca2b44ab Update pom. 2015-04-16 08:32:04 -05:00
drtshock dde0b20775 Reformat 2015-04-14 23:06:16 -05:00
KHobbits ad13062117 Unrequired Dependacy 2014-09-06 17:22:25 +01:00
KHobbits d11a295ffd Merge branch '2.x' of github.com:essentials/Essentials into 2.x 2014-09-03 00:21:42 +01:00
KHobbits ffea359661 rework /seen to be a little stricter on argument matching. 2014-08-18 21:00:03 +01:00
md_5 037456c99d Fix missed cases from previous user iteration optimizations. 2014-08-16 19:04:13 +10:00
KHobbits 5125a137f4 Make sure we close any open inventories of players who leave. 2014-08-14 01:58:17 +01:00
KHobbits 3f1c996959 Use quicker ban lookup to reduce /seen lag. 2014-08-14 01:50:31 +01:00
KHobbits 53a7cd732f Add paging to mail.
Support aliases in rule and baltop output.
2014-08-11 19:03:24 +01:00
KHobbits 4fd026ff99 Add mailFormat TL key. 2014-08-11 18:46:04 +01:00
Necrodoom d9fbd68529 Misc clarification (socialspy and kit delay)
clarify allow-silent-join-quit
2014-08-11 00:12:43 +01:00
Necrodoom 49d80462d1 Remove outdated try-catches 2014-08-11 00:11:06 +01:00
Necrodoom 1d859e49ad Add /tempban missing syntax 2014-08-11 00:10:09 +01:00
FearFree a2c43d822c Add amount required to notEnoughMoney TL key.
See https://essentials3.atlassian.net/browse/ESS-5125 for request.
2014-07-19 20:31:50 +01:00
KHobbits 7907565377 Formatting fixes. 2014-07-19 20:11:45 +01:00
SidShakal d1c014fe16 Fix sticky piston retract breaking essentials sign
Sticky pistons could break signs that were mounted on blocks the pistons were retracting.

This patch extends the protection from just the piston base to include the extended piston arm and the block at the end of the piston arm as well.

This method will very likely need to be changed again when 1.8 comes out, but this should bring us a bit closer, by wrapping the block tests in a loop.
2014-07-19 20:08:38 +01:00
md_5 465041b98b Optimize player / user iteration.
* Add a method for backwards compatability with unmapped code.
* Convert all getOnlinePlayers() calls to use this method, part of the IEssentials interface
* Add a new method getOnlineUsers() Ljava/lang/Iterable;
* Convert appropriate calls to use this method
* Update Bukkit to #1945
* Update CraftBukkit to #3103
2014-07-19 20:07:50 +01:00
Alexander Likhachev ed56afda26 Add permission check before resetting speed on login The staff of my server asked me to do this fix, but I think it is very useful for all. This commit change is to reset player fly & run speed only if player has no permission to change speed. 2014-07-19 20:07:09 +01:00
KHobbits 23f14bc2d5 If a player already exists in the usermap, don't replace it with a eco npc. 2014-07-19 18:04:35 +01:00
KHobbits c829a32555 Clean up tempban messages to be a little clearer. 2014-07-14 21:23:56 +01:00
KHobbits ae984c2055 Update translations from Crowdin (http://translate2.ess3.net) 2014-07-12 22:12:51 +01:00
KHobbits 0c416c8366 Remove ban check from /ess cleanup, no longer required.
Fix ban upgrade script.
2014-07-12 19:13:23 +01:00
FearFree 51be2131f7 Update to new ban method. 2014-07-12 17:40:14 +01:00
KHobbits 575a8142ff Add ban reason to /banip 2014-07-12 17:23:11 +01:00
KHobbits 093a1f677b Still give 'nickNoMore' message when removing a nickname. 2014-07-12 16:48:01 +01:00
KHobbits 8311da2653 Allow for changing of username casing without adding 'nickname' prefix. 2014-07-12 16:43:57 +01:00
KHobbits b5976a52e0 Prevent users from setting unsafe homes when teleport safety is disabled. 2014-07-12 16:34:18 +01:00
KHobbits 4e6c98ac57 Allow people with god & fly to teleport to unsafe locations even when teleport safety is disabled. 2014-07-12 16:33:50 +01:00
KHobbits a2c692af39 Converge ban message translations, and add reason support to default tempban tl key. 2014-07-12 16:32:42 +01:00
KHobbits a131527a15 Switch sudo to command dispatch, this will allow vanilla commands to be executed. 2014-07-12 15:29:25 +01:00
KHobbits 0b925e6fc0 Don't cascade null usernames passed from eco api 2014-07-10 11:48:54 +01:00
KHobbits 97c8f5192e New permission :essentials.tp.position Required to use /tp [player] <x> <y> <z> 2014-07-06 18:41:12 +01:00
Necrodoom 7c372cd978 Add support for vanilla /tp <x> <y> <z> teleport syntax. 2014-07-06 18:41:01 +01:00
KHobbits 02fe58161c Allow forcing adult status on randomly generated /spawnmob mobs. 2014-07-06 18:25:00 +01:00
KHobbits 2ba2ebaa43 Update Bukkit
CB: 3092 B: 1938
2014-07-06 16:40:06 +01:00
KHobbits 549500eaf2 Show warp teleport status to teleport owner. 2014-06-28 18:10:32 +01:00
KHobbits 8e7589e450 Slightly reorder teleport messages to be less confusing. 2014-06-28 18:06:13 +01:00
KHobbits 9b69403ee1 Fix NPE with /list in console 2014-06-27 04:28:33 +01:00
KHobbits 6269ce9a3f Update essentials to support 3rd party vanish toggling. 2014-06-27 01:46:37 +01:00
KHobbits 0f6625aea9 Add some debugging to make it easier to diagnose kit errors. 2014-06-25 19:19:04 +01:00
KHobbits dbceccaa3e Kit cleanup and refactor. 2014-06-25 19:03:31 +01:00
KHobbits 6c7ba6a76f Allow multiple kits to be spawned per command. 2014-06-23 00:38:13 +01:00
KHobbits f76a517339 New permission: essentials.signs.trade.override.collect
People with this permission will collect the resources of other peoples trade signs broken with admin permissions (essentials.signs.trade.override).
2014-06-21 21:47:33 +01:00
Necrodoom 2c747ecf36 empty array is not null array 2014-06-19 16:22:38 +01:00
KHobbits 1f8b60081e Reduce a few nickname refresh calls. 2014-06-19 04:02:15 +01:00
KHobbits a800359e0b Force listener cleanup on plugin disable. 2014-06-19 02:59:08 +01:00
KHobbits 4854961901 Add a lag check for permission system checks.
This doesn't include normal permission checks, since the overhead could be detrimental.
2014-06-19 02:38:28 +01:00
KHobbits 50a815bdb9 Revert "Add spawn location cache to reduce blocking on player respawn."
This reverts commit 7804516793.
2014-06-17 23:27:46 +01:00
KHobbits 1690b9d83d If "sethome-multiple" config section is invalid, silently fallback to default config values. 2014-06-17 00:19:59 +01:00
KHobbits 7804516793 Add spawn location cache to reduce blocking on player respawn. 2014-06-16 19:55:34 +01:00
KHobbits c54e9b5dba Add default ban reason for tempban reason. 2014-06-14 22:06:26 +01:00
KHobbits 71936cfe22 Check for arraynull on pex group request. 2014-06-14 18:20:49 +01:00
KHobbits 27890e2b22 Only remove first date match from ban reason. 2014-06-14 16:27:34 +01:00
KHobbits da6df89126 Add optional {2} in 'tempBanned' TL key, for reason. 2014-06-14 16:21:05 +01:00
KHobbits 95ff197910 Show UUID in trackUUID debug message. 2014-06-07 18:21:10 +01:00
KHobbits 2215b0f53f Don't allow old UUID's to accidentally overwrite current UUID for user mapping.
Add some extra logging and uuid debug.
2014-06-07 18:08:25 +01:00
KHobbits 3887fdd47d New permission: essentials.itemspawn.meta-vanilla
Without this permission you cannot use vanilla itemmeta.  You can still use essentials style meta, if you have the appropriate permissions.
2014-06-07 16:08:51 +01:00
KHobbits 7e9328bd25 Try to use consistent UUIDs and not rely on Bukkit lookup while saving. 2014-06-07 15:45:57 +01:00
KHobbits 9d9af25c7f Add local echo of mail being sent on /mail send. 2014-06-05 00:07:27 +01:00
KHobbits 5a2fd19bcf Fix firework recipe in /recipe 2014-06-04 16:13:20 +01:00
KHobbits 3a50850734 Use strings for cachemap key, should prevent accidental key issues. 2014-06-01 21:50:24 +01:00
KHobbits 812de5c35c Add API logging to Eco API. 2014-05-31 20:37:44 +01:00
KHobbits bffea1d7c8 Extend getUser(Object) to match uuid and offline players. 2014-05-30 22:16:06 +01:00
KHobbits b00f458e67 Emulate player join for mocking. 2014-05-27 21:14:45 +01:00
KHobbits 80ef955eae Improve fakeServer model 2014-05-27 20:31:13 +01:00
KHobbits 44509ff6e4 Remove online player lookup in usermap.getUUIDMap(), throw log entry on failback. 2014-05-27 18:04:02 +01:00
KHobbits e1d4129869 Log takeMoney exception, even if we ignore it. 2014-05-27 10:46:25 +01:00
KHobbits 00655f724d Revert writecount reset, this could cause odd behavior. 2014-05-27 06:18:34 +01:00
KHobbits 4590e7ea26 Enforce userdata save on player dispose. 2014-05-27 04:52:52 +01:00
KHobbits 2ac1ce4f56 If we are modifying money, force transaction clear, this is important. 2014-05-27 03:41:18 +01:00
KHobbits f726035660 Don't check silentjoin.vanish if another plugin has hidden the join message. 2014-05-26 22:08:18 +01:00
KHobbits 57bb1ee475 New permission: essentials.silentjoin.vanish
The server needs silentjoin to be enabled first.
2014-05-25 19:31:55 +01:00
KHobbits 889dde7549 Abort transaction before updating funds on balance overflow. 2014-05-25 17:03:23 +01:00
KHobbits ada2fe01a2 Utilize write transactions for delaylogin task. 2014-05-25 01:38:37 +01:00
KHobbits cf29a0ba6a Rename listening methods to be a little more descriptive of their purpose. 2014-05-24 18:47:40 +01:00
KHobbits c929ebb89a Convert 9 anonymous scheduled tasks to named classes for better logging. 2014-05-18 21:32:07 +01:00
KHobbits 8159530906 Fix invalid TL key. 2014-05-18 19:47:18 +01:00
KHobbits 7e8ba9a256 Exempt named mobs by default from /remove
Named mobs can be removed using /remove named
Killing all mobs now requires /remove all,tamed,named
2014-05-18 14:43:07 +01:00
KHobbits b145ec59ea Tweak to player login event. 2014-05-18 13:26:27 +01:00
KHobbits 429a7275ee Update worth.yml to be more descriptive. 2014-05-17 04:31:44 +01:00
KHobbits 3bd0608b6e Update /condense syntax hint. 2014-05-17 04:21:51 +01:00
@ArkhamNetwork 9307e0cb71 Optimize PlayerLoginEvent 2014-05-17 04:05:51 +01:00
@ArkhamNetwork 4672e51806 Move the teleport timer to an async task. 2014-05-17 03:35:44 +01:00
KHobbits 18811122b3 Prevent near empty userdata file creation. 2014-05-17 03:06:48 +01:00
KHobbits cbaf126a25 Stop using old string player lookup. 2014-05-17 02:47:10 +01:00
KHobbits 8e7abe325e Prevent reading and writing the usermap at the same time. 2014-05-17 01:50:41 +01:00
Faris Rehman ed9e4ecd28 Add user messages. 2014-05-16 20:39:49 +01:00
KHobbits bd866de950 First draft of /condense 2014-05-16 20:30:06 +01:00
KHobbits 4ecb6b5fdb If Bukkit doesn't know who a player is, but we do, substitute the last known nickname when ban checking. 2014-05-10 21:52:45 +01:00
KHobbits 0d6bca2080 Update English TL keys. 2014-05-10 17:49:37 +01:00
KHobbits 05ef05dcac Update translations from crowdin (http://translate2.ess3.net/) 2014-05-10 16:11:03 +01:00
Luke Anderson (stuntguy3000) 7ba097c640 Improve messages/formatting 2014-05-10 16:03:39 +01:00
Burke D 6adacbb357 Grammatical changes to config.yml 2014-05-10 15:46:08 +01:00
clou44 69f62574c4 Updated Items.csv: Added nemofish and fishnemo.
Added shorter aliases for salmon, pufferfish, and clownfish.
2014-05-10 15:38:29 +01:00
KHobbits b00c31730f Only dispose users who are offline at point of disposal.
This should cater for quick reconnects on lagged servers.
2014-05-10 15:36:58 +01:00
KHobbits f09180659d Initialize TL Bundle on plugin start. 2014-05-06 07:00:57 +01:00
KHobbits c12373bf41 Remove '-' from valid account names again.
This could cause issues with NPC's converted to UUID before this version.
2014-05-05 22:46:46 +01:00
KHobbits 04666b66b4 Reload locale even if it is set to null. 2014-05-05 20:47:48 +01:00
KHobbits 363aee70d5 Better handle TL failover. 2014-05-05 14:48:25 +01:00
KHobbits 01d03d5d41 Update teleport timer to handle UUID rather than player names. 2014-05-05 13:01:20 +01:00
KHobbits 4575fc5aff Better handle corrupted chunks. 2014-05-04 19:39:35 +01:00
ElgarL 27e9e3aa88 Error in logic 2014-05-04 17:12:15 +01:00
ElgarL b0187698b9 Prevent players who have never logged in before from taking over existing accounts. 2014-05-04 16:22:58 +01:00
KHobbits 0364d4e0de Allow disabling userfile cache on uuid convert.
Add "ignore-userfiles-cache: true" to "upgrades-done.yml" to disable cache, forcing uuid lookup requests.
2014-05-04 13:25:20 +01:00
ElgarL 86b57804c6 Fix clones forgetting sub groups. 2014-05-04 12:50:22 +01:00
ElgarL 211dc220d8 Set a default mirror map if none is found in the config. 2014-05-04 12:50:21 +01:00
ElgarL aae586f79a Fix overloadedWorldHolder so it correctly calls the new WorldHolder code when the user is not overloaded. 2014-05-04 12:50:20 +01:00
ElgarL 32f49350cf Fixup javadocs 2014-05-04 12:50:18 +01:00
ElgarL 9739784e75 v2.1: - Update for CraftBukkit 1.7.8-R0.1(3050). - Add UUID support. Plugins can still query by player name but a UUID is faster and preferable. 2014-05-04 12:50:17 +01:00
ElgarL a0e93af758 Do not override higher level permissions with negations. 2014-05-04 12:50:16 +01:00
Necrodoom 81c6291338 Fix a /mangcheckp message 2014-05-04 12:50:15 +01:00
ElgarL 24509d60be Update mangcheckp to understand Exception nodes. 2014-05-04 12:50:14 +01:00
ElgarL f0947e9a7c Fix manucheckp to understand and report correctly on Exception nodes. 2014-05-04 12:50:13 +01:00
ElgarL 92bb4e0e66 Allow Exceptions in any inherited group to override negation of permissions. 2014-05-04 12:50:12 +01:00
Necrodoom 8f810ad447 Cleanup plugin description 2014-05-04 12:50:11 +01:00
ElgarL 3f35a6b59c Prevent adding sub groups for ranks the granting player doesn't have access to. 2014-05-04 12:50:09 +01:00
ElgarL 427dd714c9 Allow Exception permission to override negations when in the same group. 2014-05-04 12:50:08 +01:00
ElgarL 9d7a2043f7 Change to use LinkedHashSets to preserve ordering. Fixes an issue with populating bukkit perms in the wrong order. Fix wildcard negation in parent groups. 2014-05-04 12:50:07 +01:00
ElgarL ff3ec84b0d Fix Cyclic mirroring test (silly me) 2014-05-04 12:50:06 +01:00
ElgarL 1f9e72c5e2 Tidy imports 2014-05-04 12:50:05 +01:00
Necrodoom 67be18566c Improve Javadocs, clean ' strip checks, update changelog. 2014-05-04 12:50:04 +01:00
Necrodoom 862e71bc85 add recursive permission adding/removing
also other minor fixes
2014-05-04 12:50:03 +01:00
ElgarL 395655ba19 Check subgroup permissions with an equal priority so no one subgroup is higher ranked than another. 2014-05-04 12:50:02 +01:00
KHobbits 1bb569fff2 Fix attempting to spawn invalid items. 2014-04-30 05:41:42 +01:00
KHobbits e66ad88451 Skip npc's when doing cleanup. 2014-04-29 04:42:55 +01:00
KHobbits 3bf3093177 Better handle a write locked usermap.csv 2014-04-29 01:44:28 +01:00
KHobbits 5eb82add06 Run user dispose on another thread. 2014-04-28 23:12:35 +01:00
Corin Simpson-Bryars 8bd1a9f3bc Updating pom for vault
When deploying with Jenkins the build will fail due to there being no http://repo.ess3.net:8071/content/groups/public/net/milkbowl/vault/1.2.27 however there's a valid jar/dir for vault at http://repo.ess3.net:8071/content/groups/public/net/milkbowl/vault/Vault/1.2.32/
This will keep maven happy and the build not to error.
2014-04-28 00:52:06 +01:00
KHobbits 145d24c34c Fix /home for offline players. 2014-04-27 17:09:44 +01:00
KHobbits 229ff9f0e4 Update UUID mapping, if uuid for a username changes. 2014-04-27 01:35:52 +01:00
KHobbits 0557aa58b0 Switch AFK check to use UUID. 2014-04-27 01:10:44 +01:00
KHobbits b40aa43872 Delay uuidconversion for 10s and show warning.
UUID conversion should now better handle offline conversion.
2014-04-26 23:50:12 +01:00
KHobbits a1cdfa19b0 Fix time command exit statuses. 2014-04-24 10:24:35 +01:00
KHobbits d62b401db8 Skip empty user names on uuid conversion. 2014-04-22 18:07:02 +01:00
KHobbits 887957756e [Breaking] Fix ECO NPC's. This is a work around of CB's recent changes blocking invalid uuid lookups.
NPC's converted with the previous version will need manual changes.
2014-04-19 02:03:39 +01:00
KHobbits b6d6b24796 Only write to UUIDMap if the entry doesn't exist. 2014-04-18 06:48:14 +01:00
KHobbits b6c0871daa Format /seen account history list, optimize map loading. 2014-04-18 05:57:47 +01:00
KHobbits b080187808 Add previous account tracking to /seen 2014-04-18 04:48:34 +01:00
KHobbits 3c613fd59b Force CB 3050+ 2014-04-18 03:58:27 +01:00
KHobbits 547c6e4073 Fix offlineplayers with null names. 2014-04-17 06:09:08 +01:00
KHobbits 6098086a99 Optimize uuidmap writing, and use userConf write buffering. 2014-04-17 05:34:34 +01:00
KHobbits 87f90e9bdd Add progress status and /ess uuidconvert command for manual conversion. 2014-04-17 02:18:28 +01:00
KHobbits 65b1821196 Update Bukkit to 1.7.8-R0.1
Bukkit: 1922 CraftBukkit: 3050
2014-04-15 00:24:12 +01:00
KHobbits 756321d280 Add UUID mocking support, and fix tests. 2014-04-15 00:08:02 +01:00
KHobbits 3dbf69f163 Allow usermap to support legacy users, and restore ability to create user on first access, as well as server join. 2014-04-15 00:07:35 +01:00
KHobbits e8ace54036 Make eco npc methods use proper user config creation and resets. 2014-04-15 00:06:29 +01:00
KHobbits 22e1c14e7e Stop delayed writes from reversing user reset. 2014-04-15 00:05:56 +01:00
KHobbits cd38aeb544 Remove Ess object from FakeServer. 2014-04-14 00:03:07 +01:00
KHobbits 9e9409da1e Essentials UUID conversion. 2014-04-13 21:40:15 +01:00
KHobbits 36e580474f Converted emulated player class calls to use base class. 2014-04-13 01:01:49 +01:00
clou44 e007331581 Update items.csv
Added additional aliases for various flowers.
2014-04-10 23:31:05 +01:00
clou44 8d435ec86e Update items.csv
Added additional aliases for coal blocks.
2014-04-10 23:30:58 +01:00
KHobbits 214d64e4ad Update config.yml to reflect vanilla fallback no longer works. 2014-04-07 14:09:09 +01:00
KHobbits 737fadc390 Update Bukkit 1.7.5-R0.1
Bukkit 1919 CB: 3039
No UUID update yet.
2014-04-06 15:57:37 +01:00
KHobbits 10de6ac929 Cleanup 2014-04-06 15:44:37 +01:00
KHobbits fe9fbf585f Correctly handle line overflow in book pager
Fixes a bug with the last book pager tweak.
2014-04-05 15:33:38 +01:00
KHobbits af3f3fb4c7 Fix fly logic check (creative doesn't mean fly is enabled) 2014-03-31 03:26:48 +01:00
KHobbits 0e6a5240db Add chat configurables. 2014-03-30 15:50:32 +01:00
KHobbits f272a7ecd6 See if we can better handle book paging to fit more context on a line, without causing text loss after reaching character limit. 2014-03-29 16:07:32 +00:00
evonuts 104caea3c9 Minor phrasing fixes. 2014-03-26 22:08:37 +00:00
Matt Anthony 44fbd05df7 Add colors to a few TL keys. 2014-03-26 21:58:36 +00:00
KHobbits 6cfb5084e1 Add local echo to tempban command. 2014-03-26 20:08:38 +00:00
KHobbits ae1804758a Helpop should use broadcast method
Add local echo's to helpop and mute commands.
2014-03-26 20:06:01 +00:00
Necrodoom 4b470b32c5 Add socialspy wildcard support 2014-03-26 19:09:00 +00:00
Necrodoom cfe89dde17 Match /clearinventory multiple permission to /msg 2014-03-26 19:07:48 +00:00
Necrodoom 30dae51ddf Some messages fixes, and information addition. 2014-03-26 19:07:41 +00:00
KHobbits 0b11abf8f4 Revert "Do not allow a block with an Essentials Sign attached to it to be pulled with a sticky piston"
This reverts commit b673882b2f.
2014-03-26 15:14:40 +00:00
Chris Ward b673882b2f Do not allow a block with an Essentials Sign attached to it to be pulled with a sticky piston 2014-03-26 22:00:57 +11:00
KHobbits 200dbda6d3 Merge branch '2.x' of github.com:essentials/Essentials into 2.x 2014-03-23 18:14:21 +00:00
KHobbits 3538728733 Fix null teleport costs. 2014-03-23 18:12:33 +00:00
FearFree 5724c0c8df Future Java versions may not support _ as identifier. 2014-03-22 16:08:11 +11:00
KHobbits 0b5718f7ff Cleanup warp charging, to properly handle warp sign costs. 2014-03-19 00:01:47 +00:00
ElgarL c6b0dfaa4c Merge pull request #668 from necrodoom/patch-91
Fix messages
2014-03-12 15:41:53 +00:00
KHobbits 8fecd44786 Fix some /home errors with invalid data. 2014-03-09 17:59:07 +00:00
Dabo Ross 2ee590d85c Add IEssentialsSpawn class for API for Essentials Spawn with two methods, getSpawn(String) and setSpawn(String, Location).
Implement IEssentialsSpawn in EssentialsSpawn.
2014-03-09 17:31:36 +00:00
KHobbits b469439f7b Update translations from Crowdin
http://translate2.ess3.net/
2014-03-09 17:23:38 +00:00
Necrodoom a7d6e5440b Fix messages 2014-03-09 19:17:26 +02:00
Luke Anderson (stuntguy3000) 077074c855 Add missing language pointers 2014-03-09 17:14:09 +00:00
FearFree c59a204827 Remove op and replace with permission 2014-03-09 17:01:31 +00:00
KHobbits 1be30e4a0a Only enable teleport protection on plugin/command caused teleport events. 2014-03-09 01:13:41 +00:00
Dykam 28ec7c2d80 You can now access the old balance during the UserBalanceUpdateEvent Event 2014-03-04 19:44:55 +00:00
Kryptic Dot ee986768ce Cleaning up readme markdown 2014-03-04 19:29:47 +00:00
SkyBirdSoar de485b8d48 Fixed some grammatic errors, changed some sentences. 2014-03-04 19:26:16 +00:00
Zed Spencer-Milnes e443776dc1 Finish Sentence
# Setting to false means EssentialsAntiBuild will never prevent you from using.
->
# Setting to false means EssentialsAntiBuild will never prevent you from using items.

Am I glad to make such a profoud change to the source code.
2014-03-04 19:22:05 +00:00
Luke Anderson 859ffeaa0b Remove generated comments 2014-03-04 19:20:56 +00:00
KHobbits 545d706a70 Fix login death caused by built up fall damage using /fly. 2014-03-03 21:24:00 +00:00
KHobbits 9ec0ca25a5 User loading cleanup 2014-03-03 09:01:07 +00:00
KHobbits b0e165546e Round to gc output to 2 dp. 2014-03-03 08:34:43 +00:00
KHobbits 470f4c1b3e Constant user file casing. 2014-02-27 01:55:04 +00:00
KHobbits 3b35763fef Fix warp sign costs. 2014-02-25 07:09:32 +00:00
KHobbits 2d5c1fd51c Fix safety tp check above world height
Performance tweak to fly check
2014-02-23 17:41:25 +00:00
KHobbits 088c54e386 Fix customtext copy 2014-02-19 03:28:28 +00:00
KHobbits e409363426 Alternative implementation of unsafe enchant blocking for signs.
Permission: essentials.signs.enchant.allowunsafe - required to add unsafe enchants using enchant signs.
This reverts commit 3f2c2aadbb.
2014-02-19 01:18:40 +00:00
KHobbits 34599b7428 Fix projectiles compiling. 2014-02-19 00:58:20 +00:00
KHobbits 53c1c8a8b7 Update Bukkit to 1.7.3-R0.3 - Bukkit: 1903 CB: 3020
This also disables vanilla fallback, use new aliases file.
2014-02-19 00:36:54 +00:00
snowleo 3f2c2aadbb Split unsafe enchantments in kits to a new config option 2014-02-18 23:47:18 +01:00
KHobbits a1a190bb02 Merge branch '2.x' of github.com:essentials/Essentials into 2.x 2014-02-16 01:15:25 +00:00
KHobbits 6744b652e6 Use the absolute radius value. 2014-02-16 01:15:01 +00:00
Chris Ward 11b308cc8c Update repository URLs 2014-02-15 14:23:30 +11:00
KHobbits c50f559512 Allow sending customtext chapters as a parameter instead of reading commandLabel 2014-02-13 22:52:14 +00:00
KHobbits 98bee40bf7 Fix Stripping/blocking of urls containing caps. 2014-02-12 01:20:54 +00:00
Iaccidentally 970d342a60 Merge pull request #657 from evonuts/2.x
Fix spelling error (atleast) in translation files.
2014-02-11 02:27:10 -05:00
evonuts 2500c9af90 Fix spelling error (atleast) in translation files. 2014-02-11 20:15:14 +13:00
KHobbits fa765d3077 Fix world argument to ignore radius, and allow for skipping radius param in syntax. 2014-02-09 22:26:54 +00:00
KHobbits 9bc8f287a4 Fix ghost items with /recipe 2014-02-09 21:54:04 +00:00
Necrodoom 5e6ce8aecb Reorder ID 376 2014-02-09 21:37:03 +00:00
KHobbits 6174e4a98b Code cleanup and remove remote skull edit. 2014-02-08 01:23:54 +00:00
Luke Anderson (stuntguy3000) 5c74af42a3 Add /skull command 2014-02-08 00:25:34 +00:00
coegho ce48f2f326 [Fix] fireball-fire=true now prevents fire spread from fireballs 2014-02-08 00:22:56 +00:00
Necrodoom 2affce875c Restore 2 aliases 2014-02-08 00:16:11 +00:00
Necrodoom 52c8ebc61f Fix duplicates, a few more aliases addition/remove 2014-02-08 00:16:11 +00:00
KHobbits a9249deea7 Reformat pom 2014-02-08 00:13:46 +00:00
KHobbits d99c35cc35 Add bow as a skeleton keyword 2014-02-06 02:35:27 +00:00
Iaccidentally 518650e842 Modifier order consistency 2014-02-04 11:11:43 -05:00
KHobbits 20ff61909f Readme tweak. 2014-02-04 01:17:06 +00:00
KHobbits f0e4e8c5ba Add support for vanilla item names from api. 2014-02-02 19:04:09 +00:00
KHobbits 63300866f9 Fixed argument count for meta parsing. 2014-02-02 18:56:45 +00:00
KHobbits c8212371ff Allow the Essentials module to compile again. 2014-02-02 18:19:29 +00:00
KHobbits 0a6a79115a Raise minimum CB version to 2922 or 1.7.2-R0.1
This should prevent issued caused by UUID mismatch.
2014-02-02 17:13:44 +00:00
KHobbits 6798615507 Track UUID for future use. 2014-02-02 17:05:41 +00:00
KHobbits 016b39726c Restore teleporting to middle of block, when flying and unsafe is enabled. 2014-02-02 16:43:31 +00:00
KHobbits 882ebae257 [Breaking] Add exception when players have exceeded their account limit.
This might effect some plugins which hook Essentials for economy without using the API
2014-02-02 16:07:32 +00:00
KHobbits 161862bc53 Make sure we leave any vehicles before teleporting. 2014-02-02 15:04:07 +00:00
Iaccidentally 18b31a7e50 [FIX] Print a proper error when using tpaccept with no requester 2014-02-01 16:49:54 -05:00
Chris Ward 5b5be164b6 Allow the use of non-development Bukkit builds at runtime
Unsafe code is surrounded by sufficient handling
2014-01-30 10:43:26 +11:00
Chris Ward 466b4ae7c5 Restore Bukkit dependency to parent pom 2014-01-30 10:34:16 +11:00
KHobbits e7c468b20d Attempt to fix client issue with speed reset on world change. 2014-01-26 22:33:56 +00:00
KHobbits b9d09dd7b0 Make /speed persist on world change if permissions exist. 2014-01-26 20:00:41 +00:00
KHobbits 1c035457bb Force Bukkit version to match deps. 2014-01-25 23:29:48 +00:00
KHobbits 5070f15810 Use OSX character split on internal sign interface 2014-01-25 22:55:28 +00:00
Necrodoom c8faf03f5b Fix cauldron ID 2014-01-25 22:46:26 +00:00
Necrodoom 915cb51d1a Trim items.csv based on feedback 2014-01-25 22:46:25 +00:00
snowleo 52c3169a3c Read backup output async 2014-01-25 15:33:33 +01:00
Chris Ward 32b118d3c0 Add fullstops for @Necrodoom 2014-01-21 12:20:24 +11:00
Chris Ward 9ce1158aeb Add support for vanilla JSON metadata syntax (/give, /i, /kit, etc.) 2014-01-21 00:54:48 +11:00
Chris Ward 839bfe0c2e Update to Bukkit Development Builds
Change things so unit testing can run after Bukkit's breaking commit with classloader stuff
2014-01-20 21:20:13 +11:00
KHobbits f39ef36115 Fix hidden groups in /list 2014-01-14 21:55:30 +00:00
KHobbits eee18f40be Pass optional location parameters to teleport TL keys. 2014-01-12 01:23:12 +00:00
KHobbits 4084445b5b Config description cleanup. 2014-01-11 17:34:35 +00:00
Adam 8c882a5268 Reset Exhaustion on /feed 2014-01-08 01:07:38 +00:00
Chris Ward 3b0e86ae67 Add an upload-only pom file for GroupManager 2014-01-06 10:03:22 +11:00
KHobbits 3fecd3138d Check command cost, before running kit delay check, prevent accidentally delaying unran commands. 2014-01-03 08:16:17 +00:00
KHobbits d48c02021d Add and implement sign break/create/interact events to EssAPI
Implement AfkStatusChangeEvent
2013-12-31 17:47:52 +00:00
KHobbits 0b71b6e93d Remove redundant permission check. 2013-12-31 04:44:28 +00:00
KHobbits 99d25bfaea Fix NB parent compiling 2013-12-28 23:09:56 +00:00
KHobbits 46691871ad Add permission: essentials.msg.multiple and essentials.pay.multiple
Message permission will allow rough nick matches and wildcards, while pay will only allow wildcards.
2013-12-28 22:37:36 +00:00
Chris Ward 58440dd594 Add deploy plugin 2013-12-29 03:04:36 +11:00
Chris Ward 12c96e21b9 Use the Essentials Maven repository 2013-12-29 00:21:26 +11:00
Chris Ward 1d791fb110 Remove Ant, migrate Netbeans code style to pom.xml 2013-12-27 03:47:13 +11:00
Chris Ward 0384ac5d42 Travis - use Maven to build 2013-12-26 01:19:51 +11:00
SkyBirdSoar def1569fcc Add aliases to stationary water & stationary lava
New changes:
stillwater is an alias to 9:0 (Stationary water)
stilllava is an alias to 11:0 (Stationary lava)
2013-12-26 01:17:42 +11:00
Chris Ward 7d7e87e63a Pull geoip library from Maven 2013-12-26 01:12:04 +11:00
Chris Ward 8b26c7fc84 Use Ant to replace GroupManager's plugin.yml version 2013-12-22 19:21:19 +11:00
KHobbits 3017d2a7f4 Better matching of zombie and skeleton mobdata to avoid confusion. 2013-12-22 00:12:22 +00:00
KHobbits 23d2ffb134 Add {4} to homeSet TL key, this contains the name of the home being set. 2013-12-21 23:30:12 +00:00
KHobbits ad2f446602 Check command cost permissions prior to teleporting. Fixes ESS-4918 2013-12-21 23:19:58 +00:00
KHobbits bcd5350a4d Add extra /home message TL params
{1} = current home count
{2} = max home count
2013-12-21 17:42:55 +00:00
KHobbits b6b2ee61a4 Don't check for default worth durability if more than one durability price is defined.
This also adds support for '*' durability matching 'other'.
2013-12-21 03:33:27 +00:00
KHobbits 6362dbd5b3 Restore CB to lib folder 2013-12-21 02:39:26 +00:00
Chris Ward ee55584117 Use Bukkit beta build 2013-12-18 17:26:01 +11:00
KHobbits e5b522ed14 Try changing the config file home language up a little bit. 2013-12-17 19:23:28 +00:00
Necrodoom df219db1a4 fix gcWorld in de locale 2013-12-15 12:49:06 -06:00
Necrodoom f8e273767e Add cobweb aliases 2013-12-13 09:23:29 -06:00
Chris Ward 1bfab68932 Change teleport safety checks to use less expensive methods. 2013-12-13 19:41:57 +11:00
KHobbits 901b835ae0 Alter teleport cancel message to reflect config option. 2013-12-13 08:15:28 +00:00
Joshua Popoff 7d8d9d8959 Add the ability to disable teleport safety. Requested by a few people - teleport safety isn't always a good thing for some servers. Request is cancelled if not safe. 2013-12-13 17:07:26 +11:00
Chris Ward b70b58660f Remove Javadocs from the default compile, use the javadoc:javadoc goal to generate them. 2013-12-11 21:50:06 +11:00
Chris Ward 18a6d1761a Merge pull request #609 from Skylexia/patch-1
Fixed all the salmon.
2013-12-10 18:46:51 -08:00
Skylexia 9a197d65a3 Fixed all the salmon. 2013-12-10 20:42:56 -05:00
Iaccidentally b68e451c13 Merge pull request #607 from necrodoom/patch-67
Add new baked potato aliases - thanks clou44
2013-12-08 09:45:16 -08:00
Necrodoom 11949a4315 Add new baked potato aliases - thanks clou44 2013-12-08 19:44:14 +02:00
Chris Ward f52858d058 Strip all Mac OSX characters
Temporary workaround awaiting PR from Bukkit
2013-12-08 20:40:10 +11:00
md-5 90fc19cc7b Fix formatting from last commit 2013-12-08 17:00:53 +11:00
md_5 ddb1f76a26 Strip weird sign chars sent by OSX due to client bug 2013-12-08 16:57:44 +11:00
KHobbits 2584e0ab06 Update config.yml to reflect recent custom message settings. 2013-12-08 04:46:33 +00:00
KHobbits 5dbf4f5a00 Make it so both {world} and {worldname} work for both keyword parsers. 2013-12-07 23:58:47 +00:00
KHobbits af02a28ce5 Update Bukkit
Bukkit: #1859 CB: #2943
2013-12-07 22:26:41 +00:00
Necrodoom 5e9f5904fd Ignore empty chat events generated by plugins 2013-12-07 22:15:01 +00:00
KHobbits 946051de71 Add support for adding item meta to [free] signs.
Fix NPE on [sign] creation.
2013-12-07 20:25:23 +00:00
KHobbits 427b97433e Logger cleanup pt 1. 2013-12-07 20:03:05 +00:00
KHobbits f3b005e331 Cleanup /remove ingame syntax 2013-12-07 19:17:36 +00:00
KHobbits 5b64c31e86 Show warning when invalid mob type is specified for /remove 2013-12-07 19:03:29 +00:00
KHobbits 723e458a81 Remove requires at least one argument. 2013-12-07 18:46:25 +00:00
Chris Ward 309273dc6b Fix issue in login messages
Message wouldn't be displayed if silent join is enabled and custom is disabled. Probably.
2013-12-07 14:24:39 +11:00
Chris Ward d40e331c8a Disable the login message hooks automatically 2013-12-07 14:20:51 +11:00
Chris Ward c57e902173 Fix login messages 2013-12-07 13:44:41 +11:00
Chris Ward e864696b00 Revert "Fixed bug when logging in silently"
This reverts commit 5fe19dbd83.
2013-12-07 13:24:48 +11:00
Iaccidentally fed250fd74 Merge pull request #605 from Phryxiil/2.x
Fixed bug when logging in silently
2013-12-06 18:17:06 -08:00
Zarubinator 5fe19dbd83 Fixed bug when logging in silently 2013-12-06 21:15:27 -05:00
Chris Ward b836b3c041 Who doesn't love a good ol' NPE 2013-12-06 19:01:37 +11:00
Necrodoom 9550ef2a0d Fix glass pane IDs
remove duplicates in items.csv (thanks .itemdbparse)
2013-12-05 23:09:35 +00:00
Chris Ward bac26f966c Cleanup join/quit messages. 2013-12-05 23:08:29 +00:00
Chris Ward 278bb98649 Fix custom join messages Removes double message, adds colour codes and placeholders for the user's name. 2013-12-05 23:08:28 +00:00
TheReverend403 3839b6f1f5 Code cleanup 2013-12-05 23:06:04 +00:00
Necrodoom c0a58a5316 Update items.csv to 1.7.2 (beta file version) 2013-12-05 23:03:34 +00:00
KHobbits de7c2be960 Updated translations from crowdin 2013-12-05 23:03:34 +00:00
KHobbits c57c791e69 Cache join/quit messages. 2013-12-05 23:03:33 +00:00
Iaccidentally 1ae2b094f3 Add options to disable join/quit messages and custom join/quit messages 2013-12-05 23:03:33 +00:00
KHobbits dde8cd8f72 Merge remove and killall command, thanks to @Evonuts and @Iaccidentally. 2013-12-05 23:03:33 +00:00
Adam b3bad6a35a Add a title to [Disposal] and [Free] sign inventory 2013-12-05 23:03:33 +00:00
Chris Ward 25e4096a12 Update FakeServer - fixes compilation 2013-12-05 23:03:33 +00:00
KHobbits e411f61296 Update to first build of 1.7.2 - CraftBukkit is still buggy so expect issues
Bukkit: #1856 CB: #2922
2013-12-05 23:03:32 +00:00
iBo3oF caa3ac88aa Add Balance Update Event. 2013-12-05 23:03:31 +00:00
KHobbits f677d6a411 Tidy up string manipulation in trade signs. 2013-12-05 23:03:31 +00:00
KHobbits 4232216f76 Try to be a little less confusing with non-command debug errors. 2013-12-05 23:03:31 +00:00
KHobbits beef371ae6 Adding saddles to horses should properly tame horses. 2013-12-05 23:03:31 +00:00
Necrodoom 872df26e9d Do not block user damaging self (ender eye) 2013-11-17 19:19:42 +02:00
Joseph Jenniges 8146858ee0 Fix logic error with /kickall in console 2013-11-17 10:04:36 -06:00
snowleo 9b4e6e5dc6 Fix fromIndex = -20 2013-11-15 20:06:16 +01:00
KHobbits 53b1526906 Throw meaningful warnings when wrong Essentials version is used with unsupported mod packs. 2013-11-15 00:22:10 +00:00
Iaccidentally 82be7546d5 Tidy up Commandremove a bit, thanks to Evonuts 2013-11-10 23:25:42 +00:00
Iaccidentally f400f81e4d Add more functionality to the remove command. This now overlaps some functionality of the killall command, which should eventually be merged into this command and removed. new options: hostile, monsters, passive, animals, ambient, mobs, entities 2013-11-10 23:25:34 +00:00
KHobbits 5d1ea4aa88 Allow ignore to block tpahere requests. 2013-11-09 04:08:25 +00:00
KHobbits 7f8d62be02 Add a couple more enchant aliases for blast protection 2013-11-09 03:40:51 +00:00
Iaccidentally 3e725ef060 Cleanup various aspects of code, fix some formatting, more netbeans 7.4 stuff 2013-11-06 21:22:32 -05:00
Iaccidentally d5196e31b2 Add ability to supress join/leave messages :: new permissions: essentials.silentjoin & essentials.silentquit 2013-11-06 18:05:02 -05:00
Iaccidentally 235f134514 netbeans 7.4 stuff 2013-11-06 18:03:46 -05:00
KHobbits 6af1b923cc Update Bukkit and Craftbukkit jar files for stable 1.6.4
Bukkit: 1848 Craftbukkit: 2912
2013-10-28 00:29:01 +00:00
KHobbits 365888a8f9 Update Translation files from Crowdin:
http://translate2.ess3.net/
2013-10-28 00:21:41 +00:00
FearFree b8f5c9a8e4 Update for consistency.
Signed-off-by: KHobbits <rob@khobbits.co.uk>
2013-10-28 00:10:35 +00:00
FearFree ae89c80d4e Clarify no perm msgs for missing .offline perms
Signed-off-by: KHobbits <rob@khobbits.co.uk>
2013-10-28 00:10:33 +00:00
KHobbits 7436009ea4 Clarify message when ignoring exempt players. 2013-10-27 23:53:24 +00:00
Chris Ward 84ce3d39d8 Fix automatic versioning when compiling with Maven 2013-10-21 13:50:17 +11:00
KHobbits 9aa88bdf8d Add a little more group based debugging. 2013-10-21 01:20:09 +01:00
KHobbits f36f5ec0ce Add debug log entry when checking permission groups. 2013-10-20 17:45:37 +01:00
KHobbits b1d422ba8f Round up Y position when standing on half blocks. This should address some safelogin bugs. 2013-10-20 02:25:11 +01:00
KHobbits 049577c97e Restore deleted craftbukkit jar 2013-10-20 01:36:22 +01:00
KHobbits 92a9673652 Restore original give/take Money API 2013-10-19 12:26:28 +01:00
Chris Ward 1164bbd90d [Fix] Allow someone to change their nick to different case of the same thing 2013-10-19 12:19:40 +01:00
Chris Ward 4ea629628d Use a player's real name in /balance if they are vanished 2013-10-19 12:19:40 +01:00
Chris Ward 3e9a2377a8 Call Ant from Maven (for GM) 2013-10-19 12:19:40 +01:00
Chris Ward 48261daf89 Fix null pointer exception on kits with meta 2013-10-19 12:19:39 +01:00
Chris Ward 97d176ea27 Make looping commands see vanished players properly
Make /r check player existence in the correct order
2013-10-19 12:19:39 +01:00
Chris Ward e25e02d154 Add Maven Support 2013-10-19 12:19:39 +01:00
Chris Ward 50a9b5718c Fix double messages in targeted commands 2013-10-19 12:19:37 +01:00
Chris Ward 2615468a08 Remove .idea and *.iml from git 2013-10-18 17:32:47 +11:00
Chris Ward 298e677373 Fix /r 2013-10-18 17:23:27 +11:00
KHobbits 64e089e15b Cleanup 2013-10-18 00:07:35 +01:00
KHobbits be31b1695d Restore getUser API 2013-10-18 00:07:34 +01:00
KHobbits 6f85761f7f Extract CommandSender to CommandSource, this should prevent Ess user object leaks. 2013-10-16 21:05:33 +01:00
KHobbits cf9d79d24c Strip nickname prefix when doing displayname comparison. 2013-10-16 20:54:23 +01:00
Iaccidentally f53240191f Cleanup XMPP PR 2013-10-16 20:53:30 +01:00
patjense 27ee587887 add delayed task for XMPP presence update 2013-10-16 20:52:50 +01:00
patjense 601bdbff46 add XMPP presence management stack 2013-10-16 20:52:50 +01:00
patjense 12bf4e9dcf add update for global presence handler 2013-10-16 20:52:50 +01:00
KHobbits 59b501b2b1 Clean Imports 2013-10-11 03:44:41 +01:00
KHobbits 9e20f556e1 Allow for event based test cases. 2013-10-11 03:34:41 +01:00
Iaccidentally 375caa6f9e implement GodStatusChangeEvent 2013-10-11 03:14:51 +01:00
KHobbits cc34c02623 Update README.markdown 2013-10-07 01:34:42 +01:00
KHobbits cfa367dfc3 Allow recolouring own name. 2013-10-05 05:34:33 +01:00
KHobbits e1ff3542ae Cleanup 2013-10-05 03:27:40 +01:00
KHobbits 4951c204d2 Improve nick validation
Now matches nicks against userdata for conflicts
Now checks for empty string nicknames
2013-10-05 02:31:19 +01:00
KHobbits 122232a0e7 Add more API template and implement nick change event. 2013-10-05 02:11:39 +01:00
KHobbits 03368e45df Extract user match looping 2013-09-28 21:33:22 +01:00
Luke GB e6b76cadbc Adds even more clarification to metrics opt-out 2013-09-25 00:22:11 +01:00
TheReverend403 06e3d33845 Adds clarification to metrics opt-out 2013-09-25 00:18:43 +01:00
drtshock e853199d90 Format to the format with the formatter. 2013-09-24 09:38:30 +01:00
drtshock f7f7c2a68b Ignore list and no tpa to self. Fixes ESS-4456 ESS-4711
List users that you ignore when no arguments are given. Otherwise state
that no players are ignored.

Don't allow users to tpa or tpahere themself. This is a problem with
people "glitching" with how essentials finds a safe location to get
inside of places they shouldn't.
2013-09-24 09:38:29 +01:00
Iaccidentally 99c73f3d67 Update to 1.6.4 2013-09-19 21:38:15 -04:00
Chris Ward 6094485992 Cleanup 2013-09-18 22:22:56 +10:00
GunfighterJ 503d39ee55 Update ItemStack reference to getTypeId() 2013-09-17 23:23:45 +10:00
Chris Ward bd5fd2980f Require latest Bukkit RB 2013-09-17 21:08:20 +10:00
GunfighterJ a49895278b Push latest Bukkit RB 2013-09-17 06:06:34 -05:00
GunfighterJ 8d739d6a76 Fix translation typo 2013-09-15 16:43:16 -05:00
KHobbits 3963a528b3 Fix handling max warp pages. 2013-09-10 01:42:11 +01:00
KHobbits 7c686b4b58 Fix case sensitivity on {PLAYERLIST:group} 2013-09-06 23:54:37 +01:00
KHobbits 0a17489c9c Clarify kit errors 2013-09-05 15:40:43 +01:00
KHobbits 0926da3782 Expose other plugins ban masks. 2013-09-04 07:19:30 +01:00
KHobbits c056ba0059 Properly handle negative /clear amounts. 2013-09-04 06:35:53 +01:00
KHobbits df5d9a4db8 Reimplement 'private' keywords. 2013-09-01 00:24:11 +01:00
KHobbits 36c61eaa06 New enum cached, lazy generated KeywordReplacer
This runs before the pager, so keywords on other pages will still be parsed.
2013-08-31 23:11:08 +01:00
Pocketkid2 9908eb0619 Use Tamed instead of horse/ocelot/wolf 2013-08-31 19:36:41 +01:00
KHobbits 64743ef428 Add support for coloured authors on books
Fixes ESS-4690
2013-08-31 13:20:36 +01:00
KHobbits 2973b1335c Add debug output to keyword replacer 2013-08-30 13:37:49 +01:00
KHobbits 52e9cc6ba1 This tp req cancel isn't needed anymore. 2013-08-30 11:05:27 +01:00
KHobbits 62b4348842 Don't waste cpu on /baltop if eco is disabled. 2013-08-28 18:00:27 +01:00
KHobbits eca3be5cf3 Extend eco disable option to block eco lookups. This can be required to combat slow SQL economies.
This option is not recommended under normal circumstances.
2013-08-28 17:50:28 +01:00
KHobbits 3fb4d1f3bf Don't allow buying partial item sets via trade signs. 2013-08-28 13:42:08 +01:00
KHobbits f96359e31c Add another customtext example (including one with multiple aliases) 2013-08-20 23:43:40 +01:00
KHobbits cf79daddde Add support for {PLAYERLIST:GROUP} AND {PLAYERLIST:GROUP:<none>}
Replace <none> with what you want to show if there are no players from that group online.
2013-08-20 23:39:34 +01:00
Chris Ward ed007589f3 Add COORDS, UPTIME and TPS keywords 2013-08-20 22:14:29 +10:00
KHobbits b85aaea039 More colour. 2013-08-20 01:51:32 +01:00
KHobbits 3a4e4c59e4 Refresh default motd. 2013-08-19 22:00:30 +01:00
KHobbits 7f27de4bb7 Fix text file color code escaping (&&6 -> &6) Add support for color escaping in ingame chat Other formatting class cleanup 2013-08-19 21:37:44 +01:00
KHobbits a06a81c15d New command /customtext - This command is intended to be used with bukkit.yml aliases to make custom commands. 2013-08-19 21:37:33 +01:00
KHobbits a29e1bfe51 Add support for multiple bookmarks/chapter names
Clean up info file handling
2013-08-19 00:13:49 +01:00
KHobbits 3ccefb49c0 Fix tests 2013-08-18 22:48:13 +01:00
KHobbits 543672a2a8 Reset fall distance when toggling fly so fall damage is not accidentally applied. 2013-08-18 22:43:43 +01:00
KHobbits 8cba8da516 Fix a few issues with /list and group formatting. 2013-08-18 22:08:57 +01:00
KHobbits 3b8df2d18e Fix feed cooldown bypass permission:
Permission: essentials.feed.cooldown.bypass
2013-08-18 21:05:45 +01:00
KHobbits b8cdd7d1f7 Fix NPE in /kill when used from console. Thanks Necrodoom 2013-08-18 21:04:19 +01:00
KHobbits 92a2244650 Add muting offline players
Permission: essentials.mute.offline
2013-08-18 21:02:47 +01:00
KHobbits 75fe543579 Allow alternative command handler to also pass tab complete. 2013-08-15 21:58:23 +01:00
Necrodoom 7bc84d6cad items.csv - try move the most common item alias to top of aliases stack
without ore aliases remove
2013-08-15 21:37:55 +01:00
KHobbits 2928e8a99f Use essentials itemdb for charge messages. 2013-08-15 05:47:23 +01:00
KHobbits ffae86dd42 Use user object to send messages when possible. 2013-08-15 01:53:22 +01:00
KHobbits ff41588c3b Gracefully handle botched plugin starts 2013-08-13 23:41:54 +01:00
KHobbits 66eb9202ce Fix mail sendall from console skipping first param 2013-08-13 22:01:13 +01:00
Necrodoom f17ad2c4e7 fix config comment at heal-cooldown 2013-08-13 18:16:40 +01:00
Pocketkid2 794dd788a3 Update Commandremove.java
Fix class checking in /remove
2013-08-13 18:14:40 +01:00
Necrodoom b3cae17cab trim and replace spaces in chapter names to always work in commands 2013-08-13 18:07:27 +01:00
KHobbits 1ac5b4230e Teleport cleanup 2013-08-13 18:06:24 +01:00
GunfighterJ a3cae43f9f Fix NPE in /back when no previous location exists 2013-08-13 11:46:52 -05:00
KHobbits d329d27a4f Restore safe location for /top 2013-08-13 00:55:31 +01:00
KHobbits e9c0bd3bab Prevent inf loop when adding air to kits.
Should fix #4555
2013-08-12 00:26:51 +01:00
KHobbits c43574eab9 Fully support numerical worth yml data. 2013-08-11 23:43:45 +01:00
KHobbits 09e8b87650 When in fly+god mode or when in creative mode, don't use safe teleport location when teleporting to other players.
Enable fly in unsafe circumstances.
This only works when teleporting within worlds for permission reasons.
2013-08-11 22:42:29 +01:00
KHobbits ee05bf371d Update plugin.yml and add some aliases (Evonuts is going to hate me) 2013-08-11 22:10:56 +01:00
KHobbits fb9fc579d0 Allow toggling vanish for other players
Permission: essentials.vanish.others
2013-08-11 21:48:30 +01:00
KHobbits 8b11b870b1 General cleanup.
Add optional TL param for tempban/mute time in notify message
2013-08-11 21:34:26 +01:00
KHobbits 7401608cc5 The /tpahere command now stores the location of 'here' rather than using the current players location.
Cleanup teleport logic - This also fixes exploiting /tpahere to get accesses to restricted areas.
2013-08-11 16:37:21 +01:00
KHobbits 4cfa3fc3a2 Update Mob.java 2013-08-09 04:38:57 +01:00
Necrodoom 0d9db22d81 display syntax if more than one argument to avoid confusion with command purpose
more clearly, show syntax when people try to do /money give playername amount
2013-08-05 16:04:28 +01:00
KHobbits cc1ae2c243 Update Bukkit for 1.6.2R0.1 beta
CB: 2838 Bukkit: 2252
2013-08-05 04:15:26 +01:00
KHobbits 53faf70d10 Update Translations from crowdin 2013-08-05 00:19:44 +01:00
KHobbits 4d87033771 Force space after group in /list 2013-08-04 23:39:56 +01:00
GunfighterJ b08aaec6c0 Remove duplicate key 2013-08-04 12:53:46 -05:00
Pocketkid2 152cf98a9d Update Potions.java
Add extra alias
2013-08-04 11:38:48 -05:00
KHobbits 12cd467277 More missing syntax. 2013-08-03 02:48:50 +01:00
KHobbits bb7c8c308d Add missing command syntax for /spawnmob 2013-08-03 02:25:42 +01:00
Pocketkid2 c15540862d Update Commandkillall.java
Add support for horses
2013-07-29 21:40:52 +10:00
KHobbits ddc8c07cd7 Restore vault compat 2013-07-26 00:11:37 +01:00
Iaccidentally 0ef4dfd453 Merge pull request #524 from necrodoom/patch-40
fix mobdata typo
2013-07-25 10:51:08 -07:00
Necrodoom f50feedabb fix mobdata typo 2013-07-25 16:44:48 +02:00
GunfighterJ eb22254564 Close inventories before opening any others 2013-07-24 16:01:17 -05:00
KHobbits 3cfde70ec6 Use the correct name in /sethome if you don't have sethome.others permission. 2013-07-23 23:39:44 +01:00
KHobbits f251c9e694 Restore deprecated trade api
Fixes #4500
2013-07-23 22:48:32 +01:00
KHobbits 298da19334 Fix max radius. 2013-07-21 00:04:04 +01:00
okamosy e3c83be37e Refactored and cleaned up SpawnMob. Added context-aware help /spawnmob <mob>: 2013-07-20 21:29:13 +01:00
KHobbits c1e39c7007 Show if a IP is ip-banned on /seen <ip> 2013-07-19 02:25:50 +01:00
KHobbits 59515aed94 Cleanup worth and sell messages 2013-07-19 00:55:21 +01:00
snowleo 4eef8b5e84 Can't sell negative amount of items. 2013-07-19 01:01:52 +02:00
okamosy 8aac502ab6 Added horse armor /spawnmob horse:armor<iron|gold|diamond> 2013-07-17 23:32:25 +01:00
okamosy 3aca9f793b Added saddles to pigs and horses /spawnmob pig:saddle /spawnmob horse:saddle 2013-07-17 23:31:37 +01:00
KHobbits 4483ff40b4 Log notice when chat ignore is blocked by another plugin. 2013-07-17 23:26:26 +01:00
KHobbits e8d9951ee8 Add scaling object cap for usermap, prevent huge memory usage, also config file configurable. 2013-07-17 01:56:27 +01:00
okamosy bf675b230e Added horses to SpawnMob /spawnmob horse:<color><variant><style><chest> 2013-07-16 23:36:11 +01:00
KHobbits ba6fd95247 Fix radius logic 2013-07-15 23:15:35 +01:00
Necrodoom 419f51636a Max near radius 2013-07-15 23:10:55 +01:00
KHobbits f6f71126a1 Add missing param in /remove 2013-07-15 02:43:23 +01:00
KHobbits 1f3e52a4b9 Better handle esschat/GM reloading during async events. 2013-07-15 00:47:17 +01:00
KHobbits 0bfe1ec1de Update Craftbukkit
CB: 2814 Bukkit: 1792
2013-07-14 22:27:57 +01:00
KHobbits 00463a7899 Try to restore basic api functionality 2013-07-14 13:00:03 +01:00
KHobbits 11f87eccb0 Tidy and slightly expand user API 2013-07-14 12:41:27 +01:00
KHobbits 0d2dea41e3 Fix worth display bug 2013-07-14 12:09:49 +01:00
KHobbits 8009c1539a Fix local chat spy tag order. 2013-07-14 01:20:36 +01:00
KHobbits 29ea24f715 Throw syntax error instead of "For input string" 2013-07-14 01:07:59 +01:00
KHobbits a14104c529 Add support for /worth all and /worth hand 2013-07-14 01:03:08 +01:00
KHobbits d044ba2fb9 Whoops, wrong event. 2013-07-13 18:56:18 +01:00
KHobbits 5eb3d9fa42 Wrap ItemDb accessors and move Item string matching to itemdb class. 2013-07-13 18:52:53 +01:00
KHobbits fc63f63de6 Fix local message when no players are in the area
Allow any translation key to be silenced by blanking it in locale file
2013-07-13 18:46:26 +01:00
Iaccidentally cd51d718ba [API] flip! (╯°□°)╯︵ ┻━┻ 2013-07-13 13:40:46 -04:00
Iaccidentally 200ad81862 [API] fix implementation? 2013-07-13 12:52:08 -04:00
Iaccidentally c05ad0458f Merge branch 'API' of https://github.com/essentials/Essentials into API 2013-07-13 12:41:31 -04:00
Iaccidentally ecd2484cb9 [API] fix other modules to use new packages 2013-07-13 12:40:50 -04:00
KHobbits 43c2c02336 Fix failing XMPP build. 2013-07-13 17:36:35 +01:00
KHobbits adb5189d42 Add 'No one listening' message stub, will be empty by default and thus not sent. 2013-07-13 17:31:14 +01:00
KHobbits ef3b052c64 Remove old chat hook
Use Bukkit API for local chat handling
Implement localChatSpy event
2013-07-13 17:25:58 +01:00
Iaccidentally f5624d4cb6 [API] remove setters 2013-07-13 11:53:52 -04:00
Iaccidentally 624f7ab9f6 [API] Event framework 2013-07-13 11:48:05 -04:00
Iaccidentally dad348d3d0 [API] Move 2.x API to new package, create dummy classes for compatibility 2013-07-13 11:14:39 -04:00
Iaccidentally 3d0f0062a9 Merge branch '2.x' of https://github.com/essentials/Essentials into API 2013-07-13 10:38:28 -04:00
Necrodoom ab359f678a fix mute message when chatting
deny /mail if muted
2013-07-12 15:22:48 +01:00
GunfighterJ 406c9e807e Add horse to entity spawn protection blacklist 2013-07-11 12:37:09 -05:00
KHobbits d858555263 Don't cast sender to User. 2013-07-11 09:20:52 +01:00
KHobbits 72fd893733 Prevent speed from hitting absolute zero. 2013-07-11 08:58:22 +01:00
KHobbits 9f015c1bda Update TL files from Crowdin, this commit resets untranslated English to new colour scheme. 2013-07-10 22:36:27 +01:00
KHobbits 61ed77b60c Remove unused TL Keys 2013-07-10 22:14:23 +01:00
Iaccidentally e57aa0e088 tweak default setting for max nick length 2013-07-10 11:01:49 -04:00
Iaccidentally 2ad346e84c [FEATURE] Add configurable max nick length 2013-07-10 10:48:14 -04:00
KHobbits aa65a2b349 Update CB to 2808 2013-07-10 00:09:48 +01:00
KHobbits 499a1aee7f Fix TL handling with escaped ' marks. 2013-07-10 00:03:14 +01:00
KHobbits 3377e3483d Fix user comparison. 2013-07-09 09:08:26 +01:00
GunfighterJ 427d8cc4e0 Implement abstract methods 2013-07-08 19:28:24 -05:00
GunfighterJ 4e9a42671f Update to 1.6.2, adds new potion effect types 2013-07-08 19:22:38 -05:00
KHobbits a369f9aabb Standardize translation formatting. 2013-07-07 15:01:00 +01:00
KHobbits 2f4a19a5b8 Update Polish and Swedish translations from crowdin 2013-07-07 14:54:38 +01:00
KHobbits 6d360421f8 Translation cleanup
Allow '' in non format keys
Update French translation from crowdin
2013-07-07 14:52:31 +01:00
Gabriel D 03a10e80b9 Update some new text 2013-07-07 14:13:43 +01:00
KHobbits 1abacf00df More cleanup 2013-07-07 13:02:40 +01:00
KHobbits 3d29248ace Misc cleanup 2013-07-07 12:38:01 +01:00
KHobbits 3f5e2ad85a Whoops, we shouldn't be leaking the user object. 2013-07-07 11:51:12 +01:00
mrarroyo 817174e18f Fix punctuation 2013-07-07 02:17:25 +01:00
Chris Ward df2ab974bc Merge pull request #509 from necrodoom/patch-31
add horse egg
2013-07-02 02:25:49 -07:00
Necrodoom 423a722152 add horse egg 2013-07-02 12:20:20 +03:00
KHobbits 34f6487ba2 Add carpet to safe teleport materials. 2013-07-02 08:02:01 +01:00
KHobbits 522c3e85b2 Add command logging for CommandBlocks and other console types. 2013-07-02 07:16:42 +01:00
Iaccidentally 188a214de9 Merge pull request #503 from necrodoom/patch-26
update items.csv to Minecraft 1.6
2013-07-01 19:48:11 -07:00
GunfighterJ d0795fc3e7 Update Essentials for Bukkit 1.6.1-R0.1-SNAPSHOT 2013-07-01 21:38:27 -05:00
Necrodoom 95a2fce9a6 update items.csv to Minecraft 1.6 2013-07-01 13:03:24 -05:00
GunfighterJ d6ef0e1e50 Close the reader 2013-06-30 07:47:33 -05:00
GunfighterJ f6fd0bdb32 Force reading in UTF-8 from .txt files 2013-06-30 07:40:24 -05:00
Tyler Blair cb052e690c Update Plugin Metrics to R7 2013-06-29 18:05:42 +01:00
Iaccidentally 6af622b6b1 [API] Fix package naming 2013-06-28 15:30:47 -04:00
Iaccidentally dded3cae14 [API] fix references 2013-06-28 15:26:23 -04:00
Iaccidentally 6a3c5694ac [API] Cleanup 2013-06-28 15:21:49 -04:00
Iaccidentally 90c1df7cc7 [API] Remove some unneeded dependencies 2013-06-28 14:58:45 -04:00
Iaccidentally ff8c7b3315 [API] A basic example of a custom event, more to come. 2013-06-28 14:22:18 -04:00
KHobbits 0e43233e46 Add {TEAMPREFIX} {TEAMSUFFIX} and {TEAMNAME} to chat formatting. 2013-06-28 17:12:01 +01:00
KHobbits db234b9837 Force repair inventory refresh. 2013-06-28 14:14:43 +01:00
KHobbits 42b77864cd Minor colour tweak 2013-06-28 13:05:56 +01:00
KHobbits f485cbc48b Make the paging logic even more complicated. 2013-06-28 01:05:56 +01:00
KHobbits 0292cb59cd Drop messageFormat for simple string replace, remove duped ' marks. 2013-06-27 09:33:35 +01:00
KHobbits 3e519f95d5 Don't drop oversized stacks on the ground if player doesn't have oversized permission. 2013-06-26 21:44:34 +01:00
KHobbits 18d0183364 [Fix] Fix toggle syntax in plugin.yml 2013-06-26 08:57:26 +01:00
KHobbits 96cf363567 Merge pull request #504 from necrodoom/patch-30
[Fix] Fix socialspy toggle with no on/off param.
2013-06-26 00:51:51 -07:00
Necrodoom cfc6ed9364 fix socialspy toggles 2013-06-26 09:56:56 +03:00
KHobbits 3de3f00b11 Let's make the default group colour orange. 2013-06-26 01:22:18 +01:00
KHobbits c69c78f15c Don't automatically convert {chatparms} to [chatparams] 2013-06-25 18:04:31 +01:00
Necrodoom 0fdd367098 update items.csv to Minecraft 1.6 2013-06-25 19:04:29 +03:00
KHobbits 1a49cdd140 Fix null values. 2013-06-25 16:34:17 +01:00
ZerothAngel cd4bdb83d4 Add group/prefix/suffix support for zPermissions. 2013-06-25 16:24:23 +01:00
Luuk Jacobs f6fc9777b5 Reword some things, minor fixes and add punctuation.
more tiny fixes
minor unicode fix
2013-06-25 16:20:21 +01:00
KHobbits 9edc68bb2b Merge branch '2.x' of github.com:essentials/Essentials into 2.9 2013-06-25 16:00:32 +01:00
KHobbits 8f1f68f2be Merge pull request #502 from afistofirony/patch-1
Changing a spawner should update its BlockState.
2013-06-25 07:58:46 -07:00
KHobbits c0ed8649d0 Add missing variable. 2013-06-25 15:09:50 +01:00
Sahir f26466831a Changing a spawner should update its BlockState. 2013-06-25 17:07:43 +04:00
KHobbits c92ae00f9f Update KeywordReplacer.java 2013-06-24 13:31:07 +02:00
KHobbits 66355f0ead Update info.txt 2013-06-24 13:29:28 +02:00
KHobbits eeb9c13276 Merge pull request #499 from mozoa/patch-1
Update messages_nl.properties
2013-06-23 15:41:51 -07:00
KHobbits 9300529113 Merge pull request #501 from theudis/patch-6
Update messages_fr.properties
2013-06-23 15:41:30 -07:00
theudis 19e4acfc97 Update messages_fr.properties 2013-06-24 00:18:58 +03:00
KHobbits 1cb9ddf9fe [Feature] Allow the placing of spawners with predefined network id's (/i spawner:50)
[Permission] essentials.spawnerconvert.<mobname> - Allow the placing of specific mobspawners with premade network id's.
2013-06-23 16:11:24 +01:00
mozoa c801bc0173 Update messages_nl.properties
Reworded some strings
and changed the order of words
2013-06-23 16:49:08 +02:00
KHobbits 88d025cd0f Merge pull request #498 from mozoa/patch-1
Added /ci lines
2013-06-22 16:49:48 -07:00
mozoa dc1469105b Update messages_nl.properties 2013-06-22 22:51:38 +03:00
mozoa d3e0966b3f Update messages_nl.properties
Added new CI lines
bit indifferent about line 543 and 544
2013-06-22 22:49:26 +03:00
KHobbits a15e0b3875 [Feature] Expand /ci to allow removing certain amounts, and breakdown on the items removed. 2013-06-22 17:36:35 +01:00
KHobbits 52ba151b81 Clean up exception types. 2013-06-22 16:33:22 +01:00
KHobbits aa6c6b4d48 Fix missing Unicode in NL TL 2013-06-21 11:23:01 +01:00
KHobbits 7648e38ec2 Reduce restrictions on same item trading, so only identical items are blocked. 2013-06-20 21:14:28 +01:00
mozoa a67520477b Update NL locale 2013-06-20 21:07:58 +01:00
KHobbits f8fb8935d7 [Fix] Don't throw the wrong error message when using group limited kit signs. 2013-06-19 21:20:58 +01:00
GunfighterJ 8ae0ea98a3 Merge pull request #489 from necrodoom/patch-23
fix permission check typo (thanks to #4365)
2013-06-18 11:01:17 -07:00
Necrodoom 5338f6b706 fix permission check typo (thanks to #4365) 2013-06-18 20:57:30 +03:00
KHobbits fdb5d85ba5 Merge pull request #488 from necrodoom/patch-21
fix typo in eco warning
2013-06-17 08:19:59 -07:00
Necrodoom 2b4b1520d3 fix typo in eco warning 2013-06-17 16:05:45 +03:00
KHobbits 07bcd17e0f Block external access to unsupported saveConfig() method. 2013-06-17 01:08:42 +01:00
KHobbits 8fb91c5a61 Allow new lines and add secure broadcast keywords. 2013-06-16 01:18:35 +01:00
KHobbits aa6d85eacc Cleanup broadcast, allow limited keywords in. 2013-06-16 01:07:16 +01:00
KHobbits f5986194aa Clarify 'permission-based-item-spawn' config setting. 2013-06-16 00:05:27 +01:00
KHobbits b646bda9d2 Update to 1.5.2 RB:
Bukkit #1776 CraftBukkit #2788
2013-06-15 11:53:47 +01:00
KHobbits fe86f3a01d Reset suffix on /nick even if op and prefix/suffix are disabled. 2013-06-13 09:18:47 +01:00
KHobbits ae2a03d80c Merge pull request #485 from necrodoom/patch-29
no permissions is not an error, so dont output it as a warning
2013-06-12 02:59:55 -07:00
Necrodoom e4d7aacc5d no permissions is not an error, so dont output it as a warning 2013-06-12 12:41:15 +03:00
KHobbits 129fd53d5a Merge branch 'temp1' into 2.9 2013-06-11 20:50:24 +01:00
KHobbits 6bf57de64d Merge branch 'release' of github.com:essentials/Essentials into 2.9 2013-06-11 20:46:28 +01:00
Iaccidentally f1eae9be6f Cleanup imports 2013-06-11 20:45:12 +01:00
KHobbits a77c2d6d95 Restore support for replacing CAPITAL colour codes. 2013-06-11 16:38:24 +01:00
KHobbits c476471978 Don't look up valid looking IP's in the player database. 2013-06-09 23:10:02 +01:00
Iaccidentally 8755935fcb Remove old permissions handlers that are no longer used. This fixes an issue where new versions of Bpermissions would be detected as old. 2013-06-09 14:38:27 -04:00
KHobbits 9976cc847f Allow use of deprecated teleport function through interface. 2013-06-09 13:38:09 +01:00
theudis 56f86c9ae4 Update messages_fr.properties
Small changes in what I had done previously.
2013-06-09 03:09:20 +01:00
Necrodoom bdb5d095ca Fix arg length checks on /exp 2013-06-09 03:07:35 +01:00
cexikitin f38ed576c5 Alert give sender that the user was unable to receive all the items. 2013-06-09 03:05:40 +01:00
KHobbits 09f67c9723 Split util classes. 2013-06-08 22:31:19 +01:00
KHobbits 98e427e831 Cleanup ITarget 2013-06-08 21:43:42 +01:00
KHobbits ac6b74887f Turn Target into a real class. 2013-06-08 21:40:02 +01:00
KHobbits 7276bcccab Trapdoors should be treated as half blocks, not transparent blocks. 2013-06-08 21:26:11 +01:00
KHobbits a7b62c65b8 Teleport invulnerability should trigger on respawn as well as normal teleport. 2013-06-08 21:06:33 +01:00
KHobbits f48ed6988d Essentials API cleanup and teleport possession fixing. (UNSTABLE) 2013-06-08 19:34:14 +01:00
KHobbits b8300cc35a Throw a little testing on toggle logic. 2013-06-08 16:33:30 +01:00
KHobbits a3e6996ef9 Try and make toggles DRYer without loosing command flow.
Allow socialspy to match multiple players.
2013-06-08 15:13:51 +01:00
KHobbits 34daa5691c Allow spawning zombies without the trademark gold boots.
Also limit armor to zombies and skeletons.
2013-06-05 03:15:12 +01:00
KHobbits 0457705850 Fix unit tests. 2013-06-02 17:56:48 +01:00
KHobbits 5d5fee4612 Attempt to fix /seen times on vanish. 2013-06-02 17:45:56 +01:00
KHobbits 43f4a69760 Mute and sudo should check for essentials.vanish.interact permission. 2013-06-02 16:09:56 +01:00
KHobbits 55cee73a48 Allow spawning zombies with swords too. 2013-06-02 00:09:12 +01:00
KHobbits 51f554827c [Feature]Extend spawning mob meta to allow more customized spawning:
/spawnmob (skeleton|zombie|pigzombie):(diamond|iron|gold)armor
2013-06-02 00:02:40 +01:00
KHobbits d6756a2605 [Fix] Set some default mob data.
Fixes skeletons spawning without bows.
2013-06-01 23:33:31 +01:00
KHobbits b065f4a05a Update Essentials spawn to use new kit params. 2013-05-27 02:29:28 +01:00
KHobbits 867bfbf1b8 Better handle kit item casting. 2013-05-27 02:25:30 +01:00
KHobbits 7fe83dbd91 Ignore extra spaces in kit config. 2013-05-26 23:53:39 +01:00
KHobbits 1a4c2e8484 Exempt [repair] signs from 'essentials.repair.all' permissions check. 2013-05-26 22:00:35 +01:00
KHobbits 84874c9855 Update inventory when closing ghost-dupe-able inventory, to remove ghost items. 2013-05-26 18:21:19 +01:00
KHobbits 6512a53a3f Reduce duplicated broadcast code. 2013-05-26 17:58:04 +01:00
KHobbits 423c8c54dc Simplify player matching. 2013-05-26 17:37:11 +01:00
KHobbits 160a1a04eb Standardize /getpos and /whois to use essentials.vanish.interact like all other commands. 2013-05-26 17:20:03 +01:00
KHobbits 88c5b64694 GeoIP already has a perm, doesn't need hidden behind essentials.seen.extra as well. 2013-05-26 16:52:25 +01:00
KHobbits 19451c151e Show teleport cancel messages to tpa user. 2013-05-26 16:49:11 +01:00
KHobbits e4d041b9b0 Fix /helpop for console use. 2013-05-26 16:23:36 +01:00
KHobbits 3bcd3390fe [Fix] Fix vanished player matching in: /seen /give /burn /nuke /tpall /tpaall 2013-05-26 16:02:40 +01:00
KHobbits 35783ee429 Forgot to push Essentials spawn changes. 2013-05-24 00:10:39 +01:00
KHobbits 66911bb0a9 Improve hidden player matching.
Replace essentials.teleport.hidden with essentials.vanish.interact
Fix perm checks in tpall and tpaall
2013-05-23 22:59:09 +01:00
KHobbits d48c342e37 Fixing feed messages. 2013-05-23 22:12:54 +01:00
KHobbits 5c05870490 Improve user matching 2013-05-20 18:50:14 +01:00
KHobbits d76fe946b7 Don't throw NPE on broken sign state, just allow block to break. 2013-05-19 01:21:21 +01:00
KHobbits a738e49e3c Default chat formatting should strip all format codes, not just colours. 2013-05-19 01:03:54 +01:00
KHobbits 9dc6e7ad1e Add indication of when kit's cannot be used yet, in the /kit output. 2013-05-18 23:27:41 +01:00
KHobbits 293406a603 Tidy up /gc's TPS output. 2013-05-18 21:42:02 +01:00
KHobbits 727c53eb2b [Feature] Add hunger level to /whois 2013-05-18 18:20:06 +01:00
KHobbits 274ad06665 Fix null when trying to tempban players in console for times longer than max ban. 2013-05-18 17:57:05 +01:00
KHobbits 5e6f6b2482 Tweak /baltop to not show displaynames on vanished players. 2013-05-12 21:19:54 +01:00
KHobbits 29c9a46c2f Tiny listener optimizations. 2013-05-12 20:59:07 +01:00
KHobbits 6d317fd26d Small tweak to warning display and make config variable 'economy-lag-warning' set in ms not ns. 2013-05-12 16:31:40 +01:00
KHobbits 8ebe55a294 Make the lag warning configurable, useful to debug economy lag on larger servers. 2013-05-12 16:10:41 +01:00
KHobbits af2c514f2a Throw console warning on slow economy api call. 2013-05-12 04:12:34 +01:00
GunfighterJ 3042151fee [Fix] Check initial direction when looking for a safe teleport spot 2013-05-10 11:21:39 -05:00
KHobbits 59f67acfd0 Don't treat AFK players as god mode when dealing with food regen. 2013-05-09 17:44:10 +01:00
snowleo 7051801a85 Update ItemDb.java 2013-05-08 00:53:37 +03:00
snowleo 0d02b91506 Doesn't need this 2013-05-08 00:52:39 +03:00
KHobbits 5f6cca83ce [Feature] Withdraw from trade signs without dropping items as overflow. [EXPERIMENTAL] 2013-05-06 23:09:31 +01:00
KHobbits ed5743147b Add some sign debugging to /ess debug to help track down charging issues. 2013-05-05 22:37:28 +01:00
KHobbits 1bb7946e13 Couple more bits of Eco cleanup 2013-05-05 20:05:28 +01:00
KHobbits 9ec1a6b78f Fix /sell to handle zero priced items again. 2013-05-05 19:59:35 +01:00
snowleo 76a96d1004 Make it compatible with Factions again. 2013-05-05 19:00:21 +03:00
snowleo b49aaee66d Catch both exceptions in EssentialsConf and valueOf instead of new 2013-05-05 11:55:39 +02:00
snowleo 0d34b9ae9f Cleanup 2013-05-05 11:42:53 +02:00
snowleo 6044cca54f ECONOMY MADNESS? THIS IS … FIXED 2013-05-05 11:41:19 +02:00
snowleo aaebb6143e fix NPE in teleport code 2013-05-05 11:08:49 +03:00
KHobbits c4ac744d35 Further economy cleanup 2013-05-05 08:03:06 +01:00
KHobbits 162b67aaa6 Cleanup player argument matching in loops
Cleanup ess cleanup timestamp matching
2013-05-05 07:15:33 +01:00
KHobbits 2d70bb19f7 Economy Madness 2013-05-05 05:12:17 +01:00
KHobbits 801acbb004 Trim stored precision to below that of a double, to prevent rounding issues. 2013-05-05 01:23:07 +01:00
theudis aeb1b4601c Update messages_fr.properties 2013-05-04 21:56:32 +01:00
KHobbits f5b32f51aa Update CS translation with some extra TL keys from tommymortago 2013-05-04 19:34:55 +01:00
KHobbits 0b20055f60 Sorted TL files 2013-05-04 19:22:44 +01:00
pa001024 2f30064ab4 update zh-locate 2013-05-04 18:32:44 +01:00
Necrodoom a65d0db57d Throw invalid kit message on invalid delay 2013-05-04 18:26:34 +01:00
KHobbits 479dad9966 cleanup 2013-05-04 18:22:55 +01:00
KHobbits b7acccfc8b [Feature] Make /kit list kit costs if any are set. 2013-05-04 18:11:35 +01:00
KHobbits fbcfd4948b Merge pull request #465 from skmedix/patch-1
Update Polish translation
2013-05-04 08:55:18 -07:00
KHobbits cdbdb5e8e9 [Permission] Add essentials.repair.all permission, which is required to unlock /repair all
Also make it to /repair defaults to hand.
2013-05-04 16:06:06 +01:00
KHobbits 6e20275cc7 [Fix] Allow Feed to be used via console
Throw events when modifying heath or food levels.
2013-05-04 16:04:59 +01:00
snowleo aac9e4884d Remove User instance from Teleport class 2013-05-03 01:53:54 +02:00
snowleo ddb3b13931 Don't trust File.length() 2013-05-03 01:26:51 +02:00
snowleo c62f762724 Do not keep hard references to User objects 2013-05-03 01:15:02 +02:00
snowleo 4bdeb1324d *angry eyes* 2013-05-03 00:25:07 +02:00
snowleo 555a300378 Fix cleanup to not hold Users in memory. 2013-05-03 00:12:40 +02:00
Iaccidentally ebc6b14284 Update libs for 1.5.2 :: Minimum CB version now 2763 2013-05-02 11:54:05 -04:00
SKmedix 041fa8537d Update messages_pl.properties
Changelog:
---
* Added:
kitError2 (216)
kitNotFound (536)
socialSpy (537)
setBal (538)
insufficientFunds (540)

* Fixed:
backUsageMsg (21)
banFormat (28)
bedMissing (30)
connectedPlayers (58)
downloadingGeoIp (91)
fullStack (125)
geoIpUrlEmpty (131)
geoIpUrlInvalid (132)
healOther (148)
itemSpawn (200)
jailReleased (206)
jailSentenceExtended (208)
jailSet (209)
kickedAll (213)
kitInvFull (221)
kitOnce (222)
markMailAsRead (239)
matchingIPAddress (242)
messageTruncated (246)
nickChanged (272)
removed (376)
repairNone (381)
teleportAll (419)
tempBanned (434)
thunderDuration (437)
timeSet (442)
totalWorthAll (446)
totalWorthBlocks (447)
tradeSignEmpty (450)
youAreHealed (520)
youHaveNewMail (521)
balanceOther (527)
2013-04-30 20:34:33 +03:00
Iaccidentally 7bbceed491 Minor cleanup 2013-04-30 12:57:38 -04:00
Iaccidentally 7a46de6b02 Fix some tl keys :: update Portuguese translation 2013-04-30 12:26:09 -04:00
Iaccidentally 1ab2a51550 API & misc cleanup 2013-04-30 12:25:25 -04:00
Iaccidentally 42dc6a2e07 Merge pull request #460 from main--/2.9
Made the "throws" declaration of getWarps() more specific
2013-04-30 08:30:41 -07:00
KHobbits 9ba9223632 Support /me in console 2013-04-30 02:24:30 +01:00
KHobbits c4173c0486 Allow powertool to be set from console. 2013-04-30 02:18:22 +01:00
KHobbits 049886797b Fix tests. 2013-04-30 01:50:02 +01:00
KHobbits a43cbe061a Move spawnmob.stack perm check to the right place. 2013-04-30 01:37:39 +01:00
KHobbits 9d2358ed4d [Fix] Stacked mobs count towards spawnmob-limit count. 2013-04-30 01:04:40 +01:00
KHobbits 7913cfdb3c Fix currency rounding up. 2013-04-30 00:35:39 +01:00
KHobbits 137d0df9dc Fix TL messages. 2013-04-30 00:18:53 +01:00
KHobbits d425ab5f93 Fix Eco take bug and fix NPE 2013-04-30 00:07:28 +01:00
KHobbits 012741fea6 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2013-04-29 23:50:49 +01:00
GunfighterJ 006f996283 Remove ArrayListInput
Formatting
2013-04-29 14:04:59 -05:00
main() 538a2425c5 Made the "throws" declaration of getWarps() more specific
It is very difficult to handle an Exception thrown by an API method when you don't have any way to **programatically** (without dirty stuff like string comparisons, so the message is not enough) distinguish errors and find out what's going on.
2013-04-29 20:29:42 +02:00
GunfighterJ 79bdd8a212 Add keyword replacements in kits
Add SimpleTextInput constructor for lists
Variable refactoring for clarity.
2013-04-29 06:31:08 -05:00
Iaccidentally 28cbac6610 cleanup last commit a bit 2013-04-28 17:22:11 -04:00
Iaccidentally 0a03696983 [API] Add a warp api, with future 3.x support :: minor cleanup 2013-04-28 16:23:45 -04:00
KHobbits f0ab66c4c6 Fix ZH TL messages 2013-04-28 14:18:19 +01:00
pa001024 57184f01e9 Add China/Hong Kong/Taiwan Translations 2013-04-28 14:12:21 +01:00
Iaccidentally 02df03a4b1 [CHANGE] Rewrite eco command with better logic :: the command will now attempt to do exactly what it is told, with respect to the minimum balance :: fix missing messages 2013-04-27 23:44:23 -04:00
KHobbits 3396cf6e02 [Fix] Try singular and plural entity names in /remove. 2013-04-28 04:26:39 +01:00
Necrodoom e60f17bb53 Fix radius in /remove and add world.
Fix SocialSpy
Fix /killall world argument.
2013-04-28 04:20:28 +01:00
Necrodoom eb0c71984c [Feature] Add /socialspy other 2013-04-28 03:44:24 +01:00
KHobbits 865b581d06 Update Polish translation by skmedix 2013-04-28 03:31:18 +01:00
Necrodoom b093111920 [Fix] Output proper message if typo'd kit 2013-04-28 03:22:31 +01:00
snowleo c55e52539e Update Commandgc.java 2013-04-23 08:57:22 +03:00
snowleo 1dfad57c6f Derp, still need currentTime 2013-04-23 08:55:02 +03:00
snowleo 6148583fb2 Fix tps after Timer changes 2013-04-23 08:51:25 +03:00
snowleo 9160410a50 Allow to forceSave conf files 2013-04-23 00:47:45 +02:00
snowleo 2588e20140 Delayed write to file (experimental) 2013-04-22 23:31:11 +02:00
U-SFX\wardcg e291633ac8 Merge remote-tracking branch 'origin/groupmanager' into 2.9 2013-04-23 01:02:31 +10:00
KHobbits dfc62bca76 Minor TP and timer tweaks. 2013-04-22 00:11:13 +01:00
KHobbits f48871ff29 Attempt to smooth out timer usage.
Add extra sign metrics.
2013-04-21 23:39:50 +01:00
snowleo c2eb7b05b3 Restrict EssentialsTimer to 10ms execution time 2013-04-22 01:23:21 +03:00
Iaccidentally 547e262061 [FEATURE] Add kill exempt :: new permission: essentials.kill.exempt
players with essentials.kill.force and console will still be able to override this
2013-04-19 14:40:10 -04:00
Iaccidentally 62942bdb3d Merge pull request #453 from necrodoom/patch-20
[FIX] ID 18, 29, 33 invalid damage values and more
2013-04-19 10:32:47 -07:00
ElgarL e8c2a9792f Merge pull request #452 from evonuts/groupmanager
Minor grammatical changes to config.yml
2013-04-19 09:57:16 -07:00
Necrodoom f1bc7a305a [FIX] ID 18, 29, 33 invalid damage values and more
expand IDs 98:1, 98:2, 98:3
2013-04-19 19:43:22 +03:00
GunfighterJ fd0134227c Fix NPE on invalid enchant 2013-04-19 10:06:43 -05:00
evonuts 59c833aa9e Minor grammatical changes to config.yml 2013-04-19 12:13:09 +12:00
Iaccidentally f6e2db1eda [Feature] Add a blacklist for what dispensers can dispense to antibuild 2013-04-16 17:01:01 -04:00
Iaccidentally eeb31e054f [UPDATE] Update to 1.5.1-r0.2 beta build 2013-04-16 16:59:36 -04:00
Iaccidentally 4629cad99b Clean up last commit 2013-04-16 16:16:07 -04:00
Iaccidentally 5e360995eb [FIX] Update user activity when shooting a bow 2013-04-16 15:58:13 -04:00
GunfighterJ a72777d043 Allow permission control of stacked mobs
Adds essentials.spawnmob.stack to allow stacking of more than one mob using the /spawnmob command

Adds https://www.assembla.com/spaces/essentials/tickets/4050
2013-04-14 15:01:25 -05:00
snowleo 39d66b1c43 Changing that name too, thanks jomp16 2013-04-14 12:30:30 +03:00
snowleo 9a3295439b Threading Fix 2013-04-14 04:44:16 +03:00
KHobbits 656a40abb2 Remove duplicate perm. 2013-04-13 23:50:17 +01:00
KHobbits 7e80f440ca Check threading on backup init. 2013-04-13 23:10:09 +01:00
GunfighterJ e353ec7f66 Merge pull request #438 from GunfighterJ/2.9
Add Romanian translation
2013-04-08 17:27:16 -07:00
GunfighterJ bacb84a943 Add Romanian translation 2013-04-06 17:13:59 -05:00
GunfighterJ bac2b3f878 [Feature] pweather command 2013-04-06 16:20:12 -05:00
snowleo 8f41cc07e3 Still need that check 2013-04-06 18:40:42 +03:00
snowleo 4f033d8073 Math fail 2013-04-06 18:38:49 +03:00
snowleo 284d7a23ca Fix § at end of line 2013-04-06 18:37:13 +03:00
KHobbits 8777410d30 Balance others message. 2013-04-06 05:54:44 +01:00
KHobbits 3356db080a Fix group name when using wildcard group definitions. 2013-04-06 05:05:28 +01:00
ementalo 55e8aa765b Remove GB from main build.xml 2013-04-04 20:49:55 +01:00
ementalo d2ee2e3646 [update] Remove GroupBridge 2013-04-04 20:45:09 +01:00
KHobbits d9a6974ae2 Missing file update. 2013-04-04 08:45:08 +01:00
KHobbits 641fbca40c Update Bukkit for 1.5.1-R0.1 Beta.
CB: 2735 Bukkit: 1741
2013-04-04 08:39:57 +01:00
Paul A. 11fafb5339 Merge pull request #435 from GunfighterJ/2.9
[Fix] NPE on ptime from console
2013-04-02 08:31:42 -07:00
GunfighterJ e4b04db412 [Fix] NPE on ptime from console 2013-04-02 10:21:20 -05:00
Iaccidentally 93b76446f5 Merge pull request #431 from GunfighterJ/2.9
Show Geolocation in /seen
2013-04-01 14:20:42 -07:00
GunfighterJ e3183e66df Show Geolocation in /seen
Refactor argument for clarity
2013-04-01 16:00:09 -05:00
KHobbits 9d1f25c455 Block sign interact if player is dead. 2013-04-01 05:23:04 +01:00
KHobbits 9fe226b79a Merge pull request #428 from necrodoom/patch-15
readd "forest" and "jungle"
2013-03-31 08:27:26 -07:00
Necrodoom 228ecd2a5c readd "forest" and "jungle" 2013-03-31 18:26:38 +03:00
KHobbits 4eb6c9b54f For group overflow, add a little colour. 2013-03-30 02:40:20 +00:00
KHobbits c093b6e7c2 Use original casing in config file group name. 2013-03-30 02:36:09 +00:00
Iaccidentally 757a41f890 [FIX] add itemframe support to remove 2013-03-29 22:20:54 -04:00
KHobbits 8427b41e30 Prevent sign healing when the player is recently dead. 2013-03-29 14:37:30 +00:00
SKmedix 159cbba809 Update messages_pl.properties
Update Polish translation.
2013-03-29 03:19:43 +00:00
Necrodoom 8604debc4e [Fix] Allow console to afk others 2013-03-29 03:16:18 +00:00
Necrodoom 22efa3e000 wipe too general log name aliases 2013-03-29 03:13:03 +00:00
Necrodoom 578576e317 [Fix] Sudo allowed on vanished players. 2013-03-29 03:10:45 +00:00
Necrodoom 98aa303ff5 prevent confusion at /ci code 2013-03-29 03:04:54 +00:00
KHobbits c857832759 Spacing. 2013-03-29 03:01:53 +00:00
KHobbits aab6af768d Fixing casing and formatting issues in /list 2013-03-29 02:59:55 +00:00
KHobbits 879560092f Merge pull request #423 from kukelekuuk00/patch-1
[Fix] Strip colourcodes from groups in /list (internal only)
2013-03-28 19:50:50 -07:00
ElgarL 411b4e2b8f another string fix. 2013-03-28 16:08:59 +00:00
ElgarL 519785d09f More Necrodoom fixes. 2013-03-28 15:38:18 +00:00
ElgarL 231f9d49c1 Fix loops. 2013-03-28 13:10:17 +00:00
ElgarL e15a8c50d6 Merge pull request #371 from necrodoom/patch-72
add new commands and others
2013-03-28 05:59:35 -07:00
Luuk Jacobs 386b73dbdb [Fix] Strip colourcodes from groups
This way groups with colourcodes in the middle of the name work with /who <groupname> ie. §4S§cerveradmin
2013-03-26 11:43:45 +01:00
Iaccidentally c7f62700d5 Merge pull request #409 from GunfighterJ/2.9
[Feature] Stack more mobs with /spawnmob
2013-03-22 14:39:55 -07:00
GunfighterJ 85741288ce [Feature] Stack more mobs with /spawnmob
Uses same syntax, now supports more than 2 mobs
2013-03-22 16:35:01 -05:00
KHobbits 566a826cf1 Abort user login code, if user disconnects before it runs. 2013-03-21 22:30:02 +00:00
KHobbits 28e069eb6b Don't allow an empty list value. 2013-03-21 21:41:30 +00:00
KHobbits 44584b11c5 Tweak ess version 2013-03-21 21:12:58 +00:00
KHobbits b8e079ddcb Add the max-walk-speed config variable back to the default config file. 2013-03-20 23:24:45 +00:00
SKmedix 35792f9728 Update messages_pl.properties
Update Polish translation.
2013-03-20 08:53:00 +00:00
KHobbits 353423efec Use correct getPlayer method to not match offline users. 2013-03-20 01:29:54 +00:00
KHobbits 889157371c [Permission] essentials.vanish.interact - Players with this permission will be able to interact with hidden players. 2013-03-20 01:00:50 +00:00
KHobbits 896e14670f Add some missing hidden checks 2013-03-19 23:24:06 +00:00
KHobbits 8f6c61fa99 Try to unify player matching for hidden users:
kill, lightning and ptime still need cleanup
2013-03-19 23:17:34 +00:00
KHobbits 1d6ac42311 [Fix] Reset walk/fly speed on login.
[Permission] essentials.speed.<fly|walk> - If a player only has one of these, they will only be able to toggle the given state.
2013-03-19 22:55:00 +00:00
KHobbits 61b115ceac Don't close inventories every plugin disable, just our own. 2013-03-19 21:05:12 +00:00
Necrodoom a5ec8b9cbb [Fix] Print correct sender name on /spawn player from console. 2013-03-19 20:59:02 +00:00
Necrodoom 5af1f50b65 Fix exception in /heal, "playernotfound" should be exception. 2013-03-19 20:56:50 +00:00
KHobbits 093611fb2a Use original case for default /list groups. 2013-03-19 18:34:28 +00:00
KHobbits 709ddae508 readmeupdate 2013-03-19 14:32:23 +00:00
Necrodoom cac53ab12e kittycannon should actually fire kittens 2013-03-19 14:31:34 +00:00
Necrodoom df55e162d4 console should be able to mute admins 2013-03-19 14:09:30 +00:00
Necrodoom ea9bf854cc [Fix] offline player matching for online only commands.
/kick,/warp, /burn & /tppos should only match online players
2013-03-19 14:07:42 +00:00
KHobbits f5c17fc7c7 Pull the default list behavior from the old 'sort-list-by-groups' variable if it exists. 2013-03-19 09:00:50 +00:00
KHobbits 2dda15d47f Add Travis notifications 2013-03-18 23:48:01 +00:00
KHobbits d9485cea8d Try different ant command 2013-03-18 23:35:00 +00:00
KHobbits e728236dd3 Travis 2013-03-18 23:27:15 +00:00
KHobbits fe28faf79d Merge pull request #396 from GunfighterJ/2.9
Allow potion clear/apply commands to work
2013-03-18 16:20:45 -07:00
KHobbits 66e87bdd1c Minor code cleanup 2013-03-18 23:15:18 +00:00
KHobbits 4b5cc8cfd8 Cleanup: Run Kukes code through a dryer, add more comments. 2013-03-18 22:43:05 +00:00
GunfighterJ 8b97a84652 Allow potion clear/apply commands to work 2013-03-18 11:21:28 -05:00
KHobbits 16ca842929 Edit default config to not cause confusion. 2013-03-18 08:59:40 +00:00
KHobbits 984eca9723 Cleanup: Comment and simplify /list code - More to do. 2013-03-18 08:53:12 +00:00
KHobbits 5b55fd97e6 Cleanup - Split /list into methods 2013-03-18 08:16:34 +00:00
kukelekuuk00 0c82c61574 fixes and addition of '*' to match all unmatched users. 2013-03-18 06:16:02 +00:00
kukelekuuk00 32099a4109 Added /list [group] and some more detailed configuration regarding /list 2013-03-18 06:16:02 +00:00
GunfighterJ ce51a07bf1 Potion erroring and duration/power fix 2013-03-18 06:14:44 +00:00
Necrodoom 5e4659e6ae update IDs 27, 28, 66, 157
update rails aliases to match bukkit item names
2013-03-18 06:14:00 +00:00
GunfighterJ 2f96ef1e97 [Fix] Potion erroring and duration/power fix 2013-03-17 13:34:10 -05:00
KHobbits 5ea1bdec56 [Fix] Restore /speed command's ability to control walk speed. 2013-03-17 06:38:24 +00:00
KHobbits f338d3c135 Fixing TL edit error. 2013-03-16 12:17:13 +00:00
Necrodoom 20d019383f Update messages.properties
fix typos in new messages
2013-03-16 12:15:57 +00:00
KHobbits ee080e56c2 Fix raw bukkit itemdb lookup 2013-03-16 12:11:03 +00:00
KHobbits d9a238fb80 Cleanup open inventories 2013-03-16 11:01:56 +00:00
KHobbits 3ddf883d5d Import cleanup 2013-03-16 09:19:30 +00:00
KHobbits 1111254e46 Fix potion effect errors 2013-03-16 09:13:21 +00:00
KHobbits 6185581962 Fix Minecart class rename
Lets use consistent versions in the code base
Bukkit: 1700 CB: 2648
2013-03-16 08:55:39 +00:00
KHobbits 24a9a74fd5 We use tabs not spaces for indenting. 2013-03-16 08:43:52 +00:00
KHobbits 208d673c2b Check health is 0 after /suicide 2013-03-16 08:42:24 +00:00
KHobbits 2b0506de77 Fix missing /ci syntax update. 2013-03-16 08:32:21 +00:00
Alexander Schepp d63e259461 Merge pull request #388 from GunfighterJ/2.9
[Feature] Additional spawnable mob types
2013-03-15 13:44:43 -07:00
GunfighterJ c8a867be38 [Feature] Additional spawnable mob types 2013-03-15 15:41:23 -05:00
Alexander Schepp 734286e8d3 Merge pull request #387 from GunfighterJ/2.9
Initial 1.5 update
2013-03-15 12:59:50 -07:00
GunfighterJ 96c5bebdf2 Initial 1.5 update 2013-03-15 14:54:51 -05:00
Alexander Schepp fc96d7e0e9 Merge pull request #342 from necrodoom/patch-60
[feature] update items.csv to minecraft 1.5
2013-03-15 12:25:09 -07:00
KHobbits fa445790e7 Merge pull request #383 from necrodoom/patch-73
[fix] trying to AFK others should work now
2013-03-15 06:28:56 -07:00
KHobbits 20b61a6147 Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9 2013-03-14 18:01:50 +00:00
Iaccidentally c61abadd91 Merge pull request #385 from Skylexia/patch-1
[Fix] Fixing message (Tl key).
2013-03-13 17:41:10 -07:00
Skylexia 89c1cc5503 Fixing message. 2013-03-13 20:23:01 -03:00
KHobbits db86648b84 Fix missing console notifications on /unban and /unbanip 2013-03-12 22:26:24 +00:00
Necrodoom e68035cc7a [fix] trying to AFK others should work now 2013-03-11 15:36:12 +02:00
KHobbits 895c14430a Fixing ban ip broadcast notification. 2013-03-11 10:33:59 +00:00
KHobbits 664fe18bbe Fix Essentials version display 2013-03-11 02:01:57 +00:00
KHobbits e60c65cfc5 Fixed lost TL. 2013-03-10 23:43:13 +00:00
Skylexia-PC 6b70899484 Shows IP unbans to online staff. 2013-03-10 23:41:17 +00:00
Necrodoom 973e918d3a readd some checks 2013-03-10 14:42:03 +02:00
KHobbits 5cfb9326f6 Merge pull request #380 from Skylexia/2.9
[Feature] Broadcast unbans to online staff.
2013-03-10 00:38:09 -08:00
Skylexia-PC 16857da2b4 Update tl properties to remove unused properties. 2013-03-10 04:37:04 -04:00
Skylexia-PC ee7b50a014 [Feature] Broadcast unbans to online staff. 2013-03-10 03:22:35 -04:00
KHobbits 56bd973e94 Use lower locale. 2013-03-10 02:04:11 +00:00
KHobbits 9ff0571cea Protect us from npe. 2013-03-10 02:01:59 +00:00
Iaccidentally fc019af9f6 Merge pull request #379 from GunfighterJ/2.9
Allow potion meta to work
2013-03-09 16:46:59 -08:00
GunfighterJ 937ef0bb85 Allow potion meta to work
Instead of denying if they have perms
2013-03-09 18:38:59 -06:00
KHobbits 45fe5f2c02 Fix TL key casing. 2013-03-09 21:41:30 +00:00
KHobbits b1f427d52e [Fix] Allow /nick to change nickname case, without adding prefix character. 2013-03-09 14:24:19 +00:00
KHobbits 46e9471a63 [Fix] Move allowunsafe enchant perm to: essentials.enchantments.allowunsafe 2013-03-09 14:02:34 +00:00
KHobbits 4d9685e10d [Fix] Move all enchant type perms to: essentials.enchantments.<enchant>
[Fix] Move all potion effect perms to: essentials.potions.<effect>
[Fix] Move multiple potion perm to: essentials.potions.multiple
Other perms: essentials.itemspawn.meta-(firework|firework-multiple|firework-power|name|lore|head|book|chapter|chapter-<chapter>|author|title)
2013-03-09 13:56:38 +00:00
Necrodoom fd3cdde354 fix alias 2013-03-09 15:12:15 +02:00
KHobbits d93719ebcf Merge pull request #378 from Skylexia/2.9
Fixing exp trading type.
2013-03-08 14:08:08 -08:00
Skylexia-PC 63b2766e2b Fixing exp trading type. 2013-03-08 17:04:54 -05:00
KHobbits 6d552281d4 Allow item/item trades still. 2013-03-08 12:34:11 +00:00
KHobbits 6436baf7a4 Merge pull request #370 from necrodoom/patch-71
[fix] EssentialsAntiBuild shouldn't run without Essentials
2013-03-08 04:01:08 -08:00
KHobbits 896298a9e8 Clean up meta error messages.
Add enchant perm checks back.
2013-03-07 03:17:58 +00:00
KHobbits 7d0fafd084 Don't check people for meta perms when using kits. 2013-03-07 02:57:25 +00:00
KHobbits 32d44eb13d Merge pull request #375 from GunfighterJ/patch-15
[Feature] Adds meta permissions
2013-03-06 18:46:55 -08:00
KHobbits c275626bee [Fix] Prevent same item type trades on signs, prevents amount confusion scams. 2013-03-07 02:42:47 +00:00
KHobbits 861b04b680 Fix cleanup comparison number base 2013-03-06 23:39:11 +00:00
KHobbits d8e4862e82 Add cleanup logging to debug mode. 2013-03-06 22:36:36 +00:00
GunfighterJ 4aaf0eda79 [Feature] Adds meta permissions
TL MetaItemStack.java
Some meta cleanup
Parameter refactor for clarity
Full list of added perms http://goo.gl/do1XL
2013-03-06 15:09:51 -06:00
KHobbits 2f9dcfee16 Fix a color code mistake. 2013-03-06 20:46:19 +00:00
KHobbits 292f8a8799 Sort TL files. 2013-03-06 17:44:05 +00:00
Necrodoom ec87104c57 add armor aliases since new leather names 2013-03-05 18:56:40 +02:00
KHobbits d7588e61bc [Fix] Unify item spawning permissions in /give 2013-03-03 20:33:23 +00:00
Necrodoom 061794e86d add mising isopoverride check 2013-03-03 18:35:05 +02:00
KHobbits b9285b2aeb Merge pull request #372 from skmedix/patch-21
Update messages_pl.properties
2013-03-02 09:43:35 -08:00
SKmedix 2187b7536e Update messages_pl.properties
Update Polish translations.
---
Date: 2.03.13

---
Added "playerBanIpAddress" (27)
2013-03-02 18:41:04 +01:00
KHobbits 86c0767833 Fix /banip so it compiles, also throw it through a DRYer. 2013-03-02 17:08:22 +00:00
Necrodoom 090c1f6f83 Include IP address when banning IP 2013-03-02 17:08:16 +00:00
Necrodoom 69c40a2f1a add new commands, add alias to listgroups 2013-03-02 10:03:45 +02:00
Necrodoom 42edd14939 Update GroupManagerPermissions.java 2013-03-02 09:56:38 +02:00
Necrodoom dba47cb44c fix clear commands change mandemote and manpromote
dont make manpromote and mandemote act like manuadd when OP, 3 manuadd commands arent needed.
2013-03-02 09:50:31 +02:00
Necrodoom b020983471 messages fix, add /manuclearp and /mangclearp 2013-03-01 20:48:12 +02:00
ementalo 13efbb666d Remove reference to c3p0 from build.xml 2013-02-28 21:23:33 +00:00
ementalo 8d77a3f941 [Breaking] Remove protect database functionality for protecting signs and rails.
- Removed config entries
- Removed c3p0 lib
2013-02-28 21:02:37 +00:00
Necrodoom 8f785598b0 [fix] essantibuild shouldnt run without essentials 2013-02-28 19:04:05 +02:00
KHobbits 58b1b34e44 Merge pull request #369 from TheReverend403/2.9
Fix geoip messages
2013-02-28 05:32:42 -08:00
Lee Watson ffbc05144c Updated ALL local files 2013-02-28 13:23:28 +00:00
KHobbits 207a8d1b4f Merge pull request #364 from necrodoom/patch-69
deny empty warp name
2013-02-28 04:55:40 -08:00
KHobbits 919f3abe6d Merge pull request #357 from skmedix/patch-20
Update Essentials/src/messages_pl.properties
2013-02-28 04:53:58 -08:00
KHobbits c1f66fc817 [Fix] Charging players at wrong point in /spawn 2013-02-28 12:52:22 +00:00
KHobbits 8d2b10d783 Add extra trade log messages for sign charges. 2013-02-28 03:15:21 +00:00
Necrodoom 38b7fa64fa deny empty warp name 2013-02-26 19:07:10 +02:00
ElgarL f5ed4dd6cd Merge pull request #361 from necrodoom/patch-66
add catches for the last 2 config settings
2013-02-26 08:49:40 -08:00
ElgarL 17dab04094 Merge pull request #362 from necrodoom/patch-67
fix a few groupmanager.java errors
2013-02-26 06:43:31 -08:00
Necrodoom 308f05b8bf change commandblock message 2013-02-26 13:05:45 +02:00
Necrodoom 48db088fb4 fix a few groupmanager.java errors 2013-02-26 12:27:05 +02:00
Necrodoom 9965e41567 add catches for the last 2 config settings 2013-02-26 12:17:26 +02:00
Iaccidentally 0ddcfafbc0 This is still needed. 2013-02-25 22:44:52 -05:00
KHobbits 6f55e4b316 Revert "[Spawn] Please join me in welcoming EssentialsSpawn to Java 1.6 and modern bukkit.
This reverts commit a11e8d4236.
If you don't understand the code, don't touch it.
2013-02-26 03:30:11 +00:00
Iaccidentally de91073dda Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-02-25 22:01:49 -05:00
Iaccidentally a11e8d4236 [Spawn] Please join me in welcoming EssentialsSpawn to Java 1.6 and modern bukkit. :: http://i.imgur.com/79Izo.jpg 2013-02-25 22:01:06 -05:00
Iaccidentally bf8f0365d9 Merge pull request #360 from GunfighterJ/patch-15
[Protect] Prevent creepers from breaking paintings if their explosions a...
2013-02-25 18:46:44 -08:00
GunfighterJ d5f702f2cb [Protect] Prevent creepers from breaking paintings if their explosions are disabled.
Backport from 3.0
2013-02-25 17:15:20 -06:00
ElgarL c1b4ed5920 Show the world a group change is made in when using notify. 2013-02-25 14:11:42 +00:00
ElgarL cc83553d72 Store worldSelection indexed on the senders name rather than the object
(fixes commandblocks using manselect).
2013-02-25 13:49:18 +00:00
ElgarL 643a9be985 Only prevent adding nodes with '/manuaddp' and '/mangaddp' if they are
exact matches (not wildcards).
2013-02-25 12:47:23 +00:00
ElgarL 9f13653be6 Warn when adding a node where an exception already exist. 2013-02-25 10:46:16 +00:00
ElgarL 5f5a9adf31 Don't allow adding a node with '/manuaddp' and '/mangaddp' which is
already negated.
2013-02-25 10:27:01 +00:00
ElgarL 29746df914 Fix setting of accessLevel on User level permission tests. 2013-02-25 10:11:44 +00:00
SKmedix c3b42993de Update Essentials/src/messages_pl.properties
Update Polish translations.
---
Date: 24.02.13

---
+ Added "noMatchingPlayers" (509)
+ Added "matchingIPAddress" (510)
+ Added "runningPlayerMatch" (511)
* Fixed "adventure" (8)
* Fixed "antiBuildInteract" (14)
2013-02-24 11:45:56 +01:00
KHobbits 964bdc6d30 [Feature] Allow IP lookup in /seen command.
[Permission] essentials.seen.ipsearch - allows /seen <ip address>
2013-02-24 03:55:20 +00:00
KHobbits 3d5aa40965 Clarify vanish status a little. 2013-02-23 23:34:31 +00:00
Iaccidentally 26352ac6b6 Merge pull request #352 from GunfighterJ/patch-15
[Fix] Persist yaw and pitch on teleport
2013-02-23 11:57:15 -08:00
KHobbits 00ec717e7d Merge pull request #356 from skmedix/patch-19
Update Essentials/src/messages_pl.properties
2013-02-23 05:26:21 -08:00
skmedix f70015e8c5 Update Essentials/src/messages_pl.properties
Update Polish translations.
---
Date: 23.02.13
---
* Fixed "fireworkSyntax" (502)
* Fixed colors.
2013-02-23 11:08:47 +01:00
ElgarL 399be38680 Merge pull request #355 from necrodoom/patch-63
add "all_unnamed_worlds" info
2013-02-22 12:47:12 -08:00
Necrodoom 3bceecdfb6 fix typo 2013-02-22 20:49:57 +02:00
Necrodoom 68b95c668d add "all_unnamed_worlds" info 2013-02-22 20:48:09 +02:00
ElgarL a7648c7c12 Only one error this time Necrodoom :) 2013-02-22 17:21:14 +00:00
ElgarL bda3c32370 Merge pull request #353 from necrodoom/patch-61
various messages fixes - This better work!!!!!!
2013-02-22 09:19:56 -08:00
ElgarL 9ce067a7fd Fix global mirroring of non main worlds. 2013-02-22 17:07:55 +00:00
Necrodoom ef7d323902 various messages fixes 2013-02-22 19:07:01 +02:00
GunfighterJ b83a8eccee [Fix] Persist yaw and pitch on teleport
Vanilla bukkit/MC persists yaw on teleport
2013-02-22 10:56:39 -06:00
ElgarL 51ddcdcf87 Merge pull request #351 from GunfighterJ/gm-patch-1
Receive was spelt wrong
2013-02-22 05:56:53 -08:00
GunfighterJ 8ca738a436 I before E except after C 2013-02-22 07:50:54 -06:00
ElgarL f9b5d74f6d Do not list "all_unnamed_worlds" as a selectable world. 2013-02-22 13:17:58 +00:00
ElgarL 8960417d56 Don't try to use the worldHolder before it's initialised. 2013-02-22 12:59:50 +00:00
ElgarL 90730f63d5 Added a new mirroring option in the config of 'all_unnamed_worlds'. This
will cause all new or unnamed worlds to use this mirroring.
2013-02-22 12:39:41 +00:00
ElgarL 13e07f64ec '/manselect' will no longer list duplicate worlds. 2013-02-22 11:46:59 +00:00
KHobbits 6308b1ecf3 Merge pull request #350 from skmedix/patch-18
Update Polish TL - Thanks to andrewkm for proofing.
2013-02-22 02:44:03 -08:00
skmedix dff7e81b7f Update Essentials/src/messages_pl.properties
Update Polish translations.
---
Date: 21.02.13
---
+ Added "cleaned" (42)
+ Added "cleaned" (43)
2013-02-21 11:03:06 +01:00
GunfighterJ bf0a11e4fe Cache teleport invulnerability time 2013-02-20 13:46:28 +00:00
Chris Ward c9efe14ad3 Final! 2013-02-20 12:46:47 +11:00
KHobbits 64ee6b7914 Readme cleanup. 2013-02-20 01:39:04 +00:00
KHobbits 6ae6c51dc0 Code cleanup 2013-02-19 23:06:04 +00:00
kukelekuuk00 8710a133ce Added /essentials cleanup <days> [money] [homes] [bans]
Delete userdata of players offline for over <days> and with less money than [money], less homes than [homes] and less bans than [bans].
2013-02-19 22:43:23 +00:00
Necrodoom 32b1ce9e39 add 1.5 new slab blocks 2013-02-19 19:47:49 +02:00
Necrodoom c982592674 update items.csv to minecraft 1.5
dont pull till 1.5 bukkit devbuild
2013-02-19 13:35:29 +02:00
Chris Ward ff02f0e270 Merge pull request #341 from necrodoom/patch-59
fix rest of "posion" aliases
2013-02-19 02:26:44 -08:00
Necrodoom 8f52908eed fix rest of "posion" aliases 2013-02-19 11:46:26 +02:00
GunfighterJ 8f8fc4a08d Fixes Necrodoom's code Needs more exception 2013-02-18 15:25:09 +00:00
Necrodoom e63276242c make sure player isnt dead before healing 2013-02-18 15:08:55 +00:00
KHobbits 3ddbeea45a Fix socialspy command list. 2013-02-17 18:05:07 +00:00
ElgarL 7f972801bf Fix Necrodooms code...again! 2013-02-17 17:24:52 +00:00
ElgarL 36e354388c Merge pull request #338 from necrodoom/patch-57
if variable is inside ' ', strip them
2013-02-17 09:22:36 -08:00
ElgarL bbd0021a8b Merge pull request #328 from necrodoom/patch-53
delete player command messages, bukkit does it
2013-02-17 09:21:12 -08:00
Necrodoom 880fb29b44 if variable is inside ' ', strip them 2013-02-17 19:09:04 +02:00
KHobbits 31f3662101 Clarify command disabling. 2013-02-17 16:30:05 +00:00
Necrodoom 5f2c759a8f fix auto afk description 2013-02-17 16:26:18 +00:00
KHobbits a91cfbf43a Merge pull request #334 from necrodoom/patch-54
add skull alias to head item
2013-02-17 08:17:10 -08:00
Necrodoom 33fa32cbff add skull alias to head item 2013-02-17 18:15:48 +02:00
snowleo 69e941670f why do we even remove the items?
derp
2013-02-17 15:34:49 +01:00
snowleo af10a2050a Revert the last 2 commits and actually fix the right one. 2013-02-17 15:17:47 +01:00
snowleo ce9e630072 Fix all removeItem()
This could fix some broken logging of selling items
2013-02-17 15:10:41 +01:00
snowleo ef063c255e Items can't be reused after the have been used in removeItem 2013-02-17 15:07:32 +01:00
KHobbits 0e7d64f9e7 Fix a couple of cosmetic errors in /seen 2013-02-17 01:18:50 +00:00
Skylexia 2a91f593de Fixed colour coding.
Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

Fixed colour coding.

totalWorthAll
totalWorthBlocks
2013-02-16 18:22:25 +00:00
KHobbits 9186ca2c9a Merge pull request #333 from GunfighterJ/patch-12
Adds optional argument to clear both inventory and armor with /clear
2013-02-16 08:40:44 -08:00
GunfighterJ f1e4e49779 Adds optional argument to clear inventory and armor with /clear 2013-02-15 12:38:41 -06:00
ElgarL 3740f200f8 Catch the error when using an out of date config for
'allow_commandblocks' So it doesn't kill the whole config.
2013-02-15 17:39:34 +00:00
KHobbits 5840c02efc Merge pull request #331 from kukelekuuk00/2.9
Add methods to UserData and IUser for accessing and writing of data from other plugins.
2013-02-14 03:05:41 -08:00
kukelekuuk00 f16907412d Add a method to write to the userdata to UserData.java and IUser.java. 2013-02-13 08:24:25 -06:00
Iaccidentally 44a6f4d562 Merge branch '2.9' of https://github.com/essentials/Essentials.git into 2.9 2013-02-12 18:38:35 -05:00
Iaccidentally ec8c778f68 Clean up protect :: transient is not needed :: remove unnecessary returns :: @Override all the things! 2013-02-12 18:37:40 -05:00
KHobbits 56df6b36a5 Fix /give|/item descriptions for itemmeta. 2013-02-12 22:56:17 +00:00
KHobbits 30b65a0bc7 Merge branch '2.9' of github.com:essentials/Essentials into patch-41 2013-02-12 22:46:35 +00:00
Necrodoom 0dc8980d32 remove color from bedNull 2013-02-12 22:45:54 +00:00
KHobbits fa8b8bec5a fix typo in messages
add new messages to messages.properties

add new messages to messages_en.properties

add new messages to messages_cs.properties

add new messages to messages_da.properties

add new messages to messages_de.properties

add new messages to messages_es.properties

add new messages to messages_fi.properties

add new messages to messages_fr.properties

add new messages to messages_it.properties

add new messages to messages_nl.properties

add new messages to messages_pl.properties

add new messages to messages_pt.properties

add new messages to messages_se.properties

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull

remove color from bedNull
2013-02-12 22:45:54 +00:00
Necrodoom 63c7d4519a change bed spawn set message 2013-02-12 22:43:07 +00:00
Necrodoom 2a816cef7b try improve bed spawn handle
dont act as if bed doesnt exist if its missing
2013-02-12 22:43:06 +00:00
Iaccidentally c2d904ac7d Fix build :: This is what happens when you don't use an IDE 2013-02-12 17:42:04 -05:00
Necrodoom 911224dc64 fix typo 2013-02-12 22:26:02 +00:00
KHobbits 0ad765e1c8 add inventoryclearall message
update messages.properties

update messages_en.properties

update messages_da.properties

update messages_de.properties

update messages_en.properties

update messages_es.properties

update messages_fi.properties

update messages_fr.properties

update messages_it.properties

update messages_nl.properties

update messages_pl.properties

update messages_pt.properties

update messages_se.properties
2013-02-12 22:26:02 +00:00
Skylexia 9db040edd4 Update Essentials/src/config.yml 2013-02-12 17:17:48 -05:00
Skylexia c0f3e9073d Update Essentials/src/plugin.yml 2013-02-12 17:13:08 -05:00
Necrodoom e4565de717 delete player command messages, bukkit does it 2013-02-12 16:56:54 +02:00
ElgarL 33382f9940 Merge pull request #327 from necrodoom/patch-52
add missing return false in manudelp
2013-02-12 06:49:27 -08:00
Necrodoom 1d0c2f75dc add missing return false; 2013-02-12 16:47:39 +02:00
KHobbits c3f0d34293 Minor entity optimization. 2013-02-11 23:33:30 +00:00
KHobbits c298fb9332 Attempt to optimize Essentials login event. 2013-02-11 23:11:37 +00:00
KHobbits a1f1319990 Merge pull request #325 from Skylexia/patch-2
Fixed all "poison" typos; add ppotato alias.
2013-02-11 15:00:14 -08:00
Skylexia 2316bfbd28 Update Essentials/src/items.csv 2013-02-11 17:57:20 -05:00
KHobbits 96348a5e92 Merge pull request #324 from Skylexia/patch-1
Update Essentials/src/items.csv
2013-02-11 10:41:09 -08:00
Skylexia d9903efcf4 Update Essentials/src/items.csv 2013-02-11 13:38:11 -05:00
KHobbits bc90deb87d Merge pull request #322 from necrodoom/patch-50
add dye aliases to match bukkit
2013-02-11 09:22:56 -08:00
Necrodoom c35e5bf53a add dye aliases to match bukkit 2013-02-11 18:56:23 +02:00
KHobbits 8ea0a152d4 Merge pull request #321 from GunfighterJ/patch-10
Fix array index out of bounds on /firework fire
2013-02-11 08:41:47 -08:00
GunfighterJ 8e205768b3 Fix array index out of bounds on /firework fire 2013-02-11 10:35:55 -06:00
ElgarL fcfa3ce31d Merge pull request #298 from necrodoom/patch-37
Fix typo at groupmanager config.yml
2013-02-10 02:12:42 -08:00
Chris Ward 05aeba521f Merge pull request #317 from necrodoom/patch-47
update AFK documation
2013-02-10 01:54:37 -08:00
Necrodoom 8dff1155bf update AFK documation 2013-02-10 11:46:59 +02:00
Chris Ward b6648ad9bd Fix compilation, unreachable code. 2013-02-10 20:37:46 +11:00
Chris Ward 40f03295a1 Merge pull request #316 from necrodoom/patch-46
throw exception on banexempt
2013-02-10 01:34:53 -08:00
Necrodoom 5fdb10a5bf throw exception on banexempt
match rest of moderator commands
2013-02-10 11:04:55 +02:00
KHobbits e9bb2df87d Fix kit messages when giving kit to another player. 2013-02-10 00:07:40 +00:00
KHobbits be29e4da59 missing alias 2013-02-09 23:39:21 +00:00
GunfighterJ b2a0166c46 Proper TL 2013-02-09 16:27:54 -06:00
GunfighterJ 03b115d4c3 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-02-09 16:27:19 -06:00
KHobbits d522a4230f Make /god and /god <player> behave the same. 2013-02-09 19:31:31 +00:00
Chris Ward f17485b112 Merge remote-tracking branch 'origin/groupmanager' into 2.9 2013-02-09 21:55:20 +11:00
ElgarL 1f932434c2 Fix bad Git Merge 2013-02-09 10:51:16 +00:00
Chris Ward 92b0178ca7 Merge pull request #312 from necrodoom/patch-44
update kit link to the new one
2013-02-09 02:48:48 -08:00
Necrodoom d30c3ca2a6 update kit link to the new one 2013-02-09 12:47:36 +02:00
Chris Ward fb60272439 Merge pull request #311 from necrodoom/patch-43
fix itemmeta link on kit section
2013-02-09 02:41:01 -08:00
Necrodoom 80ad075f02 fix itemmeta link on kit section 2013-02-09 11:57:32 +02:00
GunfighterJ 37029e6b5d Un-deletes deleted things. 2013-02-08 17:14:46 -06:00
GunfighterJ 631e0bbd0a Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-02-08 16:05:48 -06:00
snowleo 3f31dc179b Fix /seen command 2013-02-08 22:26:21 +01:00
snowleo 5b975672e8 Don't overwrite last location on logout
Logout position is saved as logoutlocation now in users yml
2013-02-08 21:22:35 +01:00
snowleo 335d8b7f20 Check if player is still online 2013-02-08 21:18:00 +01:00
snowleo 379e75f3e6 Fix async access to bukkit code 2013-02-08 21:16:21 +01:00
Chris Ward 2ca171a3f4 Merge pull request #304 from necrodoom/patch-40
pull messages.properties changes to messages_en
2013-02-06 22:54:27 -08:00
Necrodoom 8036cc9924 pull messages.properties changes to messages_en 2013-02-06 16:15:18 +02:00
Chris Ward 6442e793a9 Merge pull request #300 from necrodoom/patch-39
add missing puncuation
2013-02-06 02:49:04 -08:00
KHobbits d745b866c0 Don't block food recovery in god mode. 2013-02-05 23:34:08 +00:00
KHobbits 4493d7d00c Merge pull request #302 from GunfighterJ/patch-9
Prevents flying from being disabled on world teleport if player has esse...
2013-02-05 12:07:36 -08:00
GunfighterJ 631692d763 Prevents flying from being disabled on world teleport if player has essentials.fly 2013-02-05 13:16:27 -06:00
GunfighterJ ef341ae539 Adds potion meta
Some cleanup as well
2013-02-05 13:13:19 -06:00
Necrodoom d0e3c1d946 fix a few errors 2013-02-05 16:45:30 +02:00
Necrodoom 82137e0703 add missing puncuation
probably needs extra reading though before pulling.
2013-02-05 13:57:27 +02:00
KHobbits a3b2ffdeef Merge pull request #297 from necrodoom/patch-36
fix typo at ID 22
2013-02-05 03:26:19 -08:00
Necrodoom dd095e15cb Fix typo at groupmanager config.yml 2013-02-05 13:13:00 +02:00
Necrodoom 46fc6c192c fix typo at ID 22 2013-02-05 13:11:36 +02:00
ElgarL 6506c290c8 Revert Necro's change to mancheckw 2013-02-04 13:44:58 +00:00
ElgarL b1bc73f938 Fix Necrodooms errors for not using an IDE!!!!! 2013-02-04 13:33:06 +00:00
ElgarL 09851acd1b Merge pull request #291 from necrodoom/patch-32
display name instead of path for /mancheckw
2013-02-04 05:29:10 -08:00
ElgarL df42c9051b Merge pull request #290 from necrodoom/patch-30
Derp - revert incorrect modified line
2013-02-04 05:25:10 -08:00
KHobbits 24c93c11c0 Stylize 'bed' in /home list 2013-02-03 17:30:14 +00:00
Chris Ward 5a13e9bbe5 Merge pull request #294 from necrodoom/patch-35
add common cat type name aliases
2013-02-03 05:16:17 -08:00
Necrodoom 05f337c63c add common cat type name aliases 2013-02-03 15:13:36 +02:00
KHobbits eea0c9682c We don't need move events if afk interact is disabled. 2013-02-03 05:15:25 +00:00
KHobbits 2f567812d2 Merge pull request #292 from GunfighterJ/2.9
Adds toggle to disable AFK cancel on interactions
2013-02-02 21:11:43 -08:00
GunfighterJ 88c1b785af Adds toggle to disable AFK cancel on interactions 2013-02-02 23:06:09 -06:00
KHobbits 5225fb22f8 Minor comment updates. 2013-02-03 04:14:23 +00:00
Necrodoom fae5780e09 Update EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java 2013-02-01 16:39:18 +02:00
Necrodoom 7ec65bf213 Update EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java 2013-02-01 16:33:55 +02:00
Necrodoom d40484d016 Update EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java 2013-02-01 16:33:37 +02:00
Necrodoom 971902ae38 Update EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java 2013-02-01 16:31:58 +02:00
Necrodoom 844be04d75 Derp - revert incorrect modified line 2013-02-01 14:14:46 +02:00
KHobbits ef01332114 Fix missing 'bed' from home list. 2013-02-01 05:26:17 +00:00
KHobbits 705b193450 Let Bukkit decide if a bedspawn is valid or not.
Bukkit's bed fix forces minimum bukkit change.
2013-02-01 02:59:40 +00:00
KHobbits 20b9111495 [GM] Catch all of the null. 2013-02-01 02:52:41 +00:00
KHobbits 1661eddc02 Make gm API lookup respect offlineperms toggle properly. 2013-02-01 00:01:57 +00:00
KHobbits 15be319d3e Updating groups example 2013-01-31 21:02:38 +00:00
KHobbits fddbd7a52a Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9
Conflicts:
	EssentialsGroupManager/src/Changelog.txt
2013-01-31 20:38:36 +00:00
Iaccidentally 360e3e8801 cleanup :: fix build 2013-01-31 14:40:33 -05:00
Iaccidentally 4edc39360a Refactor name of ScheduleAsyncDelayedTask to RunTaskAsynchronously 2013-01-31 14:16:09 -05:00
Iaccidentally cd126264e0 Update to 1.4.7 R1 :: remove calls to ScheduleAsyncDelayedTask, as it is deprecated :: cleanup :: WARNING: This commit may or may not be stable 2013-01-31 14:03:27 -05:00
ElgarL df0ccb5832 Fix Necrodooms broken code. 2013-01-30 19:55:38 +00:00
ElgarL 8afcd41ab2 Merge pull request #288 from necrodoom/patch-29
config option to allow GM commands in commandblocks
2013-01-30 11:45:27 -08:00
Necrodoom b8a71761ec update changelog 2013-01-30 19:26:46 +02:00
Necrodoom 738ded7ae5 update commandblock usage deny message 2013-01-30 19:25:35 +02:00
Necrodoom 5535435215 update config description of allow_commmandblocks 2013-01-30 19:14:57 +02:00
Necrodoom 4167dd2590 add allow commandblock check 2013-01-30 18:53:40 +02:00
Necrodoom 623ff0f629 register new config setting 2013-01-30 18:47:19 +02:00
Necrodoom 6e4ba4302f update config.yml to include commandblock change 2013-01-30 18:15:58 +02:00
KHobbits 3d4d616414 What is less than less than one. 2013-01-29 23:59:31 +00:00
KHobbits d6c91d2d04 Might as well make it all safe. 2013-01-29 23:51:42 +00:00
snowleo cef8cf7b75 Don't run calls against bucket api in async login thread 2013-01-30 00:26:50 +01:00
snowleo 12786a260e Update /sell command to newer bukkit api 2013-01-29 20:29:03 +01:00
ElgarL 6ea956b11c Doh, actually find what world we want to check properly with mancheckw. 2013-01-29 16:56:03 +00:00
ElgarL 132aa0cc1d Update plugin.yml with the new command 2013-01-29 16:45:23 +00:00
ElgarL b5733d6597 grammaaahhhh!!! 2013-01-29 16:35:15 +00:00
ElgarL 7fc4a75d4d Added '/mancheckw <world>' to inspect what permission files a world is
referencing.
2013-01-29 16:33:20 +00:00
ElgarL e9e9efd2d7 Missed an S 2013-01-29 16:15:45 +00:00
ElgarL 9e4493fbb4 Prevent '*' permissions granting the 'groupmanager.noofflineperm'
permission.
2013-01-29 16:14:24 +00:00
ementalo a64cb31211 Revert "Merge pull request #286 from GunfighterJ/2.9"
This reverts commit 57de3f3ed2, reversing
changes made to 76d1ea5cab.
2013-01-29 10:25:01 +00:00
Iaccidentally 57de3f3ed2 Merge pull request #286 from GunfighterJ/2.9
Ignore itemmeta on selling
2013-01-28 21:13:41 -08:00
GunfighterJ 74b63a6f2d Ignore itemmeta on sell 2013-01-28 23:11:43 -06:00
ElgarL faad91849d Add support for BukkitForge using 'overworld' as the main world name. 2013-01-28 04:13:16 +00:00
GunfighterJ ce7d83adb6 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-01-27 14:20:59 -06:00
KHobbits 76d1ea5cab Minor /ci tweak. 2013-01-27 17:22:43 +00:00
KHobbits 9fb42375b8 Cleanup /ci addition. 2013-01-27 17:10:07 +00:00
GunfighterJ 2a7f3c6525 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-01-27 10:44:13 -06:00
KHobbits c65353350f Merge pull request #278 from GunfighterJ/2.9
Adds vanilla syntax for /clearinventory
2013-01-27 08:40:39 -08:00
KHobbits 1ae58d05b4 Fix vanish status when switching worlds.
This fixes the potion effect being cleared on world change.
2013-01-27 16:39:50 +00:00
KHobbits 4f35a72174 Add command syntax comment, for clarification.
Merge branch '2.9' of github.com:essentials/Essentials into 2.9
2013-01-27 15:26:46 +00:00
KHobbits addd55228b Don't try and charge a user if we don't have the chat data stored. 2013-01-27 15:26:42 +00:00
Iaccidentally bb29d48268 Make heal remove fire from players. 2013-01-26 17:16:48 -05:00
Iaccidentally d9ee9b036c Update heal to account for the fact that 20 is not always the max health 2013-01-26 17:12:17 -05:00
GunfighterJ 95e630de92 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-01-24 21:16:13 -06:00
KHobbits 2836c0862d Revert "Prevent replacement of { and } characters in chat.format"
This reverts commit 8fde5102b9.
2013-01-25 03:12:13 +00:00
KHobbits 286091cd32 Try command fallback 2013-01-25 03:06:53 +00:00
KHobbits 20786654a4 Merge pull request #284 from phrstbrn/chat-braces-fix
Prevent replacement of { and } characters in chat.format
2013-01-24 08:53:32 -08:00
Zak Ford 8fde5102b9 Prevent replacement of { and } characters in chat.format 2013-01-24 11:43:10 -05:00
GunfighterJ 133fdac343 Update /ci to support vanilla syntax 2013-01-23 16:47:21 -06:00
Chris Ward 2361b9e724 Add debug option to XMPP 2013-01-23 19:41:36 +11:00
Chris Ward 972d831d0d Remove references to earth2me in plugin.ymls 2013-01-23 02:56:18 +11:00
Chris Ward bfa34130a0 Merge pull request #280 from necrodoom/patch-28
update documation reference in config.yml
2013-01-22 00:13:07 -08:00
Necrodoom befe1fb39e Update Essentials/src/config.yml 2013-01-22 09:54:48 +02:00
KHobbits 378eaaaf1f Small patch to allow multiple firework effects to be defined in kits. 2013-01-21 23:38:03 +00:00
KHobbits 51a55318d0 Revert /gc change.
Simplify firework syntax, and add help
Merge branch 'patch-26' of git://github.com/necrodoom/Essentials into 2.9
2013-01-21 20:07:02 +00:00
KHobbits 4663c89dd6 Merge pull request #276 from necrodoom/patch-26
Update Essentials/src/plugin.yml
2013-01-21 06:41:32 -08:00
Necrodoom 2a1c3fb8e0 Update Essentials/src/plugin.yml 2013-01-21 16:40:45 +02:00
Necrodoom 0ac1a90b93 Update Essentials/src/messages_en.properties 2013-01-21 16:37:12 +02:00
Necrodoom ab6b3bff90 fix message 2013-01-21 16:35:40 +02:00
Necrodoom 2d00fd0c1e try make error message more informative 2013-01-21 16:32:49 +02:00
Necrodoom e5f4cb9a4d Update Essentials/src/plugin.yml 2013-01-21 16:29:26 +02:00
KHobbits 91701e8c2f Allow negative exp to be given 2013-01-21 14:15:53 +00:00
KHobbits 9cef107bc3 Fix a couple of param issues. 2013-01-21 13:40:45 +00:00
KHobbits 76fd829e8c Merge pull request #275 from DMarby/patch-1
Update Essentials/src/messages_se.properties
2013-01-20 15:31:34 -08:00
David Marby 6ea422015c Update Essentials/src/messages_se.properties 2013-01-21 00:26:38 +01:00
KHobbits 443a317184 Show afk warning when pm'ing afk players.
Fix vanished leak on player matching.
2013-01-20 22:05:44 +00:00
KHobbits 50dca9abf5 Add optional 2nd arg to broadcast format. 2013-01-20 20:58:05 +00:00
KHobbits f1e3d48248 Fix book meta error message. 2013-01-20 20:41:15 +00:00
KHobbits 63ce4a99b9 Trim long /gc output, add /gc all 2013-01-20 20:35:41 +00:00
KHobbits 1ccda52e9f Fix minor /book bug (Null author) 2013-01-20 20:06:27 +00:00
KHobbits 1679790157 Fix eco take derp. 2013-01-20 19:43:59 +00:00
KHobbits 6170540a24 Fix colour syntax message on coloured leather. 2013-01-20 01:44:03 +00:00
KHobbits 987b2ff4d5 Minor cleanup on /eco command. 2013-01-20 01:24:09 +00:00
KHobbits 23a15cb11a Merge pull request #274 from GunfighterJ/2.9
Cleanup /eco, fix reset broadcast
2013-01-19 17:12:07 -08:00
KHobbits 41547e3243 Cleanup /exp command, and fix vanilla syntax issues.
Needs double checking with commandblocks with vanilla syntax.
2013-01-20 01:10:41 +00:00
GunfighterJ a586edfd0b Cleanup /eco, fix reset broadcast 2013-01-19 17:58:12 -06:00
KHobbits 762bb65677 Add example firework kit, and cleanup debug messages. 2013-01-19 23:43:40 +00:00
KHobbits 73c92bf742 Move firework meta handling into MetaItemStack
Allow firework meta to be applied to item spawning and kit commands.
2013-01-19 23:35:59 +00:00
ElgarL 2b8435342d Negate 'groupmanager.noofflineperms' by default in the owner group. 2013-01-19 22:22:42 +00:00
KHobbits 9566499a2f Merge pull request #272 from GunfighterJ/2.9
/eco overhaul, adds /eco set
2013-01-19 10:54:11 -08:00
GunfighterJ 343c3a1bdd /eco overhaul, adds /eco set 2013-01-19 12:50:35 -06:00
KHobbits 9aeb49f6c3 Reduce chance of self repeating powertool actions. 2013-01-19 15:19:39 +00:00
Chris Ward 7dae04759f Merge pull request #271 from necrodoom/patch-25
update /book description
2013-01-19 06:21:47 -08:00
Necrodoom e2f6e5a7fd update /book description 2013-01-19 16:16:35 +02:00
ElgarL d26fa6c5b8 Negate 'groupmanager.noofflineperms' by default in the owner group. 2013-01-19 12:40:40 +00:00
Chris Ward 82f9505a2e Touch of cleanup to Gunfighter's addition to exp 2013-01-19 18:22:22 +11:00
GunfighterJ f8ce80c18a Adds vanilla syntax to /exp command 2013-01-18 18:20:05 -06:00
Alexander Schepp 313fd30ce9 Fix bug with empty motd 2013-01-18 23:36:59 +01:00
Iaccidentally da216b05d9 Merge pull request #266 from GunfighterJ/2.9
Duplicate alias removed
2013-01-17 17:30:04 -08:00
GunfighterJ d8132548f6 Duplicate alias removed 2013-01-17 19:27:21 -06:00
snowleo 6fdeddd96b Merge remote-tracking branch 'origin/groupmanager' into 2.9 2013-01-18 01:01:23 +01:00
Iaccidentally 8082508db9 Merge pull request #265 from GunfighterJ/2.9
Adds essentials.mute.notify
2013-01-17 15:53:37 -08:00
GunfighterJ 78e6da9504 Adds essentials.mute.notify 2013-01-17 17:42:32 -06:00
Iaccidentally 0014d5cfcb Merge pull request #263 from GunfighterJ/2.9
Added /firework command
2013-01-17 14:59:01 -08:00
Iaccidentally 6aeba173b9 Update libs 2013-01-17 14:36:03 -05:00
Iaccidentally a2813358af Update Bukkit to 1.4.7-R0.1 2013-01-17 14:25:19 -05:00
GunfighterJ 8e663b53ce Now it adds the right firework command 2013-01-16 20:40:29 -06:00
GunfighterJ 214d9414da Adds the actual /firework command 2013-01-16 20:39:09 -06:00
GunfighterJ 6d7881f876 Added /firework command 2013-01-16 20:36:33 -06:00
Iaccidentally 19ccdf2193 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-01-16 21:23:17 -05:00
KHobbits 35036ecc18 Fix null args on /book 2013-01-16 16:56:27 +00:00
KHobbits b3cc4dbe09 Remove logger. 2013-01-16 16:30:30 +00:00
KHobbits 04bd9e8baf Remove broken firework meta. 2013-01-15 00:37:08 +00:00
KHobbits fdc262a205 Start work on firework effect - syntax in flux 2013-01-14 23:11:19 +00:00
Iaccidentally 32ea86bfd3 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-01-14 17:25:32 -05:00
KHobbits 4807fb39e5 Couple of extra /helpop aliases. 2013-01-14 21:40:25 +00:00
KHobbits 4ffe61a505 Add colour support to item meta. 2013-01-14 21:34:35 +00:00
KHobbits d74952927a Only show ban reason in the in-game display, not full banFormat. 2013-01-14 11:59:31 +00:00
KHobbits f8cf3be87f Better handle initial book.txt creation. 2013-01-14 08:21:03 +00:00
KHobbits ada266a0f9 Switch book meta, to use 'book.txt', and 'book:<section>'.
Should make things clearer and easier to understand.
2013-01-14 08:14:42 +00:00
KHobbits 115c4fa1d0 Merge remote-tracking branch 'remotes/origin/groupmanager' into 2.9 2013-01-14 07:37:11 +00:00
KHobbits 0c19b2feed All the better to kick you with
(Pipe format for linebreak)
2013-01-14 07:36:45 +00:00
ElgarL 04c833f648 Fix recursive loop when used on offline servers. 2013-01-14 06:47:50 +00:00
ElgarL 4533d09fc9 Update GlobalGroups (removing old permissions) as Towny handles it's own
perms now.
2013-01-14 05:48:48 +00:00
KHobbits 7337b86a16 Cleanup /book command. 2013-01-13 23:11:15 +00:00
Iaccidentally 3db015b1c1 Merge pull request #260 from GunfighterJ/patch-3
Fixes /top command not carrying pitch and yaw
2013-01-13 15:09:05 -08:00
GunfighterJ 659d602b57 Fixes /top command not carrying pitch and yaw 2013-01-13 17:02:46 -06:00
KHobbits f82d7e806f Merge pull request #259 from GunfighterJ/patch-2
Added more book commands for editing author and title
2013-01-13 14:57:35 -08:00
GunfighterJ a8088fb8c8 Merge branch 'patch-2' of https://github.com/GunfighterJ/Essentials into patch-2
Conflicts:
	Essentials/src/com/earth2me/essentials/commands/Commandbook.java
2013-01-13 16:31:29 -06:00
GunfighterJ 84c06fb746 Added more book arguments for editing author and title amend 2013-01-13 16:19:37 -06:00
KHobbits ffe2a283d2 Cleanup of book meta. 2013-01-13 22:18:08 +00:00
GunfighterJ 7e3fd48956 Added more book commands for editing author and title 2013-01-13 15:54:11 -06:00
KHobbits bd22aec38a Adding support for books made from /einfo 2013-01-13 21:08:24 +00:00
ElgarL 675c4b7897 typo in changelog. 2013-01-13 16:40:53 +00:00
ElgarL ad7009c77e Do not grant any permissions (nort update Bukkit) if the server is in
offline mode and the player has the permission node
'groupmanager.noofflineperms'.
2013-01-13 16:39:53 +00:00
KHobbits 3f783bb43b Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2013-01-13 16:30:43 +00:00
KHobbits 9fe7712bd6 Clean up TextPager 2013-01-13 16:30:22 +00:00
ElgarL 24f56892ad Fix the logger so errors are reported again. 2013-01-13 16:20:38 +00:00
ElgarL b860e943f6 Synchronize pushing to Bukkit perms to prevent any
ConcurrentModificationException.
2013-01-13 16:20:09 +00:00
Chris Ward 5dc2665377 Merge pull request #258 from necrodoom/patch-22
update ID 397:3
2013-01-13 05:03:05 -08:00
Necrodoom dd9b7e0d3c update ID 397:3 2013-01-13 15:01:10 +02:00
KHobbits 18a15ca63c Add provisional support for basic item Meta
Adds /book command to allow reediting of signed books.
2013-01-13 04:44:28 +00:00
KHobbits ef1492a2a2 Clean up userdata saving, to prevent CMI
Also update config section code to use newer bukkit methods
2013-01-12 19:30:06 +00:00
KHobbits 298ab846c1 Don't extend ItemStack 2013-01-12 17:05:05 +00:00
KHobbits 7fdb2ad7d3 Pull item meta from itemdb class 2013-01-12 14:12:12 +00:00
Iaccidentally 3afe8d18f4 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-01-11 12:56:18 -05:00
Iaccidentally 0b581580c7 Merge pull request #251 from necrodoom/patch-19
/me shakes fist at Khobbits
2013-01-11 09:17:44 -08:00
Necrodoom 01e78cd666 /me shakes fist at Khobbits
fixes e6aeefb12d whitespace
2013-01-11 19:10:32 +02:00
Chris Ward 29d28456aa Merge remote-tracking branch 'origin/groupmanager' into 2.9 2013-01-11 21:59:39 +11:00
Chris Ward f3812786d0 Fixes Item Frames being linked to Paintings when breaking 2013-01-11 21:54:52 +11:00
ElgarL 999d922fb9 Store a plugin and server reference. 2013-01-11 00:53:48 +00:00
KHobbits 2d4a07b95b New permission: essentials.sethome.bed
Players with this permission will force a bed home updating if daytime beds are enabled.
2013-01-10 22:36:38 +00:00
Chris Ward 5c99eee0c0 Implement abstract methods 2013-01-10 22:57:08 +11:00
Chris Ward 1fc502a4ff Update bukkit/craftbukkit libs. Force latest beta version 2013-01-10 22:51:48 +11:00
KHobbits e73983649f Ban cleanup 2013-01-09 21:31:56 +00:00
KHobbits 465cdae989 Util commenting 2013-01-09 21:18:46 +00:00
KHobbits 341cb89bb7 Multiline kick messages and tempban countdown. 2013-01-09 21:04:58 +00:00
Chris Ward 79004c7098 Merge branch 'groupmanager' into 2.9 2013-01-10 04:57:10 +11:00
Joseph 2988db08ca Formatting 2013-01-10 03:25:58 +11:00
GunfighterJ b04fa82be2 Add more items to Fireball command. Add delay option to /spawner 2013-01-10 03:25:57 +11:00
Chris Ward 5d210d81dc Merge pull request #247 from necrodoom/patch-18
rewrite ID 43:6, 44:6, 113, 114
2013-01-09 06:50:31 -08:00
Necrodoom c14b32123f rewrite ID 43:6, 44:6, 113, 114 2013-01-09 16:46:37 +02:00
ElgarL f256930269 Synchronize the raising of GroupManager events to Bukkit.getServer()
(should prevent deadlocks).
2013-01-09 14:38:00 +00:00
ElgarL cde95d832e Merge pull request #241 from necrodoom/patch-15
fix typo
2013-01-09 02:50:30 -08:00
ElgarL b9af4fb35c Remove attachments BEFORE we clear them. 2013-01-09 04:27:10 +00:00
ElgarL 5056210a38 code tidy. 2013-01-09 04:13:40 +00:00
ElgarL eacb847305 Remove attachments before clearing 2013-01-09 04:04:59 +00:00
ElgarL 27ff43c0ac Clear our attachment map upon a manload so we correctly reconfigure a
players new permissions.
2013-01-09 03:55:26 +00:00
KHobbits 368c33a843 Expand plugin.yml fireball aliases. 2013-01-09 01:00:13 +00:00
KHobbits c210e8730b Fire a few extra entities from /fireball 2013-01-09 00:58:29 +00:00
KHobbits 6c48e02c14 Add a couple of extra entities to spawnmob 2013-01-09 00:41:24 +00:00
KHobbits c54d68a660 Cleanup 2013-01-08 23:59:31 +00:00
KHobbits 33d3123104 Pull and clean up book enchant pullreq.
Removed 1 enchant per book limit, anvils seem to handle multiple enchants fine, even if the result can only be one enchant.
2013-01-08 23:51:46 +00:00
Chasing Code df0b1cedd8 Add missing import for EnchantmentStorageMeta 2013-01-08 11:46:08 -08:00
Chasing Code 2b57381fb8 Store enchanments in Enchanted Books
Change enchant command to store the enchantment instead of applying it when used on an Enchanted Book.  If an enchantment is already present, replace it (only one allowed on Enchanted Books).
2013-01-08 11:37:46 -08:00
oggehej 67b9a82e51 Update Swedish translation with new messages. 2013-01-08 19:45:51 +11:00
Chris Ward c4e10da646 Store regex, use util method instead of another regex. Store variable 2013-01-08 02:26:09 +11:00
Chris Ward fbb1c1278c Fix multiple enchantments in kits 2013-01-08 02:25:35 +11:00
Chris Ward 9b49c5e0f4 Merge pull request #242 from necrodoom/patch-17
update ID 127
2013-01-07 07:00:41 -08:00
Necrodoom 186d4e2fd1 update ID 127 2013-01-07 16:52:51 +02:00
Chris Ward 437b01e371 Unnecessary RegEx is unnecessary. 2013-01-08 00:08:11 +11:00
KHobbits 3bf36fecf9 Enchantment and item spawning cleanup
Should make it a little easier to add itemmeta.
2013-01-06 18:28:24 +00:00
KHobbits c57332be63 Tell user that /mail sendall succeeded when used in console. 2013-01-06 16:27:20 +00:00
Necrodoom 292fb0cea1 fix typo 2013-01-05 19:05:02 +02:00
Necrodoom 3c4388f8be update IDs 368, 381, 399, 402 2013-01-05 19:27:56 +11:00
KHobbits f930ff48a2 Throw an error if user doesn't have permission to use kit sign. 2013-01-05 07:39:32 +00:00
KHobbits ef7b940e96 More user feedback on enchant sign. 2013-01-05 07:24:02 +00:00
KHobbits 6497db837d Allow unsafe enchants to be placed by [enchant] signs if enabled in the config file. 2013-01-05 07:05:25 +00:00
KHobbits 87cb6190eb Couple of extra enchant aliases 2013-01-05 06:59:37 +00:00
KHobbits 74c4c604da Merge branch 'release' into 2.9 2013-01-04 21:40:02 +00:00
KHobbits 0937a35470 Fix sign break bug 2013-01-04 13:05:57 +00:00
md_5 121f09caf0 Might be worth catching other occurances of the event too. 2013-01-04 13:53:01 +11:00
md_5 ef8bd3422a ArrayList, I choose you! (Fixes CraftBook erroring when the killall command is used and custom drops are enabled in that plugin) 2013-01-04 13:49:45 +11:00
Alexander Schepp 2232d859fd Fix nl translation 2013-01-03 11:50:19 +01:00
Iaccidentally 0258abee29 Update AntiBuild to use HangingBreakByEntityEvent instead of deprecated PaintingBreakByEntityEvent 2013-01-02 18:25:40 -05:00
Iaccidentally 9b8991788b Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2013-01-02 18:24:34 -05:00
KHobbits 9a91c99391 Merge pull request #236 from gravypod/patch-1
Store ingredient map and recipe shape
2013-01-01 15:20:26 -08:00
KHobbits c6dd921f0c New permission: essentials.fly.safelogin - Players with this command will automatically switch to fly mode if they login whilst floating in the air. 2013-01-01 22:00:53 +00:00
KHobbits 63e622374d New perm: essentials.vanish.effect - People with this effect will get the potion effect applied while vanished. 2013-01-01 21:12:26 +00:00
KHobbits ca25c71010 Cleanup cleanup. 2013-01-01 19:48:08 +00:00
KHobbits b5e559ff66 More cleanup 2013-01-01 19:34:32 +00:00
KHobbits 555bb76428 Cleanup 2013-01-01 18:39:23 +00:00
ElgarL f210f8e20b Merge pull request #235 from necrodoom/patch-10
fix isOpOverride checks
2012-12-31 07:59:27 -08:00
gravypod e572e7c94c Store ingredient map and recipe shape 2012-12-31 10:44:28 -05:00
Chris Ward 5c9d3c6b1a Fix recipe NPE/failed display in game 2013-01-01 02:26:04 +11:00
Necrodoom ccfc23d629 fix isOpOverride checks 2012-12-31 15:35:58 +02:00
KHobbits b5dd0fc671 Don't unregister all listeners. 2012-12-31 12:15:51 +00:00
KHobbits 8e3ee8576e Unregister unused events. 2012-12-31 05:44:20 +00:00
KHobbits 4cec7fe5c1 Use bukkit api for chat user list 2012-12-31 05:43:05 +00:00
KHobbits 6c3b2076ff Allow unbanning players who do not have valid userdata 2012-12-31 01:08:39 +00:00
KHobbits cbc1aeacbe Implement event toggle. 2012-12-30 04:32:43 +00:00
KHobbits a1b2773bf5 Reorganize entity listener 2012-12-30 03:32:32 +00:00
Alexander Schepp 9ecb501e00 Use the right formatter in XMPP 2012-12-30 00:23:04 +01:00
KHobbits 3dcdad2233 Hide a few more duplicate enchantments from /enchant 2012-12-29 09:00:42 +00:00
KHobbits 3725a5e6d4 Set default tpa timeout to 2 minutes. 2012-12-29 08:40:03 +00:00
KHobbits ed88f8aa06 Allow unsafe enchantments in /item /give /kit and /enchant
Needs enabled in config file manually.
2012-12-29 08:36:24 +00:00
KHobbits d551e8c6d2 Make /enchant only show valid enchantments for the item. 2012-12-29 07:58:28 +00:00
KHobbits 69ad186839 Add aliases for new thorns enchantment. 2012-12-29 07:47:07 +00:00
KHobbits fc89867e4a Ignore self damage in teleport entity protection. 2012-12-29 07:35:26 +00:00
KHobbits bbb478c51f Lets clean up the recipe window on player quit, just in case. 2012-12-29 06:55:48 +00:00
KHobbits 03445e5b9b Fix home functionality bugs:
/home not using bed when enabled
/home not giving teleport warning
2012-12-29 06:43:26 +00:00
KHobbits 0755fbf089 Update bukkit to 1.4.6-R0.1
bukkit: 1652 cb: 2561
2012-12-29 06:37:52 +00:00
KHobbits 3a789bdcfe Fix string match error on none existing user (/ban). 2012-12-29 02:00:48 +00:00
Chris Ward 93db8bc7c1 Add SimplyPerms to classpath 2012-12-29 11:26:44 +11:00
Xefir 62832ad43a Added SimplyPerms Handler 2012-12-29 10:41:15 +11:00
Alexander Schepp 52b104aca5 Merge pull request #229 from necrodoom/patch-9
fix tempban permission check
2012-12-28 09:37:40 -08:00
Necrodoom 1f98fe710f derp - fix tempban permission check 2012-12-28 19:05:54 +02:00
ElgarL a73986a358 Fix missing + from Necrodoom's pull request. 2012-12-28 13:46:22 +00:00
ElgarL 257165584e Merge pull request #228 from necrodoom/patch-8
Update EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManage...
2012-12-28 05:43:54 -08:00
Iaccidentally 8e92150cb7 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2012-12-26 09:48:38 -05:00
Chris Ward 4bb275e1b7 Revert 6b18259af6 - Adding permission node to speak, with config option to enable the node 2012-12-27 01:41:32 +11:00
Chris Ward e5fc579071 Add tpdeny message to /tpahere 2012-12-27 01:10:57 +11:00
Iaccidentally 26306f6fa3 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2012-12-25 18:12:42 -05:00
Necrodoom 0bfb079cbb Update EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java 2012-12-25 18:11:10 +02:00
Chris Ward 6b18259af6 Adding permission node to speak, with config option to enable the node 2012-12-24 01:55:53 +11:00
Chris Ward 99c750d18b Move max-tempban-time in config 2012-12-24 01:04:02 +11:00
Chris Ward bb64fa468a Fixing IUser 2012-12-23 21:29:26 +11:00
Chris Ward 66db3c6cfb Adding isAfk and setAfk to IUser API 2012-12-23 21:25:29 +11:00
KHobbits c97763c3c8 Make seen status's only show when true. 2012-12-22 03:36:56 +00:00
Chris Ward ad3e8a3aba Merge pull request #215 from necrodoom/patch-5
update items.csv to minecraft 1.4.6
2012-12-21 04:33:14 -08:00
KHobbits 617959a11b Log target plugin in debug mode for altcmd 2012-12-21 06:38:51 +00:00
KHobbits a480091617 Final all the things - Recipe 2012-12-21 03:48:54 +00:00
KHobbits 13a847e0ab Fix recipe layout for small shapes 2012-12-21 03:35:48 +00:00
KHobbits a8a8b52977 Swap method order on recipe 2012-12-21 03:21:35 +00:00
KHobbits 226a75472c Adjust section matching. 2012-12-20 23:37:37 +00:00
KHobbits a1c88a140e Merge pull request #227 from Elvaron/2.9
FallBack for missing config property
2012-12-20 15:36:01 -08:00
Elvaron 2c3218b056 FallBack for missing config property 2012-12-21 00:16:18 +01:00
KHobbits 27db9e8c3b Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-12-20 22:58:00 +00:00
KHobbits cf0e36c973 Add support for whitelisting commands in /help by permission: essentials.help.<plugin>.<command> 2012-12-20 22:57:38 +00:00
KHobbits 1218a0b217 Reduce permissions checking when generating /help 2012-12-20 22:54:36 +00:00
KHobbits adb75b69c2 Allow certain commands while in jail, but only if the user normally has access to that command. 2012-12-20 22:53:52 +00:00
KHobbits 010df964a1 Merge pull request #226 from Elvaron/2.9
Made socialspy commands list configurable
2012-12-20 14:16:45 -08:00
Elvaron 0e2e8e16af Made socialspy commands list configurable 2012-12-20 23:07:22 +01:00
KHobbits 6f28540d59 Merge branch 'release' of github.com:essentials/Essentials into 2.9 2012-12-20 20:37:42 +00:00
KHobbits ce78125028 Add a little bit of extra information to /seen, this will show when user is online. 2012-12-20 20:37:04 +00:00
KHobbits 10b972bd07 Warn other party when teleport fails after tpaccept. 2012-12-20 20:24:07 +00:00
KHobbits 371a6437ae Redundant tpaccept cost check. 2012-12-20 20:23:51 +00:00
KHobbits 78666ade2b Fix max tempban length option. 2012-12-20 20:11:45 +00:00
KHobbits 8f00aa5542 Warn other party when teleport fails after tpaccept. 2012-12-20 20:01:43 +00:00
KHobbits b2d68fe213 Redundant tpaccept cost check. 2012-12-20 19:50:59 +00:00
KHobbits a6c13974c4 Merge branch 'release' of github.com:essentials/Essentials into 2.9 2012-12-20 17:03:48 +00:00
KHobbits fb0cd8fbf0 Remove command cost warnings from plugin matching. 2012-12-20 15:51:49 +00:00
Chris Ward 01d1ae442e Fix currency display in MOTD - display currency character, trim decimal places 2012-12-20 15:45:32 +00:00
snowleo dc13f46ff1 Don't use broken CB methods ... 2012-12-20 15:45:22 +00:00
snowleo f125ac3b4a Don't use broken CB methods ... 2012-12-20 16:07:40 +01:00
Chris Ward be29a373ab Useless import 2012-12-20 23:10:38 +11:00
Chris Ward b28db7e435 Fix currency display in MOTD - display currency character, trim decimal places 2012-12-20 23:07:49 +11:00
md_5 3ac6cc11e3 Fix nagging for overriden commands. 2012-12-20 09:56:30 +01:00
snowleo 9097bef728 Merge branch 'refs/heads/groupmanager' into 2.9 2012-12-20 09:55:26 +01:00
snowleo 68e401821f Fix gm builds
Change craftbukkit.jar -> bukkit,jar
2012-12-20 09:36:35 +01:00
md_5 7f9a52c3f7 Lets leave numeric homes as is for now, looping through all files on server startup is not the place to do this (reverse-merged from commit 79a44b919c) 2012-12-20 17:24:14 +11:00
md_5 79671d08e4 Fix nagging for overriden commands. 2012-12-20 17:11:05 +11:00
Chris Ward d01d6bcd1b Fix NPE in update (sorry again :P) 2012-12-20 15:45:09 +11:00
Chris Ward 79a44b919c Update home names to prepend "home" to numeric home names 2012-12-20 13:11:05 +11:00
snowleo 477e1a4f58 Force people to use latest CB version 2012-12-20 00:46:03 +01:00
snowleo c028c385b6 Fix Spawns / Jail loading 2012-12-20 00:46:03 +01:00
snowleo f9bcc3100c Update Inventory Workaround to the latest version
Still bugged in CB: maxAmount of items
2012-12-20 00:46:03 +01:00
snowleo 3ea3d18922 Force people to use latest CB version 2012-12-19 23:28:18 +01:00
snowleo 3faedec602 Fix Spawns / Jail loading 2012-12-19 23:26:29 +01:00
snowleo 2a88a314ce Update Inventory Workaround to the latest version
Still bugged in CB: maxAmount of items
2012-12-19 22:07:03 +01:00
ElgarL 38293560d7 Update Bukkit to version #2543 (1.4.5-R1.0) To ensure we are all
compatible with current recommended build.
2012-12-19 15:10:37 +00:00
Chris Ward f57b3595ed Fix recipe command 2012-12-20 01:35:55 +11:00
md_5 e2e6bb3876 Simply using the SnakeYaml default (which in turn defaults to Class.forName) appears to be enough to get the classes for our custom configuration. This avoid Bukkit depreciation. 2012-12-19 12:57:05 +00:00
KHobbits 4e399778b4 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-12-19 12:54:00 +00:00
KHobbits 9ba5f43315 Updating Bukkit to 1.4.5 RB
Bukkit: 1643 CB: 2543
2012-12-19 12:52:05 +00:00
Chris Ward 0bde364125 Merge pull request #223 from chrisgward/patch-1
Add /recipe command
2012-12-19 00:28:27 -08:00
md_5 87f5ec491e Simply using the SnakeYaml default (which in turn defaults to Class.forName) appears to be enough to get the classes for our custom configuration. This avoid Bukkit depreciation. 2012-12-19 19:10:02 +11:00
Chris Ward 1f8a0a811f Add /recipe command 2012-12-19 14:57:12 +11:00
KHobbits 74d5590d3b Remove CB from EssCore libs. 2012-12-18 22:58:55 +00:00
KHobbits 258fbdb0e8 Merge pull request #216 from chrisgward/patch-1
Add tempban limit (with override node)
2012-12-18 02:24:45 -08:00
KHobbits bd4a48c441 Fix command costs warnings. 2012-12-17 18:32:42 +00:00
KHobbits 00bd6a3e02 Support new skeleton and zombie types.
Also fix baby sheep colours.
2012-12-16 21:39:31 +00:00
KHobbits 28ad7b96d2 Log a few extra metrics. 2012-12-16 21:02:02 +00:00
KHobbits 97204c0e8c Merge pull request #217 from necrodoom/patch-7
add "w" alias
2012-12-16 11:07:10 -08:00
Necrodoom 46645cb39f Update Essentials/src/plugin.yml 2012-12-16 18:05:07 +02:00
Necrodoom dfd6fc78f0 add "w" alias 2012-12-16 18:03:04 +02:00
Chris Ward ecf5d47e97 Add tempban limit (with override node) and console override to exempt node. 2012-12-17 02:12:38 +11:00
Alexander Schepp 77df82eaff derp
That's why switch statements are bad.
2012-12-16 13:59:25 +01:00
Alexander Schepp 020f2c3ea5 Fix order of messages 2012-12-16 13:48:02 +01:00
KHobbits 5a855eede5 Update bukkit
Bukkit 1608 CraftBukkit 2488
2012-12-16 12:28:49 +00:00
KHobbits 8b4273cbd1 Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9 2012-12-16 12:12:23 +00:00
Necrodoom 30bc597851 update items.csv to minecraft 1.4.6 2012-12-16 12:52:16 +02:00
Alexander Schepp 13efadbb65 Merge pull request #214 from necrodoom/patch-4
change add-prefix-suffix description
2012-12-15 06:17:22 -08:00
snowleo 6bc3d7f0f4 Fix the gap 2012-12-15 14:22:52 +01:00
snowleo e706614a3b Align /tp syntax with Minecraft /tp command 2012-12-15 14:12:34 +01:00
Necrodoom cf68031110 change add-prefix-suffic description
hopefully will keep newbies from changing it for no reason
2012-12-15 12:58:57 +02:00
Iaccidentally 5741cea3f5 Merge pull request #210 from Echo4190/patch-1
Update Essentials/src/config.yml
2012-12-11 04:06:10 -08:00
Echo419 7b879331db Update Essentials/src/config.yml
trillions => trillion
english => English
2012-12-11 12:03:21 +00:00
KHobbits 0a27a631e3 Merge pull request #209 from necrodoom/patch-2
update config.yml to reference wiki more
2012-12-10 09:46:31 -08:00
KHobbits d8c6587532 Add missing import. 2012-12-10 17:45:32 +00:00
KHobbits d600f160fe Update metrics to r6 2012-12-10 17:43:06 +00:00
KHobbits d23c324035 Metrics Diff 2012-12-10 17:40:15 +00:00
Necrodoom 52bfeff5b4 update config.yml to reference wiki more
also changed locale setting to be less confusing
2012-12-10 09:39:22 +02:00
KHobbits 3dcb2a828e Delay sending respawn event until we actually try to respawn user. 2012-12-09 17:32:02 +00:00
KHobbits 0b95a691a6 Revert "Bukkit should have fixed this issue, so we can now get a better first join player experience by teleporting them at once with no delay."
This reverts commit f7daa20be8.

This breaks compatibility with multiverse, and Essentials core.
2012-12-09 17:14:57 +00:00
KHobbits eba2bad113 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-12-09 17:10:31 +00:00
KHobbits 4f21490ec8 Move null bed check to teleport code 2012-12-09 17:10:12 +00:00
md_5 f7daa20be8 Bukkit should have fixed this issue, so we can now get a better first join player experience by teleporting them at once with no delay. 2012-12-09 16:03:00 +11:00
KHobbits a9ace1163f Shorten local chat format. 2012-12-08 18:51:18 +00:00
KHobbits ba380e61ee Some nice friendly messages to help debugging command costs. 2012-12-08 15:51:33 +00:00
KHobbits bbc306970f Throw error when using /more on full stack 2012-12-07 00:46:13 +00:00
KHobbits 7b997634ef Remove unused variable 2012-12-06 23:27:43 +00:00
KHobbits 1efbc3856c Make BPerms sign group checking behave similarly to same as GM and PEX 2012-12-06 23:26:48 +00:00
KHobbits f769f96f74 Merge pull request #208 from kukelekuuk00/2.9
Added a total profit message for /sell all|blocks
2012-12-05 09:14:07 -08:00
kukelekuuk00 3f69473072 Added a total profit message for /sell all|blocks 2012-12-05 15:40:17 +01:00
KHobbits d7bcf6508d Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-12-03 09:09:17 +00:00
KHobbits 61c4d8cb5e Update afk status on block interact 2012-12-03 09:08:56 +00:00
Iaccidentally f7361eed98 Merge pull request #205 from evonuts/patch-1
Spelling/Grammar fixes.
2012-12-01 02:43:20 -08:00
evonuts deaa72b05d Spelling/Grammar fixes. 2012-12-01 21:51:24 +13:00
Iaccidentally 92bdd51cd4 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2012-11-27 14:54:18 -05:00
snowleo 0ed29c029d Add log color removal.
(This could already be done with the bukkit setting "log-strip-color")
2012-11-27 19:54:32 +01:00
KHobbits 61903355cd Fix kit timers, kit times more than 25 years will be treated as single use. 2012-11-27 18:27:23 +00:00
KHobbits 889f60e58e Userdata cleanup 2012-11-27 17:47:08 +00:00
KHobbits c4f292f4ef Merge branch 'release' of github.com:essentials/Essentials into 2.9 2012-11-27 15:24:34 +00:00
Iaccidentally 36687e2659 Merge pull request #204 from necrodoom/patch-23
fix typo at config.yml
2012-11-25 09:30:13 -08:00
Necrodoom 948647926d fix typo at config.yml 2012-11-25 15:07:25 +02:00
Iaccidentally 4a4f443fee Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2012-11-24 14:55:54 -05:00
KHobbits 18d52821b7 Merge pull request #201 from necrodoom/patch-22
fix spacing at disabled-commands
2012-11-20 11:16:00 -08:00
Necrodoom ad7d751856 fix spacing at disabled-commands 2012-11-20 19:38:21 +02:00
ElgarL 1151f1a29c Fix recursive error detection when partial mirroring the main world 2012-11-20 14:55:06 +00:00
snowleo 0b1625f4c1 Better fix for last commit 2012-11-19 22:03:25 +01:00
snowleo 1363406b84 Fix for the plugin conflict with any plugin that contains a log4j library 2012-11-19 20:28:12 +01:00
KHobbits 4b875ed4d9 Merge branch 'release' of github.com:essentials/Essentials into 2.9 2012-11-19 14:28:28 +00:00
KHobbits 42872650d2 Add tptoggle others Essentials style. 2012-11-16 01:37:47 +00:00
Iaccidentally fd87933aa9 Merge remote-tracking branch 'remotes/origin/release' into 2.9 2012-11-13 22:57:14 -05:00
ElgarL 269cf85457 Update bukkit.jar to #1593 in lib so we can reference the new
interfaces.
2012-11-13 10:17:15 +00:00
Iaccidentally 5728f964a5 Merge pull request #195 from evonuts/2.9
Update fly command to allow for /fly on|*ena*|1 and inversely, /fly off|...
2012-11-11 14:21:18 -08:00
ElgarL a7aa8be37a Prevent GM commands from being used on CommandBlocks. 2012-11-11 20:56:07 +00:00
ElgarL 237c896fff Add support for Rcon. 2012-11-11 20:39:03 +00:00
Iaccidentally fbb3d7344f update tptoggle to allow toggling other players :: new permission: essentials.tptoggle.others 2012-11-11 14:34:56 -05:00
KHobbits 8b660d32ac Cleanup spawnmob classes
Spawnmob sign nolonger calls Command
Spawnmob other, now spawns at targets feet, rather than where the target is looking
Console can now spawnmob other
2012-11-11 18:55:02 +00:00
Iaccidentally 98bccf6cec Merge pull request #197 from necrodoom/patch-21
Update Essentials/src/com/earth2me/essentials/Mob.java
2012-11-11 09:10:33 -08:00
KHobbits 936606ce7c Mob comment. 2012-11-11 17:04:16 +00:00
Necrodoom a63748ca3a Update Essentials/src/com/earth2me/essentials/Mob.java 2012-11-11 18:58:05 +02:00
Iaccidentally a1ce340ce0 Make playerFishEvent cancel AFK :: fixes #3192 2012-11-11 11:43:10 -05:00
KHobbits a8df79661a Merge branch '2.9' of github.com:essentials/Essentials into release 2012-11-11 14:55:00 +00:00
KHobbits f52e0ae7a8 Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9 2012-11-11 14:54:19 +00:00
KHobbits 648a5ef8dd Merge branch '2.9' of github.com:essentials/Essentials into release 2012-11-11 14:53:42 +00:00
Iaccidentally 0d610f761b Merge pull request #196 from necrodoom/patch-20
update ID 101, by andrewkm request
2012-11-10 09:53:16 -08:00
Necrodoom e7afe4109e update ID 101, by andrewkm request 2012-11-10 19:12:25 +02:00
evonuts b11a1a7cf2 Fix fly specific settings for other players (eg. /fly evonuts on) 2012-11-10 22:17:39 +13:00
evonuts 6a8a2dd28b Update fly command to allow for /fly on|*ena*|1 and inversely, /fly off|*dis*|0. 2012-11-10 13:40:48 +13:00
ElgarL a370a8e01c Merge pull request #194 from necrodoom/patch-19
correct spaces at plugin.yml
2012-11-09 05:51:52 -08:00
ElgarL 5e38a2180c Merge pull request #193 from necrodoom/patch-18
GroupManager typo fix
2012-11-09 05:51:15 -08:00
ElgarL f3bc94a547 Merge pull request #190 from necrodoom/patch-16
fix typos and update ingame error message
2012-11-09 05:50:39 -08:00
Necrodoom ba0db53c44 correct spaces at plugin.yml 2012-11-08 16:35:57 +02:00
Necrodoom ef98a6b54c GroupManager typo fix 2012-11-08 16:31:49 +02:00
KHobbits 8c9b755671 Extra perm check in /home 2012-11-08 11:53:26 +00:00
md_5 6c1da1d552 Set a players sleeping ignored status synchronously, just in case! Thanks for the hint mbaxter & Wolvereness. Closes ticket 3179. 2012-11-08 18:57:44 +11:00
Iaccidentally 0df0be5762 Merge pull request #192 from evonuts/2.9
Allow for console based gamemode shortcuts. Fixes ticket #3173
2012-11-07 18:39:39 -08:00
evonuts 83120f707f Allow for console based gamemode shortcuts. Fixes ticket #3173 2012-11-08 15:19:07 +13:00
Iaccidentally 9d98edb4ee fix build 2012-11-04 19:04:10 -05:00
Iaccidentally a50b0ac71d CB 2455 :: Bukkit 1593 2012-11-04 17:52:35 -05:00
KHobbits d674e65c11 Allow the 'userIsNotAway' and 'userIsAway' translation messages to be empty. 2012-11-04 22:41:35 +00:00
Alexander Schepp 4967279b8c Allow the noNewMail translation to be empty 2012-11-04 22:34:47 +01:00
KHobbits 4722e687fa Code comments. 2012-11-04 21:31:23 +00:00
Iaccidentally 332a59f3fc allow money to be put in kits using the currency symbol before the amount 2012-11-04 16:25:09 -05:00
KHobbits 587f532991 Use durability instead of itemdata for antibuild checks.
Fixes potion blocking using antibuild.
2012-11-04 18:02:36 +00:00
KHobbits 10244d5f90 Fix godmode pvp protection not blocking thrown pots and arrows. 2012-11-04 17:31:57 +00:00
KHobbits 6f1a70dc8b Fix missing mob target block 2012-11-04 16:45:02 +00:00
KHobbits 7369155166 Fix a few more errors in plugin.yml 2012-11-04 13:29:39 +00:00
KHobbits 28d4609c8c Fix plugin.yml typo. 2012-11-04 13:16:05 +00:00
KHobbits d2966b64eb Code comments 2012-11-04 02:24:54 +00:00
KHobbits c8f8680ce9 Limit tnt disable on /nuke to 10s 2012-11-04 02:18:51 +00:00
md_5 9fcb412774 Update Spanish translations thanks to nikooo14. 2012-11-03 11:47:39 +11:00
Necrodoom 296af1069e Update EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java 2012-11-02 18:21:26 +02:00
Alexander Schepp b22e97b3cf remove all L 2012-10-31 21:30:57 +01:00
Iaccidentally dcf90cbf5a Make /exp accept L before or after the amount, add extra checks 2012-10-31 16:25:13 -04:00
Alexander Schepp 4dc2e2e3fd Handle int overflow in SetExpFix 2012-10-31 21:06:30 +01:00
Alexander Schepp 4d4779ecdc Use the class, not the interface
This code will be changed later, once Elgarl updates the gm branch to 1.4
2012-10-31 20:06:32 +01:00
Alexander Schepp 1c25d317dd Quickfix to prevent GM commands from being called by BlockCommandSender. 2012-10-31 19:44:13 +01:00
Iaccidentally 651a62890a fix minimum required bukkit version. 2012-10-29 14:26:51 -03:00
Iaccidentally 39b38f0619 CB 2420 :: Bukkit 1570 :: Update FakeServer and OfflinePlayer 2012-10-29 13:17:56 -04:00
KHobbits 4a194e8758 Merge pull request #185 from evonuts/patch-5
Update Essentials/src/config.yml
2012-10-29 02:21:24 -07:00
evonuts 5a35da53a0 Update Essentials/src/config.yml
'flase' typo in wither-spawnexplosion
2012-10-29 22:06:23 +13:00
ementalo 8d64c7c81b Fix mail 2012-10-28 20:09:25 +00:00
ementalo bea3583192 Fix mail 2012-10-28 20:00:15 +00:00
Iaccidentally 618d115233 typo fix 2012-10-28 15:03:45 -03:00
Iaccidentally 5e476f4d61 Update Essentials/src/com/earth2me/essentials/commands/Commandtppos.java
2.9 too
2012-10-28 15:01:54 -03:00
Iaccidentally 5bc1b8df70 nothing to see here, move along (typo fix) 2012-10-28 13:09:19 -04:00
Iaccidentally 72e0ab2cb2 NOW with complete wither protection! 2012-10-28 13:05:08 -04:00
Iaccidentally e0d189a5e0 oops! :: fix wither spawn explosion blocking 2012-10-28 12:58:01 -04:00
Iaccidentally 91c193b773 Fully support wither blocking in protect 2012-10-28 12:53:12 -04:00
Iaccidentally 4a18130354 CB #2415 2012-10-28 12:23:47 -04:00
Iaccidentally 7c6268fe20 Merge branch '2.9' of https://github.com/essentials/Essentials into 2.9 2012-10-28 11:10:17 -04:00
Iaccidentally 6f213c23e2 update tppos to not accept coords over 30000000 2012-10-28 11:09:49 -04:00
Iaccidentally cc606fe1aa Merge pull request #184 from necrodoom/patch-15
add bat egg and witch egg
2012-10-28 07:40:52 -07:00
Necrodoom ee8638841d add bat egg and witch egg
enderdragon and wither have no useable eggs, so not added
2012-10-28 16:37:23 +02:00
Iaccidentally 9864a75c32 Protect updates :: ability to prevent wither damage :: block spawning of new mobs 2012-10-28 09:39:54 -04:00
Iaccidentally 520427239f CB #2406 Bukkit #1568 2012-10-28 09:11:50 -04:00
md-5 614a229ea7 Merge pull request #183 from evonuts/patch-4
Update Essentials/src/config.yml
2012-10-28 03:22:55 -07:00
evonuts 2a4d40020e Update Essentials/src/config.yml 2012-10-28 22:37:00 +13:00
md_5 d6efae202a Why the f*** do we depend on Bukkit too? 2012-10-28 20:09:26 +11:00
md-5 7b9c711486 Merge pull request #182 from evonuts/patch-3
Update Essentials/src/config.yml
2012-10-28 02:02:24 -07:00
md_5 e2bd22d984 No idea why this still refuses to compile locally. Stupid ant. 2012-10-28 20:01:27 +11:00
evonuts 2310b41b21 Update Essentials/src/config.yml 2012-10-28 21:55:20 +13:00
md-5 2ae9c577db Merge pull request #180 from Glyca/2.9
Added, fixed and improved French translations
2012-10-28 01:38:51 -07:00
md-5 7c9375ce2e Merge pull request #176 from necrodoom/patch-14
update files to minecraft 1.4
2012-10-28 01:37:22 -07:00
Glyca 9addc2ccd5 Added, fixed and improved French translations 2012-10-27 21:47:55 +02:00
Necrodoom e180f6e6b3 update ID 137 2012-10-27 10:41:50 +03:00
KHobbits f0e29552bc Merge branch '2.9' of github.com:essentials/Essentials into release 2012-10-26 21:41:49 +01:00
KHobbits 48d04216a7 Reduce calls to bukkit getPlayer(); 2012-10-26 21:34:36 +01:00
ementalo ff6221f1a8 2.9 Release 2012-10-26 09:48:45 +01:00
KHobbits 0bc33554f3 Fix tp delay message 2012-10-23 00:00:55 +01:00
KHobbits 7c480e88d6 Update EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java 2012-10-22 14:55:52 +02:00
KHobbits c357d19c56 Update listener comment 2012-10-22 12:27:01 +02:00
Alexander Schepp 86124b2705 Fix NPE in UserData on login
if no address is available
2012-10-21 23:17:08 +03:00
KHobbits 99cefb2d74 Fix perm check in /kill 2012-10-20 19:24:33 +01:00
KHobbits 600f99eb6b If the player is still alive, make sure he dies. (/kill) 2012-10-20 19:18:04 +01:00
KHobbits 8ba7a24fd2 Block explicit /home bed, unless user has "essentials.home.bed" permission.
This does not effect the '/home' command when used with no arguments.
In this case, a player will still be sent to the bed home, if they have no Ess home set.
2012-10-20 16:15:43 +01:00
KHobbits ef608c7595 Remove extra home check. 2012-10-20 16:09:54 +01:00
Necrodoom 2ea453110a update mob.java to 1.4 2012-10-20 12:24:18 +03:00
Necrodoom a86efb5ebe update items.csv to 1.4
items.csv version 2.2_01
2012-10-20 12:11:27 +03:00
ementalo e61fa58d2b Fix test 2012-10-17 13:14:59 +01:00
ementalo ec5edf7bd2 CB #2396 B #1566 2012-10-17 13:09:03 +01:00
snowleo 8dbcebda53 Don't call plugin manager in Settings. 2012-10-15 20:30:52 +02:00
KHobbits 28d2a9ed2e Merge pull request #174 from necrodoom/patch-13
fix sandstone slab aliases
2012-10-14 09:44:26 -07:00
Necrodoom d47e9145f3 fix sandstone slab aliases 2012-10-14 19:40:57 +03:00
KHobbits ae7c64619c Allow kicking of hidden players 2012-10-14 13:04:00 +01:00
KHobbits bdef1780ac Warn when banning a player who has never connected to the server. 2012-10-14 13:03:54 +01:00
Iaccidentally ced192e8fd Update Essentials/src/items.csv
quick items.csv fix
2012-10-09 05:19:27 -03:00
KHobbits 0a9e9ca41d Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-10-07 22:40:18 +01:00
KHobbits 4982cc950e Add alt warp perm for others 2012-10-07 22:40:04 +01:00
snowleo 140a9100b7 Update AntiBuild for NB7.2 2012-10-07 23:00:09 +02:00
snowleo 0097f961b4 Prevent massive amount of mails being send.
Added new config: mails-per-minute, default 1000
2012-10-07 22:46:15 +02:00
KHobbits 98d657ec4b New permission: essentials.vanish.pvp
If you don't have this permission you cannot PVP while vanished.
2012-10-07 18:10:50 +01:00
KHobbits 63149d0b50 Change default action colour to be different to /say 2012-10-06 22:26:51 +01:00
KHobbits 7a410919a0 Code comments 2012-10-06 03:49:36 +01:00
KHobbits aa7a39d0b0 Comment for future sanity. 2012-10-05 02:06:23 +01:00
KHobbits 9b88107897 Fix gamemode other perm check 2012-10-02 21:06:28 +01:00
KHobbits 147a2fc227 Better handle invalid warp names 2012-10-02 00:19:42 +01:00
KHobbits 732dc3bf34 Cleanup sethome 2012-10-01 20:32:10 +01:00
Alexander Schepp 227cde75a7 Merge pull request #171 from chrisgward/patch-5
Adding console override to sudo chat
2012-10-01 10:31:48 -07:00
Chris Ward e670d0af45 Adding console override to sudo chat, changing say to c: 2012-10-02 03:30:13 +10:00
ElgarL cd0fde05b7 Merge remote-tracking branch 'remotes/origin/2.9' into groupmanager 2012-10-01 17:51:56 +01:00
ElgarL 8cf2ce7b73 Merge branch '2.9' of https://ElgarL@github.com/essentials/Essentials.git into 2.9 2012-10-01 17:50:08 +01:00
ElgarL 1ecf592893 Move Event to LOW so permissions get updated before this event is
triggered.

With LOWEST it would only randomly work with most perm systems,
depending on the loading order.
2012-10-01 17:49:42 +01:00
Alexander Schepp 0dd0dba338 Merge pull request #165 from chrisgward/patch-2
Adding say command to sudo to fake chat
2012-10-01 09:34:49 -07:00
Alexander Schepp 678ae78767 Merge pull request #166 from chrisgward/patch-3
Blocking numeric home names, changing invalid home message
2012-10-01 09:34:09 -07:00
Chris Ward d8b6742543 Blocking numeric home names, changing invalid home message 2012-10-02 02:32:52 +10:00
Chris Ward 2671f39951 Adding -c switch to sudo to fake chat 2012-10-02 02:31:15 +10:00
Alexander Schepp d7ddf3c828 Merge pull request #169 from chrisgward/patch-5
Adding console only overrides to exempts
2012-10-01 09:15:18 -07:00
Alexander Schepp 2b7cba936d Merge pull request #170 from chrisgward/2.9
Fixing storage of compiled regex
2012-10-01 09:12:35 -07:00
Chris Ward 2757c707bb Fixing storage of compiled regex 2012-10-02 02:11:05 +10:00
Chris Ward f50c5276e4 Adding console overrides to exempts 2012-10-02 01:57:29 +10:00
Iaccidentally a7e692fe37 Merge pull request #164 from chrisgward/patch-1
Fixing bad file names in Windows (Fixes #2924)
2012-10-01 07:16:22 -07:00
Chris Ward 02d273f15e Fixing bad file names in Windows (Fixes #2924) 2012-10-01 21:20:17 +10:00
ElgarL 778f5649c8 allWorldsDataList now returns fully mirrored worlds whihc are not
identical mirrors (fixes the /manselect list).
2012-10-01 12:05:49 +01:00
KHobbits d7829bef28 Merge pull request #163 from chrisgward/patch-1
Fixes #2933
2012-10-01 03:27:37 -07:00
Chris Ward d436d10b00 Typo (Ticket 2933) 2012-10-01 20:12:13 +10:00
KHobbits 2d9254eb28 Merge pull request #158 from necrodoom/patch-10
update potion aliases- add all unused potions
2012-09-30 13:55:20 -07:00
KHobbits 23393aea5f Merge pull request #162 from necrodoom/patch-12
small fixes to items.csv
2012-09-30 13:55:09 -07:00
KHobbits e1562e38bf Restore removed tp method, it is used in other plugins. 2012-09-30 18:15:46 +01:00
KHobbits 4dcce2544e Update Bukkit/CB to 1.3.2 R1
Bukkit: 1546 CB: 2377
2012-09-30 17:33:49 +01:00
Necrodoom 29fa2f0f19 small fixes to items.csv 2012-09-30 19:22:14 +03:00
KHobbits b850ae93e9 Merge branch 'release' of github.com:essentials/Essentials into 2.9 2012-09-30 17:21:09 +01:00
Necrodoom 21cb8efb90 update kit sign permission check 2012-09-30 17:16:03 +01:00
Necrodoom cd7be1bb86 update warp sign permission check 2012-09-30 17:15:57 +01:00
KHobbits 69cd17a1b1 Should fix tpaccept charge bug - needs testing 2012-09-30 17:15:40 +01:00
KHobbits 872bc4df4c New permission: essentials.teleport.timer.move - allow players to move during tp delay 2012-09-29 23:48:59 +01:00
KHobbits 3083ba2627 Little bit DRYer 2012-09-29 23:41:12 +01:00
KHobbits 35259892b8 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-09-29 23:35:09 +01:00
KHobbits fbc0f13b2b Properly handle tphere requests so the right user is in control/charged. 2012-09-29 23:34:46 +01:00
KHobbits aa7f49cb85 Tidy Teleport file 2012-09-29 23:33:32 +01:00
KHobbits 720676542e Merge pull request #161 from necrodoom/patch-11
update signs permission check
2012-09-29 13:52:07 -07:00
Necrodoom 1d7eb77f27 update kit sign permission check 2012-09-29 15:57:31 +03:00
Necrodoom 895f6269fc update warp sign permission check 2012-09-29 15:55:47 +03:00
KHobbits 4bf0d3ab24 Should fix tpaccept charge bug - needs testing 2012-09-29 03:59:31 +01:00
KHobbits afccda6350 Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9 2012-09-28 23:01:32 +01:00
KHobbits c0a176825c Add potion effect clearing on /heal - Chris Ward 2012-09-28 20:56:03 +01:00
KHobbits db6512b702 Cleanup of god mode effects, suggested by gravypod. 2012-09-28 20:45:56 +01:00
KHobbits 46d3f0827a God mode cancel potion effects - Chris ward
Revert heal changes.
2012-09-28 20:35:13 +01:00
Necrodoom 838d7dd8f9 update potion aliases- add all unused potions
items.csv version 2.1_13
2012-09-28 17:02:43 +03:00
Paul A. b9e5c8827f Fix updating version on items.csv 2012-09-27 16:39:23 +02:00
Paul A. b8e000c7f9 Merge pull request #156 from evonuts/patch-1
Minor spelling/grammatical fixes
2012-09-27 05:47:31 -07:00
evonuts 5e7af93c77 Minor spelling/grammatical fixes 2012-09-28 00:42:25 +12:00
Paul A. 077ad8cd0f Merge pull request #154 from necrodoom/patch-9
typo fix in config.yml as found by @Evonuts
2012-09-27 05:22:09 -07:00
Necrodoom 0bf954e467 typo fix in config.yml 2012-09-27 15:19:14 +03:00
KHobbits 8a55afc4e1 Remove debug comments. 2012-09-25 22:37:58 +01:00
KHobbits 2bc9f2e386 Handle negated wildcard perms in generic superperms 2012-09-25 22:21:15 +01:00
ElgarL 920e1a3b1f Update users.yml to follow new ordering. 2012-09-25 20:41:16 +01:00
ElgarL 353253b9c5 No need for a new array. 2012-09-25 20:39:24 +01:00
ElgarL 1438230b70 Add alphabetically sorted user lists. 2012-09-25 13:23:19 +01:00
KHobbits 240aebde98 Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9 2012-09-25 13:16:41 +01:00
ElgarL d4e2ed782e Change order of data in Users.yml to [name, Group, SubGroup,
Permissions, Info nodes].
2012-09-25 13:09:26 +01:00
ElgarL f025cd9d2f Commenting 2012-09-25 11:27:36 +01:00
ElgarL 1ff7082892 Fix javadocs 2012-09-25 11:25:19 +01:00
ElgarL 15fa10dd29 Minor typo fix - Necrodoom 2012-09-25 11:15:28 +01:00
KHobbits 00b4bdadd4 Revert "Clean up imports"
This reverts commit d2546ebd36.
2012-09-24 23:04:33 +01:00
KHobbits 3055dd93a5 Improve fake sign check. 2012-09-24 23:01:58 +01:00
Paul A. 94dc29cc4d Merge pull request #151 from gravypod/patch-2
Clean up imports
2012-09-24 14:34:36 -07:00
KHobbits 22d1db5463 Envelope new drop/pickup/craft perms under 'essentials.build'. 2012-09-24 12:48:07 +01:00
KHobbits f2b4bb00b6 Minor cleanup 2012-09-24 03:16:15 +01:00
gravypod d2546ebd36 Clean up imports 2012-09-23 22:06:39 -03:00
KHobbits f1930e76d6 Fix and give better sign errors. 2012-09-24 00:19:39 +01:00
KHobbits d722e6a9f0 Less sign checking if certain signs aren't enabled. 2012-09-23 23:51:57 +01:00
KHobbits 8e6d4b1595 config typo. 2012-09-23 23:18:17 +01:00
KHobbits 72065c81f3 Minor colour change 2012-09-23 23:08:35 +01:00
KHobbits 2864d0186c Move wildcard perm check to superperms handler, rather than being PEX specific. 2012-09-23 23:01:14 +01:00
KHobbits 9c9b2be011 Lower reporting level of metrics errors. 2012-09-23 18:08:43 +01:00
KHobbits 2f40264c46 Support new lines in newbie welcome message. 2012-09-22 21:15:04 +01:00
KHobbits 5cc24827fc Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9
Resolved Conflicts:
	EssentialsGroupManager/src/org/anjocaido/groupmanager/GlobalGroups.java
2012-09-22 20:44:45 +01:00
KHobbits da01bdc2b0 Cleanup delhome to match normal home cases properly. 2012-09-22 20:43:27 +01:00
ElgarL dfb81dd50f Update warning in GlobalGroups - Necrodoom. 2012-09-22 19:51:38 +01:00
ElgarL 567d52459b - Fix Synchronization on adding subgroups (thanks snowleo).
- Remove info node support from GlobalGroups. It should not have them
as GlobalGroups are only permission collections.
2012-09-22 19:18:51 +01:00
KHobbits 80a96e2a73 Reset colour code at start of default broadcast msg. 2012-09-22 15:00:00 +01:00
KHobbits c2f8467ca9 General demo txt formatting 2012-09-22 14:44:56 +01:00
KHobbits 155ca46fef Clean chat colours. 2012-09-22 14:40:56 +01:00
KHobbits 0952150235 Clean up the info.txt 2012-09-22 14:36:07 +01:00
KHobbits 30faa39070 Merge pull request #148 from necrodoom/patch-7
fix info.txt colors and tags
I'll do a little manual cleanup.
2012-09-22 06:21:51 -07:00
KHobbits 3e367912ec Possibly solve info writing issues in globalgroups
Editing this on the ess branch, cause i'm sure there is a better fix.
2012-09-22 04:35:55 +02:00
Necrodoom f8cff25bda fix info.txt colors and tags 2012-09-21 18:09:30 +03:00
md_5 3e80bf479e Check for explicit * permission when using PEX. 2012-09-21 19:53:20 +10:00
KHobbits 84afc80873 Update config.yml to show multiple enchantments for kits. 2012-09-21 02:10:39 +01:00
KHobbits 27a943217e Make sure we check for wildcards in PEX 2012-09-20 20:36:07 +01:00
KHobbits 16834d85c5 Switch pex permissions checks to use superperms rather than direct api call. 2012-09-20 20:21:45 +01:00
KHobbits 44d8c85450 ignoreCancelled events. 2012-09-19 21:07:50 +01:00
KHobbits 2a8e44dda8 New Permission:
essentials.build.pickup.<id>[:<datavalue>] - Allows collecting of an item
essentials.build.drop.<id>[:<datavalue>] - Allows dropping of an item
2012-09-19 20:57:06 +01:00
KHobbits 00e3957190 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-09-19 19:48:14 +01:00
KHobbits a79b76e8d2 New Permission:
essentials.build.craft.<id>[:<datavalue>] - Allows crafting of an item
2012-09-19 19:47:47 +01:00
md_5 0a092ff5b3 Self indulgent commit. Door should be an alias for wood door. 2012-09-17 21:55:52 +10:00
KHobbits e6aeefb12d Hide Protection sign option. 2012-09-17 11:29:16 +01:00
KHobbits 924b6bd2ba Fix a few minor text formatting issues. 2012-09-16 20:45:33 +01:00
KHobbits f701090c89 Config file permissions cleanup
Removed deprecated 'restricted-commands' section.
Deprecated 'superperms' toggle.
Remove op override on essentials permissions.
Give op's all permissions by default via superperms.
2012-09-16 20:27:35 +01:00
KHobbits b9195a561f Merge pull request #146 from necrodoom/patch-6
update dualbit, fix strength, add swift aliases
2012-09-16 08:48:16 -07:00
Necrodoom d94e4095da update dualbit, fix strength, add swift aliases
items.csv version 2.1_12
2012-09-16 18:46:46 +03:00
md_5 fd61cd1750 Merge remote-tracking branch 'origin/groupmanager' into 2.9 2012-09-16 23:02:56 +10:00
Iaccidentally e7ae8bcc47 Update Essentials/src/plugin.yml
updating SKYNET
2012-09-15 21:07:42 -03:00
KHobbits edc4d62004 Missing tl key. 2012-09-15 22:06:42 +01:00
KHobbits cdff690bb5 Add server uptime to /gc 2012-09-15 22:04:18 +01:00
KHobbits aa14cc39d9 Add missing TL key
Fixes #1363
2012-09-15 21:16:31 +01:00
KHobbits cdf2c8beed Allow bans on players who have never connected. 2012-09-15 20:57:44 +01:00
KHobbits 3e06c06827 Reduce the enchantment list some more. 2012-09-15 20:29:29 +01:00
KHobbits a2886d76d2 Fix Essentials /sethome to more strictly obey home limits. 2012-09-15 19:55:12 +01:00
KHobbits cc0a65bace /ess reset <player> - Clears stored data about a user. 2012-09-14 02:30:24 +01:00
KHobbits d988546ef3 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-09-14 01:11:04 +01:00
KHobbits b7f2add7b4 Fixed jail extend message - xGhOsTkiLLeRx 2012-09-14 01:10:22 +01:00
KHobbits b07f65c58b Update Essentials/nbproject/project.properties
Accidentally added unneeded line...
2012-09-14 02:01:02 +02:00
KHobbits 18e315a048 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-09-14 00:59:25 +01:00
KHobbits d3967297bb Don't create empty user files 2012-09-14 00:58:57 +01:00
KHobbits ea3631ddc2 Merge pull request #141 from DerFlash/2.9
Fix problems with async chat event not sending messages to xmpp chat spy
2012-09-13 06:21:11 -07:00
DerFlash 992e473b72 Fix problems with async chat event not sending messages to xmpp chat spy 2012-09-13 14:57:02 +02:00
KHobbits 0296f4fcf1 remove users from bperm example, different yml file now. 2012-09-13 01:50:55 +01:00
KHobbits 2fc16250a3 Update bpermissions example 2012-09-13 01:46:23 +01:00
ElgarL 75f7b06a23 Remove unused imports. 2012-09-11 11:12:19 +01:00
KHobbits a7e834e5f9 Couple extra /info aliases. 2012-09-11 05:05:55 +01:00
KHobbits 59086932bd Less strict matching on /realname 2012-09-11 01:07:31 +01:00
KHobbits 5611acf12c Make /realname throw an error if no matches were found 2012-09-11 00:53:32 +01:00
snowleo 60142d872f Missing final 2012-09-10 20:53:25 +02:00
snowleo 1cf0ebbd7f Thread safety for GM 2012-09-10 20:49:07 +02:00
snowleo 736a6d273a Revert bad synchronization
This reverts commit 96ab1b4533.
2012-09-10 19:06:17 +02:00
ElgarL 71179e3dfd Synchronize the world data holder. 2012-09-10 17:46:01 +01:00
KHobbits 24cdc37987 Patch flight disable, to not effect creative mode.
Full world change config still needs coding.
2012-09-10 01:13:30 +01:00
KHobbits b606f153f4 Fixing map/ironore bug. 2012-09-10 01:10:32 +01:00
ElgarL 96ab1b4533 Change to Hashtables to reduce the chance of a
ConcurrentModificationException pulling group/user data in an Async
thread.
2012-09-10 00:15:42 +01:00
KHobbits 8718d59286 Little bit extra sanity checking. 2012-09-09 20:13:03 +01:00
KHobbits 5d372b8149 Move auto afk permission to 'essentials.afk.auto' 2012-09-09 19:09:35 +01:00
KHobbits 1d62de7e5e Fixing locale typo. 2012-09-09 18:35:20 +01:00
KHobbits 3691417848 Fix Missing TL key 2012-09-09 17:10:26 +01:00
KHobbits 029162bba7 Change default op colour 2012-09-09 16:55:43 +01:00
KHobbits 161a61e0c6 More message cleanup 2012-09-09 16:52:45 +01:00
KHobbits 587addb73f Manual merge necrodoom enchant changes. 2012-09-09 16:29:38 +01:00
KHobbits d71bd7fb71 Two sets of enchantment aliases. 2012-09-09 16:27:22 +01:00
KHobbits 699ec273dd More message cleanup 2012-09-09 16:15:12 +01:00
KHobbits c1eed8ebcd Missing TL keys 2012-09-09 15:50:22 +01:00
KHobbits b8d0cf4cc4 Few more message tweaks. 2012-09-09 15:27:25 +01:00
KHobbits ff0dd00d79 If chat event doesn't resolve to valid player, cancel and exit. 2012-09-09 06:36:14 +01:00
KHobbits e18d12f109 Message cleanup. 2012-09-09 05:41:06 +01:00
KHobbits 0a09b355b2 Update some of the example permissions files for the perm changes. 2012-09-08 23:00:57 +01:00
KHobbits f9659dae68 Move the per world permissions:
essentials.world.worldname is moved to essentials.worlds.worldname
2012-09-08 22:50:20 +01:00
KHobbits 78a580bc40 Log to console the effects of /sudo 2012-09-08 21:10:26 +01:00
KHobbits 8c4d6ad4df Remove dead setting.
Fixes #2465
2012-09-08 20:41:38 +01:00
KHobbits 9c9d4e1da5 Move the per kit and warp permissions:
essentials.kit.kitname is moved to essentials.kits.kitname
essentials.warp.warpname is moved to essentials.warps.warpname
2012-09-08 20:32:48 +01:00
KHobbits ce50e1448b Look out for nulls. 2012-09-08 18:41:21 +01:00
KHobbits 8e885a3a6e Make /itemdb command list the 15 shortest item.csv names for said item.
This will be useful when making eco signs.
2012-09-08 18:33:06 +01:00
KHobbits ecd96a81dd Fix /itemdb showing 'uses left' on none held items. 2012-09-08 16:33:00 +01:00
KHobbits 427108574e Fix compile error. 2012-09-08 16:03:54 +01:00
KHobbits 62381a7f52 Async EssentialsSpawn join event, like the others. 2012-09-08 14:55:37 +01:00
KHobbits b1b09ea542 New Permission: essentials.god.pvp
Unless you have this permission you will be unable to attack other players while in god mode.
2012-09-08 14:51:03 +01:00
KHobbits e502a7e6fd Give user chance to get display name set before displaying geoip. 2012-09-08 14:40:19 +01:00
KHobbits acf4d0bcf5 Potential fix for teleporting issue. 2012-09-08 14:30:11 +01:00
KHobbits 6c3b13a7a4 Switch default antibuild status to false. Antibuild toggling shouldn't be an issue with it as a stand alone plugin. 2012-09-08 14:11:12 +01:00
snowleo cababcbfcf Fix ConcurrentModification bugs
This will probably slow down any access to config
2012-09-07 18:33:28 +02:00
Iaccidentally a032d0f19f Update Essentials/src/com/earth2me/essentials/commands/Commandburn.java
typo fix
2012-09-04 00:16:23 -03:00
KHobbits f808e6fa8e Catch null eco symbol. 2012-09-02 20:17:28 +01:00
KHobbits 842d9f73a4 More error on 'Permissions system error' in debug mode. 2012-09-02 18:30:59 +01:00
KHobbits c2893788e7 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-09-02 18:11:54 +01:00
KHobbits 0b8a6c45c6 Update /kit delay to use updated yaml code. 2012-09-02 18:11:29 +01:00
KHobbits 2049e630fb Merge pull request #136 from necrodoom/patch-3
update enchants with 3-1 letter aliases
2012-09-02 07:51:29 -07:00
KHobbits 6fd82480a3 Add support for /gamemode toggle | /gamemode t and /gmt to toggle between the 3 gamemodes. 2012-09-02 06:54:58 +01:00
KHobbits e919897f1b Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-09-02 01:57:10 +01:00
Iaccidentally 0fb5fc6bcc fix burn matching all players 2012-09-01 16:40:49 -04:00
Necrodoom a7d61b1b8d update enchants with 3-1 letter aliases 2012-09-01 10:33:20 +03:00
KHobbits be9a58457a Another Config tweak. 2012-08-31 22:31:56 +01:00
KHobbits b1cfc8a8ed Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9 2012-08-31 22:28:21 +01:00
KHobbits 6b9b6ba420 Config file tweaks 2012-08-31 22:26:26 +01:00
ElgarL 79c70b1f65 Include the GM version when logging errors. 2012-08-31 21:56:46 +01:00
ElgarL cfe634e8f7 Give a better error when a subgroup is null. 2012-08-31 21:47:35 +01:00
KHobbits 8c8c6fe73a Fix powertool command logging. 2012-08-31 18:52:40 +01:00
KHobbits a4353bc8f2 Don't need built in command logger anymore. 2012-08-31 18:44:14 +01:00
KHobbits 4015351c85 Sanity Check. 2012-08-31 17:57:57 +01:00
KHobbits e89f1d8a03 Add missing repair cost check on /repair hand 2012-08-31 17:54:10 +01:00
KHobbits ff461be45d Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-08-31 17:48:25 +01:00
KHobbits 93f5a05f17 Reduce the number of permissions checks in command cost lookups
Add support for item number repair costs (repair-123: 120)
Ess charge api supports nested charges.
Slight kit optimization.
2012-08-31 17:48:07 +01:00
KHobbits 3eba7fb90f Merge pull request #134 from necrodoom/patch-16
clear whitespace in globalgroups.yml
2012-08-31 06:48:07 -07:00
Necrodoom 25d51cd79e clear whitespace in globalgroups.yml 2012-08-31 16:40:25 +03:00
KHobbits a39824abb6 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-08-31 14:09:44 +01:00
KHobbits 2ac4c8e665 Fix metrics when kits are improperly configured. 2012-08-31 14:09:20 +01:00
Paul A. a84afbaa6e Update Essentials/src/config.yml
More grammar from Evonuts
2012-08-31 12:30:40 +02:00
Paul A. 41f7b4ec2d Update Essentials/src/config.yml
Grammar update thanks to Evonuts
2012-08-31 11:37:10 +02:00
KHobbits ce90e9710e Fix painting break in antibuild. 2012-08-31 06:06:33 +01:00
KHobbits 930eb7ae86 Fix IllegalStateException in sign click patch
Cleanup
2012-08-31 00:47:53 +01:00
KHobbits cf79a8fdca Fix min bukkit version warning. 2012-08-30 23:28:16 +01:00
KHobbits 1773a6060d Reset fly/speed on world change
This will be optional in a future version - Discuss http://goo.gl/Vuh4N
2012-08-30 23:13:50 +01:00
KHobbits 5755d647a3 Update chat formatting to use &r instead of &f 2012-08-30 20:43:33 +01:00
KHobbits 5032142a49 Clear up overriding comments on config file.
Closes #2725
2012-08-30 19:19:03 +01:00
KHobbits 15e996f485 Merge pull request #133 from necrodoom/patch-15
clarify some things on config
2012-08-30 10:08:38 -07:00
Necrodoom b37c08fd31 minor fix 2012-08-30 19:00:53 +03:00
Necrodoom eaca7f9c09 clarify some things on config 2012-08-30 18:58:43 +03:00
KHobbits 00072501c9 Merge pull request #131 from necrodoom/patch-14
update pork aliases
2012-08-29 08:22:04 -07:00
Necrodoom b50bb03814 update pork aliases
items.csv version 2.1_11
2012-08-29 16:51:38 +03:00
KHobbits f55316281c Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9 2012-08-28 03:12:16 +01:00
KHobbits 413a7beaa4 Fix CB. 2012-08-28 03:08:06 +01:00
KHobbits 88140f0610 Merge branch '2.9' into release 2012-08-28 03:05:13 +01:00
KHobbits 4996171b6e Update CB :: Bukkit 1536 || Craftbukkit 2352 (1.3.2-R0.1) 2012-08-28 03:01:49 +01:00
KHobbits d201286fc5 Merge branch '2.9' of github.com:essentials/Essentials into release 2012-08-28 02:55:02 +01:00
KHobbits 12b527be99 If both freeze-afk-players and cancel-afk-on-move is turned on, cancel AFK on player jump. 2012-08-28 02:50:59 +01:00
KHobbits e666c27d96 Disable AFK when player damages entity. 2012-08-28 02:24:01 +01:00
KHobbits 56cfc47ef6 Manually merge Nickshelton80's alias change. 2012-08-28 02:08:58 +01:00
KHobbits c4e4235f30 Handle jail teleport locations slightly better. 2012-08-28 02:06:11 +01:00
KHobbits e045f9d983 Optimize AntiBuild a little
Support item name deny messages in antibuild.
2012-08-28 01:38:16 +01:00
KHobbits ba8d060927 Fix minor typo in plugin.yml
Remove 'essentials.interact' permission from antibuild - Not needed
2012-08-27 23:59:29 +01:00
KHobbits 5f73bf12d7 Remove max walk option to config, until its fixed in the client. 2012-08-27 03:09:56 +01:00
KHobbits 616f92c214 Missing [player] param syntax on /afk 2012-08-26 20:26:06 +01:00
KHobbits 298f3dc3b2 Comment out/remove the /speed walk code, until the client properly supports this function. 2012-08-26 19:53:58 +01:00
KHobbits 65741403e0 New command /speed [walk|fly] <speed> [player]
New permissions:
essentials.speed = access to the command
essentials.speed.others = ability to change the speed of another player
essentials.speed.bypass = override max speed limits in config.yml
New config options:
max-fly-speed
max-walk-speed
2012-08-26 19:35:39 +01:00
KHobbits 2b6d41ac5f More work on /fly command - Still incomplete
Updated and fixed messages files for missing keys.
2012-08-26 17:16:22 +01:00
KHobbits a4936355b5 Updated Spanish Translation 2012-08-26 00:36:35 +01:00
KHobbits 02d6eade28 Foundation for speed command - not yet implemented. 2012-08-25 19:23:41 +01:00
KHobbits 089fa8c19b Add AntiBuild to Metrics. 2012-08-25 16:57:36 +01:00
KHobbits 7c687831bc Don't check for loan permission is there is no cost. 2012-08-22 09:12:38 +01:00
KHobbits d43cb95d72 New perm: essentials.kit.exemptdelay
Allows you to exempt from kit delays.
2012-08-22 00:27:33 +01:00
ElgarL d588c3f271 iacc's anal 2012-08-21 21:28:26 +01:00
KHobbits eaa93d545d Remove debug messages. 2012-08-21 20:45:27 +01:00
KHobbits e324a21b60 New command: /enderchest [player] (alias /endersee and /echest)
This command lets you look inside your or another players enderchest
New Permissions:
essentials.enderchest - Access to the command
essentials.enderchest.others - Lets you look at other enderchests
essentials.enderchest.modify - Lets you modify other enderchests
2012-08-21 20:44:09 +01:00
KHobbits b9cfd44588 Update CB
Bukkit 1533 || Craftbukkit 2345 (1.3.1-R2.1)
2012-08-21 19:56:14 +01:00
KHobbits 44e9c6ebfc Merge branch '2.9' into release 2012-08-21 19:34:26 +01:00
KHobbits a836576211 Reorder perm check in antibuild 2012-08-20 08:41:22 +01:00
KHobbits 1ad8c95e3e Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-08-19 23:42:05 +01:00
KHobbits 2dff343c10 Merge branch 'antibuild' into 2.9 2012-08-19 23:41:28 +01:00
KHobbits fa2a041102 Reduce permissions checks in antibuild.
Add a little debug logging for those with it enabled.
2012-08-19 21:20:55 +01:00
KHobbits 86f8f9c83f Merge pull request #124 from necrodoom/patch-11
patch ID 322 and update ID 260
2012-08-19 12:52:32 -07:00
KHobbits e359e8ab6e Correct antibuild perm check
(still need to abort interact/use checks on block place)
2012-08-19 16:08:36 +01:00
KHobbits 2f8f3aaa8d Attempt to add support for metadata permissions. 2012-08-19 15:25:40 +01:00
KHobbits f5bf5ed251 Split Ess protect into EssProtect and EssAntiBuild
New permissions:
essentials.build - same as build: true
essentials.build.interact.<id> - whitelist single interact block
essentials.build.place.<id> - whitelist single place block
essentials.build.break.<id> - whitelist single break block
essentials.build.use.<id> - whitelist single use item
2012-08-19 14:54:58 +01:00
ElgarL 979da6e713 No more null errors from corrupt config.yml's. 2012-08-19 14:49:16 +01:00
necrodoom 6c86fe6117 patch ID 322 and update ID 260
items.csv version 2.1_10
2012-08-19 09:50:19 +03:00
KHobbits 9018fc8324 Add some command cost debugging messages to /ess debug 2012-08-19 03:38:09 +01:00
KHobbits 2f57961ce4 Slightly more realistic worth prices. 2012-08-19 02:49:32 +01:00
KHobbits 4478d438d6 Tidy the worth file formatting. 2012-08-19 02:25:30 +01:00
KHobbits 9261b259a9 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-08-18 16:10:36 +01:00
Iaccidentally 3f3d8c58bc Merge pull request #123 from necrodoom/patch-9
fix ID 2259, pointed out by tanite
2012-08-18 07:59:16 -07:00
KHobbits e42f7e4ffa Removing EssentialsUpdate from 2.9 branch.
Development may be continued in 3.x branch.
2012-08-18 15:51:55 +01:00
KHobbits 8a9353fd09 Remove 3.x api migration code.
3.x development was moved to different code branch.
Removing deprecated warnings, since it would be silly to deprecate ALL classes.
2012-08-18 15:48:29 +01:00
KHobbits 7d5e0352d2 Fix /warp command matching in console. 2012-08-18 15:25:14 +01:00
necrodoom 05eef76134 fix ID 2259, pointed out by tanite
items.csv version 2.1_09
2012-08-18 10:22:12 +03:00
Iaccidentally e6ef67f7bf Merge pull request #122 from necrodoom/patch-8
update IDs: 5,6,17,18 - erase unused and add new
2012-08-15 01:20:40 -07:00
necrodoom bbd93f333d update IDs: 5,6,17,18 - erase unused and add new
items.csv version 2.1_08
2012-08-15 10:39:34 +03:00
ElgarL 84f7859ca9 Fix an error with Logging set to 'OFF' triggering a cast exception. 2012-08-14 13:26:02 +01:00
Iaccidentally 1c0dffa67c Merge pull request #121 from necrodoom/patch-6
few extra fixes to several ID item name aliases
2012-08-13 01:17:22 -07:00
necrodoom 5f3fb9b595 few extra fixes to several IDs
items.csv version 2.1_07
2012-08-13 10:03:39 +03:00
Iaccidentally 4ce1e2d9bf add spruce/pine tree to items.csv 2012-08-13 01:45:10 -04:00
KHobbits e40f364c1e Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-08-13 02:33:09 +01:00
KHobbits 6bd2d2c4b9 Try and prevent 'corrupt' messages files from breaking essentials. 2012-08-13 02:32:45 +01:00
snowleo 47f06e5c1b Fix encoding of swedish locale 2012-08-13 01:36:39 +02:00
KHobbits 4c4df13c2f Update Essentials/src/items.csv 2012-08-13 01:19:10 +02:00
KHobbits 6ca037ae3e Update Essentials/src/items.csv 2012-08-13 01:15:53 +02:00
KHobbits 47c708fd33 Merge pull request #115 from necrodoom/patch-3
grammar check on plugin.yml
2012-08-11 18:08:50 -07:00
KHobbits c40b23d80e Add command name matching to /gamemode
This allows aliases such as /gmc and /creative [player] to be used without stating gamemode as a parameter.
2012-08-12 01:13:52 +01:00
KHobbits f17a790d78 Improve player matching in /gamemode
Add extra aliases to /gamemode
2012-08-12 01:12:10 +01:00
Iaccidentally bdf67db6ed fix name length check in /kill 2012-08-10 07:17:05 -04:00
Iaccidentally 3e203d193c fix msg and pay to accept 2 character names 2012-08-10 06:54:42 -04:00
KHobbits a92eb4dee6 Throw warning when using /kill without valid player. 2012-08-10 02:40:05 +01:00
KHobbits ed411ee217 Add console log message when player is /kicked 2012-08-10 02:35:05 +01:00
KHobbits 368d3a4046 Add console log message when player is /banned 2012-08-10 02:27:10 +01:00
KHobbits 8aab57e86b Fix yaml issue with /kit 2012-08-10 02:26:23 +01:00
KHobbits e198b61eae Fix Chat Formatting so chat type is shown first. 2012-08-09 13:11:51 +01:00
Iaccidentally 9824cd75b6 Merge pull request #117 from necrodoom/patch-5
items.csv update with ticket #2559 suggestions
2012-08-09 02:07:13 -07:00
necrodoom 562274706b items.csv update with ticket #2559 suggestions
items.csv 2.1_06
2012-08-09 10:24:07 +03:00
KHobbits 03a93bfeff Merge branch 'release' of github.com:essentials/Essentials into release 2012-08-08 23:13:56 +01:00
KHobbits 86749c433c Merge branch '2.9' into release 2012-08-08 23:13:33 +01:00
KHobbits 17adafecf9 Fix /top so that glass counts as a real block. 2012-08-08 23:00:09 +01:00
KHobbits dd12e5db66 Fix tp permissions check to check player typing command not teleportee.
If you don't want players inviting players to other worlds, do not give them essentials.world.<currentworld>
2012-08-08 22:50:54 +01:00
snowleo 94947ecc21 Merge branch 'refs/heads/2.9' into release 2012-08-08 14:22:13 +02:00
snowleo 8e50158af8 Correct material for beds 2012-08-08 14:21:25 +02:00
snowleo 610fae63d2 Merge branch 'refs/heads/2.9' into release 2012-08-08 14:14:42 +02:00
snowleo ee072e844b Fix right click on signs 2012-08-08 14:11:40 +02:00
snowleo 0319415f1b Test the places around the location first, then go up 2012-08-08 13:13:39 +02:00
necrodoom 8fdd32a210 sets, not setting 2012-08-08 11:32:21 +03:00
snowleo 32240cd00d Fix teleports on beds 2012-08-08 10:16:06 +02:00
KHobbits 94f9aedf4b Merge branch 'release' of github.com:essentials/Essentials into release 2012-08-08 02:11:04 +01:00
KHobbits fca3ad4df9 Merge branch '2.9' into release 2012-08-08 02:10:25 +01:00
KHobbits ba6cc5a9ee Fix minor Exp discrepancy
Add 'l<level>' syntax to /exp command
EG: /exp set l20
2012-08-08 02:07:47 +01:00
KHobbits 101ae201d6 Fix /day /night /sun and /storm aliases to actually set to the current status if used without parameters.
fixes #2365
2012-08-08 00:52:43 +01:00
KHobbits 5c1eea0953 Don't show two error messages on [kit] signs.
Fixes #2508
2012-08-08 00:14:07 +01:00
snowleo 733fcc9d87 Merge branch 'refs/heads/2.9' into release 2012-08-07 21:11:34 +02:00
snowleo 738b895cba Merge branch 'refs/heads/groupmanager' into 2.9 2012-08-07 20:13:27 +02:00
ElgarL 72aeec58ed Better error report on malformed GlobalGroups. 2012-08-07 17:58:57 +01:00
snowleo 4d8116cc39 Merge branch 'refs/heads/2.9' into release 2012-08-07 17:45:40 +02:00
snowleo 54133cd75e Prevent errors in listeners affecting EssentialsChat 2012-08-07 16:03:39 +02:00
Alexander Schepp 322fe386f6 Merge pull request #114 from necrodoom/patch-2
another extra space
2012-08-07 05:44:23 -07:00
necrodoom d2b30bad99 another extra space 2012-08-07 15:27:25 +03:00
md_5 264eb318b8 Clean up spaces in config. Please don't break this in the future, this is the second fix guys. 2012-08-07 20:39:55 +10:00
Iaccidentally cebe291a6f Merge pull request #112 from necrodoom/patch-1
update permissions to include new nodes
2012-08-07 01:34:34 -07:00
necrodoom 30d5468be0 update with new workbench node 2012-08-07 11:07:52 +03:00
necrodoom fbfd62b73e update permissions to include new nodes 2012-08-07 11:04:01 +03:00
KHobbits 0b9725bf77 Merge branch '2.9' of github.com:essentials/Essentials into release 2012-08-07 08:55:35 +01:00
KHobbits 3c268312a2 Fix CB. 2012-08-07 08:52:57 +01:00
KHobbits 4c2d220176 Merge branch '2.9' into release 2012-08-07 08:50:06 +01:00
KHobbits a855eaf8d0 Updating CB:
CB: 2317 Bukkit 1521
2012-08-07 08:49:09 +01:00
KHobbits e5c70713b8 Merge branch '2.9' of github.com:essentials/Essentials into release 2012-08-07 08:45:16 +01:00
snowleo 92267fa7f8 Merge branch 'refs/heads/groupmanager' into 2.9 2012-08-06 18:25:55 +02:00
ElgarL 3c5f9e1616 Fix GlobalGroups not loading permission nodes. 2012-08-06 17:15:56 +01:00
snowleo c2db96edc8 Just don't use nio, this might be slower. 2012-08-06 15:57:54 +02:00
Iaccidentally 4ca09cea2d update gc for all worlds (thanks to Yofel) 2012-08-06 06:54:55 -04:00
KHobbits 9b39a227c9 Merge branch 'groupmanager' of github.com:essentials/Essentials into 2.9 2012-08-06 09:17:19 +01:00
ElgarL a7a06963ac Ignore stupid plugins which add empty permission nodes. 2012-08-06 07:05:20 +01:00
KHobbits 38655811b7 Don't bomb if userMap isn't initialized. 2012-08-06 02:44:01 +01:00
KHobbits 2f562f79aa New Sign: Info
Syntax: [info] / [chapter] / [page number] / [cost]
2012-08-06 00:58:35 +01:00
KHobbits ee608d944a New Sign: Repair
Syntax: [repair] / <hand|all> / [cost]
2012-08-06 00:33:29 +01:00
KHobbits 9e975568be New command: /workbench (aliases /wb and /wbench)
Permission: essentials.workbench
2012-08-06 00:26:42 +01:00
KHobbits 3dbabfa11d Default value for [gamemode] sign
New syntax: [gamemode] / <mode>  / [price]
2012-08-06 00:23:47 +01:00
snowleo 7a96fd1dce I should read javadoc properly. 2012-08-06 00:55:25 +02:00
snowleo 5174b6fe93 Move FileChannel inside the loop 2012-08-05 20:16:53 +02:00
snowleo c6617324af Throw exception after 5 attempts 2012-08-05 19:50:37 +02:00
snowleo c7b90f61f7 Try to fix interrupt problem. 2012-08-05 19:41:28 +02:00
Alexander Schepp 7beab59c1a Fix /gamemode 2 playername 2012-08-04 14:17:41 +03:00
Iaccidentally 55c9cacaa3 i'm in ur config, fixxn ur grammer 2012-08-04 06:56:10 -04:00
Iaccidentally 58fc3f4338 I am a grammar nazi. 2012-08-04 07:40:54 -03:00
snowleo 5379b3955f More thread safety 2012-08-04 11:10:57 +02:00
snowleo bf93bb2026 Thread safety for XMPP 2012-08-04 10:48:56 +02:00
ementalo af73c11638 CB #2289 Bukkit #1512
Change PlayerChatEvent to AsyncPlayerChatEvent
2012-08-04 09:25:54 +01:00
snowleo 1a07815f4b Make chat handling more thread safe (and also faster) 2012-08-03 22:57:29 +02:00
snowleo 52702894af Synchronized chatStore 2012-08-03 21:45:32 +02:00
ElgarL 73fb2d3735 Fix mirroring now we are not using any Bukkit methods. 2012-08-03 11:15:14 +01:00
ElgarL 7b482b612e Stop using the YamlConfiguration in bukkit for our config handling. We
can now support periods in world names.
2012-08-03 10:36:26 +01:00
snowleo bd6614328b Ignore case on /gm command 2012-08-03 10:41:23 +02:00
snowleo 45cd9597c9 Code cleanup 2012-08-03 10:39:45 +02:00
snowleo b40d663c7e Ignore case on gamemode signs and code cleanup 2012-08-03 10:36:50 +02:00
snowleo 6513842d28 Less loops please 2012-08-03 10:33:45 +02:00
snowleo c8a07ecdb5 Another fix for /exp 2012-08-03 10:29:22 +02:00
snowleo 80f001fdb7 New exp calculations. 2012-08-03 10:21:03 +02:00
snowleo ab82f550cf Fix broken output of /itemdb 2012-08-03 10:02:47 +02:00
ElgarL 6064b9760b Fix a cases sensitivity bug in world loading. 2012-08-03 08:54:06 +01:00
snowleo 7802192faa Netbeans 7.2 changes 2012-08-03 09:45:44 +02:00
Iaccidentally cd437f95f1 Merge branch '2.9' of https://github.com/essentials/Essentials 2012-08-02 20:30:09 -04:00
Iaccidentally da735b496f update 2.9 item.csv for 1.3 (changes by necrodoom) 2012-08-02 20:29:09 -04:00
ementalo fc288718b7 Switching the syntax of gamemode /gm mode player and adding mode aliases
Fixing translation keys
Fix plugin.yml gamemode syntax
2012-08-02 17:43:58 +01:00
ementalo 766f9b4dbd CB #2267 Bukkit #1505
Updates to gamemode command, mode is now mandatory [creative|survival|adventure]
Updates to gamemode sign, now requires another line with gamemode
2012-08-02 13:52:11 +01:00
Paul A. a1ac58d17c Check the player we are bringing has permission to enter the world vs the initiating user the final frontier 2012-08-01 16:04:13 +02:00
Paul A. 2fbdf7e4d6 re: re: Check the player we are bringing has permission to enter the world vs the initiating user 2012-08-01 15:56:58 +02:00
Paul A. d5ed474be7 Check the player we are bringing has permission to enter the world vs the initiating user part 4 2012-08-01 15:55:04 +02:00
Paul A. 1d92cb0e0a Check the player we are bringing has permission to enter the world vs the initiating user 2012-08-01 15:53:30 +02:00
Paul A. ab7a19b6e6 Check the player we are bringing has permission to enter the world vs the initiating user 2012-08-01 15:52:55 +02:00
Paul A. 7b94adfac8 Check the player we are bringing has permission to enter the world vs the initiating user 2012-08-01 15:50:28 +02:00
Alexander Schepp 33d7776a8e Fix "x times" on signs. 2012-07-31 13:13:18 +03:00
Iaccidentally d299309c67 Merge branch '2.9' of https://github.com/essentials/Essentials 2012-07-29 14:23:36 -04:00
Iaccidentally fcf39ed85b KeepXp fixed. 2012-07-29 14:20:09 -04:00
KHobbits 0badd09ad3 Merge branch '2.9' of github.com:essentials/Essentials into 2.9 2012-07-29 17:16:10 +01:00
KHobbits cfc8faa43a Recommit Keep Exp on death permission
Permission: essentials.keepxp
Code by Iaccidentially.
2012-07-29 17:15:44 +01:00
Alexander Schepp b0586abc67 Prevent that Essentials breaks other plugins signs 2012-07-28 00:26:04 +03:00
KHobbits 41235b6ee1 Revert optimization, doesn't find glass blocks. 2012-07-17 21:05:13 +01:00
KHobbits 141a2bb190 Add small optimization tweak to new safe block function. 2012-07-17 01:28:20 +01:00
KHobbits fb71ebdfdf Remove debugging messages. 2012-07-17 00:47:23 +01:00
KHobbits 66ae1d5b94 Try to do a little better when searching for safe teleport locations. 2012-07-17 00:46:07 +01:00
KHobbits ada077fead Merge pull request #101 from chrisgward/patch-1
Adding enchantment aliases for fire protection
2012-07-15 10:13:33 -07:00
Chris Ward 45367b17a5 Adding enchantment aliases for fire protection 2012-07-15 19:47:53 +10:00
ElgarL 76717350d6 Fix a typo because Necrodoom is anal. 2012-07-13 16:22:52 +01:00
ElgarL b71a6ac5e1 Change to our own Yaml parsing for globalgroups instead of using the
YAMLConfiguration class in bukkit.
2012-07-13 13:38:53 +01:00
snowleo 58544c9eea Fix version in messages_se.properties 2012-07-11 13:22:44 +02:00
snowleo f15cb410ce Added swedish translation (from 3.0 branch) 2012-07-11 13:18:54 +02:00
KHobbits b0cec9782d Add missing triggers from /mute block list 2012-07-11 02:46:45 +02:00
ElgarL 1eac05799f If a permission is found return the correct node for mangcheckp (not
null).
2012-07-10 14:35:08 +01:00
ElgarL 8fac5f6beb Merge branch 'groupmanager' of
https://ElgarL@github.com/essentials/Essentials.git into groupmanager

Conflicts:
	EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java
2012-07-10 14:27:50 +01:00
ElgarL a46497255e Stop force removing attachments and let Bukkit handle it's own mess. 2012-07-10 14:10:13 +01:00
Alexander Schepp 89670bdfd1 Ignore players, that don't have an IP 2012-07-10 15:57:49 +03:00
Alexander Schepp 71e552c0d1 Another NPE fix for bots 2012-07-10 15:56:12 +03:00
md-5 efec7c8f95 Merge pull request #96 from mbax/groupmanager
Fix critical flaw in permissions removal with regards to fake players and Tekkit.
2012-07-10 02:25:56 -07:00
Matt Baxter ed668fcac4 Fix critical flaw in permissions removal.
Potential for removing the removal entirely but this can be figured out later.
2012-07-10 06:24:17 -03:00
ElgarL 72015d42fc Throw a better error than 'null' when someone removes all groups from a
yml.
2012-07-06 08:33:57 +01:00
ElgarL 24ec84730e Ignore any sub folders in the Worlds folder which start with a period
(fix for storing data in svn respoitories).
2012-07-04 11:32:17 +01:00
Iaccidentally dab13931ca Update 2.9 2012-07-03 04:50:29 -03:00
KHobbits b1c7004d7e Update 2.9 2012-07-01 16:40:48 +02:00
md_5 69ff8b28d8 Fix issue with cross world local chat. 2012-06-26 18:13:53 +10:00
ementalo 0395b5d222 Revert "add essentials.keepxp to allow a player to keep their level after death."
This reverts commit 3b25235755.
2012-06-25 21:40:22 +01:00
Iaccidentally 3b25235755 add essentials.keepxp to allow a player to keep their level after death. 2012-06-24 23:27:30 -04:00
ElgarL 51d61e7a91 Fix loading users with only numerals in their names to be seen as
strings.
2012-06-24 13:10:22 +01:00
ElgarL 656f25dc97 Only output a Data update message if something has changed. 2012-06-22 15:44:04 +01:00
702 changed files with 81906 additions and 88032 deletions

No files matched your search

-7
View File
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="lib/bukkit-0.0.1-SNAPSHOT.jar"/>
<classpathentry kind="lib" path="lib/Permissions3.jar"/>
</classpath>
+45
View File
@@ -0,0 +1,45 @@
---
name: Help!
about: Encountered a problem with EssentialsX? Not sure how to fix it?
---
<!-- EssentialsX help guide
Don't write inside the arrows as they will be hidden when you post your issue.
Want faster support? Come join our Discord server to get help sooner:
https://discord.gg/F7gexAQ
If you're happy to wait (or you were sent here from Discord), read on:
1. Fill out the template.
This will help us understand what problem you've encountered and help us
find a solution.
2. Check the Common Issues page.
Read through the wiki page to see if you've encountered a regular issue:
https://essentialsx.github.io/#/Common-Issues
3. Delete this line and all above lines before posting your issue! -->
### Information
Full output of `/ess version`:
<!-- Replace this with the command output -->
**Server log:** <!-- Upload `logs/latest.log` to https://gist.github.com/ -->
**EssentialsX config** <!-- Upload `plugins/Essentials/config.yml` to https://gist.github.com/ -->
### Help request
**Problem**
<!-- What problem did you encounter? -->
**What I have tried**
<!-- What have you tried so far? -->
**Screenshots**
<!-- If relevant, include any screenshots here. -->
+58
View File
@@ -0,0 +1,58 @@
---
name: Report a bug
about: Report an EssentialsX bug. Only use this if you're 100% sure there's something wrong with EssentialsX - otherwise, try "Help!".
---
<!-- EssentialsX bug reporting guide
Don't put anything inside this block, as it won't be included in the issue.
If you are reporting a bug, please follow the following steps:
1. Fill out the template in full.
Run the commands in the console. Don't just put "latest" as a version,
or we will ignore it.
2. When linking files, do not attach them to the post!
Copy and paste any logs into https://gist.github.com/, then paste a
link to them in the relevant parts of the template. Avoid using
Hastebin or Pastebin, as this makes providing support more difficult.
**DO NOT drag files into this box!**
3. If you are reporting a performance issue, please include a link to a
Timings and/or profiler report.
4. If you are reporting a bug with commands or something else in-game,
please include screenshots to help us diagnose the problem.
5. Make sure not to write between the arrows, as anything there will be
hidden.
6. Delete this line and all above lines before posting your issue! -->
### Information
**Full output of `/ess version`**:
```
<!-- Run the command in your console, and copy and paste the whole output here -->
```
**Server log**: <!-- Upload `logs/latest.log` to https://gist.github.com/, replace this with link -->
**EssentialsX config**: <!-- Upload `plugins/Essentials/config.yml` to https://gist.github.com/, replace this with link -->
### Details
**Description**
<!-- Replace this with a brief summary of the bug. -->
**Steps to reproduce**
<!-- Replace this with exactly what you did to cause the bug. -->
**Expected behavior**
<!-- Replace this with what you expected to happen. -->
**Screenshots**
<!-- Replace this with screenshots, if necessary. -->
@@ -0,0 +1,45 @@
---
name: Request a feature
about: Suggest a feature you want to see in EssentialsX!
---
<!-- EssentialsX feature request guide
Fill out the template. Don't write inside the arrows as they will be hidden
when you post your issue.
Not sure if your feature fits in EssentialsX? Feel free to ask on our Discord
server: https://discord.gg/F7gexAQ
If you have a feature suggestion for EssentialsX, read the following tips:
1. Fill out the template.
This will help us understand what you're requesting and why you want us
to add it.
2. Keep it simple.
Make sure it's easy to understand what you're requesting. A good way is
to keep it to one request per GitHub issue, as we can then easily track
feature requests.
3. Check whether it has already been asked or added.
You can search the issue tracker to see if your feature has already been
requested at https://github.com/EssentialsX/Essentials/issues. You can
also check the wiki at https://essentialsx.github.io/ to see if the
feature was recently added.
4. Ask yourself: "Does this belong in EssentialsX?"
There are lots of features that we reject because most servers won't
need or use them. If your feature is very specific or already exists in
another plugin, it might not be a good fit for EssentialsX.
5. Delete this line and all above lines before posting your issue! -->
### Feature request
**Feature description**
<!-- What feature are you suggesting? -->
**How the feature is useful**
<!-- How is the feature useful to players, server owners and/or developers? -->
+52 -41
View File
@@ -1,42 +1,53 @@
.DS_Store
/BuildAll/nbproject/private/
/EssentialsProtect/nbproject/private/
/EssentialsChat/nbproject/private/
/EssentialsGroupBridge/nbproject/private/
/EssentialsGeoIP/nbproject/private/
/EssentialsSpawn/nbproject/private/
/EssentialsXMPP/nbproject/private/
/EssentialsGroupManager/nbproject/private/
/BuildAll/build/
/EssentialsGroupBridge/dist/
/EssentialsGroupBridge/build/
/EssentialsGeoIP/dist/
/EssentialsGeoIP/build/
/EssentialsGroupManager/build/
/EssentialsGroupManager/dist/
/BuildAll/dist/
/EssentialsChat/build/
/EssentialsChat/dist/
/EssentialsSpawn/build/
/EssentialsSpawn/dist/
/EssentialsXMPP/dist/
/EssentialsXMPP/build/
/EssentialsProtect/dist/
/EssentialsProtect/build/
/EssentialsPermissionsCommands/nbproject/private/
/EssentialsPermissionsCommands/build/
/EssentialsPermissionsCommands/dist/
/Essentials/nbproject/private/
/Essentials/dist/
/Essentials/build/
/YamlAnnotations/
/EssentialsUpdate/nbproject/private/
/EssentialsRelease/
/EssentialsUpdate/dist/
/EssentialsUpdate/build/
/WebPush/apikey.php
/WebPush/nbproject/private
/.idea
.DS_Store
/BuildAll/nbproject/private/
/EssentialsProtect/nbproject/private/
/EssentialsChat/nbproject/private/
/EssentialsGroupBridge/nbproject/private/
/EssentialsGeoIP/nbproject/private/
/EssentialsSpawn/nbproject/private/
/EssentialsXMPP/nbproject/private/
/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
/EssentialsGroupManager/bin
/EssentialsGroupManager/.externalToolBuilders
*.classpath
*.project
*.settings/
target/
dependency-reduced-pom.xml
/Essentials/config.yml
/Essentials/kits.yml
/Essentials/userdata/testplayer1.yml
/Essentials/usermap.csv
/Essentials/userdata
/EssentialsGroupManager/target/
-17
View File
@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Essentials</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
+23
View File
@@ -0,0 +1,23 @@
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 ..
-74
View File
@@ -1,74 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="BuildAll" default="default" basedir=".">
<description>Builds, tests, and runs the project BuildAll.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar-with-manifest: JAR building (if you are using a manifest)
-do-jar-without-manifest: JAR building (if you are not using a manifest)
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="BuildAll-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
</project>
File diff suppressed because it is too large. Load diff
-8
View File
@@ -1,8 +0,0 @@
build.xml.data.CRC32=51b33957
build.xml.script.CRC32=7a797370
build.xml.stylesheet.CRC32=28e38971@1.44.1.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=51b33957
nbproject/build-impl.xml.script.CRC32=c5170bed
nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46
-129
View File
@@ -1,129 +0,0 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=BuildAll
application.vendor=
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=120
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAnnotationArgs=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineArrayInit=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAssignment=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineBinaryOp=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineCallArgs=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineDisjunctiveCatchTypes=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineFor=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineImplements=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineMethodParams=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineParenthesized=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTernaryOp=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineThrows=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTryResources=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesAfterClassHeader=0
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesBeforeClass=2
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.classDeclBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.expand-tabs=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indent-shift-width=4
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indentCasesFromSwitch=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.methodDeclBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.otherBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeCatchOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeElseOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeFinallyOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeWhileOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceAfterTypeCast=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaces-per-tab=4
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.tab-size=4
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/BuildAll.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
includes=**
jar.compress=true
javac.classpath=\
${reference.Essentials.jar}:\
${reference.EssentialsChat.jar}:\
${reference.EssentialsProtect.jar}:\
${reference.EssentialsSpawn.jar}:\
${reference.EssentialsGeoIP.jar}:\
${reference.EssentialsGroupBridge.jar}:\
${reference.EssentialsXMPP.jar}:\
${reference.EssentialsGroupManager.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.processorpath=\
${javac.classpath}
javac.source=1.6
javac.target=1.6
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=default_platform
project.Essentials=../Essentials
project.EssentialsChat=../EssentialsChat
project.EssentialsGeoIP=../EssentialsGeoIP
project.EssentialsGroupBridge=../EssentialsGroupBridge
project.EssentialsGroupManager=../EssentialsGroupManager
project.EssentialsProtect=../EssentialsProtect
project.EssentialsSpawn=../EssentialsSpawn
project.EssentialsXMPP=../EssentialsXMPP
reference.Essentials.jar=${project.Essentials}/dist/Essentials.jar
reference.EssentialsChat.jar=${project.EssentialsChat}/dist/EssentialsChat.jar
reference.EssentialsGeoIP.jar=${project.EssentialsGeoIP}/dist/EssentialsGeoIP.jar
reference.EssentialsGroupBridge.jar=${project.EssentialsGroupBridge}/dist/EssentialsGroupBridge.jar
reference.EssentialsGroupManager.jar=${project.EssentialsGroupManager}/dist/EssentialsGroupManager.jar
reference.EssentialsProtect.jar=${project.EssentialsProtect}/dist/EssentialsProtect.jar
reference.EssentialsSpawn.jar=${project.EssentialsSpawn}/dist/EssentialsSpawn.jar
reference.EssentialsXMPP.jar=${project.EssentialsXMPP}/dist/EssentialsXMPP.jar
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
# or test-sys-prop.name=value to set system properties for unit tests):
run.jvmargs=
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test
-84
View File
@@ -1,84 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>BuildAll</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
<libraries xmlns="http://www.netbeans.org/ns/ant-project-libraries/1">
<definitions>..\lib\nblibraries.properties</definitions>
</libraries>
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
<reference>
<foreign-project>Essentials</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsChat</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsGeoIP</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsGroupBridge</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsGroupManager</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsProtect</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsSpawn</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
<reference>
<foreign-project>EssentialsXMPP</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
</references>
</configuration>
</project>
-84
View File
@@ -1,84 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="Essentials" default="default" basedir=".">
<description>Builds, tests, and runs the project Essentials.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar-with-manifest: JAR building (if you are using a manifest)
-do-jar-without-manifest: JAR building (if you are not using a manifest)
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="Essentials-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
<!--target name="-post-jar">
<jar jarfile="${dist.dir}/Essentials.jar">
<zipfileset src="${dist.jar}" excludes="META-INF/*" />
<zipfileset src="${dist.dir}/lib/Register.jar" excludes="META-INF/*" />
<manifest>
<attribute name="Classpath" value="Essentials.jar"/>
</manifest>
</jar>
</target-->
</project>
File diff suppressed because it is too large. Load diff
-11
View File
@@ -1,11 +0,0 @@
build.xml.data.CRC32=7d758acf
build.xml.script.CRC32=3233ee78
build.xml.stylesheet.CRC32=28e38971@1.38.2.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=a830bc14
nbproject/build-impl.xml.script.CRC32=a9f8842a
nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46
nbproject/profiler-build-impl.xml.data.CRC32=ab78ce15
nbproject/profiler-build-impl.xml.script.CRC32=abda56ed
nbproject/profiler-build-impl.xml.stylesheet.CRC32=f10cf54c@1.11.1
-3
View File
@@ -1,3 +0,0 @@
DoNotUseThreads
LongVariable
SignatureDeclareThrowsException
-154
View File
@@ -1,154 +0,0 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.processors.list=lombok.core.AnnotationProcessor
annotation.processing.run.all.processors=false
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=Essentials
application.vendor=
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=120
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAnnotationArgs=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineArrayInit=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAssignment=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineBinaryOp=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineCallArgs=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineDisjunctiveCatchTypes=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineFor=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineImplements=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineMethodParams=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineParenthesized=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTernaryOp=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineThrows=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTryResources=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesAfterClassHeader=0
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesBeforeClass=2
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.classDeclBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.expand-tabs=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.importGroupsOrder=*
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indent-shift-width=4
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indentCasesFromSwitch=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.methodDeclBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.otherBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeCatchOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeElseOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeFinallyOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeWhileOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.separateImportGroups=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceAfterTypeCast=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaces-per-tab=4
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.tab-size=4
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/Essentials.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
file.reference.BOSEconomy7.jar=../lib/BOSEconomy7.jar
file.reference.bPermissions.jar=../lib/bPermissions.jar
file.reference.bpermissions2.jar=../lib/bpermissions2.jar
file.reference.bukkit.jar=../lib/bukkit.jar
file.reference.craftbukkit.jar=../lib/craftbukkit.jar
file.reference.iCo4.jar=../lib/iCo4.jar
file.reference.iCo5.jar=../lib/iCo5.jar
file.reference.iCo6.jar=../lib/iCo6.jar
file.reference.lombok.jar=../lib/lombok-0.10.8.jar
file.reference.MultiCurrency.jar=../lib/MultiCurrency.jar
file.reference.Permissions3.jar=../lib/Permissions3.jar
file.reference.PermissionsBukkit-1.2.jar=../lib/PermissionsBukkit-1.2.jar
file.reference.PermissionsEx.jar=../lib/PermissionsEx.jar
file.reference.Privileges.jar=..\\lib\\Privileges.jar
file.reference.Vault.jar=../lib/Vault.jar
includes=**
jar.archive.disabled=${jnlp.enabled}
jar.compress=true
jar.index=${jnlp.enabled}
javac.classpath=\
${file.reference.Permissions3.jar}:\
${file.reference.iCo4.jar}:\
${file.reference.iCo5.jar}:\
${file.reference.iCo6.jar}:\
${file.reference.MultiCurrency.jar}:\
${file.reference.BOSEconomy7.jar}:\
${file.reference.PermissionsEx.jar}:\
${file.reference.bPermissions.jar}:\
${file.reference.PermissionsBukkit-1.2.jar}:\
${file.reference.lombok.jar}:\
${reference.EssentialsGroupManager.jar}:\
${file.reference.bukkit.jar}:\
${file.reference.craftbukkit.jar}:\
${file.reference.Vault.jar}:\
${file.reference.Privileges.jar}:\
${file.reference.bpermissions2.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.processorpath=\
${javac.classpath}
javac.source=1.6
javac.target=1.6
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}:\
${libs.junit_4.10.classpath}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.reference.PermissionsEx.jar=../lib/PermissionsEx-javadoc.jar
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
jnlp.codebase.type=no.codebase
jnlp.descriptor=application
jnlp.enabled=false
jnlp.mixed.code=default
jnlp.offline-allowed=false
jnlp.signed=false
jnlp.signing=
jnlp.signing.alias=
jnlp.signing.keystore=
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=true
platform.active=default_platform
project.EssentialsGroupManager=../EssentialsGroupManager
reference.EssentialsGroupManager.jar=../EssentialsGroupManager/dist/EssentialsGroupManager.jar
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
# or test-sys-prop.name=value to set system properties for unit tests):
run.jvmargs=-Djline.terminal=jline.UnsupportedTerminal
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test
-28
View File
@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>Essentials</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
<libraries xmlns="http://www.netbeans.org/ns/ant-project-libraries/1">
<definitions>../lib/nblibraries.properties</definitions>
</libraries>
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
<reference>
<foreign-project>EssentialsGroupManager</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
</references>
</configuration>
</project>
+122
View File
@@ -0,0 +1,122 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.ess3</groupId>
<artifactId>EssentialsXParent</artifactId>
<version>2.16.0</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>
<configuration>
<showDeprecation>false</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>Vault</artifactId>
<version>1.5.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>NMSProvider</artifactId>
<version>2.16.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>UpdatedMetaProvider</artifactId>
<version>2.16.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>1_8_R1Provider</artifactId>
<version>2.16.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>1_8_R2Provider</artifactId>
<version>2.16.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>LegacyProvider</artifactId>
<version>2.16.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>ReflectionProvider</artifactId>
<version>2.16.0</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>
<scope>compile</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>vault-repo</id>
<url>http://nexus.hc.to/content/repositories/pub_releases</url>
</repository>
</repositories>
</project>
+18
View File
@@ -0,0 +1,18 @@
This is the book file.
This file format works similar to the info.txt, motd.txt and rules.txt
Place content in here that you would like to be used by books ingame.
You can use this content by using the book:<section> meta option in kits or item spawning.
#Colors
Minecraft colors:
&0 &&0 &1 &&1 &2 &&2 &3 &&3
&4 &&4 &5 &&5 &6 &&6 &7 &&7
&8 &&8 &9 &&9 &a &&a &b &&b
&c &&c &d &&d &e &&e &f &&f
&0
&&k &kMagic&r &&l &lBold
&&m &mStrike&r &&n &nUline
&&o &oItalic&r &&r &rReset
@@ -1,137 +1,113 @@
package com.earth2me.essentials;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.ess3.api.IEssentials;
import org.bukkit.command.Command;
import org.bukkit.command.PluginCommand;
import org.bukkit.command.PluginCommandYamlParser;
import org.bukkit.plugin.Plugin;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class AlternativeCommandsHandler
{
private static final Logger LOGGER = Logger.getLogger("Minecraft");
private final transient Map<String, List<PluginCommand>> altcommands = new HashMap<String, List<PluginCommand>>();
private final transient Map<String, String> disabledList = new HashMap<String, String>();
private final transient IEssentials ess;
public AlternativeCommandsHandler(final IEssentials ess)
{
this.ess = ess;
for (Plugin plugin : ess.getServer().getPluginManager().getPlugins())
{
if (plugin.isEnabled())
{
addPlugin(plugin);
}
}
}
public class AlternativeCommandsHandler {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private final transient Map<String, List<PluginCommand>> altcommands = new HashMap<>();
private final transient Map<String, String> disabledList = new HashMap<>();
private final transient IEssentials ess;
public final void addPlugin(final Plugin plugin)
{
if (plugin.getDescription().getMain().contains("com.earth2me.essentials"))
{
return;
}
final List<Command> commands = PluginCommandYamlParser.parse(plugin);
final String pluginName = plugin.getDescription().getName().toLowerCase(Locale.ENGLISH);
public AlternativeCommandsHandler(final IEssentials ess) {
this.ess = ess;
for (Plugin plugin : ess.getServer().getPluginManager().getPlugins()) {
if (plugin.isEnabled()) {
addPlugin(plugin);
}
}
}
for (Command command : commands)
{
final PluginCommand pc = (PluginCommand)command;
final List<String> labels = new ArrayList<String>(pc.getAliases());
labels.add(pc.getName());
public final void addPlugin(final Plugin plugin) {
if (plugin.getDescription().getMain().contains("com.earth2me.essentials")) {
return;
}
final List<Command> commands = PluginCommandYamlParser.parse(plugin);
final String pluginName = plugin.getDescription().getName().toLowerCase(Locale.ENGLISH);
PluginCommand reg = ess.getServer().getPluginCommand(pluginName + ":" + pc.getName().toLowerCase(Locale.ENGLISH));
if (reg == null)
{
reg = ess.getServer().getPluginCommand(pc.getName().toLowerCase(Locale.ENGLISH));
}
if (reg == null || !reg.getPlugin().equals(plugin))
{
continue;
}
for (String label : labels)
{
List<PluginCommand> plugincommands = altcommands.get(label.toLowerCase(Locale.ENGLISH));
if (plugincommands == null)
{
plugincommands = new ArrayList<PluginCommand>();
altcommands.put(label.toLowerCase(Locale.ENGLISH), plugincommands);
}
boolean found = false;
for (PluginCommand pc2 : plugincommands)
{
if (pc2.getPlugin().equals(plugin))
{
found = true;
}
}
if (!found)
{
plugincommands.add(reg);
}
}
}
}
for (Command command : commands) {
final PluginCommand pc = (PluginCommand) command;
final List<String> labels = new ArrayList<>(pc.getAliases());
labels.add(pc.getName());
public void removePlugin(final Plugin plugin)
{
final Iterator<Map.Entry<String, List<PluginCommand>>> iterator = altcommands.entrySet().iterator();
while (iterator.hasNext())
{
final Map.Entry<String, List<PluginCommand>> entry = iterator.next();
final Iterator<PluginCommand> pcIterator = entry.getValue().iterator();
while (pcIterator.hasNext())
{
final PluginCommand pc = pcIterator.next();
if (pc.getPlugin() == null || pc.getPlugin().equals(plugin))
{
pcIterator.remove();
}
}
if (entry.getValue().isEmpty())
{
iterator.remove();
}
}
}
PluginCommand reg = ess.getServer().getPluginCommand(pluginName + ":" + pc.getName().toLowerCase(Locale.ENGLISH));
if (reg == null) {
reg = ess.getServer().getPluginCommand(pc.getName().toLowerCase(Locale.ENGLISH));
}
if (reg == null || !reg.getPlugin().equals(plugin)) {
continue;
}
for (String label : labels) {
List<PluginCommand> plugincommands = altcommands.get(label.toLowerCase(Locale.ENGLISH));
if (plugincommands == null) {
plugincommands = new ArrayList<>();
altcommands.put(label.toLowerCase(Locale.ENGLISH), plugincommands);
}
boolean found = false;
for (PluginCommand pc2 : plugincommands) {
if (pc2.getPlugin().equals(plugin)) {
found = true;
}
}
if (!found) {
plugincommands.add(reg);
}
}
}
}
public PluginCommand getAlternative(final String label)
{
final List<PluginCommand> commands = altcommands.get(label);
if (commands == null || commands.isEmpty())
{
return null;
}
if (commands.size() == 1)
{
return commands.get(0);
}
// return the first command that is not an alias
for (PluginCommand command : commands)
{
if (command.getName().equalsIgnoreCase(label))
{
return command;
}
}
// return the first alias
return commands.get(0);
}
public void removePlugin(final Plugin plugin) {
final Iterator<Map.Entry<String, List<PluginCommand>>> iterator = altcommands.entrySet().iterator();
while (iterator.hasNext()) {
final Map.Entry<String, List<PluginCommand>> entry = iterator.next();
final Iterator<PluginCommand> pcIterator = entry.getValue().iterator();
while (pcIterator.hasNext()) {
final PluginCommand pc = pcIterator.next();
if (pc.getPlugin() == null || pc.getPlugin().equals(plugin)) {
pcIterator.remove();
}
}
if (entry.getValue().isEmpty()) {
iterator.remove();
}
}
}
public void executed(final String label, final String otherLabel)
{
if (ess.getSettings().isDebug())
{
LOGGER.log(Level.INFO, "Essentials: Alternative command " + label + " found, using " + otherLabel);
}
disabledList.put(label, otherLabel);
}
public PluginCommand getAlternative(final String label) {
final List<PluginCommand> commands = altcommands.get(label);
if (commands == null || commands.isEmpty()) {
return null;
}
if (commands.size() == 1) {
return commands.get(0);
}
// return the first command that is not an alias
for (PluginCommand command : commands) {
if (command.getName().equalsIgnoreCase(label)) {
return command;
}
}
// return the first alias
return commands.get(0);
}
public Map<String, String> disabledCommands()
{
return disabledList;
}
public void executed(final String label, final PluginCommand pc) {
final String altString = pc.getPlugin().getName() + ":" + pc.getLabel();
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Essentials: Alternative command " + label + " found, using " + altString);
}
disabledList.put(label, altString);
}
public Map<String, String> disabledCommands() {
return disabledList;
}
}
+117 -125
View File
@@ -1,140 +1,132 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import net.ess3.api.IEssentials;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import static com.earth2me.essentials.I18n.tl;
public class Backup implements Runnable
{
private static final Logger LOGGER = Logger.getLogger("Minecraft");
private transient final Server server;
private transient final IEssentials ess;
private transient boolean running = false;
private transient int taskId = -1;
private transient boolean active = false;
public class Backup implements Runnable {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private transient final Server server;
private transient final IEssentials ess;
private transient boolean running = false;
private transient int taskId = -1;
private transient boolean active = false;
public Backup(final IEssentials ess)
{
this.ess = ess;
server = ess.getServer();
if (server.getOnlinePlayers().length > 0)
{
startTask();
}
}
public Backup(final IEssentials ess) {
this.ess = ess;
server = ess.getServer();
if (!ess.getOnlinePlayers().isEmpty()) {
ess.runTaskAsynchronously(new Runnable() {
@Override
public void run() {
startTask();
}
});
}
}
void onPlayerJoin()
{
startTask();
}
public void onPlayerJoin() {
startTask();
}
private void startTask()
{
if (!running)
{
final long interval = ess.getSettings().getBackupInterval() * 1200; // minutes -> ticks
if (interval < 1200)
{
return;
}
taskId = ess.scheduleSyncRepeatingTask(this, interval, interval);
running = true;
}
}
public synchronized void stopTask() {
running = false;
if (taskId != -1) {
server.getScheduler().cancelTask(taskId);
}
taskId = -1;
}
@Override
public void run()
{
if (active)
{
return;
}
active = true;
final String command = ess.getSettings().getBackupCommand();
if (command == null || "".equals(command))
{
return;
}
if ("save-all".equalsIgnoreCase(command)) {
final CommandSender cs = server.getConsoleSender();
server.dispatchCommand(cs, "save-all");
active = false;
return;
}
LOGGER.log(Level.INFO, _("backupStarted"));
final CommandSender cs = server.getConsoleSender();
server.dispatchCommand(cs, "save-all");
server.dispatchCommand(cs, "save-off");
private synchronized void startTask() {
if (!running) {
final long interval = ess.getSettings().getBackupInterval() * 1200; // minutes -> ticks
if (interval < 1200) {
return;
}
taskId = ess.scheduleSyncRepeatingTask(this, interval, interval);
running = true;
}
}
ess.scheduleAsyncDelayedTask(
new Runnable()
{
@Override
public void run()
{
try
{
final ProcessBuilder childBuilder = new ProcessBuilder(command);
childBuilder.redirectErrorStream(true);
childBuilder.directory(ess.getDataFolder().getParentFile().getParentFile());
final Process child = childBuilder.start();
final BufferedReader reader = new BufferedReader(new InputStreamReader(child.getInputStream()));
try
{
child.waitFor();
String line;
do
{
line = reader.readLine();
if (line != null)
{
LOGGER.log(Level.INFO, line);
}
}
while (line != null);
}
finally
{
reader.close();
}
}
catch (InterruptedException ex)
{
LOGGER.log(Level.SEVERE, null, ex);
}
catch (IOException ex)
{
LOGGER.log(Level.SEVERE, null, ex);
}
finally
{
ess.scheduleSyncDelayedTask(
new Runnable()
{
@Override
public void run()
{
server.dispatchCommand(cs, "save-on");
if (server.getOnlinePlayers().length == 0)
{
running = false;
if (taskId != -1)
{
server.getScheduler().cancelTask(taskId);
}
}
active = false;
LOGGER.log(Level.INFO, _("backupFinished"));
}
});
}
}
});
}
@Override
public void run() {
if (active) {
return;
}
active = true;
final String command = ess.getSettings().getBackupCommand();
if (command == null || "".equals(command)) {
return;
}
if ("save-all".equalsIgnoreCase(command)) {
final CommandSender cs = server.getConsoleSender();
server.dispatchCommand(cs, "save-all");
active = false;
return;
}
LOGGER.log(Level.INFO, tl("backupStarted"));
final CommandSender cs = server.getConsoleSender();
server.dispatchCommand(cs, "save-all");
server.dispatchCommand(cs, "save-off");
ess.runTaskAsynchronously(new Runnable() {
@Override
public void run() {
try {
final ProcessBuilder childBuilder = new ProcessBuilder(command);
childBuilder.redirectErrorStream(true);
childBuilder.directory(ess.getDataFolder().getParentFile().getParentFile());
final Process child = childBuilder.start();
ess.runTaskAsynchronously(new Runnable() {
@Override
public void run() {
try {
final BufferedReader reader = new BufferedReader(new InputStreamReader(child.getInputStream()));
try {
String line;
do {
line = reader.readLine();
if (line != null) {
LOGGER.log(Level.INFO, line);
}
} while (line != null);
} finally {
reader.close();
}
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
}
});
child.waitFor();
} catch (InterruptedException ex) {
LOGGER.log(Level.SEVERE, null, ex);
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
} finally {
class BackupEnableSaveTask implements Runnable {
@Override
public void run() {
server.dispatchCommand(cs, "save-on");
if (ess.getOnlinePlayers().isEmpty()) {
stopTask();
}
active = false;
LOGGER.log(Level.INFO, tl("backupFinished"));
}
}
ess.scheduleSyncDelayedTask(new BackupEnableSaveTask());
}
}
});
}
}
@@ -1,15 +1,12 @@
package com.earth2me.essentials;
public class ChargeException extends Exception
{
public ChargeException(final String message)
{
super(message);
}
public class ChargeException extends Exception {
public ChargeException(final String message) {
super(message);
}
public ChargeException(final String message, final Throwable throwable)
{
super(message, throwable);
}
public ChargeException(final String message, final Throwable throwable) {
super(message, throwable);
}
}
@@ -0,0 +1,39 @@
package com.earth2me.essentials;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class CommandSource {
protected CommandSender sender;
public CommandSource(final CommandSender base) {
this.sender = base;
}
public final CommandSender getSender() {
return sender;
}
public final Player getPlayer() {
if (sender instanceof Player) {
return (Player) sender;
}
return null;
}
public final boolean isPlayer() {
return (sender instanceof Player);
}
public final CommandSender setSender(final CommandSender base) {
return this.sender = base;
}
public void sendMessage(String message) {
if (!message.isEmpty()) {
sender.sendMessage(message);
}
}
}
@@ -1,38 +1,77 @@
package com.earth2me.essentials;
import com.earth2me.essentials.messaging.IMessageRecipient;
import com.earth2me.essentials.messaging.SimpleMessageRecipient;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
public final class Console implements IReplyTo
{
private static Console instance = new Console();
private CommandSender replyTo;
public final static String NAME = "Console";
public final class Console implements IMessageRecipient {
public static final String NAME = "Console";
private static Console instance; // Set in essentials
private final IEssentials ess;
private final IMessageRecipient messageRecipient;
private Console()
{
}
public static Console getInstance() {
return instance;
}
public static CommandSender getCommandSender(Server server) throws Exception
{
return server.getConsoleSender();
}
static void setInstance(IEssentials ess) { // Called in Essentials#onEnable()
instance = new Console(ess);
}
/**
* @deprecated Use {@link Console#getCommandSender()}
*/
@Deprecated
public static CommandSender getCommandSender(Server server) throws Exception {
return server.getConsoleSender();
}
@Override
public void setReplyTo(CommandSender user)
{
replyTo = user;
}
private Console(IEssentials ess) {
this.ess = ess;
this.messageRecipient = new SimpleMessageRecipient(ess, this);
}
@Override
public CommandSender getReplyTo()
{
return replyTo;
}
public CommandSender getCommandSender() {
return ess.getServer().getConsoleSender();
}
public static Console getConsoleReplyTo()
{
return instance;
}
@Override public String getName() {
return Console.NAME;
}
@Override public String getDisplayName() {
return Console.NAME;
}
@Override public void sendMessage(String message) {
getCommandSender().sendMessage(message);
}
@Override public boolean isReachable() {
return true;
}
/* ================================
* >> DELEGATE METHODS
* ================================ */
@Override public MessageResponse sendMessage(IMessageRecipient recipient, String message) {
return this.messageRecipient.sendMessage(recipient, message);
}
@Override public MessageResponse onReceiveMessage(IMessageRecipient sender, String message) {
return this.messageRecipient.onReceiveMessage(sender, message);
}
@Override public IMessageRecipient getReplyRecipient() {
return this.messageRecipient.getReplyRecipient();
}
@Override public void setReplyRecipient(IMessageRecipient recipient) {
this.messageRecipient.setReplyRecipient(recipient);
}
}
@@ -1,298 +0,0 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* This utility class is used for converting between the ingame time in ticks to ingame time as a friendly string. Note
* that the time is INGAME.
*
* http://www.minecraftwiki.net/wiki/Day/night_cycle
*
* @author Olof Larsson
*/
public final class DescParseTickFormat
{
// ============================================
// First some information vars. TODO: Should this be in a config file?
// --------------------------------------------
public static final Map<String, Integer> nameToTicks = new LinkedHashMap<String, Integer>();
public static final Set<String> resetAliases = new HashSet<String>();
public static final int ticksAtMidnight = 18000;
public static final int ticksPerDay = 24000;
public static final int ticksPerHour = 1000;
public static final double ticksPerMinute = 1000d / 60d;
public static final double ticksPerSecond = 1000d / 60d / 60d;
private static final SimpleDateFormat SDFTwentyFour = new SimpleDateFormat("HH:mm", Locale.ENGLISH);
private static final SimpleDateFormat SDFTwelve = new SimpleDateFormat("h:mmaa", Locale.ENGLISH);
static
{
SDFTwentyFour.setTimeZone(TimeZone.getTimeZone("GMT"));
SDFTwelve.setTimeZone(TimeZone.getTimeZone("GMT"));
nameToTicks.put("sunrise", 23000);
nameToTicks.put("dawn", 23000);
nameToTicks.put("daystart", 0);
nameToTicks.put("day", 0);
nameToTicks.put("morning", 1000);
nameToTicks.put("midday", 6000);
nameToTicks.put("noon", 6000);
nameToTicks.put("afternoon", 9000);
nameToTicks.put("sunset", 12000);
nameToTicks.put("dusk", 12000);
nameToTicks.put("sundown", 12000);
nameToTicks.put("nightfall", 12000);
nameToTicks.put("nightstart", 14000);
nameToTicks.put("night", 14000);
nameToTicks.put("midnight", 18000);
resetAliases.add("reset");
resetAliases.add("normal");
resetAliases.add("default");
}
private DescParseTickFormat()
{
}
// ============================================
// PARSE. From describing String to int
// --------------------------------------------
public static long parse(String desc) throws NumberFormatException
{
// Only look at alphanumeric and lowercase and : for 24:00
desc = desc.toLowerCase(Locale.ENGLISH).replaceAll("[^A-Za-z0-9:]", "");
// Detect ticks format
try
{
return parseTicks(desc);
}
catch (Exception e)
{
}
// Detect 24-hour format
try
{
return parse24(desc);
}
catch (Exception e)
{
}
// Detect 12-hour format
try
{
return parse12(desc);
}
catch (Exception e)
{
}
// Detect aliases
try
{
return parseAlias(desc);
}
catch (Exception e)
{
}
// Well we failed to understand...
throw new NumberFormatException();
}
public static long parseTicks(String desc) throws NumberFormatException
{
if (!desc.matches("^[0-9]+ti?c?k?s?$"))
{
throw new NumberFormatException();
}
desc = desc.replaceAll("[^0-9]", "");
return Long.parseLong(desc) % 24000;
}
public static long parse24(String desc) throws NumberFormatException
{
if (!desc.matches("^[0-9]{2}[^0-9]?[0-9]{2}$"))
{
throw new NumberFormatException();
}
desc = desc.toLowerCase(Locale.ENGLISH).replaceAll("[^0-9]", "");
if (desc.length() != 4)
{
throw new NumberFormatException();
}
final int hours = Integer.parseInt(desc.substring(0, 2));
final int minutes = Integer.parseInt(desc.substring(2, 4));
return hoursMinutesToTicks(hours, minutes);
}
public static long parse12(String desc) throws NumberFormatException
{
if (!desc.matches("^[0-9]{1,2}([^0-9]?[0-9]{2})?(pm|am)$"))
{
throw new NumberFormatException();
}
int hours = 0;
int minutes = 0;
desc = desc.toLowerCase(Locale.ENGLISH);
String parsetime = desc.replaceAll("[^0-9]", "");
if (parsetime.length() > 4)
{
throw new NumberFormatException();
}
if (parsetime.length() == 4)
{
hours += Integer.parseInt(parsetime.substring(0, 2));
minutes += Integer.parseInt(parsetime.substring(2, 4));
}
else if (parsetime.length() == 3)
{
hours += Integer.parseInt(parsetime.substring(0, 1));
minutes += Integer.parseInt(parsetime.substring(1, 3));
}
else if (parsetime.length() == 2)
{
hours += Integer.parseInt(parsetime.substring(0, 2));
}
else if (parsetime.length() == 1)
{
hours += Integer.parseInt(parsetime.substring(0, 1));
}
else
{
throw new NumberFormatException();
}
if (desc.endsWith("pm") && hours != 12)
{
hours += 12;
}
if (desc.endsWith("am") && hours == 12)
{
hours -= 12;
}
return hoursMinutesToTicks(hours, minutes);
}
public static long hoursMinutesToTicks(final int hours, final int minutes)
{
long ret = ticksAtMidnight;
ret += (hours) * ticksPerHour;
ret += (minutes / 60.0) * ticksPerHour;
ret %= ticksPerDay;
return ret;
}
public static long parseAlias(final String desc) throws NumberFormatException
{
final Integer ret = nameToTicks.get(desc);
if (ret == null)
{
throw new NumberFormatException();
}
return ret;
}
public static boolean meansReset(final String desc)
{
return resetAliases.contains(desc);
}
// ============================================
// FORMAT. From int to describing String
// --------------------------------------------
public static String format(final long ticks)
{
return _("timeFormat", format24(ticks), format12(ticks), formatTicks(ticks));
}
public static String formatTicks(final long ticks)
{
return (ticks % ticksPerDay) + "ticks";
}
public static String format24(final long ticks)
{
synchronized (SDFTwentyFour)
{
return formatDateFormat(ticks, SDFTwentyFour);
}
}
public static String format12(final long ticks)
{
synchronized (SDFTwelve)
{
return formatDateFormat(ticks, SDFTwelve);
}
}
public static String formatDateFormat(final long ticks, final SimpleDateFormat format)
{
final Date date = ticksToDate(ticks);
return format.format(date);
}
public static Date ticksToDate(long ticks)
{
// Assume the server time starts at 0. It would start on a day.
// But we will simulate that the server started with 0 at midnight.
ticks = ticks - ticksAtMidnight + ticksPerDay;
// How many ingame days have passed since the server start?
final long days = ticks / ticksPerDay;
ticks = ticks - days * ticksPerDay;
// How many hours on the last day?
final long hours = ticks / ticksPerHour;
ticks = ticks - hours * ticksPerHour;
// How many minutes on the last day?
final long minutes = (long)Math.floor(ticks / ticksPerMinute);
final double dticks = ticks - minutes * ticksPerMinute;
// How many seconds on the last day?
final long seconds = (long)Math.floor(dticks / ticksPerSecond);
// Now we create an english GMT calendar (We wan't no daylight savings)
final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.ENGLISH);
cal.setLenient(true);
// And we set the time to 0! And append the time that passed!
cal.set(0, Calendar.JANUARY, 1, 0, 0, 0);
cal.add(Calendar.DAY_OF_YEAR, (int)days);
cal.add(Calendar.HOUR_OF_DAY, (int)hours);
cal.add(Calendar.MINUTE, (int)minutes);
cal.add(Calendar.SECOND, (int)seconds + 1); // To solve rounding errors.
return cal.getTime();
}
}
@@ -1,129 +1,257 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.NumberUtil;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Pattern;
import org.bukkit.enchantments.Enchantment;
public class Enchantments
{
private static final transient Pattern NUMPATTERN = Pattern.compile("\\d+");
private static final Map<String, Enchantment> ENCHANTMENTS = new HashMap<String, Enchantment>();
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>();
static
{
ENCHANTMENTS.put("alldamage", Enchantment.DAMAGE_ALL);
ENCHANTMENTS.put("alldmg", Enchantment.DAMAGE_ALL);
ENCHANTMENTS.put("sharpness", Enchantment.DAMAGE_ALL);
ENCHANTMENTS.put("sharp", Enchantment.DAMAGE_ALL);
ENCHANTMENTS.put("arthropodsdamage", Enchantment.DAMAGE_ARTHROPODS);
ENCHANTMENTS.put("ardmg", Enchantment.DAMAGE_ARTHROPODS);
ENCHANTMENTS.put("baneofarthropods", Enchantment.DAMAGE_ARTHROPODS);
ENCHANTMENTS.put("baneofarthropod", Enchantment.DAMAGE_ARTHROPODS);
ENCHANTMENTS.put("arthropod", Enchantment.DAMAGE_ARTHROPODS);
ENCHANTMENTS.put("undeaddamage", Enchantment.DAMAGE_UNDEAD);
ENCHANTMENTS.put("smite", Enchantment.DAMAGE_UNDEAD);
ENCHANTMENTS.put("digspeed", Enchantment.DIG_SPEED);
ENCHANTMENTS.put("efficiency", Enchantment.DIG_SPEED);
ENCHANTMENTS.put("minespeed", Enchantment.DIG_SPEED);
ENCHANTMENTS.put("cutspeed", Enchantment.DIG_SPEED);
ENCHANTMENTS.put("durability", Enchantment.DURABILITY);
ENCHANTMENTS.put("dura", Enchantment.DURABILITY);
ENCHANTMENTS.put("unbreaking", Enchantment.DURABILITY);
ENCHANTMENTS.put("fireaspect", Enchantment.FIRE_ASPECT);
ENCHANTMENTS.put("fire", Enchantment.FIRE_ASPECT);
ENCHANTMENTS.put("meleefire", Enchantment.FIRE_ASPECT);
ENCHANTMENTS.put("meleeflame", Enchantment.FIRE_ASPECT);
ENCHANTMENTS.put("knockback", Enchantment.KNOCKBACK);
ENCHANTMENTS.put("blockslootbonus", Enchantment.LOOT_BONUS_BLOCKS);
ENCHANTMENTS.put("fortune", Enchantment.LOOT_BONUS_BLOCKS);
ENCHANTMENTS.put("mobslootbonus", Enchantment.LOOT_BONUS_MOBS);
ENCHANTMENTS.put("mobloot", Enchantment.LOOT_BONUS_MOBS);
ENCHANTMENTS.put("looting", Enchantment.LOOT_BONUS_MOBS);
ENCHANTMENTS.put("oxygen", Enchantment.OXYGEN);
ENCHANTMENTS.put("respiration", Enchantment.OXYGEN);
ENCHANTMENTS.put("breathing", Enchantment.OXYGEN);
ENCHANTMENTS.put("breath", Enchantment.OXYGEN);
ENCHANTMENTS.put("protection", Enchantment.PROTECTION_ENVIRONMENTAL);
ENCHANTMENTS.put("prot", Enchantment.PROTECTION_ENVIRONMENTAL);
ENCHANTMENTS.put("protect", Enchantment.PROTECTION_ENVIRONMENTAL);
ENCHANTMENTS.put("explosionsprotection", Enchantment.PROTECTION_EXPLOSIONS);
ENCHANTMENTS.put("explosionprotection", Enchantment.PROTECTION_EXPLOSIONS);
ENCHANTMENTS.put("expprot", Enchantment.PROTECTION_EXPLOSIONS);
ENCHANTMENTS.put("blastprotection", Enchantment.PROTECTION_EXPLOSIONS);
ENCHANTMENTS.put("blastprotect", Enchantment.PROTECTION_EXPLOSIONS);
ENCHANTMENTS.put("fallprotection", Enchantment.PROTECTION_FALL);
ENCHANTMENTS.put("fallprot", Enchantment.PROTECTION_FALL);
ENCHANTMENTS.put("featherfall", Enchantment.PROTECTION_FALL);
ENCHANTMENTS.put("featherfalling", Enchantment.PROTECTION_FALL);
ENCHANTMENTS.put("fireprotection", Enchantment.PROTECTION_FIRE);
ENCHANTMENTS.put("flameprotection", Enchantment.PROTECTION_FIRE);
ENCHANTMENTS.put("fireprotect", Enchantment.PROTECTION_FIRE);
ENCHANTMENTS.put("flameprotect", Enchantment.PROTECTION_FIRE);
ENCHANTMENTS.put("projectileprotection", Enchantment.PROTECTION_PROJECTILE);
ENCHANTMENTS.put("projprot", Enchantment.PROTECTION_PROJECTILE);
ENCHANTMENTS.put("silktouch", Enchantment.SILK_TOUCH);
ENCHANTMENTS.put("softtouch", Enchantment.SILK_TOUCH);
ENCHANTMENTS.put("waterworker", Enchantment.WATER_WORKER);
ENCHANTMENTS.put("aquaaffinity", Enchantment.WATER_WORKER);
ENCHANTMENTS.put("firearrow", Enchantment.ARROW_FIRE);
ENCHANTMENTS.put("flame", Enchantment.ARROW_FIRE);
ENCHANTMENTS.put("flamearrow", Enchantment.ARROW_FIRE);
ENCHANTMENTS.put("arrowdamage", Enchantment.ARROW_DAMAGE);
ENCHANTMENTS.put("power", Enchantment.ARROW_DAMAGE);
ENCHANTMENTS.put("arrowpower", Enchantment.ARROW_DAMAGE);
ENCHANTMENTS.put("arrowknockback", Enchantment.ARROW_KNOCKBACK);
ENCHANTMENTS.put("arrowkb", Enchantment.ARROW_KNOCKBACK);
ENCHANTMENTS.put("punch", Enchantment.ARROW_KNOCKBACK);
ENCHANTMENTS.put("arrowpunch", Enchantment.ARROW_KNOCKBACK);
ENCHANTMENTS.put("infinitearrows", Enchantment.ARROW_INFINITE);
ENCHANTMENTS.put("infarrows", Enchantment.ARROW_INFINITE);
ENCHANTMENTS.put("infinity", Enchantment.ARROW_INFINITE);
ENCHANTMENTS.put("infinite", Enchantment.ARROW_INFINITE);
ENCHANTMENTS.put("unlimited", Enchantment.ARROW_INFINITE);
ENCHANTMENTS.put("unlimitedarrows", Enchantment.ARROW_INFINITE);
}
public static Enchantment getByName(String name) {
Enchantment enchantment;
if (NUMPATTERN.matcher(name).matches()) {
enchantment = Enchantment.getById(Integer.parseInt(name));
} else {
enchantment = Enchantment.getByName(name.toUpperCase(Locale.ENGLISH));
}
if (enchantment == null)
{
enchantment = ENCHANTMENTS.get(name.toLowerCase(Locale.ENGLISH));
}
return enchantment;
}
static {
ENCHANTMENTS.put("alldamage", Enchantment.DAMAGE_ALL);
ALIASENCHANTMENTS.put("alldmg", Enchantment.DAMAGE_ALL);
ENCHANTMENTS.put("sharpness", Enchantment.DAMAGE_ALL);
ALIASENCHANTMENTS.put("sharp", Enchantment.DAMAGE_ALL);
ALIASENCHANTMENTS.put("dal", Enchantment.DAMAGE_ALL);
public static Set<Entry<String, Enchantment>> entrySet()
{
return ENCHANTMENTS.entrySet();
}
ENCHANTMENTS.put("ardmg", Enchantment.DAMAGE_ARTHROPODS);
ENCHANTMENTS.put("baneofarthropods", Enchantment.DAMAGE_ARTHROPODS);
ALIASENCHANTMENTS.put("baneofarthropod", Enchantment.DAMAGE_ARTHROPODS);
ALIASENCHANTMENTS.put("arthropod", Enchantment.DAMAGE_ARTHROPODS);
ALIASENCHANTMENTS.put("dar", Enchantment.DAMAGE_ARTHROPODS);
ENCHANTMENTS.put("undeaddamage", Enchantment.DAMAGE_UNDEAD);
ENCHANTMENTS.put("smite", Enchantment.DAMAGE_UNDEAD);
ALIASENCHANTMENTS.put("du", Enchantment.DAMAGE_UNDEAD);
ENCHANTMENTS.put("digspeed", Enchantment.DIG_SPEED);
ENCHANTMENTS.put("efficiency", Enchantment.DIG_SPEED);
ALIASENCHANTMENTS.put("minespeed", Enchantment.DIG_SPEED);
ALIASENCHANTMENTS.put("cutspeed", Enchantment.DIG_SPEED);
ALIASENCHANTMENTS.put("ds", Enchantment.DIG_SPEED);
ALIASENCHANTMENTS.put("eff", Enchantment.DIG_SPEED);
ENCHANTMENTS.put("durability", Enchantment.DURABILITY);
ALIASENCHANTMENTS.put("dura", Enchantment.DURABILITY);
ENCHANTMENTS.put("unbreaking", Enchantment.DURABILITY);
ALIASENCHANTMENTS.put("d", Enchantment.DURABILITY);
ENCHANTMENTS.put("thorns", Enchantment.THORNS);
ENCHANTMENTS.put("highcrit", Enchantment.THORNS);
ALIASENCHANTMENTS.put("thorn", Enchantment.THORNS);
ALIASENCHANTMENTS.put("highercrit", Enchantment.THORNS);
ALIASENCHANTMENTS.put("t", Enchantment.THORNS);
ENCHANTMENTS.put("fireaspect", Enchantment.FIRE_ASPECT);
ENCHANTMENTS.put("fire", Enchantment.FIRE_ASPECT);
ALIASENCHANTMENTS.put("meleefire", Enchantment.FIRE_ASPECT);
ALIASENCHANTMENTS.put("meleeflame", Enchantment.FIRE_ASPECT);
ALIASENCHANTMENTS.put("fa", Enchantment.FIRE_ASPECT);
ENCHANTMENTS.put("knockback", Enchantment.KNOCKBACK);
ALIASENCHANTMENTS.put("kback", Enchantment.KNOCKBACK);
ALIASENCHANTMENTS.put("kb", Enchantment.KNOCKBACK);
ALIASENCHANTMENTS.put("k", Enchantment.KNOCKBACK);
ALIASENCHANTMENTS.put("blockslootbonus", Enchantment.LOOT_BONUS_BLOCKS);
ENCHANTMENTS.put("fortune", Enchantment.LOOT_BONUS_BLOCKS);
ALIASENCHANTMENTS.put("fort", Enchantment.LOOT_BONUS_BLOCKS);
ALIASENCHANTMENTS.put("lbb", Enchantment.LOOT_BONUS_BLOCKS);
ALIASENCHANTMENTS.put("mobslootbonus", Enchantment.LOOT_BONUS_MOBS);
ENCHANTMENTS.put("mobloot", Enchantment.LOOT_BONUS_MOBS);
ENCHANTMENTS.put("looting", Enchantment.LOOT_BONUS_MOBS);
ALIASENCHANTMENTS.put("lbm", Enchantment.LOOT_BONUS_MOBS);
ALIASENCHANTMENTS.put("oxygen", Enchantment.OXYGEN);
ENCHANTMENTS.put("respiration", Enchantment.OXYGEN);
ALIASENCHANTMENTS.put("breathing", Enchantment.OXYGEN);
ENCHANTMENTS.put("breath", Enchantment.OXYGEN);
ALIASENCHANTMENTS.put("o", Enchantment.OXYGEN);
ENCHANTMENTS.put("protection", Enchantment.PROTECTION_ENVIRONMENTAL);
ALIASENCHANTMENTS.put("prot", Enchantment.PROTECTION_ENVIRONMENTAL);
ENCHANTMENTS.put("protect", Enchantment.PROTECTION_ENVIRONMENTAL);
ALIASENCHANTMENTS.put("p", Enchantment.PROTECTION_ENVIRONMENTAL);
ALIASENCHANTMENTS.put("explosionsprotection", Enchantment.PROTECTION_EXPLOSIONS);
ALIASENCHANTMENTS.put("explosionprotection", Enchantment.PROTECTION_EXPLOSIONS);
ALIASENCHANTMENTS.put("expprot", Enchantment.PROTECTION_EXPLOSIONS);
ALIASENCHANTMENTS.put("blastprotection", Enchantment.PROTECTION_EXPLOSIONS);
ALIASENCHANTMENTS.put("bprotection", Enchantment.PROTECTION_EXPLOSIONS);
ALIASENCHANTMENTS.put("bprotect", Enchantment.PROTECTION_EXPLOSIONS);
ENCHANTMENTS.put("blastprotect", Enchantment.PROTECTION_EXPLOSIONS);
ALIASENCHANTMENTS.put("pe", Enchantment.PROTECTION_EXPLOSIONS);
ALIASENCHANTMENTS.put("fallprotection", Enchantment.PROTECTION_FALL);
ENCHANTMENTS.put("fallprot", Enchantment.PROTECTION_FALL);
ENCHANTMENTS.put("featherfall", Enchantment.PROTECTION_FALL);
ALIASENCHANTMENTS.put("featherfalling", Enchantment.PROTECTION_FALL);
ALIASENCHANTMENTS.put("pfa", Enchantment.PROTECTION_FALL);
ALIASENCHANTMENTS.put("fireprotection", Enchantment.PROTECTION_FIRE);
ALIASENCHANTMENTS.put("flameprotection", Enchantment.PROTECTION_FIRE);
ENCHANTMENTS.put("fireprotect", Enchantment.PROTECTION_FIRE);
ALIASENCHANTMENTS.put("flameprotect", Enchantment.PROTECTION_FIRE);
ENCHANTMENTS.put("fireprot", Enchantment.PROTECTION_FIRE);
ALIASENCHANTMENTS.put("flameprot", Enchantment.PROTECTION_FIRE);
ALIASENCHANTMENTS.put("pf", Enchantment.PROTECTION_FIRE);
ENCHANTMENTS.put("projectileprotection", Enchantment.PROTECTION_PROJECTILE);
ENCHANTMENTS.put("projprot", Enchantment.PROTECTION_PROJECTILE);
ALIASENCHANTMENTS.put("pp", Enchantment.PROTECTION_PROJECTILE);
ENCHANTMENTS.put("silktouch", Enchantment.SILK_TOUCH);
ALIASENCHANTMENTS.put("softtouch", Enchantment.SILK_TOUCH);
ALIASENCHANTMENTS.put("st", Enchantment.SILK_TOUCH);
ENCHANTMENTS.put("waterworker", Enchantment.WATER_WORKER);
ENCHANTMENTS.put("aquaaffinity", Enchantment.WATER_WORKER);
ALIASENCHANTMENTS.put("watermine", Enchantment.WATER_WORKER);
ALIASENCHANTMENTS.put("ww", Enchantment.WATER_WORKER);
ALIASENCHANTMENTS.put("firearrow", Enchantment.ARROW_FIRE);
ENCHANTMENTS.put("flame", Enchantment.ARROW_FIRE);
ENCHANTMENTS.put("flamearrow", Enchantment.ARROW_FIRE);
ALIASENCHANTMENTS.put("af", Enchantment.ARROW_FIRE);
ENCHANTMENTS.put("arrowdamage", Enchantment.ARROW_DAMAGE);
ENCHANTMENTS.put("power", Enchantment.ARROW_DAMAGE);
ALIASENCHANTMENTS.put("arrowpower", Enchantment.ARROW_DAMAGE);
ALIASENCHANTMENTS.put("ad", Enchantment.ARROW_DAMAGE);
ENCHANTMENTS.put("arrowknockback", Enchantment.ARROW_KNOCKBACK);
ALIASENCHANTMENTS.put("arrowkb", Enchantment.ARROW_KNOCKBACK);
ENCHANTMENTS.put("punch", Enchantment.ARROW_KNOCKBACK);
ALIASENCHANTMENTS.put("arrowpunch", Enchantment.ARROW_KNOCKBACK);
ALIASENCHANTMENTS.put("ak", Enchantment.ARROW_KNOCKBACK);
ALIASENCHANTMENTS.put("infinitearrows", Enchantment.ARROW_INFINITE);
ENCHANTMENTS.put("infarrows", Enchantment.ARROW_INFINITE);
ENCHANTMENTS.put("infinity", Enchantment.ARROW_INFINITE);
ALIASENCHANTMENTS.put("infinite", Enchantment.ARROW_INFINITE);
ALIASENCHANTMENTS.put("unlimited", Enchantment.ARROW_INFINITE);
ALIASENCHANTMENTS.put("unlimitedarrows", Enchantment.ARROW_INFINITE);
ALIASENCHANTMENTS.put("ai", Enchantment.ARROW_INFINITE);
ENCHANTMENTS.put("luck", Enchantment.LUCK);
ALIASENCHANTMENTS.put("luckofsea", Enchantment.LUCK);
ALIASENCHANTMENTS.put("luckofseas", Enchantment.LUCK);
ALIASENCHANTMENTS.put("rodluck", Enchantment.LUCK);
ENCHANTMENTS.put("lure", Enchantment.LURE);
ALIASENCHANTMENTS.put("rodlure", Enchantment.LURE);
// 1.8
try {
Enchantment depthStrider = Enchantment.getByName("DEPTH_STRIDER");
if (depthStrider != null) {
ENCHANTMENTS.put("depthstrider", depthStrider);
ALIASENCHANTMENTS.put("depth", depthStrider);
ALIASENCHANTMENTS.put("strider", depthStrider);
}
} catch (IllegalArgumentException ignored) {}
// 1.9
try {
Enchantment frostWalker = Enchantment.getByName("FROST_WALKER");
if (frostWalker != null) {
ENCHANTMENTS.put("frostwalker", frostWalker);
ALIASENCHANTMENTS.put("frost", frostWalker);
ALIASENCHANTMENTS.put("walker", frostWalker);
}
Enchantment mending = Enchantment.getByName("MENDING");
if (mending != null) {
ENCHANTMENTS.put("mending", mending);
}
} catch (IllegalArgumentException ignored) {}
// 1.11
try {
Enchantment bindingCurse = Enchantment.getByName("BINDING_CURSE");
if (bindingCurse != null) {
ENCHANTMENTS.put("bindingcurse", bindingCurse);
ALIASENCHANTMENTS.put("bindcurse", bindingCurse);
ALIASENCHANTMENTS.put("binding", bindingCurse);
ALIASENCHANTMENTS.put("bind", bindingCurse);
}
Enchantment vanishingCurse = Enchantment.getByName("VANISHING_CURSE");
if (vanishingCurse != null) {
ENCHANTMENTS.put("vanishingcurse", vanishingCurse);
ALIASENCHANTMENTS.put("vanishcurse", vanishingCurse);
ALIASENCHANTMENTS.put("vanishing", vanishingCurse);
ALIASENCHANTMENTS.put("vanish", vanishingCurse);
}
Enchantment sweeping = Enchantment.getByName("SWEEPING_EDGE");
if (sweeping != null) {
ENCHANTMENTS.put("sweepingedge", sweeping);
ALIASENCHANTMENTS.put("sweepedge", sweeping);
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) {}
}
public static Enchantment getByName(String name) {
Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(name.toLowerCase()));
if (enchantment == null) {
enchantment = Enchantment.getByName(name.toUpperCase());
}
if (enchantment == null) {
enchantment = ENCHANTMENTS.get(name.toLowerCase(Locale.ENGLISH));
}
if (enchantment == null) {
enchantment = ALIASENCHANTMENTS.get(name.toLowerCase(Locale.ENGLISH));
}
return enchantment;
}
public static Set<Entry<String, Enchantment>> entrySet() {
return ENCHANTMENTS.entrySet();
}
public static Set<String> keySet() {
return ENCHANTMENTS.keySet();
}
}
File diff suppressed because it is too large. Load diff
@@ -1,46 +1,64 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.LocationUtil;
import com.earth2me.essentials.utils.MaterialUtil;
import net.ess3.api.IEssentials;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.ItemStack;
import java.util.Locale;
public class EssentialsBlockListener implements Listener
{
private final transient IEssentials ess;
public EssentialsBlockListener(final IEssentials ess)
{
this.ess = ess;
}
public class EssentialsBlockListener implements Listener {
private final transient IEssentials ess;
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBlockPlace(final BlockPlaceEvent event)
{
// Do not rely on getItemInHand();
// http://leaky.bukkit.org/issues/663
final ItemStack is = Util.convertBlockToItem(event.getBlockPlaced());
if (is == null)
{
return;
}
final User user = ess.getUser(event.getPlayer());
final boolean unlimitedForUser = user.hasUnlimited(is);
if (unlimitedForUser && user.getGameMode() == GameMode.SURVIVAL)
{
ess.scheduleSyncDelayedTask(
new Runnable()
{
@Override
public void run()
{
user.getInventory().addItem(is);
user.updateInventory();
}
});
}
}
public EssentialsBlockListener(final IEssentials ess) {
this.ess = ess;
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBlockPlace(final BlockPlaceEvent event) {
// Do not rely on getItemInHand();
// http://leaky.bukkit.org/issues/663
final ItemStack is = LocationUtil.convertBlockToItem(event.getBlockPlaced());
if (is == null) {
return;
}
if (is.getType() == MaterialUtil.SPAWNER && event.getItemInHand() != null && event.getPlayer() != null && event.getItemInHand().getType() == MaterialUtil.SPAWNER) {
final BlockState blockState = event.getBlockPlaced().getState();
if (blockState instanceof CreatureSpawner) {
final CreatureSpawner spawner = (CreatureSpawner) blockState;
final EntityType type = ess.getSpawnerProvider().getEntityType(event.getItemInHand());
if (type != null && Mob.fromBukkitType(type) != null) {
if (ess.getUser(event.getPlayer()).isAuthorized("essentials.spawnerconvert." + Mob.fromBukkitType(type).name().toLowerCase(Locale.ENGLISH))) {
spawner.setSpawnedType(type);
spawner.update();
}
}
}
}
final User user = ess.getUser(event.getPlayer());
if (user.hasUnlimited(is) && user.getBase().getGameMode() == GameMode.SURVIVAL) {
class UnlimitedItemSpawnTask implements Runnable {
@Override
public void run() {
user.getBase().getInventory().addItem(is);
user.getBase().updateInventory();
}
}
ess.scheduleSyncDelayedTask(new UnlimitedItemSpawnTask());
}
}
}
File diff suppressed because it is too large. Load diff
@@ -1,11 +1,8 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import java.util.List;
import net.ess3.api.IEssentials;
import org.bukkit.Material;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -13,128 +10,202 @@ import org.bukkit.event.entity.*;
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
import org.bukkit.inventory.ItemStack;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
public class EssentialsEntityListener implements Listener
{
private final IEssentials ess;
import static com.earth2me.essentials.I18n.tl;
public EssentialsEntityListener(IEssentials ess)
{
this.ess = ess;
}
@EventHandler(priority = EventPriority.LOW)
public void onEntityDamage(final EntityDamageByEntityEvent event)
{
final Entity eAttack = event.getDamager();
final Entity eDefend = event.getEntity();
if (eDefend instanceof Player && eAttack instanceof Player)
{
final User defender = ess.getUser(eDefend);
final User attacker = ess.getUser(eAttack);
public class EssentialsEntityListener implements Listener {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private static final transient Pattern powertoolPlayer = Pattern.compile("\\{player\\}");
private final IEssentials ess;
if (ess.getSettings().getLoginAttackDelay() > 0 && !attacker.isAuthorized("essentials.pvpdelay.exempt")
&& (System.currentTimeMillis() < (attacker.getLastLogin() + ess.getSettings().getLoginAttackDelay())))
{
event.setCancelled(true);
}
public EssentialsEntityListener(IEssentials ess) {
this.ess = ess;
}
if (attacker.hasInvulnerabilityAfterTeleport() || defender.hasInvulnerabilityAfterTeleport())
{
event.setCancelled(true);
}
// This method does something undocumented reguarding certain bucket types #EasterEgg
@EventHandler(priority = EventPriority.LOW)
public void onEntityDamage(final EntityDamageByEntityEvent event) {
final Entity eAttack = event.getDamager();
final Entity eDefend = event.getEntity();
if (eAttack instanceof Player) {
final User attacker = ess.getUser((Player) eAttack);
if (eDefend instanceof Player) {
onPlayerVsPlayerDamage(event, (Player) eDefend, attacker);
} else if (eDefend instanceof Ageable) {
final ItemStack hand = attacker.getBase().getItemInHand();
if (ess.getSettings().isMilkBucketEasterEggEnabled()
&& hand != null && hand.getType() == Material.MILK_BUCKET) {
((Ageable) eDefend).setBaby();
hand.setType(Material.BUCKET);
attacker.getBase().setItemInHand(hand);
attacker.getBase().updateInventory();
event.setCancelled(true);
}
}
attacker.updateActivityOnInteract(true);
} else if (eAttack instanceof Projectile && eDefend instanceof Player) {
final Projectile projectile = (Projectile) event.getDamager();
//This should return a ProjectileSource on 1.7.3 beta +
final Object shooter = projectile.getShooter();
if (shooter instanceof Player) {
final User attacker = ess.getUser((Player) shooter);
onPlayerVsPlayerDamage(event, (Player) eDefend, attacker);
attacker.updateActivityOnInteract(true);
}
}
}
attacker.updateActivity(true);
final List<String> commandList = attacker.getPowertool(attacker.getItemInHand());
if (commandList != null && !commandList.isEmpty())
{
for (final String command : commandList)
{
if (command != null && !command.isEmpty())
{
ess.scheduleSyncDelayedTask(
new Runnable()
{
@Override
public void run()
{
attacker.getServer().dispatchCommand(attacker.getBase(), command.replaceAll("\\{player\\}", defender.getName()));
}
});
private void onPlayerVsPlayerDamage(final EntityDamageByEntityEvent event, final Player defender, final User attacker) {
if (ess.getSettings().getLoginAttackDelay() > 0 && (System.currentTimeMillis() < (attacker.getLastLogin() + ess.getSettings().getLoginAttackDelay())) && !attacker.isAuthorized("essentials.pvpdelay.exempt")) {
event.setCancelled(true);
}
event.setCancelled(true);
return;
}
}
}
}
else if (eDefend instanceof Ageable && eAttack instanceof Player)
{
final Player player = (Player)eAttack;
final ItemStack hand = player.getItemInHand();
if (hand != null && hand.getType() == Material.MILK_BUCKET)
{
((Ageable)eDefend).setBaby();
hand.setType(Material.BUCKET);
player.setItemInHand(hand);
player.updateInventory();
event.setCancelled(true);
}
}
}
if (!defender.equals(attacker.getBase()) && (attacker.hasInvulnerabilityAfterTeleport() || ess.getUser(defender).hasInvulnerabilityAfterTeleport())) {
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityDamage(final EntityDamageEvent event)
{
if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled())
{
final Player player = (Player)event.getEntity();
player.setFireTicks(0);
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
}
}
if (attacker.isGodModeEnabled() && !attacker.isAuthorized("essentials.god.pvp")) {
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityCombust(final EntityCombustEvent event)
{
if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled())
{
event.setCancelled(true);
}
}
if (attacker.isHidden() && !attacker.isAuthorized("essentials.vanish.pvp")) {
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerDeathEvent(final PlayerDeathEvent event)
{
final User user = ess.getUser(event.getEntity());
if (user.isAuthorized("essentials.back.ondeath") && !ess.getSettings().isCommandDisabled("back"))
{
user.setLastLocation();
user.sendMessage(_("backAfterDeath"));
}
if (!ess.getSettings().areDeathMessagesEnabled())
{
event.setDeathMessage("");
}
}
if (attacker.arePowerToolsEnabled()) {
onPlayerVsPlayerPowertool(event, defender, attacker);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onFoodLevelChange(final FoodLevelChangeEvent event)
{
if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled())
{
event.setCancelled(true);
}
}
private void onPlayerVsPlayerPowertool(final EntityDamageByEntityEvent event, final Player defender, final User attacker) {
final List<String> commandList = attacker.getPowertool(attacker.getBase().getItemInHand());
if (commandList != null && !commandList.isEmpty()) {
for (final String tempCommand : commandList) {
final String command = powertoolPlayer.matcher(tempCommand).replaceAll(defender.getName());
if (command != null && !command.isEmpty() && !command.equals(tempCommand)) {
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityRegainHealth(final EntityRegainHealthEvent event)
{
if (event.getRegainReason() == RegainReason.SATIATED && event.getEntity() instanceof Player
&& ess.getUser(event.getEntity()).isAfk() && ess.getSettings().getFreezeAfkPlayers())
{
event.setCancelled(true);
}
}
class PowerToolInteractTask implements Runnable {
@Override
public void run() {
attacker.getServer().dispatchCommand(attacker.getBase(), command);
LOGGER.log(Level.INFO, String.format("[PT] %s issued server command: /%s", attacker.getName(), command));
}
}
ess.scheduleSyncDelayedTask(new PowerToolInteractTask());
event.setCancelled(true);
return;
}
}
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityDamage(final EntityDamageEvent event) {
if (event.getEntity() instanceof Player && ess.getUser((Player) event.getEntity()).isGodModeEnabled()) {
final Player player = (Player) event.getEntity();
player.setFireTicks(0);
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityCombust(final EntityCombustEvent event) {
if (event.getEntity() instanceof Player && ess.getUser((Player) event.getEntity()).isGodModeEnabled()) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onEntityCombustByEntity(final EntityCombustByEntityEvent event) {
if (event.getCombuster() instanceof Arrow && event.getEntity() instanceof Player) {
Arrow combuster = (Arrow) event.getCombuster();
if (combuster.getShooter() instanceof Player) {
final User srcCombuster = ess.getUser(((Player) combuster.getShooter()).getUniqueId());
if (srcCombuster.isGodModeEnabled() && !srcCombuster.isAuthorized("essentials.god.pvp")) {
event.setCancelled(true);
}
if (srcCombuster.isHidden() && !srcCombuster.isAuthorized("essentials.vanish.pvp")) {
event.setCancelled(true);
}
}
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerDeathEvent(final PlayerDeathEvent event) {
final User user = ess.getUser(event.getEntity());
if (user.isAuthorized("essentials.back.ondeath") && !ess.getSettings().isCommandDisabled("back")) {
user.setLastLocation();
user.sendMessage(tl("backAfterDeath"));
}
if (!ess.getSettings().areDeathMessagesEnabled()) {
event.setDeathMessage("");
}
}
@EventHandler(priority = EventPriority.LOW)
public void onPlayerDeathExpEvent(final PlayerDeathEvent event) {
final User user = ess.getUser(event.getEntity());
if (user.isAuthorized("essentials.keepxp")) {
event.setKeepLevel(true);
event.setDroppedExp(0);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onFoodLevelChange(final FoodLevelChangeEvent event) {
if (event.getEntity() instanceof Player) {
final User user = ess.getUser((Player) event.getEntity());
if (user.isGodModeEnabled()) {
if (user.isGodModeEnabledRaw()) {
user.getBase().setFoodLevel(20);
user.getBase().setSaturation(10);
}
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityRegainHealth(final EntityRegainHealthEvent event) {
if (event.getRegainReason() == RegainReason.SATIATED && event.getEntity() instanceof Player && ess.getUser((Player) event.getEntity()).isAfk() && ess.getSettings().getFreezeAfkPlayers()) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPotionSplashEvent(final PotionSplashEvent event) {
for (LivingEntity entity : event.getAffectedEntities()) {
if (entity instanceof Player && ess.getUser((Player) entity).isGodModeEnabled()) {
event.setIntensity(entity, 0d);
}
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityShootBow(EntityShootBowEvent event) {
if (event.getEntity() instanceof Player) {
final User user = ess.getUser((Player) event.getEntity());
if (user.isAfk()) {
user.updateActivityOnInteract(true);
}
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityTarget(EntityTargetEvent event) {
if (event.getTarget() instanceof Player) {
final User user = ess.getUser((Player) event.getTarget());
if (user.isVanished()) {
event.setCancelled(true);
}
}
}
}
File diff suppressed because it is too large. Load diff
@@ -1,50 +1,50 @@
package com.earth2me.essentials;
import java.util.logging.Level;
import com.earth2me.essentials.register.payment.Methods;
import net.ess3.api.IEssentials;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.event.server.PluginEnableEvent;
import java.util.logging.Level;
public class EssentialsPluginListener implements Listener, IConf
{
private final transient IEssentials ess;
public EssentialsPluginListener(final IEssentials ess)
{
this.ess = ess;
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPluginEnable(final PluginEnableEvent event)
{
ess.getPermissionsHandler().checkPermissions();
ess.getAlternativeCommandsHandler().addPlugin(event.getPlugin());
if (!ess.getPaymentMethod().hasMethod() && ess.getPaymentMethod().setMethod(ess.getServer().getPluginManager()))
{
ess.getLogger().log(Level.INFO, "Payment method found (" + ess.getPaymentMethod().getMethod().getLongName() + " version: " + ess.getPaymentMethod().getMethod().getVersion() + ")");
}
}
public class EssentialsPluginListener implements Listener, IConf {
private final transient IEssentials ess;
@EventHandler(priority = EventPriority.MONITOR)
public void onPluginDisable(final PluginDisableEvent event)
{
ess.getPermissionsHandler().checkPermissions();
ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin());
// Check to see if the plugin thats being disabled is the one we are using
if (ess.getPaymentMethod() != null && ess.getPaymentMethod().hasMethod() && ess.getPaymentMethod().checkDisabled(event.getPlugin()))
{
ess.getPaymentMethod().reset();
ess.getLogger().log(Level.INFO, "Payment method was disabled. No longer accepting payments.");
}
}
public EssentialsPluginListener(final IEssentials ess) {
this.ess = ess;
}
@Override
public void reloadConfig()
{
ess.getPermissionsHandler().setUseSuperperms(ess.getSettings().useBukkitPermissions());
ess.getPermissionsHandler().checkPermissions();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPluginEnable(final PluginEnableEvent event) {
if (event.getPlugin().getName().equals("EssentialsChat")) {
ess.getSettings().setEssentialsChatActive(true);
}
ess.getPermissionsHandler().setUseSuperperms(ess.getSettings().useBukkitPermissions());
ess.getPermissionsHandler().checkPermissions();
ess.getAlternativeCommandsHandler().addPlugin(event.getPlugin());
if (!Methods.hasMethod() && Methods.setMethod(ess.getServer().getPluginManager())) {
ess.getLogger().log(Level.INFO, "Payment method found (" + Methods.getMethod().getLongName() + " version: " + ess.getPaymentMethod().getMethod().getVersion() + ")");
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPluginDisable(final PluginDisableEvent event) {
if (event.getPlugin().getName().equals("EssentialsChat")) {
ess.getSettings().setEssentialsChatActive(false);
}
ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin());
// Check to see if the plugin thats being disabled is the one we are using
if (ess.getPaymentMethod() != null && Methods.hasMethod() && Methods.checkDisabled(event.getPlugin())) {
Methods.reset();
ess.getLogger().log(Level.INFO, "Payment method was disabled. No longer accepting payments.");
}
}
@Override
public void reloadConfig() {
}
}
@@ -0,0 +1,90 @@
package com.earth2me.essentials;
import net.ess3.api.IEssentials;
import net.ess3.nms.refl.ReflUtil;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.server.ServerListPingEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
public class EssentialsServerListener implements Listener {
private final transient IEssentials ess;
private boolean unsupportedLogged = false;
private boolean npeWarned = false;
private boolean isPaperSample;
private Method setSampleText;
private Method getSampleText;
public EssentialsServerListener(final IEssentials ess) {
this.ess = ess;
if (ReflUtil.getClassCached("com.destroystokyo.paper.event.server.PaperServerListPingEvent") == null) {
// This workaround is only necessary for older Paper builds
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");
isPaperSample = true;
return;
}
}
ess.getLogger().info("Using Spigot 1.7.10+ ServerListPingEvent iterator");
isPaperSample = false;
}
@EventHandler(priority = EventPriority.LOWEST)
public void onServerListPing(final ServerListPingEvent event) throws Exception {
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();
}
}
setSampleText.invoke(event, playerNames);
} catch (IllegalAccessException | InvocationTargetException | ClassCastException e) {
if (!unsupportedLogged) {
ess.getLogger().log(Level.WARNING, "Unable to hide players from server list ping "
+ "using Paper 1.12+ method!", e);
unsupportedLogged = true;
}
} catch (NullPointerException e) {
if (!npeWarned) {
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.");
ex.setStackTrace(e.getStackTrace());
throw ex;
}
}
} else {
try {
Iterator<Player> iterator = event.iterator();
while (iterator.hasNext()) {
Player player = iterator.next();
if (ess.getUser(player).isVanished()) {
iterator.remove();
}
}
} 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.");
unsupportedLogged = true;
}
}
}
}
}
@@ -1,85 +1,106 @@
package com.earth2me.essentials;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;
import java.util.logging.Level;
import net.ess3.api.IEssentials;
import org.bukkit.entity.Player;
import java.util.*;
import java.util.logging.Level;
public class EssentialsTimer implements Runnable
{
private final transient IEssentials ess;
private final transient Set<User> onlineUsers = new HashSet<User>();
private transient long lastPoll = System.currentTimeMillis();
private final transient LinkedList<Float> history = new LinkedList<Float>();
EssentialsTimer(final IEssentials ess)
{
this.ess = ess;
}
public class EssentialsTimer implements Runnable {
private final transient IEssentials ess;
private final transient Set<UUID> onlineUsers = new HashSet<>(); // Field is necessary for hidden users
private transient long lastPoll = System.nanoTime();
private final LinkedList<Double> history = new LinkedList<>();
private int skip1 = 0;
private int skip2 = 0;
private final long maxTime = 10 * 1000000;
private final long tickInterval = 50;
@Override
public void run()
{
final long currentTime = System.currentTimeMillis();
long timeSpent = (currentTime - lastPoll) / 1000;
if (timeSpent == 0)
{
timeSpent = 1;
}
if (history.size() > 10)
{
history.remove();
}
float tps = 100f / timeSpent;
if (tps <= 20)
{
history.add(tps);
}
lastPoll = currentTime;
for (Player player : ess.getServer().getOnlinePlayers())
{
try
{
final User user = ess.getUser(player);
onlineUsers.add(user);
user.setLastOnlineActivity(currentTime);
user.checkActivity();
}
catch (Exception e)
{
ess.getLogger().log(Level.WARNING, "EssentialsTimer Error:", e);
}
}
EssentialsTimer(final IEssentials ess) {
this.ess = ess;
history.add(20d);
}
final Iterator<User> iterator = onlineUsers.iterator();
while (iterator.hasNext())
{
final User user = iterator.next();
if (user.getLastOnlineActivity() < currentTime && user.getLastOnlineActivity() > user.getLastLogout())
{
user.setLastLogout(user.getLastOnlineActivity());
iterator.remove();
continue;
}
user.checkMuteTimeout(currentTime);
user.checkJailTimeout(currentTime);
user.resetInvulnerabilityAfterTeleport();
}
}
@Override
public void run() {
final long startTime = System.nanoTime();
final long currentTime = System.currentTimeMillis();
long timeSpent = (startTime - lastPoll) / 1000;
if (timeSpent == 0) {
timeSpent = 1;
}
if (history.size() > 10) {
history.remove();
}
double tps = tickInterval * 1000000.0 / timeSpent;
if (tps <= 21) {
history.add(tps);
}
lastPoll = startTime;
int count = 0;
for (Player player : ess.getOnlinePlayers()) {
count++;
if (skip1 > 0) {
skip1--;
continue;
}
if (count % 10 == 0) {
if (System.nanoTime() - startTime > maxTime / 2) {
skip1 = count - 1;
break;
}
}
try {
final User user = ess.getUser(player);
onlineUsers.add(user.getBase().getUniqueId());
user.setLastOnlineActivity(currentTime);
user.checkActivity();
} catch (Exception e) {
ess.getLogger().log(Level.WARNING, "EssentialsTimer Error:", e);
}
}
public float getAverageTPS()
{
float avg = 0;
for (Float f : history)
{
if (f != null)
{
avg += f;
}
}
return avg / history.size();
}
count = 0;
final Iterator<UUID> iterator = onlineUsers.iterator();
while (iterator.hasNext()) {
count++;
if (skip2 > 0) {
skip2--;
continue;
}
if (count % 10 == 0) {
if (System.nanoTime() - startTime > maxTime) {
skip2 = count - 1;
break;
}
}
final User user = ess.getUser(iterator.next());
// Not sure why this would happen, but it does
if (user == null) {
iterator.remove();
continue;
}
if (user.getLastOnlineActivity() < currentTime && user.getLastOnlineActivity() > user.getLastLogout()) {
if (!user.isHidden()) {
user.setLastLogout(user.getLastOnlineActivity());
}
iterator.remove();
continue;
}
user.checkMuteTimeout(currentTime);
user.checkJailTimeout(currentTime);
user.resetInvulnerabilityAfterTeleport();
}
}
public double getAverageTPS() {
double avg = 0;
for (Double f : history) {
if (f != null) {
avg += f;
}
}
return avg / history.size();
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,63 @@
package com.earth2me.essentials;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import org.bukkit.Bukkit;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import java.util.UUID;
import java.util.logging.Level;
public class EssentialsUserConf extends EssentialsConf {
public final String username;
public final UUID uuid;
public EssentialsUserConf(final String username, final UUID uuid, final File configFile) {
super(configFile);
this.username = username;
this.uuid = uuid;
}
@Override
public boolean legacyFileExists() {
final File file = new File(configFile.getParentFile(), username + ".yml");
return file.exists();
}
@Override
public void convertLegacyFile() {
final File file = new File(configFile.getParentFile(), username + ".yml");
try {
Files.move(file, new File(configFile.getParentFile(), uuid + ".yml"));
} catch (IOException ex) {
Bukkit.getLogger().log(Level.WARNING, "Failed to migrate user: " + username, ex);
}
setProperty("lastAccountName", username);
}
private File getAltFile() {
final UUID fn = UUID.nameUUIDFromBytes(("OfflinePlayer:" + username.toLowerCase(Locale.ENGLISH)).getBytes(Charsets.UTF_8));
return new File(configFile.getParentFile(), fn.toString() + ".yml");
}
@Override
public boolean altFileExists() {
if (username.equals(username.toLowerCase())) {
return false;
}
return getAltFile().exists();
}
@Override
public void convertAltFile() {
try {
Files.move(getAltFile(), new File(configFile.getParentFile(), uuid + ".yml"));
} catch (IOException ex) {
Bukkit.getLogger().log(Level.WARNING, "Failed to migrate user: " + username, ex);
}
}
}
@@ -7,83 +7,69 @@ import java.util.List;
import java.util.Locale;
public class ExecuteTimer
{
private final transient List<ExecuteRecord> times;
private final transient DecimalFormat decimalFormat = new DecimalFormat("#0.000", DecimalFormatSymbols.getInstance(Locale.US));
public class ExecuteTimer {
private final transient List<ExecuteRecord> times;
private final transient DecimalFormat decimalFormat = new DecimalFormat("#0.000", DecimalFormatSymbols.getInstance(Locale.US));
public ExecuteTimer()
{
times = new ArrayList<ExecuteRecord>();
}
public ExecuteTimer() {
times = new ArrayList<ExecuteRecord>();
}
public void start()
{
times.clear();
mark("start");
public void start() {
times.clear();
mark("start");
}
}
public void mark(final String label)
{
if (!times.isEmpty() || "start".equals(label))
{
times.add(new ExecuteRecord(label, System.nanoTime()));
}
}
public void mark(final String label) {
if (!times.isEmpty() || "start".equals(label)) {
times.add(new ExecuteRecord(label, System.nanoTime()));
}
}
public String end()
{
final StringBuilder output = new StringBuilder();
output.append("execution time: ");
String mark;
long time0 = 0;
long time1 = 0;
long time2 = 0;
double duration;
public String end() {
final StringBuilder output = new StringBuilder();
output.append("execution time: ");
String mark;
long time0 = 0;
long time1 = 0;
long time2 = 0;
double duration;
for (ExecuteRecord pair : times)
{
mark = (String)pair.getMark();
time2 = (Long)pair.getTime();
if (time1 > 0)
{
duration = (time2 - time1)/1000000.0;
output.append(mark).append(": ").append(decimalFormat.format(duration)).append("ms - ");
}
else
{
time0 = time2;
}
time1 = time2;
}
duration = (time1 - time0)/1000000.0;
output.append("Total: ").append(decimalFormat.format(duration)).append("ms");
times.clear();
return output.toString();
}
for (ExecuteRecord pair : times) {
mark = pair.getMark();
time2 = pair.getTime();
if (time1 > 0) {
duration = (time2 - time1) / 1000000.0;
output.append(mark).append(": ").append(decimalFormat.format(duration)).append("ms - ");
} else {
time0 = time2;
}
time1 = time2;
}
duration = (time1 - time0) / 1000000.0;
output.append("Total: ").append(decimalFormat.format(duration)).append("ms");
times.clear();
return output.toString();
}
static private class ExecuteRecord
{
private final String mark;
private final long time;
private static class ExecuteRecord {
private final String mark;
private final long time;
public ExecuteRecord(final String mark, final long time)
{
this.mark = mark;
this.time = time;
}
public ExecuteRecord(final String mark, final long time) {
this.mark = mark;
this.time = time;
}
public String getMark()
{
return mark;
}
public String getMark() {
return mark;
}
public long getTime()
{
return time;
}
}
public long getTime() {
return time;
}
}
}
+137 -147
View File
@@ -1,6 +1,7 @@
package com.earth2me.essentials;
import com.earth2me.essentials.api.II18n;
import net.ess3.api.IEssentials;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -11,166 +12,155 @@ import java.text.MessageFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
public class I18n implements II18n
{
private static I18n instance;
private static final String MESSAGES = "messages";
private final transient Locale defaultLocale = Locale.getDefault();
private transient Locale currentLocale = defaultLocale;
private transient ResourceBundle customBundle;
private transient ResourceBundle localeBundle;
private final transient ResourceBundle defaultBundle;
private final transient Map<String, MessageFormat> messageFormatCache = new HashMap<String, MessageFormat>();
private final transient IEssentials ess;
public class I18n implements net.ess3.api.II18n {
private static I18n instance;
private static final String MESSAGES = "messages";
private final transient Locale defaultLocale = Locale.getDefault();
private transient Locale currentLocale = defaultLocale;
private transient ResourceBundle customBundle;
private transient ResourceBundle localeBundle;
private final transient ResourceBundle defaultBundle;
private transient Map<String, MessageFormat> messageFormatCache = new HashMap<String, MessageFormat>();
private final transient IEssentials ess;
private static final Pattern NODOUBLEMARK = Pattern.compile("''");
private static final ResourceBundle NULL_BUNDLE = new ResourceBundle() {
public Enumeration<String> getKeys() {
return null;
}
public I18n(final IEssentials ess)
{
this.ess = ess;
customBundle = ResourceBundle.getBundle(MESSAGES, defaultLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess));
localeBundle = ResourceBundle.getBundle(MESSAGES, defaultLocale);
defaultBundle = ResourceBundle.getBundle(MESSAGES, Locale.ENGLISH);
}
protected Object handleGetObject(String key) {
return null;
}
};
public void onEnable()
{
instance = this;
}
public I18n(final IEssentials ess) {
this.ess = ess;
defaultBundle = ResourceBundle.getBundle(MESSAGES, Locale.ENGLISH);
localeBundle = defaultBundle;
customBundle = NULL_BUNDLE;
}
public void onDisable()
{
instance = null;
}
public void onEnable() {
instance = this;
}
public Locale getCurrentLocale()
{
return currentLocale;
}
public void onDisable() {
instance = null;
}
public String translate(final String string)
{
try
{
try
{
return customBundle.getString(string);
}
catch (MissingResourceException ex)
{
return localeBundle.getString(string);
}
}
catch (MissingResourceException ex)
{
Logger.getLogger("Minecraft").log(Level.WARNING, String.format("Missing translation key \"%s\" in translation file %s", ex.getKey(), localeBundle.getLocale().toString()), ex);
return defaultBundle.getString(string);
}
}
@Override
public Locale getCurrentLocale() {
return currentLocale;
}
public static String _(final String string, final Object... objects)
{
if (instance == null) {
return "";
}
if (objects.length == 0)
{
return instance.translate(string);
}
else
{
return instance.format(string, objects);
}
}
private String translate(final String string) {
try {
try {
return customBundle.getString(string);
} catch (MissingResourceException ex) {
return localeBundle.getString(string);
}
} catch (MissingResourceException ex) {
Logger.getLogger("Essentials").log(Level.WARNING, String.format("Missing translation key \"%s\" in translation file %s", ex.getKey(), localeBundle.getLocale().toString()), ex);
return defaultBundle.getString(string);
}
}
public String format(final String string, final Object... objects)
{
final String format = translate(string);
MessageFormat messageFormat = messageFormatCache.get(format);
if (messageFormat == null)
{
messageFormat = new MessageFormat(format);
messageFormatCache.put(format, messageFormat);
}
return messageFormat.format(objects);
}
public static String tl(final String string, final Object... objects) {
if (instance == null) {
return "";
}
if (objects.length == 0) {
return NODOUBLEMARK.matcher(instance.translate(string)).replaceAll("'");
} else {
return instance.format(string, objects);
}
}
public void updateLocale(final String loc)
{
if (loc == null || loc.isEmpty())
{
return;
}
final String[] parts = loc.split("[_\\.]");
if (parts.length == 1)
{
currentLocale = new Locale(parts[0]);
}
if (parts.length == 2)
{
currentLocale = new Locale(parts[0], parts[1]);
}
if (parts.length == 3)
{
currentLocale = new Locale(parts[0], parts[1], parts[2]);
}
ResourceBundle.clearCache();
Logger.getLogger("Minecraft").log(Level.INFO, String.format("Using locale %s", currentLocale.toString()));
customBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess));
localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale);
}
public String format(final String string, final Object... objects) {
String format = translate(string);
MessageFormat messageFormat = messageFormatCache.get(format);
if (messageFormat == null) {
try {
messageFormat = new MessageFormat(format);
} catch (IllegalArgumentException e) {
ess.getLogger().log(Level.SEVERE, "Invalid Translation key for '" + string + "': " + e.getMessage());
format = format.replaceAll("\\{(\\D*?)\\}", "\\[$1\\]");
messageFormat = new MessageFormat(format);
}
messageFormatCache.put(format, messageFormat);
}
return messageFormat.format(objects);
}
public static String capitalCase(final String input)
{
return input == null || input.length() == 0
? input
: input.toUpperCase(Locale.ENGLISH).charAt(0)
+ input.toLowerCase(Locale.ENGLISH).substring(1);
}
public void updateLocale(final String loc) {
if (loc != null && !loc.isEmpty()) {
final String[] parts = loc.split("[_\\.]");
if (parts.length == 1) {
currentLocale = new Locale(parts[0]);
}
if (parts.length == 2) {
currentLocale = new Locale(parts[0], parts[1]);
}
if (parts.length == 3) {
currentLocale = new Locale(parts[0], parts[1], parts[2]);
}
}
ResourceBundle.clearCache();
messageFormatCache = new HashMap<String, MessageFormat>();
Logger.getLogger("Essentials").log(Level.INFO, String.format("Using locale %s", currentLocale.toString()));
try {
localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale);
} catch (MissingResourceException ex) {
localeBundle = NULL_BUNDLE;
}
try {
customBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess));
} catch (MissingResourceException ex) {
customBundle = NULL_BUNDLE;
}
}
public static String capitalCase(final String input) {
return input == null || input.length() == 0 ? input : input.toUpperCase(Locale.ENGLISH).charAt(0) + input.toLowerCase(Locale.ENGLISH).substring(1);
}
private static class FileResClassLoader extends ClassLoader
{
private final transient File dataFolder;
private static class FileResClassLoader extends ClassLoader {
private final transient File dataFolder;
public FileResClassLoader(final ClassLoader classLoader, final IEssentials ess)
{
super(classLoader);
this.dataFolder = ess.getDataFolder();
}
FileResClassLoader(final ClassLoader classLoader, final IEssentials ess) {
super(classLoader);
this.dataFolder = ess.getDataFolder();
}
@Override
public URL getResource(final String string)
{
final File file = new File(dataFolder, string);
if (file.exists())
{
try
{
return file.toURI().toURL();
}
catch (MalformedURLException ex)
{
}
}
return super.getResource(string);
}
@Override
public URL getResource(final String string) {
final File file = new File(dataFolder, string);
if (file.exists()) {
try {
return file.toURI().toURL();
} catch (MalformedURLException ex) {
}
}
return null;
}
@Override
public InputStream getResourceAsStream(final String string)
{
final File file = new File(dataFolder, string);
if (file.exists())
{
try
{
return new FileInputStream(file);
}
catch (FileNotFoundException ex)
{
}
}
return super.getResourceAsStream(string);
}
}
@Override
public InputStream getResourceAsStream(final String string) {
final File file = new File(dataFolder, string);
if (file.exists()) {
try {
return new FileInputStream(file);
} catch (FileNotFoundException ex) {
}
}
return null;
}
}
}
@@ -1,9 +1,5 @@
package com.earth2me.essentials;
/**
* @deprecated New interface will be IReload in api package
*/
@Deprecated
public interface IConf {
public void reloadConfig();
void reloadConfig();
}
@@ -1,78 +1,106 @@
package com.earth2me.essentials;
import com.earth2me.essentials.api.IItemDb;
import com.earth2me.essentials.api.IJails;
import com.earth2me.essentials.api.IWarps;
import com.earth2me.essentials.metrics.Metrics;
import com.earth2me.essentials.perm.PermissionsHandler;
import com.earth2me.essentials.register.payment.Methods;
import java.util.List;
import net.ess3.nms.SpawnerProvider;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
/**
* @deprecated This will be moved to the api package soon
*/
@Deprecated
public interface IEssentials extends Plugin
{
void addReloadListener(IConf listener);
public interface IEssentials extends Plugin {
void addReloadListener(IConf listener);
void reload();
void reload();
boolean onCommandEssentials(CommandSender sender, Command command, String commandLabel, String[] args, ClassLoader classLoader, String commandPath, String permissionPrefix, IEssentialsModule module);
List<String> onTabCompleteEssentials(CommandSender sender, Command command, String commandLabel, String[] args, ClassLoader classLoader, String commandPath, String permissionPrefix, IEssentialsModule module);
User getUser(Object base);
boolean onCommandEssentials(CommandSender sender, Command command, String commandLabel, String[] args, ClassLoader classLoader, String commandPath, String permissionPrefix, IEssentialsModule module);
I18n getI18n();
@Deprecated
User getUser(Object base);
User getOfflineUser(String name);
User getUser(UUID base);
World getWorld(String name);
User getUser(String base);
int broadcastMessage(IUser sender, String message);
User getUser(Player base);
ISettings getSettings();
I18n getI18n();
BukkitScheduler getScheduler();
User getOfflineUser(String name);
IJails getJails();
World getWorld(String name);
Warps getWarps();
int broadcastMessage(String message);
Worth getWorth();
int broadcastMessage(IUser sender, String message);
Backup getBackup();
int broadcastMessage(String permission, String message);
Methods getPaymentMethod();
ISettings getSettings();
int scheduleAsyncDelayedTask(Runnable run);
BukkitScheduler getScheduler();
int scheduleSyncDelayedTask(Runnable run);
IJails getJails();
int scheduleSyncDelayedTask(Runnable run, long delay);
IWarps getWarps();
int scheduleSyncRepeatingTask(final Runnable run, long delay, long period);
Worth getWorth();
TNTExplodeListener getTNTListener();
Backup getBackup();
PermissionsHandler getPermissionsHandler();
Kits getKits();
AlternativeCommandsHandler getAlternativeCommandsHandler();
Methods getPaymentMethod();
void showError(final CommandSender sender, final Throwable exception, final String commandLabel);
BukkitTask runTaskAsynchronously(Runnable run);
ItemDb getItemDb();
BukkitTask runTaskLaterAsynchronously(Runnable run, long delay);
UserMap getUserMap();
Metrics getMetrics();
void setMetrics(Metrics metrics);
EssentialsTimer getTimer();
List<String> getVanishedPlayers();
BukkitTask runTaskTimerAsynchronously(Runnable run, long delay, long period);
int scheduleSyncDelayedTask(Runnable run);
int scheduleSyncDelayedTask(Runnable run, long delay);
int scheduleSyncRepeatingTask(Runnable run, long delay, long period);
TNTExplodeListener getTNTListener();
PermissionsHandler getPermissionsHandler();
AlternativeCommandsHandler getAlternativeCommandsHandler();
void showError(CommandSource sender, Throwable exception, String commandLabel);
IItemDb getItemDb();
UserMap getUserMap();
Metrics getMetrics();
void setMetrics(Metrics metrics);
EssentialsTimer getTimer();
@Deprecated
List<String> getVanishedPlayers();
Collection<Player> getOnlinePlayers();
Iterable<User> getOnlineUsers();
SpawnerProvider getSpawnerProvider();
}
@@ -1,6 +1,5 @@
package com.earth2me.essentials;
public interface IEssentialsModule
{
public interface IEssentialsModule {
}
@@ -1,9 +0,0 @@
package com.earth2me.essentials;
import org.bukkit.command.CommandSender;
public interface IReplyTo {
public void setReplyTo(CommandSender user);
public CommandSender getReplyTo();
}
@@ -3,182 +3,323 @@ package com.earth2me.essentials;
import com.earth2me.essentials.commands.IEssentialsCommand;
import com.earth2me.essentials.signs.EssentialsSign;
import com.earth2me.essentials.textreader.IText;
import java.text.MessageFormat;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventPriority;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Pattern;
public interface ISettings extends IConf
{
boolean areSignsDisabled();
IText getAnnounceNewPlayerFormat();
public interface ISettings extends IConf {
boolean areSignsDisabled();
boolean getAnnounceNewPlayers();
IText getAnnounceNewPlayerFormat();
String getNewPlayerKit();
boolean getAnnounceNewPlayers();
String getBackupCommand();
String getNewPlayerKit();
long getBackupInterval();
String getBackupCommand();
MessageFormat getChatFormat(String group);
long getBackupInterval();
int getChatRadius();
String getChatFormat(String group);
double getCommandCost(IEssentialsCommand cmd);
int getChatRadius();
double getCommandCost(String label);
int getNearRadius();
String getCurrencySymbol();
char getChatShout();
int getOversizedStackSize();
char getChatQuestion();
int getDefaultStackSize();
BigDecimal getCommandCost(IEssentialsCommand cmd);
double getHealCooldown();
BigDecimal getCommandCost(String label);
Map<String, Object> getKit(String name);
String getCurrencySymbol();
ConfigurationSection getKits();
int getOversizedStackSize();
String getLocale();
int getDefaultStackSize();
String getNewbieSpawn();
double getHealCooldown();
String getNicknamePrefix();
Set<String> getSocialSpyCommands();
ChatColor getOperatorColor() throws Exception;
boolean getSocialSpyListenMutedPlayers();
boolean getPerWarpPermission();
Set<String> getMuteCommands();
boolean getProtectBoolean(final String configName, boolean def);
/**
* @Deprecated in favor of {@link Kits#getKits()}
*/
@Deprecated
ConfigurationSection getKits();
int getProtectCreeperMaxHeight();
/**
* @Deprecated in favor of {@link Kits#getKit(String)}
*/
@Deprecated
Map<String, Object> getKit(String kit);
List<Integer> getProtectList(final String configName);
/**
* @Deprecated in favor of {@link Kits#addKit(String, List, long)}}
*/
@Deprecated
void addKit(String name, List<String> lines, long delay);
boolean getProtectPreventSpawn(final String creatureName);
@Deprecated
ConfigurationSection getKitSection();
String getProtectString(final String configName);
boolean isSkippingUsedOneTimeKitsFromKitList();
boolean getRespawnAtHome();
String getLocale();
Set getMultipleHomes();
String getNewbieSpawn();
int getHomeLimit(String set);
String getNicknamePrefix();
int getHomeLimit(User user);
ChatColor getOperatorColor() throws Exception;
boolean getSortListByGroups();
boolean getPerWarpPermission();
int getSpawnMobLimit();
boolean getProtectBoolean(final String configName, boolean def);
int getStartingBalance();
int getProtectCreeperMaxHeight();
double getTeleportCooldown();
List<Material> getProtectList(final String configName);
double getTeleportDelay();
boolean getProtectPreventSpawn(final String creatureName);
boolean hidePermissionlessHelp();
String getProtectString(final String configName);
boolean isCommandDisabled(final IEssentialsCommand cmd);
boolean getRespawnAtHome();
boolean isCommandDisabled(String label);
Set getMultipleHomes();
boolean isCommandOverridden(String name);
int getHomeLimit(String set);
boolean isCommandRestricted(IEssentialsCommand cmd);
int getHomeLimit(User user);
boolean isCommandRestricted(String label);
int getSpawnMobLimit();
boolean isDebug();
BigDecimal getStartingBalance();
boolean isEcoDisabled();
boolean isTeleportSafetyEnabled();
boolean isTradeInStacks(int id);
boolean isForceDisableTeleportSafety();
List<Integer> itemSpawnBlacklist();
double getTeleportCooldown();
List<EssentialsSign> enabledSigns();
double getTeleportDelay();
boolean permissionBasedItemSpawn();
boolean hidePermissionlessHelp();
boolean showNonEssCommandsInHelp();
boolean isCommandDisabled(final IEssentialsCommand cmd);
boolean spawnIfNoHome();
boolean isCommandDisabled(String label);
boolean warnOnBuildDisallow();
boolean isCommandOverridden(String name);
boolean warnOnSmite();
boolean isDebug();
double getMaxMoney();
boolean isEcoDisabled();
double getMinMoney();
@Deprecated
boolean isTradeInStacks(int id);
boolean isEcoLogEnabled();
boolean isTradeInStacks(Material type);
boolean isEcoLogUpdateEnabled();
List<Material> itemSpawnBlacklist();
boolean removeGodOnDisconnect();
List<EssentialsSign> enabledSigns();
boolean changeDisplayName();
boolean permissionBasedItemSpawn();
boolean changePlayerListName();
boolean showNonEssCommandsInHelp();
boolean isPlayerCommand(String string);
boolean warnOnBuildDisallow();
boolean useBukkitPermissions();
boolean warnOnSmite();
boolean addPrefixSuffix();
BigDecimal getMaxMoney();
boolean disablePrefix();
BigDecimal getMinMoney();
boolean disableSuffix();
boolean isEcoLogEnabled();
long getAutoAfk();
boolean isEcoLogUpdateEnabled();
long getAutoAfkKick();
boolean removeGodOnDisconnect();
boolean getFreezeAfkPlayers();
boolean changeDisplayName();
boolean cancelAfkOnMove();
boolean changePlayerListName();
boolean areDeathMessagesEnabled();
boolean isPlayerCommand(String string);
public void setDebug(boolean debug);
boolean useBukkitPermissions();
Set<String> getNoGodWorlds();
boolean addPrefixSuffix();
boolean getUpdateBedAtDaytime();
boolean disablePrefix();
boolean getRepairEnchanted();
boolean disableSuffix();
boolean isWorldTeleportPermissions();
boolean isWorldHomePermissions();
long getAutoAfk();
boolean registerBackInListener();
long getAutoAfkKick();
boolean getDisableItemPickupWhileAfk();
boolean getFreezeAfkPlayers();
EventPriority getRespawnPriority();
boolean cancelAfkOnMove();
long getTpaAcceptCancellation();
boolean cancelAfkOnInteract();
boolean isMetricsEnabled();
boolean isAfkListName();
void setMetricsEnabled(boolean metricsEnabled);
String getAfkListName();
long getTeleportInvulnerability();
boolean areDeathMessagesEnabled();
boolean isTeleportInvulnerability();
long getLoginAttackDelay();
int getSignUsePerSecond();
void setDebug(boolean debug);
Set<String> getNoGodWorlds();
boolean getUpdateBedAtDaytime();
boolean allowUnsafeEnchantments();
boolean getRepairEnchanted();
boolean isWorldTeleportPermissions();
boolean isWorldHomePermissions();
boolean registerBackInListener();
boolean getDisableItemPickupWhileAfk();
EventPriority getRespawnPriority();
EventPriority getSpawnJoinPriority();
long getTpaAcceptCancellation();
long getTeleportInvulnerability();
boolean isTeleportInvulnerability();
long getLoginAttackDelay();
int getSignUsePerSecond();
double getMaxFlySpeed();
double getMaxWalkSpeed();
int getMailsPerMinute();
long getEconomyLagWarning();
long getPermissionsLagWarning();
void setEssentialsChatActive(boolean b);
long getMaxTempban();
Map<String, Object> getListGroupConfig();
int getMaxNickLength();
boolean ignoreColorsInMaxLength();
boolean hideDisplayNameInVanish();
int getMaxUserCacheCount();
boolean allowSilentJoinQuit();
boolean isCustomJoinMessage();
String getCustomJoinMessage();
boolean isCustomQuitMessage();
String getCustomQuitMessage();
boolean isNotifyNoNewMail();
boolean isDropItemsIfFull();
boolean isLastMessageReplyRecipient();
BigDecimal getMinimumPayAmount();
long getLastMessageReplyRecipientTimeout();
boolean isMilkBucketEasterEggEnabled();
boolean isSendFlyEnableOnJoin();
boolean isWorldTimePermissions();
boolean isSpawnOnJoin();
List<String> getSpawnOnJoinGroups();
boolean isUserInSpawnOnJoinGroup(IUser user);
boolean isTeleportToCenterLocation();
boolean isCommandCooldownsEnabled();
long getCommandCooldownMs(String label);
Entry<Pattern, Long> getCommandCooldownEntry(String label);
boolean isCommandCooldownPersistent(String label);
boolean isNpcsInBalanceRanking();
NumberFormat getCurrencyFormat();
List<EssentialsSign> getUnprotectedSignNames();
boolean isPastebinCreateKit();
boolean isAllowBulkBuySell();
boolean isAddingPrefixInPlayerlist();
boolean isAddingSuffixInPlayerlist();
int getNotifyPlayerOfMailCooldown();
int getMotdDelay();
boolean isDirectHatAllowed();
List<String> getDefaultEnabledConfirmCommands();
boolean isConfirmCommandEnabledByDefault(String commandName);
boolean isCompassTowardsHomePerm();
boolean isAllowWorldInBroadcastworld();
String getItemDbType();
boolean isForceEnableRecipe();
boolean allowOldIdSigns();
}
@@ -0,0 +1,8 @@
package com.earth2me.essentials;
import org.bukkit.Location;
public interface ITarget {
Location getLocation();
}
+164 -25
View File
@@ -1,49 +1,188 @@
package com.earth2me.essentials;
import com.earth2me.essentials.commands.IEssentialsCommand;
import net.ess3.api.ITeleport;
import net.ess3.api.MaxMoneyException;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
/**
* @deprecated This will be moved to the api package soon
*/
@Deprecated
public interface IUser extends Player
{
long getLastTeleportTimestamp();
boolean isAuthorized(String node);
public interface IUser {
boolean isAuthorized(String node);
boolean isAuthorized(IEssentialsCommand cmd);
boolean isAuthorized(IEssentialsCommand cmd);
boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix);
boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix);
void setLastTeleportTimestamp(long time);
void healCooldown() throws Exception;
Location getLastLocation();
void giveMoney(BigDecimal value) throws MaxMoneyException;
Player getBase();
void giveMoney(final BigDecimal value, final CommandSource initiator) throws MaxMoneyException;
double getMoney();
void payUser(final User reciever, final BigDecimal value) throws Exception;
void takeMoney(double value);
void takeMoney(BigDecimal value);
void giveMoney(double value);
boolean canAfford(double value);
void takeMoney(final BigDecimal value, final CommandSource initiator);
String getGroup();
boolean canAfford(BigDecimal value);
void setLastLocation();
Boolean canSpawnItem(final Material material);
Location getHome(String name) throws Exception;
void setLastLocation();
Location getHome(Location loc) throws Exception;
void setLogoutLocation();
boolean isHidden();
void requestTeleport(final User player, final boolean here);
Teleport getTeleport();
/**
* Returns whether this user has an outstanding teleport request to deal with.
*
* @return whether there is a teleport request
*/
boolean hasOutstandingTeleportRequest();
void setJail(String jail);
ITeleport getTeleport();
BigDecimal getMoney();
void setMoney(final BigDecimal value) throws MaxMoneyException;
void setAfk(final boolean set);
/**
* 'Hidden' Represents when a player is hidden from others. This status includes when the player is hidden via other
* supported plugins. Use isVanished() if you want to check if a user is vanished by Essentials.
*
* @return If the user is hidden or not
*
* @see isVanished
*/
boolean isHidden();
void setHidden(boolean vanish);
boolean isGodModeEnabled();
String getGroup();
boolean inGroup(final String group);
boolean canBuild();
long getTeleportRequestTime();
void enableInvulnerabilityAfterTeleport();
void resetInvulnerabilityAfterTeleport();
boolean hasInvulnerabilityAfterTeleport();
/**
* 'Vanished' Represents when a player is hidden from others by Essentials. This status does NOT include when the
* player is hidden via other plugins. Use isHidden() if you want to check if a user is vanished by any supported
* plugin.
*
* @return If the user is vanished or not
*
* @see isHidden
*/
boolean isVanished();
void setVanished(boolean vanish);
boolean isIgnoreExempt();
void sendMessage(String message);
/*
* UserData
*/
Location getHome(String name) throws Exception;
Location getHome(Location loc) throws Exception;
List<String> getHomes();
void setHome(String name, Location loc);
void delHome(String name) throws Exception;
boolean hasHome();
Location getLastLocation();
Location getLogoutLocation();
long getLastTeleportTimestamp();
void setLastTeleportTimestamp(long time);
String getJail();
void setJail(String jail);
List<String> getMails();
void addMail(String mail);
boolean isAfk();
void setIgnoreMsg(boolean ignoreMsg);
boolean isIgnoreMsg();
void setConfigProperty(String node, Object object);
Set<String> getConfigKeys();
Map<String, Object> getConfigMap();
Map<String, Object> getConfigMap(String node);
Map<Pattern, Long> getCommandCooldowns();
Date getCommandCooldownExpiry(String label);
void addCommandCooldown(Pattern pattern, Date expiresAt, boolean save);
boolean clearCommandCooldown(Pattern pattern);
/*
* PlayerExtension
*/
Player getBase();
CommandSource getSource();
String getName();
String getAfkMessage();
void setAfkMessage(final String message);
long getAfkSince();
boolean isAcceptingPay();
void setAcceptingPay(boolean acceptingPay);
boolean isPromptingPayConfirm();
void setPromptingPayConfirm(boolean prompt);
boolean isPromptingClearConfirm();
void setPromptingClearConfirm(boolean prompt);
Map<User, BigDecimal> getConfirmingPayments();
}
@@ -1,122 +0,0 @@
package com.earth2me.essentials;
import com.earth2me.essentials.api.IItemDb;
import static com.earth2me.essentials.I18n._;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
public class ItemDb implements IConf, IItemDb
{
private final transient IEssentials ess;
public ItemDb(final IEssentials ess)
{
this.ess = ess;
file = new ManagedFile("items.csv", ess);
}
private final transient Map<String, Integer> items = new HashMap<String, Integer>();
private final transient Map<String, Short> durabilities = new HashMap<String, Short>();
private final transient ManagedFile file;
@Override
public void reloadConfig()
{
final List<String> lines = file.getLines();
if (lines.isEmpty())
{
return;
}
durabilities.clear();
items.clear();
for (String line : lines)
{
line = line.trim().toLowerCase(Locale.ENGLISH);
if (line.length() > 0 && line.charAt(0) == '#')
{
continue;
}
final String[] parts = line.split("[^a-z0-9]");
if (parts.length < 2)
{
continue;
}
final int numeric = Integer.parseInt(parts[1]);
durabilities.put(parts[0].toLowerCase(Locale.ENGLISH), parts.length > 2 && !parts[2].equals("0") ? Short.parseShort(parts[2]) : 0);
items.put(parts[0].toLowerCase(Locale.ENGLISH), numeric);
}
}
public ItemStack get(final String id, final int quantity) throws Exception
{
final ItemStack retval = get(id.toLowerCase(Locale.ENGLISH));
retval.setAmount(quantity);
return retval;
}
public ItemStack get(final String id) throws Exception
{
int itemid = 0;
String itemname = null;
short metaData = 0;
if (id.matches("^\\d+[:+',;.]\\d+$"))
{
itemid = Integer.parseInt(id.split("[:+',;.]")[0]);
metaData = Short.parseShort(id.split("[:+',;.]")[1]);
}
else if (id.matches("^\\d+$"))
{
itemid = Integer.parseInt(id);
}
else if (id.matches("^[^:+',;.]+[:+',;.]\\d+$"))
{
itemname = id.split("[:+',;.]")[0].toLowerCase(Locale.ENGLISH);
metaData = Short.parseShort(id.split("[:+',;.]")[1]);
}
else
{
itemname = id.toLowerCase(Locale.ENGLISH);
}
if (itemname != null)
{
if (items.containsKey(itemname))
{
itemid = items.get(itemname);
if (durabilities.containsKey(itemname) && metaData == 0)
{
metaData = durabilities.get(itemname);
}
}
else if (Material.getMaterial(itemname) != null)
{
itemid = Material.getMaterial(itemname).getId();
metaData = 0;
}
else
{
throw new Exception(_("unknownItemName", id));
}
}
final Material mat = Material.getMaterial(itemid);
if (mat == null)
{
throw new Exception(_("unknownItemId", itemid));
}
final ItemStack retval = new ItemStack(mat);
retval.setAmount(mat.getMaxStackSize());
retval.setDurability(metaData);
return retval;
}
}
+228 -288
View File
@@ -1,16 +1,13 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.api.IJails;
import com.earth2me.essentials.storage.AsyncStorageObjectHolder;
import java.io.File;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.ess3.api.IEssentials;
import net.ess3.api.IUser;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -26,299 +23,242 @@ import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.plugin.PluginManager;
import java.io.File;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.settings.Jails> implements IJails
{
private static final transient Logger LOGGER = Bukkit.getLogger();
private static transient boolean enabled = false;
public Jails(final IEssentials ess)
{
super(ess, com.earth2me.essentials.settings.Jails.class);
reloadConfig();
}
private void registerListeners()
{
enabled = true;
final PluginManager pluginManager = ess.getServer().getPluginManager();
final JailListener blockListener = new JailListener();
pluginManager.registerEvents(blockListener, ess);
}
@Override
public File getStorageFile()
{
return new File(ess.getDataFolder(), "jail.yml");
}
@Override
public void finishRead()
{
if (enabled == false && getCount() > 0)
{
registerListeners();
}
}
@Override
public void finishWrite()
{
if (enabled == false)
{
registerListeners();
}
}
@Override
public Location getJail(final String jailName) throws Exception
{
acquireReadLock();
try
{
if (getData().getJails() == null || jailName == null
|| !getData().getJails().containsKey(jailName.toLowerCase(Locale.ENGLISH)))
{
throw new Exception(_("jailNotExist"));
}
Location loc = getData().getJails().get(jailName.toLowerCase(Locale.ENGLISH));
if (loc == null || loc.getWorld() == null)
{
throw new Exception(_("jailNotExist"));
}
return loc;
}
finally
{
unlock();
}
}
@Override
public Collection<String> getList() throws Exception
{
acquireReadLock();
try
{
if (getData().getJails() == null)
{
return Collections.emptyList();
}
return new ArrayList<String>(getData().getJails().keySet());
}
finally
{
unlock();
}
}
@Override
public void removeJail(final String jail) throws Exception
{
acquireWriteLock();
try
{
if (getData().getJails() == null)
{
return;
}
getData().getJails().remove(jail.toLowerCase(Locale.ENGLISH));
}
finally
{
unlock();
}
}
@Override
public void sendToJail(final IUser user, final String jail) throws Exception
{
acquireReadLock();
try
{
if (user.isOnline())
{
Location loc = getJail(jail);
user.getTeleport().now(loc, false, TeleportCause.COMMAND);
}
user.setJail(jail);
}
finally
{
unlock();
}
}
@Override
public void setJail(final String jailName, final Location loc) throws Exception
{
acquireWriteLock();
try
{
if (getData().getJails() == null)
{
getData().setJails(new HashMap<String, Location>());
}
getData().getJails().put(jailName.toLowerCase(Locale.ENGLISH), loc);
}
finally
{
unlock();
}
}
@Override
public int getCount()
{
try
{
return getList().size();
}
catch (Exception ex)
{
return 0;
}
}
import static com.earth2me.essentials.I18n.tl;
private class JailListener implements Listener
{
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBlockBreak(final BlockBreakEvent event)
{
final User user = ess.getUser(event.getPlayer());
if (user.isJailed())
{
event.setCancelled(true);
}
}
public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.settings.Jails> implements net.ess3.api.IJails {
private static final transient Logger LOGGER = Bukkit.getLogger();
private static transient boolean enabled = false;
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBlockPlace(final BlockPlaceEvent event)
{
final User user = ess.getUser(event.getPlayer());
if (user.isJailed())
{
event.setCancelled(true);
}
}
public Jails(final IEssentials ess) {
super(ess, com.earth2me.essentials.settings.Jails.class);
reloadConfig();
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBlockDamage(final BlockDamageEvent event)
{
final User user = ess.getUser(event.getPlayer());
if (user.isJailed())
{
event.setCancelled(true);
}
}
private void registerListeners() {
enabled = true;
final PluginManager pluginManager = ess.getServer().getPluginManager();
final JailListener blockListener = new JailListener();
pluginManager.registerEvents(blockListener, ess);
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Registering Jail listener");
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityDamageByEntity(final EntityDamageByEntityEvent event)
{
if (event.getCause() != DamageCause.ENTITY_ATTACK || event.getEntity().getType() != EntityType.PLAYER)
{
return;
}
final Entity damager = event.getDamager();
if (damager.getType() == EntityType.PLAYER)
{
final User user = ess.getUser(damager);
if (user != null && user.isJailed())
{
event.setCancelled(true);
}
}
}
@Override
public File getStorageFile() {
return new File(ess.getDataFolder(), "jail.yml");
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPlayerInteract(final PlayerInteractEvent event)
{
final User user = ess.getUser(event.getPlayer());
if (user.isJailed())
{
event.setCancelled(true);
}
}
@Override
public void finishRead() {
checkRegister();
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerRespawn(final PlayerRespawnEvent event)
{
final User user = ess.getUser(event.getPlayer());
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty())
{
return;
}
@Override
public void finishWrite() {
checkRegister();
}
try
{
event.setRespawnLocation(getJail(user.getJail()));
}
catch (Exception ex)
{
if (ess.getSettings().isDebug())
{
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
}
else
{
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
}
}
public void resetListener() {
enabled = false;
checkRegister();
}
@EventHandler(priority = EventPriority.HIGH)
public void onPlayerTeleport(final PlayerTeleportEvent event)
{
final User user = ess.getUser(event.getPlayer());
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty())
{
return;
}
private void checkRegister() {
if (enabled == false && getCount() > 0) {
registerListeners();
}
}
try
{
event.setTo(getJail(user.getJail()));
}
catch (Exception ex)
{
if (ess.getSettings().isDebug())
{
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
}
else
{
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
}
user.sendMessage(_("jailMessage"));
}
@Override
public Location getJail(final String jailName) throws Exception {
acquireReadLock();
try {
if (getData().getJails() == null || jailName == null || !getData().getJails().containsKey(jailName.toLowerCase(Locale.ENGLISH))) {
throw new Exception(tl("jailNotExist"));
}
Location loc = getData().getJails().get(jailName.toLowerCase(Locale.ENGLISH));
if (loc == null || loc.getWorld() == null) {
throw new Exception(tl("jailNotExist"));
}
return loc;
} finally {
unlock();
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerJoin(final PlayerJoinEvent event)
{
final User user = ess.getUser(event.getPlayer());
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty())
{
return;
}
@Override
public Collection<String> getList() throws Exception {
acquireReadLock();
try {
if (getData().getJails() == null) {
return Collections.emptyList();
}
return new ArrayList<String>(getData().getJails().keySet());
} finally {
unlock();
}
}
try
{
sendToJail(user, user.getJail());
}
catch (Exception ex)
{
if (ess.getSettings().isDebug())
{
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
}
else
{
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
}
user.sendMessage(_("jailMessage"));
}
}
@Override
public void removeJail(final String jail) throws Exception {
acquireWriteLock();
try {
if (getData().getJails() == null) {
return;
}
getData().getJails().remove(jail.toLowerCase(Locale.ENGLISH));
} finally {
unlock();
}
}
@Override
public void sendToJail(final IUser user, final String jail) throws Exception {
acquireReadLock();
try {
if (user.getBase().isOnline()) {
Location loc = getJail(jail);
user.getTeleport().now(loc, false, TeleportCause.COMMAND);
}
user.setJail(jail);
} finally {
unlock();
}
}
@Override
public void setJail(final String jailName, final Location loc) throws Exception {
acquireWriteLock();
try {
if (getData().getJails() == null) {
getData().setJails(new HashMap<String, Location>());
}
getData().getJails().put(jailName.toLowerCase(Locale.ENGLISH), loc);
} finally {
unlock();
}
}
@Override
public int getCount() {
try {
return getList().size();
} catch (Exception ex) {
return 0;
}
}
private class JailListener implements Listener {
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onJailBlockBreak(final BlockBreakEvent event) {
final User user = ess.getUser(event.getPlayer());
if (user.isJailed()) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onJailBlockPlace(final BlockPlaceEvent event) {
final User user = ess.getUser(event.getPlayer());
if (user.isJailed()) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onJailBlockDamage(final BlockDamageEvent event) {
final User user = ess.getUser(event.getPlayer());
if (user.isJailed()) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onJailEntityDamageByEntity(final EntityDamageByEntityEvent event) {
if (event.getCause() != DamageCause.ENTITY_ATTACK || event.getEntity().getType() != EntityType.PLAYER) {
return;
}
final Entity damager = event.getDamager();
if (damager.getType() == EntityType.PLAYER) {
final User user = ess.getUser((Player) damager);
if (user != null && user.isJailed()) {
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onJailPlayerInteract(final PlayerInteractEvent event) {
final User user = ess.getUser(event.getPlayer());
if (user.isJailed()) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onJailPlayerRespawn(final PlayerRespawnEvent event) {
final User user = ess.getUser(event.getPlayer());
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty()) {
return;
}
try {
event.setRespawnLocation(getJail(user.getJail()));
} catch (Exception ex) {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
} else {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
}
}
@EventHandler(priority = EventPriority.HIGH)
public void onJailPlayerTeleport(final PlayerTeleportEvent event) {
final User user = ess.getUser(event.getPlayer());
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty()) {
return;
}
try {
event.setTo(getJail(user.getJail()));
} catch (Exception ex) {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
} else {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
}
user.sendMessage(tl("jailMessage"));
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onJailPlayerJoin(final PlayerJoinEvent event) {
final User user = ess.getUser(event.getPlayer());
final long currentTime = System.currentTimeMillis();
user.checkJailTimeout(currentTime);
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty()) {
return;
}
try {
sendToJail(user, user.getJail());
} catch (Exception ex) {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
} else {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
}
user.sendMessage(tl("jailMessage"));
}
}
}
+195 -157
View File
@@ -1,176 +1,214 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import static com.earth2me.essentials.I18n.capitalCase;
import com.earth2me.essentials.Trade.OverflowType;
import com.earth2me.essentials.commands.NoChargeException;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import java.util.*;
import java.util.logging.Level;
import com.earth2me.essentials.textreader.IText;
import com.earth2me.essentials.textreader.KeywordReplacer;
import com.earth2me.essentials.textreader.SimpleTextInput;
import com.earth2me.essentials.utils.DateUtil;
import net.ess3.api.IEssentials;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import java.math.BigDecimal;
import java.util.*;
import java.util.logging.Level;
public class Kit
{
//TODO: Convert this to use one of the new text classes?
public static String listKits(final IEssentials ess, final User user) throws Exception
{
try
{
final ConfigurationSection kits = ess.getSettings().getKits();
final StringBuilder list = new StringBuilder();
for (String kiteItem : kits.getKeys(false))
{
if (user == null || user.isAuthorized("essentials.kit." + kiteItem.toLowerCase(Locale.ENGLISH)))
{
list.append(" ").append(capitalCase(kiteItem));
}
}
return list.toString().trim();
}
catch (Exception ex)
{
throw new Exception(_("kitError"), ex);
}
import static com.earth2me.essentials.I18n.tl;
}
public static void checkTime(final User user, final String kitName, final Map<String, Object> els) throws NoChargeException
{
final Calendar time = new GregorianCalendar();
public class Kit {
final IEssentials ess;
final String kitName;
final Map<String, Object> kit;
final Trade charge;
// Take the current time, and remove the delay from it.
final double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0L;
final Calendar earliestTime = new GregorianCalendar();
earliestTime.add(Calendar.SECOND, -(int)delay);
earliestTime.add(Calendar.MILLISECOND, -(int)((delay * 1000.0) % 1000.0));
// This value contains the most recent time a kit could have been used that would allow another use.
final long earliestLong = earliestTime.getTimeInMillis();
public Kit(final String kitName, final IEssentials ess) throws Exception {
this.kitName = kitName;
this.ess = ess;
this.kit = ess.getKits().getKit(kitName);
this.charge = new Trade("kit-" + kitName, new Trade("kit-kit", ess), ess);
// When was the last kit used?
final Long lastTime = user.getKitTimestamp(kitName);
if (kit == null) {
throw new Exception(tl("kitNotFound"));
}
}
if (lastTime == null || lastTime < earliestLong)
{
user.setKitTimestamp(kitName, time.getTimeInMillis());
}
else if (lastTime > time.getTimeInMillis())
{
// This is to make sure time didn't get messed up on last kit use.
// If this happens, let's give the user the benifit of the doubt.
user.setKitTimestamp(kitName, time.getTimeInMillis());
}
else
{
time.setTimeInMillis(lastTime);
time.add(Calendar.SECOND, (int)delay);
time.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0));
user.sendMessage(_("kitTimed", Util.formatDateDiff(time.getTimeInMillis())));
throw new NoChargeException();
}
}
public String getName() {
return kitName;
}
public static List<String> getItems(final User user, final Map<String, Object> kit) throws Exception
{
if (kit == null)
{
throw new Exception(_("kitError2"));
}
public void checkPerms(final User user) throws Exception {
if (!user.isAuthorized("essentials.kits." + kitName)) {
throw new Exception(tl("noKitPermission", "essentials.kits." + kitName));
}
}
try
{
return (List<String>)kit.get("items");
}
catch (Exception e)
{
user.sendMessage(_("kitError2"));
throw new Exception(_("kitErrorHelp"), e);
}
}
public void checkDelay(final User user) throws Exception {
long nextUse = getNextUse(user);
public static void expandItems(final IEssentials ess, final User user, final List<String> items) throws Exception
{
try
{
boolean spew = false;
for (String d : items)
{
final String[] parts = d.split(" ");
final String[] item = parts[0].split("[:+',;.]", 2);
final int id = Material.getMaterial(Integer.parseInt(item[0])).getId();
final short data = item.length > 1 ? Short.parseShort(item[1]) : 0;
final int amount = parts.length > 1 ? Integer.parseInt(parts[1]) : 1;
if (nextUse == 0L) {
return;
} else if (nextUse < 0L) {
user.sendMessage(tl("kitOnce"));
throw new NoChargeException();
} else {
user.sendMessage(tl("kitTimed", DateUtil.formatDateDiff(nextUse)));
throw new NoChargeException();
}
}
final ItemStack stack = new ItemStack(id, amount, data);
if (parts.length > 2)
{
for (int i = 2; i < parts.length; i++)
{
final String[] split = parts[i].split("[:+',;.]", 2);
if (split.length < 1)
{
continue;
}
final Enchantment enchantment = Enchantments.getByName(split[0]);
if (enchantment == null)
{
throw new Exception("Enchantment not found: " + split[0]);
}
int level;
if (split.length > 1)
{
level = Integer.parseInt(split[1]);
}
else
{
level = enchantment.getMaxLevel();
}
try
{
stack.addEnchantment(enchantment, level);
}
catch (Exception ex)
{
throw new Exception("Enchantment " + enchantment.getName() + ": " + ex.getMessage(), ex);
}
}
}
public void checkAffordable(final User user) throws Exception {
charge.isAffordableFor(user);
}
final Map<Integer, ItemStack> overfilled;
if (user.isAuthorized("essentials.oversizedstacks"))
{
overfilled = InventoryWorkaround.addItem(user.getInventory(), true, ess.getSettings().getOversizedStackSize(), stack);
}
else
{
overfilled = InventoryWorkaround.addItem(user.getInventory(), true, 0, stack);
}
for (ItemStack itemStack : overfilled.values())
{
user.getWorld().dropItemNaturally(user.getLocation(), itemStack);
spew = true;
}
}
user.updateInventory();
if (spew)
{
user.sendMessage(_("kitInvFull"));
}
}
catch (Exception e)
{
user.updateInventory();
if (ess.getSettings().isDebug())
{
ess.getLogger().log(Level.WARNING, e.getMessage());
}
else
{
ess.getLogger().log(Level.WARNING, e.getMessage());
}
throw new Exception(_("kitError2"), e);
}
}
public void setTime(final User user) throws Exception {
final Calendar time = new GregorianCalendar();
user.setKitTimestamp(kitName, time.getTimeInMillis());
}
public void chargeUser(final User user) throws Exception {
charge.charge(user);
}
public long getNextUse(final User user) throws Exception {
if (user.isAuthorized("essentials.kit.exemptdelay")) {
return 0L;
}
final Calendar time = new GregorianCalendar();
double delay = 0;
try {
// Make sure delay is valid
delay = kit.containsKey("delay") ? ((Number) kit.get("delay")).doubleValue() : 0.0d;
} catch (Exception e) {
throw new Exception(tl("kitError2"));
}
// When was the last kit used?
final long lastTime = user.getKitTimestamp(kitName);
// When can be use the kit again?
final Calendar delayTime = new GregorianCalendar();
delayTime.setTimeInMillis(lastTime);
delayTime.add(Calendar.SECOND, (int) delay);
delayTime.add(Calendar.MILLISECOND, (int) ((delay * 1000.0) % 1000.0));
if (lastTime == 0L || lastTime > time.getTimeInMillis()) {
// If we have no record of kit use, or its corrupted, give them benefit of the doubt.
return 0L;
} else if (delay < 0d) {
// If the kit has a negative kit time, it can only be used once.
return -1;
} else if (delayTime.before(time)) {
// If the kit was used in the past, but outside the delay time, it can be used.
return 0L;
} else {
// If the kit has been used recently, return the next time it can be used.
return delayTime.getTimeInMillis();
}
}
@Deprecated
public List<String> getItems(final User user) throws Exception {
return getItems();
}
public List<String> getItems() throws Exception {
if (kit == null) {
throw new Exception(tl("kitNotFound"));
}
try {
final List<String> itemList = new ArrayList<String>();
final Object kitItems = kit.get("items");
if (kitItems instanceof List) {
for (Object item : (List) kitItems) {
if (item instanceof String) {
itemList.add(item.toString());
continue;
}
throw new Exception("Invalid kit item: " + item.toString());
}
return itemList;
}
throw new Exception("Invalid item list");
} catch (Exception e) {
ess.getLogger().log(Level.WARNING, "Error parsing kit " + kitName + ": " + e.getMessage());
throw new Exception(tl("kitError2"), e);
}
}
public void expandItems(final User user) throws Exception {
expandItems(user, getItems(user));
}
public void expandItems(final User user, final List<String> items) throws Exception {
try {
IText input = new SimpleTextInput(items);
IText output = new KeywordReplacer(input, user.getSource(), ess, true, true);
boolean spew = false;
final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments();
for (String kitItem : output.getLines()) {
if (kitItem.startsWith(ess.getSettings().getCurrencySymbol())) {
BigDecimal value = new BigDecimal(kitItem.substring(ess.getSettings().getCurrencySymbol().length()).trim());
Trade t = new Trade(value, ess);
t.pay(user, OverflowType.DROP);
continue;
}
if (kitItem.startsWith("/")) {
String command = kitItem.substring(1);
String name = user.getName();
command = command.replace("{player}", name);
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
continue;
}
final String[] parts = kitItem.split(" +");
final ItemStack parseStack = ess.getItemDb().get(parts[0], parts.length > 1 ? Integer.parseInt(parts[1]) : 1);
if (parseStack.getType() == Material.AIR) {
continue;
}
final MetaItemStack metaStack = new MetaItemStack(parseStack);
if (parts.length > 2) {
// We pass a null sender here because kits should not do perm checks
metaStack.parseStringMeta(null, allowUnsafe, parts, 2, ess);
}
final Map<Integer, ItemStack> overfilled;
final boolean allowOversizedStacks = user.isAuthorized("essentials.oversizedstacks");
if (allowOversizedStacks) {
overfilled = InventoryWorkaround.addOversizedItems(user.getBase().getInventory(), ess.getSettings().getOversizedStackSize(), metaStack.getItemStack());
} else {
overfilled = InventoryWorkaround.addItems(user.getBase().getInventory(), metaStack.getItemStack());
}
for (ItemStack itemStack : overfilled.values()) {
int spillAmount = itemStack.getAmount();
if (!allowOversizedStacks) {
itemStack.setAmount(spillAmount < itemStack.getMaxStackSize() ? spillAmount : itemStack.getMaxStackSize());
}
while (spillAmount > 0) {
user.getWorld().dropItemNaturally(user.getLocation(), itemStack);
spillAmount -= itemStack.getAmount();
}
spew = true;
}
}
user.getBase().updateInventory();
if (spew) {
user.sendMessage(tl("kitInvFull"));
}
} catch (Exception e) {
user.getBase().updateInventory();
ess.getLogger().log(Level.WARNING, e.getMessage());
throw new Exception(tl("kitError2"), e);
}
}
}
@@ -0,0 +1,114 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.NumberUtil;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.MemoryConfiguration;
import java.io.File;
import java.math.BigDecimal;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import static com.earth2me.essentials.I18n.capitalCase;
import static com.earth2me.essentials.I18n.tl;
public class Kits implements IConf {
private final EssentialsConf config;
private ConfigurationSection kits;
public Kits(final IEssentials essentials) {
config = new EssentialsConf(new File(essentials.getDataFolder(), "kits.yml"));
config.setTemplateName("/kits.yml");
reloadConfig();
}
@Override
public void reloadConfig() {
config.load();
kits = _getKits();
}
private ConfigurationSection _getKits() {
if (config.isConfigurationSection("kits")) {
final ConfigurationSection section = config.getConfigurationSection("kits");
final ConfigurationSection newSection = new MemoryConfiguration();
for (String kitItem : section.getKeys(false)) {
if (section.isConfigurationSection(kitItem)) {
newSection.set(kitItem.toLowerCase(Locale.ENGLISH), section.getConfigurationSection(kitItem));
}
}
return newSection;
}
return null;
}
public EssentialsConf getConfig() {
return config;
}
public ConfigurationSection getKits() {
return kits;
}
public Map<String, Object> getKit(String name) {
name = name.replace('.', '_').replace('/', '_');
if (getKits() != null) {
final ConfigurationSection kits = getKits();
// For some reason, YAML doesn't sees keys as always lowercase even if they aren't defined like that.
// Workaround is to toLowercase when getting from the config, but showing normally elsewhere.
// ODDLY ENOUGH when you get the configuration section for ALL kits, it will return the proper
// case of each kit. But when you check for each kit's configuration section, it won't return the kit
// you just found if you don't toLowercase it.
if (kits.isConfigurationSection(name.toLowerCase())) {
return kits.getConfigurationSection(name.toLowerCase()).getValues(true);
} else {
}
}
return null;
}
public void addKit(String name, List<String> lines, long delay) {
// Will overwrite but w/e
config.set("kits." + name + ".delay", delay);
config.set("kits." + name + ".items", lines);
kits = _getKits();
config.save();
}
public String listKits(final net.ess3.api.IEssentials ess, final User user) throws Exception {
try {
final ConfigurationSection kits = config.getConfigurationSection("kits");
final StringBuilder list = new StringBuilder();
for (String kitItem : kits.getKeys(false)) {
if (user == null) {
list.append(" ").append(capitalCase(kitItem));
} else if (user.isAuthorized("essentials.kits." + kitItem.toLowerCase(Locale.ENGLISH))) {
String cost = "";
String name = capitalCase(kitItem);
BigDecimal costPrice = new Trade("kit-" + kitItem.toLowerCase(Locale.ENGLISH), ess).getCommandCost(user);
if (costPrice.signum() > 0) {
cost = tl("kitCost", NumberUtil.displayCurrency(costPrice, ess));
}
Kit kit = new Kit(kitItem, ess);
double nextUse = kit.getNextUse(user);
if (nextUse == -1 && ess.getSettings().isSkippingUsedOneTimeKitsFromKitList()) {
continue;
} else if (nextUse != 0) {
name = tl("kitDelay", name);
}
list.append(" ").append(name).append(cost);
}
}
return list.toString().trim();
} catch (Exception ex) {
throw new Exception(tl("kitError"), ex);
}
}
}
@@ -0,0 +1,17 @@
package com.earth2me.essentials;
import org.bukkit.Location;
public class LocationTarget implements ITarget {
private final Location location;
LocationTarget(Location location) {
this.location = location;
}
@Override
public Location getLocation() {
return location;
}
}
@@ -1,6 +1,8 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import net.ess3.api.IEssentials;
import org.bukkit.Bukkit;
import java.io.*;
import java.math.BigInteger;
import java.security.DigestInputStream;
@@ -11,217 +13,155 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import static com.earth2me.essentials.I18n.tl;
public class ManagedFile
{
private final static int BUFFERSIZE = 1024 * 8;
private final transient File file;
public class ManagedFile {
private static final int BUFFERSIZE = 1024 * 8;
private final transient File file;
public ManagedFile(final String filename, final IEssentials ess)
{
file = new File(ess.getDataFolder(), filename);
public ManagedFile(final String filename, final IEssentials ess) {
file = new File(ess.getDataFolder(), filename);
if (file.exists())
{
try
{
if (checkForVersion(file, ess.getDescription().getVersion()) && !file.delete())
{
throw new IOException("Could not delete file " + file.toString());
}
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
}
}
if (file.exists()) {
try {
if (checkForVersion(file, ess.getDescription().getVersion()) && !file.delete()) {
throw new IOException("Could not delete file " + file.toString());
}
} catch (IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
}
}
if (!file.exists())
{
try
{
copyResourceAscii("/" + filename, file);
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, _("itemsCsvNotLoaded"), ex);
}
}
}
if (!file.exists()) {
try {
copyResourceAscii("/" + filename, file);
} catch (IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, tl("itemsCsvNotLoaded"), ex);
}
}
}
public static void copyResourceAscii(final String resourceName, final File file) throws IOException
{
final InputStreamReader reader = new InputStreamReader(ManagedFile.class.getResourceAsStream(resourceName));
try
{
final MessageDigest digest = getDigest();
final DigestOutputStream digestStream = new DigestOutputStream(new FileOutputStream(file), digest);
try
{
final OutputStreamWriter writer = new OutputStreamWriter(digestStream);
try
{
final char[] buffer = new char[BUFFERSIZE];
do
{
final int length = reader.read(buffer);
if (length >= 0)
{
writer.write(buffer, 0, length);
}
else
{
break;
}
}
while (true);
writer.write("\n");
writer.flush();
final BigInteger hashInt = new BigInteger(1, digest.digest());
digestStream.on(false);
digestStream.write('#');
digestStream.write(hashInt.toString(16).getBytes());
}
finally
{
writer.close();
}
}
finally
{
digestStream.close();
}
}
finally
{
reader.close();
}
}
public static void copyResourceAscii(final String resourceName, final File file) throws IOException {
final InputStreamReader reader = new InputStreamReader(ManagedFile.class.getResourceAsStream(resourceName));
try {
final MessageDigest digest = getDigest();
final DigestOutputStream digestStream = new DigestOutputStream(new FileOutputStream(file), digest);
try {
final OutputStreamWriter writer = new OutputStreamWriter(digestStream);
try {
final char[] buffer = new char[BUFFERSIZE];
do {
final int length = reader.read(buffer);
if (length >= 0) {
writer.write(buffer, 0, length);
} else {
break;
}
} while (true);
writer.write("\n");
writer.flush();
final BigInteger hashInt = new BigInteger(1, digest.digest());
digestStream.on(false);
digestStream.write('#');
digestStream.write(hashInt.toString(16).getBytes());
} finally {
writer.close();
}
} finally {
digestStream.close();
}
} finally {
reader.close();
}
}
public static boolean checkForVersion(final File file, final String version) throws IOException
{
if (file.length() < 33)
{
return false;
}
final BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
try
{
final byte[] buffer = new byte[(int)file.length()];
int position = 0;
do
{
final int length = bis.read(buffer, position, Math.min((int)file.length() - position, BUFFERSIZE));
if (length < 0)
{
break;
}
position += length;
}
while (position < file.length());
final ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
if (bais.skip(file.length() - 33) != file.length() - 33)
{
return false;
}
final BufferedReader reader = new BufferedReader(new InputStreamReader(bais));
try
{
String hash = reader.readLine();
if (hash != null && hash.matches("#[a-f0-9]{32}"))
{
hash = hash.substring(1);
bais.reset();
final String versionline = reader.readLine();
if (versionline != null && versionline.matches("#version: .+"))
{
final String versioncheck = versionline.substring(10);
if (!versioncheck.equalsIgnoreCase(version))
{
bais.reset();
final MessageDigest digest = getDigest();
final DigestInputStream digestStream = new DigestInputStream(bais, digest);
try
{
final byte[] bytes = new byte[(int)file.length() - 33];
digestStream.read(bytes);
final BigInteger correct = new BigInteger(hash, 16);
final BigInteger test = new BigInteger(1, digest.digest());
if (correct.equals(test))
{
return true;
}
else
{
Bukkit.getLogger().warning("File " + file.toString() + " has been modified by user and file version differs, please update the file manually.");
}
}
finally
{
digestStream.close();
}
}
}
}
}
finally
{
reader.close();
}
}
finally
{
bis.close();
}
return false;
}
public static boolean checkForVersion(final File file, final String version) throws IOException {
if (file.length() < 33) {
return false;
}
final BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
try {
final byte[] buffer = new byte[(int) file.length()];
int position = 0;
do {
final int length = bis.read(buffer, position, Math.min((int) file.length() - position, BUFFERSIZE));
if (length < 0) {
break;
}
position += length;
} while (position < file.length());
final ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
if (bais.skip(file.length() - 33) != file.length() - 33) {
return false;
}
final BufferedReader reader = new BufferedReader(new InputStreamReader(bais));
try {
String hash = reader.readLine();
if (hash != null && hash.matches("#[a-f0-9]{32}")) {
hash = hash.substring(1);
bais.reset();
final String versionline = reader.readLine();
if (versionline != null && versionline.matches("#version: .+")) {
final String versioncheck = versionline.substring(10);
if (!versioncheck.equalsIgnoreCase(version)) {
bais.reset();
final MessageDigest digest = getDigest();
final DigestInputStream digestStream = new DigestInputStream(bais, digest);
try {
final byte[] bytes = new byte[(int) file.length() - 33];
digestStream.read(bytes);
final BigInteger correct = new BigInteger(hash, 16);
final BigInteger test = new BigInteger(1, digest.digest());
if (correct.equals(test)) {
return true;
} else {
Bukkit.getLogger().warning("File " + file.toString() + " has been modified by user and file version differs, please update the file manually.");
}
} finally {
digestStream.close();
}
}
}
}
} finally {
reader.close();
}
} finally {
bis.close();
}
return false;
}
public static MessageDigest getDigest() throws IOException
{
try
{
return MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException ex)
{
throw new IOException(ex);
}
}
public static MessageDigest getDigest() throws IOException {
try {
return MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException ex) {
throw new IOException(ex);
}
}
public List<String> getLines()
{
try
{
final BufferedReader reader = new BufferedReader(new FileReader(file));
try
{
final List<String> lines = new ArrayList<String>();
do
{
final String line = reader.readLine();
if (line == null)
{
break;
}
else
{
lines.add(line);
}
}
while (true);
return lines;
}
finally
{
reader.close();
}
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
return Collections.emptyList();
}
}
public List<String> getLines() {
try {
final BufferedReader reader = new BufferedReader(new FileReader(file));
try {
final List<String> lines = new ArrayList<String>();
do {
final String line = reader.readLine();
if (line == null) {
break;
} else {
lines.add(line);
}
} while (true);
return lines;
} finally {
reader.close();
}
} catch (IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
return Collections.emptyList();
}
}
}
@@ -0,0 +1,581 @@
package com.earth2me.essentials;
import com.earth2me.essentials.textreader.BookInput;
import com.earth2me.essentials.textreader.BookPager;
import com.earth2me.essentials.textreader.IText;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.FormatUtil;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.NumberUtil;
import com.google.common.base.Joiner;
import net.ess3.api.IEssentials;
import net.ess3.nms.refl.ReflUtil;
import org.apache.commons.lang.ArrayUtils;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.FireworkEffect;
import org.bukkit.Material;
import org.bukkit.block.Banner;
import org.bukkit.block.banner.PatternType;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.*;
import org.bukkit.potion.Potion;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.lang.reflect.Method;
import java.util.*;
import java.util.logging.Level;
import java.util.regex.Pattern;
import static com.earth2me.essentials.I18n.tl;
public class MetaItemStack {
private static final Map<String, DyeColor> colorMap = new HashMap<>();
private static final Map<String, FireworkEffect.Type> fireworkShape = new HashMap<>();
static {
for (DyeColor color : DyeColor.values()) {
colorMap.put(color.name(), color);
}
for (FireworkEffect.Type type : FireworkEffect.Type.values()) {
fireworkShape.put(type.name(), type);
}
}
private final transient Pattern splitPattern = Pattern.compile("[:+',;.]");
private ItemStack stack;
private FireworkEffect.Builder builder = FireworkEffect.builder();
private PotionEffectType pEffectType;
private PotionEffect pEffect;
private boolean validFirework = false;
private boolean validPotionEffect = false;
private boolean validPotionDuration = false;
private boolean validPotionPower = false;
private boolean isSplashPotion = false;
private boolean completePotion = false;
private int power = 1;
private int duration = 120;
public MetaItemStack(final ItemStack stack) {
this.stack = stack.clone();
}
public ItemStack getItemStack() {
return stack;
}
public boolean isValidFirework() {
return validFirework;
}
public boolean isValidPotion() {
return validPotionEffect && validPotionDuration && validPotionPower;
}
public FireworkEffect.Builder getFireworkBuilder() {
return builder;
}
public PotionEffect getPotionEffect() {
return pEffect;
}
public boolean completePotion() {
return completePotion;
}
private void resetPotionMeta() {
pEffect = null;
pEffectType = null;
validPotionEffect = false;
validPotionDuration = false;
validPotionPower = false;
isSplashPotion = false;
completePotion = true;
}
public boolean canSpawn(final IEssentials ess) {
try {
ess.getServer().getUnsafe().modifyItemStack(stack.clone(), "{}");
return true;
} catch (NullPointerException npe) {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "Itemstack is invalid", npe);
}
return false;
} catch (NoSuchMethodError nsme) {
return true;
} catch (Throwable throwable) {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "Itemstack is invalid", throwable);
}
return false;
}
}
public void parseStringMeta(final CommandSource sender, final boolean allowUnsafe, String[] string, int fromArg, final IEssentials ess) throws Exception {
if (string[fromArg].startsWith("{") && hasMetaPermission(sender, "vanilla", false, true, ess)) {
try {
stack = ess.getServer().getUnsafe().modifyItemStack(stack, Joiner.on(' ').join(Arrays.asList(string).subList(fromArg, string.length)));
} catch (NullPointerException npe) {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "Itemstack is invalid", npe);
}
} catch (NoSuchMethodError nsme) {
throw new Exception(tl("noMetaJson"), nsme);
} catch (Throwable throwable) {
throw new Exception(throwable.getMessage(), throwable);
}
} else {
for (int i = fromArg; i < string.length; i++) {
addStringMeta(sender, allowUnsafe, string[i], ess);
}
if (validFirework) {
if (!hasMetaPermission(sender, "firework", true, true, ess)) {
throw new Exception(tl("noMetaFirework"));
}
FireworkEffect effect = builder.build();
FireworkMeta fmeta = (FireworkMeta) stack.getItemMeta();
fmeta.addEffect(effect);
if (fmeta.getEffects().size() > 1 && !hasMetaPermission(sender, "firework-multiple", true, true, ess)) {
throw new Exception(tl("multipleCharges"));
}
stack.setItemMeta(fmeta);
}
}
}
public void addStringMeta(final CommandSource sender, final boolean allowUnsafe, final String string, final IEssentials ess) throws Exception {
final String[] split = splitPattern.split(string, 2);
if (split.length < 1) {
return;
}
Material WRITTEN_BOOK = EnumUtil.getMaterial("WRITTEN_BOOK");
if (split.length > 1 && split[0].equalsIgnoreCase("name") && hasMetaPermission(sender, "name", false, true, ess)) {
final String displayName = FormatUtil.replaceFormat(split[1].replace('_', ' '));
final ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(displayName);
stack.setItemMeta(meta);
} else if (split.length > 1 && (split[0].equalsIgnoreCase("lore") || split[0].equalsIgnoreCase("desc")) && hasMetaPermission(sender, "lore", false, true, ess)) {
final List<String> lore = new ArrayList<String>();
for (String line : split[1].split("\\|")) {
lore.add(FormatUtil.replaceFormat(line.replace('_', ' ')));
}
final ItemMeta meta = stack.getItemMeta();
meta.setLore(lore);
stack.setItemMeta(meta);
} else if (split[0].equalsIgnoreCase("unbreakable") && hasMetaPermission(sender, "unbreakable", false, true, ess)) {
boolean value = split.length > 1 ? Boolean.valueOf(split[1]) : true;
setUnbreakable(stack, value);
} else if (split.length > 1 && (split[0].equalsIgnoreCase("player") || split[0].equalsIgnoreCase("owner")) && hasMetaPermission(sender, "head", false, true, ess)) {
if (MaterialUtil.isPlayerHead(stack.getType(), stack.getDurability())) {
final String owner = split[1];
final SkullMeta meta = (SkullMeta) stack.getItemMeta();
meta.setOwningPlayer(ess.getServer().getOfflinePlayer(owner));
stack.setItemMeta(meta);
} else {
throw new Exception(tl("onlyPlayerSkulls"));
}
} else if (split.length > 1 && split[0].equalsIgnoreCase("book") && stack.getType() == WRITTEN_BOOK && (hasMetaPermission(sender, "book", true, true, ess) || hasMetaPermission(sender, "chapter-" + split[1].toLowerCase(Locale.ENGLISH), true, true, ess))) {
final BookMeta meta = (BookMeta) stack.getItemMeta();
final IText input = new BookInput("book", true, ess);
final BookPager pager = new BookPager(input);
List<String> pages = pager.getPages(split[1]);
meta.setPages(pages);
stack.setItemMeta(meta);
} else if (split.length > 1 && split[0].equalsIgnoreCase("author") && stack.getType() == WRITTEN_BOOK && hasMetaPermission(sender, "author", false, true, ess)) {
final String author = FormatUtil.replaceFormat(split[1]);
final BookMeta meta = (BookMeta) stack.getItemMeta();
meta.setAuthor(author);
stack.setItemMeta(meta);
} else if (split.length > 1 && split[0].equalsIgnoreCase("title") && stack.getType() == WRITTEN_BOOK && hasMetaPermission(sender, "title", false, true, ess)) {
final String title = FormatUtil.replaceFormat(split[1].replace('_', ' '));
final BookMeta meta = (BookMeta) stack.getItemMeta();
meta.setTitle(title);
stack.setItemMeta(meta);
} else if (split.length > 1 && split[0].equalsIgnoreCase("power") && (MaterialUtil.isFirework(stack.getType()))&& hasMetaPermission(sender, "firework-power", false, true, ess)) {
final int power = NumberUtil.isInt(split[1]) ? Integer.parseInt(split[1]) : 0;
final FireworkMeta meta = (FireworkMeta) stack.getItemMeta();
meta.setPower(power > 3 ? 4 : power);
stack.setItemMeta(meta);
} else if (split.length > 1 && split[0].equalsIgnoreCase("itemflags") && hasMetaPermission(sender, "itemflags", false, true, ess)) {
addItemFlags(string);
} else if (MaterialUtil.isFirework(stack.getType())) {//WARNING - Meta for fireworks will be ignored after this point.
addFireworkMeta(sender, false, string, ess);
} else if (MaterialUtil.isPotion(stack.getType())) { //WARNING - Meta for potions will be ignored after this point.
addPotionMeta(sender, false, string, ess);
} else if (MaterialUtil.isBanner(stack.getType())) {
//WARNING - Meta for banners will be ignored after this point.
addBannerMeta(sender, false, string, ess);
} else if (split.length > 1 && (split[0].equalsIgnoreCase("color") || split[0].equalsIgnoreCase("colour")) && MaterialUtil.isLeatherArmor(stack.getType())) {
final String[] color = split[1].split("(\\||,)");
if (color.length == 1 && (NumberUtil.isInt(color[0]) || color[0].startsWith("#"))) {
// Either integer or hexadecimal
final LeatherArmorMeta meta = (LeatherArmorMeta) stack.getItemMeta();
String input = color[0];
if (input.startsWith("#")) { // Hex
meta.setColor(Color.fromRGB(
Integer.valueOf(input.substring(1, 3), 16),
Integer.valueOf(input.substring(3, 5), 16),
Integer.valueOf(input.substring(5, 7), 16)));
} else { // Int
meta.setColor(Color.fromRGB(Integer.parseInt(input)));
}
stack.setItemMeta(meta);
} else if (color.length == 3) { // r,g,b
final int red = NumberUtil.isInt(color[0]) ? Integer.parseInt(color[0]) : 0;
final int green = NumberUtil.isInt(color[1]) ? Integer.parseInt(color[1]) : 0;
final int blue = NumberUtil.isInt(color[2]) ? Integer.parseInt(color[2]) : 0;
final LeatherArmorMeta meta = (LeatherArmorMeta) stack.getItemMeta();
meta.setColor(Color.fromRGB(red, green, blue));
stack.setItemMeta(meta);
} else {
throw new Exception(tl("leatherSyntax"));
}
} else {
parseEnchantmentStrings(sender, allowUnsafe, split, ess);
}
}
public void addItemFlags(final String string) throws Exception {
String[] separate = splitPattern.split(string, 2);
if (separate.length != 2) {
throw new Exception(tl("invalidItemFlagMeta", string));
}
String[] split = separate[1].split(",");
ItemMeta meta = stack.getItemMeta();
for (String s : split) {
for (ItemFlag flag : ItemFlag.values()) {
if (s.equalsIgnoreCase(flag.name())) {
meta.addItemFlags(flag);
}
}
}
if (meta.getItemFlags().isEmpty()) {
throw new Exception(tl("invalidItemFlagMeta", string));
}
stack.setItemMeta(meta);
}
public void addFireworkMeta(final CommandSource sender, final boolean allowShortName, final String string, final IEssentials ess) throws Exception {
if (MaterialUtil.isFirework(stack.getType())) {
final String[] split = splitPattern.split(string, 2);
if (split.length < 2) {
return;
}
if (split[0].equalsIgnoreCase("color") || split[0].equalsIgnoreCase("colour") || (allowShortName && split[0].equalsIgnoreCase("c"))) {
if (validFirework) {
if (!hasMetaPermission(sender, "firework", true, true, ess)) {
throw new Exception(tl("noMetaFirework"));
}
FireworkEffect effect = builder.build();
FireworkMeta fmeta = (FireworkMeta) stack.getItemMeta();
fmeta.addEffect(effect);
if (fmeta.getEffects().size() > 1 && !hasMetaPermission(sender, "firework-multiple", true, true, ess)) {
throw new Exception(tl("multipleCharges"));
}
stack.setItemMeta(fmeta);
builder = FireworkEffect.builder();
}
List<Color> primaryColors = new ArrayList<Color>();
String[] colors = split[1].split(",");
for (String color : colors) {
if (colorMap.containsKey(color.toUpperCase())) {
validFirework = true;
primaryColors.add(colorMap.get(color.toUpperCase()).getFireworkColor());
} else {
throw new Exception(tl("invalidFireworkFormat", split[1], split[0]));
}
}
builder.withColor(primaryColors);
} else if (split[0].equalsIgnoreCase("shape") || split[0].equalsIgnoreCase("type") || (allowShortName && (split[0].equalsIgnoreCase("s") || split[0].equalsIgnoreCase("t")))) {
FireworkEffect.Type finalEffect = null;
split[1] = (split[1].equalsIgnoreCase("large") ? "BALL_LARGE" : split[1]);
if (fireworkShape.containsKey(split[1].toUpperCase())) {
finalEffect = fireworkShape.get(split[1].toUpperCase());
} else {
throw new Exception(tl("invalidFireworkFormat", split[1], split[0]));
}
if (finalEffect != null) {
builder.with(finalEffect);
}
} else if (split[0].equalsIgnoreCase("fade") || (allowShortName && split[0].equalsIgnoreCase("f"))) {
List<Color> fadeColors = new ArrayList<Color>();
String[] colors = split[1].split(",");
for (String color : colors) {
if (colorMap.containsKey(color.toUpperCase())) {
fadeColors.add(colorMap.get(color.toUpperCase()).getFireworkColor());
} else {
throw new Exception(tl("invalidFireworkFormat", split[1], split[0]));
}
}
if (!fadeColors.isEmpty()) {
builder.withFade(fadeColors);
}
} else if (split[0].equalsIgnoreCase("effect") || (allowShortName && split[0].equalsIgnoreCase("e"))) {
String[] effects = split[1].split(",");
for (String effect : effects) {
if (effect.equalsIgnoreCase("twinkle")) {
builder.flicker(true);
} else if (effect.equalsIgnoreCase("trail")) {
builder.trail(true);
} else {
throw new Exception(tl("invalidFireworkFormat", split[1], split[0]));
}
}
}
}
}
public void addPotionMeta(final CommandSource sender, final boolean allowShortName, final String string, final IEssentials ess) throws Exception {
if (MaterialUtil.isPotion(stack.getType())) {
final String[] split = splitPattern.split(string, 2);
if (split.length < 2) {
return;
}
if (split[0].equalsIgnoreCase("effect") || (allowShortName && split[0].equalsIgnoreCase("e"))) {
pEffectType = Potions.getByName(split[1]);
if (pEffectType != null && pEffectType.getName() != null) {
if (hasMetaPermission(sender, "potions." + pEffectType.getName().toLowerCase(Locale.ENGLISH), true, false, ess)) {
validPotionEffect = true;
} else {
throw new Exception(tl("noPotionEffectPerm", pEffectType.getName().toLowerCase(Locale.ENGLISH)));
}
} else {
throw new Exception(tl("invalidPotionMeta", split[1]));
}
} else if (split[0].equalsIgnoreCase("power") || (allowShortName && split[0].equalsIgnoreCase("p"))) {
if (NumberUtil.isInt(split[1])) {
validPotionPower = true;
power = Integer.parseInt(split[1]);
if (power > 0 && power < 4) {
power -= 1;
}
} else {
throw new Exception(tl("invalidPotionMeta", split[1]));
}
} else if (split[0].equalsIgnoreCase("duration") || (allowShortName && split[0].equalsIgnoreCase("d"))) {
if (NumberUtil.isInt(split[1])) {
validPotionDuration = true;
duration = Integer.parseInt(split[1]) * 20; //Duration is in ticks by default, converted to seconds
} else {
throw new Exception(tl("invalidPotionMeta", split[1]));
}
} else if (split[0].equalsIgnoreCase("splash") || (allowShortName && split[0].equalsIgnoreCase("s"))) {
isSplashPotion = Boolean.valueOf(split[1]);
}
if (isValidPotion()) {
PotionMeta pmeta = (PotionMeta) stack.getItemMeta();
pEffect = pEffectType.createEffect(duration, power);
if (pmeta.getCustomEffects().size() > 1 && !hasMetaPermission(sender, "potions.multiple", true, false, ess)) {
throw new Exception(tl("multiplePotionEffects"));
}
pmeta.addCustomEffect(pEffect, true);
stack.setItemMeta(pmeta);
if (ReflUtil.getNmsVersionObject().isHigherThanOrEqualTo(ReflUtil.V1_9_R1)) {
if (isSplashPotion && stack.getType() != Material.SPLASH_POTION) {
stack.setType(Material.SPLASH_POTION);
} else if (!isSplashPotion && stack.getType() != Material.POTION) {
stack.setType(Material.POTION);
}
} else {
Potion potion = Potion.fromItemStack(stack);
potion.setSplash(isSplashPotion);
potion.apply(stack);
}
resetPotionMeta();
}
}
}
private void parseEnchantmentStrings(final CommandSource sender, final boolean allowUnsafe, final String[] split, final IEssentials ess) throws Exception {
final Enchantment enchantment = Enchantments.getByName(split[0]);
if (enchantment == null || !hasMetaPermission(sender, "enchantments." + enchantment.getName().toLowerCase(Locale.ENGLISH), false, false, ess)) {
return;
}
int level = -1;
if (split.length > 1) {
try {
level = Integer.parseInt(split[1]);
} catch (NumberFormatException ex) {
level = -1;
}
}
if (level < 0 || (!allowUnsafe && level > enchantment.getMaxLevel())) {
level = enchantment.getMaxLevel();
}
addEnchantment(sender, allowUnsafe, enchantment, level);
}
public void addEnchantment(final CommandSource sender, final boolean allowUnsafe, final Enchantment enchantment, final int level) throws Exception {
if (enchantment == null) {
throw new Exception(tl("enchantmentNotFound"));
}
try {
if (stack.getType().equals(Material.ENCHANTED_BOOK)) {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) stack.getItemMeta();
if (level == 0) {
meta.removeStoredEnchant(enchantment);
} else {
meta.addStoredEnchant(enchantment, level, allowUnsafe);
}
stack.setItemMeta(meta);
} else // all other material types besides ENCHANTED_BOOK
{
if (level == 0) {
stack.removeEnchantment(enchantment);
} else {
if (allowUnsafe) {
stack.addUnsafeEnchantment(enchantment, level);
} else {
stack.addEnchantment(enchantment, level);
}
}
}
} catch (Exception ex) {
throw new Exception("Enchantment " + enchantment.getName() + ": " + ex.getMessage(), ex);
}
}
public Enchantment getEnchantment(final User user, final String name) throws Exception {
final Enchantment enchantment = Enchantments.getByName(name);
if (enchantment == null) {
return null;
}
final String enchantmentName = enchantment.getName().toLowerCase(Locale.ENGLISH);
if (!hasMetaPermission(user, "enchantments." + enchantmentName, true, false)) {
throw new Exception(tl("enchantmentPerm", enchantmentName));
}
return enchantment;
}
public void addBannerMeta(final CommandSource sender, final boolean allowShortName, final String string, final IEssentials ess) throws Exception {
if (MaterialUtil.isBanner(stack.getType()) && !stack.getType().toString().equals("SHIELD") && string != null) {
final String[] split = splitPattern.split(string, 2);
if (split.length < 2) {
throw new Exception(tl("invalidBanner", split[1]));
}
PatternType patternType = null;
try {
patternType = PatternType.valueOf(split[0]);
} catch (Exception ignored ) {}
final BannerMeta meta = (BannerMeta) stack.getItemMeta();
if (split[0].equalsIgnoreCase("basecolor")) {
Color color = Color.fromRGB(Integer.valueOf(split[1]));
meta.setBaseColor(DyeColor.getByColor(color));
} else if (patternType != null) {
PatternType type = PatternType.valueOf(split[0]);
DyeColor color = DyeColor.getByColor(Color.fromRGB(Integer.valueOf(split[1])));
org.bukkit.block.banner.Pattern pattern = new org.bukkit.block.banner.Pattern(color, type);
meta.addPattern(pattern);
}
stack.setItemMeta(meta);
} else if (stack.getType().toString().equals("SHIELD") && string != null) {
final String[] split = splitPattern.split(string, 2);
if (split.length < 2) {
throw new Exception(tl("invalidBanner", split[1]));
}
PatternType patternType = null;
try {
patternType = PatternType.valueOf(split[0]);
} catch (Exception ignored ) {}
// Hacky fix for accessing Shield meta - https://github.com/drtshock/Essentials/pull/745#issuecomment-234843795
BlockStateMeta meta = (BlockStateMeta) stack.getItemMeta();
Banner banner = (Banner) meta.getBlockState();
if (split[0].equalsIgnoreCase("basecolor")) {
Color color = Color.fromRGB(Integer.valueOf(split[1]));
banner.setBaseColor(DyeColor.getByColor(color));
} else if (patternType != null) {
PatternType type = PatternType.valueOf(split[0]);
DyeColor color = DyeColor.getByColor(Color.fromRGB(Integer.valueOf(split[1])));
org.bukkit.block.banner.Pattern pattern = new org.bukkit.block.banner.Pattern(color, type);
banner.addPattern(pattern);
}
banner.update();
meta.setBlockState(banner);
stack.setItemMeta(meta);
}
}
private boolean hasMetaPermission(final CommandSource sender, final String metaPerm, final boolean graceful, final boolean includeBase, final IEssentials ess) throws Exception {
final User user = sender != null && sender.isPlayer() ? ess.getUser(sender.getPlayer()) : null;
return hasMetaPermission(user, metaPerm, graceful, includeBase);
}
private boolean hasMetaPermission(final User user, final String metaPerm, final boolean graceful, final boolean includeBase) throws Exception {
final String permBase = includeBase ? "essentials.itemspawn.meta-" : "essentials.";
if (user == null || user.isAuthorized(permBase + metaPerm)) {
return true;
}
if (graceful) {
return false;
} else {
throw new Exception(tl("noMetaPerm", metaPerm));
}
}
private static int bukkitUnbreakableSupport = -1;
private static Method spigotMethod;
private static Method setUnbreakableMethod;
private void setUnbreakable(ItemStack is, boolean unbreakable) {
ItemMeta meta = is.getItemMeta();
try {
if (bukkitUnbreakableSupport == -1) {
try {
ItemMeta.class.getDeclaredMethod("setUnbreakable", boolean.class);
bukkitUnbreakableSupport = 1;
} catch (NoSuchMethodException | SecurityException ex) {
bukkitUnbreakableSupport = 0;
}
}
if (bukkitUnbreakableSupport == 1) {
meta.setUnbreakable(unbreakable);
} else {
if (spigotMethod == null) {
spigotMethod = meta.getClass().getDeclaredMethod("spigot");
spigotMethod.setAccessible(true);
}
Object itemStackSpigot = spigotMethod.invoke(meta);
if (setUnbreakableMethod == null) {
setUnbreakableMethod = itemStackSpigot.getClass().getDeclaredMethod("setUnbreakable", Boolean.TYPE);
setUnbreakableMethod.setAccessible(true);
}
setUnbreakableMethod.invoke(itemStackSpigot, unbreakable);
}
is.setItemMeta(meta);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
+154 -101
View File
@@ -1,120 +1,173 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public enum Mob
{
CHICKEN("Chicken", Enemies.FRIENDLY, EntityType.CHICKEN),
COW("Cow", Enemies.FRIENDLY, EntityType.COW),
CREEPER("Creeper", Enemies.ENEMY, EntityType.CREEPER),
GHAST("Ghast", Enemies.ENEMY, EntityType.GHAST),
GIANT("Giant", Enemies.ENEMY, EntityType.GIANT),
PIG("Pig", Enemies.FRIENDLY, EntityType.PIG),
PIGZOMB("PigZombie", Enemies.NEUTRAL, EntityType.PIG_ZOMBIE),
SHEEP("Sheep", Enemies.FRIENDLY, "", EntityType.SHEEP),
SKELETON("Skeleton", Enemies.ENEMY, EntityType.SKELETON),
SLIME("Slime", Enemies.ENEMY, EntityType.SLIME),
SPIDER("Spider", Enemies.ENEMY, EntityType.SPIDER),
SQUID("Squid", Enemies.FRIENDLY, EntityType.SQUID),
ZOMBIE("Zombie", Enemies.ENEMY, EntityType.ZOMBIE),
WOLF("Wolf", Enemies.NEUTRAL, EntityType.WOLF),
CAVESPIDER("CaveSpider", Enemies.ENEMY, EntityType.CAVE_SPIDER),
ENDERMAN("Enderman", Enemies.ENEMY, "", EntityType.ENDERMAN),
SILVERFISH("Silverfish", Enemies.ENEMY, "", EntityType.SILVERFISH),
ENDERDRAGON("EnderDragon", Enemies.ENEMY, EntityType.ENDER_DRAGON),
VILLAGER("Villager", Enemies.FRIENDLY, EntityType.VILLAGER),
BLAZE("Blaze", Enemies.ENEMY, EntityType.BLAZE),
MUSHROOMCOW("MushroomCow", Enemies.FRIENDLY, EntityType.MUSHROOM_COW),
MAGMACUBE("MagmaCube", Enemies.ENEMY, EntityType.MAGMA_CUBE),
SNOWMAN("Snowman", Enemies.FRIENDLY, "", EntityType.SNOWMAN),
OCELOT("Ocelot", Enemies.NEUTRAL, EntityType.OCELOT),
IRONGOLEM("IronGolem", Enemies.NEUTRAL, EntityType.IRON_GOLEM);
public static final Logger logger = Logger.getLogger("Minecraft");
// Suffixes can be appended on the end of a mob name to make it plural
// Entities without a suffix, will default to 's'
public enum Mob {
CHICKEN("Chicken", Enemies.FRIENDLY, EntityType.CHICKEN),
COW("Cow", Enemies.FRIENDLY, EntityType.COW),
CREEPER("Creeper", Enemies.ENEMY, EntityType.CREEPER),
GHAST("Ghast", Enemies.ENEMY, EntityType.GHAST),
GIANT("Giant", Enemies.ENEMY, EntityType.GIANT),
HORSE("Horse", Enemies.FRIENDLY, EntityType.HORSE),
PIG("Pig", Enemies.FRIENDLY, EntityType.PIG),
PIGZOMB("PigZombie", Enemies.NEUTRAL, EntityType.PIG_ZOMBIE),
SHEEP("Sheep", Enemies.FRIENDLY, "", EntityType.SHEEP),
SKELETON("Skeleton", Enemies.ENEMY, EntityType.SKELETON),
SLIME("Slime", Enemies.ENEMY, EntityType.SLIME),
SPIDER("Spider", Enemies.ENEMY, EntityType.SPIDER),
SQUID("Squid", Enemies.FRIENDLY, EntityType.SQUID),
ZOMBIE("Zombie", Enemies.ENEMY, EntityType.ZOMBIE),
WOLF("Wolf", Enemies.NEUTRAL, "", EntityType.WOLF),
CAVESPIDER("CaveSpider", Enemies.ENEMY, EntityType.CAVE_SPIDER),
ENDERMAN("Enderman", Enemies.ENEMY, "", EntityType.ENDERMAN),
SILVERFISH("Silverfish", Enemies.ENEMY, "", EntityType.SILVERFISH),
ENDERDRAGON("EnderDragon", Enemies.ENEMY, EntityType.ENDER_DRAGON),
VILLAGER("Villager", Enemies.FRIENDLY, EntityType.VILLAGER),
BLAZE("Blaze", Enemies.ENEMY, EntityType.BLAZE),
MUSHROOMCOW("MushroomCow", Enemies.FRIENDLY, EntityType.MUSHROOM_COW),
MAGMACUBE("MagmaCube", Enemies.ENEMY, EntityType.MAGMA_CUBE),
SNOWMAN("Snowman", Enemies.FRIENDLY, "", EntityType.SNOWMAN),
OCELOT("Ocelot", Enemies.NEUTRAL, EntityType.OCELOT),
IRONGOLEM("IronGolem", Enemies.NEUTRAL, EntityType.IRON_GOLEM),
WITHER("Wither", Enemies.ENEMY, EntityType.WITHER),
BAT("Bat", Enemies.FRIENDLY, EntityType.BAT),
WITCH("Witch", Enemies.ENEMY, EntityType.WITCH),
BOAT("Boat", Enemies.NEUTRAL, EntityType.BOAT),
MINECART("Minecart", Enemies.NEUTRAL, EntityType.MINECART),
MINECART_CHEST("ChestMinecart", Enemies.NEUTRAL, EntityType.MINECART_CHEST),
MINECART_FURNACE("FurnaceMinecart", Enemies.NEUTRAL, EntityType.MINECART_FURNACE),
MINECART_TNT("TNTMinecart", Enemies.NEUTRAL, EntityType.MINECART_TNT),
MINECART_HOPPER("HopperMinecart", Enemies.NEUTRAL, EntityType.MINECART_HOPPER),
MINECART_MOB_SPAWNER("SpawnerMinecart", Enemies.NEUTRAL, EntityType.MINECART_MOB_SPAWNER),
ENDERCRYSTAL("EnderCrystal", Enemies.NEUTRAL, EntityType.ENDER_CRYSTAL),
EXPERIENCEORB("ExperienceOrb", Enemies.NEUTRAL, "EXPERIENCE_ORB"),
ARMOR_STAND("ArmorStand", Enemies.NEUTRAL, "ARMOR_STAND"),
ENDERMITE("Endermite", Enemies.ENEMY, "ENDERMITE"),
GUARDIAN("Guardian", Enemies.ENEMY, "GUARDIAN"),
ELDER_GUARDIAN("ElderGuardian", Enemies.ENEMY, "ELDER_GUARDIAN"),
RABBIT("Rabbit", Enemies.FRIENDLY, "RABBIT"),
SHULKER("Shulker", Enemies.ENEMY, "SHULKER"),
POLAR_BEAR("PolarBear", Enemies.NEUTRAL, "POLAR_BEAR"),
WITHER_SKELETON("WitherSkeleton", Enemies.ENEMY, "WITHER_SKELETON"),
STRAY_SKELETON("StraySkeleton", Enemies.ENEMY, "STRAY"),
ZOMBIE_VILLAGER("ZombieVillager", Enemies.FRIENDLY, "ZOMBIE_VILLAGER"),
SKELETON_HORSE("SkeletonHorse", Enemies.FRIENDLY, "SKELETON_HORSE"),
ZOMBIE_HORSE("ZombieHorse", Enemies.FRIENDLY, "ZOMBIE_HORSE"),
DONKEY("Donkey", Enemies.FRIENDLY, "DONKEY"),
MULE("Mule", Enemies.FRIENDLY, "MULE"),
EVOKER("Evoker", Enemies.ENEMY, "EVOKER"),
VEX("Vex", Enemies.ENEMY, "VEX"),
VINDICATOR("Vindicator", Enemies.ENEMY, "VINDICATOR"),
LLAMA("Llama", Enemies.NEUTRAL, "LLAMA"),
HUSK("Husk", Enemies.ENEMY, "HUSK"),
ILLUSIONER("Illusioner", Enemies.ENEMY, "ILLUSIONER"),
PARROT("Parrot", Enemies.NEUTRAL, "PARROT"),
TURTLE("Turtle", Enemies.NEUTRAL, "TURTLE"),
PHANTOM("Phantom", Enemies.ENEMY, "PHANTOM"),
COD("Cod", Enemies.NEUTRAL, "COD"),
SALMON("Salmon", Enemies.NEUTRAL, "SALMON"),
PUFFERFISH("Pufferfish", Enemies.NEUTRAL, "PUFFERFISH"),
TROPICAL_FISH("TropicalFish", Enemies.NEUTRAL, "TROPICAL_FISH"),
DROWNED("Drowned", Enemies.ENEMY, "DROWNED"),
DOLPHIN("Dolphin", Enemies.NEUTRAL, "DOLPHIN"),
;
private Mob(String n, Enemies en, String s, EntityType type)
{
this.suffix = s;
this.name = n;
this.type = en;
this.bukkitType = type;
}
public static final Logger logger = Logger.getLogger("Essentials");
private Mob(String n, Enemies en, EntityType type)
{
this.name = n;
this.type = en;
this.bukkitType = type;
}
public String suffix = "s";
final public String name;
final public Enemies type;
final private EntityType bukkitType;
private static final Map<String, Mob> hashMap = new HashMap<String, Mob>();
Mob(String n, Enemies en, String s, EntityType type) {
this.suffix = s;
this.name = n;
this.type = en;
this.bukkitType = type;
}
static
{
for (Mob mob : Mob.values())
{
hashMap.put(mob.name.toLowerCase(Locale.ENGLISH), mob);
}
}
public static Set<String> getMobList() {
return Collections.unmodifiableSet(hashMap.keySet());
}
Mob(String n, Enemies en, EntityType type) {
this.name = n;
this.type = en;
this.bukkitType = type;
}
public LivingEntity spawn(final Player player, final Server server, final Location loc) throws MobException
{
final LivingEntity entity = player.getWorld().spawn(loc, (Class<? extends LivingEntity>)this.bukkitType.getEntityClass());
if (entity == null)
{
logger.log(Level.WARNING, _("unableToSpawnMob"));
throw new MobException();
}
return entity;
}
Mob(String n, Enemies en, String typeName) {
this.name = n;
this.type = en;
EntityType entityType;
try {
entityType = EntityType.valueOf(typeName);
} catch (IllegalArgumentException ignored) {
entityType = null;
}
bukkitType = entityType;
}
public String suffix = "s";
final public String name;
final public Enemies type;
final private EntityType bukkitType;
private static final Map<String, Mob> hashMap = new HashMap<>();
private static final Map<EntityType, Mob> bukkitMap = new HashMap<>();
static {
for (Mob mob : Mob.values()) {
hashMap.put(mob.name.toLowerCase(Locale.ENGLISH), mob);
if (mob.bukkitType != null) {
bukkitMap.put(mob.bukkitType, mob);
}
}
}
public static Set<String> getMobList() {
return Collections.unmodifiableSet(hashMap.keySet());
}
public Entity spawn(final World world, final Server server, final Location loc) throws MobException {
final Entity entity = world.spawn(loc, this.bukkitType.getEntityClass());
if (entity == null) {
logger.log(Level.WARNING, tl("unableToSpawnMob"));
throw new MobException();
}
return entity;
}
public enum Enemies
{
FRIENDLY("friendly"),
NEUTRAL("neutral"),
ENEMY("enemy");
public enum Enemies {
FRIENDLY("friendly"),
NEUTRAL("neutral"),
ENEMY("enemy");
private Enemies(final String type)
{
this.type = type;
}
final protected String type;
}
Enemies(final String type) {
this.type = type;
}
public EntityType getType()
{
return bukkitType;
}
final protected String type;
}
public static Mob fromName(final String name)
{
return hashMap.get(name.toLowerCase(Locale.ENGLISH));
}
public EntityType getType() {
return bukkitType;
}
public static Mob fromName(final String name) {
return hashMap.get(name.toLowerCase(Locale.ENGLISH));
}
public static Mob fromBukkitType(final EntityType type) {
return bukkitMap.get(type);
}
public static class MobException extends Exception
{
private static final long serialVersionUID = 1L;
}
public static class MobException extends Exception {
private static final long serialVersionUID = 1L;
}
}
@@ -0,0 +1,271 @@
package com.earth2me.essentials;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.utils.StringUtil;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.entity.*;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Colorable;
import java.util.*;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public enum MobData {
BABY_AGEABLE("baby", Ageable.class, Data.BABY, true),
ADULT_AGEABLE("adult", Ageable.class, Data.ADULT, true),
BABY_PIG("piglet", EntityType.PIG, Data.BABY, false),
BABY_WOLF("puppy", EntityType.WOLF, Data.BABY, false),
BABY_CHICKEN("chick", EntityType.CHICKEN, Data.BABY, false),
BABY_HORSE("colt", EntityType.HORSE, Data.BABY, false),
BABY_OCELOT("kitten", EntityType.OCELOT, Data.BABY, false),
BABY_SHEEP("lamb", EntityType.SHEEP, Data.BABY, false),
BABY_COW("calf", EntityType.COW.getEntityClass(), Data.BABY, false),
BABY_VILLAGER("child", EntityType.VILLAGER, Data.BABY, false),
TAMED_TAMEABLE("tamed", Tameable.class, Data.TAMED, true),
TAME_TAMEABLE("tame", Tameable.class, Data.TAMED, false),
RANDOM_SHEEP("random", EntityType.SHEEP, Data.COLORABLE, true),
COLORABLE_SHEEP("", StringUtil.joinList(DyeColor.values()).toLowerCase(Locale.ENGLISH), EntityType.SHEEP, Data.COLORABLE, true),
POLKA_HORSE("polka", EntityType.HORSE, Horse.Style.BLACK_DOTS, true),
SOOTY_HORSE("sooty", EntityType.HORSE, Horse.Style.BLACK_DOTS, false),
BLAZE_HORSE("blaze", EntityType.HORSE, Horse.Style.WHITE, true),
SOCKS_HORSE("socks", EntityType.HORSE, Horse.Style.WHITE, false),
LEOPARD_HORSE("leopard", EntityType.HORSE, Horse.Style.WHITE_DOTS, true),
APPALOOSA_HORSE("appaloosa", EntityType.HORSE, Horse.Style.WHITE_DOTS, false),
PAINT_HORSE("paint", EntityType.HORSE, Horse.Style.WHITEFIELD, true),
MILKY_HORSE("milky", EntityType.HORSE, Horse.Style.WHITEFIELD, false),
SPLOTCHY_HORSE("splotchy", EntityType.HORSE, Horse.Style.WHITEFIELD, false),
BLACK_HORSE("black", EntityType.HORSE, Horse.Color.BLACK, true),
CHESTNUT_HORSE("chestnut", EntityType.HORSE, Horse.Color.CHESTNUT, true),
LIVER_HORSE("liver", EntityType.HORSE, Horse.Color.CHESTNUT, false),
CREAMY_HORSE("creamy", EntityType.HORSE, Horse.Color.CREAMY, true),
FLAXEN_HORSE("flaxen", EntityType.HORSE, Horse.Color.CREAMY, false),
GRAY_HORSE("gray", EntityType.HORSE, Horse.Color.GRAY, true),
DAPPLE_HORSE("dapple", EntityType.HORSE, Horse.Color.GRAY, false),
BUCKSKIN_HORSE("buckskin", EntityType.HORSE, Horse.Color.DARK_BROWN, true),
DARKBROWN_HORSE("darkbrown", EntityType.HORSE, Horse.Color.DARK_BROWN, false),
DARK_HORSE("dark", EntityType.HORSE, Horse.Color.DARK_BROWN, false),
DBROWN_HORSE("dbrown", EntityType.HORSE, Horse.Color.DARK_BROWN, false),
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),
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),
ORANGE_CAT("orange", EntityType.OCELOT, Ocelot.Type.RED_CAT, false),
TABBY_CAT("tabby", EntityType.OCELOT, Ocelot.Type.RED_CAT, false),
BLACK_CAT("black", EntityType.OCELOT, Ocelot.Type.BLACK_CAT, true),
TUXEDO_CAT("tuxedo", EntityType.OCELOT, Ocelot.Type.BLACK_CAT, false),
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),
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),
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),
BOW_SKELETON("bow", EntityType.SKELETON, Material.BOW, true),
POWERED_CREEPER("powered", EntityType.CREEPER, Data.ELECTRIFIED, true),
ELECTRIC_CREEPER("electric", EntityType.CREEPER, Data.ELECTRIFIED, false),
CHARGED_CREEPER("charged", EntityType.CREEPER, Data.ELECTRIFIED, false),
SADDLE_PIG("saddle", EntityType.PIG, Data.PIGSADDLE, true),
ANGRY_WOLF("angry", EntityType.WOLF, Data.ANGRY, true),
RABID_WOLF("rabid", EntityType.WOLF, Data.ANGRY, false),
FARMER_VILLAGER("farmer", EntityType.VILLAGER, Villager.Profession.FARMER, true),
LIBRARIAN_VILLAGER("librarian", EntityType.VILLAGER, Villager.Profession.LIBRARIAN, true),
PRIEST_VILLAGER("priest", EntityType.VILLAGER, Villager.Profession.PRIEST, true),
FATHER_VILLAGER("father", EntityType.VILLAGER, Villager.Profession.PRIEST, false),
SMITH_VILLAGER("smith", EntityType.VILLAGER, Villager.Profession.BLACKSMITH, true),
BUTCHER_VILLAGER("butcher", EntityType.VILLAGER, Villager.Profession.BUTCHER, true),
SIZE_SLIME("", "<1-100>", EntityType.SLIME.getEntityClass(), Data.SIZE, true),
NUM_EXPERIENCE_ORB("", "<1-2000000000>", EntityType.EXPERIENCE_ORB, Data.EXP, true),
RED_PARROT("red", EntityType.PARROT, Parrot.Variant.RED, true),
GREEN_PARROT("green", EntityType.PARROT, Parrot.Variant.GREEN, true),
BLUE_PARROT("blue", EntityType.PARROT, Parrot.Variant.BLUE, true),
CYAN_PARROT("cyan", EntityType.PARROT, Parrot.Variant.CYAN, true),
GRAY_PARROT("gray", EntityType.PARROT, Parrot.Variant.GRAY, true),
KOB_TROPICAL_FISH("kob", EntityType.TROPICAL_FISH, TropicalFish.Pattern.KOB, true),
SUNSTREAK_TROPICAL_FISH("sunstreak", EntityType.TROPICAL_FISH, TropicalFish.Pattern.SUNSTREAK, true),
SNOOPER_TROPICAL_FISH("snooper", EntityType.TROPICAL_FISH, TropicalFish.Pattern.SNOOPER, true),
DASHER_TROPICAL_FISH("dasher", EntityType.TROPICAL_FISH, TropicalFish.Pattern.DASHER, true),
BRINELY_TROPICAL_FISH("brinely", EntityType.TROPICAL_FISH, TropicalFish.Pattern.BRINELY, true),
SPOTTY_TROPICAL_FISH("spotty", EntityType.TROPICAL_FISH, TropicalFish.Pattern.SPOTTY, true),
FLOPPER_TROPICAL_FISH("flopper", EntityType.TROPICAL_FISH, TropicalFish.Pattern.FLOPPER, true),
STRIPEY_TROPICAL_FISH("stripey", EntityType.TROPICAL_FISH, TropicalFish.Pattern.STRIPEY, true),
GLITTER_TROPICAL_FISH("glitter", EntityType.TROPICAL_FISH, TropicalFish.Pattern.GLITTER, true),
BLOCKFISH_TROPICAL_FISH("blockfish", EntityType.TROPICAL_FISH, TropicalFish.Pattern.BLOCKFISH, true),
BETTY_TROPICAL_FISH("betty", EntityType.TROPICAL_FISH, TropicalFish.Pattern.BETTY, true),
CLAYFISH_TROPICAL_FISH("clayfish", EntityType.TROPICAL_FISH, TropicalFish.Pattern.CLAYFISH, true);
;
public enum Data {
ADULT,
BABY,
CHEST,
ADULTZOMBIE,
BABYZOMBIE,
HORSESADDLE,
PIGSADDLE,
ELECTRIFIED,
ANGRY,
TAMED,
COLORABLE,
EXP,
SIZE
}
public static final Logger logger = Logger.getLogger("Essentials");
MobData(String n, Object type, Object value, boolean isPublic) {
this.nickname = n;
this.matched = n;
this.helpMessage = n;
this.type = type;
this.value = value;
this.isPublic = isPublic;
}
MobData(String n, String h, Object type, Object value, boolean isPublic) {
this.nickname = n;
this.matched = n;
this.helpMessage = h;
this.type = type;
this.value = value;
this.isPublic = isPublic;
}
final private String nickname;
final private String helpMessage;
final private Object type;
final private Object value;
final private boolean isPublic;
private String matched;
public static LinkedHashMap<String, MobData> getPossibleData(final Entity spawned, boolean publicOnly) {
LinkedHashMap<String, MobData> mobList = new LinkedHashMap<String, MobData>();
for (MobData data : MobData.values()) {
if (data.type instanceof EntityType && spawned.getType().equals(data.type) && ((publicOnly && data.isPublic) || !publicOnly)) {
mobList.put(data.nickname.toLowerCase(Locale.ENGLISH), data);
} else if (data.type instanceof Class && ((Class) data.type).isAssignableFrom(spawned.getClass()) && ((publicOnly && data.isPublic) || !publicOnly)) {
mobList.put(data.nickname.toLowerCase(Locale.ENGLISH), data);
}
}
return mobList;
}
public static List<String> getValidHelp(final Entity spawned) {
List<String> output = new ArrayList<String>();
LinkedHashMap<String, MobData> posData = getPossibleData(spawned, true);
for (MobData data : posData.values()) {
output.add(data.helpMessage);
}
return output;
}
public static MobData fromData(final Entity spawned, final String name) {
if (name.isEmpty()) {
return null;
}
LinkedHashMap<String, MobData> posData = getPossibleData(spawned, false);
for (String data : posData.keySet()) {
if (name.contains(data)) {
return posData.get(data);
}
}
return null;
}
public String getMatched() {
return this.matched;
}
public void setData(final Entity spawned, final Player target, final String rawData) throws Exception {
if (this.value.equals(Data.ANGRY)) {
((Wolf) spawned).setAngry(true);
} else if (this.value.equals(Data.ADULT)) {
((Ageable) spawned).setAdult();
} else if (this.value.equals(Data.BABY)) {
((Ageable) spawned).setBaby();
} else if (this.value.equals(Data.ADULTZOMBIE)) {
((Zombie) spawned).setBaby(false);
} else if (this.value.equals(Data.BABYZOMBIE)) {
((Zombie) spawned).setBaby(true);
} else if (this.value.equals(Data.ELECTRIFIED)) {
((Creeper) spawned).setPowered(true);
} else if (this.value.equals(Data.HORSESADDLE)) {
final Horse horse = ((Horse) spawned);
horse.setTamed(true);
horse.setOwner(target);
horse.getInventory().setSaddle(new ItemStack(Material.SADDLE, 1));
} else if (this.value.equals(Data.PIGSADDLE)) {
((Pig) spawned).setSaddle(true);
} else if (this.value.equals(Data.TAMED)) {
final Tameable tameable = ((Tameable) spawned);
tameable.setTamed(true);
tameable.setOwner(target);
} else if (this.value.equals(Data.COLORABLE)) {
final String color = rawData.toUpperCase(Locale.ENGLISH);
try {
if (color.equals("RANDOM")) {
final Random rand = new Random();
((Colorable) spawned).setColor(DyeColor.values()[rand.nextInt(DyeColor.values().length)]);
} else if (!color.isEmpty()) {
((Colorable) spawned).setColor(DyeColor.valueOf(color));
}
this.matched = rawData;
} catch (Exception e) {
throw new Exception(tl("sheepMalformedColor"), e);
}
} else if (this.value.equals(Data.EXP)) {
try {
((ExperienceOrb) spawned).setExperience(Integer.parseInt(rawData));
this.matched = rawData;
} catch (NumberFormatException e) {
throw new Exception(tl("invalidNumber"), e);
}
} else if (this.value.equals(Data.SIZE)) {
try {
((Slime) spawned).setSize(Integer.parseInt(rawData));
this.matched = rawData;
} catch (NumberFormatException e) {
throw new Exception(tl("slimeMalformedSize"), e);
}
} else if (this.value instanceof Horse.Color) {
((Horse) spawned).setColor((Horse.Color) this.value);
} else if (this.value instanceof Horse.Style) {
((Horse) spawned).setStyle((Horse.Style) this.value);
} else if (this.value instanceof Ocelot.Type) {
((Ocelot) spawned).setCatType((Ocelot.Type) this.value);
} else if (this.value instanceof Villager.Profession) {
((Villager) spawned).setProfession((Villager.Profession) this.value);
} else if (this.value instanceof Material) {
if (this.type.equals(EntityType.HORSE)) {
((Horse) spawned).setTamed(true);
((Horse) spawned).getInventory().setArmor(new ItemStack((Material) this.value, 1));
} else if (this.type.equals(EntityType.ZOMBIE.getEntityClass()) || this.type.equals(EntityType.SKELETON)) {
final EntityEquipment invent = ((LivingEntity) spawned).getEquipment();
InventoryWorkaround.setItemInMainHand(invent, new ItemStack((Material) this.value, 1));
InventoryWorkaround.setItemInMainHandDropChance(invent, 0.1f);
}
} else if (this.value instanceof Parrot.Variant) {
((Parrot) spawned).setVariant((Parrot.Variant) this.value);
} else if (this.value instanceof TropicalFish.Pattern) {
((TropicalFish) spawned).setPattern((TropicalFish.Pattern) this.value);
}
}
}
File diff suppressed because it is too large. Load diff
@@ -1,38 +1,35 @@
package com.earth2me.essentials;
import lombok.Delegate;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.entity.Entity;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permissible;
import org.bukkit.permissions.ServerOperator;
public class PlayerExtension implements Player
{
@Delegate(types =
{
Player.class, Entity.class, CommandSender.class, ServerOperator.class,
HumanEntity.class, ConfigurationSerializable.class, LivingEntity.class,
Permissible.class
})
protected Player base;
public class PlayerExtension {
protected Player base;
public PlayerExtension(final Player base)
{
this.base = base;
}
public PlayerExtension(final Player base) {
this.base = base;
}
public final Player getBase()
{
return base;
}
public final Player getBase() {
return base;
}
public final Player setBase(final Player base)
{
return this.base = base;
}
public final Player setBase(final Player base) {
return this.base = base;
}
public Server getServer() {
return base.getServer();
}
public World getWorld() {
return base.getWorld();
}
public Location getLocation() {
return base.getLocation();
}
}
@@ -0,0 +1,123 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.FormatUtil;
import org.bukkit.Server;
import java.util.*;
import static com.earth2me.essentials.I18n.tl;
public class PlayerList {
// Cosmetic list formatting
public static String listUsers(final IEssentials ess, final List<User> users, final String seperator) {
final StringBuilder groupString = new StringBuilder();
Collections.sort(users);
boolean needComma = false;
for (User user : users) {
if (needComma) {
groupString.append(seperator);
}
needComma = true;
if (user.isAfk()) {
groupString.append(tl("listAfkTag"));
}
if (user.isHidden()) {
groupString.append(tl("listHiddenTag"));
}
user.setDisplayNick();
groupString.append(user.getDisplayName());
groupString.append("\u00a7f");
}
return groupString.toString();
}
// Produce a user summary: There are 5 out of maximum 10 players online.
public static String listSummary(final IEssentials ess, final User user, final boolean showHidden) {
Server server = ess.getServer();
int playerHidden = 0;
int hiddenCount = 0;
for (User onlinePlayer : ess.getOnlineUsers()) {
if (onlinePlayer.isHidden() || (user != null && !user.getBase().canSee(onlinePlayer.getBase()))) {
playerHidden++;
if (showHidden || user.getBase().canSee(onlinePlayer.getBase())) {
hiddenCount++;
}
}
}
String online;
if (hiddenCount > 0) {
online = tl("listAmountHidden", ess.getOnlinePlayers().size() - playerHidden, hiddenCount, server.getMaxPlayers());
} else {
online = tl("listAmount", ess.getOnlinePlayers().size() - playerHidden, server.getMaxPlayers());
}
return online;
}
// Build the basic player list, divided by groups.
public static Map<String, List<User>> getPlayerLists(final IEssentials ess, final User sender, final boolean showHidden) {
Server server = ess.getServer();
final Map<String, List<User>> playerList = new HashMap<String, List<User>>();
for (User onlineUser : ess.getOnlineUsers()) {
if ((sender == null && !showHidden && onlineUser.isHidden()) || (sender != null && !showHidden && !sender.getBase().canSee(onlineUser.getBase()))) {
continue;
}
final String group = FormatUtil.stripFormat(FormatUtil.stripEssentialsFormat(onlineUser.getGroup().toLowerCase()));
List<User> list = playerList.get(group);
if (list == null) {
list = new ArrayList<User>();
playerList.put(group, list);
}
list.add(onlineUser);
}
return playerList;
}
// Handle the merging of groups
public static List<User> getMergedList(final IEssentials ess, final Map<String, List<User>> playerList, final String groupName) {
final Set<String> configGroups = ess.getSettings().getListGroupConfig().keySet();
final List<User> users = new ArrayList<User>();
for (String configGroup : configGroups) {
if (configGroup.equalsIgnoreCase(groupName)) {
String[] groupValues = ess.getSettings().getListGroupConfig().get(configGroup).toString().trim().split(" ");
for (String groupValue : groupValues) {
groupValue = groupValue.toLowerCase(Locale.ENGLISH);
if (groupValue == null || groupValue.isEmpty()) {
continue;
}
List<User> u = playerList.get(groupValue.trim());
if (u == null || u.isEmpty()) {
continue;
}
playerList.remove(groupValue);
users.addAll(u);
}
}
}
return users;
}
// Output a playerlist of just a single group, /list <groupname>
public static String listGroupUsers(final IEssentials ess, final Map<String, List<User>> playerList, final String groupName) throws Exception {
final List<User> users = getMergedList(ess, playerList, groupName);
final List<User> groupUsers = playerList.get(groupName);
if (groupUsers != null && !groupUsers.isEmpty()) {
users.addAll(groupUsers);
}
if (users == null || users.isEmpty()) {
throw new Exception(tl("groupDoesNotExist"));
}
final StringBuilder displayGroupName = new StringBuilder();
displayGroupName.append(Character.toTitleCase(groupName.charAt(0)));
displayGroupName.append(groupName.substring(1));
return outputFormat(displayGroupName.toString(), listUsers(ess, users, ", "));
}
// Build the output string
public static String outputFormat(final String group, final String message) {
final StringBuilder outputString = new StringBuilder();
outputString.append(tl("listGroupTag", FormatUtil.replaceFormat(group)));
outputString.append(message);
return outputString.toString();
}
}
@@ -0,0 +1,19 @@
package com.earth2me.essentials;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public class PlayerTarget implements ITarget {
private final String name;
public PlayerTarget(Player entity) {
this.name = entity.getName();
}
@Override
public Location getLocation() {
return Bukkit.getServer().getPlayerExact(name).getLocation();
}
}
@@ -0,0 +1,149 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.NumberUtil;
import org.bukkit.potion.PotionEffectType;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Potions {
private static final Map<String, PotionEffectType> POTIONS = new HashMap<>();
private static final Map<String, PotionEffectType> ALIASPOTIONS = new HashMap<>();
static {
POTIONS.put("speed", PotionEffectType.SPEED);
ALIASPOTIONS.put("fast", PotionEffectType.SPEED);
ALIASPOTIONS.put("runfast", PotionEffectType.SPEED);
ALIASPOTIONS.put("sprint", PotionEffectType.SPEED);
ALIASPOTIONS.put("swift", PotionEffectType.SPEED);
POTIONS.put("slowness", PotionEffectType.SLOW);
ALIASPOTIONS.put("slow", PotionEffectType.SLOW);
ALIASPOTIONS.put("sluggish", PotionEffectType.SLOW);
POTIONS.put("haste", PotionEffectType.FAST_DIGGING);
ALIASPOTIONS.put("superpick", PotionEffectType.FAST_DIGGING);
ALIASPOTIONS.put("quickmine", PotionEffectType.FAST_DIGGING);
ALIASPOTIONS.put("digspeed", PotionEffectType.FAST_DIGGING);
ALIASPOTIONS.put("digfast", PotionEffectType.FAST_DIGGING);
ALIASPOTIONS.put("sharp", PotionEffectType.FAST_DIGGING);
POTIONS.put("fatigue", PotionEffectType.SLOW_DIGGING);
ALIASPOTIONS.put("slow", PotionEffectType.SLOW_DIGGING);
ALIASPOTIONS.put("dull", PotionEffectType.SLOW_DIGGING);
POTIONS.put("strength", PotionEffectType.INCREASE_DAMAGE);
ALIASPOTIONS.put("strong", PotionEffectType.INCREASE_DAMAGE);
ALIASPOTIONS.put("bull", PotionEffectType.INCREASE_DAMAGE);
ALIASPOTIONS.put("attack", PotionEffectType.INCREASE_DAMAGE);
POTIONS.put("heal", PotionEffectType.HEAL);
ALIASPOTIONS.put("healthy", PotionEffectType.HEAL);
ALIASPOTIONS.put("instaheal", PotionEffectType.HEAL);
POTIONS.put("harm", PotionEffectType.HARM);
ALIASPOTIONS.put("harming", PotionEffectType.HARM);
ALIASPOTIONS.put("injure", PotionEffectType.HARM);
ALIASPOTIONS.put("damage", PotionEffectType.HARM);
ALIASPOTIONS.put("inflict", PotionEffectType.HARM);
POTIONS.put("jump", PotionEffectType.JUMP);
ALIASPOTIONS.put("leap", PotionEffectType.JUMP);
POTIONS.put("nausea", PotionEffectType.CONFUSION);
ALIASPOTIONS.put("sick", PotionEffectType.CONFUSION);
ALIASPOTIONS.put("sickness", PotionEffectType.CONFUSION);
ALIASPOTIONS.put("confusion", PotionEffectType.CONFUSION);
POTIONS.put("regeneration", PotionEffectType.REGENERATION);
ALIASPOTIONS.put("regen", PotionEffectType.REGENERATION);
POTIONS.put("resistance", PotionEffectType.DAMAGE_RESISTANCE);
ALIASPOTIONS.put("dmgresist", PotionEffectType.DAMAGE_RESISTANCE);
ALIASPOTIONS.put("armor", PotionEffectType.DAMAGE_RESISTANCE);
POTIONS.put("fireresist", PotionEffectType.FIRE_RESISTANCE);
ALIASPOTIONS.put("fireresistance", PotionEffectType.FIRE_RESISTANCE);
ALIASPOTIONS.put("resistfire", PotionEffectType.FIRE_RESISTANCE);
POTIONS.put("waterbreath", PotionEffectType.WATER_BREATHING);
ALIASPOTIONS.put("waterbreathing", PotionEffectType.WATER_BREATHING);
POTIONS.put("invisibility", PotionEffectType.INVISIBILITY);
ALIASPOTIONS.put("invisible", PotionEffectType.INVISIBILITY);
ALIASPOTIONS.put("invis", PotionEffectType.INVISIBILITY);
ALIASPOTIONS.put("vanish", PotionEffectType.INVISIBILITY);
ALIASPOTIONS.put("disappear", PotionEffectType.INVISIBILITY);
POTIONS.put("blindness", PotionEffectType.BLINDNESS);
ALIASPOTIONS.put("blind", PotionEffectType.BLINDNESS);
POTIONS.put("nightvision", PotionEffectType.NIGHT_VISION);
ALIASPOTIONS.put("vision", PotionEffectType.NIGHT_VISION);
POTIONS.put("hunger", PotionEffectType.HUNGER);
ALIASPOTIONS.put("hungry", PotionEffectType.HUNGER);
ALIASPOTIONS.put("starve", PotionEffectType.HUNGER);
POTIONS.put("weakness", PotionEffectType.WEAKNESS);
ALIASPOTIONS.put("weak", PotionEffectType.WEAKNESS);
POTIONS.put("poison", PotionEffectType.POISON);
ALIASPOTIONS.put("venom", PotionEffectType.POISON);
POTIONS.put("wither", PotionEffectType.WITHER);
ALIASPOTIONS.put("decay", PotionEffectType.WITHER);
POTIONS.put("healthboost", PotionEffectType.HEALTH_BOOST);
ALIASPOTIONS.put("boost", PotionEffectType.HEALTH_BOOST);
POTIONS.put("absorption", PotionEffectType.ABSORPTION);
ALIASPOTIONS.put("absorb", PotionEffectType.ABSORPTION);
POTIONS.put("saturation", PotionEffectType.SATURATION);
ALIASPOTIONS.put("food", PotionEffectType.SATURATION);
POTIONS.put("waterbreathing", PotionEffectType.WATER_BREATHING);
ALIASPOTIONS.put("underwaterbreathing", PotionEffectType.WATER_BREATHING);
ALIASPOTIONS.put("waterbreath", PotionEffectType.WATER_BREATHING);
ALIASPOTIONS.put("underwaterbreath", PotionEffectType.WATER_BREATHING);
ALIASPOTIONS.put("air", PotionEffectType.WATER_BREATHING);
// 1.9
try {
POTIONS.put("glowing", PotionEffectType.GLOWING);
ALIASPOTIONS.put("glow", PotionEffectType.GLOWING);
POTIONS.put("levitation", PotionEffectType.LEVITATION);
ALIASPOTIONS.put("levitate", PotionEffectType.LEVITATION);
POTIONS.put("luck", PotionEffectType.LUCK);
POTIONS.put("unluck", PotionEffectType.UNLUCK);
} catch (Throwable ignored) {}
}
public static PotionEffectType getByName(String name) {
PotionEffectType peffect;
if (NumberUtil.isInt(name)) {
peffect = PotionEffectType.getById(Integer.parseInt(name));
} else {
peffect = PotionEffectType.getByName(name.toUpperCase(Locale.ENGLISH));
}
if (peffect == null) {
peffect = POTIONS.get(name.toLowerCase(Locale.ENGLISH));
}
if (peffect == null) {
peffect = ALIASPOTIONS.get(name.toLowerCase(Locale.ENGLISH));
}
return peffect;
}
public static Set<Entry<String, PotionEffectType>> entrySet() {
return POTIONS.entrySet();
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,268 @@
package com.earth2me.essentials;
import com.earth2me.essentials.Mob.MobException;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.utils.LocationUtil;
import com.earth2me.essentials.utils.StringUtil;
import net.ess3.api.IEssentials;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.block.Block;
import org.bukkit.entity.*;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import java.util.*;
import static com.earth2me.essentials.I18n.tl;
public class SpawnMob {
public static String mobList(final User user) {
final Set<String> mobList = Mob.getMobList();
final Set<String> availableList = new HashSet<String>();
for (String mob : mobList) {
if (user.isAuthorized("essentials.spawnmob." + mob.toLowerCase(Locale.ENGLISH))) {
availableList.add(mob);
}
}
if (availableList.isEmpty()) {
availableList.add(tl("none"));
}
return StringUtil.joinList(availableList);
}
public static List<String> mobParts(final String mobString) {
String[] mobParts = mobString.split(",");
List<String> mobs = new ArrayList<String>();
for (String mobPart : mobParts) {
String[] mobDatas = mobPart.split(":");
mobs.add(mobDatas[0]);
}
return mobs;
}
public static List<String> mobData(final String mobString) {
String[] mobParts = mobString.split(",");
List<String> mobData = new ArrayList<String>();
for (String mobPart : mobParts) {
String[] mobDatas = mobPart.split(":");
if (mobDatas.length == 1) {
if (mobPart.contains(":")) {
mobData.add("");
} else {
mobData.add(null);
}
} else {
mobData.add(mobDatas[1]);
}
}
return mobData;
}
// This method spawns a mob where the user is looking, owned by user
public static void spawnmob(final IEssentials ess, final Server server, final User user, final List<String> parts, final List<String> data, int mobCount) throws Exception {
final Block block = LocationUtil.getTarget(user.getBase()).getBlock();
if (block == null) {
throw new Exception(tl("unableToSpawnMob"));
}
spawnmob(ess, server, user.getSource(), user, block.getLocation(), parts, data, mobCount);
}
// This method spawns a mob at target, owned by target
public static void spawnmob(final IEssentials ess, final Server server, final CommandSource sender, final User target, final List<String> parts, final List<String> data, int mobCount) throws Exception {
spawnmob(ess, server, sender, target, target.getLocation(), parts, data, mobCount);
}
// This method spawns a mob at loc, owned by target
public static void spawnmob(final IEssentials ess, final Server server, final CommandSource sender, final User target, final Location loc, final List<String> parts, final List<String> data, int mobCount) throws Exception {
final Location sloc = LocationUtil.getSafeDestination(loc);
for (int i = 0; i < parts.size(); i++) {
Mob mob = Mob.fromName(parts.get(i));
checkSpawnable(ess, sender, mob);
}
final int serverLimit = ess.getSettings().getSpawnMobLimit();
int effectiveLimit = serverLimit / parts.size();
if (effectiveLimit < 1) {
effectiveLimit = 1;
while (parts.size() > serverLimit) {
parts.remove(serverLimit);
}
}
if (mobCount > effectiveLimit) {
mobCount = effectiveLimit;
sender.sendMessage(tl("mobSpawnLimit"));
}
Mob mob = Mob.fromName(parts.get(0)); // Get the first mob
try {
for (int i = 0; i < mobCount; i++) {
spawnMob(ess, server, sender, target, sloc, parts, data);
}
sender.sendMessage(mobCount * parts.size() + " " + mob.name.toLowerCase(Locale.ENGLISH) + mob.suffix + " " + tl("spawned"));
} catch (MobException e1) {
throw new Exception(tl("unableToSpawnMob"), e1);
} catch (NumberFormatException e2) {
throw new Exception(tl("numberRequired"), e2);
} catch (NullPointerException np) {
throw new Exception(tl("soloMob"), np);
}
}
private static void spawnMob(final IEssentials ess, final Server server, final CommandSource sender, final User target, final Location sloc, List<String> parts, List<String> data) throws Exception {
Mob mob;
Entity spawnedMob = null;
Entity spawnedMount;
for (int i = 0; i < parts.size(); i++) {
if (i == 0) {
mob = Mob.fromName(parts.get(i));
spawnedMob = mob.spawn(sloc.getWorld(), server, sloc);
defaultMobData(mob.getType(), spawnedMob);
if (data.get(i) != null) {
changeMobData(sender, mob.getType(), spawnedMob, data.get(i).toLowerCase(Locale.ENGLISH), target);
}
}
int next = (i + 1);
if (next < parts.size()) //If it's the last mob in the list, don't set the mount
{
Mob mMob = Mob.fromName(parts.get(next));
spawnedMount = mMob.spawn(sloc.getWorld(), server, sloc);
defaultMobData(mMob.getType(), spawnedMount);
if (data.get(next) != null) {
changeMobData(sender, mMob.getType(), spawnedMount, data.get(next).toLowerCase(Locale.ENGLISH), target);
}
spawnedMob.setPassenger(spawnedMount);
spawnedMob = spawnedMount;
}
}
}
private static void checkSpawnable(IEssentials ess, CommandSource sender, Mob mob) throws Exception {
if (mob == null || mob.getType() == null) {
throw new Exception(tl("invalidMob"));
}
if (ess.getSettings().getProtectPreventSpawn(mob.getType().toString().toLowerCase(Locale.ENGLISH))) {
throw new Exception(tl("disabledToSpawnMob"));
}
if (sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.spawnmob." + mob.name.toLowerCase(Locale.ENGLISH))) {
throw new Exception(tl("noPermToSpawnMob"));
}
}
private static void changeMobData(final CommandSource sender, final EntityType type, final Entity spawned, final String inputData, final User target) throws Exception {
String data = inputData;
if (data.isEmpty()) {
sender.sendMessage(tl("mobDataList", StringUtil.joinList(MobData.getValidHelp(spawned))));
}
if (spawned instanceof Zombie) {
((Zombie) spawned).setBaby(false);
} else if (spawned instanceof Ageable) {
((Ageable) spawned).setAdult();
}
if (spawned instanceof Zombie || type == EntityType.SKELETON) {
if (inputData.contains("armor") || inputData.contains("armour")) {
final EntityEquipment invent = ((LivingEntity) spawned).getEquipment();
if (inputData.contains("noarmor") || inputData.contains("noarmour")) {
invent.clear();
} else if (inputData.contains("diamond")) {
invent.setBoots(new ItemStack(Material.DIAMOND_BOOTS, 1));
invent.setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS, 1));
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));
} else if (inputData.contains("leather")) {
invent.setBoots(new ItemStack(Material.LEATHER_BOOTS, 1));
invent.setLeggings(new ItemStack(Material.LEATHER_LEGGINGS, 1));
invent.setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE, 1));
invent.setHelmet(new ItemStack(Material.LEATHER_HELMET, 1));
} else if (inputData.contains("iron")) {
invent.setBoots(new ItemStack(Material.IRON_BOOTS, 1));
invent.setLeggings(new ItemStack(Material.IRON_LEGGINGS, 1));
invent.setChestplate(new ItemStack(Material.IRON_CHESTPLATE, 1));
invent.setHelmet(new ItemStack(Material.IRON_HELMET, 1));
}
invent.setBootsDropChance(0f);
invent.setLeggingsDropChance(0f);
invent.setChestplateDropChance(0f);
invent.setHelmetDropChance(0f);
}
}
MobData newData = MobData.fromData(spawned, data);
while (newData != null) {
newData.setData(spawned, target.getBase(), data);
data = data.replace(newData.getMatched(), "");
newData = MobData.fromData(spawned, data);
}
}
private static void defaultMobData(final EntityType type, final Entity spawned) {
if (type == EntityType.SKELETON) {
final EntityEquipment invent = ((LivingEntity) spawned).getEquipment();
InventoryWorkaround.setItemInMainHand(invent, new ItemStack(Material.BOW, 1));
InventoryWorkaround.setItemInMainHandDropChance(invent, 0.1f);
invent.setBoots(new ItemStack(Material.GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
if (type == EntityType.PIG_ZOMBIE) {
final PigZombie zombie = ((PigZombie) spawned);
setVillager(zombie, false);
final EntityEquipment invent = zombie.getEquipment();
InventoryWorkaround.setItemInMainHand(invent, new ItemStack(Material.GOLDEN_SWORD, 1));
InventoryWorkaround.setItemInMainHandDropChance(invent, 0.1f);
invent.setBoots(new ItemStack(Material.GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
if (type == EntityType.ZOMBIE) {
final Zombie zombie = ((Zombie) spawned);
setVillager(zombie, false);
final EntityEquipment invent = zombie.getEquipment();
invent.setBoots(new ItemStack(Material.GOLDEN_BOOTS, 1));
invent.setBootsDropChance(0.0f);
}
if (type == EntityType.HORSE) {
((Horse) spawned).setJumpStrength(1.2);
}
}
@SuppressWarnings("deprecation")
private static void setVillager(Zombie zombie, boolean villager) {
try {
zombie.setVillager(villager);
} catch (Exception ignored) {
}
}
}
@@ -1,5 +1,6 @@
package com.earth2me.essentials;
import net.ess3.api.IEssentials;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -7,55 +8,45 @@ import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent;
public class TNTExplodeListener implements Listener, Runnable
{
private final transient IEssentials ess;
private transient boolean enabled = false;
private transient int timer = -1;
public class TNTExplodeListener implements Listener, Runnable {
private final transient IEssentials ess;
private transient boolean enabled = false;
private transient int timer = -1;
public TNTExplodeListener(final IEssentials ess)
{
super();
this.ess = ess;
}
public TNTExplodeListener(final IEssentials ess) {
super();
this.ess = ess;
}
public void enable()
{
if (!enabled)
{
enabled = true;
timer = ess.scheduleSyncDelayedTask(this, 1000);
return;
}
if (timer != -1)
{
ess.getScheduler().cancelTask(timer);
timer = ess.scheduleSyncDelayedTask(this, 1000);
}
}
public void enable() {
if (!enabled) {
enabled = true;
timer = ess.scheduleSyncDelayedTask(this, 200);
return;
}
if (timer != -1) {
ess.getScheduler().cancelTask(timer);
timer = ess.scheduleSyncDelayedTask(this, 200);
}
}
@EventHandler(priority = EventPriority.LOW)
public void onEntityExplode(final EntityExplodeEvent event)
{
if (!enabled)
{
return;
}
if (event.getEntity() instanceof LivingEntity)
{
return;
}
if (event.blockList().size() < 1)
{
return;
}
event.setCancelled(true);
event.getLocation().getWorld().createExplosion(event.getLocation(), 0F);
}
@EventHandler(priority = EventPriority.LOW)
public void onEntityExplode(final EntityExplodeEvent event) {
if (!enabled) {
return;
}
if (event.getEntity() instanceof LivingEntity) {
return;
}
if (event.blockList().size() < 1) {
return;
}
event.setCancelled(true);
event.getLocation().getWorld().createExplosion(event.getLocation(), 0F);
}
@Override
public void run()
{
enabled = false;
}
@Override
public void run() {
enabled = false;
}
}
@@ -1,300 +1,297 @@
package com.earth2me.essentials;
import com.earth2me.essentials.api.ITeleport;
import static com.earth2me.essentials.I18n._;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.logging.Logger;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.LocationUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.IUser;
import net.ess3.api.events.UserWarpEvent;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Teleport implements Runnable, ITeleport
{
private static final double MOVE_CONSTANT = 0.3;
import static com.earth2me.essentials.I18n.tl;
private static class Target
{
private final Location location;
private final Entity entity;
public class Teleport implements net.ess3.api.ITeleport {
private final IUser teleportOwner;
private final IEssentials ess;
private TimedTeleport timedTeleport;
public Target(Location location)
{
this.location = location;
this.entity = null;
}
private TeleportType tpType;
public Target(Entity entity)
{
this.entity = entity;
this.location = null;
}
public Teleport(IUser user, IEssentials ess) {
this.teleportOwner = user;
this.ess = ess;
tpType = TeleportType.NORMAL;
}
public Location getLocation()
{
if (this.entity != null)
{
return this.entity.getLocation();
}
return location;
}
}
private IUser user;
private int teleTimer = -1;
private long started; // time this task was initiated
private long delay; // how long to delay the teleport
private int health;
// note that I initially stored a clone of the location for reference, but...
// when comparing locations, I got incorrect mismatches (rounding errors, looked like)
// so, the X/Y/Z values are stored instead and rounded off
private long initX;
private long initY;
private long initZ;
private Target teleportTarget;
private Trade chargeFor;
private final IEssentials ess;
private static final Logger logger = Logger.getLogger("Minecraft");
private TeleportCause cause;
public enum TeleportType {
TPA,
BACK,
NORMAL
}
private void initTimer(long delay, Target target, Trade chargeFor, TeleportCause cause)
{
this.started = System.currentTimeMillis();
this.delay = delay;
this.health = user.getHealth();
this.initX = Math.round(user.getLocation().getX() * MOVE_CONSTANT);
this.initY = Math.round(user.getLocation().getY() * MOVE_CONSTANT);
this.initZ = Math.round(user.getLocation().getZ() * MOVE_CONSTANT);
this.teleportTarget = target;
this.chargeFor = chargeFor;
this.cause = cause;
}
public void cooldown(boolean check) throws Exception {
final Calendar time = new GregorianCalendar();
if (teleportOwner.getLastTeleportTimestamp() > 0) {
// Take the current time, and remove the delay from it.
final double cooldown = ess.getSettings().getTeleportCooldown();
final Calendar earliestTime = new GregorianCalendar();
earliestTime.add(Calendar.SECOND, -(int) cooldown);
earliestTime.add(Calendar.MILLISECOND, -(int) ((cooldown * 1000.0) % 1000.0));
// This value contains the most recent time a teleportPlayer could have been used that would allow another use.
final long earliestLong = earliestTime.getTimeInMillis();
@Override
public void run()
{
// When was the last teleportPlayer used?
final Long lastTime = teleportOwner.getLastTeleportTimestamp();
if (user == null || !user.isOnline() || user.getLocation() == null)
{
cancel();
return;
}
if (Math.round(user.getLocation().getX() * MOVE_CONSTANT) != initX
|| Math.round(user.getLocation().getY() * MOVE_CONSTANT) != initY
|| Math.round(user.getLocation().getZ() * MOVE_CONSTANT) != initZ
|| user.getHealth() < health)
{ // user moved, cancel teleport
cancel(true);
return;
}
if (lastTime > time.getTimeInMillis()) {
// This is to make sure time didn't get messed up on last teleportPlayer use.
// If this happens, let's give the user the benifit of the doubt.
teleportOwner.setLastTeleportTimestamp(time.getTimeInMillis());
return;
} else if (lastTime > earliestLong
&& cooldownApplies()) {
time.setTimeInMillis(lastTime);
time.add(Calendar.SECOND, (int) cooldown);
time.add(Calendar.MILLISECOND, (int) ((cooldown * 1000.0) % 1000.0));
throw new Exception(tl("timeBeforeTeleport", DateUtil.formatDateDiff(time.getTimeInMillis())));
}
}
// if justCheck is set, don't update lastTeleport; we're just checking
if (!check) {
teleportOwner.setLastTeleportTimestamp(time.getTimeInMillis());
}
}
health = user.getHealth(); // in case user healed, then later gets injured
private boolean cooldownApplies() {
boolean applies = true;
String globalBypassPerm = "essentials.teleport.cooldown.bypass";
switch (tpType) {
case NORMAL:
applies = !teleportOwner.isAuthorized(globalBypassPerm);
break;
case BACK:
applies = !(teleportOwner.isAuthorized(globalBypassPerm) &&
teleportOwner.isAuthorized("essentials.teleport.cooldown.bypass.back"));
break;
case TPA:
applies = !(teleportOwner.isAuthorized(globalBypassPerm) &&
teleportOwner.isAuthorized("essentials.teleport.cooldown.bypass.tpa"));
break;
}
return applies;
}
long now = System.currentTimeMillis();
if (now > started + delay)
{
try
{
cooldown(false);
user.sendMessage(_("teleportationCommencing"));
try
{
private void warnUser(final IUser user, final double delay) {
Calendar c = new GregorianCalendar();
c.add(Calendar.SECOND, (int) delay);
c.add(Calendar.MILLISECOND, (int) ((delay * 1000.0) % 1000.0));
user.sendMessage(tl("dontMoveMessage", DateUtil.formatDateDiff(c.getTimeInMillis())));
}
now(teleportTarget, cause);
if (chargeFor != null)
{
chargeFor.charge(user);
}
}
catch (Throwable ex)
{
ess.showError(user.getBase(), ex, "teleport");
}
}
catch (Exception ex)
{
user.sendMessage(_("cooldownWithMessage", ex.getMessage()));
}
}
}
//The now function is used when you want to skip tp delay when teleporting someone to a location or player.
@Override
public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception {
if (cooldown) {
cooldown(false);
}
final ITarget target = new LocationTarget(loc);
now(teleportOwner, target, cause);
}
public Teleport(IUser user, IEssentials ess)
{
this.user = user;
this.ess = ess;
}
@Override
public void now(Player entity, boolean cooldown, TeleportCause cause) throws Exception {
if (cooldown) {
cooldown(false);
}
final ITarget target = new PlayerTarget(entity);
now(teleportOwner, target, cause);
teleportOwner.sendMessage(tl("teleporting", target.getLocation().getWorld().getName(), target.getLocation().getBlockX(), target.getLocation().getBlockY(), target.getLocation().getBlockZ()));
}
public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception
{
final Player player = user.getBase();
final Location bed = player.getBedSpawnLocation();
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, bed == null ? player.getWorld().getSpawnLocation() : bed, bed != null);
ess.getServer().getPluginManager().callEvent(pre);
teleport(new Target(pre.getRespawnLocation()), chargeFor, cause);
}
protected void now(IUser teleportee, ITarget target, TeleportCause cause) throws Exception {
cancel(false);
teleportee.setLastLocation();
Location loc = target.getLocation();
public void warp(String warp, Trade chargeFor, TeleportCause cause) throws Exception
{
Location loc = ess.getWarps().getWarp(warp);
teleport(new Target(loc), chargeFor, cause);
user.sendMessage(_("warpingTo", warp));
}
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);
} else {
teleportee.getBase().teleport(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);
} else {
if (ess.getSettings().isTeleportToCenterLocation()) {
loc = LocationUtil.getRoundedDestination(loc);
}
teleportee.getBase().teleport(loc, cause);
}
}
}
public void cooldown(boolean check) throws Exception
{
final Calendar time = new GregorianCalendar();
if (user.getLastTeleportTimestamp() > 0)
{
// Take the current time, and remove the delay from it.
final double cooldown = ess.getSettings().getTeleportCooldown();
final Calendar earliestTime = new GregorianCalendar();
earliestTime.add(Calendar.SECOND, -(int)cooldown);
earliestTime.add(Calendar.MILLISECOND, -(int)((cooldown * 1000.0) % 1000.0));
// This value contains the most recent time a teleport could have been used that would allow another use.
final long earliestLong = earliestTime.getTimeInMillis();
//The teleportPlayer function is used when you want to normally teleportPlayer someone to a location or player.
//This method is nolonger used internally and will be removed.
@Deprecated
@Override
public void teleport(Location loc, Trade chargeFor) throws Exception {
teleport(loc, chargeFor, TeleportCause.PLUGIN);
}
// When was the last teleport used?
final Long lastTime = user.getLastTeleportTimestamp();
@Override
public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception {
teleport(teleportOwner, new LocationTarget(loc), chargeFor, cause);
}
if (lastTime > time.getTimeInMillis())
{
// This is to make sure time didn't get messed up on last kit use.
// If this happens, let's give the user the benifit of the doubt.
user.setLastTeleportTimestamp(time.getTimeInMillis());
return;
}
else if (lastTime > earliestLong && !user.isAuthorized("essentials.teleport.cooldown.bypass"))
{
time.setTimeInMillis(lastTime);
time.add(Calendar.SECOND, (int)cooldown);
time.add(Calendar.MILLISECOND, (int)((cooldown * 1000.0) % 1000.0));
throw new Exception(_("timeBeforeTeleport", Util.formatDateDiff(time.getTimeInMillis())));
}
}
// if justCheck is set, don't update lastTeleport; we're just checking
if (!check)
{
user.setLastTeleportTimestamp(time.getTimeInMillis());
}
}
//This is used when teleporting to a player
@Override
public void teleport(Player entity, Trade chargeFor, TeleportCause cause) throws Exception {
ITarget target = new PlayerTarget(entity);
teleportOwner.sendMessage(tl("teleportToPlayer", entity.getDisplayName()));
teleport(teleportOwner, target, chargeFor, cause);
}
public void cancel(boolean notifyUser)
{
if (teleTimer == -1)
{
return;
}
try
{
ess.getServer().getScheduler().cancelTask(teleTimer);
if (notifyUser)
{
user.sendMessage(_("pendingTeleportCancelled"));
}
}
finally
{
teleTimer = -1;
}
}
//This is used when teleporting to stored location
@Override
public void teleportPlayer(IUser teleportee, Location loc, Trade chargeFor, TeleportCause cause) throws Exception {
teleport(teleportee, new LocationTarget(loc), chargeFor, cause);
}
public void cancel()
{
cancel(false);
}
//This is used on /tphere
@Override
public void teleportPlayer(IUser teleportee, Player entity, Trade chargeFor, TeleportCause cause) throws Exception {
ITarget target = new PlayerTarget(entity);
teleport(teleportee, target, chargeFor, cause);
teleportee.sendMessage(tl("teleporting", target.getLocation().getWorld().getName(), target.getLocation().getBlockX(), target.getLocation().getBlockY(), target.getLocation().getBlockZ()));
teleportOwner.sendMessage(tl("teleporting", target.getLocation().getWorld().getName(), target.getLocation().getBlockX(), target.getLocation().getBlockY(), target.getLocation().getBlockZ()));
}
public void teleport(Location loc, Trade chargeFor) throws Exception
{
teleport(new Target(loc), chargeFor, TeleportCause.PLUGIN);
}
private void teleport(IUser teleportee, ITarget target, Trade chargeFor, TeleportCause cause) throws Exception {
double delay = ess.getSettings().getTeleportDelay();
public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception
{
teleport(new Target(loc), chargeFor, cause);
}
Trade cashCharge = chargeFor;
public void teleport(Entity entity, Trade chargeFor, TeleportCause cause) throws Exception
{
teleport(new Target(entity), chargeFor, cause);
}
if (chargeFor != null) {
chargeFor.isAffordableFor(teleportOwner);
private void teleport(Target target, Trade chargeFor, TeleportCause cause) throws Exception
{
double delay = ess.getSettings().getTeleportDelay();
//This code is to make sure that commandcosts are checked in the initial world, and not in the resulting world.
if (!chargeFor.getCommandCost(teleportOwner).equals(BigDecimal.ZERO)) {
//By converting a command cost to a regular cost, the command cost permission isn't checked when executing the charge after teleport.
cashCharge = new Trade(chargeFor.getCommandCost(teleportOwner), ess);
}
}
if (chargeFor != null)
{
chargeFor.isAffordableFor(user);
}
cooldown(true);
if (delay <= 0 || user.isAuthorized("essentials.teleport.timer.bypass"))
{
cooldown(false);
now(target, cause);
if (chargeFor != null)
{
chargeFor.charge(user);
}
return;
}
cooldown(true);
if (delay <= 0 || teleportOwner.isAuthorized("essentials.teleport.timer.bypass") || teleportee.isAuthorized("essentials.teleport.timer.bypass")) {
cooldown(false);
now(teleportee, target, cause);
if (cashCharge != null) {
cashCharge.charge(teleportOwner);
}
return;
}
cancel();
Calendar c = new GregorianCalendar();
c.add(Calendar.SECOND, (int)delay);
c.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0));
user.sendMessage(_("dontMoveMessage", Util.formatDateDiff(c.getTimeInMillis())));
initTimer((long)(delay * 1000.0), target, chargeFor, cause);
cancel(false);
warnUser(teleportee, delay);
initTimer((long) (delay * 1000.0), teleportee, target, cashCharge, cause, false);
}
teleTimer = ess.scheduleSyncRepeatingTask(this, 10, 10);
}
//The respawn function is a wrapper used to handle tp fallback, on /jail and /home
@Override
public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception {
double delay = ess.getSettings().getTeleportDelay();
if (chargeFor != null) {
chargeFor.isAffordableFor(teleportOwner);
}
cooldown(true);
if (delay <= 0 || teleportOwner.isAuthorized("essentials.teleport.timer.bypass")) {
cooldown(false);
respawnNow(teleportOwner, cause);
if (chargeFor != null) {
chargeFor.charge(teleportOwner);
}
return;
}
private void now(Target target, TeleportCause cause) throws Exception
{
cancel();
user.setLastLocation();
user.getBase().teleport(Util.getSafeDestination(target.getLocation()), cause);
}
cancel(false);
warnUser(teleportOwner, delay);
initTimer((long) (delay * 1000.0), teleportOwner, null, chargeFor, cause, true);
}
public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception
{
if (cooldown)
{
cooldown(false);
}
now(new Target(loc), cause);
}
protected void respawnNow(IUser teleportee, TeleportCause cause) throws Exception {
final Player player = teleportee.getBase();
Location bed = player.getBedSpawnLocation();
if (bed != null) {
now(teleportee, new LocationTarget(bed), cause);
} else {
if (ess.getSettings().isDebug()) {
ess.getLogger().info("Could not find bed spawn, forcing respawn event.");
}
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, player.getWorld().getSpawnLocation(), false);
ess.getServer().getPluginManager().callEvent(pre);
now(teleportee, new LocationTarget(pre.getRespawnLocation()), cause);
}
}
public void now(Location loc, Trade chargeFor, TeleportCause cause) throws Exception
{
cooldown(false);
chargeFor.charge(user);
now(new Target(loc), cause);
}
//The warp function is a wrapper used to teleportPlayer a player to a /warp
@Override
public void warp(IUser teleportee, String warp, Trade chargeFor, TeleportCause cause) throws Exception {
UserWarpEvent event = new UserWarpEvent(teleportee, warp, chargeFor);
Bukkit.getServer().getPluginManager().callEvent(event);
public void now(Entity entity, boolean cooldown, TeleportCause cause) throws Exception
{
if (cooldown)
{
cooldown(false);
}
now(new Target(entity), cause);
}
if(event.isCancelled()) {
return;
}
warp = event.getWarp();
Location loc = ess.getWarps().getWarp(warp);
teleportee.sendMessage(tl("warpingTo", warp, loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
if (!teleportee.equals(teleportOwner)) {
teleportOwner.sendMessage(tl("warpingTo", warp, loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
}
teleport(teleportee, new LocationTarget(loc), chargeFor, cause);
}
public void back(Trade chargeFor) throws Exception
{
teleport(new Target(user.getLastLocation()), chargeFor, TeleportCause.COMMAND);
}
//The back function is a wrapper used to teleportPlayer a player /back to their previous location.
@Override
public void back(Trade chargeFor) throws Exception {
tpType = TeleportType.BACK;
final Location loc = teleportOwner.getLastLocation();
teleportOwner.sendMessage(tl("backUsageMsg", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
teleport(teleportOwner, new LocationTarget(loc), chargeFor, TeleportCause.COMMAND);
}
public void back() throws Exception
{
now(new Target(user.getLastLocation()), TeleportCause.COMMAND);
}
//This function is used to throw a user back after a jail sentence
@Override
public void back() throws Exception {
now(teleportOwner, new LocationTarget(teleportOwner.getLastLocation()), TeleportCause.COMMAND);
}
public void home(Location loc, Trade chargeFor) throws Exception
{
teleport(new Target(loc), chargeFor, TeleportCause.COMMAND);
}
public void setTpType(TeleportType tpType) {
this.tpType = tpType;
}
//If we need to cancelTimer a pending teleportPlayer call this method
private void cancel(boolean notifyUser) {
if (timedTeleport != null) {
timedTeleport.cancelTimer(notifyUser);
timedTeleport = null;
}
}
private void initTimer(long delay, IUser teleportUser, ITarget target, Trade chargeFor, TeleportCause cause, boolean respawn) {
timedTeleport = new TimedTeleport(teleportOwner, ess, this, delay, teleportUser, target, chargeFor, cause, respawn);
}
}
@@ -0,0 +1,143 @@
package com.earth2me.essentials;
import net.ess3.api.IEssentials;
import net.ess3.api.IUser;
import org.bukkit.Location;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import java.util.UUID;
import static com.earth2me.essentials.I18n.tl;
public class TimedTeleport implements Runnable {
private static final double MOVE_CONSTANT = 0.3;
private final IUser teleportOwner;
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 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)
// so, the X/Y/Z values are stored instead and rounded off
private final long timer_initX;
private final long timer_initY;
private final long timer_initZ;
private final ITarget timer_teleportTarget;
private final boolean timer_respawn;
private final boolean timer_canMove;
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) {
this.teleportOwner = user;
this.ess = ess;
this.teleport = teleport;
this.timer_started = System.currentTimeMillis();
this.timer_delay = delay;
this.timer_health = teleportUser.getBase().getHealth();
this.timer_initX = Math.round(teleportUser.getBase().getLocation().getX() * MOVE_CONSTANT);
this.timer_initY = Math.round(teleportUser.getBase().getLocation().getY() * MOVE_CONSTANT);
this.timer_initZ = Math.round(teleportUser.getBase().getLocation().getZ() * MOVE_CONSTANT);
this.timer_teleportee = teleportUser.getBase().getUniqueId();
this.timer_teleportTarget = target;
this.timer_chargeFor = chargeFor;
this.timer_cause = cause;
this.timer_respawn = respawn;
this.timer_canMove = user.isAuthorized("essentials.teleport.timer.move");
timer_task = ess.runTaskTimerAsynchronously(this, 20, 20).getTaskId();
}
@Override
public void run() {
if (teleportOwner == null || !teleportOwner.getBase().isOnline() || teleportOwner.getBase().getLocation() == null) {
cancelTimer(false);
return;
}
final IUser teleportUser = ess.getUser(this.timer_teleportee);
if (teleportUser == null || !teleportUser.getBase().isOnline()) {
cancelTimer(false);
return;
}
final Location currLocation = teleportUser.getBase().getLocation();
if (currLocation == null) {
cancelTimer(false);
return;
}
if (!timer_canMove && (Math.round(currLocation.getX() * MOVE_CONSTANT) != timer_initX || Math.round(currLocation.getY() * MOVE_CONSTANT) != timer_initY || Math.round(currLocation.getZ() * MOVE_CONSTANT) != timer_initZ || teleportUser.getBase().getHealth() < timer_health)) {
// user moved, cancelTimer teleportPlayer
cancelTimer(true);
return;
}
class DelayedTeleportTask implements Runnable {
@Override
public void run() {
timer_health = teleportUser.getBase().getHealth(); // in case user healed, then later gets injured
final long now = System.currentTimeMillis();
if (now > timer_started + timer_delay) {
try {
teleport.cooldown(false);
} catch (Exception ex) {
teleportOwner.sendMessage(tl("cooldownWithMessage", ex.getMessage()));
if (teleportOwner != teleportUser) {
teleportUser.sendMessage(tl("cooldownWithMessage", ex.getMessage()));
}
}
try {
cancelTimer(false);
teleportUser.sendMessage(tl("teleportationCommencing"));
try {
if (timer_chargeFor != null) {
timer_chargeFor.isAffordableFor(teleportOwner);
}
if (timer_respawn) {
teleport.respawnNow(teleportUser, timer_cause);
} else {
teleport.now(teleportUser, timer_teleportTarget, timer_cause);
}
if (timer_chargeFor != null) {
timer_chargeFor.charge(teleportOwner);
}
} catch (Exception ex) {
}
} catch (Exception ex) {
ess.showError(teleportOwner.getSource(), ex, "\\ teleport");
}
}
}
}
ess.scheduleSyncDelayedTask(new DelayedTeleportTask());
}
//If we need to cancelTimer a pending teleportPlayer call this method
public void cancelTimer(boolean notifyUser) {
if (timer_task == -1) {
return;
}
try {
ess.getServer().getScheduler().cancelTask(timer_task);
if (notifyUser) {
teleportOwner.sendMessage(tl("pendingTeleportCancelled"));
if (timer_teleportee != null && !timer_teleportee.equals(teleportOwner.getBase().getUniqueId())) {
ess.getUser(timer_teleportee).sendMessage(tl("pendingTeleportCancelled"));
}
}
} finally {
timer_task = -1;
}
}
}
+324 -303
View File
@@ -2,337 +2,358 @@ package com.earth2me.essentials;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.craftbukkit.SetExpFix;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.utils.NumberUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.IUser;
import net.ess3.api.MaxMoneyException;
import org.bukkit.Location;
import org.bukkit.entity.Item;
import org.bukkit.inventory.ItemStack;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.entity.Item;
import org.bukkit.inventory.ItemStack;
import static com.earth2me.essentials.I18n.tl;
public class Trade
{
private final transient String command;
private final transient String fallbackCommand;
private final transient Double money;
private final transient ItemStack itemStack;
private final transient Integer exp;
private final transient IEssentials ess;
public class Trade {
private final transient String command;
private final transient Trade fallbackTrade;
private final transient BigDecimal money;
private final transient ItemStack itemStack;
private final transient Integer exp;
private final transient IEssentials ess;
public Trade(final String command, final IEssentials ess)
{
this(command, null, null, null, null, ess);
}
public Trade(final String command, final String fallback, final IEssentials ess)
{
this(command, fallback, null, null, null, ess);
}
public enum TradeType {
MONEY,
EXP,
ITEM
}
public Trade(final double money, final IEssentials ess)
{
this(null, null, money, null, null, ess);
}
public Trade(final ItemStack items, final IEssentials ess)
{
this(null, null, null, items, null, ess);
}
public enum OverflowType {
ABORT,
DROP,
RETURN
}
public Trade(final int exp, final IEssentials ess)
{
this(null, null, null, null, exp, ess);
}
public Trade(final String command, final IEssentials ess) {
this(command, null, null, null, null, ess);
}
private Trade(final String command, final String fallback, final Double money, final ItemStack item, final Integer exp, final IEssentials ess)
{
this.command = command;
this.fallbackCommand = fallback;
this.money = money;
this.itemStack = item;
this.exp = exp;
this.ess = ess;
}
public Trade(final String command, final Trade fallback, final IEssentials ess) {
this(command, fallback, null, null, null, ess);
}
public void isAffordableFor(final IUser user) throws ChargeException
{
if (getMoney() != null
&& getMoney() > 0
&& !user.canAfford(getMoney()))
{
throw new ChargeException(_("notEnoughMoney"));
}
@Deprecated
public Trade(final double money, final com.earth2me.essentials.IEssentials ess) {
this(null, null, BigDecimal.valueOf(money), null, null, (IEssentials) ess);
}
if (getItemStack() != null
&& !InventoryWorkaround.containsItem(user.getInventory(), true, true, itemStack))
{
throw new ChargeException(_("missingItems", getItemStack().getAmount(), getItemStack().getType().toString().toLowerCase(Locale.ENGLISH).replace("_", " ")));
}
public Trade(final BigDecimal money, final IEssentials ess) {
this(null, null, money, null, null, ess);
}
double money;
if (command != null && !command.isEmpty()
&& 0 < (money = getCommandCost(user))
&& !user.canAfford(money))
{
throw new ChargeException(_("notEnoughMoney"));
}
public Trade(final ItemStack items, final IEssentials ess) {
this(null, null, null, items, null, ess);
}
if (exp != null && exp > 0
&& SetExpFix.getTotalExperience(user) < exp)
{
throw new ChargeException(_("notEnoughExperience"));
}
}
public Trade(final int exp, final IEssentials ess) {
this(null, null, null, null, exp, ess);
}
public void pay(final IUser user)
{
pay(user, true);
}
private Trade(final String command, final Trade fallback, final BigDecimal money, final ItemStack item, final Integer exp, final IEssentials ess) {
this.command = command;
this.fallbackTrade = fallback;
this.money = money;
this.itemStack = item;
this.exp = exp;
this.ess = ess;
}
public boolean pay(final IUser user, final boolean dropItems)
{
boolean success = true;
if (getMoney() != null && getMoney() > 0)
{
user.giveMoney(getMoney());
}
if (getItemStack() != null)
{
if (dropItems)
{
final Map<Integer, ItemStack> leftOver = InventoryWorkaround.addItem(user.getInventory(), true, getItemStack());
final Location loc = user.getLocation();
for (ItemStack itemStack : leftOver.values())
{
final int maxStackSize = itemStack.getType().getMaxStackSize();
final int stacks = itemStack.getAmount() / maxStackSize;
final int leftover = itemStack.getAmount() % maxStackSize;
final Item[] itemStacks = new Item[stacks + (leftover > 0 ? 1 : 0)];
for (int i = 0; i < stacks; i++)
{
final ItemStack stack = itemStack.clone();
stack.setAmount(maxStackSize);
itemStacks[i] = loc.getWorld().dropItem(loc, stack);
}
if (leftover > 0)
{
final ItemStack stack = itemStack.clone();
stack.setAmount(leftover);
itemStacks[stacks] = loc.getWorld().dropItem(loc, stack);
}
}
}
else
{
success = InventoryWorkaround.addAllItems(user.getInventory(), true, getItemStack());
}
user.updateInventory();
}
if (getExperience() != null)
{
SetExpFix.setTotalExperience(user, SetExpFix.getTotalExperience(user) + getExperience());
}
return success;
}
public void isAffordableFor(final IUser user) throws ChargeException {
public void charge(final IUser user) throws ChargeException
{
if (getMoney() != null)
{
if (!user.canAfford(getMoney()) && getMoney() > 0)
{
throw new ChargeException(_("notEnoughMoney"));
}
user.takeMoney(getMoney());
}
if (getItemStack() != null)
{
if (!InventoryWorkaround.containsItem(user.getInventory(), true, true, itemStack))
{
throw new ChargeException(_("missingItems", getItemStack().getAmount(), getItemStack().getType().toString().toLowerCase(Locale.ENGLISH).replace("_", " ")));
}
InventoryWorkaround.removeItem(user.getInventory(), true, true, getItemStack());
user.updateInventory();
}
if (command != null)
{
final double cost = getCommandCost(user);
if (!user.canAfford(cost) && cost > 0)
{
throw new ChargeException(_("notEnoughMoney"));
}
user.takeMoney(cost);
}
if (getExperience() != null)
{
final int experience = SetExpFix.getTotalExperience(user);
if (experience < getExperience() && getExperience() > 0)
{
throw new ChargeException(_("notEnoughExperience"));
}
SetExpFix.setTotalExperience(user, experience - getExperience());
}
}
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "checking if " + user.getName() + " can afford charge.");
}
public Double getMoney()
{
return money;
}
if (getMoney() != null && getMoney().signum() > 0 && !user.canAfford(getMoney())) {
throw new ChargeException(tl("notEnoughMoney", NumberUtil.displayCurrency(getMoney(), ess)));
}
public ItemStack getItemStack()
{
return itemStack;
}
if (getItemStack() != null && !user.getBase().getInventory().containsAtLeast(itemStack, itemStack.getAmount())) {
throw new ChargeException(tl("missingItems", getItemStack().getAmount(), ess.getItemDb().name(getItemStack())));
}
public Integer getExperience()
{
return exp;
}
BigDecimal money;
if (command != null && !command.isEmpty() && (money = getCommandCost(user)).signum() > 0 && !user.canAfford(money)) {
throw new ChargeException(tl("notEnoughMoney", NumberUtil.displayCurrency(money, ess)));
}
public Double getCommandCost(final IUser user)
{
double cost = 0d;
if (command != null && !command.isEmpty()
&& !user.isAuthorized("essentials.nocommandcost.all")
&& !user.isAuthorized("essentials.nocommandcost." + command))
{
cost = ess.getSettings().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command);
if (cost == 0.0 && fallbackCommand != null && !fallbackCommand.isEmpty())
{
cost = ess.getSettings().getCommandCost(fallbackCommand.charAt(0) == '/' ? fallbackCommand.substring(1) : fallbackCommand);
}
}
return cost;
}
private static FileWriter fw = null;
if (exp != null && exp > 0 && SetExpFix.getTotalExperience(user.getBase()) < exp) {
throw new ChargeException(tl("notEnoughExperience"));
}
}
public static void log(String type, String subtype, String event, String sender, Trade charge, String receiver, Trade pay, Location loc, IEssentials ess)
{
if ((loc == null && !ess.getSettings().isEcoLogUpdateEnabled())
|| (loc != null && !ess.getSettings().isEcoLogEnabled()))
{
return;
}
if (fw == null)
{
try
{
fw = new FileWriter(new File(ess.getDataFolder(), "trade.log"), true);
}
catch (IOException ex)
{
Logger.getLogger("Minecraft").log(Level.SEVERE, null, ex);
}
}
StringBuilder sb = new StringBuilder();
sb.append(type).append(",").append(subtype).append(",").append(event).append(",\"");
sb.append(DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(new Date()));
sb.append("\",\"");
if (sender != null)
{
sb.append(sender);
}
sb.append("\",");
if (charge == null)
{
sb.append("\"\",\"\",\"\"");
}
else
{
if (charge.getItemStack() != null)
{
sb.append(charge.getItemStack().getAmount()).append(",");
sb.append(charge.getItemStack().getType().toString()).append(",");
sb.append(charge.getItemStack().getDurability());
}
if (charge.getMoney() != null)
{
sb.append(charge.getMoney()).append(",");
sb.append("money").append(",");
sb.append(ess.getSettings().getCurrencySymbol());
}
if (charge.getExperience() != null)
{
sb.append(charge.getExperience()).append(",");
sb.append("exp").append(",");
sb.append("\"\"");
}
}
sb.append(",\"");
if (receiver != null)
{
sb.append(receiver);
}
sb.append("\",");
if (pay == null)
{
sb.append("\"\",\"\",\"\"");
}
else
{
if (pay.getItemStack() != null)
{
sb.append(pay.getItemStack().getAmount()).append(",");
sb.append(pay.getItemStack().getType().toString()).append(",");
sb.append(pay.getItemStack().getDurability());
}
if (pay.getMoney() != null)
{
sb.append(pay.getMoney()).append(",");
sb.append("money").append(",");
sb.append(ess.getSettings().getCurrencySymbol());
}
if (pay.getExperience() != null)
{
sb.append(pay.getExperience()).append(",");
sb.append("exp").append(",");
sb.append("\"\"");
}
}
if (loc == null)
{
sb.append(",\"\",\"\",\"\",\"\"");
}
else
{
sb.append(",\"");
sb.append(loc.getWorld().getName()).append("\",");
sb.append(loc.getBlockX()).append(",");
sb.append(loc.getBlockY()).append(",");
sb.append(loc.getBlockZ()).append(",");
}
sb.append("\n");
try
{
fw.write(sb.toString());
fw.flush();
}
catch (IOException ex)
{
Logger.getLogger("Minecraft").log(Level.SEVERE, null, ex);
}
}
public boolean pay(final IUser user) throws MaxMoneyException {
return pay(user, OverflowType.ABORT) == null;
}
public static void closeLog()
{
if (fw != null)
{
try
{
fw.close();
}
catch (IOException ex)
{
Logger.getLogger("Minecraft").log(Level.SEVERE, null, ex);
}
fw = null;
}
}
public Map<Integer, ItemStack> pay(final IUser user, final OverflowType type) throws MaxMoneyException {
if (getMoney() != null && getMoney().signum() > 0) {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "paying user " + user.getName() + " via trade " + getMoney().toPlainString());
}
user.giveMoney(getMoney());
}
if (getItemStack() != null) {
// This stores the would be overflow
Map<Integer, ItemStack> overFlow = InventoryWorkaround.addAllItems(user.getBase().getInventory(), getItemStack());
if (overFlow != null) {
switch (type) {
case ABORT:
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "abort paying " + user.getName() + " itemstack " + getItemStack().toString() + " due to lack of inventory space ");
}
return overFlow;
case RETURN:
// Pay the user the items, and return overflow
final Map<Integer, ItemStack> returnStack = InventoryWorkaround.addItems(user.getBase().getInventory(), getItemStack());
user.getBase().updateInventory();
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "paying " + user.getName() + " partial itemstack " + getItemStack().toString() + " with overflow " + returnStack.get(0).toString());
}
return returnStack;
case DROP:
// Pay the users the items directly, and drop the rest, will always return no overflow.
final Map<Integer, ItemStack> leftOver = InventoryWorkaround.addItems(user.getBase().getInventory(), getItemStack());
final Location loc = user.getBase().getLocation();
for (ItemStack loStack : leftOver.values()) {
final int maxStackSize = loStack.getType().getMaxStackSize();
final int stacks = loStack.getAmount() / maxStackSize;
final int leftover = loStack.getAmount() % maxStackSize;
final Item[] itemStacks = new Item[stacks + (leftover > 0 ? 1 : 0)];
for (int i = 0; i < stacks; i++) {
final ItemStack stack = loStack.clone();
stack.setAmount(maxStackSize);
itemStacks[i] = loc.getWorld().dropItem(loc, stack);
}
if (leftover > 0) {
final ItemStack stack = loStack.clone();
stack.setAmount(leftover);
itemStacks[stacks] = loc.getWorld().dropItem(loc, stack);
}
}
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "paying " + user.getName() + " partial itemstack " + getItemStack().toString() + " and dropping overflow " + leftOver.get(0).toString());
}
}
} else if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "paying " + user.getName() + " itemstack " + getItemStack().toString());
}
user.getBase().updateInventory();
}
if (getExperience() != null) {
SetExpFix.setTotalExperience(user.getBase(), SetExpFix.getTotalExperience(user.getBase()) + getExperience());
}
return null;
}
public void charge(final IUser user) throws ChargeException {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "attempting to charge user " + user.getName());
}
if (getMoney() != null) {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "charging user " + user.getName() + " money " + getMoney().toPlainString());
}
if (!user.canAfford(getMoney()) && getMoney().signum() > 0) {
throw new ChargeException(tl("notEnoughMoney", NumberUtil.displayCurrency(getMoney(), ess)));
}
user.takeMoney(getMoney());
}
if (getItemStack() != null) {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "charging user " + user.getName() + " itemstack " + getItemStack().toString());
}
if (!user.getBase().getInventory().containsAtLeast(getItemStack(), getItemStack().getAmount())) {
throw new ChargeException(tl("missingItems", getItemStack().getAmount(), getItemStack().getType().toString().toLowerCase(Locale.ENGLISH).replace("_", " ")));
}
user.getBase().getInventory().removeItem(getItemStack());
user.getBase().updateInventory();
}
if (command != null) {
final BigDecimal cost = getCommandCost(user);
if (!user.canAfford(cost) && cost.signum() > 0) {
throw new ChargeException(tl("notEnoughMoney", NumberUtil.displayCurrency(cost, ess)));
}
user.takeMoney(cost);
}
if (getExperience() != null) {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "charging user " + user.getName() + " exp " + getExperience());
}
final int experience = SetExpFix.getTotalExperience(user.getBase());
if (experience < getExperience() && getExperience() > 0) {
throw new ChargeException(tl("notEnoughExperience"));
}
SetExpFix.setTotalExperience(user.getBase(), experience - getExperience());
}
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "charge user " + user.getName() + " completed");
}
}
public BigDecimal getMoney() {
return money;
}
public ItemStack getItemStack() {
return itemStack;
}
public Integer getExperience() {
return exp;
}
public TradeType getType() {
if (getExperience() != null) {
return TradeType.EXP;
}
if (getItemStack() != null) {
return TradeType.ITEM;
}
return TradeType.MONEY;
}
public BigDecimal getCommandCost(final IUser user) {
BigDecimal cost = BigDecimal.ZERO;
if (command != null && !command.isEmpty()) {
cost = ess.getSettings().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command);
if (cost.signum() == 0 && fallbackTrade != null) {
cost = fallbackTrade.getCommandCost(user);
}
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "calculated command (" + command + ") cost for " + user.getName() + " as " + cost);
}
}
if (cost.signum() != 0 && (user.isAuthorized("essentials.nocommandcost.all") || user.isAuthorized("essentials.nocommandcost." + command))) {
return BigDecimal.ZERO;
}
return cost;
}
private static FileWriter fw = null;
public static void log(String type, String subtype, String event, String sender, Trade charge, String receiver, Trade pay, Location loc, IEssentials ess) {
//isEcoLogUpdateEnabled() - This refers to log entries with no location, ie API updates #EasterEgg
//isEcoLogEnabled() - This refers to log entries with with location, ie /pay /sell and eco signs.
if ((loc == null && !ess.getSettings().isEcoLogUpdateEnabled()) || (loc != null && !ess.getSettings().isEcoLogEnabled())) {
return;
}
if (fw == null) {
try {
fw = new FileWriter(new File(ess.getDataFolder(), "trade.log"), true);
} catch (IOException ex) {
Logger.getLogger("Essentials").log(Level.SEVERE, null, ex);
}
}
StringBuilder sb = new StringBuilder();
sb.append(type).append(",").append(subtype).append(",").append(event).append(",\"");
sb.append(DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(new Date()));
sb.append("\",\"");
if (sender != null) {
sb.append(sender);
}
sb.append("\",");
if (charge == null) {
sb.append("\"\",\"\",\"\"");
} else {
if (charge.getItemStack() != null) {
sb.append(charge.getItemStack().getAmount()).append(",");
sb.append(charge.getItemStack().getType().toString()).append(",");
sb.append(charge.getItemStack().getDurability());
}
if (charge.getMoney() != null) {
sb.append(charge.getMoney()).append(",");
sb.append("money").append(",");
sb.append(ess.getSettings().getCurrencySymbol());
}
if (charge.getExperience() != null) {
sb.append(charge.getExperience()).append(",");
sb.append("exp").append(",");
sb.append("\"\"");
}
}
sb.append(",\"");
if (receiver != null) {
sb.append(receiver);
}
sb.append("\",");
if (pay == null) {
sb.append("\"\",\"\",\"\"");
} else {
if (pay.getItemStack() != null) {
sb.append(pay.getItemStack().getAmount()).append(",");
sb.append(pay.getItemStack().getType().toString()).append(",");
sb.append(pay.getItemStack().getDurability());
}
if (pay.getMoney() != null) {
sb.append(pay.getMoney()).append(",");
sb.append("money").append(",");
sb.append(ess.getSettings().getCurrencySymbol());
}
if (pay.getExperience() != null) {
sb.append(pay.getExperience()).append(",");
sb.append("exp").append(",");
sb.append("\"\"");
}
}
if (loc == null) {
sb.append(",\"\",\"\",\"\",\"\"");
} else {
sb.append(",\"");
sb.append(loc.getWorld().getName()).append("\",");
sb.append(loc.getBlockX()).append(",");
sb.append(loc.getBlockY()).append(",");
sb.append(loc.getBlockZ()).append(",");
}
sb.append("\n");
try {
fw.write(sb.toString());
fw.flush();
} catch (IOException ex) {
Logger.getLogger("Essentials").log(Level.SEVERE, null, ex);
}
}
public static void closeLog() {
if (fw != null) {
try {
fw.close();
} catch (IOException ex) {
Logger.getLogger("Essentials").log(Level.SEVERE, null, ex);
}
fw = null;
}
}
}
@@ -0,0 +1,154 @@
package com.earth2me.essentials;
import com.google.common.io.Files;
import org.bukkit.Bukkit;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.*;
import java.util.logging.Level;
import java.util.regex.Pattern;
public class UUIDMap {
private final transient net.ess3.api.IEssentials ess;
private File userList;
private final transient Pattern splitPattern = Pattern.compile(",");
private static boolean pendingWrite;
private static final ScheduledExecutorService writeScheduler = Executors.newScheduledThreadPool(1);
private final Runnable writeTaskRunnable;
private static boolean loading = false;
public UUIDMap(final net.ess3.api.IEssentials ess) {
this.ess = ess;
userList = new File(ess.getDataFolder(), "usermap.csv");
pendingWrite = false;
writeTaskRunnable = new Runnable() {
@Override
public void run() {
if (pendingWrite) {
try {
new WriteRunner(ess.getDataFolder(), userList, ess.getUserMap().getNames()).run();
} catch (Throwable t) { // bad code to prevent task from being suppressed
t.printStackTrace();
}
}
}
};
writeScheduler.scheduleWithFixedDelay(writeTaskRunnable, 5, 5, TimeUnit.SECONDS);
}
public void loadAllUsers(final ConcurrentSkipListMap<String, UUID> names, final ConcurrentSkipListMap<UUID, ArrayList<String>> history) {
try {
if (!userList.exists()) {
userList.createNewFile();
}
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "Reading usermap from disk");
}
if (loading) {
return;
}
names.clear();
history.clear();
loading = true;
try (BufferedReader reader = new BufferedReader(new FileReader(userList))) {
while (true) {
final String line = reader.readLine();
if (line == null) {
break;
} else {
final String[] values = splitPattern.split(line);
if (values.length == 2) {
final String name = values[0];
final UUID uuid = UUID.fromString(values[1]);
names.put(name, uuid);
if (!history.containsKey(uuid)) {
final ArrayList<String> list = new ArrayList<>();
list.add(name);
history.put(uuid, list);
} else {
final ArrayList<String> list = history.get(uuid);
if (!list.contains(name)) {
list.add(name);
}
}
}
}
}
}
loading = false;
} catch (IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
}
}
public void writeUUIDMap() {
pendingWrite = true;
}
public void forceWriteUUIDMap() {
if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.INFO, "Forcing usermap write to disk");
}
pendingWrite = true;
writeTaskRunnable.run();
}
public void shutdown() {
writeScheduler.submit(writeTaskRunnable);
writeScheduler.shutdown();
}
private static class WriteRunner implements Runnable {
private final File location;
private final File endFile;
private final Map<String, UUID> names;
private WriteRunner(final File location, final File endFile, final Map<String, UUID> names) {
this.location = location;
this.endFile = endFile;
this.names = new HashMap<>(names);
}
@Override
public void run() {
pendingWrite = false;
if (loading || names.isEmpty()) {
return;
}
File configFile = null;
try {
configFile = File.createTempFile("usermap", ".tmp.csv", location);
final BufferedWriter bWriter = new BufferedWriter(new FileWriter(configFile));
for (Map.Entry<String, UUID> entry : names.entrySet()) {
bWriter.write(entry.getKey() + "," + entry.getValue().toString());
bWriter.newLine();
}
bWriter.close();
Files.move(configFile, endFile);
} catch (IOException ex) {
try {
if (configFile != null && configFile.exists()) {
Files.move(configFile, new File(endFile.getParentFile(), "usermap.bak.csv"));
}
} catch (Exception ex2) {
Bukkit.getLogger().log(Level.SEVERE, ex2.getMessage(), ex2);
}
Bukkit.getLogger().log(Level.WARNING, ex.getMessage(), ex);
}
}
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,142 +1,318 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.StringUtil;
import com.google.common.base.Charsets;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.util.concurrent.UncheckedExecutionException;
import java.io.File;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.ExecutionException;
import net.ess3.api.IEssentials;
import org.bukkit.entity.Player;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.ExecutionException;
import java.util.regex.Pattern;
public class UserMap extends CacheLoader<String, User> implements IConf
{
private final transient IEssentials ess;
private final transient Cache<String, User> users = CacheBuilder.newBuilder().softValues().build(this);
private final transient ConcurrentSkipListSet<String> keys = new ConcurrentSkipListSet<String>();
public UserMap(final IEssentials ess)
{
super();
this.ess = ess;
loadAllUsersAsync(ess);
}
public class UserMap extends CacheLoader<String, User> implements IConf {
private final transient IEssentials ess;
private final transient ConcurrentSkipListSet<UUID> keys = new ConcurrentSkipListSet<>();
private final transient ConcurrentSkipListMap<String, UUID> names = new ConcurrentSkipListMap<>();
private final transient ConcurrentSkipListMap<UUID, ArrayList<String>> history = new ConcurrentSkipListMap<>();
private UUIDMap uuidMap;
private void loadAllUsersAsync(final IEssentials ess)
{
ess.scheduleAsyncDelayedTask(new Runnable()
{
@Override
public void run()
{
final File userdir = new File(ess.getDataFolder(), "userdata");
if (!userdir.exists())
{
return;
}
keys.clear();
users.invalidateAll();
for (String string : userdir.list())
{
if (!string.endsWith(".yml"))
{
continue;
}
final String name = string.substring(0, string.length() - 4);
keys.add(Util.sanitizeFileName(name));
}
}
});
}
private final transient Cache<String, User> users;
private static boolean legacy = false;
public boolean userExists(final String name)
{
return keys.contains(Util.sanitizeFileName(name));
}
public UserMap(final IEssentials ess) {
super();
this.ess = ess;
uuidMap = new UUIDMap(ess);
//RemovalListener<UUID, User> remListener = new UserMapRemovalListener();
//users = CacheBuilder.newBuilder().maximumSize(ess.getSettings().getMaxUserCacheCount()).softValues().removalListener(remListener).build(this);
CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder();
int maxCount = ess.getSettings().getMaxUserCacheCount();
try {
cacheBuilder.maximumSize(maxCount);
} catch (NoSuchMethodError nsme) {
legacy = true;
legacyMaximumSize(cacheBuilder, maxCount);
}
cacheBuilder.softValues();
if (!legacy) {
users = cacheBuilder.build(this);
} else {
users = legacyBuild(cacheBuilder);
}
}
public User getUser(final String name)
{
try
{
return users.get(name);
}
catch (ExecutionException ex)
{
return null;
}
catch (UncheckedExecutionException ex)
{
return null;
}
}
private void loadAllUsersAsync(final IEssentials ess) {
ess.runTaskAsynchronously(new Runnable() {
@Override
public void run() {
synchronized (users) {
final File userdir = new File(ess.getDataFolder(), "userdata");
if (!userdir.exists()) {
return;
}
keys.clear();
users.invalidateAll();
for (String string : userdir.list()) {
if (!string.endsWith(".yml")) {
continue;
}
final String name = string.substring(0, string.length() - 4);
try {
keys.add(UUID.fromString(name));
} catch (IllegalArgumentException ex) {
//Ignore these users till they rejoin.
}
}
uuidMap.loadAllUsers(names, history);
}
}
});
}
@Override
public User load(final String name) throws Exception
{
String sanitizedName = Util.sanitizeFileName(name);
if (!sanitizedName.equals(name))
{
User user = getUser(sanitizedName);
if (user == null)
{
throw new Exception("User not found!");
}
else
{
return user;
}
}
for (Player player : ess.getServer().getOnlinePlayers())
{
if (player.getName().equalsIgnoreCase(name))
{
keys.add(sanitizedName);
return new User(player, ess);
}
}
final File userFile = getUserFile2(sanitizedName);
if (userFile.exists())
{
keys.add(sanitizedName);
return new User(new OfflinePlayer(name, ess), ess);
}
throw new Exception("User not found!");
}
public boolean userExists(final UUID uuid) {
return keys.contains(uuid);
}
@Override
public void reloadConfig()
{
loadAllUsersAsync(ess);
}
public User getUser(final String name) {
try {
final String sanitizedName = StringUtil.safeString(name);
if (names.containsKey(sanitizedName)) {
final UUID uuid = names.get(sanitizedName);
return getUser(uuid);
}
public void removeUser(final String name)
{
keys.remove(Util.sanitizeFileName(name));
users.invalidate(Util.sanitizeFileName(name));
users.invalidate(name);
}
final File userFile = getUserFileFromString(sanitizedName);
if (userFile.exists()) {
ess.getLogger().info("Importing user " + name + " to usermap.");
User user = new User(new OfflinePlayer(sanitizedName, ess.getServer()), ess);
trackUUID(user.getBase().getUniqueId(), user.getName(), true);
return user;
}
return null;
} catch (UncheckedExecutionException ex) {
return null;
}
}
public Set<String> getAllUniqueUsers()
{
return Collections.unmodifiableSet(keys);
}
public User getUser(final UUID uuid) {
try {
if (!legacy) {
return ((LoadingCache<String, User>) users).get(uuid.toString());
} else {
return legacyCacheGet(uuid);
}
} catch (ExecutionException ex) {
return null;
} catch (UncheckedExecutionException ex) {
return null;
}
}
public int getUniqueUsers()
{
return keys.size();
}
public void trackUUID(final UUID uuid, final String name, boolean replace) {
if (uuid != null) {
keys.add(uuid);
if (name != null && name.length() > 0) {
final String keyName = StringUtil.safeString(name);
if (!names.containsKey(keyName)) {
names.put(keyName, uuid);
uuidMap.writeUUIDMap();
} else if (!names.get(keyName).equals(uuid)) {
if (replace) {
ess.getLogger().info("Found new UUID for " + name + ". Replacing " + names.get(keyName).toString() + " with " + uuid.toString());
names.put(keyName, uuid);
uuidMap.writeUUIDMap();
} else {
if (ess.getSettings().isDebug()) {
ess.getLogger().info("Found old UUID for " + name + " (" + uuid.toString() + "). Not adding to usermap.");
}
}
}
}
}
}
public File getUserFile(final String name)
{
return getUserFile2(Util.sanitizeFileName(name));
}
@Override
public User load(final String stringUUID) throws Exception {
UUID uuid = UUID.fromString(stringUUID);
Player player = ess.getServer().getPlayer(uuid);
if (player != null) {
final User user = new User(player, ess);
trackUUID(uuid, user.getName(), true);
return user;
}
private File getUserFile2(final String name)
{
final File userFolder = new File(ess.getDataFolder(), "userdata");
return new File(userFolder, name + ".yml");
}
final File userFile = getUserFileFromID(uuid);
if (userFile.exists()) {
player = new OfflinePlayer(uuid, ess.getServer());
final User user = new User(player, ess);
((OfflinePlayer) player).setName(user.getLastAccountName());
trackUUID(uuid, user.getName(), false);
return user;
}
throw new Exception("User not found!");
}
@Override
public void reloadConfig() {
getUUIDMap().forceWriteUUIDMap();
loadAllUsersAsync(ess);
}
public void invalidateAll() {
users.invalidateAll();
}
public void removeUser(final String name) {
if (names == null) {
ess.getLogger().warning("Name collection is null, cannot remove user.");
return;
}
UUID uuid = names.get(name);
if (uuid != null) {
keys.remove(uuid);
users.invalidate(uuid.toString());
}
names.remove(name);
names.remove(StringUtil.safeString(name));
}
public Set<UUID> getAllUniqueUsers() {
return Collections.unmodifiableSet(keys);
}
public int getUniqueUsers() {
return keys.size();
}
protected ConcurrentSkipListMap<String, UUID> getNames() {
return names;
}
protected ConcurrentSkipListMap<UUID, ArrayList<String>> getHistory() {
return history;
}
public List<String> getUserHistory(final UUID uuid) {
return history.get(uuid);
}
public UUIDMap getUUIDMap() {
return uuidMap;
}
private File getUserFileFromID(final UUID uuid) {
final File userFolder = new File(ess.getDataFolder(), "userdata");
return new File(userFolder, uuid.toString() + ".yml");
}
public File getUserFileFromString(final String name) {
final File userFolder = new File(ess.getDataFolder(), "userdata");
return new File(userFolder, StringUtil.sanitizeFileName(name) + ".yml");
}
// class UserMapRemovalListener implements RemovalListener
// {
// @Override
// public void onRemoval(final RemovalNotification notification)
// {
// Object value = notification.getValue();
// if (value != null)
// {
// ((User)value).cleanup();
// }
// }
// }
private final Pattern validUserPattern = Pattern.compile("^[a-zA-Z0-9_]{2,16}$");
@SuppressWarnings("deprecation")
public User getUserFromBukkit(String name) {
name = StringUtil.safeString(name);
if (ess.getSettings().isDebug()) {
ess.getLogger().warning("Using potentially blocking Bukkit UUID lookup for: " + name);
}
// Don't attempt to look up entirely invalid usernames
if (name == null || !validUserPattern.matcher(name).matches()) {
return null;
}
org.bukkit.OfflinePlayer offlinePlayer = ess.getServer().getOfflinePlayer(name);
if (offlinePlayer == null) {
return null;
}
UUID uuid;
try {
uuid = offlinePlayer.getUniqueId();
} catch (UnsupportedOperationException | NullPointerException e) {
return null;
}
// This is how Bukkit generates fake UUIDs
if (UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)).equals(uuid)) {
return null;
} else {
names.put(name, uuid);
return getUser(uuid);
}
}
private static Method getLegacy;
private User legacyCacheGet(UUID uuid) {
if (getLegacy == null) {
Class<?> usersClass = users.getClass();
for (Method m : usersClass.getDeclaredMethods()) {
if (m.getName().equals("get")) {
getLegacy = m;
getLegacy.setAccessible(true);
break;
}
}
}
try {
return (User) getLegacy.invoke(users, uuid.toString());
} catch (IllegalAccessException | InvocationTargetException e) {
return null;
}
}
private void legacyMaximumSize(CacheBuilder builder, int maxCount) {
try {
Method maxSizeLegacy = builder.getClass().getDeclaredMethod("maximumSize", Integer.TYPE);
maxSizeLegacy.setAccessible(true);
maxSizeLegacy.invoke(builder, maxCount);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
private Cache<String, User> legacyBuild(CacheBuilder builder) {
Method build = null;
for (Method method : builder.getClass().getDeclaredMethods()) {
if (method.getName().equals("build")) {
build = method;
break;
}
}
Cache<String, User> legacyUsers;
try {
assert build != null;
build.setAccessible(true);
legacyUsers = (Cache<String, User>) build.invoke(builder, this);
} catch (IllegalAccessException | InvocationTargetException e) {
legacyUsers = null;
}
return legacyUsers;
}
}
@@ -1,621 +0,0 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.*;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.ItemStack;
public class Util
{
private Util()
{
}
private final static Logger logger = Logger.getLogger("Minecraft");
private final static Pattern INVALIDFILECHARS = Pattern.compile("[^a-z0-9]");
private final static Pattern INVALIDCHARS = Pattern.compile("[^\t\n\r\u0020-\u007E\u0085\u00A0-\uD7FF\uE000-\uFFFC]");
public static String sanitizeFileName(final String name)
{
final String newName = INVALIDFILECHARS.matcher(name.toLowerCase(Locale.ENGLISH)).replaceAll("_");
return newName;
}
public static String sanitizeString(final String string)
{
return INVALIDCHARS.matcher(string).replaceAll("");
}
public static String formatDateDiff(long date)
{
Calendar c = new GregorianCalendar();
c.setTimeInMillis(date);
Calendar now = new GregorianCalendar();
return Util.formatDateDiff(now, c);
}
public static String formatDateDiff(Calendar fromDate, Calendar toDate)
{
boolean future = false;
if (toDate.equals(fromDate))
{
return _("now");
}
if (toDate.after(fromDate))
{
future = true;
}
StringBuilder sb = new StringBuilder();
int[] types = new int[]
{
Calendar.YEAR,
Calendar.MONTH,
Calendar.DAY_OF_MONTH,
Calendar.HOUR_OF_DAY,
Calendar.MINUTE,
Calendar.SECOND
};
String[] names = new String[]
{
_("year"),
_("years"),
_("month"),
_("months"),
_("day"),
_("days"),
_("hour"),
_("hours"),
_("minute"),
_("minutes"),
_("second"),
_("seconds")
};
int accuracy = 0;
for (int i = 0; i < types.length; i++)
{
if (accuracy > 2)
{
break;
}
int diff = dateDiff(types[i], fromDate, toDate, future);
if (diff > 0)
{
accuracy++;
sb.append(" ").append(diff).append(" ").append(names[i * 2 + (diff > 1 ? 1 : 0)]);
}
}
if (sb.length() == 0)
{
return "now";
}
return sb.toString().trim();
}
private static int dateDiff(int type, Calendar fromDate, Calendar toDate, boolean future)
{
int diff = 0;
long savedDate = fromDate.getTimeInMillis();
while ((future && !fromDate.after(toDate)) || (!future && !fromDate.before(toDate)))
{
savedDate = fromDate.getTimeInMillis();
fromDate.add(type, future ? 1 : -1);
diff++;
}
diff--;
fromDate.setTimeInMillis(savedDate);
return diff;
}
public static long parseDateDiff(String time, boolean future) throws Exception
{
Pattern timePattern = Pattern.compile(
"(?:([0-9]+)\\s*y[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*mo[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*w[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*d[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*h[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*m[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*(?:s[a-z]*)?)?", Pattern.CASE_INSENSITIVE);
Matcher m = timePattern.matcher(time);
int years = 0;
int months = 0;
int weeks = 0;
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
boolean found = false;
while (m.find())
{
if (m.group() == null || m.group().isEmpty())
{
continue;
}
for (int i = 0; i < m.groupCount(); i++)
{
if (m.group(i) != null && !m.group(i).isEmpty())
{
found = true;
break;
}
}
if (found)
{
if (m.group(1) != null && !m.group(1).isEmpty())
{
years = Integer.parseInt(m.group(1));
}
if (m.group(2) != null && !m.group(2).isEmpty())
{
months = Integer.parseInt(m.group(2));
}
if (m.group(3) != null && !m.group(3).isEmpty())
{
weeks = Integer.parseInt(m.group(3));
}
if (m.group(4) != null && !m.group(4).isEmpty())
{
days = Integer.parseInt(m.group(4));
}
if (m.group(5) != null && !m.group(5).isEmpty())
{
hours = Integer.parseInt(m.group(5));
}
if (m.group(6) != null && !m.group(6).isEmpty())
{
minutes = Integer.parseInt(m.group(6));
}
if (m.group(7) != null && !m.group(7).isEmpty())
{
seconds = Integer.parseInt(m.group(7));
}
break;
}
}
if (!found)
{
throw new Exception(_("illegalDate"));
}
Calendar c = new GregorianCalendar();
if (years > 0)
{
c.add(Calendar.YEAR, years * (future ? 1 : -1));
}
if (months > 0)
{
c.add(Calendar.MONTH, months * (future ? 1 : -1));
}
if (weeks > 0)
{
c.add(Calendar.WEEK_OF_YEAR, weeks * (future ? 1 : -1));
}
if (days > 0)
{
c.add(Calendar.DAY_OF_MONTH, days * (future ? 1 : -1));
}
if (hours > 0)
{
c.add(Calendar.HOUR_OF_DAY, hours * (future ? 1 : -1));
}
if (minutes > 0)
{
c.add(Calendar.MINUTE, minutes * (future ? 1 : -1));
}
if (seconds > 0)
{
c.add(Calendar.SECOND, seconds * (future ? 1 : -1));
}
Calendar max = new GregorianCalendar();
max.add(Calendar.YEAR, 10);
if (c.after(max)) {
return max.getTimeInMillis();
}
return c.getTimeInMillis();
}
// The player can stand inside these materials
private static final Set<Integer> AIR_MATERIALS = new HashSet<Integer>();
private static final HashSet<Byte> AIR_MATERIALS_TARGET = new HashSet<Byte>();
static
{
AIR_MATERIALS.add(Material.AIR.getId());
AIR_MATERIALS.add(Material.SAPLING.getId());
AIR_MATERIALS.add(Material.POWERED_RAIL.getId());
AIR_MATERIALS.add(Material.DETECTOR_RAIL.getId());
AIR_MATERIALS.add(Material.LONG_GRASS.getId());
AIR_MATERIALS.add(Material.DEAD_BUSH.getId());
AIR_MATERIALS.add(Material.YELLOW_FLOWER.getId());
AIR_MATERIALS.add(Material.RED_ROSE.getId());
AIR_MATERIALS.add(Material.BROWN_MUSHROOM.getId());
AIR_MATERIALS.add(Material.RED_MUSHROOM.getId());
AIR_MATERIALS.add(Material.TORCH.getId());
AIR_MATERIALS.add(Material.REDSTONE_WIRE.getId());
AIR_MATERIALS.add(Material.SEEDS.getId());
AIR_MATERIALS.add(Material.SIGN_POST.getId());
AIR_MATERIALS.add(Material.WOODEN_DOOR.getId());
AIR_MATERIALS.add(Material.LADDER.getId());
AIR_MATERIALS.add(Material.RAILS.getId());
AIR_MATERIALS.add(Material.WALL_SIGN.getId());
AIR_MATERIALS.add(Material.LEVER.getId());
AIR_MATERIALS.add(Material.STONE_PLATE.getId());
AIR_MATERIALS.add(Material.IRON_DOOR_BLOCK.getId());
AIR_MATERIALS.add(Material.WOOD_PLATE.getId());
AIR_MATERIALS.add(Material.REDSTONE_TORCH_OFF.getId());
AIR_MATERIALS.add(Material.REDSTONE_TORCH_ON.getId());
AIR_MATERIALS.add(Material.STONE_BUTTON.getId());
AIR_MATERIALS.add(Material.SNOW.getId());
AIR_MATERIALS.add(Material.SUGAR_CANE_BLOCK.getId());
AIR_MATERIALS.add(Material.DIODE_BLOCK_OFF.getId());
AIR_MATERIALS.add(Material.DIODE_BLOCK_ON.getId());
AIR_MATERIALS.add(Material.TRAP_DOOR.getId());
AIR_MATERIALS.add(Material.PUMPKIN_STEM.getId());
AIR_MATERIALS.add(Material.MELON_STEM.getId());
AIR_MATERIALS.add(Material.VINE.getId());
AIR_MATERIALS.add(Material.FENCE_GATE.getId());
AIR_MATERIALS.add(Material.WATER_LILY.getId());
AIR_MATERIALS.add(Material.NETHER_FENCE.getId());
AIR_MATERIALS.add(Material.NETHER_WARTS.getId());
for (Integer integer : AIR_MATERIALS)
{
AIR_MATERIALS_TARGET.add(integer.byteValue());
}
AIR_MATERIALS_TARGET.add((byte)Material.WATER.getId());
AIR_MATERIALS_TARGET.add((byte)Material.STATIONARY_WATER.getId());
}
public static Location getTarget(final LivingEntity entity) throws Exception
{
final Block block = entity.getTargetBlock(AIR_MATERIALS_TARGET, 300);
if (block == null)
{
throw new Exception("Not targeting a block");
}
return block.getLocation();
}
public static Location getSafeDestination(final Location loc) throws Exception
{
if (loc == null || loc.getWorld() == null)
{
throw new Exception(_("destinationNotSet"));
}
final World world = loc.getWorld();
int x = loc.getBlockX();
int y = (int)Math.round(loc.getY());
int z = loc.getBlockZ();
while (isBlockAboveAir(world, x, y, z))
{
y -= 1;
if (y < 0)
{
break;
}
}
while (isBlockUnsafe(world, x, y, z))
{
y += 1;
if (y >= world.getHighestBlockYAt(x, z))
{
x += 1;
break;
}
}
while (isBlockUnsafe(world, x, y, z))
{
y -= 1;
if (y <= 1)
{
x += 1;
y = world.getHighestBlockYAt(x, z);
if (x - 32 > loc.getBlockX())
{
throw new Exception(_("holeInFloor"));
}
}
}
return new Location(world, x + 0.5D, y, z + 0.5D, loc.getYaw(), loc.getPitch());
}
private static boolean isBlockAboveAir(final World world, final int x, final int y, final int z)
{
return AIR_MATERIALS.contains(world.getBlockAt(x, y - 1, z).getType().getId());
}
public static boolean isBlockUnsafe(final World world, final int x, final int y, final int z)
{
final Block below = world.getBlockAt(x, y - 1, z);
if (below.getType() == Material.LAVA || below.getType() == Material.STATIONARY_LAVA)
{
return true;
}
if (below.getType() == Material.FIRE)
{
return true;
}
if ((!AIR_MATERIALS.contains(world.getBlockAt(x, y, z).getType().getId()))
|| (!AIR_MATERIALS.contains(world.getBlockAt(x, y + 1, z).getType().getId())))
{
return true;
}
return isBlockAboveAir(world, x, y, z);
}
public static ItemStack convertBlockToItem(final Block block)
{
final ItemStack is = new ItemStack(block.getType(), 1, (short)0, block.getData());
switch (is.getType())
{
case WOODEN_DOOR:
is.setType(Material.WOOD_DOOR);
is.setDurability((short)0);
break;
case IRON_DOOR_BLOCK:
is.setType(Material.IRON_DOOR);
is.setDurability((short)0);
break;
case SIGN_POST:
case WALL_SIGN:
is.setType(Material.SIGN);
is.setDurability((short)0);
break;
case CROPS:
is.setType(Material.SEEDS);
is.setDurability((short)0);
break;
case CAKE_BLOCK:
is.setType(Material.CAKE);
is.setDurability((short)0);
break;
case BED_BLOCK:
is.setType(Material.BED);
is.setDurability((short)0);
break;
case REDSTONE_WIRE:
is.setType(Material.REDSTONE);
is.setDurability((short)0);
break;
case REDSTONE_TORCH_OFF:
case REDSTONE_TORCH_ON:
is.setType(Material.REDSTONE_TORCH_ON);
is.setDurability((short)0);
break;
case DIODE_BLOCK_OFF:
case DIODE_BLOCK_ON:
is.setType(Material.DIODE);
is.setDurability((short)0);
break;
case DOUBLE_STEP:
is.setType(Material.STEP);
break;
case TORCH:
case RAILS:
case LADDER:
case WOOD_STAIRS:
case COBBLESTONE_STAIRS:
case LEVER:
case STONE_BUTTON:
case FURNACE:
case DISPENSER:
case PUMPKIN:
case JACK_O_LANTERN:
case WOOD_PLATE:
case STONE_PLATE:
case PISTON_STICKY_BASE:
case PISTON_BASE:
case IRON_FENCE:
case THIN_GLASS:
case TRAP_DOOR:
case FENCE:
case FENCE_GATE:
case NETHER_FENCE:
is.setDurability((short)0);
break;
case FIRE:
return null;
case PUMPKIN_STEM:
is.setType(Material.PUMPKIN_SEEDS);
break;
case MELON_STEM:
is.setType(Material.MELON_SEEDS);
break;
}
return is;
}
private static DecimalFormat dFormat = new DecimalFormat("#0.00", DecimalFormatSymbols.getInstance(Locale.US));
public static String formatAsCurrency(final double value)
{
String str = dFormat.format(value);
if (str.endsWith(".00"))
{
str = str.substring(0, str.length() - 3);
}
return str;
}
public static String displayCurrency(final double value, final IEssentials ess)
{
return _("currency", ess.getSettings().getCurrencySymbol(), formatAsCurrency(value));
}
public static String shortCurrency(final double value, final IEssentials ess)
{
return ess.getSettings().getCurrencySymbol() + formatAsCurrency(value);
}
public static double roundDouble(final double d)
{
return Math.round(d * 100.0) / 100.0;
}
public static boolean isInt(final String sInt)
{
try
{
Integer.parseInt(sInt);
}
catch (NumberFormatException e)
{
return false;
}
return true;
}
public static String joinList(Object... list)
{
return joinList(", ", list);
}
public static String joinList(String seperator, Object... list)
{
StringBuilder buf = new StringBuilder();
for (Object each : list)
{
if (buf.length() > 0)
{
buf.append(seperator);
}
if (each instanceof Collection)
{
buf.append(joinList(seperator, ((Collection)each).toArray()));
}
else
{
try
{
buf.append(each.toString());
}
catch (Exception e)
{
buf.append(each.toString());
}
}
}
return buf.toString();
}
public static String lastCode(final String input) {
int pos = input.lastIndexOf("§");
if (pos == -1 || (pos + 1) == input.length()) {
return "";
}
return input.substring(pos, pos + 2);
}
private static transient final Pattern URL_PATTERN = Pattern.compile("((?:(?:https?)://)?[\\w-_\\.]{2,})\\.([a-z]{2,3}(?:/\\S+)?)");
private static transient final Pattern VANILLA_PATTERN = Pattern.compile("\u00A7+[0-9A-FK-ORa-fk-or]");
private static transient final Pattern REPLACE_PATTERN = Pattern.compile("&([0-9a-fk-or])");
private static transient final Pattern VANILLA_COLOR_PATTERN = Pattern.compile("\u00A7+[0-9A-Fa-f]");
private static transient final Pattern VANILLA_MAGIC_PATTERN = Pattern.compile("\u00A7+[Kk]");
private static transient final Pattern VANILLA_FORMAT_PATTERN = Pattern.compile("\u00A7+[L-ORl-or]");
private static transient final Pattern REPLACE_COLOR_PATTERN = Pattern.compile("&([0-9a-f])");
private static transient final Pattern REPLACE_MAGIC_PATTERN = Pattern.compile("&(k)");
private static transient final Pattern REPLACE_FORMAT_PATTERN = Pattern.compile("&([l-or])");
public static String stripFormat(final String input)
{
if (input == null)
{
return null;
}
return VANILLA_PATTERN.matcher(input).replaceAll("");
}
public static String replaceFormat(final String input)
{
if (input == null)
{
return null;
}
return REPLACE_PATTERN.matcher(input).replaceAll("\u00a7$1");
}
public static String blockURL(final String input)
{
if (input == null)
{
return null;
}
String text = URL_PATTERN.matcher(input).replaceAll("$1 $2");
while (URL_PATTERN.matcher(text).find())
{
text = URL_PATTERN.matcher(text).replaceAll("$1 $2");
}
return text;
}
public static String formatString(final IUser user, final String permBase, final String input)
{
if (input == null)
{
return null;
}
String message;
if (user.isAuthorized(permBase + ".color"))
{
message = Util.replaceColor(input, REPLACE_COLOR_PATTERN);
}
else
{
message = Util.stripColor(input, VANILLA_COLOR_PATTERN);
}
if (user.isAuthorized(permBase + ".magic"))
{
message = Util.replaceColor(message, REPLACE_MAGIC_PATTERN);
}
else
{
message = Util.stripColor(message, VANILLA_MAGIC_PATTERN);
}
if (user.isAuthorized(permBase + ".format"))
{
message = Util.replaceColor(message, REPLACE_FORMAT_PATTERN);
}
else
{
message = Util.stripColor(message, VANILLA_FORMAT_PATTERN);
}
return message;
}
public static String formatMessage(final IUser user, final String permBase, final String input)
{
if (input == null)
{
return null;
}
String message = formatString(user, permBase, input);
if (!user.isAuthorized(permBase + ".url"))
{
message = Util.blockURL(message);
}
return message;
}
private static String stripColor(final String input, final Pattern pattern)
{
return pattern.matcher(input).replaceAll("");
}
private static String replaceColor(final String input, final Pattern pattern)
{
return pattern.matcher(input).replaceAll("\u00a7$1");
}
}
+144 -129
View File
@@ -1,152 +1,167 @@
package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.commands.WarpNotFoundException;
import com.earth2me.essentials.utils.StringUtil;
import net.ess3.api.InvalidNameException;
import net.ess3.api.InvalidWorldException;
import org.bukkit.Location;
import org.bukkit.Server;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.Server;
import static com.earth2me.essentials.I18n.tl;
public class Warps implements IConf
{
private static final Logger logger = Logger.getLogger("Minecraft");
private final Map<StringIgnoreCase, EssentialsConf> warpPoints = new HashMap<StringIgnoreCase, EssentialsConf>();
private final File warpsFolder;
private final Server server;
public class Warps implements IConf, net.ess3.api.IWarps {
private static final Logger logger = Logger.getLogger("Essentials");
private final Map<StringIgnoreCase, EssentialsConf> warpPoints = new HashMap<StringIgnoreCase, EssentialsConf>();
private final File warpsFolder;
private final Server server;
public Warps(Server server, File dataFolder)
{
this.server = server;
warpsFolder = new File(dataFolder, "warps");
if (!warpsFolder.exists())
{
warpsFolder.mkdirs();
}
reloadConfig();
}
public Warps(Server server, File dataFolder) {
this.server = server;
warpsFolder = new File(dataFolder, "warps");
if (!warpsFolder.exists()) {
warpsFolder.mkdirs();
}
reloadConfig();
}
public boolean isEmpty()
{
return warpPoints.isEmpty();
}
@Override
public boolean isEmpty() {
return warpPoints.isEmpty();
}
public Collection<String> getWarpNames()
{
final List<String> keys = new ArrayList<String>();
for (StringIgnoreCase stringIgnoreCase : warpPoints.keySet())
{
keys.add(stringIgnoreCase.getString());
}
Collections.sort(keys, String.CASE_INSENSITIVE_ORDER);
return keys;
}
@Override
public Collection<String> getList() {
final List<String> keys = new ArrayList<String>();
for (StringIgnoreCase stringIgnoreCase : warpPoints.keySet()) {
keys.add(stringIgnoreCase.getString());
}
Collections.sort(keys, String.CASE_INSENSITIVE_ORDER);
return keys;
}
public Location getWarp(String warp) throws Exception
{
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(warp));
if (conf == null)
{
throw new WarpNotFoundException();
}
return conf.getLocation(null, server);
}
@Override
public Location getWarp(String warp) throws WarpNotFoundException, InvalidWorldException {
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(warp));
if (conf == null) {
throw new WarpNotFoundException();
}
return conf.getLocation(null, server);
}
public void setWarp(String name, Location loc) throws Exception
{
String filename = Util.sanitizeFileName(name);
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name));
if (conf == null)
{
File confFile = new File(warpsFolder, filename + ".yml");
if (confFile.exists())
{
throw new Exception(_("similarWarpExist"));
}
conf = new EssentialsConf(confFile);
warpPoints.put(new StringIgnoreCase(name), conf);
}
conf.setProperty(null, loc);
conf.setProperty("name", name);
conf.save();
}
@Override
public void setWarp(String name, Location loc) throws Exception {
setWarp(null, name, loc);
}
@Override
public void setWarp(IUser user, String name, Location loc) throws Exception {
String filename = StringUtil.sanitizeFileName(name);
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name));
if (conf == null) {
File confFile = new File(warpsFolder, filename + ".yml");
if (confFile.exists()) {
throw new Exception(tl("similarWarpExist"));
}
conf = new EssentialsConf(confFile);
warpPoints.put(new StringIgnoreCase(name), conf);
}
conf.setProperty(null, loc);
conf.setProperty("name", name);
if (user != null) conf.setProperty("lastowner", user.getBase().getUniqueId().toString());
try {
conf.saveWithError();
} catch (IOException ex) {
throw new IOException(tl("invalidWarpName"));
}
}
@Override
public UUID getLastOwner(String warp) throws WarpNotFoundException {
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(warp));
if (conf == null) {
throw new WarpNotFoundException();
}
UUID uuid = null;
try {
uuid = UUID.fromString(conf.getString("lastowner"));
}
catch (Exception ex) {}
return uuid;
}
@Override
public void removeWarp(String name) throws Exception {
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name));
if (conf == null) {
throw new Exception(tl("warpNotExist"));
}
if (!conf.getFile().delete()) {
throw new Exception(tl("warpDeleteError"));
}
warpPoints.remove(new StringIgnoreCase(name));
}
public void delWarp(String name) throws Exception
{
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name));
if (conf == null)
{
throw new Exception(_("warpNotExist"));
}
if (!conf.getFile().delete())
{
throw new Exception(_("warpDeleteError"));
}
warpPoints.remove(new StringIgnoreCase(name));
}
@Override
public final void reloadConfig() {
warpPoints.clear();
File[] listOfFiles = warpsFolder.listFiles();
if (listOfFiles.length >= 1) {
for (int i = 0; i < listOfFiles.length; i++) {
String filename = listOfFiles[i].getName();
if (listOfFiles[i].isFile() && filename.endsWith(".yml")) {
try {
EssentialsConf conf = new EssentialsConf(listOfFiles[i]);
conf.load();
String name = conf.getString("name");
if (name != null) {
warpPoints.put(new StringIgnoreCase(name), conf);
}
} catch (Exception ex) {
logger.log(Level.WARNING, tl("loadWarpError", filename), ex);
}
}
}
}
}
@Override
public final void reloadConfig()
{
warpPoints.clear();
File[] listOfFiles = warpsFolder.listFiles();
if (listOfFiles.length >= 1)
{
for (int i = 0; i < listOfFiles.length; i++)
{
String filename = listOfFiles[i].getName();
if (listOfFiles[i].isFile() && filename.endsWith(".yml"))
{
try
{
EssentialsConf conf = new EssentialsConf(listOfFiles[i]);
conf.load();
String name = conf.getString("name");
if (name != null)
{
warpPoints.put(new StringIgnoreCase(name), conf);
}
}
catch (Exception ex)
{
logger.log(Level.WARNING, _("loadWarpError", filename), ex);
}
}
}
}
}
//This is here for future 3.x api support. Not implemented here becasue storage is handled differently
@Override
public File getWarpFile(String name) throws InvalidNameException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int getCount() {
return getList().size();
}
private static class StringIgnoreCase
{
private final String string;
private static class StringIgnoreCase {
private final String string;
public StringIgnoreCase(String string)
{
this.string = string;
}
public StringIgnoreCase(String string) {
this.string = string;
}
@Override
public int hashCode()
{
return getString().toLowerCase(Locale.ENGLISH).hashCode();
}
@Override
public int hashCode() {
return getString().toLowerCase(Locale.ENGLISH).hashCode();
}
@Override
public boolean equals(Object o)
{
if (o instanceof StringIgnoreCase)
{
return getString().equalsIgnoreCase(((StringIgnoreCase)o).getString());
}
return false;
}
@Override
public boolean equals(Object o) {
if (o instanceof StringIgnoreCase) {
return getString().equalsIgnoreCase(((StringIgnoreCase) o).getString());
}
return false;
}
public String getString()
{
return string;
}
}
public String getString() {
return string;
}
}
}
+146 -51
View File
@@ -1,61 +1,156 @@
package com.earth2me.essentials;
import java.io.File;
import java.util.Locale;
import java.util.logging.Logger;
import com.earth2me.essentials.commands.NotEnoughArgumentsException;
import com.earth2me.essentials.utils.VersionUtil;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack;
import java.io.File;
import java.math.BigDecimal;
import java.util.Locale;
public class Worth implements IConf
{
private static final Logger logger = Logger.getLogger("Minecraft");
private final EssentialsConf config;
import static com.earth2me.essentials.I18n.tl;
public Worth(File dataFolder)
{
config = new EssentialsConf(new File(dataFolder, "worth.yml"));
config.setTemplateName("/worth.yml");
config.load();
}
public double getPrice(ItemStack itemStack)
{
String itemname = itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", "");
double result;
result = config.getDouble("worth." + itemname + "." + itemStack.getDurability(), Double.NaN);
if (Double.isNaN(result))
{
result = config.getDouble("worth." + itemname + ".0", Double.NaN);
}
if (Double.isNaN(result))
{
result = config.getDouble("worth." + itemname, Double.NaN);
}
if (Double.isNaN(result))
{
result = config.getDouble("worth-" + itemStack.getTypeId(), Double.NaN);
}
return result;
}
public class Worth implements IConf {
private final EssentialsConf config;
public void setPrice(ItemStack itemStack, double price)
{
if (itemStack.getType().getData() == null)
{
config.setProperty("worth." + itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), price);
}
else
{
// Bukkit-bug: getDurability still contains the correct value, while getData().getData() is 0.
config.setProperty("worth." + itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", "") + "." + itemStack.getDurability(), price);
}
config.removeProperty("worth-" + itemStack.getTypeId());
config.save();
}
public Worth(File dataFolder) {
config = new EssentialsConf(new File(dataFolder, "worth.yml"));
config.setTemplateName("/worth.yml");
config.load();
}
@Override
public void reloadConfig()
{
config.load();
}
/**
* Get the value of an item stack from the config.
*
* @param ess The Essentials instance.
* @param itemStack The item stack to look up in the config.
* @return The price from the config.
*/
public BigDecimal getPrice(IEssentials ess, ItemStack itemStack) {
BigDecimal result;
String itemname = itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", "");
// Check for matches with data value from stack
// Note that we always default to BigDecimal.ONE.negate(), equivalent to -1
result = config.getBigDecimal("worth." + itemname + "." + itemStack.getDurability(), BigDecimal.ONE.negate());
// Check for matches with data value 0
if (result.signum() < 0) {
final ConfigurationSection itemNameMatch = config.getConfigurationSection("worth." + itemname);
if (itemNameMatch != null && itemNameMatch.getKeys(false).size() == 1) {
result = config.getBigDecimal("worth." + itemname + ".0", BigDecimal.ONE.negate());
}
}
// Check for matches with data value wildcard
if (result.signum() < 0) {
result = config.getBigDecimal("worth." + itemname + ".*", BigDecimal.ONE.negate());
}
// Check for matches with item name alone
if (result.signum() < 0) {
result = config.getBigDecimal("worth." + itemname, BigDecimal.ONE.negate());
}
if (result.signum() < 0) {
return null;
}
return result;
}
/**
* Get the amount of items to be sold from a player's inventory.
*
* @param ess The Essentials instance.
* @param user The user attempting to sell the item.
* @param is A stack of the item to search the inventory for.
* @param args The amount to try to sell.
* @param isBulkSell Whether or not to try and bulk sell all items.
* @return The amount of items to sell from the player's inventory.
* @throws Exception Thrown if trying to sell air or an invalid amount.
*/
public int getAmount(IEssentials ess, User user, ItemStack is, String[] args, boolean isBulkSell) throws Exception {
if (is == null || is.getType() == Material.AIR) {
throw new Exception(tl("itemSellAir"));
}
int amount = 0;
if (args.length > 1) {
try {
amount = Integer.parseInt(args[1].replaceAll("[^0-9]", ""));
} catch (NumberFormatException ex) {
throw new NotEnoughArgumentsException(ex);
}
if (args[1].startsWith("-")) {
amount = -amount;
}
}
boolean stack = args.length > 1 && args[1].endsWith("s");
boolean requireStack = ess.getSettings().isTradeInStacks(is.getType());
if (requireStack && !stack) {
throw new Exception(tl("itemMustBeStacked"));
}
int max = 0;
for (ItemStack s : user.getBase().getInventory().getContents()) {
if (s == null || !s.isSimilar(is)) {
continue;
}
max += s.getAmount();
}
if (stack) {
amount *= is.getType().getMaxStackSize();
}
if (amount < 1) {
amount += max;
}
if (requireStack) {
amount -= amount % is.getType().getMaxStackSize();
}
if (amount > max || amount < 1) {
if (!isBulkSell) {
user.sendMessage(tl("itemNotEnough2"));
user.sendMessage(tl("itemNotEnough3"));
throw new Exception(tl("itemNotEnough1"));
} else {
return amount;
}
}
return amount;
}
/**
* Set the price of an item and save it to the config.
*
* @param ess The Essentials instance.
* @param itemStack A stack of the item to save.
* @param price The new price of the item.
*/
public void setPrice(IEssentials ess, ItemStack itemStack, double price) {
String path = "worth." + itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", "");
// Spigot 1.13+ throws an exception if a 1.13+ plugin even *attempts* to do set data.
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01) && itemStack.getType().getData() == null) {
// Bukkit-bug: getDurability still contains the correct value, while getData().getData() is 0.
path = path + "." + itemStack.getDurability();
}
config.setProperty(path, price);
config.save();
}
@Override
public void reloadConfig() {
config.load();
}
}
@@ -1,311 +1,409 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.EssentialsConf;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.EssentialsUserConf;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.User;
import com.earth2me.essentials.Util;
import com.earth2me.essentials.utils.NumberUtil;
import com.earth2me.essentials.utils.StringUtil;
import com.google.common.base.Charsets;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
import java.io.File;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.entity.Player;
/**
* Instead of using this api directly, we recommend to use the register plugin:
* http://bit.ly/RegisterMethod
* Instead of using this api directly, we recommend to use the register plugin: http://bit.ly/RegisterMethod
*/
public final class Economy
{
private Economy()
{
}
private static final Logger logger = Logger.getLogger("Minecraft");
private static IEssentials ess;
private static final String noCallBeforeLoad = "Essentials API is called before Essentials is loaded.";
public class Economy {
public Economy() {
}
/**
* @param aEss the ess to set
*/
public static void setEss(IEssentials aEss)
{
ess = aEss;
}
private static final Logger logger = Logger.getLogger("Essentials");
private static IEssentials ess;
private static final String noCallBeforeLoad = "Essentials API is called before Essentials is loaded.";
public static final MathContext MATH_CONTEXT = MathContext.DECIMAL128;
private static void createNPCFile(String name)
{
File folder = new File(ess.getDataFolder(), "userdata");
if (!folder.exists())
{
folder.mkdirs();
}
EssentialsConf npcConfig = new EssentialsConf(new File(folder, Util.sanitizeFileName(name) + ".yml"));
npcConfig.load();
npcConfig.setProperty("npc", true);
npcConfig.setProperty("money", ess.getSettings().getStartingBalance());
npcConfig.save();
}
/**
* @param aEss the ess to set
*/
public static void setEss(IEssentials aEss) {
ess = aEss;
}
private static void deleteNPC(String name)
{
File folder = new File(ess.getDataFolder(), "userdata");
if (!folder.exists())
{
folder.mkdirs();
}
File config = new File(folder, Util.sanitizeFileName(name) + ".yml");
EssentialsConf npcConfig = new EssentialsConf(config);
npcConfig.load();
if (npcConfig.hasProperty("npc") && npcConfig.getBoolean("npc", false))
{
if (!config.delete())
{
logger.log(Level.WARNING, _("deleteFileError", config));
}
ess.getUserMap().removeUser(name);
}
}
private static void createNPCFile(String name) {
File folder = new File(ess.getDataFolder(), "userdata");
name = StringUtil.safeString(name);
if (!folder.exists()) {
folder.mkdirs();
}
UUID npcUUID = UUID.nameUUIDFromBytes(("NPC:" + name).getBytes(Charsets.UTF_8));
EssentialsUserConf npcConfig = new EssentialsUserConf(name, npcUUID, new File(folder, npcUUID.toString() + ".yml"));
npcConfig.load();
npcConfig.setProperty("npc", true);
npcConfig.setProperty("lastAccountName", name);
npcConfig.setProperty("money", ess.getSettings().getStartingBalance());
npcConfig.forceSave();
ess.getUserMap().trackUUID(npcUUID, name, false);
}
private static User getUserByName(String name)
{
if (ess == null)
{
throw new RuntimeException(noCallBeforeLoad);
}
User user;
Player player = ess.getServer().getPlayer(name);
if (player != null)
{
user = ess.getUser(player);
}
else
{
user = ess.getOfflineUser(name);
}
return user;
}
private static void deleteNPC(String name) {
User user = ess.getUser(name);
user.reset();
}
/**
* Returns the balance of a user
* @param name Name of the user
* @return balance
* @throws UserDoesNotExistException
*/
public static double getMoney(String name) throws UserDoesNotExistException
{
User user = getUserByName(name);
if (user == null)
{
throw new UserDoesNotExistException(name);
}
return user.getMoney();
}
private static User getUserByName(String name) {
if (ess == null) {
throw new RuntimeException(noCallBeforeLoad);
}
if (name == null) {
throw new RuntimeException("Economy username cannot be null");
}
return ess.getUser(name);
}
/**
* Sets the balance of a user
* @param name Name of the user
* @param balance The balance you want to set
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
public static void setMoney(String name, double balance) throws UserDoesNotExistException, NoLoanPermittedException
{
User user = getUserByName(name);
if (user == null)
{
throw new UserDoesNotExistException(name);
}
if (balance < ess.getSettings().getMinMoney())
{
throw new NoLoanPermittedException();
}
if (balance < 0.0 && !user.isAuthorized("essentials.eco.loan"))
{
throw new NoLoanPermittedException();
}
user.setMoney(balance);
}
/**
* Returns the balance of a user
*
* @param name Name of the user
*
* @return balance
*
* @throws UserDoesNotExistException
*/
@Deprecated
public static double getMoney(String name) throws UserDoesNotExistException {
BigDecimal exactAmount = getMoneyExact(name);
double amount = exactAmount.doubleValue();
if (new BigDecimal(amount).compareTo(exactAmount) > 0) {
// closest double is bigger than the exact amount
// -> get the previous double value to not return more money than the user has
amount = Math.nextAfter(amount, Double.NEGATIVE_INFINITY);
}
return amount;
}
/**
* Adds money to the balance of a user
* @param name Name of the user
* @param amount The money you want to add
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
public static void add(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException
{
double result = getMoney(name) + amount;
setMoney(name, result);
}
public static BigDecimal getMoneyExact(String name) throws UserDoesNotExistException {
User user = getUserByName(name);
if (user == null) {
throw new UserDoesNotExistException(name);
}
return user.getMoney();
}
/**
* Substracts money from the balance of a user
* @param name Name of the user
* @param amount The money you want to substract
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
public static void subtract(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException
{
double result = getMoney(name) - amount;
setMoney(name, result);
}
/**
* Sets the balance of a user
*
* @param name Name of the user
* @param balance The balance you want to set
*
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
@Deprecated
public static void setMoney(String name, double balance) throws UserDoesNotExistException, NoLoanPermittedException {
try {
setMoney(name, BigDecimal.valueOf(balance));
} catch (ArithmeticException e) {
logger.log(Level.WARNING, "Failed to set balance of " + name + " to " + balance + ": " + e.getMessage(), e);
}
}
/**
* Divides the balance of a user by a value
* @param name Name of the user
* @param value The balance is divided by this value
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
public static void divide(String name, double value) throws UserDoesNotExistException, NoLoanPermittedException
{
double result = getMoney(name) / value;
setMoney(name, result);
}
public static void setMoney(String name, BigDecimal balance) throws UserDoesNotExistException, NoLoanPermittedException {
User user = getUserByName(name);
if (user == null) {
throw new UserDoesNotExistException(name);
}
if (balance.compareTo(ess.getSettings().getMinMoney()) < 0) {
throw new NoLoanPermittedException();
}
if (balance.signum() < 0 && !user.isAuthorized("essentials.eco.loan")) {
throw new NoLoanPermittedException();
}
try {
user.setMoney(balance);
} catch (MaxMoneyException ex) {
//TODO: Update API to show max balance errors
}
Trade.log("API", "Set", "API", name, new Trade(balance, ess), null, null, null, ess);
}
/**
* Multiplies the balance of a user by a value
* @param name Name of the user
* @param value The balance is multiplied by this value
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
public static void multiply(String name, double value) throws UserDoesNotExistException, NoLoanPermittedException
{
double result = getMoney(name) * value;
setMoney(name, result);
}
/**
* Adds money to the balance of a user
*
* @param name Name of the user
* @param amount The money you want to add
*
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
@Deprecated
public static void add(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException {
try {
add(name, BigDecimal.valueOf(amount));
} catch (ArithmeticException e) {
logger.log(Level.WARNING, "Failed to add " + amount + " to balance of " + name + ": " + e.getMessage(), e);
}
}
/**
* Resets the balance of a user to the starting balance
* @param name Name of the user
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
public static void resetBalance(String name) throws UserDoesNotExistException, NoLoanPermittedException
{
if (ess == null)
{
throw new RuntimeException(noCallBeforeLoad);
}
setMoney(name, ess.getSettings().getStartingBalance());
}
public static void add(String name, BigDecimal amount) throws UserDoesNotExistException, NoLoanPermittedException, ArithmeticException {
BigDecimal result = getMoneyExact(name).add(amount, MATH_CONTEXT);
setMoney(name, result);
Trade.log("API", "Add", "API", name, new Trade(amount, ess), null, null, null, ess);
}
/**
* @param name Name of the user
* @param amount The amount of money the user should have
* @return true, if the user has more or an equal amount of money
* @throws UserDoesNotExistException If a user by that name does not exists
*/
public static boolean hasEnough(String name, double amount) throws UserDoesNotExistException
{
return amount <= getMoney(name);
}
/**
* Substracts money from the balance of a user
*
* @param name Name of the user
* @param amount The money you want to substract
*
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
@Deprecated
public static void subtract(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException {
try {
substract(name, BigDecimal.valueOf(amount));
} catch (ArithmeticException e) {
logger.log(Level.WARNING, "Failed to substract " + amount + " of balance of " + name + ": " + e.getMessage(), e);
}
}
/**
* @param name Name of the user
* @param amount The amount of money the user should have
* @return true, if the user has more money
* @throws UserDoesNotExistException If a user by that name does not exists
*/
public static boolean hasMore(String name, double amount) throws UserDoesNotExistException
{
return amount < getMoney(name);
}
public static void substract(String name, BigDecimal amount) throws UserDoesNotExistException, NoLoanPermittedException, ArithmeticException {
BigDecimal result = getMoneyExact(name).subtract(amount, MATH_CONTEXT);
setMoney(name, result);
Trade.log("API", "Subtract", "API", name, new Trade(amount, ess), null, null, null, ess);
}
/**
* @param name Name of the user
* @param amount The amount of money the user should not have
* @return true, if the user has less money
* @throws UserDoesNotExistException If a user by that name does not exists
*/
public static boolean hasLess(String name, double amount) throws UserDoesNotExistException
{
return amount > getMoney(name);
}
/**
* Divides the balance of a user by a value
*
* @param name Name of the user
* @param amount The balance is divided by this value
*
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
@Deprecated
public static void divide(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException {
try {
divide(name, BigDecimal.valueOf(amount));
} catch (ArithmeticException e) {
logger.log(Level.WARNING, "Failed to divide balance of " + name + " by " + amount + ": " + e.getMessage(), e);
}
}
/**
* Test if the user has a negative balance
* @param name Name of the user
* @return true, if the user has a negative balance
* @throws UserDoesNotExistException If a user by that name does not exists
*/
public static boolean isNegative(String name) throws UserDoesNotExistException
{
return getMoney(name) < 0.0;
}
public static void divide(String name, BigDecimal amount) throws UserDoesNotExistException, NoLoanPermittedException, ArithmeticException {
BigDecimal result = getMoneyExact(name).divide(amount, MATH_CONTEXT);
setMoney(name, result);
Trade.log("API", "Divide", "API", name, new Trade(amount, ess), null, null, null, ess);
}
/**
* Formats the amount of money like all other Essentials functions.
* Example: $100000 or $12345.67
* @param amount The amount of money
* @return Formatted money
*/
public static String format(double amount)
{
if (ess == null)
{
throw new RuntimeException(noCallBeforeLoad);
}
return Util.displayCurrency(amount, ess);
}
/**
* Multiplies the balance of a user by a value
*
* @param name Name of the user
* @param amount The balance is multiplied by this value
*
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
@Deprecated
public static void multiply(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException {
try {
multiply(name, BigDecimal.valueOf(amount));
} catch (ArithmeticException e) {
logger.log(Level.WARNING, "Failed to multiply balance of " + name + " by " + amount + ": " + e.getMessage(), e);
}
}
/**
* Test if a player exists to avoid the UserDoesNotExistException
* @param name Name of the user
* @return true, if the user exists
*/
public static boolean playerExists(String name)
{
return getUserByName(name) != null;
}
public static void multiply(String name, BigDecimal amount) throws UserDoesNotExistException, NoLoanPermittedException, ArithmeticException {
BigDecimal result = getMoneyExact(name).multiply(amount, MATH_CONTEXT);
setMoney(name, result);
Trade.log("API", "Multiply", "API", name, new Trade(amount, ess), null, null, null, ess);
}
/**
* Test if a player is a npc
* @param name Name of the player
* @return true, if it's a npc
* @throws UserDoesNotExistException
*/
public static boolean isNPC(String name) throws UserDoesNotExistException
{
User user = getUserByName(name);
if (user == null)
{
throw new UserDoesNotExistException(name);
}
return user.isNPC();
}
/**
* Resets the balance of a user to the starting balance
*
* @param name Name of the user
*
* @throws UserDoesNotExistException If a user by that name does not exists
* @throws NoLoanPermittedException If the user is not allowed to have a negative balance
*/
public static void resetBalance(String name) throws UserDoesNotExistException, NoLoanPermittedException {
if (ess == null) {
throw new RuntimeException(noCallBeforeLoad);
}
setMoney(name, ess.getSettings().getStartingBalance());
Trade.log("API", "Reset", "API", name, new Trade(BigDecimal.ZERO, ess), null, null, null, ess);
}
/**
* Creates dummy files for a npc, if there is no player yet with that name.
* @param name Name of the player
* @return true, if a new npc was created
*/
public static boolean createNPC(String name)
{
User user = getUserByName(name);
if (user == null)
{
createNPCFile(name);
return true;
}
return false;
}
/**
* @param name Name of the user
* @param amount The amount of money the user should have
*
* @return true, if the user has more or an equal amount of money
*
* @throws UserDoesNotExistException If a user by that name does not exists
*/
@Deprecated
public static boolean hasEnough(String name, double amount) throws UserDoesNotExistException {
try {
return hasEnough(name, BigDecimal.valueOf(amount));
} catch (ArithmeticException e) {
logger.log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
return false;
}
}
/**
* Deletes a user, if it is marked as npc.
* @param name Name of the player
* @throws UserDoesNotExistException
*/
public static void removeNPC(String name) throws UserDoesNotExistException
{
User user = getUserByName(name);
if (user == null)
{
throw new UserDoesNotExistException(name);
}
deleteNPC(name);
}
public static boolean hasEnough(String name, BigDecimal amount) throws UserDoesNotExistException, ArithmeticException {
return amount.compareTo(getMoneyExact(name)) <= 0;
}
/**
* @param name Name of the user
* @param amount The amount of money the user should have
*
* @return true, if the user has more money
*
* @throws UserDoesNotExistException If a user by that name does not exists
*/
@Deprecated
public static boolean hasMore(String name, double amount) throws UserDoesNotExistException {
try {
return hasMore(name, BigDecimal.valueOf(amount));
} catch (ArithmeticException e) {
logger.log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
return false;
}
}
public static boolean hasMore(String name, BigDecimal amount) throws UserDoesNotExistException, ArithmeticException {
return amount.compareTo(getMoneyExact(name)) < 0;
}
/**
* @param name Name of the user
* @param amount The amount of money the user should not have
*
* @return true, if the user has less money
*
* @throws UserDoesNotExistException If a user by that name does not exists
*/
@Deprecated
public static boolean hasLess(String name, double amount) throws UserDoesNotExistException {
try {
return hasLess(name, BigDecimal.valueOf(amount));
} catch (ArithmeticException e) {
logger.log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
return false;
}
}
public static boolean hasLess(String name, BigDecimal amount) throws UserDoesNotExistException, ArithmeticException {
return amount.compareTo(getMoneyExact(name)) > 0;
}
/**
* Test if the user has a negative balance
*
* @param name Name of the user
*
* @return true, if the user has a negative balance
*
* @throws UserDoesNotExistException If a user by that name does not exists
*/
public static boolean isNegative(String name) throws UserDoesNotExistException {
return getMoneyExact(name).signum() < 0;
}
/**
* Formats the amount of money like all other Essentials functions. Example: $100000 or $12345.67
*
* @param amount The amount of money
*
* @return Formatted money
*/
@Deprecated
public static String format(double amount) {
try {
return format(BigDecimal.valueOf(amount));
} catch (NumberFormatException e) {
logger.log(Level.WARNING, "Failed to display " + amount + ": " + e.getMessage(), e);
return "NaN";
}
}
public static String format(BigDecimal amount) {
if (ess == null) {
throw new RuntimeException(noCallBeforeLoad);
}
return NumberUtil.displayCurrency(amount, ess);
}
/**
* Test if a player exists to avoid the UserDoesNotExistException
*
* @param name Name of the user
*
* @return true, if the user exists
*/
public static boolean playerExists(String name) {
return getUserByName(name) != null;
}
/**
* Test if a player is a npc
*
* @param name Name of the player
*
* @return true, if it's a npc
*
* @throws UserDoesNotExistException
*/
public static boolean isNPC(String name) throws UserDoesNotExistException {
User user = getUserByName(name);
if (user == null) {
throw new UserDoesNotExistException(name);
}
return user.isNPC();
}
/**
* Creates dummy files for a npc, if there is no player yet with that name.
*
* @param name Name of the player
*
* @return true, if a new npc was created
*/
public static boolean createNPC(String name) {
User user = getUserByName(name);
if (user == null) {
createNPCFile(name);
return true;
}
return false;
}
/**
* Deletes a user, if it is marked as npc.
*
* @param name Name of the player
*
* @throws UserDoesNotExistException
*/
public static void removeNPC(String name) throws UserDoesNotExistException {
User user = getUserByName(name);
if (user == null) {
throw new UserDoesNotExistException(name);
}
deleteNPC(name);
}
}
@@ -1,10 +0,0 @@
package com.earth2me.essentials.api;
import java.util.Map;
import org.bukkit.command.PluginCommand;
public interface IAlternativeCommandsHandler
{
Map<String, String> disabledCommands();
}
@@ -1,51 +0,0 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.perm.IPermissionsHandler;
import com.earth2me.essentials.register.payment.Methods;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
public interface IEssentials extends Plugin, IReload
{
void addReloadListener(IReload listener);
IUser getUser(Object base);
int broadcastMessage(IUser sender, String message);
II18n getI18n();
ISettings getSettings();
IJails getJail();
IWarps getWarps();
IWorth getWorth();
IItemDb getItemDb();
IUserMap getUserMap();
IEssentialsEconomy getEconomy();
World getWorld(String name);
Methods getPaymentMethod();
int scheduleAsyncDelayedTask(Runnable run);
int scheduleSyncDelayedTask(Runnable run);
int scheduleSyncDelayedTask(Runnable run, long delay);
int scheduleSyncRepeatingTask(Runnable run, long delay, long period);
IPermissionsHandler getPermissionsHandler();
IAlternativeCommandsHandler getAlternativeCommandsHandler();
void showCommandError(CommandSender sender, String commandLabel, Throwable exception);
}
@@ -1,37 +0,0 @@
package com.earth2me.essentials.api;
public interface IEssentialsEconomy
{
double getMoney(String name) throws UserDoesNotExistException;
void setMoney(String name, double balance) throws UserDoesNotExistException, NoLoanPermittedException;
void add(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException;
void subtract(String name, double amount) throws UserDoesNotExistException, NoLoanPermittedException;
void divide(String name, double value) throws UserDoesNotExistException, NoLoanPermittedException;
void multiply(String name, double value) throws UserDoesNotExistException, NoLoanPermittedException;
void resetBalance(String name) throws UserDoesNotExistException, NoLoanPermittedException;
boolean hasEnough(String name, double amount) throws UserDoesNotExistException;
boolean hasMore(String name, double amount) throws UserDoesNotExistException;
boolean hasLess(String name, double amount) throws UserDoesNotExistException;
boolean isNegative(String name) throws UserDoesNotExistException;
String format(double amount);
boolean playerExists(String name);
boolean isNPC(String name) throws UserDoesNotExistException;
boolean createNPC(String name);
void removeNPC(String name) throws UserDoesNotExistException;
}
@@ -3,7 +3,11 @@ package com.earth2me.essentials.api;
import java.util.Locale;
public interface II18n
{
Locale getCurrentLocale();
public interface II18n {
/**
* Gets the current locale setting
*
* @return the current locale, if not set it will return the default locale
*/
Locale getCurrentLocale();
}
@@ -1,11 +1,156 @@
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;
ItemStack get(final String name) throws Exception;
public interface IItemDb {
/**
* 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;
/**
* 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
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);
}
}
@@ -1,20 +1,65 @@
package com.earth2me.essentials.api;
import java.util.Collection;
import net.ess3.api.IUser;
import org.bukkit.Location;
import java.util.Collection;
public interface IJails extends IReload
{
Location getJail(String jailName) throws Exception;
Collection<String> getList() throws Exception;
public interface IJails extends IReload {
/**
* Gets the location of the jail with the given name
*
* @param jailName The name of the jail
*
* @return the location of the jail
*
* @throws Exception if the jail does not exist
*/
Location getJail(String jailName) throws Exception;
int getCount();
/**
* Gets a list of jails by names
*
* @return a list of jails, if there are none the list will be empty
*
* @throws Exception
*/
Collection<String> getList() throws Exception;
void removeJail(String jail) throws Exception;
/**
* Gets the number of jails
*
* @return the size of the list of jails
*/
int getCount();
void sendToJail(com.earth2me.essentials.IUser user, String jail) throws Exception;
/**
* Remove the jail with the given name
*
* @param jail the jail to remove
*
* @throws Exception if the jail does not exist
*/
void removeJail(String jail) throws Exception;
void setJail(String jailName, Location loc) throws Exception;
/**
* Attempts to send the given user to the given jail
*
* @param user the user to send to jail
* @param jail the jail to send the user to
*
* @throws Exception if the user is offline or jail does not exist
*/
void sendToJail(IUser user, String jail) throws Exception;
/**
* Set a new jail with the given name and location
*
* @param jailName the name of the jail being set
* @param loc the location of the jail being set
*
* @throws Exception
*/
void setJail(String jailName, Location loc) throws Exception;
}
@@ -1,7 +1,6 @@
package com.earth2me.essentials.api;
public interface IReload
{
void onReload();
public interface IReload {
void onReload();
}
@@ -1,10 +0,0 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.settings.Settings;
import com.earth2me.essentials.storage.IStorageObjectHolder;
public interface ISettings extends IStorageObjectHolder<Settings>
{
}
@@ -1,10 +1,120 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.Trade;
import net.ess3.api.IUser;
import org.bukkit.Location;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerTeleportEvent;
public interface ITeleport
{
void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception;
public interface ITeleport {
/**
* Used to skip teleportPlayer delay when teleporting someone to a location or player.
*
* @param loc - Where should the player end up
* @param cooldown - If cooldown should be enforced
* @param cause - The reported teleportPlayer cause
*
* @throws Exception
*/
void now(Location loc, boolean cooldown, PlayerTeleportEvent.TeleportCause cause) throws Exception;
/**
* Used to skip teleportPlayer delay when teleporting someone to a location or player.
*
* @param entity - Where should the player end up
* @param cooldown - If cooldown should be enforced
* @param cause - The reported teleportPlayer cause
*
* @throws Exception
*/
void now(Player entity, boolean cooldown, PlayerTeleportEvent.TeleportCause cause) throws Exception;
@Deprecated
void teleport(Location loc, Trade chargeFor) throws Exception;
/**
* Teleport a player to a specific location
*
* @param loc - Where should the player end up
* @param chargeFor - What the user will be charged if teleportPlayer is successful
* @param cause - The reported teleportPlayer cause
*
* @throws Exception
*/
void teleport(Location loc, Trade chargeFor, PlayerTeleportEvent.TeleportCause cause) throws Exception;
/**
* Teleport a player to a specific player
*
* @param entity - Where should the player end up
* @param chargeFor - What the user will be charged if teleportPlayer is successful
* @param cause - The reported teleportPlayer cause
*
* @throws Exception
*/
void teleport(Player entity, Trade chargeFor, PlayerTeleportEvent.TeleportCause cause) throws Exception;
/**
* Teleport a player to a specific location
*
* @param otherUser - Which user will be teleported
* @param loc - Where should the player end up
* @param chargeFor - What the user will be charged if teleportPlayer is successful
* @param cause - The reported teleportPlayer cause
*
* @throws Exception
*/
void teleportPlayer(IUser otherUser, Location loc, Trade chargeFor, PlayerTeleportEvent.TeleportCause cause) throws Exception;
/**
* Teleport a player to a specific player
*
* @param otherUser - Which user will be teleported
* @param entity - Where should the player end up
* @param chargeFor - What the user will be charged if teleportPlayer is successful
* @param cause - The reported teleportPlayer cause
*
* @throws Exception
*/
void teleportPlayer(IUser otherUser, Player entity, Trade chargeFor, PlayerTeleportEvent.TeleportCause cause) throws Exception;
/**
* Teleport wrapper used to handle tp fallback on /jail and /home
*
* @param chargeFor - What the user will be charged if teleportPlayer is successful
* @param cause - The reported teleportPlayer cause
*
* @throws Exception
*/
void respawn(final Trade chargeFor, PlayerTeleportEvent.TeleportCause cause) throws Exception;
/**
* Teleport wrapper used to handle /warp teleports
*
* @param otherUser - Which user will be teleported
* @param warp - The name of the warp the user will be teleported too.
* @param chargeFor - What the user will be charged if teleportPlayer is successful
* @param cause - The reported teleportPlayer cause
*
* @throws Exception
*/
void warp(IUser otherUser, String warp, Trade chargeFor, PlayerTeleportEvent.TeleportCause cause) throws Exception;
/**
* Teleport wrapper used to handle /back teleports
*
* @param chargeFor - What the user will be charged if teleportPlayer is successful
*
* @throws Exception
*/
void back(Trade chargeFor) throws Exception;
/**
* Teleport wrapper used to handle throwing user home after a jail sentence
*
* @throws Exception
*/
void back() throws Exception;
}
@@ -1,43 +0,0 @@
package com.earth2me.essentials.api;
import com.earth2me.essentials.commands.IEssentialsCommand;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public interface IUser extends Player, IReload
{
long getLastTeleportTimestamp();
boolean isAuthorized(String node);
boolean isAuthorized(IEssentialsCommand cmd);
boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix);
void setLastTeleportTimestamp(long time);
Location getLastLocation();
Player getBase();
double getMoney();
void takeMoney(double value);
void giveMoney(double value);
String getGroup();
void setLastLocation();
Location getHome(String name) throws Exception;
Location getHome(Location loc) throws Exception;
boolean isHidden();
ITeleport getTeleport();
void setJail(String jail);
}
@@ -1,20 +0,0 @@
package com.earth2me.essentials.api;
import java.io.File;
import java.util.Set;
public interface IUserMap
{
boolean userExists(final String name);
IUser getUser(final String name);
void removeUser(final String name);
Set<String> getAllUniqueUsers();
int getUniqueUsers();
File getUserFile(final String name);
}
@@ -1,16 +1,95 @@
package com.earth2me.essentials.api;
import java.util.Collection;
import com.earth2me.essentials.IConf;
import com.earth2me.essentials.IUser;
import com.earth2me.essentials.commands.WarpNotFoundException;
import org.bukkit.Location;
import java.io.File;
import java.util.Collection;
import java.util.UUID;
public interface IWarps extends IReload
{
Location getWarp(String warp) throws Exception;
Collection<String> getWarps();
public interface IWarps extends IConf {
/**
* Get a warp by name
*
* @param warp - Warp name
*
* @return - Location the warp is set to
*
* @throws WarpNotFoundException When the warp is not found
* @throws InvalidWorldException When the world the warp is in is not found
*/
Location getWarp(String warp) throws WarpNotFoundException, net.ess3.api.InvalidWorldException;
void removeWarp(String name) throws Exception;
/**
* Gets a list of warps
*
* @return - A {@link Collection} of warps
*/
Collection<String> getList();
void setWarp(String name, Location loc) throws Exception;
/**
* Gets the number of warps
*
* @return the size of the list of warps
*/
int getCount();
/**
* Delete a warp from the warp DB
*
* @param name - Name of warp
*
* @throws Exception
*/
void removeWarp(String name) throws Exception;
/**
* Set a warp
*
* @param name - Name of warp
* @param loc - Location of warp
*
* @throws Exception
*/
void setWarp(String name, Location loc) throws Exception;
/**
* Set a warp
*
* @param user - User of warp
* @param name - Name of warp
* @param loc - Location of warp
*
* @throws Exception
*/
void setWarp(IUser user, String name, Location loc) throws Exception;
/**
* Gets Lastowner UUID
*
* @param name - Name of warp
*
* @throws WarpNotFoundException
*/
UUID getLastOwner(String warp) throws WarpNotFoundException;
/**
* Check to see if the file is empty
*
* @return
*/
boolean isEmpty();
/**
* Get a warp file note: this is not yet implemented, as 3.x uses different storage methods
*
* @param name - name of file
*
* @return - an instance of the file
*
* @throws InvalidNameException - When the file is not found
*/
File getWarpFile(String name) throws net.ess3.api.InvalidNameException;
}
@@ -1,11 +0,0 @@
package com.earth2me.essentials.api;
import org.bukkit.inventory.ItemStack;
public interface IWorth extends IReload
{
double getPrice(ItemStack itemStack);
void setPrice(ItemStack itemStack, double price);
}
@@ -0,0 +1,14 @@
package com.earth2me.essentials.api;
public class InvalidNameException extends Exception {
/**
* NOTE: This is not implemented yet, just here for future 3.x api support Allow serialization of the
* InvalidNameException exception
*/
private static final long serialVersionUID = 1485321420293663139L;
public InvalidNameException(Throwable thrwbl) {
super(thrwbl);
}
}
@@ -0,0 +1,17 @@
package com.earth2me.essentials.api;
import static com.earth2me.essentials.I18n.tl;
public class InvalidWorldException extends Exception {
private final String world;
public InvalidWorldException(final String world) {
super(tl("invalidWorld"));
this.world = world;
}
public String getWorld() {
return this.world;
}
}
@@ -1,12 +1,6 @@
package com.earth2me.essentials.api;
import static com.earth2me.essentials.I18n._;
public class NoLoanPermittedException extends net.ess3.api.NoLoanPermittedException {
public class NoLoanPermittedException extends Exception
{
public NoLoanPermittedException()
{
super(_("negativeBalanceError"));
}
}
@@ -1,12 +1,10 @@
package com.earth2me.essentials.api;
import static com.earth2me.essentials.I18n._;
import static com.earth2me.essentials.I18n.tl;
public class UserDoesNotExistException extends Exception
{
public UserDoesNotExistException(String name)
{
super(_("userDoesNotExist", name));
}
public class UserDoesNotExistException extends Exception {
public UserDoesNotExistException(String name) {
super(tl("userDoesNotExist", name));
}
}
@@ -1,53 +1,103 @@
package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User;
import org.bukkit.Server;
import java.util.Collections;
import java.util.List;
public class Commandafk extends EssentialsCommand
{
public Commandafk()
{
super("afk");
}
import static com.earth2me.essentials.I18n.tl;
@Override
public void run(Server server, User user, String commandLabel, String[] args) throws Exception
{
if (args.length > 0 && user.isAuthorized("essentials.afk.others"))
{
User afkUser = ess.getUser(ess.getServer().matchPlayer(args[0]));
if (afkUser != null)
{
toggleAfk(afkUser);
}
}
else
{
toggleAfk(user);
}
}
private void toggleAfk(User user)
{
user.setDisplayNick();
if (!user.toggleAfk())
{
//user.sendMessage(_("markedAsNotAway"));
if (!user.isHidden())
{
ess.broadcastMessage(user, _("userIsNotAway", user.getDisplayName()));
}
user.updateActivity(false);
}
else
{
//user.sendMessage(_("markedAsAway"));
if (!user.isHidden())
{
ess.broadcastMessage(user, _("userIsAway", user.getDisplayName()));
}
}
}
public class Commandafk extends EssentialsCommand {
public Commandafk() {
super("afk");
}
@Override
public void run(Server server, User user, String commandLabel, String[] args) throws Exception {
if (args.length > 0 && user.isAuthorized("essentials.afk.others")) {
User afkUser = user; // if no player found, but message specified, set command executor to target user
String message;
try {
afkUser = getPlayer(server, user, args, 0);
message = args.length > 1 ? getFinalArg(args, 1) : null;
} catch (PlayerNotFoundException e) {
// If only one arg is passed, assume the command executor is targeting another player.
if (args.length == 1) {
throw e;
}
message = getFinalArg(args, 0);
}
toggleAfk(user, afkUser, message);
} else {
String message = args.length > 0 ? getFinalArg(args, 0) : null;
toggleAfk(user, user, message);
}
}
@Override
public void run(Server server, CommandSource sender, String commandLabel, String[] args) throws Exception {
if (args.length > 0) {
User afkUser = getPlayer(server, args, 0, true, false);
String message = args.length > 1 ? getFinalArg(args, 1) : null;
toggleAfk(null, afkUser, message);
} else {
throw new NotEnoughArgumentsException();
}
}
private void toggleAfk(User sender, User user, String message) throws Exception {
if (message != null && sender != null) {
if (sender.isMuted()) {
throw new Exception(tl("voiceSilenced"));
}
if (!sender.isAuthorized("essentials.afk.message")) {
throw new Exception(tl("noPermToAFKMessage"));
}
}
user.setDisplayNick();
String msg = "";
if (!user.toggleAfk()) {
//user.sendMessage(_("markedAsNotAway"));
if (!user.isHidden()) {
msg = tl("userIsNotAway", user.getDisplayName());
}
user.updateActivity(false);
} else {
//user.sendMessage(_("markedAsAway"));
if (!user.isHidden()) {
if (message != null) {
msg = tl("userIsAwayWithMessage", user.getDisplayName(), message);
} else {
msg = tl("userIsAway", user.getDisplayName());
}
}
user.setAfkMessage(message);
}
if (!msg.isEmpty()) {
ess.broadcastMessage(user, msg);
}
user.setDisplayNick(); // Set this again after toggling
}
@Override
protected List<String> getTabCompleteOptions(Server server, User user, String commandLabel, String[] args) {
if (args.length == 1 && user.isAuthorized("essentials.afk.others")) {
return getPlayers(server, user);
} else {
return Collections.emptyList();
}
}
@Override
protected List<String> getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) {
if (args.length == 1) {
return getPlayers(server, sender);
} else {
return Collections.emptyList();
}
}
}
@@ -1,29 +1,25 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.User;
import com.earth2me.essentials.Util;
import com.earth2me.essentials.utils.LocationUtil;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.entity.TNTPrimed;
// This command has a in theme message that only shows if you supply a parameter #EasterEgg
public class Commandantioch extends EssentialsCommand {
public Commandantioch() {
super("antioch");
}
public class Commandantioch extends EssentialsCommand
{
public Commandantioch()
{
super("antioch");
}
@Override
public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception {
if (args.length > 0) {
ess.broadcastMessage(user, "...lobbest thou thy Holy Hand Grenade of Antioch towards thy foe,");
ess.broadcastMessage(user, "who being naughty in My sight, shall snuff it.");
}
@Override
public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception
{
if (args.length > 0)
{
ess.broadcastMessage(user, "...lobbest thou thy Holy Hand Grenade of Antioch towards thy foe,");
ess.broadcastMessage(user, "who being naughty in My sight, shall snuff it.");
}
final Location loc = Util.getTarget(user);
loc.getWorld().spawn(loc, TNTPrimed.class);
}
final Location loc = LocationUtil.getTarget(user.getBase());
loc.getWorld().spawn(loc, TNTPrimed.class);
}
}
@@ -1,30 +1,36 @@
package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.User;
import org.bukkit.Server;
import static com.earth2me.essentials.I18n.tl;
public class Commandback extends EssentialsCommand
{
public Commandback()
{
super("back");
}
@Override
protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception
{
if (user.getWorld() != user.getLastLocation().getWorld() && ess.getSettings().isWorldTeleportPermissions()
&& !user.isAuthorized("essentials.world." + user.getLastLocation().getWorld().getName()))
{
throw new Exception(_("noPerm", "essentials.world." + user.getLastLocation().getWorld().getName()));
}
final Trade charge = new Trade(this.getName(), ess);
charge.isAffordableFor(user);
user.sendMessage(_("backUsageMsg"));
user.getTeleport().back(charge);
throw new NoChargeException();
}
public class Commandback extends EssentialsCommand {
public Commandback() {
super("back");
}
@Override
protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception {
if (user.getLastLocation() == null) {
throw new Exception(tl("noLocationFound"));
}
String lastWorldName = user.getLastLocation().getWorld().getName();
if (user.getWorld() != user.getLastLocation().getWorld() && ess.getSettings().isWorldTeleportPermissions() && !user.isAuthorized("essentials.worlds." + lastWorldName)) {
throw new Exception(tl("noPerm", "essentials.worlds." + lastWorldName));
}
if (!user.isAuthorized("essentials.back.into." + lastWorldName)) {
throw new Exception(tl("noPerm", "essentials.back.into." + lastWorldName));
}
final Trade charge = new Trade(this.getName(), ess);
charge.isAffordableFor(user);
user.getTeleport().back(charge);
throw new NoChargeException();
}
}
@@ -1,32 +1,28 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.Backup;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.CommandSource;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import static com.earth2me.essentials.I18n.tl;
public class Commandbackup extends EssentialsCommand
{
public Commandbackup()
{
super("backup");
}
public class Commandbackup extends EssentialsCommand {
public Commandbackup() {
super("backup");
}
@Override
protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception
{
final Backup backup = ess.getBackup();
if (backup == null)
{
throw new Exception(_("backupDisabled"));
}
final String command = ess.getSettings().getBackupCommand();
if (command == null || "".equals(command) || "save-all".equalsIgnoreCase(command))
{
throw new Exception(_("backupDisabled"));
}
backup.run();
sender.sendMessage(_("backupStarted"));
}
@Override
protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception {
final Backup backup = ess.getBackup();
if (backup == null) {
throw new Exception(tl("backupDisabled"));
}
final String command = ess.getSettings().getBackupCommand();
if (command == null || "".equals(command) || "save-all".equalsIgnoreCase(command)) {
throw new Exception(tl("backupDisabled"));
}
backup.run();
sender.sendMessage(tl("backupStarted"));
}
}
@@ -1,37 +1,61 @@
package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User;
import com.earth2me.essentials.Util;
import com.earth2me.essentials.utils.NumberUtil;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import static com.earth2me.essentials.I18n.tl;
public class Commandbalance extends EssentialsCommand
{
public Commandbalance()
{
super("balance");
}
public class Commandbalance extends EssentialsCommand {
public Commandbalance() {
super("balance");
}
@Override
protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception
{
if (args.length < 1)
{
throw new NotEnoughArgumentsException();
}
sender.sendMessage(_("balance", Util.displayCurrency(getPlayer(server, args, 0, true).getMoney(), ess)));
}
@Override
protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception {
if (args.length < 1) {
throw new NotEnoughArgumentsException();
}
@Override
public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception
{
final double bal = (args.length < 1
|| !(user.isAuthorized("essentials.balance.others")
|| user.isAuthorized("essentials.balance.other"))
? user
: getPlayer(server, args, 0, true)).getMoney();
user.sendMessage(_("balance", Util.displayCurrency(bal, ess)));
}
User target = getPlayer(server, args, 0, true, true);
sender.sendMessage(tl("balanceOther", target.isHidden() ? target.getName() : target.getDisplayName(), NumberUtil.displayCurrency(target.getMoney(), ess)));
}
@Override
public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception {
if (args.length == 1 && user.isAuthorized("essentials.balance.others")) {
final User target = getPlayer(server, args, 0, true, true);
final BigDecimal bal = target.getMoney();
user.sendMessage(tl("balanceOther", target.isHidden() ? target.getName() : target.getDisplayName(), NumberUtil.displayCurrency(bal, ess)));
} else if (args.length < 2) {
final BigDecimal bal = user.getMoney();
user.sendMessage(tl("balance", NumberUtil.displayCurrency(bal, ess)));
} else {
throw new NotEnoughArgumentsException();
}
}
@Override
protected List<String> getTabCompleteOptions(Server server, User user, String commandLabel, String[] args) {
if (args.length == 1 && user.isAuthorized("essentials.balance.others")) {
return getPlayers(server, user);
} else {
return Collections.emptyList();
}
}
@Override
protected List<String> getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) {
if (args.length == 1) {
return getPlayers(server, sender);
} else {
return Collections.emptyList();
}
}
}
@@ -1,184 +1,178 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.Util;
import com.earth2me.essentials.textreader.ArrayListInput;
import com.earth2me.essentials.textreader.SimpleTextInput;
import com.earth2me.essentials.textreader.TextPager;
import com.earth2me.essentials.utils.NumberUtil;
import com.google.common.collect.Lists;
import org.bukkit.Server;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import static com.earth2me.essentials.I18n.tl;
public class Commandbalancetop extends EssentialsCommand
{
public Commandbalancetop()
{
super("balancetop");
}
private static final int CACHETIME = 2 * 60 * 1000;
public static final int MINUSERS = 50;
private static ArrayListInput cache = new ArrayListInput();
private static long cacheage = 0;
private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public class Commandbalancetop extends EssentialsCommand {
public Commandbalancetop() {
super("balancetop");
}
@Override
protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception
{
int page = 0;
boolean force = false;
if (args.length > 0)
{
try
{
page = Integer.parseInt(args[0]);
}
catch (NumberFormatException ex)
{
if (args[0].equalsIgnoreCase("force") && sender.isOp())
{
force = true;
}
}
}
private static final int CACHETIME = 2 * 60 * 1000;
public static final int MINUSERS = 50;
private static final SimpleTextInput cache = new SimpleTextInput();
private static long cacheage = 0;
private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
if (!force && lock.readLock().tryLock())
{
try
{
if (cacheage > System.currentTimeMillis() - CACHETIME)
{
outputCache(sender, page);
return;
}
if (ess.getUserMap().getUniqueUsers() > MINUSERS)
{
sender.sendMessage(_("orderBalances", ess.getUserMap().getUniqueUsers()));
}
}
finally
{
lock.readLock().unlock();
}
ess.scheduleAsyncDelayedTask(new Viewer(sender, page, force));
}
else
{
if (ess.getUserMap().getUniqueUsers() > MINUSERS)
{
sender.sendMessage(_("orderBalances", ess.getUserMap().getUniqueUsers()));
}
ess.scheduleAsyncDelayedTask(new Viewer(sender, page, force));
}
@Override
protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception {
int page = 0;
boolean force = false;
if (args.length > 0) {
try {
page = Integer.parseInt(args[0]);
} catch (NumberFormatException ex) {
if (args[0].equalsIgnoreCase("force") && (!sender.isPlayer() || ess.getUser(sender.getPlayer()).isAuthorized("essentials.balancetop.force"))) {
force = true;
}
}
}
}
if (!force && lock.readLock().tryLock()) {
try {
if (cacheage > System.currentTimeMillis() - CACHETIME) {
outputCache(sender, commandLabel, page);
return;
}
if (ess.getUserMap().getUniqueUsers() > MINUSERS) {
sender.sendMessage(tl("orderBalances", ess.getUserMap().getUniqueUsers()));
}
} finally {
lock.readLock().unlock();
}
ess.runTaskAsynchronously(new Viewer(sender, commandLabel, page, force));
} else {
if (ess.getUserMap().getUniqueUsers() > MINUSERS) {
sender.sendMessage(tl("orderBalances", ess.getUserMap().getUniqueUsers()));
}
ess.runTaskAsynchronously(new Viewer(sender, commandLabel, page, force));
}
private static void outputCache(final CommandSender sender, int page)
{
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(cacheage);
final DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
sender.sendMessage(_("balanceTop", format.format(cal.getTime())));
new TextPager(cache).showPage(Integer.toString(page), "", "balancetop", sender);
}
}
private static void outputCache(final CommandSource sender, String command, int page) {
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(cacheage);
final DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
sender.sendMessage(tl("balanceTop", format.format(cal.getTime())));
new TextPager(cache).showPage(Integer.toString(page), null, "balancetop", sender);
}
private class Calculator implements Runnable
{
private final transient Viewer viewer;
private final boolean force;
private class Calculator implements Runnable {
private final transient Viewer viewer;
private final boolean force;
public Calculator(final Viewer viewer, final boolean force)
{
this.viewer = viewer;
this.force = force;
}
public Calculator(final Viewer viewer, final boolean force) {
this.viewer = viewer;
this.force = force;
}
@Override
public void run()
{
lock.writeLock().lock();
try
{
if (force || cacheage <= System.currentTimeMillis() - CACHETIME)
{
cache.getLines().clear();
final Map<String, Double> balances = new HashMap<String, Double>();
double totalMoney = 0d;
for (String u : ess.getUserMap().getAllUniqueUsers())
{
final User user = ess.getUserMap().getUser(u);
if (user != null)
{
final double userMoney = user.getMoney();
user.updateMoneyCache(userMoney);
totalMoney += userMoney;
balances.put(user.getDisplayName(), userMoney);
}
}
@Override
public void run() {
lock.writeLock().lock();
try {
if (force || cacheage <= System.currentTimeMillis() - CACHETIME) {
cache.getLines().clear();
final Map<String, BigDecimal> balances = new HashMap<String, BigDecimal>();
BigDecimal totalMoney = BigDecimal.ZERO;
if (ess.getSettings().isEcoDisabled()) {
if (ess.getSettings().isDebug()) {
ess.getLogger().info("Internal economy functions disabled, aborting baltop.");
}
} else {
for (UUID u : ess.getUserMap().getAllUniqueUsers()) {
final User user = ess.getUserMap().getUser(u);
if (user != null) {
if (!ess.getSettings().isNpcsInBalanceRanking() && user.isNPC()) {
// Don't list NPCs in output
continue;
}
final BigDecimal userMoney = user.getMoney();
user.updateMoneyCache(userMoney);
totalMoney = totalMoney.add(userMoney);
final String name = user.isHidden() ? user.getName() : user.getDisplayName();
balances.put(name, userMoney);
}
}
}
final List<Map.Entry<String, Double>> sortedEntries = new ArrayList<Map.Entry<String, Double>>(balances.entrySet());
Collections.sort(sortedEntries, new Comparator<Map.Entry<String, Double>>()
{
@Override
public int compare(final Entry<String, Double> entry1, final Entry<String, Double> entry2)
{
return -entry1.getValue().compareTo(entry2.getValue());
}
});
cache.getLines().add(_("serverTotal", Util.displayCurrency(totalMoney, ess)));
int pos = 1;
for (Map.Entry<String, Double> entry : sortedEntries)
{
cache.getLines().add(pos + ". " + entry.getKey() + ", " + Util.displayCurrency(entry.getValue(), ess));
pos++;
}
cacheage = System.currentTimeMillis();
}
}
finally
{
lock.writeLock().unlock();
}
ess.scheduleAsyncDelayedTask(viewer);
}
}
final List<Map.Entry<String, BigDecimal>> sortedEntries = new ArrayList<Map.Entry<String, BigDecimal>>(balances.entrySet());
Collections.sort(sortedEntries, new Comparator<Map.Entry<String, BigDecimal>>() {
@Override
public int compare(final Entry<String, BigDecimal> entry1, final Entry<String, BigDecimal> entry2) {
return entry2.getValue().compareTo(entry1.getValue());
}
});
cache.getLines().add(tl("serverTotal", NumberUtil.displayCurrency(totalMoney, ess)));
int pos = 1;
for (Map.Entry<String, BigDecimal> entry : sortedEntries) {
cache.getLines().add(pos + ". " + entry.getKey() + ", " + NumberUtil.displayCurrency(entry.getValue(), ess));
pos++;
}
cacheage = System.currentTimeMillis();
}
} finally {
lock.writeLock().unlock();
}
ess.runTaskAsynchronously(viewer);
}
}
private class Viewer implements Runnable
{
private final transient CommandSender sender;
private final transient int page;
private final transient boolean force;
private class Viewer implements Runnable {
private final transient CommandSource sender;
private final transient int page;
private final transient boolean force;
private final transient String commandLabel;
public Viewer(final CommandSender sender, final int page, final boolean force)
{
this.sender = sender;
this.page = page;
this.force = force;
}
public Viewer(final CommandSource sender, final String commandLabel, final int page, final boolean force) {
this.sender = sender;
this.page = page;
this.force = force;
this.commandLabel = commandLabel;
}
@Override
public void run()
{
lock.readLock().lock();
try
{
if (!force && cacheage > System.currentTimeMillis() - CACHETIME)
{
outputCache(sender, page);
return;
}
}
finally
{
lock.readLock().unlock();
}
ess.scheduleAsyncDelayedTask(new Calculator(new Viewer(sender, page, force), force));
}
}
@Override
public void run() {
lock.readLock().lock();
try {
if (!force && cacheage > System.currentTimeMillis() - CACHETIME) {
outputCache(sender, commandLabel, page);
return;
}
} finally {
lock.readLock().unlock();
}
ess.runTaskAsynchronously(new Calculator(new Viewer(sender, commandLabel, page, false), force));
}
}
@Override
protected List<String> getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) {
if (args.length == 1) {
List<String> options = Lists.newArrayList("1");
if (!sender.isPlayer() || ess.getUser(sender.getPlayer()).isAuthorized("essentials.balancetop.force")) {
options.add("force");
}
return options;
} else {
return Collections.emptyList();
}
}
}
@@ -1,68 +1,76 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.Console;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.OfflinePlayer;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.FormatUtil;
import org.bukkit.BanList;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import static com.earth2me.essentials.I18n.tl;
public class Commandban extends EssentialsCommand
{
public Commandban()
{
super("ban");
}
public class Commandban extends EssentialsCommand {
public Commandban() {
super("ban");
}
@Override
public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception
{
if (args.length < 1)
{
throw new NotEnoughArgumentsException();
}
final User user = getPlayer(server, args, 0, true);
if (!user.isOnline())
{
if (sender instanceof Player
&& !ess.getUser(sender).isAuthorized("essentials.ban.offline"))
{
sender.sendMessage(_("banExempt"));
return;
}
}
else
{
if (user.isAuthorized("essentials.ban.exempt"))
{
sender.sendMessage(_("banExempt"));
return;
}
}
final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME;
String banReason;
if (args.length > 1)
{
banReason = _("banFormat", getFinalArg(args, 1), senderName);
}
else
{
banReason = _("banFormat", _("defaultBanReason"), senderName);
}
user.setBanReason(banReason);
user.setBanned(true);
user.kickPlayer(banReason);
@Override
public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception {
boolean nomatch = false;
if (args.length < 1) {
throw new NotEnoughArgumentsException();
}
User user;
try {
user = getPlayer(server, args, 0, true, true);
} catch (PlayerNotFoundException e) {
nomatch = true;
user = ess.getUser(new OfflinePlayer(args[0], ess.getServer()));
}
if (!user.getBase().isOnline()) {
if (sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.ban.offline")) {
throw new Exception(tl("banExemptOffline"));
}
} else {
if (user.isAuthorized("essentials.ban.exempt") && sender.isPlayer()) {
throw new Exception(tl("banExempt"));
}
}
for (Player onlinePlayer : server.getOnlinePlayers())
{
final User player = ess.getUser(onlinePlayer);
if (player.isAuthorized("essentials.ban.notify"))
{
onlinePlayer.sendMessage(_("playerBanned", senderName, user.getName(), banReason));
}
}
}
final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME;
String banReason;
if (args.length > 1) {
banReason = FormatUtil.replaceFormat(getFinalArg(args, 1).replace("\\n", "\n").replace("|", "\n"));
} else {
banReason = tl("defaultBanReason");
}
ess.getServer().getBanList(BanList.Type.NAME).addBan(user.getName(), banReason, null, senderName);
String banDisplay = tl("banFormat", banReason, senderName);
user.getBase().kickPlayer(banDisplay);
server.getLogger().log(Level.INFO, tl("playerBanned", senderName, user.getName(), banDisplay));
if (nomatch) {
sender.sendMessage(tl("userUnknown", user.getName()));
}
ess.broadcastMessage("essentials.ban.notify", tl("playerBanned", senderName, user.getName(), banReason));
}
@Override
protected List<String> getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) {
if (args.length == 1) {
return getPlayers(server, sender);
} else {
return Collections.emptyList();
}
}
}
@@ -1,42 +1,77 @@
package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.Console;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.FormatUtil;
import org.bukkit.BanList;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import static com.earth2me.essentials.I18n.tl;
public class Commandbanip extends EssentialsCommand
{
public Commandbanip()
{
super("banip");
}
public class Commandbanip extends EssentialsCommand {
public Commandbanip() {
super("banip");
}
@Override
public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception
{
if (args.length < 1)
{
throw new NotEnoughArgumentsException();
}
@Override
public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception {
if (args.length < 1) {
throw new NotEnoughArgumentsException();
}
final User player = ess.getUser(args[0]);
final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME;
if (player == null)
{
ess.getServer().banIP(args[0]);
sender.sendMessage(_("banIpAddress"));
}
else
{
final String ipAddress = player.getLastLoginAddress();
if (ipAddress.length() == 0)
{
throw new Exception(_("playerNotFound"));
}
ess.getServer().banIP(player.getLastLoginAddress());
sender.sendMessage(_("banIpAddress"));
}
}
String ipAddress;
if (FormatUtil.validIP(args[0])) {
ipAddress = args[0];
} else {
try {
User player = getPlayer(server, args, 0, true, true);
ipAddress = player.getLastLoginAddress();
} catch (PlayerNotFoundException ex) {
ipAddress = args[0];
}
}
if (ipAddress.isEmpty()) {
throw new PlayerNotFoundException();
}
String banReason;
if (args.length > 1) {
banReason = FormatUtil.replaceFormat(getFinalArg(args, 1).replace("\\n", "\n").replace("|", "\n"));
} else {
banReason = tl("defaultBanReason");
}
String banDisplay = tl("banFormat", banReason, senderName);
ess.getServer().getBanList(BanList.Type.IP).addBan(ipAddress, banReason, null, senderName);
server.getLogger().log(Level.INFO, tl("playerBanIpAddress", senderName, ipAddress, banReason));
for (Player player : ess.getServer().getOnlinePlayers()) {
if (player.getAddress().getAddress().getHostAddress().equalsIgnoreCase(ipAddress)) {
player.kickPlayer(banDisplay);
}
}
ess.broadcastMessage("essentials.banip.notify", tl("playerBanIpAddress", senderName, ipAddress, banReason));
}
@Override
protected List<String> getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) {
if (args.length == 1) {
// TODO: Also list IP addresses?
return getPlayers(server, sender);
} else {
return Collections.emptyList();
}
}
}
@@ -1,51 +1,54 @@
package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.User;
import com.earth2me.essentials.Util;
import com.earth2me.essentials.utils.LocationUtil;
import com.google.common.collect.Lists;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.TreeType;
import java.util.Collections;
import java.util.List;
public class Commandbigtree extends EssentialsCommand
{
public Commandbigtree()
{
super("bigtree");
}
import static com.earth2me.essentials.I18n.tl;
@Override
public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception
{
TreeType tree;
if (args.length > 0 && args[0].equalsIgnoreCase("redwood"))
{
tree = TreeType.TALL_REDWOOD;
}
else if (args.length > 0 && args[0].equalsIgnoreCase("tree"))
{
tree = TreeType.BIG_TREE;
}
else if (args.length > 0 && args[0].equalsIgnoreCase("jungle"))
{
tree = TreeType.JUNGLE;
}
else
{
throw new NotEnoughArgumentsException();
}
final Location loc = Util.getTarget(user);
final Location safeLocation = Util.getSafeDestination(loc);
final boolean success = user.getWorld().generateTree(safeLocation, tree);
if (success)
{
user.sendMessage(_("bigTreeSuccess"));
}
else
{
throw new Exception(_("bigTreeFailure"));
}
}
public class Commandbigtree extends EssentialsCommand {
public Commandbigtree() {
super("bigtree");
}
@Override
public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception {
TreeType tree;
if (args.length > 0 && args[0].equalsIgnoreCase("redwood")) {
tree = TreeType.TALL_REDWOOD;
} else if (args.length > 0 && args[0].equalsIgnoreCase("tree")) {
tree = TreeType.BIG_TREE;
} else if (args.length > 0 && args[0].equalsIgnoreCase("jungle")) {
tree = TreeType.JUNGLE;
} else if (args.length > 0 && args[0].equalsIgnoreCase("darkoak")) {
tree = TreeType.DARK_OAK;
} else {
throw new NotEnoughArgumentsException();
}
final Location loc = LocationUtil.getTarget(user.getBase());
final Location safeLocation = LocationUtil.getSafeDestination(loc);
final boolean success = user.getWorld().generateTree(safeLocation, tree);
if (success) {
user.sendMessage(tl("bigTreeSuccess"));
} else {
throw new Exception(tl("bigTreeFailure"));
}
}
@Override
protected List<String> getTabCompleteOptions(Server server, User user, String commandLabel, String[] args) {
if (args.length == 1) {
return Lists.newArrayList("redwood", "tree", "jungle", "darkoak");
} else {
return Collections.emptyList();
}
}
}
Loaded 100 of 702 files, more files were not shown because too many files have changed in this diff. Show more