Compare commits

...
85 Commits
Author SHA1 Message Date
MD f2dde4154c Release 2.19.5 2022-08-11 21:05:44 +01:00
Flask Bot 12c2a4f2b5 Update translations from Crowdin (#4823) 2022-08-11 20:24:59 +01:00
BoomEaro ee7c1b1cf1 Fix wrong message length check (#5041) 2022-08-08 14:53:59 -07:00
Sam 422f25af8b Fix erroneous addition to VersionUtil class check (#5037) 2022-08-07 19:41:27 +00:00
Josh RoyandMD 728c746200 Add commands info to /ess dump (#4965)
See #4961 and EssentialsX/Website#71.

Adds `commands.yml`, the known command map and `AlternativeCommandHandler` handover information to `/ess dump`.

Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com>
2022-08-07 11:43:59 +01:00
MD 6dfa18ca53 Implement chat message signing for 1.19.1+ (#5030)
**Known issue: this inadvertently reformats `/minecraft:tell`. There's not much we can do about this in 2.19.x.**

This commit refactors EssentialsX Chat in order to support chat previews and signed chat messages in 1.19.1+.
2022-08-06 22:27:58 +01:00
Josh Roy a394760677 Update VersionUtil and /ess version (#5036) 2022-08-06 15:48:26 -04:00
MD 5f48cdef13 Bump to 1.19.2 (#5035) 2022-08-06 12:14:07 -04:00
pop4959andMD c56a9e6741 Add spawnable boat variants (#5027)
Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com>
2022-08-02 14:18:57 -04:00
pop4959 5b20f30350 Fix ice other message (#5028)
Fix `iceOther` being sent to the target player instead of the sender. Fixes #5002.
2022-08-02 08:40:10 +01:00
pop4959 037577162b Add swift sneak enchantment (#5026)
Closes #5024.
2022-07-31 19:03:31 +00:00
Josh Roy 908189a233 Bump Spigot to 1.19.1 2022-07-28 11:30:24 -04:00
Josh Roy c938767b2d Prepare for 1.19.1 2022-07-28 11:30:24 -04:00
Josh Roy b135fcf086 Fix leave messages being sent when vanished (#5009) 2022-07-23 18:35:14 -04:00
Warrior 09dc49aacb Fix nickname feedback message when change-displayname is off (#4980)
Make the feedback message use the nickname instead of the player's display name if change-displayname is disabled. Fixes #4979.
2022-07-11 08:02:10 +00:00
Josh Roy f4b6197a49 Fix boolean logic for sleep ignore during afk status change (#4985) 2022-07-10 22:28:08 -07:00
Josh Roy 4a53cfe7ac Prevent role snowflakes from resolving roles with ids as names (#4983)
Fixes #4981.
2022-07-10 00:24:04 +01:00
DeltricandJosh Roy 2bba577567 Fix /unlimited with changing stack sizes (#4877)
Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com>
2022-07-05 17:01:13 +00:00
pop4959andJosh Roy 6e674c73e0 Update unsupported message (#4976)
Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com>
2022-07-05 09:52:14 -04:00
Josh Roy a60f3c067f Fix Essentials' logger breaking on 1.8.8-1.12.2 (#4975) 2022-07-02 14:50:45 -04:00
Josh RoyandMD 6816eb4e18 Use component logger on Paper for console colors (#4941)
Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com>
2022-06-27 14:54:10 -04:00
Tristan Hermanns 9c5536b2e6 Fix minecraft namespace not working in give command (#4960) 2022-06-25 17:40:43 -04:00
Josh Roy ff80338350 Log filenames during configuration serialization errors (#4959) 2022-06-21 22:01:25 +00:00
Josh RoyandMD 8d856dd6db Fix paths and farmland not being solid (#4915)
Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com>
2022-06-18 19:31:54 +00:00
Josh Roy 96c6c951e8 Don't teleport to a safe location for AFK freeze when flying (#4944)
Fixes #4902.
2022-06-15 15:43:57 +00:00
Josh Roy 0931b21f6d Fix places where Discord formatting wasn't sanitized (#4945)
Fixes #4891
2022-06-15 15:35:12 +00:00
Josh Roy 9147d1036d Fix ANSI color codes not getting stripped on Paper (#4942)
Paper uses 0x7f as an intermediate character between adventure and its ANSI pattern converter, we need to strip this.
2022-06-15 16:31:42 +01:00
MD a7f602e2ad Remove commons-lang3 dependency
`commons-lang3` is scheduled for removal by Spigot.

This commit reimplements the methods we use from StringUtils in StringUtil, and replaces NumberUtils.isDigits(String) with NumberUtil.isLong(String).
2022-06-15 16:18:35 +01:00
Flask Bot 0c81980ead Update items.json for 1.19
Note: this action was performed by a human (@mdcfe) under the
Flask-Bot account.
2022-06-15 16:18:35 +01:00
MD 2d5794f68d Add mangrove signs to MaterialUtil 2022-06-15 16:18:35 +01:00
MD 6b80e0b113 Bump run-paper MC version to 1.19 2022-06-15 16:18:35 +01:00
Josh Roy 18f9af898e Add 1.19 mobs/data 2022-06-15 16:18:35 +01:00
Josh Roy d04c933abe Fix server state reflection provider mappings 2022-06-15 16:18:35 +01:00
Josh Roy b916488de2 Bump VersionUtil and Spigot 2022-06-15 16:18:35 +01:00
MDandJosh Roy c6066bd2d8 Update README and contributing guide (#4851)
Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com>

This PR brings the README up-to-date, reduces the number of references to upstream Essentials, and fleshes out the contributing guide with much more detail.
2022-06-10 13:06:24 +00:00
Josh Roy 3af931740b Don't progress playtime for vanished users (#4918) 2022-06-04 01:43:12 +00:00
Josh Roy 1c5a7e9ffb Bump down to 2.19.5 (#4914)
Mojang will be releasing 1.19 within two weeks and 2.20.0 is not ready for that timeframe. We want to release 2.19.5 with 1.19 support before that.
2022-05-30 21:21:19 +01:00
pop4959 ea5cdc097d Fix erroneous TeleportWarmupEvent event call (#4913) 2022-05-22 17:20:39 -04:00
Deltric d891268143 Fix /nick off breaking with changecolor permissions (#4876) 2022-03-31 19:57:36 -04:00
lucko 4bd1b3c09f Reduce user lookups for LuckPerms contexts (#4869) 2022-03-27 09:07:36 -04:00
MD c4f10d9c1d Fix double charge for /tpa when target has /tpauto on (#4862)
If a player uses `/tpa` to request a teleport to someone with `/tpauto` enabled, `/tpa` manually creates a charge for the teleportation.  
This PR changes the subsequent code to throw a `NoChargeException` instead of returning, meaning only the `AsyncTeleport` charge is applied, not the standard command one.

Fixes #4854.
2022-03-20 11:19:20 +00:00
MD e12f1b5022 Bump run-paper to 1.18.2 (#4857) 2022-03-15 07:56:52 -04:00
MDandJosh Roy 31732cec95 Prepare for 2.20.0 dev builds (#4849)
Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com>
2022-03-12 19:33:28 -05:00
MD f104b6ec15 Release 2.19.4 2022-03-12 23:00:24 +00:00
MD 695546420f Run update check using Bukkit scheduler (#4839)
Fixes #4825.
2022-03-12 12:02:20 +00:00
Josh Roy 997fb1800e Fix preemptive setting of owner metadata on to trade signs (#4835)
Fixes #4836.
2022-03-08 15:08:34 +00:00
MD 3984bddd9d Fix 2.19.4 dev build version (#4834) 2022-03-06 00:06:48 +00:00
MD d92ce8bdfe Bump to 2.19.4 dev (#4831) 2022-03-05 18:33:04 +00:00
MD 3348bd9129 Release 2.19.3 2022-03-04 11:41:56 +00:00
Josh Roy 1a5526867c Fix IllegalAccessException with advancement listener on 1.12.2 (#4826)
Fixes #4809.
2022-03-03 20:38:39 +00:00
MD c5253bc5e2 Update to Minecraft 1.18.2 (#4821)
This PR updates the build setup to Gradle 7.4 and updates EssentialsX to Minecraft 1.18.2.
2022-02-28 20:51:26 +00:00
Flask Bot 29a2a865c5 New Crowdin updates (#4744) 2022-02-28 20:31:02 +00:00
MD c3b994808f Use GitHub proxy fallback for update checker (#4818) 2022-02-26 17:09:54 -05:00
triagonal bc2da98703 Make OfflinePlayer#setName protected for CMI Importer (#4805) 2022-02-14 07:40:48 -05:00
Josh Roy cbb012853c Fix toggleshout causing issues with question/local chat 2022-02-13 22:44:37 -05:00
Josh Roy 4bf4bd432a Add some color to the local prefix by default 2022-02-13 22:44:37 -05:00
Josh Roy 83d0e0d9a0 Add permissions to receive certain channel channels 2022-02-13 22:44:37 -05:00
Josh Roy 2f5c24d114 Add permission for local channel chat 2022-02-13 22:44:37 -05:00
Josh Roy 88c8ccd29b Add config for default shout state and for persisting shout state 2022-02-13 22:44:37 -05:00
Josh Roy 94edbcfeb1 Add chat question config option 2022-02-13 22:44:37 -05:00
Josh RoyandMD d5822e9a41 Add config for max /tree and /bigtree range (#4728)
Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com>
2022-02-13 16:46:18 -05:00
Josh Roy debf09437e Add UUID support to trade and protection signs (#4713) 2022-02-13 15:54:19 -05:00
Josh Roy a9e5f079a9 Fix trade sign length validation issues (#4748) 2022-02-13 15:50:43 -05:00
Josh Roy f00c2dcf92 Fix keepinv policies ignoring offhand (#4725) 2022-02-13 20:37:25 +00:00
Josh Roy 63cbf7e2da Prevent legacy material support from being initiated (#4697) 2022-02-13 15:33:51 -05:00
Josh Roy 19837f9309 Add some more dump files (#4785)
Adds worth, tpr, and spawns configs.

See also https://github.com/EssentialsX/Website/pull/68
2022-02-08 09:26:05 +00:00
Josh Roy 4b8b770c30 Allow /nick without change-displayname (#4758)
Closes #4709.
2022-02-06 18:23:17 +00:00
Josh Roy ddc258ed11 Fix teleport request queue being reversed order (#4755)
Fix #4753
2022-02-06 18:18:40 +00:00
Josh Roy d23796dade Support doubles in /tppos (#4729)
Closes #1785
2022-02-06 18:01:51 +00:00
Josh Roy 41f5cc3175 Use Paper command forwarding API (#4794)
Uses API added in PaperMC/Paper@9940bca, when available.
2022-02-06 17:56:13 +00:00
Josh Roy c6fe160b47 Fix Paper command executor on modern Paper versions (#4791) 2022-02-01 22:13:16 +00:00
sxphirus 5c46bea2ca Add translation key for /near entries (#4740) 2022-01-20 10:05:31 -05:00
Flask Bot a9585bb525 New Crowdin updates (#4668) 2022-01-09 16:27:25 +00:00
Josh Roy bb88a6a749 Fix rate limit exception in update checker (#4731) 2022-01-02 17:24:32 +00:00
Pierre Dedrie 739600eb05 Fix safelogin for 1.18 and above by using worldProvider minHeight (#4715) 2021-12-26 23:56:03 +00:00
Josh Roy 5f98d3fac5 Add mitigation for JDK-8274349 (#4711) 2021-12-24 21:40:41 -05:00
Josh Roy 84326cf13e Fix LocationUtil#getSafeDestination NSME on older versions (#4708)
Fixes a NoSuchMethodError from old guava versions in old MC versions.

Fixes #4703
2021-12-23 11:55:31 +00:00
Josh Roy 685084219e Use futureproof Paper component serializer when available (#4706)
#plainSerializer will be removed when adventure 5.0.0 releases. This PR prevents this from breaking in the future.

Closes #4705
2021-12-23 10:57:41 +00:00
Josh Roy c4e62ae22b Remove usused configuration classes (#4707)
These were not used since configurate, no plugin should be using this, and it causes compile errors on the latest spigot version.
2021-12-23 01:18:02 +00:00
MD 05ce11f657 Bump to 2.19.3 dev 2021-12-15 21:29:45 +00:00
MD bcb0fb5825 Bump to 2.19.2 release 2021-12-15 20:58:38 +00:00
MD 91f4493fe0 Run Actions builds for dev branches (#4691) 2021-12-15 20:55:37 +00:00
MD d53ff36a2a Prevent IndexOutOfBoundsException in interaction replies (#4690) 2021-12-15 20:55:37 +00:00
MD 98917d97c8 Bump down to 2.19.2-dev 2021-12-15 20:55:37 +00:00
Josh Roy 7e1d18fee4 Prepare for 2.20.0 dev builds 2021-12-14 21:26:44 +00:00
185 changed files with 8967 additions and 3421 deletions

No files matched your search

+1
View File
@@ -4,6 +4,7 @@ on:
push:
branches:
- 2.x
- dev/*
jobs:
build:
+1
View File
@@ -9,6 +9,7 @@ on:
branches:
- 2.x
- mc/*
- dev/*
jobs:
build:
+93 -22
View File
@@ -1,31 +1,102 @@
Contributing to EssentialsX
===========================
# Contributing to EssentialsX
Want to help improve EssentialsX? There are several ways you can support and contribute to the project.
*By contributing to EssentialsX, you agree to license your changes under the [GNU General Public License version 3](https://github.com/EssentialsX/Essentials/blob/2.x/LICENSE).*
If you'd like to make a financial contribution to the project, you can join our [Patreon](https://www.patreon.com/essentialsx/),
or to make a one-off donation you can visit our [Ko-fi page](https://ko-fi.com/essentialsx). If you can't make a
donation, don't worry! There are lots of other ways to contribute:
## Submitting code changes to EssentialsX
* Do you run a server? Take a look at our ["help wanted"](https://github.com/EssentialsX/Essentials/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22help+wanted%22)
and ["bug: unconfirmed"](https://github.com/EssentialsX/Essentials/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22bug%3A+unconfirmed%22)
issues, where you can find issues that need extra testing and investigation.
* Do you speak multiple languages? If so, we always welcome contributions to our [Crowdin project](https://crowdin.com/project/essentialsx-official).
* Do you enjoy helping others? If so, why not contribute to the [EssentialsX documentation](https://github.com/EssentialsX/wiki)?
You can also join the [MOSS Discord community](https://discord.gg/casfFyh) and provide direct community support to
other EssentialsX users.
* If you're a developer, you could look through our ["open to PR"](https://github.com/EssentialsX/Essentials/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22status%3A+open+to+PR%22)
issues. We're always happy to receive bug fixes and feature additions as pull requests.
If you're interested in submitting new code to EssentialsX, we accept changes via GitHub pull requests.
Submitting a PR
---------------
### Adding features
EssentialsX has extensive templates for PRs that detail how to submit your PR. To find out more, see the PR templates for:
* [Bug fixes](https://github.com/EssentialsX/Essentials/blob/2.x/.github/PULL_REQUEST_TEMPLATE/bug-fix.md)
* [New features](https://github.com/EssentialsX/Essentials/blob/2.x/.github/PULL_REQUEST_TEMPLATE/new-feature.md)
In general, we will only consider PRs for features if they have already been discussed with the team through
GitHub issues and discussions. Check the list of
["open to PR" issues](https://github.com/EssentialsX/Essentials/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22status%3A+open+to+PR%22)
and [feature request discussions](https://github.com/EssentialsX/Essentials/discussions/categories/ideas-and-feature-suggestions)
before you start working on your changes. If you don't see your desired feature listed,
[open a feature request](https://github.com/EssentialsX/Essentials/issues/new/choose) and wait for a response, otherwise
you may end up wasting your time on a feature that we aren't in a position to accept.
Want to discuss a feature before opening a PR? Join the [EssentialsX Development Discord server](https://discord.gg/CUN7qVb). Note that this server is **not for end-users** - if you need support with EssentialsX, you should join [MOSS](https://discord.gg/casfFyh) instead.
#### Keep it focused
By contributing to EssentialsX, you agree to license your code under the [GNU General Public License version 3](https://github.com/EssentialsX/Essentials/blob/2.x/LICENSE).
Please try to keep feature PRs focused around one feature. Your PR should ideally contain
one feature, or a few closely-linked features. If you submit several unrelated features
in one PR, the PR will not be accepted.
### Fixing bugs
If you're opening a PR to fix a bug, please ensure a bug report has been filed - search the
[issue tracker](https://github.com/EssentialsX/Essentials/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22bug%3A+confirmed%22%2C%22bug%3A+unconfirmed%22%2C%22bug%3A+upstream%22)
for an existing report, and if you can't find a bug report,
[create one](https://github.com/EssentialsX/Essentials/issues/new/choose) before you submit your PR.
#### Unconfirmed bugs
You may find a bug report with the label `bug: unconfirmed`. This means the EssentialsX team hasn't had the time
to review the bug report yet or hasn't been able to confirm
whether the reported issue is actually a bug in EssentialsX. You can help us by following the steps in the report and
posting whether you are able to replicate this issue, ideally on the latest versions of EssentialsX and Paper. This will
help us confirm issues and prioritise PRs accordingly.
#### Upstream bugs
You may also find bug reports with the `bug: upstream` label. This label means the issue is caused by a bug in *another
project*, not EssentialsX. This includes bugs in CraftBukkit/Spigot and bugs in other plugins. It may be appropriate to
mitigate an issue in EssentialsX, but please check with us in the [EssentialsX Development Discord server](https://discord.gg/CUN7qVb) before you submit a PR.
### Making your changes
You'll need the following to make your changes to EssentialsX:
* A GitHub account
* [`git`](https://git-scm.com/downloads): the Git command-line tool, used to track and save your changes
* [`gh`](https://cli.github.com/): the GitHub command-line tool, used to submit your changes to EssentialsX
* Your IDE of choice - we recommend [IntelliJ IDEA Community Edition](https://www.jetbrains.com/idea/download)
If you're already familiar with Git, you can skip this next section.
You'll need to clone the EssentialsX repository
(`gh repo clone EssentialsX/Essentials`), then create a new branch for your work
(`cd Essentials` then `git switch -c my-cool-pr`).
You can then make changes using your IDE of choice. Follow the instructions in `README.md` to build and test your
changes.
Once you've finished, you should commit your changes (`git commit -am "My cool commit name!"`).
### Submitting your PR
*Even if you're already familiar with GitHub, you will need to follow these steps in order to submit a PR to
EssentialsX. This ensures we have the information we need to test and review your changes.*
Next, you'll need to fork EssentialsX on GitHub and push your changes to a branch on that fork. We strongly recommend
using the `gh` command-line tool for this:
* In your terminal, run `gh pr create`.
* Select either the bug fix or feature template, depending on what your PR is for.
* If you get asked `Where should we push the '...' branch?`, select `Create a fork of EssentialsX/Essentials`.
* For the title, choose a title that describes what your PR does. For example, `Add more ducks to /spawnmob`.
* For the body, press E. You will then need to fill in the PR template in your text editor.
- Follow the instructions in the template and fill out the sections as required.
- This step is important! Without it, we won't know why you've made your changes or how to test them.
* Save the file in your text editor and close it, then return to the terminal.
* Select `Submit` to open your PR.
If you follow these steps correctly, GitHub will create a fork (if necessary) and then open a PR with your changes. You
can now sit back while we review your changes. If we need to ask questions or request further changes to your code,
we will review your PR and post a comment on GitHub. You can respond to our reviews and comments on the GitHub website,
and you can push new changes using `git commit` and `git push`.
## Submitting community translations to EssentialsX
EssentialsX relies on community translations for its messages in other languages. You can help translate EssentialsX on
[Crowdin](https://translate.essentialsx.net/). You'll need a Crowdin account to translate and improve messages.
If your language isn't listed or doesn't have an active proofreader, please let us know on Discord (see below).
## Discussing EssentialsX contributions
Want to discuss something before opening a PR or translating messages? Join the
[EssentialsX Development Discord server](https://discord.gg/CUN7qVb). Note that this server is **not for end-users** -
if you need support with EssentialsX, you should join [MOSS](https://discord.gg/casfFyh) instead.
@@ -11,10 +11,8 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
public class AlternativeCommandsHandler {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private final transient Map<String, List<Command>> altcommands = new HashMap<>();
private final transient Map<String, String> disabledList = new HashMap<>();
private final transient IEssentials ess;
@@ -95,7 +93,7 @@ public class AlternativeCommandsHandler {
if (pc instanceof PluginIdentifiableCommand) {
final String altString = ((PluginIdentifiableCommand) pc).getPlugin().getName() + ":" + pc.getName();
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Essentials: Alternative command " + label + " found, using " + altString);
ess.getLogger().log(Level.INFO, "Essentials: Alternative command " + label + " found, using " + altString);
}
disabledList.put(label, altString);
}
@@ -308,7 +308,7 @@ public class AsyncTeleport implements IAsyncTeleport {
private void teleportOther(final IUser teleporter, final IUser teleportee, final ITarget target, final Trade chargeFor, final TeleportCause cause, final CompletableFuture<Boolean> future) {
double delay = ess.getSettings().getTeleportDelay();
final TeleportWarmupEvent event = new TeleportWarmupEvent(teleportee, cause, target, delay);
final TeleportWarmupEvent event = new TeleportWarmupEvent(teleporter, teleportee, cause, target, delay);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
@@ -10,12 +10,10 @@ import java.io.InputStreamReader;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class Backup implements Runnable {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private transient final Server server;
private transient final IEssentials ess;
private final AtomicBoolean pendingShutdown = new AtomicBoolean(false);
@@ -81,7 +79,7 @@ public class Backup implements Runnable {
taskLock.complete(new Object());
return;
}
LOGGER.log(Level.INFO, tl("backupStarted"));
ess.getLogger().log(Level.INFO, tl("backupStarted"));
final CommandSender cs = server.getConsoleSender();
server.dispatchCommand(cs, "save-all");
server.dispatchCommand(cs, "save-off");
@@ -99,17 +97,17 @@ public class Backup implements Runnable {
do {
line = reader.readLine();
if (line != null) {
LOGGER.log(Level.INFO, line);
ess.getLogger().log(Level.INFO, line);
}
} while (line != null);
}
} catch (final IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
ess.getLogger().log(Level.SEVERE, null, ex);
}
});
child.waitFor();
} catch (final InterruptedException | IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
ess.getLogger().log(Level.SEVERE, null, ex);
} finally {
class BackupEnableSaveTask implements Runnable {
@Override
@@ -120,7 +118,7 @@ public class Backup implements Runnable {
}
active = false;
taskLock.complete(new Object());
LOGGER.log(Level.INFO, tl("backupFinished"));
ess.getLogger().log(Level.INFO, tl("backupFinished"));
}
}
@@ -263,6 +263,14 @@ public final class Enchantments {
} catch (final IllegalArgumentException ignored) {
}
try { // 1.19
final Enchantment swiftSneak = Enchantment.getByName("SWIFT_SNEAK");
if (swiftSneak != null) {
ENCHANTMENTS.put("swiftsneak", swiftSneak);
}
} catch (final IllegalArgumentException ignored) {
}
try {
final Class<?> namespacedKeyClass = Class.forName("org.bukkit.NamespacedKey");
final Class<?> enchantmentClass = Class.forName("org.bukkit.enchantments.Enchantment");
@@ -66,11 +66,13 @@ import net.ess3.provider.PotionMetaProvider;
import net.ess3.provider.ProviderListener;
import net.ess3.provider.SerializationProvider;
import net.ess3.provider.ServerStateProvider;
import net.ess3.provider.SignDataProvider;
import net.ess3.provider.SpawnEggProvider;
import net.ess3.provider.SpawnerBlockProvider;
import net.ess3.provider.SpawnerItemProvider;
import net.ess3.provider.SyncCommandsProvider;
import net.ess3.provider.WorldInfoProvider;
import net.ess3.provider.providers.BaseLoggerProvider;
import net.ess3.provider.providers.BasePotionDataProvider;
import net.ess3.provider.providers.BlockMetaSpawnerItemProvider;
import net.ess3.provider.providers.BukkitMaterialTagProvider;
@@ -80,9 +82,10 @@ import net.ess3.provider.providers.FlatSpawnEggProvider;
import net.ess3.provider.providers.LegacyItemUnbreakableProvider;
import net.ess3.provider.providers.LegacyPotionMetaProvider;
import net.ess3.provider.providers.LegacySpawnEggProvider;
import net.ess3.provider.providers.ModernDataWorldInfoProvider;
import net.ess3.provider.providers.ModernItemUnbreakableProvider;
import net.ess3.provider.providers.ModernPersistentDataProvider;
import net.ess3.provider.providers.ModernDataWorldInfoProvider;
import net.ess3.provider.providers.ModernSignDataProvider;
import net.ess3.provider.providers.PaperContainerProvider;
import net.ess3.provider.providers.PaperKnownCommandsProvider;
import net.ess3.provider.providers.PaperMaterialTagProvider;
@@ -91,7 +94,6 @@ import net.ess3.provider.providers.PaperSerializationProvider;
import net.ess3.provider.providers.PaperServerStateProvider;
import net.essentialsx.api.v2.services.BalanceTop;
import net.essentialsx.api.v2.services.mail.MailService;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.block.Block;
@@ -139,7 +141,8 @@ import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private static final Logger BUKKIT_LOGGER = Logger.getLogger("Essentials");
private static Logger LOGGER = null;
private final transient TNTExplodeListener tntListener = new TNTExplodeListener(this);
private final transient Set<String> vanishedPlayers = new LinkedHashSet<>();
private transient ISettings settings;
@@ -175,6 +178,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
private transient ReflOnlineModeProvider onlineModeProvider;
private transient ItemUnbreakableProvider unbreakableProvider;
private transient WorldInfoProvider worldInfoProvider;
private transient SignDataProvider signDataProvider;
private transient Kits kits;
private transient RandomTeleport randomTeleport;
private transient UpdateChecker updateChecker;
@@ -201,6 +205,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
}
public void setupForTesting(final Server server) throws IOException, InvalidDescriptionException {
LOGGER = new BaseLoggerProvider(this, BUKKIT_LOGGER);
final File dataFolder = File.createTempFile("essentialstest", "");
if (!dataFolder.delete()) {
throw new IOException();
@@ -241,9 +246,12 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
@Override
public void onEnable() {
try {
if (LOGGER != this.getLogger()) {
LOGGER.setParent(this.getLogger());
if (BUKKIT_LOGGER != super.getLogger()) {
BUKKIT_LOGGER.setParent(super.getLogger());
}
LOGGER = EssentialsLogger.getLoggerProvider(this);
EssentialsLogger.updatePluginLogger(this);
execTimer = new ExecuteTimer();
execTimer.start();
i18n = new I18n(this);
@@ -259,6 +267,9 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
case DANGEROUS_FORK:
getLogger().severe(tl("serverUnsupportedDangerous"));
break;
case STUPID_PLUGIN:
getLogger().severe(tl("serverUnsupportedDumbPlugins"));
break;
case UNSTABLE:
getLogger().severe(tl("serverUnsupportedMods"));
break;
@@ -432,6 +443,10 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
worldInfoProvider = new FixedHeightWorldInfoProvider();
}
if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01)) {
signDataProvider = new ModernSignDataProvider(this);
}
execTimer.mark("Init(Providers)");
reload();
@@ -466,7 +481,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
final String timeroutput = execTimer.end();
if (getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Essentials load {0}", timeroutput);
LOGGER.log(Level.INFO, "Essentials load " + timeroutput);
}
} catch (final NumberFormatException ex) {
handleCrash(ex);
@@ -477,6 +492,15 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
getBackup().setPendingShutdown(false);
}
// Returns our provider logger if available
public static Logger getWrappedLogger() {
if (LOGGER != null) {
return LOGGER;
}
return BUKKIT_LOGGER;
}
@Override
public void saveConfig() {
// We don't use any of the bukkit config writing, as this breaks our config file formatting.
@@ -625,7 +649,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
return completer.onTabComplete(cSender, command, commandLabel, args);
}
} catch (final Exception ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
}
}
}
@@ -706,7 +730,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
try {
pc.execute(cSender, commandLabel, args);
} catch (final Exception ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
cSender.sendMessage(tl("internalError"));
}
return true;
@@ -726,10 +750,10 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
if (bSenderBlock != null) {
if (getSettings().logCommandBlockCommands()) {
Bukkit.getLogger().log(Level.INFO, "CommandBlock at {0},{1},{2} issued server command: /{3} {4}", new Object[] {bSenderBlock.getX(), bSenderBlock.getY(), bSenderBlock.getZ(), commandLabel, EssentialsCommand.getFinalArg(args, 0)});
LOGGER.log(Level.INFO, "CommandBlock at " + bSenderBlock.getX() + "," + bSenderBlock.getY() + "," + bSenderBlock.getZ() + " issued server command: /" + commandLabel + " " + EssentialsCommand.getFinalArg(args, 0));
}
} else if (user == null) {
Bukkit.getLogger().log(Level.INFO, "{0} issued server command: /{1} {2}", new Object[] {cSender.getName(), commandLabel, EssentialsCommand.getFinalArg(args, 0)});
LOGGER.log(Level.INFO, cSender.getName()+ " issued server command: /" + commandLabel + " " + EssentialsCommand.getFinalArg(args, 0));
}
final CommandSource sender = new CommandSource(cSender);
@@ -1041,7 +1065,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
if (user == null) {
if (getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Constructing new userfile from base player {0}", base.getName());
LOGGER.log(Level.INFO, "Constructing new userfile from base player " + base.getName());
}
user = new User(base, this);
} else {
@@ -1306,6 +1330,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
return worldInfoProvider;
}
@Override
public SignDataProvider getSignDataProvider() {
return signDataProvider;
}
@Override
public PluginCommand getPluginCommand(final String cmd) {
return this.getCommand(cmd);
@@ -42,8 +42,12 @@ public class EssentialsBlockListener implements Listener {
final User user = ess.getUser(event.getPlayer());
if (user.hasUnlimited(is) && user.getBase().getGameMode() == GameMode.SURVIVAL) {
ess.scheduleSyncDelayedTask(() -> {
user.getBase().getInventory().addItem(is);
user.getBase().updateInventory();
if (is != null && is.getType() != null && !MaterialUtil.isAir(is.getType())) {
final ItemStack cloneIs = is.clone();
cloneIs.setAmount(1);
user.getBase().getInventory().addItem(cloneIs);
user.getBase().updateInventory();
}
});
}
}
@@ -1,674 +0,0 @@
package com.earth2me.essentials;
import com.google.common.io.Files;
import net.ess3.api.InvalidWorldException;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.math.BigDecimal;
import java.math.MathContext;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CoderResult;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class EssentialsConf extends YamlConfiguration {
protected static final Logger LOGGER = Logger.getLogger("Essentials");
protected static final Charset UTF8 = StandardCharsets.UTF_8;
private static final ExecutorService EXECUTOR_SERVICE = Executors.newSingleThreadExecutor();
protected final File configFile;
private final AtomicInteger pendingDiskWrites = new AtomicInteger(0);
private final AtomicBoolean transaction = new AtomicBoolean(false);
private final byte[] bytebuffer = new byte[1024];
protected String templateName = null;
private Class<?> resourceClass = EssentialsConf.class;
public EssentialsConf(final File configFile) {
super();
this.configFile = configFile.getAbsoluteFile();
}
public static BigDecimal toBigDecimal(final String input, final BigDecimal def) {
if (input == null || input.isEmpty()) {
return def;
} else {
try {
return new BigDecimal(input, MathContext.DECIMAL128);
} catch (final NumberFormatException | ArithmeticException e) {
return def;
}
}
}
public synchronized void load() {
if (pendingDiskWrites.get() != 0) {
LOGGER.log(Level.INFO, "File {0} not read, because it''s not yet written to disk.", configFile);
return;
}
if (!configFile.getParentFile().exists()) {
if (!configFile.getParentFile().mkdirs()) {
LOGGER.log(Level.SEVERE, tl("failedToCreateConfig", configFile.toString()));
}
}
// This will delete files where the first character is 0. In most cases they are broken.
if (configFile.exists() && configFile.length() != 0) {
try {
final InputStream input = new FileInputStream(configFile);
try {
if (input.read() == 0) {
input.close();
configFile.delete();
}
} catch (final IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
} finally {
try {
input.close();
} catch (final IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
}
} catch (final FileNotFoundException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
}
if (!configFile.exists()) {
if (legacyFileExists()) {
convertLegacyFile();
} else if (altFileExists()) {
convertAltFile();
} else if (templateName != null) {
LOGGER.log(Level.INFO, tl("creatingConfigFromTemplate", configFile.toString()));
createFromTemplate();
} else {
return;
}
}
try {
try (final FileInputStream inputStream = new FileInputStream(configFile)) {
final long startSize = configFile.length();
if (startSize > Integer.MAX_VALUE) {
throw new InvalidConfigurationException("File too big");
}
ByteBuffer buffer = ByteBuffer.allocate((int) startSize);
int length;
while ((length = inputStream.read(bytebuffer)) != -1) {
if (length > buffer.remaining()) {
final ByteBuffer resize = ByteBuffer.allocate(buffer.capacity() + length - buffer.remaining());
final int resizePosition = buffer.position();
// Fix builds compiled against Java 9+ breaking on Java 8
((Buffer) buffer).rewind();
resize.put(buffer);
resize.position(resizePosition);
buffer = resize;
}
buffer.put(bytebuffer, 0, length);
}
((Buffer) buffer).rewind();
final CharBuffer data = CharBuffer.allocate(buffer.capacity());
CharsetDecoder decoder = UTF8.newDecoder();
CoderResult result = decoder.decode(buffer, data, true);
if (result.isError()) {
((Buffer) buffer).rewind();
((Buffer) data).clear();
LOGGER.log(Level.INFO, "File " + configFile.getAbsolutePath() + " is not utf-8 encoded, trying " + Charset.defaultCharset().displayName());
decoder = Charset.defaultCharset().newDecoder();
result = decoder.decode(buffer, data, true);
if (result.isError()) {
throw new InvalidConfigurationException("Invalid Characters in file " + configFile.getAbsolutePath());
} else {
decoder.flush(data);
}
} else {
decoder.flush(data);
}
final int end = data.position();
((Buffer) data).rewind();
super.loadFromString(data.subSequence(0, end).toString());
}
} catch (final IOException ex) {
LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
} catch (final InvalidConfigurationException ex) {
final File broken = new File(configFile.getAbsolutePath() + ".broken." + System.currentTimeMillis());
configFile.renameTo(broken);
LOGGER.log(Level.SEVERE, "The file " + configFile.toString() + " is broken, it has been renamed to " + broken.toString(), ex.getCause());
}
}
public boolean legacyFileExists() {
return false;
}
public void convertLegacyFile() {
LOGGER.log(Level.SEVERE, "Unable to import legacy config file.");
}
public boolean altFileExists() {
return false;
}
public void convertAltFile() {
LOGGER.log(Level.SEVERE, "Unable to import alt config file.");
}
private void createFromTemplate() {
InputStream istr = null;
OutputStream ostr = null;
try {
istr = resourceClass.getResourceAsStream(templateName);
if (istr == null) {
LOGGER.log(Level.SEVERE, tl("couldNotFindTemplate", templateName));
return;
}
ostr = new FileOutputStream(configFile);
final byte[] buffer = new byte[1024];
int length = 0;
length = istr.read(buffer);
while (length > 0) {
ostr.write(buffer, 0, length);
length = istr.read(buffer);
}
} catch (final IOException ex) {
LOGGER.log(Level.SEVERE, tl("failedToWriteConfig", configFile.toString()), ex);
} finally {
try {
if (istr != null) {
istr.close();
}
} catch (final IOException ex) {
Logger.getLogger(EssentialsConf.class.getName()).log(Level.SEVERE, null, ex);
}
try {
if (ostr != null) {
ostr.close();
}
} catch (final IOException ex) {
LOGGER.log(Level.SEVERE, tl("failedToCloseConfig", configFile.toString()), ex);
}
}
}
public void setTemplateName(final String templateName) {
this.templateName = templateName;
}
public File getFile() {
return configFile;
}
public void setTemplateName(final String templateName, final Class<?> resClass) {
this.templateName = templateName;
this.resourceClass = resClass;
}
public void startTransaction() {
transaction.set(true);
}
public void stopTransaction() {
transaction.set(false);
save();
}
public void save() {
try {
save(configFile);
} catch (final IOException ex) {
LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
}
}
public void saveWithError() throws IOException {
save(configFile);
}
@Override
public synchronized void save(final File file) throws IOException {
if (!transaction.get()) {
delayedSave(file);
}
}
//This may be aborted if there are stagnant requests sitting in queue.
//This needs fixed to discard outstanding save requests.
public synchronized void forceSave() {
try {
final Future<?> future = delayedSave(configFile);
if (future != null) {
future.get();
}
} catch (final InterruptedException | ExecutionException ex) {
LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
}
}
public synchronized void cleanup() {
forceSave();
}
private Future<?> delayedSave(final File file) {
if (file == null) {
throw new IllegalArgumentException("File cannot be null");
}
final String data = saveToString();
if (data.length() == 0) {
return null;
}
pendingDiskWrites.incrementAndGet();
return EXECUTOR_SERVICE.submit(new WriteRunner(configFile, data, pendingDiskWrites));
}
public boolean hasProperty(final String path) {
return isSet(path);
}
public Location getLocation(final String path, final Server server) throws InvalidWorldException {
final String worldString = (path == null ? "" : path + ".") + "world";
final String worldName = getString(worldString);
if (worldName == null || worldName.isEmpty()) {
return null;
}
final World world = server.getWorld(worldName);
if (world == null) {
throw new InvalidWorldException(worldName);
}
return new Location(world, getDouble((path == null ? "" : path + ".") + "x", 0), getDouble((path == null ? "" : path + ".") + "y", 0), getDouble((path == null ? "" : path + ".") + "z", 0), (float) getDouble((path == null ? "" : path + ".") + "yaw", 0), (float) getDouble((path == null ? "" : path + ".") + "pitch", 0));
}
public void setProperty(final String path, final Location loc) {
set((path == null ? "" : path + ".") + "world", loc.getWorld().getName());
set((path == null ? "" : path + ".") + "x", loc.getX());
set((path == null ? "" : path + ".") + "y", loc.getY());
set((path == null ? "" : path + ".") + "z", loc.getZ());
set((path == null ? "" : path + ".") + "yaw", loc.getYaw());
set((path == null ? "" : path + ".") + "pitch", loc.getPitch());
}
@Override
public ItemStack getItemStack(final String path) {
final ItemStack stack = new ItemStack(Material.valueOf(getString(path + ".type", "AIR")), getInt(path + ".amount", 1), (short) getInt(path + ".damage", 0));
final ConfigurationSection enchants = getConfigurationSection(path + ".enchant");
if (enchants != null) {
for (final String enchant : enchants.getKeys(false)) {
final Enchantment enchantment = Enchantment.getByName(enchant.toUpperCase(Locale.ENGLISH));
if (enchantment == null) {
continue;
}
final int level = getInt(path + ".enchant." + enchant, enchantment.getStartLevel());
stack.addUnsafeEnchantment(enchantment, level);
}
}
return stack;
/*
* ,
* (byte)getInt(path + ".data", 0)
*/
}
public void setProperty(final String path, final ItemStack stack) {
final Map<String, Object> map = new HashMap<>();
map.put("type", stack.getType().toString());
map.put("amount", stack.getAmount());
map.put("damage", stack.getDurability());
final Map<Enchantment, Integer> enchantments = stack.getEnchantments();
if (!enchantments.isEmpty()) {
final Map<String, Integer> enchant = new HashMap<>();
for (final Map.Entry<Enchantment, Integer> entry : enchantments.entrySet()) {
enchant.put(entry.getKey().getName().toLowerCase(Locale.ENGLISH), entry.getValue());
}
map.put("enchant", enchant);
}
// getData().getData() is broken
//map.put("data", stack.getDurability());
set(path, map);
}
public void setProperty(final String path, final List object) {
set(path, new ArrayList(object));
}
public void setProperty(final String path, final Map object) {
set(path, new LinkedHashMap(object));
}
public Object getProperty(final String path) {
return get(path);
}
public void setProperty(final String path, final BigDecimal bigDecimal) {
set(path, bigDecimal.toString());
}
public void setProperty(final String path, final Object object) {
set(path, object);
}
public void removeProperty(final String path) {
set(path, null);
}
@Override
public synchronized Object get(final String path) {
return super.get(path);
}
@Override
public synchronized Object get(final String path, final Object def) {
return super.get(path, def);
}
public synchronized BigDecimal getBigDecimal(final String path, final BigDecimal def) {
final String input = super.getString(path);
return toBigDecimal(input, def);
}
@Override
public synchronized boolean getBoolean(final String path) {
return super.getBoolean(path);
}
@Override
public synchronized boolean getBoolean(final String path, final boolean def) {
return super.getBoolean(path, def);
}
@Override
public synchronized List<Boolean> getBooleanList(final String path) {
return super.getBooleanList(path);
}
@Override
public synchronized List<Byte> getByteList(final String path) {
return super.getByteList(path);
}
@Override
public synchronized List<Character> getCharacterList(final String path) {
return super.getCharacterList(path);
}
@Override
public synchronized ConfigurationSection getConfigurationSection(final String path) {
return super.getConfigurationSection(path);
}
@Override
public synchronized double getDouble(final String path) {
return super.getDouble(path);
}
@Override
public synchronized double getDouble(final String path, final double def) {
return super.getDouble(path, def);
}
@Override
public synchronized List<Double> getDoubleList(final String path) {
return super.getDoubleList(path);
}
@Override
public synchronized List<Float> getFloatList(final String path) {
return super.getFloatList(path);
}
@Override
public synchronized int getInt(final String path) {
return super.getInt(path);
}
@Override
public synchronized int getInt(final String path, final int def) {
return super.getInt(path, def);
}
@Override
public synchronized List<Integer> getIntegerList(final String path) {
return super.getIntegerList(path);
}
@Override
public synchronized ItemStack getItemStack(final String path, final ItemStack def) {
return super.getItemStack(path, def);
}
@Override
public synchronized Set<String> getKeys(final boolean deep) {
return super.getKeys(deep);
}
@Override
public synchronized List<?> getList(final String path) {
return super.getList(path);
}
@Override
public synchronized List<?> getList(final String path, final List<?> def) {
return super.getList(path, def);
}
@Override
public synchronized long getLong(final String path) {
return super.getLong(path);
}
@Override
public synchronized long getLong(final String path, final long def) {
return super.getLong(path, def);
}
@Override
public synchronized List<Long> getLongList(final String path) {
return super.getLongList(path);
}
public synchronized Map<String, Object> getMap() {
return map;
}
@Override
public synchronized List<Map<?, ?>> getMapList(final String path) {
return super.getMapList(path);
}
@Override
public synchronized OfflinePlayer getOfflinePlayer(final String path) {
return super.getOfflinePlayer(path);
}
@Override
public synchronized OfflinePlayer getOfflinePlayer(final String path, final OfflinePlayer def) {
return super.getOfflinePlayer(path, def);
}
@Override
public synchronized List<Short> getShortList(final String path) {
return super.getShortList(path);
}
@Override
public synchronized String getString(final String path) {
return super.getString(path);
}
@Override
public synchronized String getString(final String path, final String def) {
return super.getString(path, def);
}
@Override
public synchronized List<String> getStringList(final String path) {
return super.getStringList(path);
}
@Override
public synchronized Map<String, Object> getValues(final boolean deep) {
return super.getValues(deep);
}
@Override
public synchronized Vector getVector(final String path) {
return super.getVector(path);
}
@Override
public synchronized Vector getVector(final String path, final Vector def) {
return super.getVector(path, def);
}
@Override
public synchronized boolean isBoolean(final String path) {
return super.isBoolean(path);
}
@Override
public synchronized boolean isConfigurationSection(final String path) {
return super.isConfigurationSection(path);
}
@Override
public synchronized boolean isDouble(final String path) {
return super.isDouble(path);
}
@Override
public synchronized boolean isInt(final String path) {
return super.isInt(path);
}
@Override
public synchronized boolean isItemStack(final String path) {
return super.isItemStack(path);
}
@Override
public synchronized boolean isList(final String path) {
return super.isList(path);
}
@Override
public synchronized boolean isLong(final String path) {
return super.isLong(path);
}
@Override
public synchronized boolean isOfflinePlayer(final String path) {
return super.isOfflinePlayer(path);
}
@Override
public synchronized boolean isSet(final String path) {
return super.isSet(path);
}
@Override
public synchronized boolean isString(final String path) {
return super.isString(path);
}
@Override
public synchronized boolean isVector(final String path) {
return super.isVector(path);
}
@Override
public synchronized void set(final String path, final Object value) {
super.set(path, value);
}
private static final class WriteRunner implements Runnable {
private final File configFile;
private final String data;
private final AtomicInteger pendingDiskWrites;
private WriteRunner(final File configFile, final String data, final AtomicInteger pendingDiskWrites) {
this.configFile = configFile;
this.data = data;
this.pendingDiskWrites = pendingDiskWrites;
}
@Override
public void run() {
//long startTime = System.nanoTime();
synchronized (configFile) {
if (pendingDiskWrites.get() > 1) {
// Writes can be skipped, because they are stored in a queue (in the executor).
// Only the last is actually written.
pendingDiskWrites.decrementAndGet();
//LOGGER.log(Level.INFO, configFile + " skipped writing in " + (System.nanoTime() - startTime) + " nsec.");
return;
}
try {
Files.createParentDirs(configFile);
if (!configFile.exists()) {
try {
LOGGER.log(Level.INFO, tl("creatingEmptyConfig", configFile.toString()));
if (!configFile.createNewFile()) {
LOGGER.log(Level.SEVERE, tl("failedToCreateConfig", configFile.toString()));
return;
}
} catch (final IOException ex) {
LOGGER.log(Level.SEVERE, tl("failedToCreateConfig", configFile.toString()), ex);
return;
}
}
try (final FileOutputStream fos = new FileOutputStream(configFile)) {
try (final OutputStreamWriter writer = new OutputStreamWriter(fos, UTF8)) {
writer.write(data);
}
}
} catch (final IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} finally {
//LOGGER.log(Level.INFO, configFile + " written to disk in " + (System.nanoTime() - startTime) + " nsec.");
pendingDiskWrites.decrementAndGet();
}
}
}
}
}
@@ -1,5 +1,6 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.api.IEssentials;
import org.bukkit.Location;
@@ -29,13 +30,11 @@ import org.bukkit.inventory.ItemStack;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import static com.earth2me.essentials.I18n.tl;
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;
@@ -109,7 +108,7 @@ public class EssentialsEntityListener implements Listener {
@Override
public void run() {
attacker.getBase().chat("/" + command);
LOGGER.log(Level.INFO, String.format("[PT] %s issued server command: /%s", attacker.getName(), command));
ess.getLogger().log(Level.INFO, String.format("[PT] %s issued server command: /%s", attacker.getName(), command));
}
}
@@ -198,7 +197,7 @@ public class EssentialsEntityListener implements Listener {
final ISettings.KeepInvPolicy bind = ess.getSettings().getBindingItemsPolicy();
if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_11_2_R01) && (vanish != ISettings.KeepInvPolicy.KEEP || bind != ISettings.KeepInvPolicy.KEEP)) {
for (final ItemStack stack : event.getEntity().getInventory()) {
if (stack != null) {
if (stack != null && !MaterialUtil.isAir(stack.getType())) {
if (stack.getEnchantments().containsKey(Enchantment.VANISHING_CURSE)) {
if (vanish == ISettings.KeepInvPolicy.DELETE) {
event.getEntity().getInventory().remove(stack);
@@ -217,10 +216,12 @@ public class EssentialsEntityListener implements Listener {
}
}
}
// Now check armor
final ItemStack[] armor = event.getEntity().getInventory().getArmorContents();
for (int i = 0; i < armor.length; i++) {
final ItemStack stack = armor[i];
if (stack != null) {
if (stack != null && !MaterialUtil.isAir(stack.getType())) {
if (stack.getEnchantments().containsKey(Enchantment.VANISHING_CURSE)) {
if (vanish == ISettings.KeepInvPolicy.DELETE) {
armor[i] = null;
@@ -244,6 +245,24 @@ public class EssentialsEntityListener implements Listener {
}
}
event.getEntity().getInventory().setArmorContents(armor);
// Now check offhand
if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_9_R01)) {
final ItemStack stack = event.getEntity().getInventory().getItemInOffHand();
//noinspection ConstantConditions
if (stack != null && !MaterialUtil.isAir(stack.getType())) {
final boolean isVanish = stack.getEnchantments().containsKey(Enchantment.VANISHING_CURSE);
final boolean isBind = stack.getEnchantments().containsKey(Enchantment.BINDING_CURSE);
if (isVanish || isBind) {
event.getEntity().getInventory().setItemInOffHand(null);
if ((isVanish && vanish == ISettings.KeepInvPolicy.DROP) || (isBind && bind == ISettings.KeepInvPolicy.DROP)) {
if (!event.getDrops().contains(stack)) {
event.getDrops().add(stack);
}
}
}
}
}
}
}
}
@@ -0,0 +1,74 @@
package com.earth2me.essentials;
import net.ess3.nms.refl.ReflUtil;
import net.ess3.provider.LoggerProvider;
import net.ess3.provider.providers.BaseLoggerProvider;
import net.ess3.provider.providers.PaperLoggerProvider;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
public final class EssentialsLogger {
private final static Map<String, LoggerProvider> loggerProviders = new HashMap<>();
private final static MethodHandle loggerFieldHandle;
static {
try {
final Field loggerField = ReflUtil.getFieldCached(JavaPlugin.class, "logger");
//noinspection ConstantConditions
loggerFieldHandle = MethodHandles.lookup().unreflectSetter(loggerField);
} catch (Throwable t) {
throw new RuntimeException("Failed to get logger field handle", t);
}
}
private EssentialsLogger() {
}
public static LoggerProvider getLoggerProvider(final Plugin plugin) {
if (loggerProviders.containsKey(plugin.getName())) {
return loggerProviders.get(plugin.getName());
}
final Logger parentLogger = Logger.getLogger(plugin.getName());
final LoggerProvider provider;
if (ReflUtil.getClassCached("io.papermc.paper.adventure.providers.ComponentLoggerProviderImpl") != null) {
provider = new PaperLoggerProvider(plugin);
provider.setParent(parentLogger);
} else {
provider = new BaseLoggerProvider(plugin, parentLogger);
provider.setParent(parentLogger);
}
loggerProviders.put(plugin.getName(), provider);
return provider;
}
public static void updatePluginLogger(final Plugin plugin) {
final LoggerProvider provider = getLoggerProvider(plugin);
try {
loggerFieldHandle.invoke(plugin, provider);
} catch (Throwable e) {
provider.log(Level.SEVERE, "Failed to update " + plugin.getName() + " logger", e);
}
}
public static LoggerProvider getLoggerProvider(final String pluginName) {
if (loggerProviders.containsKey(pluginName)) {
return loggerProviders.get(pluginName);
}
final Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName);
if (plugin == null) {
throw new IllegalArgumentException("Plugin not found: " + pluginName);
}
return getLoggerProvider(plugin);
}
}
@@ -72,13 +72,11 @@ import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import static com.earth2me.essentials.I18n.tl;
public class EssentialsPlayerListener implements Listener, FakeAccessor {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private final transient IEssentials ess;
private final ConcurrentHashMap<UUID, Integer> pendingMotdTasks = new ConcurrentHashMap<>();
@@ -166,7 +164,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
user.sendMessage(user.hasMuteReason() ? tl("voiceSilencedReasonTime", dateDiff, user.getMuteReason()) : tl("voiceSilencedTime", dateDiff));
}
LOGGER.info(tl("mutedUserSpeaks", user.getName(), event.getMessage()));
ess.getLogger().info(tl("mutedUserSpeaks", user.getName(), event.getMessage()));
}
try {
final Iterator<Player> it = event.getRecipients().iterator();
@@ -198,7 +196,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
event.getHandlers().unregister(this);
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Unregistering move listener");
ess.getLogger().log(Level.INFO, "Unregistering move listener");
}
return;
@@ -217,6 +215,10 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
to.setY(from.getY());
to.setZ(from.getZ());
try {
if (event.getPlayer().getAllowFlight()) {
// Don't teleport to a safe location here, they are either a god or flying
throw new Exception();
}
event.setTo(LocationUtil.getSafeDestination(ess, to));
} catch (final Exception ex) {
event.setTo(to);
@@ -258,6 +260,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
user.setGodModeEnabled(false);
}
if (user.isVanished()) {
user.setLeavingHidden(true);
user.setVanished(false);
}
user.setLogoutLocation();
@@ -332,6 +335,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
user.setLastLogin(currentTime);
user.setDisplayNick();
updateCompass(user);
user.setLeavingHidden(false);
// Check for new username. If they don't want the message, let's just say it's false.
final boolean newUsername = ess.getSettings().isCustomNewUsernameMessage() && lastAccountName != null && !lastAccountName.equals(user.getBase().getName());
@@ -460,9 +464,9 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
tempInput = new TextInput(user.getSource(), "motd", true, ess);
} catch (final IOException ex) {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.WARNING, ex.getMessage(), ex);
ess.getLogger().log(Level.WARNING, ex.getMessage(), ex);
} else {
LOGGER.log(Level.WARNING, ex.getMessage());
ess.getLogger().log(Level.WARNING, ex.getMessage());
}
}
}
@@ -622,7 +626,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
} else {
player.sendMessage(user.hasMuteReason() ? tl("voiceSilencedReasonTime", dateDiff, user.getMuteReason()) : tl("voiceSilencedTime", dateDiff));
}
LOGGER.info(tl("mutedUserSpeaks", player.getName(), event.getMessage()));
ess.getLogger().info(tl("mutedUserSpeaks", player.getName(), event.getMessage()));
return;
}
@@ -810,7 +814,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
ess.scheduleSyncDelayedTask(new DelayedClickJumpTask());
} catch (final Exception ex) {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.WARNING, ex.getMessage(), ex);
ess.getLogger().log(Level.WARNING, ex.getMessage(), ex);
}
}
}
@@ -834,7 +838,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
@Override
public void run() {
user.getBase().chat("/" + command);
LOGGER.log(Level.INFO, String.format("[PT] %s issued server command: /%s", user.getName(), command));
ess.getLogger().log(Level.INFO, String.format("[PT] %s issued server command: /%s", user.getName(), command));
}
}
@@ -47,14 +47,12 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.earth2me.essentials.I18n.tl;
public class EssentialsUpgrade {
private final static Logger LOGGER = Logger.getLogger("Essentials");
private static final FileFilter YML_FILTER = pathname -> pathname.isFile() && pathname.getName().endsWith(".yml");
private static final String PATTERN_CONFIG_UUID_REGEX = "(?mi)^uuid:\\s*([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\s*$";
private static final Pattern PATTERN_CONFIG_UUID = Pattern.compile(PATTERN_CONFIG_UUID_REGEX);
@@ -186,13 +184,13 @@ public class EssentialsUpgrade {
config.blockingSave();
}
} catch (RuntimeException ex) {
LOGGER.log(Level.INFO, "File: " + file);
ess.getLogger().log(Level.INFO, "File: " + file);
throw ex;
}
}
doneFile.setProperty("updateUsersMailList", true);
doneFile.save();
LOGGER.info("Done converting mail list.");
ess.getLogger().info("Done converting mail list.");
}
public void convertStupidCamelCaseUserdataKeys() {
@@ -200,7 +198,7 @@ public class EssentialsUpgrade {
return;
}
LOGGER.info("Attempting to migrate legacy userdata keys to Configurate");
ess.getLogger().info("Attempting to migrate legacy userdata keys to Configurate");
final File userdataFolder = new File(ess.getDataFolder(), "userdata");
if (!userdataFolder.exists() || !userdataFolder.isDirectory()) {
@@ -241,13 +239,13 @@ public class EssentialsUpgrade {
}
config.blockingSave();
} catch (final RuntimeException ex) {
LOGGER.log(Level.INFO, "File: " + file);
ess.getLogger().log(Level.INFO, "File: " + file);
throw ex;
}
}
doneFile.setProperty("updateUsersStupidLegacyPathNames", true);
doneFile.save();
LOGGER.info("Done converting legacy userdata keys to Configurate.");
ess.getLogger().info("Done converting legacy userdata keys to Configurate.");
}
/**
@@ -290,31 +288,31 @@ public class EssentialsUpgrade {
}
final File backupFolder = new File(ess.getDataFolder(), "userdata-npc-backup");
if (backupFolder.exists()) {
LOGGER.info("NPC backup folder already exists; skipping NPC purge.");
LOGGER.info("To finish purging broken NPC accounts, rename the \"plugins/Essentials/userdata-npc-backup\" folder and restart your server.");
ess.getLogger().info("NPC backup folder already exists; skipping NPC purge.");
ess.getLogger().info("To finish purging broken NPC accounts, rename the \"plugins/Essentials/userdata-npc-backup\" folder and restart your server.");
return;
} else if (!backupFolder.mkdir()) {
LOGGER.info("Skipping NPC purge due to error creating backup folder.");
ess.getLogger().info("Skipping NPC purge due to error creating backup folder.");
return;
}
LOGGER.info("#===========================================================================#");
LOGGER.info(" EssentialsX will now purge any NPC accounts which were incorrectly created.");
LOGGER.info(" Only NPC accounts with the default starting balance will be deleted. If");
LOGGER.info(" they turn out to be valid NPC accounts, they will be re-created as needed.");
LOGGER.info(" Any files deleted here will be backed up to the ");
LOGGER.info(" \"plugins/Essentials/userdata-npc-backup\" folder. If you notice any files");
LOGGER.info(" have been purged incorrectly, you should restore it from the backup and");
LOGGER.info(" report it to us on GitHub:");
LOGGER.info(" https://github.com/EssentialsX/Essentials/issues/new/choose");
LOGGER.info("");
LOGGER.info(" NOTE: This is a one-time process and will take several minutes if you have");
LOGGER.info(" a lot of userdata files! If you interrupt this process, EssentialsX will");
LOGGER.info(" skip the process until you rename or remove the backup folder.");
LOGGER.info("#===========================================================================#");
ess.getLogger().info("#===========================================================================#");
ess.getLogger().info(" EssentialsX will now purge any NPC accounts which were incorrectly created.");
ess.getLogger().info(" Only NPC accounts with the default starting balance will be deleted. If");
ess.getLogger().info(" they turn out to be valid NPC accounts, they will be re-created as needed.");
ess.getLogger().info(" Any files deleted here will be backed up to the ");
ess.getLogger().info(" \"plugins/Essentials/userdata-npc-backup\" folder. If you notice any files");
ess.getLogger().info(" have been purged incorrectly, you should restore it from the backup and");
ess.getLogger().info(" report it to us on GitHub:");
ess.getLogger().info(" https://github.com/EssentialsX/Essentials/issues/new/choose");
ess.getLogger().info("");
ess.getLogger().info(" NOTE: This is a one-time process and will take several minutes if you have");
ess.getLogger().info(" a lot of userdata files! If you interrupt this process, EssentialsX will");
ess.getLogger().info(" skip the process until you rename or remove the backup folder.");
ess.getLogger().info("#===========================================================================#");
final int totalUserFiles = userFiles.length;
LOGGER.info("Found ~" + totalUserFiles + " files under \"plugins/Essentials/userdata\"...");
ess.getLogger().info("Found ~" + totalUserFiles + " files under \"plugins/Essentials/userdata\"...");
final AtomicInteger movedAccounts = new AtomicInteger(0);
final AtomicInteger totalAccounts = new AtomicInteger(0);
@@ -324,7 +322,7 @@ public class EssentialsUpgrade {
final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
final ScheduledFuture<?> feedbackTask = executor.scheduleWithFixedDelay(
() -> LOGGER.info("Scanned " + totalAccounts.get() + "/" + totalUserFiles + " accounts; moved " + movedAccounts.get() + " accounts"),
() -> ess.getLogger().info("Scanned " + totalAccounts.get() + "/" + totalUserFiles + " accounts; moved " + movedAccounts.get() + " accounts"),
5, feedbackInterval, TimeUnit.SECONDS);
for (final File file : userFiles) {
@@ -358,10 +356,10 @@ public class EssentialsUpgrade {
Files.move(file, new File(backupFolder, file.getName()));
movedAccounts.incrementAndGet();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Error while moving NPC file", e);
ess.getLogger().log(Level.SEVERE, "Error while moving NPC file", e);
}
} catch (final RuntimeException ex) {
LOGGER.log(Level.INFO, "File: " + file);
ess.getLogger().log(Level.INFO, "File: " + file);
feedbackTask.cancel(false);
executor.shutdown();
throw ex;
@@ -372,18 +370,18 @@ public class EssentialsUpgrade {
doneFile.setProperty("updatePurgeBrokenNpcAccounts", true);
doneFile.save();
LOGGER.info("#===========================================================================#");
LOGGER.info(" EssentialsX has finished purging NPC accounts.");
LOGGER.info("");
LOGGER.info(" Deleted accounts: " + movedAccounts);
LOGGER.info(" Total accounts processed: " + totalAccounts);
LOGGER.info("");
LOGGER.info(" Purged accounts have been backed up to");
LOGGER.info(" \"plugins/Essentials/userdata-npc-backup\", and can be restored from there");
LOGGER.info(" if needed. Please report any files which have been incorrectly deleted");
LOGGER.info(" to us on GitHub:");
LOGGER.info(" https://github.com/EssentialsX/Essentials/issues/new/choose");
LOGGER.info("#===========================================================================#");
ess.getLogger().info("#===========================================================================#");
ess.getLogger().info(" EssentialsX has finished purging NPC accounts.");
ess.getLogger().info("");
ess.getLogger().info(" Deleted accounts: " + movedAccounts);
ess.getLogger().info(" Total accounts processed: " + totalAccounts);
ess.getLogger().info("");
ess.getLogger().info(" Purged accounts have been backed up to");
ess.getLogger().info(" \"plugins/Essentials/userdata-npc-backup\", and can be restored from there");
ess.getLogger().info(" if needed. Please report any files which have been incorrectly deleted");
ess.getLogger().info(" to us on GitHub:");
ess.getLogger().info(" https://github.com/EssentialsX/Essentials/issues/new/choose");
ess.getLogger().info("#===========================================================================#");
}
public void convertIgnoreList() {
@@ -392,7 +390,7 @@ public class EssentialsUpgrade {
return;
}
LOGGER.info("Attempting to migrate ignore list to UUIDs");
ess.getLogger().info("Attempting to migrate ignore list to UUIDs");
final File userdataFolder = new File(ess.getDataFolder(), "userdata");
if (!userdataFolder.exists() || !userdataFolder.isDirectory()) {
@@ -414,7 +412,7 @@ public class EssentialsUpgrade {
continue;
}
if (pattern.matcher(name.trim()).matches()) {
LOGGER.info("Detected already migrated ignore list!");
ess.getLogger().info("Detected already migrated ignore list!");
return;
}
final User user = ess.getOfflineUser(name);
@@ -427,13 +425,13 @@ public class EssentialsUpgrade {
config.blockingSave();
}
} catch (final RuntimeException ex) {
LOGGER.log(Level.INFO, "File: " + file);
ess.getLogger().log(Level.INFO, "File: " + file);
throw ex;
}
}
doneFile.setProperty("updateUsersIgnoreListUUID", true);
doneFile.save();
LOGGER.info("Done converting ignore list.");
ess.getLogger().info("Done converting ignore list.");
}
public void convertKits() {
@@ -443,25 +441,25 @@ public class EssentialsUpgrade {
return;
}
LOGGER.info("Attempting to convert old kits in config.yml to new kits.yml");
ess.getLogger().info("Attempting to convert old kits in config.yml to new kits.yml");
final CommentedConfigurationNode section = ess.getSettings().getKitSection();
if (section == null) {
LOGGER.info("No kits found to migrate.");
ess.getLogger().info("No kits found to migrate.");
return;
}
final Map<String, Object> legacyKits = ConfigurateUtil.getRawMap(section);
for (final Map.Entry<String, Object> entry : legacyKits.entrySet()) {
LOGGER.info("Converting " + entry.getKey());
ess.getLogger().info("Converting " + entry.getKey());
config.setRaw("kits." + entry.getKey(), entry.getValue());
}
config.save();
doneFile.setProperty("kitsyml", true);
doneFile.save();
LOGGER.info("Done converting kits.");
ess.getLogger().info("Done converting kits.");
}
private void moveMotdRulesToFile(final String name) {
@@ -494,7 +492,7 @@ public class EssentialsUpgrade {
doneFile.setProperty("move" + name + "ToFile", true);
doneFile.save();
} catch (final IOException e) {
LOGGER.log(Level.SEVERE, tl("upgradingFilesError"), e);
ess.getLogger().log(Level.SEVERE, tl("upgradingFilesError"), e);
}
}
@@ -572,7 +570,7 @@ public class EssentialsUpgrade {
config.blockingSave();
}
} catch (final RuntimeException ex) {
LOGGER.log(Level.INFO, "File: " + file);
ess.getLogger().log(Level.INFO, "File: " + file);
throw ex;
}
}
@@ -628,7 +626,7 @@ public class EssentialsUpgrade {
}
} catch (final RuntimeException ex) {
LOGGER.log(Level.INFO, "File: " + file);
ess.getLogger().log(Level.INFO, "File: " + file);
throw ex;
}
}
@@ -657,15 +655,15 @@ public class EssentialsUpgrade {
final File tmpFile = new File(listOfFile.getParentFile(), sanitizedFilename + ".tmp");
final File newFile = new File(listOfFile.getParentFile(), sanitizedFilename);
if (!listOfFile.renameTo(tmpFile)) {
LOGGER.log(Level.WARNING, tl("userdataMoveError", filename, sanitizedFilename));
ess.getLogger().log(Level.WARNING, tl("userdataMoveError", filename, sanitizedFilename));
continue;
}
if (newFile.exists()) {
LOGGER.log(Level.WARNING, tl("duplicatedUserdata", filename, sanitizedFilename));
ess.getLogger().log(Level.WARNING, tl("duplicatedUserdata", filename, sanitizedFilename));
continue;
}
if (!tmpFile.renameTo(newFile)) {
LOGGER.log(Level.WARNING, tl("userdataMoveBackError", sanitizedFilename, sanitizedFilename));
ess.getLogger().log(Level.WARNING, tl("userdataMoveBackError", sanitizedFilename, sanitizedFilename));
}
}
doneFile.setProperty("sanitizeAllUserFilenames", true);
@@ -722,7 +720,7 @@ public class EssentialsUpgrade {
doneFile.setProperty("deleteOldItemsCsv", true);
doneFile.save();
} catch (final IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
ess.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
}
}
}
@@ -748,7 +746,7 @@ public class EssentialsUpgrade {
config.blockingSave();
}
} catch (final Exception ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
ess.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
}
}
doneFile.setProperty("updateSpawnsToNewSpawnsConfig", true);
@@ -776,7 +774,7 @@ public class EssentialsUpgrade {
config.blockingSave();
}
} catch (final Exception ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
ess.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
}
}
doneFile.setProperty("updateJailsToNewJailsConfig", true);
@@ -1,66 +0,0 @@
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 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;
}
public void setUsername(String username) {
this.username = username;
}
@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 (final 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 (final IOException ex) {
Bukkit.getLogger().log(Level.WARNING, "Failed to migrate user: " + username, ex);
}
}
}
@@ -21,7 +21,6 @@ import java.util.MissingResourceException;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
public class I18n implements net.ess3.api.II18n {
@@ -89,7 +88,7 @@ public class I18n implements net.ess3.api.II18n {
}
} catch (final MissingResourceException ex) {
if (ess == null || ess.getSettings().isDebug()) {
Logger.getLogger("Essentials").log(Level.WARNING, String.format("Missing translation key \"%s\" in translation file %s", ex.getKey(), localeBundle.getLocale().toString()), ex);
ess.getLogger().log(Level.WARNING, String.format("Missing translation key \"%s\" in translation file %s", ex.getKey(), localeBundle.getLocale().toString()), ex);
}
return defaultBundle.getString(string);
}
@@ -126,7 +125,7 @@ public class I18n implements net.ess3.api.II18n {
}
ResourceBundle.clearCache();
messageFormatCache = new HashMap<>();
Logger.getLogger("Essentials").log(Level.INFO, String.format("Using locale %s", currentLocale.toString()));
ess.getLogger().log(Level.INFO, String.format("Using locale %s", currentLocale.toString()));
try {
localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new UTF8PropertiesControl());
@@ -14,8 +14,9 @@ import net.ess3.provider.ItemUnbreakableProvider;
import net.ess3.provider.KnownCommandsProvider;
import net.ess3.provider.MaterialTagProvider;
import net.ess3.provider.PersistentDataProvider;
import net.ess3.provider.ServerStateProvider;
import net.ess3.provider.SerializationProvider;
import net.ess3.provider.ServerStateProvider;
import net.ess3.provider.SignDataProvider;
import net.ess3.provider.SpawnerBlockProvider;
import net.ess3.provider.SpawnerItemProvider;
import net.ess3.provider.SyncCommandsProvider;
@@ -165,5 +166,7 @@ public interface IEssentials extends Plugin {
WorldInfoProvider getWorldInfoProvider();
SignDataProvider getSignDataProvider();
PluginCommand getPluginCommand(String cmd);
}
@@ -46,6 +46,12 @@ public interface ISettings extends IConf {
char getChatQuestion();
boolean isShoutDefault();
boolean isPersistShout();
boolean isChatQuestionEnabled();
BigDecimal getCommandCost(IEssentialsCommand cmd);
BigDecimal getCommandCost(String label);
@@ -228,6 +234,8 @@ public interface ISettings extends IConf {
boolean isWorldHomePermissions();
int getMaxTreeCommandRange();
boolean registerBackInListener();
boolean getDisableItemPickupWhileAfk();
@@ -94,6 +94,15 @@ public interface IUser {
*/
boolean isHidden();
/**
* Whether the user was hidden before leaving the server.
*
* @return true if the user was hidden.
*/
boolean isLeavingHidden();
void setLeavingHidden(boolean leavingHidden);
void setHidden(boolean vanish);
boolean isGodModeEnabled();
@@ -261,12 +270,12 @@ public interface IUser {
* period are removed from queue and therefore not returned here. The maximum size of this
* queue is determined by {@link ISettings#getTpaMaxRequests()}.
*
* @param inform true if the underlying {@link IUser} should be informed if a request expires during iteration.
* @param performExpirations true if this method should not spend time validating time for all items in the queue and just return the first item in the queue.
* @param excludeHere true if /tphere requests should be ignored in fetching the next tpa request.
* @param inform true if the underlying {@link IUser} should be informed if a request expires during iteration.
* @param ignoreExpirations true if this method should not process expirations for the entire queue and stop execution on the first unexpired request.
* @param excludeHere true if /tphere requests should be ignored in fetching the next tpa request.
* @return A {@link TpaRequest} corresponding to the next available request or null if no valid request is present.
*/
@Nullable TpaRequest getNextTpaRequest(boolean inform, boolean performExpirations, boolean excludeHere);
@Nullable TpaRequest getNextTpaRequest(boolean inform, boolean ignoreExpirations, boolean excludeHere);
/**
* Whether or not this {@link IUser} has any valid TPA requests in queue.
@@ -34,12 +34,10 @@ import java.util.Locale;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class Jails implements net.ess3.api.IJails {
private static final transient Logger LOGGER = Logger.getLogger("Essentials");
private static transient boolean enabled = false;
private final IEssentials ess;
private final EssentialsConfiguration config;
@@ -76,7 +74,7 @@ public class Jails implements net.ess3.api.IJails {
final JailListener blockListener = new JailListener();
pluginManager.registerEvents(blockListener, ess);
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Registering Jail listener");
ess.getLogger().log(Level.INFO, "Registering Jail listener");
}
}
@@ -268,9 +266,9 @@ public class Jails implements net.ess3.api.IJails {
event.setRespawnLocation(getJail(user.getJail()));
} catch (final Exception ex) {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
ess.getLogger().log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
} else {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
ess.getLogger().log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
}
}
@@ -286,9 +284,9 @@ public class Jails implements net.ess3.api.IJails {
event.setTo(getJail(user.getJail()));
} catch (final Exception ex) {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
ess.getLogger().log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
} else {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
ess.getLogger().log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
}
user.sendMessage(tl("jailMessage"));
@@ -306,9 +304,9 @@ public class Jails implements net.ess3.api.IJails {
final CompletableFuture<Boolean> future = new CompletableFuture<>();
future.exceptionally(ex -> {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
ess.getLogger().log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
} else {
LOGGER.log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
ess.getLogger().log(Level.INFO, tl("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
}
return false;
});
@@ -1,7 +1,6 @@
package com.earth2me.essentials;
import net.ess3.api.IEssentials;
import org.bukkit.Bukkit;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
@@ -38,7 +37,7 @@ public class ManagedFile {
throw new IOException("Could not delete file " + file.toString());
}
} catch (final IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
Essentials.getWrappedLogger().log(Level.SEVERE, ex.getMessage(), ex);
}
}
@@ -46,7 +45,7 @@ public class ManagedFile {
try {
copyResourceAscii("/" + filename, file);
} catch (final IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, tl("itemsCsvNotLoaded", filename), ex);
Essentials.getWrappedLogger().log(Level.SEVERE, tl("itemsCsvNotLoaded", filename), ex);
}
}
}
@@ -113,7 +112,7 @@ public class ManagedFile {
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.");
Essentials.getWrappedLogger().warning("File " + file.toString() + " has been modified by user and file version differs, please update the file manually.");
}
}
}
@@ -147,7 +146,7 @@ public class ManagedFile {
return lines;
}
} catch (final IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
Essentials.getWrappedLogger().log(Level.SEVERE, ex.getMessage(), ex);
return Collections.emptyList();
}
}
@@ -210,7 +210,7 @@ public class MetaItemStack {
final boolean value = split.length <= 1 || Boolean.parseBoolean(split[1]);
setUnbreakable(ess, 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())) {
if (MaterialUtil.isPlayerHead(stack)) {
final String owner = split[1];
setSkullOwner(ess, stack, owner);
} else {
@@ -13,7 +13,6 @@ import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
@@ -105,9 +104,13 @@ public enum Mob {
AXOLOTL("Axolotl", Enemies.FRIENDLY, "AXOLOTL"),
GOAT("Goat", Enemies.NEUTRAL, "GOAT"),
GLOW_SQUID("GlowSquid", Enemies.FRIENDLY, "GLOW_SQUID"),
ALLAY("Allay", Enemies.FRIENDLY, "ALLAY"),
FROG("Frog", Enemies.FRIENDLY, "FROG"),
TADPOLE("Tadpole", Enemies.FRIENDLY, "TADPOLE"),
WARDEN("Warden", Enemies.ENEMY, "WARDEN"),
CHEST_BOAT("ChestBoat", Enemies.NEUTRAL, "CHEST_BOAT"),
;
public static final Logger logger = Logger.getLogger("Essentials");
private static final Map<String, Mob> hashMap = new HashMap<>();
private static final Map<EntityType, Mob> bukkitMap = new HashMap<>();
@@ -166,7 +169,7 @@ public enum Mob {
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"));
Essentials.getWrappedLogger().log(Level.WARNING, tl("unableToSpawnMob"));
throw new MobException();
}
return entity;
@@ -3,10 +3,13 @@ package com.earth2me.essentials;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.nms.refl.ReflUtil;
import org.bukkit.TreeSpecies;
import org.bukkit.entity.Axolotl;
import org.bukkit.entity.Boat;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Fox;
import org.bukkit.entity.Frog;
import org.bukkit.entity.Llama;
import org.bukkit.entity.MushroomCow;
import org.bukkit.entity.Ocelot;
@@ -37,6 +40,7 @@ public final class MobCompat {
public static final EntityType PHANTOM = getEntityType("PHANTOM");
public static final EntityType AXOLOTL = getEntityType("AXOLOTL");
public static final EntityType GOAT = getEntityType("GOAT");
public static final EntityType FROG = getEntityType("FROG");
// Constants for mobs that have changed since earlier versions
public static final EntityType CAT = getEntityType("CAT", "OCELOT");
@@ -164,6 +168,33 @@ public final class MobCompat {
}
}
public static void setFrogVariant(final Entity entity, final String variant) {
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_19_R01)) {
return;
}
if (entity instanceof Frog) {
((Frog) entity).setVariant(Frog.Variant.valueOf(variant));
}
}
public static void setBoatVariant(final Entity entity, final BoatVariant variant) {
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_9_R01)) {
return;
}
final Boat boat;
if (entity instanceof Boat) {
boat = (Boat) entity;
} else {
return;
}
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_19_R01)) {
//noinspection deprecation
boat.setWoodType(TreeSpecies.valueOf(variant.getTreeSpecies()));
} else {
boat.setBoatType(Boat.Type.valueOf(variant.getBoatType()));
}
}
public enum CatType {
// These are (loosely) Mojang names for the cats
SIAMESE("SIAMESE", "SIAMESE_CAT"),
@@ -228,4 +259,34 @@ public final class MobCompat {
}
}
public enum BoatVariant {
// Mappings for TreeSpecies names
ACACIA("ACACIA", "ACACIA"),
BIRCH("BIRCH", "BIRCH"),
DARKOAK("DARK_OAK", "DARK_OAK"),
GENERIC("GENERIC", "OAK"),
JUNGLE("JUNGLE", "JUNGLE"),
REDWOOD("REDWOOD", "SPRUCE"),
// Mappings for Boat.Type names (falling back to GENERIC where undefined)
OAK("GENERIC", "OAK"),
SPRUCE("REDWOOD", "SPRUCE"),
MANGROVE("GENERIC", "MANGROVE"),
;
private final String treeSpecies;
private final String boatType;
BoatVariant(final String treeSpecies, final String boatType) {
this.treeSpecies = treeSpecies;
this.boatType = boatType;
}
public String getTreeSpecies() {
return treeSpecies;
}
public String getBoatType() {
return boatType;
}
}
}
@@ -7,6 +7,7 @@ import com.earth2me.essentials.utils.VersionUtil;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.Boat;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.Entity;
@@ -35,7 +36,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import static com.earth2me.essentials.I18n.tl;
@@ -197,9 +197,20 @@ public enum MobData {
CYAN_AXOLOTL("cyan", MobCompat.AXOLOTL, "axolotl:CYAN", true),
BLUE_AXOLOTL("blue", MobCompat.AXOLOTL, "axolotl:BLUE", true),
SCREAMING_GOAT("screaming", MobCompat.GOAT, Data.GOAT_SCREAMING, true),
TEMPERATE_FROG("temperate", MobCompat.FROG, "frog:TEMPERATE", true),
WARM_FROG("warm", MobCompat.FROG, "frog:WARM", true),
COLD_FROG("cold", MobCompat.FROG, "frog:COLD", true),
ACACIA_BOAT("acacia", Boat.class, MobCompat.BoatVariant.ACACIA, true),
BIRCH_BOAT("birch", Boat.class, MobCompat.BoatVariant.BIRCH, true),
DARK_OAK_BOAT("darkoak", Boat.class, MobCompat.BoatVariant.DARKOAK, true),
GENERIC_BOAT("generic", Boat.class, MobCompat.BoatVariant.GENERIC, true),
JUNGLE_BOAT("jungle", Boat.class, MobCompat.BoatVariant.JUNGLE, true),
REDWOOD_BOAT("redwood", Boat.class, MobCompat.BoatVariant.REDWOOD, true),
MANGROVE_BOAT("mangrove", Boat.class, MobCompat.BoatVariant.MANGROVE, true),
OAK_BOAT("oak", Boat.class, MobCompat.BoatVariant.OAK, true),
SPRUCE_BOAT("spruce", Boat.class, MobCompat.BoatVariant.SPRUCE, true),
;
public static final Logger logger = Logger.getLogger("Essentials");
final private String nickname;
final private List<String> suggestions;
final private Object type;
@@ -376,6 +387,8 @@ public enum MobData {
}
} else if (this.value.equals(Data.GOAT_SCREAMING)) {
((Goat) spawned).setScreaming(true);
} else if (this.value instanceof MobCompat.BoatVariant) {
MobCompat.setBoatVariant(spawned, (MobCompat.BoatVariant) this.value);
} else if (this.value instanceof String) {
final String[] split = ((String) this.value).split(":");
switch (split[0]) {
@@ -403,13 +416,15 @@ public enum MobData {
case "fox":
MobCompat.setFoxType(spawned, split[1]);
break;
case "axolotl": {
case "axolotl":
MobCompat.setAxolotlVariant(spawned, split[1]);
break;
}
case "frog":
MobCompat.setFrogVariant(spawned, split[1]);
break;
}
} else {
logger.warning("Unknown mob data type: " + this.toString());
Essentials.getWrappedLogger().warning("Unknown mob data type: " + this.toString());
}
}
@@ -206,4 +206,8 @@ public class RandomTeleport implements IConf {
private boolean isValidRandomLocation(final Location location) {
return location.getBlockY() > ess.getWorldInfoProvider().getMinHeight(location.getWorld()) && !this.getExcludedBiomes().contains(location.getBlock().getBiome());
}
public File getFile() {
return config.getFile();
}
}
@@ -40,14 +40,12 @@ import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import static com.earth2me.essentials.I18n.tl;
public class Settings implements net.ess3.api.ISettings {
private static final Logger logger = Logger.getLogger("Essentials");
private static final BigDecimal DEFAULT_MAX_MONEY = new BigDecimal("10000000000000");
private static final BigDecimal DEFAULT_MIN_MONEY = new BigDecimal("-10000000000000");
private final transient EssentialsConfiguration config;
@@ -226,6 +224,21 @@ public class Settings implements net.ess3.api.ISettings {
return chatQuestion;
}
@Override
public boolean isShoutDefault() {
return config.getBoolean("chat.shout-default", false);
}
@Override
public boolean isPersistShout() {
return config.getBoolean("chat.persist-shout", false);
}
@Override
public boolean isChatQuestionEnabled() {
return config.getBoolean("chat.question-enabled", true);
}
public boolean _isTeleportSafetyEnabled() {
return config.getBoolean("teleport-safety", true);
}
@@ -671,7 +684,7 @@ public class Settings implements net.ess3.api.ISettings {
boolean mapModified = false;
if (!disabledBukkitCommands.isEmpty()) {
if (isDebug()) {
logger.log(Level.INFO, "Re-adding " + disabledBukkitCommands.size() + " disabled commands!");
ess.getLogger().log(Level.INFO, "Re-adding " + disabledBukkitCommands.size() + " disabled commands!");
}
ess.getKnownCommandsProvider().getKnownCommands().putAll(disabledBukkitCommands);
disabledBukkitCommands.clear();
@@ -683,12 +696,12 @@ public class Settings implements net.ess3.api.ISettings {
final Command toDisable = ess.getPluginCommand(effectiveAlias);
if (toDisable != null) {
if (isDebug()) {
logger.log(Level.INFO, "Attempting removal of " + effectiveAlias);
ess.getLogger().log(Level.INFO, "Attempting removal of " + effectiveAlias);
}
final Command removed = ess.getKnownCommandsProvider().getKnownCommands().remove(effectiveAlias);
if (removed != null) {
if (isDebug()) {
logger.log(Level.INFO, "Adding command " + effectiveAlias + " to disabled map!");
ess.getLogger().log(Level.INFO, "Adding command " + effectiveAlias + " to disabled map!");
}
disabledBukkitCommands.put(effectiveAlias, removed);
}
@@ -705,7 +718,7 @@ public class Settings implements net.ess3.api.ISettings {
if (mapModified) {
if (isDebug()) {
logger.log(Level.INFO, "Syncing commands");
ess.getLogger().log(Level.INFO, "Syncing commands");
}
if (reloadCount.get() < 2) {
ess.scheduleSyncDelayedTask(() -> ess.getSyncCommandsProvider().syncCommands());
@@ -784,7 +797,7 @@ public class Settings implements net.ess3.api.ISettings {
//noinspection deprecation
final IItemDb itemDb = ess.getItemDb();
if (itemDb == null || !itemDb.isReady()) {
logger.log(Level.FINE, "Skipping item spawn blacklist read; item DB not yet loaded.");
ess.getLogger().log(Level.FINE, "Skipping item spawn blacklist read; item DB not yet loaded.");
return epItemSpwn;
}
for (String itemName : config.getString("item-spawn-blacklist", "").split(",")) {
@@ -796,7 +809,7 @@ public class Settings implements net.ess3.api.ISettings {
final ItemStack iStack = itemDb.get(itemName);
epItemSpwn.add(iStack.getType());
} catch (final Exception ex) {
logger.log(Level.SEVERE, tl("unknownItemInList", itemName, "item-spawn-blacklist"), ex);
ess.getLogger().log(Level.SEVERE, tl("unknownItemInList", itemName, "item-spawn-blacklist"), ex);
}
}
return epItemSpwn;
@@ -824,7 +837,7 @@ public class Settings implements net.ess3.api.ISettings {
try {
newSigns.add(Signs.valueOf(signName).getSign());
} catch (final Exception ex) {
logger.log(Level.SEVERE, tl("unknownItemInList", signName, "enabledSigns"));
ess.getLogger().log(Level.SEVERE, tl("unknownItemInList", signName, "enabledSigns"));
continue;
}
signsEnabled = true;
@@ -938,7 +951,7 @@ public class Settings implements net.ess3.api.ISettings {
}
if (mat == null) {
logger.log(Level.SEVERE, tl("unknownItemInList", itemName, configName));
ess.getLogger().log(Level.SEVERE, tl("unknownItemInList", itemName, configName));
} else {
list.add(mat);
}
@@ -1212,6 +1225,11 @@ public class Settings implements net.ess3.api.ISettings {
return registerBackInListener;
}
@Override
public int getMaxTreeCommandRange() {
return config.getInt("tree-command-range-limit", 300);
}
private boolean _registerBackInListener() {
return config.getBoolean("register-back-in-listener", false);
}
@@ -1675,7 +1693,7 @@ public class Settings implements net.ess3.api.ISettings {
try {
newSigns.add(Signs.valueOf(signName).getSign());
} catch (final Exception ex) {
logger.log(Level.SEVERE, tl("unknownItemInList", signName, "unprotected-sign-names"));
ess.getLogger().log(Level.SEVERE, tl("unknownItemInList", signName, "unprotected-sign-names"));
}
}
return newSigns;
@@ -1860,7 +1878,7 @@ public class Settings implements net.ess3.api.ISettings {
try {
blacklist.add(Pattern.compile(entry).asPredicate());
} catch (final PatternSyntaxException e) {
logger.warning("Invalid nickname blacklist regex: " + entry);
ess.getLogger().warning("Invalid nickname blacklist regex: " + entry);
}
});
@@ -3,6 +3,7 @@ package com.earth2me.essentials;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.craftbukkit.SetExpFix;
import com.earth2me.essentials.utils.NumberUtil;
import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.IUser;
import net.ess3.api.MaxMoneyException;
@@ -21,7 +22,6 @@ import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
@@ -79,7 +79,7 @@ public class Trade {
try {
fw = new FileWriter(new File(ess.getDataFolder(), "trade.log"), true);
} catch (final IOException ex) {
Logger.getLogger("Essentials").log(Level.SEVERE, null, ex);
Essentials.getWrappedLogger().log(Level.SEVERE, null, ex);
}
}
final StringBuilder sb = new StringBuilder();
@@ -95,8 +95,10 @@ public class Trade {
} else {
if (charge.getItemStack() != null) {
sb.append(charge.getItemStack().getAmount()).append(",");
sb.append(charge.getItemStack().getType().toString()).append(",");
sb.append(charge.getItemStack().getDurability());
sb.append(charge.getItemStack().getType()).append(",");
if (VersionUtil.PRE_FLATTENING) {
sb.append(charge.getItemStack().getDurability());
}
}
if (charge.getMoney() != null) {
sb.append(charge.getMoney()).append(",");
@@ -119,8 +121,10 @@ public class Trade {
} else {
if (pay.getItemStack() != null) {
sb.append(pay.getItemStack().getAmount()).append(",");
sb.append(pay.getItemStack().getType().toString()).append(",");
sb.append(pay.getItemStack().getDurability());
sb.append(pay.getItemStack().getType()).append(",");
if (VersionUtil.PRE_FLATTENING) {
sb.append(pay.getItemStack().getDurability());
}
}
if (pay.getMoney() != null) {
sb.append(pay.getMoney()).append(",");
@@ -154,7 +158,7 @@ public class Trade {
fw.write(sb.toString());
fw.flush();
} catch (final IOException ex) {
Logger.getLogger("Essentials").log(Level.SEVERE, null, ex);
Essentials.getWrappedLogger().log(Level.SEVERE, null, ex);
}
}
@@ -163,7 +167,7 @@ public class Trade {
try {
fw.close();
} catch (final IOException ex) {
Logger.getLogger("Essentials").log(Level.SEVERE, null, ex);
Essentials.getWrappedLogger().log(Level.SEVERE, null, ex);
}
fw = null;
}
@@ -1,7 +1,6 @@
package com.earth2me.essentials;
import com.google.common.io.Files;
import org.bukkit.Bukkit;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -90,7 +89,7 @@ public class UUIDMap {
}
loading = false;
} catch (final IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
Essentials.getWrappedLogger().log(Level.SEVERE, ex.getMessage(), ex);
}
}
@@ -147,9 +146,9 @@ public class UUIDMap {
Files.move(configFile, new File(endFile.getParentFile(), "usermap.bak.csv"));
}
} catch (final Exception ex2) {
Bukkit.getLogger().log(Level.SEVERE, ex2.getMessage(), ex2);
Essentials.getWrappedLogger().log(Level.SEVERE, ex2.getMessage(), ex2);
}
Bukkit.getLogger().log(Level.WARNING, ex.getMessage(), ex);
Essentials.getWrappedLogger().log(Level.WARNING, ex.getMessage(), ex);
}
}
}
@@ -34,10 +34,11 @@ import org.bukkit.potion.PotionEffectType;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
@@ -47,13 +48,11 @@ import java.util.WeakHashMap;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class User extends UserData implements Comparable<User>, IMessageRecipient, net.ess3.api.IUser {
private static final Statistic PLAY_ONE_TICK = EnumUtil.getStatistic("PLAY_ONE_MINUTE", "PLAY_ONE_TICK");
private static final Logger logger = Logger.getLogger("Essentials");
// User modules
private final IMessageRecipient messageRecipient;
@@ -69,6 +68,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
// User properties
private transient boolean vanished;
private boolean hidden = false;
private boolean leavingHidden = false;
private boolean rightClickJump = false;
private boolean invSee = false;
private boolean recipeSee = false;
@@ -89,8 +89,9 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
private long lastNotifiedAboutMailsMs;
private String lastHomeConfirmation;
private long lastHomeConfirmationTimestamp;
private boolean toggleShout = false;
private Boolean toggleShout;
private transient final List<String> signCopy = Lists.newArrayList("", "", "", "");
private transient long lastVanishTime = System.currentTimeMillis();
public User(final Player base, final IEssentials ess) {
super(base, ess);
@@ -109,6 +110,10 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
setBase(base);
}
public IEssentials getEssentials() {
return ess;
}
@Override
public boolean isAuthorized(final IEssentialsCommand cmd) {
return isAuthorized(cmd, "essentials.");
@@ -318,7 +323,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
if (isAuthorized("essentials.itemspawn.item-all") || isAuthorized("essentials.itemspawn.item-" + name))
return true;
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
if (VersionUtil.PRE_FLATTENING) {
final int id = material.getId();
if (isAuthorized("essentials.itemspawn.item-" + id)) return true;
}
@@ -349,11 +354,8 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
// Handle max queue size
teleportRequestQueue.remove(request.getName());
if (teleportRequestQueue.size() >= ess.getSettings().getTpaMaxRequests()) {
String lastKey = null;
for (Map.Entry<String, TpaRequest> entry : teleportRequestQueue.entrySet()) {
lastKey = entry.getKey();
}
teleportRequestQueue.remove(lastKey);
final List<String> keys = new ArrayList<>(teleportRequestQueue.keySet());
teleportRequestQueue.remove(keys.get(keys.size() - 1));
}
// Add request to queue
@@ -402,22 +404,24 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
}
@Override
public TpaRequest getNextTpaRequest(boolean inform, boolean performExpirations, boolean excludeHere) {
public TpaRequest getNextTpaRequest(boolean inform, boolean ignoreExpirations, boolean excludeHere) {
if (teleportRequestQueue.isEmpty()) {
return null;
}
final long timeout = ess.getSettings().getTpaAcceptCancellation();
final Iterator<Map.Entry<String, TpaRequest>> iterator = teleportRequestQueue.entrySet().iterator();
final List<String> keys = new ArrayList<>(teleportRequestQueue.keySet());
Collections.reverse(keys);
TpaRequest nextRequest = null;
while (iterator.hasNext()) {
final TpaRequest request = iterator.next().getValue();
for (final String key : keys) {
final TpaRequest request = teleportRequestQueue.get(key);
if (timeout < 1 || (System.currentTimeMillis() - request.getTime()) <= TimeUnit.SECONDS.toMillis(timeout)) {
if (excludeHere && request.isHere()) {
continue;
}
if (performExpirations) {
if (ignoreExpirations) {
return request;
} else if (nextRequest == null) {
nextRequest = request;
@@ -426,7 +430,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
if (inform) {
sendMessage(tl("requestTimedOutFrom", ess.getUser(request.getRequesterUuid()).getDisplayName()));
}
iterator.remove();
teleportRequestQueue.remove(key);
}
}
return nextRequest;
@@ -515,7 +519,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
this.getBase().setPlayerListName(name);
} catch (final IllegalArgumentException e) {
if (ess.getSettings().isDebug()) {
logger.log(Level.INFO, "Playerlist for " + name + " was not updated. Name clashed with another online player.");
ess.getLogger().log(Level.INFO, "Playerlist for " + name + " was not updated. Name clashed with another online player.");
}
}
}
@@ -633,7 +637,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
return;
}
this.getBase().setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") || set && ess.getSettings().sleepIgnoresAfkPlayers());
this.getBase().setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") || (set && ess.getSettings().sleepIgnoresAfkPlayers()));
if (set && !isAfk()) {
afkPosition = this.getLocation();
this.afkSince = System.currentTimeMillis();
@@ -678,6 +682,16 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
return hidden;
}
@Override
public boolean isLeavingHidden() {
return leavingHidden;
}
@Override
public void setLeavingHidden(boolean leavingHidden) {
this.leavingHidden = leavingHidden;
}
@Override
public void setHidden(final boolean hidden) {
this.hidden = hidden;
@@ -960,6 +974,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
}
}
setHidden(true);
lastVanishTime = System.currentTimeMillis();
ess.getVanishedPlayersNew().add(getName());
this.getBase().setMetadata("vanished", new FixedMetadataValue(ess, true));
if (isAuthorized("essentials.vanish.effect")) {
@@ -1186,6 +1201,10 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
return isBaltopExcludeCache();
}
public long getLastVanishTime() {
return lastVanishTime;
}
@Override
public Block getTargetBlock(int maxDistance) {
final Block block;
@@ -1198,10 +1217,16 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
@Override
public void setToggleShout(boolean toggleShout) {
this.toggleShout = toggleShout;
if (ess.getSettings().isPersistShout()) {
setShouting(toggleShout);
}
}
@Override
public boolean isToggleShout() {
return toggleShout;
if (ess.getSettings().isPersistShout()) {
return toggleShout = isShouting();
}
return toggleShout == null ? toggleShout = ess.getSettings().isShoutDefault() : toggleShout;
}
}
@@ -85,14 +85,14 @@ public abstract class UserData extends PlayerExtension implements IConf {
try {
holder = config.getRootNode().get(UserConfigHolder.class);
} catch (SerializationException e) {
ess.getLogger().log(Level.SEVERE, "Error while reading user config: " + e.getMessage(), e);
ess.getLogger().log(Level.SEVERE, "Error while reading user config: " + config.getFile().getName(), e);
throw new RuntimeException(e);
}
config.setSaveHook(() -> {
try {
config.getRootNode().set(UserConfigHolder.class, holder);
} catch (SerializationException e) {
ess.getLogger().log(Level.SEVERE, "Error while saving user config: " + e.getMessage(), e);
ess.getLogger().log(Level.SEVERE, "Error while saving user config: " + config.getFile().getName(), e);
throw new RuntimeException(e);
}
});
@@ -722,6 +722,18 @@ public abstract class UserData extends PlayerExtension implements IConf {
config.save();
}
public boolean isShouting() {
if (holder.shouting() == null) {
holder.shouting(ess.getSettings().isShoutDefault());
}
return holder.shouting();
}
public void setShouting(boolean shouting) {
holder.shouting(shouting);
config.save();
}
public UUID getConfigUUID() {
return config.getUuid();
}
@@ -16,12 +16,10 @@ import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class Warps implements IConf, net.ess3.api.IWarps {
private static final Logger logger = Logger.getLogger("Essentials");
private final Map<StringIgnoreCase, EssentialsConfiguration> warpPoints = new HashMap<>();
private final File warpsFolder;
@@ -135,7 +133,7 @@ public class Warps implements IConf, net.ess3.api.IWarps {
warpPoints.put(new StringIgnoreCase(name), conf);
}
} catch (final Exception ex) {
logger.log(Level.WARNING, tl("loadWarpError", filename), ex);
Essentials.getWrappedLogger().log(Level.WARNING, tl("loadWarpError", filename), ex);
}
}
}
@@ -30,13 +30,15 @@ public class Worth implements IConf {
* @return The price from the config.
*/
public BigDecimal getPrice(final IEssentials ess, final ItemStack itemStack) {
BigDecimal result;
BigDecimal result = BigDecimal.ONE.negate();
final 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());
if (VersionUtil.PRE_FLATTENING) {
// 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) {
@@ -140,7 +142,7 @@ public class Worth implements IConf {
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) {
if (VersionUtil.PRE_FLATTENING && itemStack.getType().getData() == null) {
// Bukkit-bug: getDurability still contains the correct value, while getData().getData() is 0.
path = path + "." + itemStack.getDurability();
}
@@ -149,6 +151,10 @@ public class Worth implements IConf {
config.save();
}
public File getFile() {
return config.getFile();
}
@Override
public void reloadConfig() {
config.load();
@@ -17,14 +17,12 @@ import java.math.MathContext;
import java.text.MessageFormat;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* You should use Vault instead of directly using this class.
*/
public class Economy {
public static final MathContext MATH_CONTEXT = MathContext.DECIMAL128;
private static final Logger LOGGER = Logger.getLogger("Essentials");
private static IEssentials ess;
private static final String WARN_CALL_BEFORE_LOAD = "Essentials API is called before Essentials is loaded.";
@@ -54,8 +52,8 @@ public class Economy {
final UUID npcUUID = UUID.nameUUIDFromBytes(("NPC:" + name).getBytes(Charsets.UTF_8));
final File npcFile = new File(folder, npcUUID + ".yml");
if (npcFile.exists()) {
LOGGER.log(Level.SEVERE, MessageFormat.format(WARN_NPC_RECREATE_1, name, npcUUID.toString()), new RuntimeException());
LOGGER.log(Level.SEVERE, WARN_NPC_RECREATE_2);
ess.getLogger().log(Level.SEVERE, MessageFormat.format(WARN_NPC_RECREATE_1, name, npcUUID.toString()), new RuntimeException());
ess.getLogger().log(Level.SEVERE, WARN_NPC_RECREATE_2);
}
final EssentialsUserConfiguration npcConfig = new EssentialsUserConfiguration(name, npcUUID, npcFile);
npcConfig.load();
@@ -90,7 +88,7 @@ public class Economy {
if (player != null) {
user = ess.getUser(player.getUniqueId());
if (user != null) {
LOGGER.log(Level.INFO, MessageFormat.format(WARN_PLAYER_UUID_NO_NAME, name, player.getUniqueId().toString()), new RuntimeException());
ess.getLogger().log(Level.INFO, MessageFormat.format(WARN_PLAYER_UUID_NO_NAME, name, player.getUniqueId().toString()), new RuntimeException());
}
}
}
@@ -190,7 +188,7 @@ public class Economy {
try {
setMoney(name, BigDecimal.valueOf(balance));
} catch (final ArithmeticException e) {
LOGGER.log(Level.WARNING, "Failed to set balance of " + name + " to " + balance + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to set balance of " + name + " to " + balance + ": " + e.getMessage(), e);
}
}
@@ -268,7 +266,7 @@ public class Economy {
try {
add(name, BigDecimal.valueOf(amount));
} catch (final ArithmeticException e) {
LOGGER.log(Level.WARNING, "Failed to add " + amount + " to balance of " + name + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to add " + amount + " to balance of " + name + ": " + e.getMessage(), e);
}
}
@@ -340,7 +338,7 @@ public class Economy {
try {
substract(name, BigDecimal.valueOf(amount));
} catch (final ArithmeticException e) {
LOGGER.log(Level.WARNING, "Failed to subtract " + amount + " of balance of " + name + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to subtract " + amount + " of balance of " + name + ": " + e.getMessage(), e);
}
}
@@ -410,7 +408,7 @@ public class Economy {
try {
divide(name, BigDecimal.valueOf(amount));
} catch (final ArithmeticException e) {
LOGGER.log(Level.WARNING, "Failed to divide balance of " + name + " by " + amount + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to divide balance of " + name + " by " + amount + ": " + e.getMessage(), e);
}
}
@@ -482,7 +480,7 @@ public class Economy {
try {
multiply(name, BigDecimal.valueOf(amount));
} catch (final ArithmeticException e) {
LOGGER.log(Level.WARNING, "Failed to multiply balance of " + name + " by " + amount + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to multiply balance of " + name + " by " + amount + ": " + e.getMessage(), e);
}
}
@@ -603,7 +601,7 @@ public class Economy {
try {
return hasEnough(name, BigDecimal.valueOf(amount));
} catch (final ArithmeticException e) {
LOGGER.log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
return false;
}
}
@@ -664,7 +662,7 @@ public class Economy {
try {
return hasMore(name, BigDecimal.valueOf(amount));
} catch (final ArithmeticException e) {
LOGGER.log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
return false;
}
}
@@ -726,7 +724,7 @@ public class Economy {
try {
return hasLess(name, BigDecimal.valueOf(amount));
} catch (final ArithmeticException e) {
LOGGER.log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to compare balance of " + name + " with " + amount + ": " + e.getMessage(), e);
return false;
}
}
@@ -833,7 +831,7 @@ public class Economy {
try {
return format(BigDecimal.valueOf(amount));
} catch (final NumberFormatException e) {
LOGGER.log(Level.WARNING, "Failed to display " + amount + ": " + e.getMessage(), e);
ess.getLogger().log(Level.WARNING, "Failed to display " + amount + ": " + e.getMessage(), e);
return "NaN";
}
}
@@ -900,7 +898,7 @@ public class Economy {
createNPCFile(name);
return true;
}
LOGGER.log(Level.WARNING, MessageFormat.format(WARN_EXISTING_NPC_CREATE, name, user.getConfigUUID()), new RuntimeException());
ess.getLogger().log(Level.WARNING, MessageFormat.format(WARN_EXISTING_NPC_CREATE, name, user.getConfigUUID()), new RuntimeException());
return false;
}
@@ -32,7 +32,7 @@ public class Commandbigtree extends EssentialsCommand {
throw new NotEnoughArgumentsException();
}
final Location loc = LocationUtil.getTarget(user.getBase()).add(0, 1, 0);
final Location loc = LocationUtil.getTarget(user.getBase(), ess.getSettings().getMaxTreeCommandRange()).add(0, 1, 0);
if (loc.getBlock().getType().isSolid()) {
throw new Exception(tl("bigTreeFailure"));
}
@@ -130,7 +130,7 @@ public class Commandclearinventory extends EssentialsCommand {
} else {
for (final Item item : items) {
final ItemStack stack = new ItemStack(item.getMaterial());
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
if (VersionUtil.PRE_FLATTENING) {
stack.setDurability(item.getData());
}
// amount -1 means all items will be cleared
@@ -4,6 +4,7 @@ import com.earth2me.essentials.ChargeException;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.Trade.OverflowType;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.api.MaxMoneyException;
import org.bukkit.Material;
import org.bukkit.Server;
@@ -161,8 +162,7 @@ public class Commandcondense extends EssentialsCommand {
iter.remove();
continue;
}
if (inputSlot.getDurability() == Short.MAX_VALUE) {
if (VersionUtil.PRE_FLATTENING && inputSlot.getDurability() == Short.MAX_VALUE) {
inputSlot.setDurability((short) 0);
}
if (!inputSlot.isSimilar(stack)) {
@@ -6,6 +6,7 @@ import com.earth2me.essentials.User;
import com.earth2me.essentials.UserMap;
import com.earth2me.essentials.economy.EconomyLayer;
import com.earth2me.essentials.economy.EconomyLayers;
import com.earth2me.essentials.utils.CommandMapUtil;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.FloatUtil;
@@ -25,6 +26,7 @@ import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
@@ -42,6 +44,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -76,7 +79,12 @@ public class Commandessentials extends EssentialsCommand {
"PermissionsEx", // permissions (unsupported)
"GroupManager", // permissions (unsupported)
"bPermissions", // permissions (unsupported)
"DiscordSRV" // potential for issues if EssentialsXDiscord is installed
"DiscordSRV", // potential for issues if EssentialsXDiscord is installed
// Chat signing bypass plugins that can potentially break EssentialsChat
"AntiPopup",
"NoChatReports",
"NoEncryption"
);
private static final List<String> officialPlugins = Arrays.asList(
"EssentialsAntiBuild",
@@ -90,7 +98,11 @@ public class Commandessentials extends EssentialsCommand {
private static final List<String> warnPlugins = Arrays.asList(
"PermissionsEx",
"GroupManager",
"bPermissions"
"bPermissions",
// Brain-dead chat signing bypass that break EssentialsChat
"NoChatReports",
"NoEncryption"
);
private transient TuneRunnable currentTune = null;
@@ -258,6 +270,10 @@ public class Commandessentials extends EssentialsCommand {
files.add(new PasteUtil.PasteFile("dump.json", dump.toString()));
final Plugin essDiscord = Bukkit.getPluginManager().getPlugin("EssentialsDiscord");
final Plugin essSpawn = Bukkit.getPluginManager().getPlugin("EssentialsSpawn");
final Map<String, Command> knownCommandsCopy = new HashMap<>(ess.getKnownCommandsProvider().getKnownCommands());
final Map<String, String> disabledCommandsCopy = new HashMap<>(ess.getAlternativeCommandsHandler().disabledCommands());
// Further operations will be heavy IO
ess.runTaskAsynchronously(() -> {
@@ -265,12 +281,20 @@ public class Commandessentials extends EssentialsCommand {
boolean discord = false;
boolean kits = false;
boolean log = false;
boolean worth = false;
boolean tpr = false;
boolean spawns = false;
boolean commands = false;
for (final String arg : args) {
if (arg.equals("*") || arg.equalsIgnoreCase("all")) {
config = true;
discord = true;
kits = true;
log = true;
worth = true;
tpr = true;
spawns = true;
commands = true;
break;
} else if (arg.equalsIgnoreCase("config")) {
config = true;
@@ -280,6 +304,14 @@ public class Commandessentials extends EssentialsCommand {
kits = true;
} else if (arg.equalsIgnoreCase("log")) {
log = true;
} else if (arg.equalsIgnoreCase("worth")) {
worth = true;
} else if (arg.equalsIgnoreCase("tpr")) {
tpr = true;
} else if (arg.equalsIgnoreCase("spawns")) {
spawns = true;
} else if (arg.equalsIgnoreCase("commands")) {
commands = true;
}
}
@@ -319,6 +351,40 @@ public class Commandessentials extends EssentialsCommand {
}
}
if (worth) {
try {
files.add(new PasteUtil.PasteFile("worth.yml", new String(Files.readAllBytes(ess.getWorth().getFile().toPath()), StandardCharsets.UTF_8)));
} catch (IOException e) {
sender.sendMessage(tl("dumpErrorUpload", "worth.yml", e.getMessage()));
}
}
if (tpr) {
try {
files.add(new PasteUtil.PasteFile("tpr.yml", new String(Files.readAllBytes(ess.getRandomTeleport().getFile().toPath()), StandardCharsets.UTF_8)));
} catch (IOException e) {
sender.sendMessage(tl("dumpErrorUpload", "tpr.yml", e.getMessage()));
}
}
if (spawns && essSpawn != null) {
try {
files.add(new PasteUtil.PasteFile("spawn.yml", new String(Files.readAllBytes(ess.getDataFolder().toPath().resolve("spawn.yml")), StandardCharsets.UTF_8)));
} catch (IOException e) {
sender.sendMessage(tl("dumpErrorUpload", "spawn.yml", e.getMessage()));
}
}
if (commands) {
try {
files.add(new PasteUtil.PasteFile("commands.yml", new String(Files.readAllBytes(Paths.get("commands.yml")), StandardCharsets.UTF_8)));
files.add(new PasteUtil.PasteFile("commandmap.json", CommandMapUtil.toJsonPretty(ess, knownCommandsCopy)));
files.add(new PasteUtil.PasteFile("commandoverride.json", disabledCommandsCopy.toString()));
} catch (IOException e) {
sender.sendMessage(tl("dumpErrorUpload", "commands.yml", e.getMessage()));
}
}
final CompletableFuture<PasteUtil.PasteResult> future = PasteUtil.createPaste(files);
future.thenAccept(result -> {
if (result != null) {
@@ -375,7 +441,7 @@ public class Commandessentials extends EssentialsCommand {
private void runMoo(final Server server, final CommandSource sender, final String command, final String[] args) {
if (args.length == 2 && args[1].equals("moo")) {
for (final String s : CONSOLE_MOO) {
logger.info(s);
ess.getLogger().info(s);
}
for (final Player player : ess.getOnlinePlayers()) {
player.sendMessage(PLAYER_MOO);
@@ -646,6 +712,9 @@ public class Commandessentials extends EssentialsCommand {
case DANGEROUS_FORK:
sender.sendMessage(ChatColor.DARK_RED + tl("serverUnsupportedDangerous"));
break;
case STUPID_PLUGIN:
sender.sendMessage(ChatColor.DARK_RED + tl("serverUnsupportedDumbPlugins"));
break;
case UNSTABLE:
sender.sendMessage(ChatColor.DARK_RED + tl("serverUnsupportedMods"));
break;
@@ -719,7 +788,7 @@ public class Commandessentials extends EssentialsCommand {
}
break;
case "dump":
final List<String> list = Lists.newArrayList("config", "kits", "log", "discord", "all");
final List<String> list = Lists.newArrayList("config", "kits", "log", "discord", "worth", "tpr", "spawns", "commands", "all");
for (String arg : args) {
if (arg.equals("*") || arg.equalsIgnoreCase("all")) {
list.clear();
@@ -3,7 +3,6 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.NumberUtil;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Chunk;
import org.bukkit.Server;
@@ -57,7 +56,7 @@ public class Commandgc extends EssentialsCommand {
tileEntities += chunk.getTileEntities().length;
}
} catch (final java.lang.ClassCastException ex) {
Bukkit.getLogger().log(Level.SEVERE, "Corrupted chunk data on world " + w, ex);
ess.getLogger().log(Level.SEVERE, "Corrupted chunk data on world " + w, ex);
}
sender.sendMessage(tl("gcWorld", worldType, w.getName(), w.getLoadedChunks().length, w.getEntities().size(), tileEntities));
@@ -5,6 +5,7 @@ import com.earth2me.essentials.MetaItemStack;
import com.earth2me.essentials.User;
import com.earth2me.essentials.craftbukkit.InventoryWorkaround;
import com.earth2me.essentials.utils.NumberUtil;
import com.earth2me.essentials.utils.VersionUtil;
import com.google.common.collect.Lists;
import org.bukkit.Material;
import org.bukkit.Server;
@@ -37,7 +38,7 @@ public class Commandgive extends EssentialsLoopCommand {
}
try {
if (args.length > 3 && NumberUtil.isInt(args[2]) && NumberUtil.isInt(args[3])) {
if (args.length > 3 && VersionUtil.PRE_FLATTENING && NumberUtil.isInt(args[2]) && NumberUtil.isInt(args[3])) {
stack.setAmount(Integer.parseInt(args[2]));
stack.setDurability(Short.parseShort(args[3]));
} else if (args.length > 2 && Integer.parseInt(args[2]) > 0) {
@@ -40,7 +40,7 @@ public class Commandice extends EssentialsLoopCommand {
@Override
protected void updatePlayer(Server server, CommandSource sender, User user, String[] args) throws NotEnoughArgumentsException, PlayerExemptException, ChargeException, MaxMoneyException {
freezePlayer(user);
user.sendMessage(tl("iceOther", user.getDisplayName()));
sender.sendMessage(tl("iceOther", user.getDisplayName()));
}
private void freezePlayer(final IUser user) {
@@ -1,6 +1,7 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.StringUtil;
import com.earth2me.essentials.utils.VersionUtil;
import org.bukkit.Material;
@@ -36,7 +37,7 @@ public class Commanditemdb extends EssentialsCommand {
String itemId = "none";
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
if (VersionUtil.PRE_FLATTENING) {
itemId = itemStack.getType().getId() + ":" + itemStack.getDurability();
}
@@ -49,7 +50,7 @@ public class Commanditemdb extends EssentialsCommand {
if (itemHeld && itemStack.getType() != Material.AIR) {
final int maxuses = itemStack.getType().getMaxDurability();
final int durability = (maxuses + 1) - itemStack.getDurability();
final int durability = (maxuses + 1) - MaterialUtil.getDamage(itemStack);
if (maxuses != 0) {
sender.sendMessage(tl("durability", Integer.toString(durability)));
}
@@ -3,7 +3,6 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User;
import com.google.common.collect.Lists;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.World;
@@ -109,7 +108,7 @@ public class Commandnear extends EssentialsCommand {
if (nearbyPlayer == null) {
continue;
}
output.append(nearbyPlayer.getDisplayName()).append(ChatColor.WHITE + "(" + ChatColor.RED).append((long) nearbyPlayer.getLocation().distance(loc)).append("m" + ChatColor.WHITE + ")");
output.append(tl("nearbyPlayersList", nearbyPlayer.getDisplayName(), (long)nearbyPlayer.getLocation().distance(loc)));
}
return output.length() > 1 ? output.toString() : tl("none");
@@ -24,9 +24,6 @@ public class Commandnick extends EssentialsLoopCommand {
if (args.length < 1) {
throw new NotEnoughArgumentsException();
}
if (!ess.getSettings().changeDisplayName()) {
throw new Exception(tl("nickDisplayName"));
}
if (args.length > 1 && user.isAuthorized("essentials.nick.others")) {
loopOfflinePlayers(server, user.getSource(), false, true, args[0], formatNickname(user, args[1]).split(" "));
@@ -41,9 +38,6 @@ public class Commandnick extends EssentialsLoopCommand {
if (args.length < 2) {
throw new NotEnoughArgumentsException();
}
if (!ess.getSettings().changeDisplayName()) {
throw new Exception(tl("nickDisplayName"));
}
loopOfflinePlayers(server, sender, false, true, args[0], formatNickname(null, args[1]).split(" "));
sender.sendMessage(tl("nickChanged"));
}
@@ -59,12 +53,12 @@ public class Commandnick extends EssentialsLoopCommand {
if (!target.getDisplayName().equalsIgnoreCase(target.getDisplayName())) {
target.sendMessage(tl("nickNoMore"));
}
target.sendMessage(tl("nickSet", target.getDisplayName()));
target.sendMessage(tl("nickSet", ess.getSettings().changeDisplayName() ? target.getDisplayName() : nick));
} else if (nickInUse(target, nick)) {
throw new NotEnoughArgumentsException(tl("nickInUse"));
} else {
setNickname(server, sender, target, nick);
target.sendMessage(tl("nickSet", target.getDisplayName()));
target.sendMessage(tl("nickSet", ess.getSettings().changeDisplayName() ? target.getDisplayName() : nick));
}
}
@@ -76,7 +70,7 @@ public class Commandnick extends EssentialsLoopCommand {
throw new Exception(tl("nickTooLong"));
} else if (FormatUtil.stripFormat(newNick).length() < 1) {
throw new Exception(tl("nickNamesAlpha"));
} else if (user != null && user.isAuthorized("essentials.nick.changecolors") && !user.isAuthorized("essentials.nick.changecolors.bypass") && !FormatUtil.stripFormat(newNick).equals(user.getName())) {
} else if (user != null && user.isAuthorized("essentials.nick.changecolors") && !user.isAuthorized("essentials.nick.changecolors.bypass") && !FormatUtil.stripFormat(newNick).equals(user.getName()) && !nick.equalsIgnoreCase("off")) {
throw new Exception(tl("nickNamesOnlyColorChanges"));
} else if (user != null && !user.isAuthorized("essentials.nick.blacklist.bypass") && isNickBanned(newNick)) {
throw new Exception(tl("nickNameBlacklist", nick));
@@ -1,6 +1,7 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.VersionUtil;
@@ -39,9 +40,12 @@ public class Commandplaytime extends EssentialsCommand {
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_15_2_R01)) {
throw e;
}
final IUser user = getPlayer(server, sender, args, 0, true);
displayName = user.getName();
final User user = getPlayer(server, args, 0, true, true);
displayName = user.getName(); // Vanished players will have their name as their display name
playtime = Bukkit.getOfflinePlayer(user.getBase().getUniqueId()).getStatistic(PLAY_ONE_TICK);
if (user.getBase().isOnline() && user.isVanished()) {
playtime = playtime - ((System.currentTimeMillis() - user.getLastVanishTime()) / 50L);
}
}
key = "playtimeOther";
} else if (sender.isPlayer()) {
@@ -117,7 +117,7 @@ public class Commandrecipe extends EssentialsCommand {
if (item == null) {
continue;
}
if (item.getDurability() == Short.MAX_VALUE) {
if (VersionUtil.PRE_FLATTENING && item.getDurability() == Short.MAX_VALUE) {
item.setDurability((short) 0);
}
view.getTopInventory().setItem(j * 3 + k + 1, item);
@@ -159,7 +159,7 @@ public class Commandrecipe extends EssentialsCommand {
final InventoryView view = user.getBase().openWorkbench(null, true);
for (int i = 0; i < ingredients.size(); i++) {
final ItemStack item = ingredients.get(i);
if (item.getDurability() == Short.MAX_VALUE) {
if (VersionUtil.PRE_FLATTENING && item.getDurability() == Short.MAX_VALUE) {
item.setDurability((short) 0);
}
view.setItem(i + 1, item);
@@ -3,6 +3,7 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.ChargeException;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.StringUtil;
import com.earth2me.essentials.utils.VersionUtil;
import com.google.common.collect.Lists;
@@ -39,7 +40,7 @@ public class Commandrepair extends EssentialsCommand {
public void repairHand(final User user) throws Exception {
final ItemStack item = user.getItemInHand();
if (item == null || item.getType().isBlock() || item.getDurability() == 0) {
if (item == null || item.getType().isBlock() || MaterialUtil.getDamage(item) == 0) {
throw new Exception(tl("repairInvalidType"));
}
@@ -81,16 +82,16 @@ public class Commandrepair extends EssentialsCommand {
throw new Exception(tl("repairInvalidType"));
}
if (item.getDurability() == 0) {
if (MaterialUtil.getDamage(item) == 0) {
throw new Exception(tl("repairAlreadyFixed"));
}
item.setDurability((short) 0);
MaterialUtil.setDamage(item, 0);
}
private void repairItems(final ItemStack[] items, final IUser user, final List<String> repaired) throws Exception {
private void repairItems(final ItemStack[] items, final IUser user, final List<String> repaired) {
for (final ItemStack item : items) {
if (item == null || item.getType().isBlock() || item.getDurability() == 0) {
if (item == null || item.getType().isBlock() || MaterialUtil.getDamage(item) == 0) {
continue;
}
@@ -123,7 +124,7 @@ public class Commandrepair extends EssentialsCommand {
private Trade getCharge(final Material material) {
final String itemName = material.toString().toLowerCase(Locale.ENGLISH);
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
if (VersionUtil.PRE_FLATTENING) {
final int itemId = material.getId();
return new Trade("repair-" + itemName.replace('_', '-'), new Trade("repair-" + itemId, new Trade("repair-item", ess), ess), ess);
} else {
@@ -19,7 +19,7 @@ public class Commandrest extends EssentialsLoopCommand {
@Override
public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception {
if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) {
if (VersionUtil.PRE_FLATTENING) {
sender.sendMessage(tl("unsupportedFeature"));
return;
}
@@ -117,7 +117,7 @@ public class Commandsell extends EssentialsCommand {
Trade.log("Command", "Sell", "Item", user.getName(), new Trade(ris, ess), user.getName(), new Trade(result, ess), user.getLocation(), user.getMoney(), ess);
user.giveMoney(result, null, UserBalanceUpdateEvent.Cause.COMMAND_SELL);
user.sendMessage(tl("itemSold", NumberUtil.displayCurrency(result, ess), amount, is.getType().toString().toLowerCase(Locale.ENGLISH), NumberUtil.displayCurrency(worth, ess)));
logger.log(Level.INFO, tl("itemSoldConsole", user.getName(), is.getType().toString().toLowerCase(Locale.ENGLISH), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess), user.getDisplayName()));
ess.getLogger().log(Level.INFO, tl("itemSoldConsole", user.getName(), is.getType().toString().toLowerCase(Locale.ENGLISH), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess), user.getDisplayName()));
return result;
}
@@ -42,7 +42,7 @@ public class Commandskull extends EssentialsCommand {
final SkullMeta metaSkull;
boolean spawn = false;
if (itemSkull != null && MaterialUtil.isPlayerHead(itemSkull.getType(), itemSkull.getDurability())) {
if (itemSkull != null && MaterialUtil.isPlayerHead(itemSkull)) {
metaSkull = (SkullMeta) itemSkull.getItemMeta();
} else if (user.isAuthorized("essentials.skull.spawn")) {
itemSkull = new ItemStack(SKULL_ITEM, 1, (byte) 3);
@@ -55,7 +55,7 @@ public class Commandtpa extends EssentialsCommand {
user.sendMessage(tl("requestAcceptedFromAuto", player.getDisplayName()));
}
});
return;
throw new NoChargeException();
}
if (!player.isIgnoredPlayer(user)) {
@@ -99,7 +99,7 @@ public class Commandtpaccept extends EssentialsCommand {
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
if (ess.getSettings().isDebug()) {
logger.info("TPA accept cancelled by API for " + user.getName() + " (requested by " + requester.getName() + ")");
ess.getLogger().info("TPA accept cancelled by API for " + user.getName() + " (requested by " + requester.getName() + ")");
}
return;
}
@@ -84,7 +84,7 @@ public class Commandtpdeny extends EssentialsCommand {
Bukkit.getPluginManager().callEvent(event);
final boolean cancelled = event.isCancelled();
if (cancelled && ess.getSettings().isDebug()) {
logger.info("TPA deny cancelled by API for " + user.getName() + " (requested by " + player.getName() + ")");
ess.getLogger().info("TPA deny cancelled by API for " + user.getName() + " (requested by " + player.getName() + ")");
}
return event.isCancelled();
}
@@ -26,9 +26,9 @@ public class Commandtppos extends EssentialsCommand {
throw new NotEnoughArgumentsException();
}
final double x = args[0].startsWith("~") ? user.getLocation().getX() + (args[0].length() > 1 ? Integer.parseInt(args[0].substring(1)) : 0) : Integer.parseInt(args[0]);
final double y = args[1].startsWith("~") ? user.getLocation().getY() + (args[1].length() > 1 ? Integer.parseInt(args[1].substring(1)) : 0) : Integer.parseInt(args[1]);
final double z = args[2].startsWith("~") ? user.getLocation().getZ() + (args[2].length() > 1 ? Integer.parseInt(args[2].substring(1)) : 0) : Integer.parseInt(args[2]);
final double x = args[0].startsWith("~") ? user.getLocation().getX() + (args[0].length() > 1 ? Double.parseDouble(args[0].substring(1)) : 0) : Double.parseDouble(args[0]);
final double y = args[1].startsWith("~") ? user.getLocation().getY() + (args[1].length() > 1 ? Double.parseDouble(args[1].substring(1)) : 0) : Double.parseDouble(args[1]);
final double z = args[2].startsWith("~") ? user.getLocation().getZ() + (args[2].length() > 1 ? Double.parseDouble(args[2].substring(1)) : 0) : Double.parseDouble(args[2]);
final Location loc = new Location(user.getWorld(), x, y, z, user.getLocation().getYaw(), user.getLocation().getPitch());
if (args.length == 4) {
final World w = ess.getWorld(args[3]);
@@ -38,7 +38,7 @@ public class Commandtree extends EssentialsCommand {
}
}
final Location loc = LocationUtil.getTarget(user.getBase()).add(0, 1, 0);
final Location loc = LocationUtil.getTarget(user.getBase(), ess.getSettings().getMaxTreeCommandRange()).add(0, 1, 0);
if (loc.getBlock().getType().isSolid()) {
throw new Exception(tl("treeFailure"));
}
@@ -2,6 +2,7 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.NumberUtil;
import com.google.common.collect.Lists;
import org.bukkit.Server;
@@ -87,7 +88,7 @@ public class Commandworth extends EssentialsCommand {
}
final BigDecimal result = worth.multiply(BigDecimal.valueOf(amount));
sender.sendMessage(is.getDurability() != 0 ? tl("worthMeta", is.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), is.getDurability(), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess)) : tl("worth", is.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess)));
sender.sendMessage(MaterialUtil.getDamage(is) != 0 ? tl("worthMeta", is.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), MaterialUtil.getDamage(is), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess)) : tl("worth", is.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess)));
return result;
}
@@ -26,14 +26,12 @@ import java.util.Map;
import java.util.MissingResourceException;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.earth2me.essentials.I18n.tl;
public abstract class EssentialsCommand implements IEssentialsCommand {
protected static final Logger logger = Logger.getLogger("Essentials");
/**
* Common time durations (in seconds), for use in tab completion.
*/
@@ -334,7 +332,7 @@ public abstract class EssentialsCommand implements IEssentialsCommand {
public void showError(final CommandSender sender, final Throwable throwable, final String commandLabel) {
sender.sendMessage(tl("errorWithMessage", throwable.getMessage()));
if (ess.getSettings().isDebug()) {
logger.log(Level.INFO, tl("errorCallingCommand", commandLabel), throwable);
ess.getLogger().log(Level.INFO, tl("errorCallingCommand", commandLabel), throwable);
throwable.printStackTrace();
}
}
@@ -1,5 +1,6 @@
package com.earth2me.essentials.config;
import com.earth2me.essentials.Essentials;
import org.spongepowered.configurate.CommentedConfigurationNode;
import org.spongepowered.configurate.ConfigurateException;
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
@@ -7,8 +8,6 @@ import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import static com.earth2me.essentials.config.EssentialsConfiguration.LOGGER;
public class ConfigurationSaveTask implements Runnable {
private final YamlConfigurationLoader loader;
private final CommentedConfigurationNode node;
@@ -32,7 +31,7 @@ public class ConfigurationSaveTask implements Runnable {
try {
loader.save(node);
} catch (ConfigurateException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
Essentials.getWrappedLogger().log(Level.SEVERE, e.getMessage(), e);
} finally {
pendingWrites.decrementAndGet();
}
@@ -1,5 +1,6 @@
package com.earth2me.essentials.config;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.config.annotations.DeleteIfIncomplete;
import com.earth2me.essentials.config.annotations.DeleteOnEmpty;
import com.earth2me.essentials.config.entities.CommandCooldown;
@@ -44,12 +45,10 @@ import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class EssentialsConfiguration {
protected static final Logger LOGGER = Logger.getLogger("Essentials");
private static final ExecutorService EXECUTOR_SERVICE = Executors.newSingleThreadExecutor();
private static final ObjectMapper.Factory MAPPER_FACTORY = ObjectMapper.factoryBuilder()
.addProcessor(DeleteOnEmpty.class, (data, value) -> new DeleteOnEmptyProcessor())
@@ -133,7 +132,7 @@ public class EssentialsConfiguration {
try {
result.put(entry.getKey().toLowerCase(Locale.ENGLISH), jailNode.get(LazyLocation.class));
} catch (SerializationException e) {
LOGGER.log(Level.WARNING, "Error serializing key " + entry.getKey(), e);
Essentials.getWrappedLogger().log(Level.WARNING, "Error serializing key " + entry.getKey(), e);
}
}
return result;
@@ -147,7 +146,7 @@ public class EssentialsConfiguration {
try {
toSplitRoot(path, configurationNode).set(type, list);
} catch (SerializationException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
Essentials.getWrappedLogger().log(Level.SEVERE, e.getMessage(), e);
}
}
@@ -163,7 +162,7 @@ public class EssentialsConfiguration {
}
return list;
} catch (SerializationException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
Essentials.getWrappedLogger().log(Level.SEVERE, e.getMessage(), e);
return new ArrayList<>();
}
}
@@ -301,7 +300,7 @@ public class EssentialsConfiguration {
try {
node.set(null);
} catch (SerializationException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
Essentials.getWrappedLogger().log(Level.SEVERE, e.getMessage(), e);
}
}
}
@@ -310,7 +309,7 @@ public class EssentialsConfiguration {
try {
toSplitRoot(path, configurationNode).set(value);
} catch (SerializationException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
Essentials.getWrappedLogger().log(Level.SEVERE, e.getMessage(), e);
}
}
@@ -336,13 +335,13 @@ public class EssentialsConfiguration {
public synchronized void load() {
if (pendingWrites.get() != 0) {
LOGGER.log(Level.INFO, "Parsing config file {0} has been aborted due to {1} current pending write(s).", new Object[]{configFile, pendingWrites.get()});
Essentials.getWrappedLogger().log(Level.INFO, "Parsing config file {0} has been aborted due to {1} current pending write(s).", new Object[]{configFile, pendingWrites.get()});
return;
}
if (configFile.getParentFile() != null && !configFile.getParentFile().exists()) {
if (!configFile.getParentFile().mkdirs()) {
LOGGER.log(Level.SEVERE, tl("failedToCreateConfig", configFile.toString()));
Essentials.getWrappedLogger().log(Level.SEVERE, tl("failedToCreateConfig", configFile.toString()));
return;
}
}
@@ -354,10 +353,10 @@ public class EssentialsConfiguration {
convertAltFile();
} else if (templateName != null) {
try (final InputStream is = resourceClass.getResourceAsStream(templateName)) {
LOGGER.log(Level.INFO, tl("creatingConfigFromTemplate", configFile.toString()));
Essentials.getWrappedLogger().log(Level.INFO, tl("creatingConfigFromTemplate", configFile.toString()));
Files.copy(is, configFile.toPath());
} catch (IOException e) {
LOGGER.log(Level.SEVERE, tl("failedToWriteConfig", configFile.toString()), e);
Essentials.getWrappedLogger().log(Level.SEVERE, tl("failedToWriteConfig", configFile.toString()), e);
}
}
}
@@ -367,12 +366,12 @@ public class EssentialsConfiguration {
} catch (final ParsingException e) {
final File broken = new File(configFile.getAbsolutePath() + ".broken." + System.currentTimeMillis());
if (configFile.renameTo(broken)) {
LOGGER.log(Level.SEVERE, "The file " + configFile.toString() + " is broken, it has been renamed to " + broken.toString(), e.getCause());
Essentials.getWrappedLogger().log(Level.SEVERE, "The file " + configFile.toString() + " is broken, it has been renamed to " + broken.toString(), e.getCause());
return;
}
LOGGER.log(Level.SEVERE, "The file " + configFile.toString() + " is broken. A backup file has failed to be created", e.getCause());
Essentials.getWrappedLogger().log(Level.SEVERE, "The file " + configFile.toString() + " is broken. A backup file has failed to be created", e.getCause());
} catch (final ConfigurateException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
Essentials.getWrappedLogger().log(Level.SEVERE, e.getMessage(), e);
} finally {
// Something is wrong! We need a node! I hope the backup worked!
if (configurationNode == null) {
@@ -435,7 +434,7 @@ public class EssentialsConfiguration {
try {
delaySave().get();
} catch (final InterruptedException | ExecutionException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
Essentials.getWrappedLogger().log(Level.SEVERE, e.getMessage(), e);
}
}
@@ -1,5 +1,6 @@
package com.earth2me.essentials.config;
import com.earth2me.essentials.Essentials;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
@@ -43,7 +44,7 @@ public class EssentialsUserConfiguration extends EssentialsConfiguration {
//noinspection UnstableApiUsage
Files.move(file, new File(configFile.getParentFile(), uuid + ".yml"));
} catch (final IOException ex) {
LOGGER.log(Level.WARNING, "Failed to migrate user: " + username, ex);
Essentials.getWrappedLogger().log(Level.WARNING, "Failed to migrate user: " + username, ex);
}
setProperty("last-account-name", username);
@@ -68,7 +69,7 @@ public class EssentialsUserConfiguration extends EssentialsConfiguration {
//noinspection UnstableApiUsage
Files.move(getAltFile(), new File(configFile.getParentFile(), uuid + ".yml"));
} catch (final IOException ex) {
LOGGER.log(Level.WARNING, "Failed to migrate user: " + username, ex);
Essentials.getWrappedLogger().log(Level.WARNING, "Failed to migrate user: " + username, ex);
}
}
}
@@ -322,6 +322,16 @@ public class UserConfigHolder {
this.baltopExempt = value;
}
private @MonotonicNonNull Boolean shouting;
public Boolean shouting() {
return shouting;
}
public void shouting(final Boolean value) {
this.shouting = value;
}
private @NonNull Timestamps timestamps = new Timestamps();
public Timestamps timestamps() {
@@ -1,5 +1,6 @@
package com.earth2me.essentials.craftbukkit;
import com.earth2me.essentials.utils.VersionUtil;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@@ -15,15 +16,13 @@ import java.util.Map;
/*
* This class can be removed when https://github.com/Bukkit/CraftBukkit/pull/193 is accepted to CraftBukkit
*/
public final class InventoryWorkaround {
/*
Spigot 1.9, for whatever reason, decided to merge the armor and main player inventories without providing a way
to access the main inventory. There's lots of ugly code in here to work around that.
*/
private static final int USABLE_PLAYER_INV_SIZE = 36;
// Hot-ish code so cache
private static Boolean hasMainHandSupport = null;
private static final boolean IS_OFFHAND = VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_9_R01);
private InventoryWorkaround() {
}
@@ -201,87 +200,45 @@ public final class InventoryWorkaround {
@SuppressWarnings("deprecation")
public static void setItemInMainHand(final Player p, final ItemStack item) {
if (hasMainHandSupport == null) {
try {
p.getInventory().setItemInMainHand(item);
hasMainHandSupport = true;
} catch (final Throwable e) {
p.setItemInHand(item);
hasMainHandSupport = false;
}
if (IS_OFFHAND) {
p.getInventory().setItemInMainHand(item);
} else {
if (hasMainHandSupport) {
p.getInventory().setItemInMainHand(item);
} else {
p.setItemInHand(item);
}
p.setItemInHand(item);
}
}
@SuppressWarnings("deprecation")
public static void setItemInMainHand(final EntityEquipment invent, final ItemStack item) {
if (hasMainHandSupport == null) {
try {
invent.setItemInMainHand(item);
hasMainHandSupport = true;
} catch (final Throwable e) {
invent.setItemInHand(item);
hasMainHandSupport = false;
}
if (IS_OFFHAND) {
invent.setItemInMainHand(item);
} else {
if (hasMainHandSupport) {
invent.setItemInMainHand(item);
} else {
invent.setItemInHand(item);
}
invent.setItemInHand(item);
}
}
@SuppressWarnings("deprecation")
public static void setItemInMainHandDropChance(final EntityEquipment invent, final float chance) {
if (hasMainHandSupport == null) {
try {
invent.setItemInMainHandDropChance(chance);
hasMainHandSupport = true;
} catch (final Throwable e) {
invent.setItemInHandDropChance(chance);
hasMainHandSupport = false;
}
if (IS_OFFHAND) {
invent.setItemInMainHandDropChance(chance);
} else {
if (hasMainHandSupport) {
invent.setItemInMainHandDropChance(chance);
} else {
invent.setItemInHandDropChance(chance);
}
invent.setItemInHandDropChance(chance);
}
}
public static void setItemInOffHand(final Player p, final ItemStack item) {
// This assumes that all builds that support a main hand also support an off hand.
if (hasMainHandSupport == null || hasMainHandSupport) {
try {
p.getInventory().setItemInOffHand(item);
hasMainHandSupport = true;
} catch (final Throwable e) {
hasMainHandSupport = false;
}
if (IS_OFFHAND) {
p.getInventory().setItemInOffHand(item);
}
}
public static int clearItemInOffHand(final Player p, final ItemStack item) {
// This should be added because if `/clear` itself is not initilized it will return an Error: null.
if (hasMainHandSupport == null || hasMainHandSupport) {
try {
int removedAmount = 0;
if (p.getInventory().getItemInOffHand().getType().equals(item.getType())) {
removedAmount = p.getInventory().getItemInOffHand().getAmount();
p.getInventory().setItemInOffHand(null);
}
hasMainHandSupport = true;
return removedAmount;
} catch (final Throwable e) {
hasMainHandSupport = false;
if (IS_OFFHAND) {
int removedAmount = 0;
if (p.getInventory().getItemInOffHand().getType().equals(item.getType())) {
removedAmount = p.getInventory().getItemInOffHand().getAmount();
p.getInventory().setItemInOffHand(null);
}
return removedAmount;
}
return 0;
}
@@ -19,7 +19,6 @@ import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A goddamn Vault adapter, what more do you want?
@@ -29,7 +28,6 @@ import java.util.logging.Logger;
* {@link com.earth2me.essentials.User}.
*/
public class VaultEconomyProvider implements Economy {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private static final String WARN_NPC_RECREATE_1 = "Account creation was requested for NPC user {0}, but an account file with UUID {1} already exists.";
private static final String WARN_NPC_RECREATE_2 = "Essentials will create a new account as requested by the other plugin, but this is almost certainly a bug and should be reported.";
@@ -301,8 +299,8 @@ public class VaultEconomyProvider implements Economy {
}
final File npcFile = new File(folder, player.getUniqueId() + ".yml");
if (npcFile.exists()) {
LOGGER.log(Level.SEVERE, MessageFormat.format(WARN_NPC_RECREATE_1, player.getName(), player.getUniqueId().toString()), new RuntimeException());
LOGGER.log(Level.SEVERE, WARN_NPC_RECREATE_2);
ess.getLogger().log(Level.SEVERE, MessageFormat.format(WARN_NPC_RECREATE_1, player.getName(), player.getUniqueId().toString()), new RuntimeException());
ess.getLogger().log(Level.SEVERE, WARN_NPC_RECREATE_2);
}
final EssentialsUserConfiguration npcConfig = new EssentialsUserConfiguration(player.getName(), player.getUniqueId(), npcFile);
npcConfig.load();
@@ -317,7 +315,7 @@ public class VaultEconomyProvider implements Economy {
// Loading a v4 UUID that we somehow didn't track, mark it as a normal player and hope for the best, vault sucks :/
try {
if (ess.getSettings().isDebug()) {
LOGGER.info("Vault requested a player account creation for a v4 UUID: " + player);
ess.getLogger().info("Vault requested a player account creation for a v4 UUID: " + player);
}
ess.getUserMap().load(player);
return true;
@@ -23,6 +23,7 @@ import org.bukkit.inventory.meta.FireworkEffectMeta;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.plugin.Plugin;
import org.bukkit.potion.Potion;
@@ -279,12 +280,22 @@ public abstract class AbstractItemDb implements IConf, net.ess3.api.IItemDb {
serializeEffectMeta(sb, fireworkEffectMeta.getEffect());
}
} else if (MaterialUtil.isPotion(material)) {
final Potion potion = Potion.fromDamage(is.getDurability());
for (final PotionEffect e : potion.getEffects()) {
// long but needs to be effect:speed power:2 duration:120 in that order.
sb.append("splash:").append(potion.isSplash()).append(" ").append("effect:").append(e.getType().getName().toLowerCase()).append(" ").append("power:").append(e.getAmplifier()).append(" ").append("duration:").append(e.getDuration() / 20).append(" ");
final boolean splash;
final Collection<PotionEffect> effects;
if (VersionUtil.PRE_FLATTENING) {
final Potion potion = Potion.fromDamage(is.getDurability());
splash = potion.isSplash();
effects = potion.getEffects();
} else {
splash = is.getType() == Material.SPLASH_POTION;
effects = ((PotionMeta) is.getItemMeta()).getCustomEffects();
}
} else if (MaterialUtil.isPlayerHead(material, is.getData().getData())) {
for (final PotionEffect e : effects) {
// long but needs to be effect:speed power:2 duration:120 in that order.
sb.append("splash:").append(splash).append(" ").append("effect:").append(e.getType().getName().toLowerCase()).append(" ").append("power:").append(e.getAmplifier()).append(" ").append("duration:").append(e.getDuration() / 20).append(" ");
}
} else if (MaterialUtil.isPlayerHead(is)) {
// item stack with meta
final SkullMeta skullMeta = (SkullMeta) is.getItemMeta();
if (skullMeta != null && skullMeta.hasOwner()) {
@@ -23,13 +23,11 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import static com.earth2me.essentials.I18n.tl;
public class FlatItemDb extends AbstractItemDb {
protected static final Logger LOGGER = Logger.getLogger("Essentials");
private static final Gson gson = new Gson();
// Maps primary name to ItemData
@@ -54,7 +52,7 @@ public class FlatItemDb extends AbstractItemDb {
}
this.rebuild();
LOGGER.info(String.format("Loaded %s items from items.json.", listNames().size()));
ess.getLogger().info(String.format("Loaded %s items from items.json.", listNames().size()));
}
private void rebuild() {
@@ -100,7 +98,7 @@ public class FlatItemDb extends AbstractItemDb {
if (valid) {
allAliases.add(key);
} else {
LOGGER.warning(String.format("Failed to add item: \"%s\": %s", key, element.toString()));
ess.getLogger().warning(String.format("Failed to add item: \"%s\": %s", key, element.toString()));
}
}
}
@@ -115,7 +113,7 @@ public class FlatItemDb extends AbstractItemDb {
}
id = id.toLowerCase();
final String[] split = id.split(":");
final String[] split = id.split("(?<!^minecraft):");
final ItemData data = getByName(split[0]);
@@ -3,9 +3,9 @@ package com.earth2me.essentials.items;
import com.earth2me.essentials.ManagedFile;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.NumberUtil;
import com.earth2me.essentials.utils.StringUtil;
import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.api.IEssentials;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
@@ -17,14 +17,12 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.earth2me.essentials.I18n.tl;
public class LegacyItemDb extends AbstractItemDb {
protected static final Logger LOGGER = Logger.getLogger("Essentials");
private final transient Map<String, Integer> items = new HashMap<>();
private final transient Map<ItemData, List<String>> names = new HashMap<>();
private final transient Map<ItemData, String> primaryName = new HashMap<>();
@@ -68,10 +66,10 @@ public class LegacyItemDb extends AbstractItemDb {
final Matcher matcher = csvSplitPattern.matcher(line);
while (matcher.find()) {
String match = matcher.group(1);
if (StringUtils.stripToNull(match) == null) {
if (StringUtil.stripToNull(match) == null) {
continue;
}
match = StringUtils.strip(match.trim(), "\"");
match = StringUtil.strip(match.trim(), "\"");
switch (col) {
case 0:
itemName = match.toLowerCase(Locale.ENGLISH);
@@ -83,7 +81,7 @@ public class LegacyItemDb extends AbstractItemDb {
data = Short.parseShort(match);
break;
case 3:
nbt = StringUtils.stripToNull(match);
nbt = StringUtil.stripToNull(match);
break;
default:
continue;
@@ -119,7 +117,7 @@ public class LegacyItemDb extends AbstractItemDb {
nameList.sort(LengthCompare.INSTANCE);
}
LOGGER.info(String.format("Loaded %s items from items.csv.", listNames().size()));
ess.getLogger().info(String.format("Loaded %s items from items.csv.", listNames().size()));
ready = true;
}
@@ -1,5 +1,7 @@
package com.earth2me.essentials.perm;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.TriState;
import org.bukkit.entity.Player;
@@ -27,11 +29,11 @@ public interface IPermissionsHandler {
String getSuffix(Player base);
void registerContext(String context, Function<Player, Iterable<String>> calculator, Supplier<Iterable<String>> suggestions);
void registerContext(String context, Function<User, Iterable<String>> calculator, Supplier<Iterable<String>> suggestions);
void unregisterContexts();
String getBackendName();
boolean tryProvider();
boolean tryProvider(Essentials ess);
}
@@ -1,6 +1,7 @@
package com.earth2me.essentials.perm;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User;
import com.earth2me.essentials.perm.impl.AbstractVaultHandler;
import com.earth2me.essentials.perm.impl.ConfigPermissionsHandler;
import com.earth2me.essentials.perm.impl.GenericVaultHandler;
@@ -105,7 +106,7 @@ public class PermissionsHandler implements IPermissionsHandler {
}
@Override
public void registerContext(final String context, final Function<Player, Iterable<String>> calculator, final Supplier<Iterable<String>> suggestions) {
public void registerContext(final String context, final Function<User, Iterable<String>> calculator, final Supplier<Iterable<String>> suggestions) {
handler.registerContext(context, calculator, suggestions);
}
@@ -120,7 +121,7 @@ public class PermissionsHandler implements IPermissionsHandler {
}
@Override
public boolean tryProvider() {
public boolean tryProvider(Essentials ess) {
return true;
}
@@ -135,7 +136,7 @@ public class PermissionsHandler implements IPermissionsHandler {
for (final Class<? extends IPermissionsHandler> providerClass : providerClazz) {
try {
final IPermissionsHandler provider = providerClass.newInstance();
if (provider.tryProvider()) {
if (provider.tryProvider(ess)) {
if (provider.getClass().isInstance(this.handler)) {
return;
}
@@ -170,7 +171,7 @@ public class PermissionsHandler implements IPermissionsHandler {
if (enabledPermsPlugin == null) enabledPermsPlugin = "generic";
ess.getLogger().info("Using Vault based permissions (" + enabledPermsPlugin + ")");
} else if (handler.getClass() == SuperpermsHandler.class) {
if (handler.tryProvider()) {
if (handler.tryProvider(ess)) {
ess.getLogger().warning("Detected supported permissions plugin " +
((SuperpermsHandler) handler).getEnabledPermsPlugin() + " without Vault installed.");
ess.getLogger().warning("Features such as chat prefixes/suffixes and group-related functionality will not " +
@@ -199,11 +200,11 @@ public class PermissionsHandler implements IPermissionsHandler {
}
private void initContexts() {
registerContext("essentials:afk", player -> Collections.singleton(String.valueOf(ess.getUser(player).isAfk())), () -> ImmutableSet.of("true", "false"));
registerContext("essentials:muted", player -> Collections.singleton(String.valueOf(ess.getUser(player).isMuted())), () -> ImmutableSet.of("true", "false"));
registerContext("essentials:vanished", player -> Collections.singleton(String.valueOf(ess.getUser(player).isHidden())), () -> ImmutableSet.of("true", "false"));
registerContext("essentials:jailed", player -> Collections.singleton(String.valueOf(ess.getUser(player).isJailed())), () -> ImmutableSet.of("true", "false"));
registerContext("essentials:jail", player -> Optional.ofNullable(ess.getUser(player).getJail()).map(Arrays::asList).orElse(Collections.emptyList()), () -> {
registerContext("essentials:afk", user -> Collections.singleton(String.valueOf(user.isAfk())), () -> ImmutableSet.of("true", "false"));
registerContext("essentials:muted", user -> Collections.singleton(String.valueOf(user.isMuted())), () -> ImmutableSet.of("true", "false"));
registerContext("essentials:vanished", user -> Collections.singleton(String.valueOf(user.isHidden())), () -> ImmutableSet.of("true", "false"));
registerContext("essentials:jailed", user -> Collections.singleton(String.valueOf(user.isJailed())), () -> ImmutableSet.of("true", "false"));
registerContext("essentials:jail", user -> Optional.ofNullable(user.getJail()).map(Arrays::asList).orElse(Collections.emptyList()), () -> {
try {
return ess.getJails().getList();
} catch (final Exception e) {
@@ -1,5 +1,6 @@
package com.earth2me.essentials.perm.impl;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.utils.TriState;
import net.ess3.api.IEssentials;
import org.bukkit.entity.Player;
@@ -35,7 +36,7 @@ public class ConfigPermissionsHandler extends SuperpermsHandler {
}
@Override
public boolean tryProvider() {
public boolean tryProvider(Essentials ess) {
return true;
}
}
@@ -1,8 +1,10 @@
package com.earth2me.essentials.perm.impl;
import com.earth2me.essentials.Essentials;
public class GenericVaultHandler extends AbstractVaultHandler {
@Override
public boolean tryProvider() {
public boolean tryProvider(Essentials ess) {
return super.canLoad();
}
}
@@ -1,5 +1,8 @@
package com.earth2me.essentials.perm.impl;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.context.ContextCalculator;
import net.luckperms.api.context.ContextConsumer;
@@ -16,40 +19,75 @@ import java.util.function.Supplier;
public class LuckPermsHandler extends ModernVaultHandler {
private LuckPerms luckPerms;
private Set<ContextCalculator<Player>> contextCalculators;
private Essentials ess;
private CombinedCalculator calculator;
@Override
public void registerContext(final String context, final Function<Player, Iterable<String>> calculator, final Supplier<Iterable<String>> suggestions) {
final ContextCalculator<Player> contextCalculator = new ContextCalculator<Player>() {
@Override
public void calculate(final Player target, final ContextConsumer consumer) {
calculator.apply(target).forEach(value -> consumer.accept(context, value));
}
@Override
public ContextSet estimatePotentialContexts() {
final ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
suggestions.get().forEach(value -> builder.add(context, value));
return builder.build();
}
};
luckPerms.getContextManager().registerCalculator(contextCalculator);
contextCalculators.add(contextCalculator);
public void registerContext(final String context, final Function<User, Iterable<String>> calculator, final Supplier<Iterable<String>> suggestions) {
if (this.calculator == null) {
this.calculator = new CombinedCalculator();
this.luckPerms.getContextManager().registerCalculator(this.calculator);
}
this.calculator.calculators.add(new Calculator(context, calculator, suggestions));
}
@Override
public void unregisterContexts() {
contextCalculators.forEach(contextCalculator -> luckPerms.getContextManager().unregisterCalculator(contextCalculator));
contextCalculators.clear();
if (this.calculator != null) {
this.luckPerms.getContextManager().unregisterCalculator(this.calculator);
this.calculator = null;
}
}
@Override
public boolean tryProvider() {
public boolean tryProvider(Essentials ess) {
final RegisteredServiceProvider<LuckPerms> provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class);
if (provider != null) {
luckPerms = provider.getProvider();
contextCalculators = new HashSet<>();
this.luckPerms = provider.getProvider();
this.ess = ess;
}
return luckPerms != null && super.tryProvider(ess);
}
private static final class Calculator {
private final String id;
private final Function<User, Iterable<String>> function;
private final Supplier<Iterable<String>> suggestions;
private Calculator(String id, Function<User, Iterable<String>> function, Supplier<Iterable<String>> suggestions) {
this.id = id;
this.function = function;
this.suggestions = suggestions;
}
}
// By combining all calculators into one, we only need to make one call to ess.getUser().
private class CombinedCalculator implements ContextCalculator<Player> {
private final Set<Calculator> calculators = new HashSet<>();
@Override
public void calculate(final Player target, final ContextConsumer consumer) {
// If the player doesn't exist in the UserMap, just skip
// Ess will cause performance problems for permissions checks if it attempts to
// perform i/o to load the user data otherwise.
if (!ess.getUserMap().userExists(target.getUniqueId())) {
return;
}
final User user = ess.getUser(target);
for (Calculator calculator : this.calculators) {
calculator.function.apply(user).forEach(value -> consumer.accept(calculator.id, value));
}
}
@Override
public ContextSet estimatePotentialContexts() {
final ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
for (Calculator calculator : this.calculators) {
calculator.suggestions.get().forEach(value -> builder.add(calculator.id, value));
}
return builder.build();
}
return luckPerms != null && super.tryProvider();
}
}
@@ -1,5 +1,7 @@
package com.earth2me.essentials.perm.impl;
import com.earth2me.essentials.Essentials;
import org.bukkit.entity.Player;
import java.util.Arrays;
@@ -21,7 +23,7 @@ public class ModernVaultHandler extends AbstractVaultHandler {
}
@Override
public boolean tryProvider() {
public boolean tryProvider(Essentials ess) {
return super.canLoad() && supportedPlugins.contains(getEnabledPermsPlugin());
}
}
@@ -1,5 +1,7 @@
package com.earth2me.essentials.perm.impl;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User;
import com.earth2me.essentials.perm.IPermissionsHandler;
import com.earth2me.essentials.utils.TriState;
import org.bukkit.Bukkit;
@@ -124,7 +126,7 @@ public class SuperpermsHandler implements IPermissionsHandler {
}
@Override
public void registerContext(final String context, final Function<Player, Iterable<String>> calculator, final Supplier<Iterable<String>> suggestions) {
public void registerContext(final String context, final Function<User, Iterable<String>> calculator, final Supplier<Iterable<String>> suggestions) {
}
@Override
@@ -137,7 +139,7 @@ public class SuperpermsHandler implements IPermissionsHandler {
}
@Override
public boolean tryProvider() {
public boolean tryProvider(Essentials ess) {
return getEnabledPermsPlugin() != null;
}
@@ -5,6 +5,7 @@ import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.MetaItemStack;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.FormatUtil;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.NumberUtil;
import net.ess3.api.IEssentials;
@@ -30,6 +31,7 @@ import java.util.Set;
import static com.earth2me.essentials.I18n.tl;
public class EssentialsSign {
private static final String SIGN_OWNER_KEY = "sign-owner";
protected static final BigDecimal MINTRANSACTION = new BigDecimal("0.01");
private static final Set<Material> EMPTY_SET = new HashSet<>();
protected transient final String signName;
@@ -60,15 +62,15 @@ public class EssentialsSign {
}
/**
* @deprecated, use {@link #isValidSign(IEssentials, ISign)} if possible
* @deprecated use {@link #isValidSign(IEssentials, ISign)} if possible
*/
@Deprecated
public static boolean isValidSign(final ISign sign) {
return sign.getLine(0).matches("§1\\[.*\\]");
return sign.getLine(0).matches("§1\\[.*]");
}
public static boolean isValidSign(final IEssentials ess, final ISign sign) {
if (!sign.getLine(0).matches("§1\\[.*\\]"))
if (!sign.getLine(0).matches("§1\\[.*]"))
return false;
// Validate that the sign is actually an essentials sign
@@ -119,6 +121,7 @@ public class EssentialsSign {
} catch (final ChargeException | SignException ex) {
showError(ess, user.getSource(), ex, signName);
}
setOwnerData(ess, user, sign);
// Return true, so the player sees the wrong sign.
return true;
}
@@ -154,6 +157,36 @@ public class EssentialsSign {
return user.getName().substring(0, Math.min(user.getName().length(), 13));
}
public void setOwner(final IEssentials ess, final User user, final ISign signProvider, final int nameIndex, final String namePrefix) {
setOwnerData(ess, user, signProvider);
signProvider.setLine(nameIndex, namePrefix + getUsername(user));
}
public void setOwnerData(final IEssentials ess, final User user, final ISign signProvider) {
if (ess.getSignDataProvider() == null) {
return;
}
final Sign sign = (Sign) signProvider.getBlock().getState();
ess.getSignDataProvider().setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString());
}
public boolean isOwner(final IEssentials ess, final User user, final ISign signProvider, final int nameIndex, final String namePrefix) {
final Sign sign = (Sign) signProvider.getBlock().getState();
if (ess.getSignDataProvider() == null || ess.getSignDataProvider().getSignData(sign, SIGN_OWNER_KEY) == null) {
final boolean isLegacyOwner = FormatUtil.stripFormat(signProvider.getLine(nameIndex)).equalsIgnoreCase(getUsername(user));
if (ess.getSignDataProvider() != null && isLegacyOwner) {
ess.getSignDataProvider().setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString());
}
return isLegacyOwner;
}
if (user.getUUID().toString().equals(ess.getSignDataProvider().getSignData(sign, SIGN_OWNER_KEY))) {
signProvider.setLine(nameIndex, namePrefix + getUsername(user));
return true;
}
return false;
}
protected final boolean onSignInteract(final Block block, final Player player, final IEssentials ess) {
final ISign sign = new BlockSign(block);
final User user = ess.getUser(player);
@@ -392,7 +425,7 @@ public class EssentialsSign {
}
protected final BigDecimal getMoney(final String line, final IEssentials ess) throws SignException {
final boolean isMoney = line.matches("^[^0-9-\\.]?[\\.0-9]+[^0-9-\\.]?$");
final boolean isMoney = line.matches("^[^0-9-.]?[.0-9]+[^0-9-.]?$");
return isMoney ? getBigDecimalPositive(line, ess) : null;
}
@@ -531,6 +564,7 @@ public class EssentialsSign {
@Override
public final void setLine(final int index, final String text) {
sign.setLine(index, text);
updateSign();
}
@Override
@@ -23,10 +23,8 @@ import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.SignChangeEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SignBlockListener implements Listener {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private final transient IEssentials ess;
public SignBlockListener(final IEssentials ess) {
@@ -52,7 +50,7 @@ public class SignBlockListener implements Listener {
// prevent any signs be broken by destroying the block they are attached to
if (EssentialsSign.checkIfBlockBreaksSigns(block)) {
if (ess.getSettings().isDebug()) {
LOGGER.log(Level.INFO, "Prevented that a block was broken next to a sign.");
ess.getLogger().log(Level.INFO, "Prevented that a block was broken next to a sign.");
}
return true;
}
@@ -70,7 +68,7 @@ public class SignBlockListener implements Listener {
for (final EssentialsSign sign : ess.getSettings().enabledSigns()) {
if (sign.areHeavyEventRequired() && sign.getBlocks().contains(block.getType()) && !sign.onBlockBreak(block, player, ess)) {
LOGGER.log(Level.INFO, "A block was protected by a sign.");
ess.getLogger().log(Level.INFO, "A block was protected by a sign.");
return true;
}
}
@@ -5,7 +5,6 @@ import com.earth2me.essentials.Trade;
import com.earth2me.essentials.Trade.OverflowType;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.EnumUtil;
import com.earth2me.essentials.utils.FormatUtil;
import com.earth2me.essentials.utils.MaterialUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
@@ -123,7 +122,7 @@ public class SignProtection extends EssentialsSign {
if (user.isAuthorized("essentials.signs.protection.override")) {
return SignProtectionState.OWNER;
}
if (FormatUtil.stripFormat(sign.getLine(3)).equalsIgnoreCase(username)) {
if (isOwner(user.getEssentials(), user, sign, 3, "§1")) {
return SignProtectionState.OWNER;
}
for (int i = 1; i <= 2; i++) {
@@ -5,6 +5,7 @@ import com.earth2me.essentials.Trade;
import com.earth2me.essentials.Trade.OverflowType;
import com.earth2me.essentials.Trade.TradeType;
import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.MaterialUtil;
import com.earth2me.essentials.utils.NumberUtil;
import net.ess3.api.IEssentials;
import net.ess3.api.MaxMoneyException;
@@ -18,7 +19,7 @@ import static com.earth2me.essentials.I18n.tl;
//TODO: TL exceptions
public class SignTrade extends EssentialsSign {
private static int MAX_STOCK_LINE_LENGTH = 15;
private static final int MAX_STOCK_LINE_LENGTH = 15;
public SignTrade() {
super("Trade");
@@ -34,7 +35,7 @@ public class SignTrade extends EssentialsSign {
throw new SignException("You cannot trade for the same item type.");
}
trade.isAffordableFor(player);
sign.setLine(3, "§8" + username);
setOwner(ess, player, sign, 3, "§8");
trade.charge(player);
Trade.log("Sign", "Trade", "Create", username, trade, username, null, sign.getBlock().getLocation(), player.getMoney(), ess);
return true;
@@ -42,7 +43,7 @@ public class SignTrade extends EssentialsSign {
@Override
protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException, MaxMoneyException {
if (sign.getLine(3).substring(2).equalsIgnoreCase(username)) {
if (isOwner(ess, player, sign, 3, "§8")) {
final Trade store = rechargeSign(sign, ess, player);
final Trade stored;
try {
@@ -83,7 +84,7 @@ public class SignTrade extends EssentialsSign {
private Trade rechargeSign(final ISign sign, final IEssentials ess, final User player) throws SignException, ChargeException {
final Trade trade = getTrade(sign, 2, AmountType.COST, false, true, ess);
if (trade.getItemStack() != null && player.getBase().getItemInHand() != null && trade.getItemStack().getType() == player.getBase().getItemInHand().getType() && trade.getItemStack().getDurability() == player.getBase().getItemInHand().getDurability() && trade.getItemStack().getEnchantments().equals(player.getBase().getItemInHand().getEnchantments())) {
if (trade.getItemStack() != null && player.getBase().getItemInHand() != null && trade.getItemStack().getType() == player.getBase().getItemInHand().getType() && MaterialUtil.getDamage(trade.getItemStack()) == MaterialUtil.getDamage(player.getBase().getItemInHand()) && trade.getItemStack().getEnchantments().equals(player.getBase().getItemInHand().getEnchantments())) {
final int amount = trade.getItemStack().getAmount();
if (player.getBase().getInventory().containsAtLeast(trade.getItemStack(), amount)) {
final ItemStack stack = player.getBase().getItemInHand().clone();
@@ -101,7 +102,7 @@ public class SignTrade extends EssentialsSign {
protected boolean onSignBreak(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, MaxMoneyException {
final String signOwner = sign.getLine(3);
final boolean isOwner = signOwner.length() > 3 && signOwner.substring(2).equalsIgnoreCase(username);
final boolean isOwner = isOwner(ess, player, sign, 3, "§8");
final boolean canBreak = isOwner || player.isAuthorized("essentials.signs.trade.override");
final boolean canCollect = isOwner || player.isAuthorized("essentials.signs.trade.override.collect");
@@ -115,8 +116,8 @@ public class SignTrade extends EssentialsSign {
return true;
}
final Map<Integer, ItemStack> withdraw1 = stored1.pay(player, OverflowType.RETURN);
final Map<Integer, ItemStack> withdraw2 = stored2.pay(player, OverflowType.RETURN);
final Map<Integer, ItemStack> withdraw1 = stored1.pay(player, OverflowType.DROP);
final Map<Integer, ItemStack> withdraw2 = stored2.pay(player, OverflowType.DROP);
if (withdraw1 == null && withdraw2 == null) {
Trade.log("Sign", "Trade", "Break", signOwner.substring(2), stored2, username, stored1, sign.getBlock().getLocation(), player.getMoney(), ess);
@@ -205,7 +206,9 @@ public class SignTrade extends EssentialsSign {
if (!(split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) && getItemStack(split[1], stackamount, ess).getType() == Material.AIR) {
throw new SignException(tl("moreThanZero"));
}
sign.setLine(index, stackamount + " " + split[1] + ":" + amount);
final String newline = stackamount + " " + split[1] + ":" + amount;
validateSignLength(newline);
sign.setLine(index, newline);
return;
}
throw new SignException(tl("invalidSignLine", index + 1));
@@ -235,27 +238,26 @@ public class SignTrade extends EssentialsSign {
}
if (split.length == 3) {
final int stackAmount = getIntegerPositive(split[0]);
if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) {
final int stackamount = getIntegerPositive(split[0]);
int amount = getInteger(split[2]);
if (amountType == AmountType.ROUNDED) {
amount -= amount % stackamount;
amount -= amount % stackAmount;
}
if (notEmpty && (amount < 1 || stackamount < 1)) {
if (notEmpty && (amount < 1 || stackAmount < 1)) {
throw new SignException(tl("tradeSignEmpty"));
}
return new Trade(amountType == AmountType.COST ? stackamount : amount, ess);
return new Trade(amountType == AmountType.COST ? stackAmount : amount, ess);
} else {
final int stackamount = getIntegerPositive(split[0]);
final ItemStack item = getItemStack(split[1], stackamount, allowId, ess);
final ItemStack item = getItemStack(split[1], stackAmount, allowId, ess);
int amount = getInteger(split[2]);
if (amountType == AmountType.ROUNDED) {
amount -= amount % stackamount;
amount -= amount % stackAmount;
}
if (notEmpty && (amount < 1 || stackamount < 1 || item.getType() == Material.AIR || amount < stackamount)) {
if (notEmpty && (amount < 1 || stackAmount < 1 || item.getType() == Material.AIR || amount < stackAmount)) {
throw new SignException(tl("tradeSignEmpty"));
}
item.setAmount(amountType == AmountType.COST ? stackamount : amount);
item.setAmount(amountType == AmountType.COST ? stackAmount : amount);
return new Trade(item, ess);
}
}
@@ -334,20 +336,18 @@ public class SignTrade extends EssentialsSign {
}
if (split.length == 3) {
final int stackAmount = getIntegerPositive(split[0]);
if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) {
final int stackamount = getIntegerPositive(split[0]);
final String newline = stackamount + " " + split[1] + ":" + value.intValueExact();
final String newline = stackAmount + " " + split[1] + ":" + value.intValueExact();
validateSignLength(newline);
sign.setLine(index, newline);
return;
} else {
final int stackamount = getIntegerPositive(split[0]);
getItemStack(split[1], stackamount, ess);
final String newline = stackamount + " " + split[1] + ":" + value.intValueExact();
getItemStack(split[1], stackAmount, ess);
final String newline = stackAmount + " " + split[1] + ":" + value.intValueExact();
validateSignLength(newline);
sign.setLine(index, newline);
return;
}
return;
}
throw new SignException(tl("invalidSignLine", index + 1));
}
@@ -15,12 +15,10 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import static com.earth2me.essentials.I18n.tl;
public class HelpInput implements IText {
private static final Logger logger = Logger.getLogger("Essentials");
private final transient List<String> lines = new ArrayList<>();
private final transient List<String> chapters = new ArrayList<>();
private final transient Map<String, Integer> bookmarks = new HashMap<>();
@@ -121,7 +119,7 @@ public class HelpInput implements IText {
} catch (final NullPointerException ignored) {
} catch (final Exception ex) {
if (!reported) {
logger.log(Level.WARNING, tl("commandHelpFailedForPlugin", pluginNameLow), ex);
ess.getLogger().log(Level.WARNING, tl("commandHelpFailedForPlugin", pluginNameLow), ex);
}
reported = true;
}
@@ -1,7 +1,6 @@
package com.earth2me.essentials.updatecheck;
import com.earth2me.essentials.Essentials;
import com.google.common.base.Charsets;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
@@ -13,6 +12,7 @@ import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@@ -23,6 +23,12 @@ public final class UpdateChecker {
private static final String REPO = "EssentialsX/Essentials";
private static final String BRANCH = "2.x";
private static final String LATEST_RELEASE_URL = "https://api.github.com/repos/" + REPO + "/releases/latest";
private static final String LATEST_RELEASE_PROXY_URL = "https://webapi.essentialsx.net/api/v1/github/essx-v2/releases/latest";
// 0 = base for comparison, 1 = head for comparison - *not* the same as what this class calls them
private static final String DISTANCE_URL = "https://api.github.com/repos/EssentialsX/Essentials/compare/{0}...{1}";
private static final String DISTANCE_PROXY_URL = "https://webapi.essentialsx.net/api/v1/github/essx-v2/compare/{0}/{1}";
private final Essentials ess;
private final String versionIdentifier;
private final String versionBranch;
@@ -70,11 +76,11 @@ public final class UpdateChecker {
return pendingDevFuture;
}
pendingDevFuture = new CompletableFuture<>();
new Thread(() -> {
ess.runTaskAsynchronously(() -> {
pendingDevFuture.complete(cachedDev = fetchDistance(BRANCH, getVersionIdentifier()));
pendingDevFuture = null;
lastFetchTime = System.currentTimeMillis();
}).start();
});
return pendingDevFuture;
}
return CompletableFuture.completedFuture(cachedDev);
@@ -86,24 +92,22 @@ public final class UpdateChecker {
return pendingReleaseFuture;
}
pendingReleaseFuture = new CompletableFuture<>();
new Thread(() -> {
ess.runTaskAsynchronously(() -> {
catchBlock:
try {
final HttpURLConnection connection = (HttpURLConnection) new URL("https://api.github.com/repos/" + REPO + "/releases/latest").openConnection();
connection.connect();
final HttpURLConnection connection = tryRequestWithFallback(LATEST_RELEASE_URL, LATEST_RELEASE_PROXY_URL);
if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) {
// Locally built?
pendingReleaseFuture.complete(cachedRelease = new RemoteVersion(BranchStatus.UNKNOWN));
break catchBlock;
}
if (connection.getResponseCode() == HttpURLConnection.HTTP_INTERNAL_ERROR) {
// Github is down
} else if (connection.getResponseCode() == HttpURLConnection.HTTP_INTERNAL_ERROR || connection.getResponseCode() == HttpURLConnection.HTTP_FORBIDDEN) {
// GitHub is down or rate limit exceeded
pendingReleaseFuture.complete(new RemoteVersion(BranchStatus.ERROR));
break catchBlock;
}
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8))) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
latestRelease = new Gson().fromJson(reader, JsonObject.class).get("tag_name").getAsString();
pendingReleaseFuture.complete(cachedRelease = fetchDistance(latestRelease, getVersionIdentifier()));
} catch (JsonSyntaxException | NumberFormatException e) {
@@ -116,7 +120,7 @@ public final class UpdateChecker {
}
pendingReleaseFuture = null;
lastFetchTime = System.currentTimeMillis();
}).start();
});
return pendingReleaseFuture;
}
return CompletableFuture.completedFuture(cachedRelease);
@@ -138,43 +142,64 @@ public final class UpdateChecker {
return latestRelease;
}
private HttpURLConnection tryRequestWithFallback(final String githubUrl, final String fallbackUrl) throws IOException {
HttpURLConnection connection = (HttpURLConnection) new URL(githubUrl).openConnection();
try {
connection.connect();
if (connection.getResponseCode() != HttpURLConnection.HTTP_INTERNAL_ERROR && connection.getResponseCode() != HttpURLConnection.HTTP_FORBIDDEN) {
// Connection succeeded without any errors from GitHub's side.
return connection;
}
} catch (IOException ignored) {
}
// Connection failed, GitHub's down or we hit a ratelimit, so use the fallback URL
// If the fallback fails, let the exception or error status bubble up
connection = (HttpURLConnection) new URL(fallbackUrl).openConnection();
connection.connect();
return connection;
}
private RemoteVersion tryProcessDistance(final HttpURLConnection connection) throws IOException {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
final JsonObject obj = new Gson().fromJson(reader, JsonObject.class);
switch (obj.get("status").getAsString()) {
case "identical": {
return new RemoteVersion(BranchStatus.IDENTICAL, 0);
}
case "ahead": {
return new RemoteVersion(BranchStatus.AHEAD, 0);
}
case "behind": {
return new RemoteVersion(BranchStatus.BEHIND, obj.get("behind_by").getAsInt());
}
case "diverged": {
return new RemoteVersion(BranchStatus.DIVERGED, obj.get("behind_by").getAsInt());
}
default: {
return new RemoteVersion(BranchStatus.UNKNOWN);
}
}
} catch (JsonSyntaxException | NumberFormatException e) {
e.printStackTrace();
return new RemoteVersion(BranchStatus.ERROR);
}
}
private RemoteVersion fetchDistance(final String head, final String hash) {
try {
final HttpURLConnection connection = (HttpURLConnection) new URL("https://api.github.com/repos/" + REPO + "/compare/" + head + "..." + hash).openConnection();
connection.connect();
final HttpURLConnection connection = tryRequestWithFallback(MessageFormat.format(DISTANCE_URL, head, hash), MessageFormat.format(DISTANCE_PROXY_URL, head, hash));
if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) {
// Locally built?
return new RemoteVersion(BranchStatus.UNKNOWN);
}
if (connection.getResponseCode() == HttpURLConnection.HTTP_INTERNAL_ERROR || connection.getResponseCode() == HttpURLConnection.HTTP_FORBIDDEN) {
} else if (connection.getResponseCode() == HttpURLConnection.HTTP_INTERNAL_ERROR || connection.getResponseCode() == HttpURLConnection.HTTP_FORBIDDEN) {
// GitHub is down or we hit a local rate limit
return new RemoteVersion(BranchStatus.ERROR);
}
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8))) {
final JsonObject obj = new Gson().fromJson(reader, JsonObject.class);
switch (obj.get("status").getAsString()) {
case "identical": {
return new RemoteVersion(BranchStatus.IDENTICAL, 0);
}
case "ahead": {
return new RemoteVersion(BranchStatus.AHEAD, 0);
}
case "behind": {
return new RemoteVersion(BranchStatus.BEHIND, obj.get("behind_by").getAsInt());
}
case "diverged": {
return new RemoteVersion(BranchStatus.DIVERGED, obj.get("behind_by").getAsInt());
}
default: {
return new RemoteVersion(BranchStatus.UNKNOWN);
}
}
} catch (JsonSyntaxException | NumberFormatException e) {
e.printStackTrace();
return new RemoteVersion(BranchStatus.ERROR);
}
return tryProcessDistance(connection);
} catch (IOException e) {
e.printStackTrace();
return new RemoteVersion(BranchStatus.ERROR);
@@ -0,0 +1,70 @@
package com.earth2me.essentials.utils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import net.ess3.api.IEssentials;
import org.bukkit.command.Command;
import org.bukkit.command.FormattedCommandAlias;
import org.bukkit.command.PluginCommand;
import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.plugin.Plugin;
import java.util.Map;
public final class CommandMapUtil {
private static final Gson GSON = new GsonBuilder()
.setPrettyPrinting()
.create();
private CommandMapUtil() {
throw new UnsupportedOperationException();
}
public static String toJsonPretty(IEssentials ess, Map<String, Command> knownCommandMap) {
final JsonObject json = toJson(ess, knownCommandMap);
return GSON.toJson(json);
}
public static JsonObject toJson(IEssentials ess, Map<String, Command> knownCommandMap) {
final JsonObject json = new JsonObject();
for (Map.Entry<String, Command> entry : knownCommandMap.entrySet()) {
json.add(entry.getKey(), toJson(ess, entry.getValue()));
}
return json;
}
public static JsonObject toJson(IEssentials ess, Command value) {
if (value == null) {
return null;
}
final JsonObject json = new JsonObject();
json.addProperty("name", value.getName());
json.addProperty("description", value.getDescription());
json.addProperty("type", value.getClass().getSimpleName());
json.addProperty("raw", value.toString());
if (value.getClass().getSimpleName().equals("VanillaCommandWrapper")) {
json.addProperty("source", "vanilla");
} else if (value.getClass().getName().contains("org.spigotmc")) {
json.addProperty("source", "spigot");
} else if (value instanceof PluginCommand) {
final Plugin plugin = ((PluginCommand) value).getPlugin();
json.addProperty("source", plugin.getName() + " " + plugin.getDescription().getVersion());
} else if (value instanceof BukkitCommand) {
json.addProperty("source", "bukkit");
} else if (value instanceof FormattedCommandAlias) {
json.addProperty("source", "commands.yml");
final JsonArray formatStrings = new JsonArray();
for (String entry : ess.getFormattedCommandAliasProvider().getFormatStrings((FormattedCommandAlias) value)) {
formatStrings.add(entry);
}
json.add("bukkit_aliases", formatStrings);
}
return json;
}
}
@@ -27,6 +27,7 @@ public final class FormatUtil {
private static final Pattern URL_PATTERN = Pattern.compile("((?:(?:https?)://)?[\\w-_\\.]{2,})\\.([a-zA-Z]{2,3}(?:/\\S+)?)");
//Used to strip ANSI control codes from console
private static final Pattern ANSI_CONTROL_PATTERN = Pattern.compile("\u001B(?:\\[0?m|\\[38;2(?:;\\d{1,3}){3}m|\\[([0-9]{1,2}[;m]?){3})");
private static final Pattern PAPER_CONTROL_PATTERN = Pattern.compile("(?i)" + (char) 0x7f + "[0-9A-FK-ORX]");
private FormatUtil() {
}
@@ -54,6 +55,13 @@ public final class FormatUtil {
return stripColor(input, ANSI_CONTROL_PATTERN);
}
public static String stripPaper(final String input) {
if (input == null) {
return null;
}
return stripColor(input, PAPER_CONTROL_PATTERN);
}
//This is the general permission sensitive message format function, checks for urls.
public static String formatMessage(final IUser user, final String permBase, final String input) {
if (input == null) {
@@ -1,7 +1,6 @@
package com.earth2me.essentials.utils;
import com.earth2me.essentials.IEssentials;
import com.google.common.primitives.Ints;
import net.ess3.api.IUser;
import org.bukkit.GameMode;
import org.bukkit.Location;
@@ -32,6 +31,11 @@ public final class LocationUtil {
"FLOWING_LAVA", "LAVA", "STATIONARY_LAVA");
private static final Material PORTAL = EnumUtil.getMaterial("NETHER_PORTAL", "PORTAL");
private static final Material LIGHT = EnumUtil.getMaterial("LIGHT");
private static final Material PATH = EnumUtil.getMaterial("GRASS_PATH");
private static final Material FARMLAND = EnumUtil.getMaterial("FARMLAND");
// The player can stand inside these materials
private static final Set<Material> HOLLOW_MATERIALS = EnumSet.noneOf(Material.class);
private static final Set<Material> TRANSPARENT_MATERIALS = EnumSet.noneOf(Material.class);
@@ -50,6 +54,10 @@ public final class LocationUtil {
// Barrier is transparent, but solid
HOLLOW_MATERIALS.remove(Material.BARRIER);
// Path and farmland are transparent, but solid
HOLLOW_MATERIALS.remove(PATH);
HOLLOW_MATERIALS.remove(FARMLAND);
// Light blocks can be passed through and are not considered transparent for some reason
if (LIGHT != null) {
HOLLOW_MATERIALS.add(LIGHT);
@@ -85,9 +93,13 @@ public final class LocationUtil {
}
public static Location getTarget(final LivingEntity entity) throws Exception {
return getTarget(entity, 300);
}
public static Location getTarget(final LivingEntity entity, final int maxDistance) throws Exception {
Block block = null;
try {
block = entity.getTargetBlock(TRANSPARENT_MATERIALS, 300);
block = entity.getTargetBlock(TRANSPARENT_MATERIALS, maxDistance);
} catch (final NoSuchMethodError ignored) {
} // failing now :(
if (block == null) {
@@ -232,12 +244,12 @@ public final class LocationUtil {
i++;
if (i >= VOLUME.length) {
x = origX;
y = Ints.constrainToRange(origY + RADIUS, worldMinY, worldMaxY);
y = NumberUtil.constrainToRange(origY + RADIUS, worldMinY, worldMaxY);
z = origZ;
break;
}
x = origX + VOLUME[i].x;
y = Ints.constrainToRange(origY + VOLUME[i].y, worldMinY, worldMaxY);
y = NumberUtil.constrainToRange(origY + VOLUME[i].y, worldMinY, worldMaxY);
z = origZ + VOLUME[i].z;
}
while (isBlockUnsafe(ess, world, x, y, z)) {
@@ -267,6 +279,7 @@ public final class LocationUtil {
int y = (int) Math.round(loc.getY());
final int z = loc.getBlockZ();
int count = 0;
// Check whether more than 2 unsafe block are below player.
while (LocationUtil.isBlockUnsafe(ess, world, x, y, z) && y >= ess.getWorldInfoProvider().getMinHeight(world)) {
y--;
count++;
@@ -275,7 +288,8 @@ public final class LocationUtil {
}
}
return y < 0;
// If not then check if player is in the void
return y < ess.getWorldInfoProvider().getMinHeight(world);
}
public static class Vector3D {
@@ -3,6 +3,8 @@ package com.earth2me.essentials.utils;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.material.MaterialData;
import java.lang.reflect.InvocationTargetException;
@@ -11,7 +13,6 @@ import java.util.EnumSet;
import java.util.Set;
public final class MaterialUtil {
public static final Material SPAWNER = EnumUtil.getMaterial("MOB_SPAWNER", "SPAWNER");
private static final Set<Material> BEDS;
private static final Set<Material> BANNERS;
@@ -81,13 +82,15 @@ public final class MaterialUtil {
"ACACIA_SIGN", "BIRCH_SIGN",
"DARK_OAK_SIGN", "JUNGLE_SIGN",
"OAK_SIGN", "SPRUCE_SIGN",
"CRIMSON_SIGN", "WARPED_SIGN");
"CRIMSON_SIGN", "WARPED_SIGN",
"MANGROVE_SIGN");
WALL_SIGNS = EnumUtil.getAllMatching(Material.class, "WALL_SIGN",
"ACACIA_WALL_SIGN", "BIRCH_WALL_SIGN",
"DARK_OAK_WALL_SIGN", "JUNGLE_WALL_SIGN",
"OAK_WALL_SIGN", "SPRUCE_WALL_SIGN",
"CRIMSON_WALL_SIGN", "WARPED_WALL_SIGN");
"CRIMSON_WALL_SIGN", "WARPED_WALL_SIGN",
"MANGROVE_WALL_SIGN");
}
private MaterialUtil() {
@@ -129,20 +132,12 @@ public final class MaterialUtil {
return LEATHER_ARMOR.contains(material);
}
public static boolean isMobHead(final Material material, final int durability) {
if (MOB_HEADS.contains(material)) {
public static boolean isPlayerHead(final ItemStack stack) {
if (PLAYER_HEADS.contains(stack.getType())) {
return true;
}
return LEGACY_SKULLS.contains(material) && (durability != 3);
}
public static boolean isPlayerHead(final Material material, final int durability) {
if (PLAYER_HEADS.contains(material)) {
return true;
}
return LEGACY_SKULLS.contains(material) && durability == 3;
return VersionUtil.PRE_FLATTENING && LEGACY_SKULLS.contains(stack.getType()) && stack.getDurability() == 3;
}
public static boolean isPotion(final Material material) {
@@ -166,13 +161,35 @@ public final class MaterialUtil {
}
public static boolean isSkull(final Material material) {
return isPlayerHead(material, -1) || isMobHead(material, -1);
return PLAYER_HEADS.contains(material) || LEGACY_SKULLS.contains(material);
}
public static boolean isAir(final Material material) {
return material == Material.AIR || (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01) && material.isAir());
}
public static int getDamage(final ItemStack stack) {
if (VersionUtil.PRE_FLATTENING) {
return stack.getDurability();
}
if (stack.getItemMeta() instanceof Damageable) {
return ((Damageable) stack.getItemMeta()).getDamage();
}
return 0;
}
public static void setDamage(final ItemStack stack, final int damage) {
if (VersionUtil.PRE_FLATTENING) {
stack.setDurability((short) damage);
} else {
if (stack.getItemMeta() instanceof Damageable) {
final Damageable damageable = (Damageable) stack.getItemMeta();
damageable.setDamage(damage);
stack.setItemMeta(damageable);
}
}
}
public static Material convertFromLegacy(final int id, final byte damage) {
for (final Material material : EnumSet.allOf(Material.class)) {
if (material.getId() == id) {
@@ -119,4 +119,20 @@ public final class NumberUtil {
}
return Integer.parseInt(sInt) > 0;
}
public static boolean isNumeric(final String sNum) {
for (final char sChar : sNum.toCharArray()) {
if (!Character.isDigit(sChar)) {
return false;
}
}
return true;
}
/**
* Backport from Guava.
*/
public static int constrainToRange(int value, int min, int max) {
return Math.min(Math.max(value, min), max);
}
}
@@ -1,8 +1,12 @@
package com.earth2me.essentials.utils;
import com.google.common.primitives.Chars;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import java.util.function.Function;
import java.util.regex.Pattern;
public final class StringUtil {
@@ -85,4 +89,49 @@ public final class StringUtil {
return null;
}
public static String abbreviate(final String input, final int length) {
if (input == null) return null;
if (length < 4) throw new IllegalArgumentException("Invalid length " + length);
if (input.length() <= length) return input;
return input.substring(0, length - 3) + "...";
}
// Replacement for org.apache.commons.lang3.StringUtils.stripToNull(String)
public static String stripToNull(final String input) {
if (input == null) return null;
final String result = strip(input);
return result.isEmpty() ? null : result;
}
// Replacement for org.apache.commons.lang3.StringUtils.strip(String)
public static String strip(final String input) {
return strip(input, Character::isWhitespace);
}
// Replacement for org.apache.commons.lang3.StringUtils.strip(String, String)
public static String strip(final String input, final String stripChars) {
if (stripChars == null) return strip(input);
final List<Character> toStrip = Chars.asList(stripChars.toCharArray());
return strip(input, toStrip::contains);
}
public static String strip(final String input, Function<Character, Boolean> shouldStrip) {
if (input == null) return null;
int startIndex = 0;
int endIndex = input.length();
for (; startIndex < endIndex; startIndex++) {
if (!shouldStrip.apply(input.charAt(startIndex))) break;
}
for (; endIndex > startIndex; endIndex--) {
if (!shouldStrip.apply(input.charAt(endIndex - 1))) break;
}
return input.substring(startIndex, endIndex);
}
}
@@ -34,9 +34,13 @@ public final class VersionUtil {
public static final BukkitVersion v1_16_5_R01 = BukkitVersion.fromString("1.16.5-R0.1-SNAPSHOT");
public static final BukkitVersion v1_17_R01 = BukkitVersion.fromString("1.17-R0.1-SNAPSHOT");
public static final BukkitVersion v1_17_1_R01 = BukkitVersion.fromString("1.17.1-R0.1-SNAPSHOT");
public static final BukkitVersion v1_18_1_R01 = BukkitVersion.fromString("1.18.1-R0.1-SNAPSHOT");
public static final BukkitVersion v1_18_2_R01 = BukkitVersion.fromString("1.18.2-R0.1-SNAPSHOT");
public static final BukkitVersion v1_19_R01 = BukkitVersion.fromString("1.19-R0.1-SNAPSHOT");
public static final BukkitVersion v1_19_2_R01 = BukkitVersion.fromString("1.19.2-R0.1-SNAPSHOT");
private static final Set<BukkitVersion> supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01, v1_17_1_R01, v1_18_1_R01);
private static final Set<BukkitVersion> supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01, v1_17_1_R01, v1_18_2_R01, v1_19_2_R01);
public static final boolean PRE_FLATTENING = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01);
private static final Map<String, SupportStatus> unsupportedServerClasses;
@@ -57,6 +61,10 @@ public final class VersionUtil {
// KibblePatcher - Dangerous bytecode editor snakeoil whose only use is to break plugins
builder.put("net.kibblelands.server.FastMath", SupportStatus.DANGEROUS_FORK);
// Brain-dead chat signing bypass that break EssentialsChat
builder.put("ml.tcoded.nochatreports.NoChatReportsSpigot", SupportStatus.STUPID_PLUGIN);
builder.put("me.doclic.noencryption.NoEncryption", SupportStatus.STUPID_PLUGIN);
// Akarin - Dangerous patch history;
// * Potentially unsafe saving of nms.JsonList
builder.put("io.akarin.server.Config", SupportStatus.DANGEROUS_FORK);
@@ -320,6 +328,7 @@ public final class VersionUtil {
FULL(true),
LIMITED(true),
DANGEROUS_FORK(false),
STUPID_PLUGIN(false),
NMS_CLEANROOM(false),
UNSTABLE(false),
OUTDATED(false)
@@ -52,8 +52,8 @@ public class LocalChatSpyEvent extends Event implements Cancellable {
}
/**
* Gets the format to use to display this chat message. When this event finishes execution, the first format
* parameter is the {@link Player#getDisplayName()} and the second parameter is {@link #getMessage()}
* Gets the format to use to display this chat message to spy recipients. When this event finishes execution, the
* first format parameter is the {@link Player#getDisplayName()} and the second parameter is {@link #getMessage()}
*
* @return {@link String#format(String, Object...)} compatible format string
*/
@@ -62,8 +62,8 @@ public class LocalChatSpyEvent extends Event implements Cancellable {
}
/**
* Sets the format to use to display this chat message. When this event finishes execution, the first format
* parameter is the {@link Player#getDisplayName()} and the second parameter is {@link #getMessage()}
* Sets the format to use to display this chat message to spy recipients. When this event finishes execution, the
* first format parameter is the {@link Player#getDisplayName()} and the second parameter is {@link #getMessage()}
*
* @param format {@link String#format(String, Object...)} compatible format string
* @throws IllegalFormatException if the underlying API throws the exception
+12
View File
@@ -593,6 +593,9 @@ repair-enchanted: true
# Warning: Mixing and overleveling some enchantments can cause issues with clients, servers and plugins.
unsafe-enchantments: false
# The maximum range from the player that the /tree and /bigtree commands can spawn trees.
tree-command-range-limit: 300
#Do you want Essentials to keep track of previous location for /back in the teleport listener?
#If you set this to true any plugin that uses teleport will have the previous location registered.
register-back-in-listener: false
@@ -918,6 +921,15 @@ chat:
# plots: "&dP&r"
# creative: "&eC&r"
# Whether players should be placed into shout mode by default.
shout-default: false
# Whether a player's shout mode should persist restarts.
persist-shout: false
# Whether chat questions should be enabled or not.
question-enabled: true
############################################################
# +------------------------------------------------------+ #
# | EssentialsX Protect | #
File diff suppressed because it is too large. Load diff
@@ -126,7 +126,7 @@ cantReadGeoIpDB=Failed to read GeoIP database\!
cantSpawnItem=\u00a74You are not allowed to spawn the item\u00a7c {0}\u00a74.
cartographytableCommandDescription=Opens up a cartography table.
cartographytableCommandUsage=/<command>
chatTypeLocal=[L]
chatTypeLocal=\u00a73[L]
chatTypeSpy=[Spy]
cleaned=Userfiles Cleaned.
cleaning=Cleaning userfiles.
@@ -314,6 +314,7 @@ enderchestCommandUsage2=/<command> <player>
enderchestCommandUsage2Description=Opens the ender chest of the target player
errorCallingCommand=Error calling the command /{0}
errorWithMessage=\u00a7cError\:\u00a74 {0}
essChatNoSecureMsg=EssentialsX Chat version {0} does not support secure chat on this server software. Update EssentialsX, and if this issue persists, inform the developers.
essentialsCommandDescription=Reloads essentials.
essentialsCommandUsage=/<command>
essentialsCommandUsage1=/<command> reload
@@ -669,7 +670,7 @@ listGroupTag=\u00a76{0}\u00a7r\:
listHiddenTag=\u00a77[HIDDEN]\u00a7r
listRealName=({0})
loadWarpError=\u00a74Failed to load warp {0}.
localFormat=[L]<{0}> {1}
localFormat=\u00a73[L] \u00a7r<{0}> {1}
localNoOne=
loomCommandDescription=Opens up a loom.
loomCommandUsage=/<command>
@@ -779,6 +780,7 @@ nearCommandUsage3Description=Lists all players within the default near radius of
nearCommandUsage4=/<command> <player> <radius>
nearCommandUsage4Description=Lists all players within the given radius of the specified player
nearbyPlayers=\u00a76Players nearby\:\u00a7r {0}
nearbyPlayersList={0}\u00a7f(\u00a7c{1}m\u00a7f)
negativeBalanceError=\u00a74User is not allowed to have a negative balance.
nickChanged=\u00a76Nickname changed.
nickCommandDescription=Change your nickname or that of another player.
@@ -832,8 +834,9 @@ noPlacePermission=\u00a74You do not have permission to place a block near that s
noPotionEffectPerm=\u00a74You do not have permission to apply potion effect \u00a7c{0} \u00a74to this potion.
noPowerTools=\u00a76You have no power tools assigned.
notAcceptingPay=\u00a74{0} \u00a74is not accepting payment.
notAllowedToQuestion=\u00a74You are not authorized to use question.
notAllowedToShout=\u00a74You are not authorized to shout.
notAllowedToLocal=\u00a74You don't have permission to speak in local chat.
notAllowedToQuestion=\u00a74You don't have permission to use question.
notAllowedToShout=\u00a74You don't have permission to shout.
notEnoughExperience=\u00a74You do not have enough experience.
notEnoughMoney=\u00a74You do not have sufficient funds.
notFlying=not flying
@@ -1075,8 +1078,9 @@ serverTotal=\u00a76Server Total\:\u00a7c {0}
serverUnsupported=You are running an unsupported server version!
serverUnsupportedClass=Status determining class\: {0}
serverUnsupportedCleanroom=You are running a server that does not properly support Bukkit plugins that rely on internal Mojang code. Consider using an Essentials replacement for your server software.
serverUnsupportedDangerous=You are running a server fork that is known to be extremely dangerous and lead to data loss. It is strongly recommended you switch to a more stable, high-performing server software, like Paper or Tuinity.
serverUnsupportedDangerous=You are running a server fork that is known to be extremely dangerous and lead to data loss. It is strongly recommended you switch to a more stable server software like Paper.
serverUnsupportedLimitedApi=You are running a server with limited API functionality. EssentialsX will still work, but certain features may be disabled.
serverUnsupportedDumbPlugins=You are using plugins known to cause severe issues with EssentialsX and other plugins.
serverUnsupportedMods=You are running a server that does not properly support Bukkit plugins. Bukkit plugins should not be used with Forge/Fabric mods! For Forge: Consider using ForgeEssentials, or SpongeForge + Nucleus.
setBal=\u00a7aYour balance was set to {0}.
setBalOthers=\u00a7aYou set {0}\u00a7a''s balance to {1}.
@@ -126,7 +126,7 @@ cantReadGeoIpDB=Грешка при прочитането на GeoIP базат
cantSpawnItem=§4Нямате право да създадете предмета§c {0}§4.
cartographytableCommandDescription=Отваря картографска маса.
cartographytableCommandUsage=/<command>
chatTypeLocal=[L]
chatTypeLocal=§[L]
chatTypeSpy=[Шпионин]
cleaned=Потребителските файлове са изчистени.
cleaning=Изчистване на потребителските файлове.
@@ -528,7 +528,6 @@ listCommandDescription=Показва всички онлайн играчи.
listGroupTag=§6{0}§r\:
listHiddenTag=§7[СКРИТ]§r
loadWarpError=§4Грешка при зареждането на уарп {0}.
localFormat=[L]<{0}> {1}
loomCommandUsage=/<command>
mailClear=§6За да изчистите пощата си, напишете§c /mail clear§6.
mailCleared=§6Пощата ви е почистена\!
@@ -631,8 +630,6 @@ noPlacePermission=§4Нямате права да поставяте блокч
noPotionEffectPerm=§4Нямате право да прилагате ефект §c{0} §4на тази отвара.
noPowerTools=§6Нямате предмети със зададени команди.
notAcceptingPay=§4{0} §4не приема плащания.
notAllowedToQuestion=§4Нямате право да използвате въпросителен знак.
notAllowedToShout=§4Нямате право да крещите.
notEnoughExperience=§4Нямате достатъчно опит.
notEnoughMoney=§4Нямате достатъчно средства.
notFlying=не лети
@@ -772,6 +769,7 @@ sellHandPermission=§6Нямате право да продавате предм
serverFull=Сървърът е пълен\!
serverTotal=§6Общо играчи\:§c {0}
serverUnsupported=Имате неподдържана версия на сървъра\!
serverUnsupportedDangerous=Използвате сървърен форк, за който се знае, че е изключително опасен и може да доведе до загуба на данни. Препоръчително е да преминете към по-стабилен сървърен софтуер като Paper.
setBal=§aВашият баланс беше зададен на {0}.
setBalOthers=§aЗададохте баланса на {0}§a на {1}.
setSpawner=§6Променихте вида на размножителя на§c {0}§6.
@@ -126,7 +126,7 @@ cantReadGeoIpDB=Nepodařilo se načíst GeoIP databázi\!
cantSpawnItem=§4Nemáš dovoleno vytvořit předmět§c {0}§4.
cartographytableCommandDescription=Otevře kartografický stůl.
cartographytableCommandUsage=/<command>
chatTypeLocal=[L]
chatTypeLocal=§3[L]
chatTypeSpy=[Špeh]
cleaned=Uživatelské soubory vyčištěny.
cleaning=Čištění uživatelských souborů.
@@ -161,7 +161,7 @@ compassCommandUsage=/<command>
condenseCommandDescription=Zhustí předměty do kompaktnějších bloků.
condenseCommandUsage=/<command> [předmět]
condenseCommandUsage1=/<command>
condenseCommandUsage1Description=Nahňácá všechny předměty ve tvém inventáři
condenseCommandUsage1Description=Zhustí všechny předměty ve tvém inventáři
condenseCommandUsage2=/<command> <předmět>
condenseCommandUsage2Description=Zhustí zadaný předmět ve tvém inventáři
configFileMoveError=Nepodařilo se přesunout config.yml do zálohy.
@@ -233,13 +233,13 @@ destinationNotSet=Cíl není nastaven\!
disabled=vypnuto
disabledToSpawnMob=§4Vyvolání tohoto stvoření je zakázáno v konfiguračním souboru.
disableUnlimited=§6Neomezené pokládání§c {0} §6bylo vypnuto pro hráče §c{1}§6.
discordbroadcastCommandDescription=Vyšle oznámení na zadaný kanál Discordu.
discordbroadcastCommandDescription=Oznámí zprávu do specifického Discord kanálu.
discordbroadcastCommandUsage=/<command> <kanál> <zpráva>
discordbroadcastCommandUsage1=/<command> <kanál> <zpráva>
discordbroadcastCommandUsage1Description=Odešle zprávu na zadaný kanál na Discordu
discordbroadcastInvalidChannel=§4Kanál na Discordu§c{0}§4 neexistuje.
discordbroadcastPermission=§4Nemáš oprávnění posílat zprávy na kanál §c{0}§4.
discordbroadcastSent=§6Zpráva odeslána na kanál §c{0}§6\!
discordbroadcastInvalidChannel=§4Discord kanál §c{0}§4 neexistuje.
discordbroadcastPermission=§4Nemáš oprávnění posílat zprávy do kanálu §c{0}§4.
discordbroadcastSent=§6Zpráva odeslána do kanálu §c{0}§6\!
discordCommandDescription=Zašle hráči pozvánku na Discord.
discordCommandLink=§6Připoj se k našemu Discord serveru na §c{0}§6\!
discordCommandUsage=/<command>
@@ -314,6 +314,7 @@ enderchestCommandUsage2=/<command> <hráč>
enderchestCommandUsage2Description=Otevře enderitovou truhlu daného hráče
errorCallingCommand=Chyba příkazu /{0}
errorWithMessage=§cChyba\:§4 {0}
essChatNoSecureMsg=EssentialsX Chat verze {0} nepodporuje na tomto serverovém softwaru zabezpečený chat. Aktualizujte EssentialsX, a pokud tento problém přetrvává, informujte vývojáře.
essentialsCommandDescription=Znovu načte EssentialsX.
essentialsCommandUsage=/<command>
essentialsCommandUsage1=/<command> reload
@@ -367,15 +368,15 @@ fileRenameError=Přejmenováni souboru {0} selhalo\!
fireballCommandDescription=Vrhá ohnivou kouli nebo jiné rozmanité projektily.
fireballCommandUsage=/<command> [fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident] [rychlost]
fireballCommandUsage1=/<command>
fireballCommandUsage1Description=Vystřelí obyčejnou ohnivou kouli z vaší polohy
fireballCommandUsage2=/<command> <fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident> [speed]
fireballCommandUsage1Description=Vystřelí obyčejnou ohnivou kouli z tvé polohy
fireballCommandUsage2=/<command> <fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident> [rychlost]
fireballCommandUsage2Description=Hodí specifikovaný projektil z vaší pozice s volitelnou rychlostí
fireworkColor=§4Vloženy neplatné parametry ohňostroje, nejprve musíš nastavit barvu.
fireworkCommandDescription=Umožňuje upravit stack rachejtlí.
fireworkCommandUsage=/<command> <<meta param>|power [množství]|clear|fire [množství]>
fireworkCommandUsage1=/<command> clear
fireworkCommandUsage1Description=Smaže všechny efekty z drženého ohňostroje
fireworkCommandUsage2=/<command> power <amount>
fireworkCommandUsage2=/<command> power <počet>
fireworkCommandUsage2Description=Nastaví sílu drženého ohňostroje
fireworkCommandUsage3=/<command> fire [amount]
fireworkCommandUsage3Description=Vypustí buď jednu, nebo zadaný počet rachejtlí držených v ruce
@@ -485,7 +486,7 @@ homeSet=§6Domov nastaven na tomto místě.
hour=hodina
hours=hodin
ice=§6Je ti dost zima...
iceCommandDescription=Zchladí hráče.
iceCommandDescription=Uklidní hráče.
iceCommandUsage=/<command> [hráč]
iceCommandUsage1=/<command>
iceCommandUsage1Description=Zchladí tě
@@ -588,8 +589,8 @@ jailAlreadyIncarcerated=§4Tento hráč již úpí ve vězení\:§c {0}
jailList=§6Vězení\:§r {0}
jailMessage=§4Provinil ses, tak teď musíš pykat.
jailNotExist=§4Toto vězení neexistuje.
jailNotifyJailed=§6Hráč§c{0} §6uvězněn hráčem §c{1}§6.
jailNotifyJailedFor=§6Hráč§c {0} §6uvězněn za§c {1}§6hráčem §c{2}§6.
jailNotifyJailed=§6Hráč§c {0} §6uvězněn hráčem §c{1}§6.
jailNotifyJailedFor=§6Hráč§c {0} §6uvězněn za§c {1}§6 hráčem §c{2}§6.
jailNotifySentenceExtended=§6Uvěznění hráče§c{0} §6bylo hráčem §c{2}§6 prodlouženo na §c{1} §6.
jailReleased=§6Hráč §c{0}§6 byl propuštěn na svobodu.
jailReleasedPlayerNotify=§6Byl jsi propuštěn na svobodu\!
@@ -669,7 +670,7 @@ listGroupTag=§6/{0}§r\:
listHiddenTag=§7[SKRYTÝ]§r
listRealName=({0})
loadWarpError=§4Nepodařilo se načíst warp {0}.
localFormat=[L]<{0}> {1}
localFormat=§3[L] §r<{0}> {1}
loomCommandDescription=Otevře tkalcovský stav.
loomCommandUsage=/<command>
mailClear=§6Zprávy vymažeš příkazem §c/mail clear§6.
@@ -680,7 +681,7 @@ mailCommandUsage=/<command> [read|clear|clear [počet]|send [adresát] [zpráva]
mailCommandUsage1=/<command> read [strana]
mailCommandUsage1Description=Čte první (nebo zadanou) stránku e-mailu
mailCommandUsage2=/<command> clear [počet]
mailCommandUsage2Description=Vymaže buď všechny, nebo jen zadaný mail
mailCommandUsage2Description=Vymaže buď všechny, nebo jen specifický mail
mailCommandUsage3=/<command> send <hráč> <zpráva>
mailCommandUsage3Description=Odešle zadanému hráči danou zprávu
mailCommandUsage4=/<command> sendall <zpráva>
@@ -778,6 +779,7 @@ nearCommandUsage3Description=Vypíše všechny hráče nebo specifického hráč
nearCommandUsage4=/<command> <hráč> <poloměr>
nearCommandUsage4Description=Vypíše všechny hráče nebo specifického hráče kolem tebe v daném poloměru
nearbyPlayers=§6Hráči v okolí\:§r {0}
nearbyPlayersList={0}§f(§c{1} m§f)
negativeBalanceError=§4Hráč nemůže mít záporný zůstatek.
nickChanged=§6Přezdívka změněna.
nickCommandDescription=Změní tvou přezdívku nebo přezdívku jiného hráče.
@@ -831,8 +833,9 @@ noPlacePermission=§4Nemáš oprávnění pokládat bloky poblíž této cedule.
noPotionEffectPerm=§4Nemáš oprávnění používat u tohoto lektvaru účinek §c{0}§4.
noPowerTools=§6Nemáš přiřazen žádný výkonný nástroj.
notAcceptingPay=§4{0} §4nepřijímá platby.
notAllowedToQuestion=§4Nemáš oprávnění používat funkci otázky.
notAllowedToShout=§4Nemáš oprávnění používat funkci halekání.
notAllowedToLocal=§4Nemáš oprávnění mluvit v místním chatu.
notAllowedToQuestion=§4Nemáš oprávnění položit dotaz.
notAllowedToShout=§4Nemáš oprávnění k hlučnému módu.
notEnoughExperience=§4Nemáš dostatek zkušeností.
notEnoughMoney=§4Nemáš dost prostředků.
notFlying=nelétá
@@ -898,7 +901,7 @@ playtimeCommandUsage1Description=Zobrazí tvůj čas strávený ve hře
playtimeCommandUsage2=/<command> <hráč>
playtimeCommandUsage2Description=Zobrazí pro zadaného hráče čas strávený ve hře
playtime=§6Odehráno\:§c {0}
playtimeOther=§6Hráč {1} odehrál§6\:§c {0}
playtimeOther=§6Hráč {1} §6odehrál\:§c {0}
pong=Pong\!
posPitch=§6Sklon\: {0} (Úhel náklonu hlavy)
possibleWorlds=§6Možné světy jsou očíslované v rozmezí §c0§6 až §c{0}§6.
@@ -1022,14 +1025,17 @@ replyLastRecipientDisabledFor=§6Odpovídání poslednímu příjemci §cvypnuto
replyLastRecipientEnabled=§6Odpovídání poslednímu příjemci §czapnuto§6.
replyLastRecipientEnabledFor=§6Odpovídání poslednímu příjemci §czapnuto §6proa §c{0}§6.
requestAccepted=§6Zadost o teleport prijata.
requestAcceptedAll=§6Přijato §c{0} §6žádostí o teleportování.
requestAcceptedAuto=§6Automaticky přijata žádost o teleportování od {0}.
requestAcceptedFrom=§6Hráč §c{0} §6přijal tvou žádost o teleportování.
requestAcceptedFromAuto=§6Hráč §c{0} §6automaticky přijal tvou žádost o teleportování.
requestDenied=§6Žádost o teleportování odmítnuta.
requestDeniedAll=§6Odmítnuto §c{0} §6žádostí o teleportování.
requestDeniedFrom=§6Hráč §c{0} §6odmítl tvou žádost o teleportování.
requestSent=§6Žádost odeslána hráči §c{0}§6.
requestSentAlready=§4Žádost o teleportování byla hráči §c{0}§4 už poslána.
requestTimedOut=§4Žádost o teleportování vypršela.
requestTimedOutFrom=§4Žádost o teleportování od §c{0} §4vypršela.
resetBal=§6Stav účtu všech připojených hráčů byl obnoven na §c{0}§6.
resetBalAll=§6Stav účtu všech hráčů byl obnoven na §c{0}§6.
rest=§6Cítíš se dobře odpočatý.
@@ -1058,11 +1064,11 @@ sellCommandDescription=Prodá předmět, který je právě v ruce.
sellCommandUsage=/<příkaz> <<jméno předmětu>|<id>|hand|inventory|blocks> [množství]
sellCommandUsage1=/<command> <jméno předmětu> [množství]
sellCommandUsage1Description=Prodá všechny (nebo daný počet, pokud je specifikován) dané předměty z tvého inventáře
sellCommandUsage2=/<command> hand [množství]
sellCommandUsage2=/<command> hand [počet]
sellCommandUsage2Description=Prodá všechny (nebo daný počet, pokud je specifikován) předměty, které máš v ruce
sellCommandUsage3=/<příkaz> all
sellCommandUsage3Description=Prodá úplně všechny předměty ve tvém inventáři
sellCommandUsage4=/<command> blocks [množství]
sellCommandUsage4=/<command> blocks [počet]
sellCommandUsage4Description=Prodá všechny (nebo daný počet, pokud je specifikován) bloky z tvého inventáře
sellHandPermission=§6Nemáš oprávnění prodávat z ruky.
serverFull=Server je plný\!
@@ -1071,8 +1077,9 @@ serverTotal=§6Server celkem\:§c {0}
serverUnsupported=Používáte nepodporovanou verzi serveru\!
serverUnsupportedClass=Třída určující stav\: {0}
serverUnsupportedCleanroom=Používáte server, jenž nepodporuje plně Bukkit pluginy spoléhající na interní Mojang kód. Zvažte použití náhrady Essentials podporující váš serverový software.
serverUnsupportedDangerous=Máte verzi serveru, o níž je známo, že je velmi nebezpečná a může vést ke ztrátě dat. Důrazně doporučujeme změnit vaši verzi serveru na stabilnější a plynulejší serverový software, jako například Paper nebo Tuinity.
serverUnsupportedDangerous=Máte verzi serveru, o níž je známo, že je velmi nebezpečná a může vést ke ztrátě dat. Důrazně doporučujeme změnit vaši verzi serveru na stabilnější serverový software, jako například Paper.
serverUnsupportedLimitedApi=Používáte server s omezenou funkčností API. EssentialsX bude stále fungovat, ale některé funkce mohou být zakázány.
serverUnsupportedDumbPlugins=Používáš zásuvné moduly, o nichž je známo, že způsobují vážné problémy s EssentialsX a dalšími zásuvnými moduly.
serverUnsupportedMods=Používáte server, který nepodporuje Bukkit pluginy. Bukkit pluginy by se neměly používat s Forge/Fabric módy\! Pro Forge módy zvažte použití ForgeEssentials nebo SpongeForge + Nucleus.
setBal=§aStav tvého účtu byl nastaven na {0}.
setBalOthers=§aNastavil jsi stav účtu hráče {0}§a na {1}.
@@ -1289,10 +1296,14 @@ tpacancelCommandUsage1=/<command>
tpacancelCommandUsage1Description=Zruší všechny tvoje nevyřízené žádosti o teleportaci
tpacancelCommandUsage2=/<command> <hráč>
tpacancelCommandUsage2Description=Zruší všechny tvoje nevyřízené žádosti o teleportaci na určitého hráče
tpacceptCommandDescription=Přijme žádost o teleportování.
tpacceptCommandUsage=/<command> [jiný_hráč]
tpacceptCommandUsage1=/<command>
tpacceptCommandUsage1Description=Přijme nejnovější žádost o teleportování
tpacceptCommandUsage2=/<command> <hráč>
tpacceptCommandUsage2Description=Přijme žádost o teleportování od zadaného hráče
tpacceptCommandUsage3=/<command> *
tpacceptCommandUsage3Description=Přijme všechny žádosti o teleportování
tpahereCommandDescription=Požádej, aby se hráč teleportoval k tobě.
tpahereCommandUsage=/<command> <hráč>
tpahereCommandUsage1=/<command> <hráč>
@@ -1305,10 +1316,14 @@ tpautoCommandDescription=Automaticky přijímat žádosti o teleportaci.
tpautoCommandUsage=/<command> [hráč]
tpautoCommandUsage1=/<command> [hráč]
tpautoCommandUsage1Description=Přepne automatický příjem tpa žádostí pro tebe nebo jiného hráče, pokud je uveden
tpdenyCommandDescription=Odmítne žádost o teleportování.
tpdenyCommandUsage=/<command>
tpdenyCommandUsage1=/<command>
tpdenyCommandUsage1Description=Odmítne nejnovější žádost o teleportování
tpdenyCommandUsage2=/<command> <hráč>
tpdenyCommandUsage2Description=Odmítne žádost o teleportování od určeného hráče
tpdenyCommandUsage3=/<command> *
tpdenyCommandUsage3Description=Odmítne všechny žádosti o teleportování
tphereCommandDescription=Teleportuje hráče k tobě.
tphereCommandUsage=/<command> <hráč>
tphereCommandUsage1=/<command> <hráč>
@@ -1505,11 +1520,11 @@ worthCommandDescription=Vypočte hodnotu předmětů v ruce nebo předmětů zad
worthCommandUsage=/<command> <<název_předmětu>|<id>|hand|inventory|blocks> [-][počet]
worthCommandUsage1=/<command> <jméno předmětu> [množství]
worthCommandUsage1Description=Spočítá hodnotu všech (nebo daného množství, pokud je uvedeno) daných předmětů ve tvém inventáři
worthCommandUsage2=/<command> hand [množství]
worthCommandUsage2=/<command> hand [počet]
worthCommandUsage2Description=Spočítá hodnotu všech (nebo daného množství, pokud je uvedeno) držených předmětů
worthCommandUsage3=/<příkaz> all
worthCommandUsage3Description=Spočítá hodnotu úplně všech předmětů ve tvém inventáři
worthCommandUsage4=/<command> blocks [množství]
worthCommandUsage4=/<command> blocks [počet]
worthCommandUsage4Description=Spočítá hodnotu všech (nebo daného množství, pokud je uvedeno) bloků ve tvém inventáři
worthMeta=§aStack {0} s metadaty {1} ceny §c{2}§a ({3} kus(u) za {4} kus)
worthSet=§6Cena nastavena
@@ -75,7 +75,6 @@ cantGamemode=§4You do not have permission to change to gamemode {0}
cantReadGeoIpDB=Fejl ved læsning af GeoIP databasen\!
cantSpawnItem=§4Du har ikke tilladelse til at spawne denne ting§c {0}§4.
cartographytableCommandDescription=Åbner en kartografisk tabel.
chatTypeLocal=[L]
chatTypeSpy=[Spion]
cleaned=Brugerfiler blev renset.
cleaning=Renser brugerfiler.
@@ -298,7 +297,6 @@ listAmountHidden=§6Der er §c{0}§6/§c{1}§6 ud af maksimum §c{2}§6 spillere
listGroupTag=§6{0}§r\:
listHiddenTag=§7[SKJULT]§r
loadWarpError=§4Kunne ikke indlæse warp {0}.
localFormat=[L]<{0}> {1}
mailClear=§6For at markere alt post som læst, skriv§c /mail clear§6.
mailCleared=§6Mail Ryddet\!
mailDelay=For mange mails er blevet sendt inden for det sidste minut. Maksimum\: {0}
@@ -391,8 +389,6 @@ noPlacePermission=§4Du har ikke tilladelse til at placere en blok i nærheden a
noPotionEffectPerm=§4Du har ikke tilladelse til at tilføje effekten §c{0} §4til denne eliksir.
noPowerTools=§6Du har ingen magtværktøjer tildelt.
notAcceptingPay=§4{0} §4is not accepting payment.
notAllowedToQuestion=§4Du er ikke autoriseret til at bruge spørgsmål.
notAllowedToShout=§4Du er ikke autoriseret til at råbe.
notEnoughExperience=§4Du har ikke nok experience.
notEnoughMoney=§4Du har ikke tilstrækkelige midler.
notFlying=flyver ikke
@@ -9,7 +9,7 @@ adventure=Abenteuermodus
afkCommandDescription=Markiert dich als abwesend.
afkCommandUsage=/<command> [spieler/nachricht...]
afkCommandUsage1=/<command> [nachricht]
afkCommandUsage1Description=Schaltet deinen AFK Status mit einem optionalen Grund ein
afkCommandUsage1Description=Schaltet deinen AFK-Status mit einem optionalen Grund um
afkCommandUsage2=/<command> <player> [message]
afkCommandUsage2Description=Schaltet den AFK Status des angegebenen Spielers mit einem optionalen Grund ein
alertBroke=zerstört\:
@@ -126,7 +126,7 @@ cantReadGeoIpDB=Fehler beim Einlesen der GeoIP-Datenbank\!
cantSpawnItem=§4Du darfst Gegenstand§c {0}§4 nicht erzeugen.
cartographytableCommandDescription=Öffnet einen Kartentisch.
cartographytableCommandUsage=/<command>
chatTypeLocal=[L]
chatTypeLocal=§[L]
chatTypeSpy=[Spion]
cleaned=Spielerdateien geleert.
cleaning=Säubere Spielerdateien.
@@ -234,8 +234,17 @@ disabled=deaktiviert
disabledToSpawnMob=§4Das Spawnen dieses Mobs ist in der Config deaktiviert.
disableUnlimited=Unbegrenztes Platzieren von§c {0}§6 für§c {1}§6 deaktiviert.
discordbroadcastCommandDescription=Sendet eine Nachricht an den angegebenen Discord-Kanal.
discordbroadcastCommandUsage=/<command> <channel> <msg>
discordbroadcastCommandUsage1=/<command> <channel> <msg>
discordbroadcastCommandUsage1Description=Sendet eine Nachricht an den angegebenen Discord-Kanal
discordbroadcastInvalidChannel=§4Discord Kanal §c{0}§4 existiert nicht.
discordbroadcastPermission=§4Du hast keine Berechtigung, Nachrichten an den angegebenen §c{0}§4 Kanal zu senden.
discordbroadcastSent=§6Nachricht gesendet an §c{0}§6\!
discordCommandDescription=Sendet die Discord Einladungslink an den Spieler.
discordCommandLink=§6Trete unserem Discord Server bei §c{0}§\!
discordCommandUsage=/<command>
discordCommandUsage1=/<command>
discordCommandUsage1Description=Sendet die Discord Einladungslink an den Spieler
discordCommandExecuteDescription=Führt einen Konsolen-Befehl auf dem Minecraft-Server aus.
discordCommandExecuteArgumentCommand=Der auszuführende Befehl
discordCommandExecuteReply=Führe Befehl aus\: "/{0}"
@@ -252,6 +261,8 @@ discordErrorLoggerNoPerms=Discord Konsolen-Logger wurde aufgrund unzureichenden
discordErrorNoGuild=Ungültige oder fehlende Server-ID\! Bitte folgen Sie dem Tutorial in der Konfiguration, um das Plugin einzurichten.
discordErrorNoGuildSize=Ihr Bot ist in keinem Server\! Bitte folgen Sie dem Tutorial in der Konfiguration, um das Plugin einzurichten.
discordErrorNoPerms=Dein Bot kann in keinem Kanal sehen oder sprechen\! Bitte stelle sicher, dass dein Bot Lese- und Schreibrechte in allen Kanälen besitzt, die du verwenden möchtest.
discordErrorNoPrimary=Sie haben keinen Primärkanal definiert oder Ihr Primärkanal ist ungültig. Zurückgesetzt auf den Standardkanal\: \#{0}.
discordErrorNoPrimaryPerms=Dein Bot kann nicht in deinem Primärkanal \#{0} sprechen. Bitte stelle sicher, dass dein Bot Lese- und Schreibrechte in allen Kanälen besitzt, die du verwenden möchtest.
discordErrorNoToken=Kein Token bereitgestellt\! Bitte folgen Sie dem Tutorial in der Konfiguration, um das Plugin einzurichten.
discordErrorWebhook=Beim Senden von Nachrichten an Ihren Konsolenkanal ist ein Fehler aufgetreten\! Dies wurde wahrscheinlich durch das versehentliche Löschen Ihres Webhook der Konsole verursacht. Dies kann üblicherweise durch das Überprüfen der "Manage Webhooks"-Berechtigung und dem Ausführen von "/ess reload" behoben werden.
discordLoggingIn=Versuche sich bei Discord anzumelden...
@@ -264,16 +275,31 @@ disposalCommandUsage=/<command>
distance=§6Entfernung\: {0}
dontMoveMessage=§6Teleportvorgang startet in §c{0}§6. Eine Bewegung bricht die Teleportation ab.
downloadingGeoIp=GeoIP-Datenbank wird geladen... Das kann einen Moment in Anspruch nehmen. (country\: 1.7 MB, city\: 30MB)
dumpConsoleUrl=Ein Server Dump wurde erstellt\: §c{0}
dumpCreating=§6Erstelle Serverdump...
dumpDeleteKey=§6Wenn du diesen Speicherstand zu einem späteren Zeitpunkt löschen möchtest, benutze folgende Lösch-Taste\: §c{0}
dumpError=§4Fehler beim Erstellen des Speicherstands §c{0}§4.
dumpErrorUpload=§4Fehler beim Hochladen §c{0}§4\: §c{1}
dumpUrl=§6Serverdump\: §c{0} erstellt
duplicatedUserdata=Duplizierte Benutzerdaten\: {0} und {1}.
durability=§6Dieses Werkzeug kann noch §c{0}§6 mal benutzt werden.
east=O
ecoCommandDescription=Verwaltet die Sever-Wirtschaft.
ecoCommandUsage=/<command> <give|take|set|reset> <spieler> <anzahl>
ecoCommandUsage1=/<command> give <player> <amount>
ecoCommandUsage1Description=Gibt dem angegebenen Spieler den angegebenen Betrag an Geld
ecoCommandUsage2=/<command> take <player> <amount>
ecoCommandUsage2Description=Nimmt den angegebenen Geldbetrag vom angegebenen Spieler
ecoCommandUsage3=<command> set <player><amount>
ecoCommandUsage3Description=Setzt den angegebenen Spieler für die angegebene Anzahl von Sekunden in Brand
ecoCommandUsage4=<command> set <player><amount>
ecoCommandUsage4Description=Setzt den Guthaben des angegebenen Spielers auf den Startsaldo des Servers zurück
editBookContents=§eDu darfst den Inhalt dieses Buches jetzt bearbeiten.
enabled=aktiviert
enchantCommandDescription=Verzaubert den Gegenstand, den ein Benutzer hält.
enchantCommandUsage=/<command> <verzauberungsname> [level]
enchantCommandUsage1=/<command> <enchantment name> [level]
enchantCommandUsage1Description=Verzaubert deinen gehaltenen Gegenstand mit der angegebenen Verzauberung auf eine optionale Stufe
enableUnlimited=§6Du gibst §c{1}§6 eine unbegrenzte Menge an§c {0} §6.
enchantmentApplied=§6Der Gegenstand in deiner Hand wurde mit§c {0} §6verzaubert.
enchantmentNotFound=§4Verzauberung nicht gefunden\!
@@ -285,27 +311,47 @@ enderchestCommandUsage=/<command> [spieler]
enderchestCommandUsage1=/<command>
enderchestCommandUsage1Description=Öffnet deine Enderkiste
enderchestCommandUsage2=/<command> <spieler>
enderchestCommandUsage2Description=Öffnet die Enderkiste des Spielers deiner Wahl
errorCallingCommand=Beim Aufrufen des Befehls {0} ist ein Fehler aufgetreten.
errorWithMessage=§cFehler\:§4 {0}
essChatNoSecureMsg=EssentialsX Chat Version {0} unterstützt keinen sicheren Chat mit dieser Server-Software. Aktualisieren Sie EssentialsX, und wenn dieses Problem weiterhin besteht, informieren Sie die Entwickler.
essentialsCommandDescription=Lädt Essentials neu.
essentialsCommandUsage=/<command>
essentialsCommandUsage1=/<command> reload
essentialsCommandUsage1Description=Lädt die Konfiguration von Essentials neu
essentialsCommandUsage2=/<command> version
essentialsCommandUsage2Description=Gibt Informationen über die Essentials Version
essentialsCommandUsage3=/<command> commands
essentialsCommandUsage3Description=Gibt Informationen darüber, welche Befehle von Essentials weitergeleitet werden
essentialsCommandUsage4=/<command> debug
essentialsCommandUsage4Description=Schaltet in den Essentials "Debug-Modus" um
essentialsCommandUsage5=/<command> reset <player>
essentialsCommandUsage5Description=Setzt die Benutzerdaten des angegebenen Spielers zurück
essentialsCommandUsage6=/<command> cleanup
essentialsCommandUsage6Description=Löscht alte Benutzerdaten
essentialsCommandUsage7=/<command> homes
essentialsCommandUsage7Description=Verwaltet Homes von Spielern
essentialsCommandUsage8=/<command> dump [all] [config] [discord] [kits] [log]
essentialsCommandUsage8Description=Erzeugt einen Server-Dump mit den angeforderten Daten
essentialsHelp1=Die Datei ist beschädigt und Essentials kann sie nicht öffnen. Essentials ist jetzt deaktiviert. Wenn du die Datei selbst nicht reparieren kannst, gehe auf http\://tiny.cc/EssentialsChat
essentialsHelp2=Die Datei ist beschädigt und Essentials kann sie nicht öffnen. Essentials ist jetzt deaktiviert. Wenn du die Datei selbst nicht reparieren kannst, versuche /essentialshelp oder gehe auf http\://tiny.cc/EssentialsChat
essentialsReload=§6Essentials wurde neu geladen§c {0}.
exp=§c{0} §6hat§c {1} §6Exp (Level§c {2}§6) und braucht§c {3} §6Punkte für das nächste Level.
expCommandDescription=Gebe, setze, setze zurück, oder schaue die Erfahrung eines Spielers an.
expCommandUsage=/<command> [reset|show|set|give] [spielername [anzahl]]
expCommandUsage1=/<command> give <player> <amount>
expCommandUsage1Description=Gibt dem angegebenen Spieler den angegebenen Betrag an Geld
expCommandUsage2=/<command> set <playername> <amount>
expCommandUsage2Description=Gibt dem angegebenen Spieler den angegebenen Betrag an Geld
expCommandUsage3=/<command> show <playername>
expCommandUsage4Description=Zeigt die XP-Punkte des Zielspielers an
expCommandUsage5=/<command> reset <playername>
expCommandUsage5Description=Setzt die XP des Zielspielers auf 0 zurück
expSet=§c{0} §6hat jetzt§c {1} §6Exp.
extCommandDescription=Spieler auslöschen.
extCommandUsage=/<command> [spieler]
extCommandUsage1=/<command> [spieler]
extCommandUsage1Description=Lösche dich oder andere Spieler, falls angebeben
extinguish=§6Du hast dich selbst gelöscht.
extinguishOthers=§6Du hast {0}§6 gelöscht.
failedToCloseConfig=Schließen der Config fehlgeschlagen {0}.
@@ -323,11 +369,22 @@ fireballCommandDescription=Werfe einen Feuerball oder andere verschiedene Projek
fireballCommandUsage=/<command> [fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident] [Geschwindigkeit]
fireballCommandUsage1=/<command>
fireballCommandUsage1Description=Wirft einen regulären Feuerball von deinem Standort aus
fireballCommandUsage2=/<command> <fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident> [speed]
fireballCommandUsage2Description=Wirft das gewählte Projektil von deinem Standort, ggf. mit einer bestimmten Geschwindigkeit
fireworkColor=§4Ungültige Feuerwerksparameter angegeben. Du musst zuerst eine Farbe festlegen.
fireworkCommandDescription=Erlaubt dir, einen Feuerwerks-Stapel zu modifizieren.
fireworkCommandUsage=/<command> <<meta parameter>|power [anzahl]|clear|fire [anzahl]>
fireworkCommandUsage1=/<command> clear
fireworkCommandUsage1Description=Löscht alle Effekte von deinem gehaltenen Feuerwerk
fireworkCommandUsage2=/<command> power <amount>
fireworkCommandUsage2Description=Ändert die Stärke des in der Hand gehaltenen Feuerwerks
fireworkCommandUsage3=/<command> fire [amount]
fireworkCommandUsage4=/<command> <meta>
fireworkCommandUsage4Description=Fügt den Effekt dem gerade in der Hand gehaltenen Feuerwerk hinzu
fireworkEffectsCleared=§6Alle Effekte wurden vom Stapel, den du in der Hand hast, entfernt.
fireworkSyntax=§6Feuerwerk-Parameter\:§c color\:<Farbe> [fade\:<Farbe>] [shape\:<Form>] [effect\:<Effekt>]\n§6Um mehrere Farben/Effekte zu benutzen, musst du sie mit Komma trennen\: §cred,blue,pink\n§6Formen\:§c star, ball, large, creeper, burst §6Effekte\:§c trail, twinkle.
fixedHomes=Ungültige Homes gelöscht.
fixingHomes=Ungültige homes werden gelöscht...
flyCommandDescription=Abheben, in die Höhe\!
flyCommandUsage=/<command> [spieler] [on|off]
flyCommandUsage1=/<command> [spieler]
@@ -355,6 +412,7 @@ getposCommandUsage1=/<command> [spieler]
giveCommandDescription=Gebe einem Spieler einen Gegenstand.
giveCommandUsage=/<command> <spieler> <gegenstand|numerisch> [anzahl [gegenstandsmeta...]]
giveCommandUsage1=/<command> <player> <item> [amount]
giveCommandUsage2=/<command> <player> <item> <amount> <meta>
geoipCantFind=§6Spieler§c {0}§6 kommt aus§a einem unbekannten Land§6.
geoIpErrorOnJoin=GeoIP-Daten für {0} konnten nicht abgerufen werden. Bitte stelle sicher, dass der Lizenzschlüssel und die Konfiguration korrekt sind.
geoIpLicenseMissing=Kein Lizenzschlüssel gefunden\! Bitte besuche https\://essentialsx.net/geoip für Ersteinrichtungsanweisungen.
@@ -377,6 +435,9 @@ hatArmor=§4Du kannst diesen Gegenstand nicht als Hut verwenden\!
hatCommandDescription=Erhalte cooles neues Kopfgerät.
hatCommandUsage=/<command> [remove]
hatCommandUsage1=/<command>
hatCommandUsage1Description=Setzt deinen Hut auf dein aktuell gehaltenes Item
hatCommandUsage2=/<command> remove
hatCommandUsage2Description=Entfernt deinen aktuellen Hut
hatCurse=§4Du kannst keinen Hut mit dem Fluch der Bindung entfernen\!
hatEmpty=§4Du trägst keinen Hut.
hatFail=§4Du musst einen Gegenstand in der Hand halten.
@@ -387,6 +448,7 @@ heal=§6Du wurdest geheilt.
healCommandDescription=Heilt dich oder den gegebenen Spieler.
healCommandUsage=/<command> [spieler]
healCommandUsage1=/<command> [spieler]
healCommandUsage1Description=Heilt dich oder einen anderen Spieler, wenn angegeben
healDead=§4Du kannst keine Toten heilen\!
healOther=§c{0}§6 wurde geheilt.
helpCommandDescription=Zeigt eine Liste an verfügbaren Befehlen an.
@@ -400,6 +462,7 @@ helpPlugin=§4{0}§r\: Plugin-Hilfe\: /help {1}
helpopCommandDescription=Benachrichtige verfügbare Admins.
helpopCommandUsage=/<command> <nachricht>
helpopCommandUsage1=/<command> <nachricht>
helpopCommandUsage1Description=Sendet die gegebene Nachricht an alle Admins, die gerade online sind
holdBook=§4Du hast kein beschreibbares Buch in deiner Hand.
holdFirework=§4Damit du einen Effekt hinzufügen kannst, musst du ein Feuerwerk in deiner Hand halten.
holdPotion=§4Damit du dem Trank einem Effekt geben kannst, musst du ihn zuerst in der Hand halten.
@@ -413,9 +476,16 @@ homeConfirmation=§6Du hast schon ein Zuhause mit dem Namen §c{0}§6\!\nUm dein
homeSet=§6Zuhause auf aktuellen Standort gesetzt.
hour=Stunde
hours=Stunden
ice=§6Du fühlst dich viel kälter...
iceCommandDescription=Erfriert jemanden.
iceCommandUsage=/<command> [spieler]
iceCommandUsage1=/<command>
iceCommandUsage1Description=Erfriert dich
iceCommandUsage2=/<command> <spieler>
iceCommandUsage2Description=Erfriert den Spieler
iceCommandUsage3=/<command> *
iceCommandUsage3Description=Erfriert alle Spieler, die gerade online sind
iceOther=§6Erfriere§c {0}§6.
ignoreCommandDescription=Andere Spieler nicht ignorieren oder ignorieren.
ignoreCommandUsage=/<command> <spieler>
ignoreCommandUsage1=/<command> <spieler>
@@ -453,16 +523,22 @@ inventoryClearingStack=§c{0} {1}§6 von§c {2} §6entfernt.
invseeCommandDescription=Zeige das Inventar anderer Spieler an.
invseeCommandUsage=/<command> <spieler>
invseeCommandUsage1=/<command> <spieler>
invseeCommandUsage1Description=Öffnet das Inventar des angegebenen Spielers
is=ist
isIpBanned=§6IP §c{0} §6ist gesperrt.
internalError=§cBeim ausführen des Befehls ist ein interner Fehler aufgetreten.
itemCannotBeSold=§4Dieser Gegenstand kann nicht an den Server verkauft werden.
itemCommandDescription=Einen Gegenstand erschaffen.
itemCommandUsage=/<command> <gegenstand|numerische> [anzahl [gegenstandsmeta...]]
itemCommandUsage1=/<befehl <gegenstand> [anzahl]
itemCommandUsage1Description=Gibt dir einen vollständigen Stack (oder die angegebene Anzahl) des angegebenen Gegenstands
itemCommandUsage2=/<command> <item> <amount> <meta>
itemCommandUsage2Description=Gibt die angegebe Menge des ausgewählten Items mit den gegebenen Metadaten
itemId=§6ID\:§c {0}
itemloreClear=§6Du hast die Beschreibung dieses Gegenstands geleert.
itemloreCommandDescription=Die Beschreibung eines Gegenstand bearbeiten.
itemloreCommandUsage=/<command> <add/set/clear> [text/zeile] [text]
itemloreCommandUsage3=/<command> clear
itemloreInvalidItem=§4Du must einen Gegenstand halten um seine Beschreibung zu bearbeiten.
itemloreNoLine=§4Dein gehaltener Gegenstand hat keinen Beschreibungstect in Zeile §c{0}§4.
itemloreNoLore=§4Dein gehaltener Gegenstand hat keinen Beschreibungstext.
@@ -474,7 +550,9 @@ itemnameClear=§6Du hast den Namen dieses Gegenstands entfernt.
itemnameCommandDescription=Bennent einen Gegenstand.
itemnameCommandUsage=/<command> [Name]
itemnameCommandUsage1=/<command>
itemnameCommandUsage1Description=Löscht den Namen des gehaltenen Gegenstands
itemnameCommandUsage2=/<command> <name>
itemnameCommandUsage2Description=Setzt den Namen des gehaltenen Gegenstands zu dem gegebenen Text
itemnameInvalidItem=§cDu musst ein Item halten, um es umzubenennen.
itemnameSuccess=§Du hast dein gehaltenes Item zu "§c{0}§6" umbenannt.
itemNotEnough1=§4Du hast nicht genug Gegenstände zu verkaufen.
@@ -491,14 +569,17 @@ itemType=§6Gegenstand\:§c {0} §6
itemdbCommandDescription=Sucht einen Gegenstand.
itemdbCommandUsage=/<command> <gegenstand>
itemdbCommandUsage1=/<command> <gegenstand>
itemdbCommandUsage1Description=Sucht die Item-Datenbank nach gesuchtem Item
jailAlreadyIncarcerated=§4Spieler ist bereits im Gefängnis\:§c {0}
jailList=§6Gefängnisse\:§r {0}
jailMessage=§4Du hast ein Verbrechen begangen, also musst du deine Zeit absitzen.
jailNotExist=§4Dieses Gefängnis existiert nicht.
jailNotifyJailed=§6Player§c {0} §6wurde in den Knast gesteckt von §c{1}.
jailReleased=§6Spieler §c{0}§6 wurde freigelassen.
jailReleasedPlayerNotify=§6Du wurdest freigelassen\!
jailSentenceExtended=§6Gefängniszeit erweitert auf\: {0}
jailSet=§6Gefängnis§c {0} §6wurde erstellt.
jailWorldNotExist=§4Die Welt dieses Gefängnisses existiert nicht.
jumpEasterDisable=§6Fliegender Magier-Modus deaktiviert.
jumpEasterEnable=§6Fliegender Magier-Modus aktiviert.
jailsCommandDescription=Alle Gefängnisse auflisten.
@@ -509,21 +590,26 @@ jumpError=§4Das würde deinen Computer überlasten.
kickCommandDescription=Wirft den spezifizierten Spieler mit einem Grund hinaus.
kickCommandUsage=/<command> <spieler> [grund]
kickCommandUsage1=/<command> <spieler> [grund]
kickCommandUsage1Description=Kickt den Spieler, optional mit Begründung
kickDefault=Du wurdest vom Server geworfen.
kickedAll=§4Alle Spieler wurden vom Server geworfen.
kickExempt=§4Du kannst diesen Spieler nicht hinauswerfen.
kickallCommandDescription=Wirft alle Spieler aus dem Sever raus, außer dem Aussteller.
kickallCommandUsage=/<command> [grund]
kickallCommandUsage1=/<command> [grund]
kickallCommandUsage1Description=Kickt den Spieler, optional mit Begründung
kill=§c{0} §6getötet.
killCommandDescription=Tötetet angegebenen Spieler.
killCommandUsage=/<command> <spieler>
killCommandUsage1=/<command> <spieler>
killCommandUsage1Description=Tötetet angegebenen Spieler
killExempt=§4Du kannst §c{0}§4 nicht töten.
kitCommandDescription=Erhät das angegebene Kit oder zeigt alle verfügbaren Kits.
kitCommandUsage=/<command> [kit] [spieler]
kitCommandUsage1=/<command>
kitCommandUsage1Description=Zeigt alle verfügbaren Kits
kitCommandUsage2=/<command> <kit> [player]
kitCommandUsage2Description=Gibt dir, oder einem angegebenen Spieler, das ausgewählt Kit
kitContains=§6Ausrüstung §c{0} §6enthält\:
kitCost=\ §7§o({0})§r
kitDelay=§m{0}§r
@@ -548,6 +634,7 @@ leatherSyntax=§6Lederfarben-Syntax\:§c color\:<rot>,<grün>,<blau>, z.B.\: col
lightningCommandDescription=Die Kraft von Thor. Schlag auf den Cursor oder Spieler.
lightningCommandUsage=/<command> [spieler] [kraft]
lightningCommandUsage1=/<command> [spieler]
lightningCommandUsage2=/<command> <player> <power>
lightningSmited=§6Du wurdest gepeinigt.
lightningUse=§6Peinige §c{0}
listAfkTag=§7[Abwesend]§r
@@ -558,13 +645,22 @@ listCommandUsage=/<command> [Gruppe]
listCommandUsage1=/<command> [Gruppe]
listGroupTag=§6{0}§r\:
listHiddenTag=§7[Versteckt]§r
listRealName=({0})
loadWarpError=§4Beim Laden von Warp-Punkt §c{0}§6 ist ein Fehler aufgetreten.
localFormat=[L]<{0}> {1}
loomCommandDescription=Öffnet einen Webstuhl.
loomCommandUsage=/<command>
mailClear=§6Um deine Nachrichten zu löschen, schreibe§c /mail clear.
mailCleared=§6Nachrichten wurden gelöscht\!
mailClearIndex=§4Du musst eine Zahl zwischen 1-{0} angeben.
mailCommandDescription=Verwaltet inter-spieler, intra-server Nachrichten.
mailCommandUsage=/<command> [read|clear|clear [number]|send [to] [message]|sendtemp [to] [expire time] [message]|sendall [message]]
mailCommandUsage1=/<command> read [page]
mailCommandUsage2=/<command> clear [number]
mailCommandUsage3=/<command> send <player> <message>
mailCommandUsage4=/<command> sendall <message>
mailCommandUsage4Description=Sendet die Nachricht an alle Spieler
mailCommandUsage5=/<command> sendtemp <player> <expire time> <message>
mailCommandUsage6=/<command> sendtempall <expire time> <message>
mailDelay=In der letzten Minute wurden zu viele Nachrichten gesendet. Maximum\: {0}
mailFormat=§6[§r{0}§6] §r{1}
mailMessage={0}
@@ -634,6 +730,7 @@ muteNotifyReason=§c{0} §6hat Spieler§c {1}§6 stummgeschaltet. Grund\: §c{2}
nearCommandDescription=Listet die Spieler bei oder in der Nähe eines Spielers auf.
nearCommandUsage=/<command> [Spielername] [Radius]
nearCommandUsage1=/<command>
nearCommandUsage2Description=Listet alle Spieler innerhalb des angegebenen Radius von dir
nearCommandUsage3=/<command> <spieler>
nearbyPlayers=§6Spieler in der Nähe\:§r {0}
negativeBalanceError=§4Spieler dürfen keine Schulden machen.
@@ -682,8 +779,8 @@ noPlacePermission=§cDu bist nicht berechtigt, einen Block in der Nähe des Schi
noPotionEffectPerm=§4Du darfst den Zaubertrankeffekt §c{0} §4diesem Trank nicht hinzufügen.
noPowerTools=§6Du hast keine Powertools zugewiesen.
notAcceptingPay=§4{0} §4akzeptiert keine Zahlungen.
notAllowedToQuestion=§4Du bist nicht berechtigt zu fragen.
notAllowedToShout=§4Du bist nicht berechtigt zu schreien.
notAllowedToLocal=§4Du hast keine Berechtigung, im lokalen Chat zu sprechen.
notAllowedToShout=§4Du hast nicht die Erlaubnis zu schreien.
notEnoughExperience=§4Du hast nicht genug Erfahrung.
notEnoughMoney=§4Du hast nicht genug Guthaben.
notFlying=fliegt nicht
@@ -746,6 +843,7 @@ posPitch=§6Pitch\: {0} (Neigewinkel)
possibleWorlds=§6Mögliche Welten sind die Nummern §c0§6 bis §c{0}§6.
potionCommandDescription=Fügt einem Trank benutzerdefinierte Effekte hinzu.
potionCommandUsage=/<command> <clear|apply|effect\:<Effekt> power\:<Stärke> duration\:<Dauer>>
potionCommandUsage1=/<command> clear
posX=§6X\: {0} (+Ost <-> -West)
posY=§6Y\: {0} (+Hoch <-> -Runter)
posYaw=§6Yaw\: {0} (Drehung)
@@ -861,7 +959,6 @@ serverReloading=Es gibt eine gute Chance, dass du den Server gerade reloadest. F
serverTotal=§6Server insgesamt\:§c {0}
serverUnsupported=§cDu verwendest eine Serverversion, die nicht unterstützt wird\!
serverUnsupportedCleanroom=Sie betreiben einen Server, der Bukkit-Plugins nicht richtig unterstützt, die auf internen Mojang-Code angewiesen sind. Überlegen Sie sich, einen Essentials Ersatz für Ihre Server-Software zu verwenden.
serverUnsupportedDangerous=Sie betreiben einen Server Fork, der als extrem gefährlich bekannt ist und zu Datenverlust führt. Es wird dringend empfohlen, zu einer stabileren und leistungsfähigeren Server-Software wie Paper oder Tuinity zu wechseln.
serverUnsupportedLimitedApi=Sie verwenden einen Server mit eingeschränkter API-Funktionalität. EssentialsX wird weiterhin funktionieren, aber bestimmte Funktionen können deaktiviert sein.
serverUnsupportedMods=Du verwendest einen Server der Bukkit Plugins nicht korrekt unterstützt. Bukkit Plugins sollten nicht mit Forge/Fabric mods verwendet werden. Für Forge\: Überlege ForgeEssentials, oder SpongeForge + Nucleus zu verwenden.
setBal=§aDein Kontostand wurde auf §c{0} §agesetzt.
@@ -1020,6 +1117,7 @@ tpacancelCommandUsage2=/<command> <spieler>
tpacceptCommandUsage=/<command> [andererspieler]
tpacceptCommandUsage1=/<command>
tpacceptCommandUsage2=/<command> <spieler>
tpacceptCommandUsage3=/<command> *
tpahereCommandDescription=Bittet den angegebenen Spieler, sich zu dir zu teleportieren.
tpahereCommandUsage=/<command> <spieler>
tpahereCommandUsage1=/<command> <spieler>
@@ -1032,6 +1130,7 @@ tpautoCommandUsage1=/<command> [spieler]
tpdenyCommandUsage=/<command>
tpdenyCommandUsage1=/<command>
tpdenyCommandUsage2=/<command> <spieler>
tpdenyCommandUsage3=/<command> *
tphereCommandDescription=Teleportiere einen Spieler zu dir.
tphereCommandUsage=/<command> <spieler>
tphereCommandUsage1=/<command> <spieler>
@@ -106,7 +106,6 @@ cantReadGeoIpDB=Απέτυχε η ανάγνωση της GeoIP βάσης δε
cantSpawnItem=§4Δεν επιτρέπεται η εμφάνιση του αντικειμένου§c {0}§4.
cartographytableCommandDescription=Ανοίγει ένα τραπέζι χαρτογραφίας.
cartographytableCommandUsage=/<command>
chatTypeLocal=[L]
chatTypeSpy=[Spy]
cleaned=Τα Αρχεία Χρήστη Διαγράφτηκαν.
cleaning=Διαγραφή των αρχείων χρήστη.
@@ -126,7 +126,7 @@ cantReadGeoIpDB=Failed to read GeoIP database\!
cantSpawnItem=§4You are not allowed to spawn the item§c {0}§4.
cartographytableCommandDescription=Opens up a cartography table.
cartographytableCommandUsage=/<command>
chatTypeLocal=[L]
chatTypeLocal=§3[L]
chatTypeSpy=[Spy]
cleaned=Userfiles Cleaned.
cleaning=Cleaning userfiles.
@@ -233,8 +233,18 @@ destinationNotSet=Destination not set\!
disabled=disabled
disabledToSpawnMob=§4Spawning this mob was disabled in the config file.
disableUnlimited=§6Disabled unlimited placing of§c {0} §6for§c {1}§6.
discordbroadcastCommandDescription=Broadcasts a message to the specified Discord channel.
discordbroadcastCommandUsage=/<command> <channel> <msg>
discordbroadcastCommandUsage1=/<command> <channel> <msg>
discordbroadcastCommandUsage1Description=Sends the given message to the specified Discord channel
discordbroadcastInvalidChannel=§4Discord channel §c{0}§4 does not exist.
discordbroadcastPermission=§4You do not have permission to send messages to the §c{0}§4 channel.
discordbroadcastSent=§6Message sent to §c{0}§6\!
discordCommandDescription=Sends the Discord invite link to the player.
discordCommandLink=§6Join our Discord server at §c{0}§6\!
discordCommandUsage=/<command>
discordCommandUsage1=/<command>
discordCommandUsage1Description=Sends the Discord invite link to the player
discordCommandExecuteDescription=Executes a console command on the Minecraft server.
discordCommandExecuteArgumentCommand=The command to be executed
discordCommandExecuteReply=Executing command\: "/{0}"
@@ -251,6 +261,8 @@ discordErrorLoggerNoPerms=Discord console logger has been disabled due to insuff
discordErrorNoGuild=Invalid or missing server ID\! Please follow the tutorial in the config in order to setup the plugin.
discordErrorNoGuildSize=Your bot is not in any servers\! Please follow the tutorial in the config in order to setup the plugin.
discordErrorNoPerms=Your bot cannot see or talk in any channel\! Please make sure your bot has read and write permissions in all channels you wish to use.
discordErrorNoPrimary=You did not define a primary channel or your defined primary channel is invalid. Falling back to the default channel\: \#{0}.
discordErrorNoPrimaryPerms=Your bot cannot speak in your primary channel, \#{0}. Please make sure your bot has read and write permissions in all channels you wish to use.
discordErrorNoToken=No token provided\! Please follow the tutorial in the config in order to setup the plugin.
discordErrorWebhook=An error occurred while sending messages to your console channel\! This was likely caused by accidentally deleting your console webhook. This can usually by fixed by ensuring your bot has the "Manage Webhooks" permission and running "/ess reload".
discordLoggingIn=Attempting to login to Discord...
@@ -263,6 +275,12 @@ disposalCommandUsage=/<command>
distance=§6Distance\: {0}
dontMoveMessage=§6Teleportation will commence in§c {0}§6. Don''t move.
downloadingGeoIp=Downloading GeoIP database... this might take a while (country\: 1.7 MB, city\: 30MB)
dumpConsoleUrl=A server dump was created\: §c{0}
dumpCreating=§6Creating server dump...
dumpDeleteKey=§6If you want to delete this dump at a later date, use the following deletion key\: §c{0}
dumpError=§4Error while creating dump §c{0}§4.
dumpErrorUpload=§4Error while uploading §c{0}§4\: §c{1}
dumpUrl=§6Created server dump\: §c{0}
duplicatedUserdata=Duplicated userdata\: {0} and {1}.
durability=§6This tool has §c{0}§6 uses left.
east=E
@@ -312,6 +330,8 @@ essentialsCommandUsage6=/<command> cleanup
essentialsCommandUsage6Description=Cleans up old userdata
essentialsCommandUsage7=/<command> homes
essentialsCommandUsage7Description=Manages user homes
essentialsCommandUsage8=/<command> dump [all] [config] [discord] [kits] [log]
essentialsCommandUsage8Description=Generates a server dump with the requested information
essentialsHelp1=The file is broken and Essentials can''t open it. Essentials is now disabled. If you can''t fix the file yourself, go to http\://tiny.cc/EssentialsChat
essentialsHelp2=The file is broken and Essentials can''t open it. Essentials is now disabled. If you can''t fix the file yourself, either type /essentialshelp in game or go to http\://tiny.cc/EssentialsChat
essentialsReload=§6Essentials reloaded§c {0}.
@@ -568,6 +588,9 @@ jailAlreadyIncarcerated=§4Person is already in jail\:§c {0}
jailList=§6Jails\:§r {0}
jailMessage=§4You do the crime, you do the time.
jailNotExist=§4That jail does not exist.
jailNotifyJailed=§6Player§c {0} §6jailed by §c{1}.
jailNotifyJailedFor=§6Player§c {0} §6jailed for§c {1}§6by §c{2}§6.
jailNotifySentenceExtended=§6Player§c{0}§6''s jail time extended to §c{1} §6by §c{2}§6.
jailReleased=§6Player §c{0}§6 unjailed.
jailReleasedPlayerNotify=§6You have been released\!
jailSentenceExtended=§6Jail time extended to §c{0}§6.
@@ -644,8 +667,9 @@ listCommandUsage1=/<command> [group]
listCommandUsage1Description=Lists all players on the server, or the given group if specified
listGroupTag=§6{0}§r\:
listHiddenTag=§7[HIDDEN]§r
listRealName=({0})
loadWarpError=§4Failed to load warp {0}.
localFormat=[L]<{0}> {1}
localFormat=§3[L] §r<{0}> {1}
loomCommandDescription=Opens up a loom.
loomCommandUsage=/<command>
mailClear=§6To clear your mail, type§c /mail clear§6.
@@ -663,6 +687,8 @@ mailCommandUsage4=/<command> sendall <message>
mailCommandUsage4Description=Sends all players the given message
mailCommandUsage5=/<command> sendtemp <player> <expire time> <message>
mailCommandUsage5Description=Sends the specified player the given message which will expire in the specified time
mailCommandUsage6=/<command> sendtempall <expire time> <message>
mailCommandUsage6Description=Sends all players the given message which will expire in the specified time
mailDelay=Too many mails have been sent within the last minute. Maximum\: {0}
mailFormatNew=§6[§r{0}§6] §6[§r{1}§6] §r{2}
mailFormatNewTimed=§6[§e⚠§6] §6[§r{0}§6] §6[§r{1}§6] §r{2}
@@ -752,6 +778,7 @@ nearCommandUsage3Description=Lists all players within the default near radius of
nearCommandUsage4=/<command> <player> <radius>
nearCommandUsage4Description=Lists all players within the given radius of the specified player
nearbyPlayers=§6Players nearby\:§r {0}
nearbyPlayersList={0}§f(§c{1}m§f)
negativeBalanceError=§4User is not allowed to have a negative balance.
nickChanged=§6Nickname changed.
nickCommandDescription=Change your nickname or that of another player.
@@ -805,8 +832,9 @@ noPlacePermission=§4You do not have permission to place a block near that sign.
noPotionEffectPerm=§4You do not have permission to apply potion effect §c{0} §4to this potion.
noPowerTools=§6You have no power tools assigned.
notAcceptingPay=§4{0} §4is not accepting payment.
notAllowedToQuestion=§4You are not authorized to use question.
notAllowedToShout=§4You are not authorized to shout.
notAllowedToLocal=§4You don''t have permission to speak in local chat.
notAllowedToQuestion=§4You don''t have permission to ask a question.
notAllowedToShout=§4You don''t have permission to shout.
notEnoughExperience=§4You do not have enough experience.
notEnoughMoney=§4You do not have sufficient funds.
notFlying=not flying
@@ -865,9 +893,14 @@ playerTempBanned=§6Player §c{0}§6 temporarily banned §c{1}§6 for §c{2}§6\
playerUnbanIpAddress=§6Player§c {0} §6unbanned IP\:§c {1}
playerUnbanned=§6Player§c {0} §6unbanned§c {1}
playerUnmuted=§6You have been unmuted.
playtimeCommandDescription=Shows a player''s time played in game
playtimeCommandUsage=/<command> [player]
playtimeCommandUsage1=/<command>
playtimeCommandUsage1Description=Shows your time played in game
playtimeCommandUsage2=/<command> <player>
playtimeCommandUsage2Description=Shows the specified player''s time played in game
playtime=§6Playtime\:§c {0}
playtimeOther=§6Playtime of {1}§6\:§c {0}
pong=Pong\!
posPitch=§6Pitch\: {0} (Head angle)
possibleWorlds=§6Possible worlds are the numbers §c0§6 through §c{0}§6.
@@ -991,14 +1024,17 @@ replyLastRecipientDisabledFor=§6Replying to last message recipient §cdisabled
replyLastRecipientEnabled=§6Replying to last message recipient §cenabled§6.
replyLastRecipientEnabledFor=§6Replying to last message recipient §cenabled §6for §c{0}§6.
requestAccepted=§6Teleport request accepted.
requestAcceptedAll=§6Accepted §c{0} §6pending teleport request(s).
requestAcceptedAuto=§6Automatically accepted a teleport request from {0}.
requestAcceptedFrom=§c{0} §6accepted your teleport request.
requestAcceptedFromAuto=§c{0} §6accepted your teleport request automatically.
requestDenied=§6Teleport request denied.
requestDeniedAll=§6Denied §c{0} §6pending teleport request(s).
requestDeniedFrom=§c{0} §6denied your teleport request.
requestSent=§6Request sent to§c {0}§6.
requestSentAlready=§4You have already sent {0}§4 a teleport request.
requestTimedOut=§4Teleport request has timed out.
requestTimedOutFrom=§4Teleport request from §c{0} §4has timed out.
resetBal=§6Balance has been reset to §c{0} §6for all online players.
resetBalAll=§6Balance has been reset to §c{0} §6for all players.
rest=§6You feel well rested.
@@ -1040,7 +1076,6 @@ serverTotal=§6Server Total\:§c {0}
serverUnsupported=You are running an unsupported server version\!
serverUnsupportedClass=Status determining class\: {0}
serverUnsupportedCleanroom=You are running a server that does not properly support Bukkit plugins that rely on internal Mojang code. Consider using an Essentials replacement for your server software.
serverUnsupportedDangerous=You are running a server fork that is known to be extremely dangerous and lead to data loss. It is strongly recommended you switch to a more stable, high-performing server software, like Paper or Tuinity.
serverUnsupportedLimitedApi=You are running a server with limited API functionality. EssentialsX will still work, but certain features may be disabled.
serverUnsupportedMods=You are running a server that does not properly support Bukkit plugins. Bukkit plugins should not be used with Forge/Fabric mods\! For Forge\: Consider using ForgeEssentials, or SpongeForge + Nucleus.
setBal=§aYour balance was set to {0}.
@@ -1258,10 +1293,14 @@ tpacancelCommandUsage1=/<command>
tpacancelCommandUsage1Description=Cancels all your outstanding teleport requests
tpacancelCommandUsage2=/<command> <player>
tpacancelCommandUsage2Description=Cancels all your outstanding teleport request with the specified player
tpacceptCommandDescription=Accepts teleport requests.
tpacceptCommandUsage=/<command> [otherplayer]
tpacceptCommandUsage1=/<command>
tpacceptCommandUsage1Description=Accepts the most recent teleport request
tpacceptCommandUsage2=/<command> <player>
tpacceptCommandUsage2Description=Accepts a teleport request from the specified player
tpacceptCommandUsage3=/<command> *
tpacceptCommandUsage3Description=Accepts all teleport requests
tpahereCommandDescription=Request that the specified player teleport to you.
tpahereCommandUsage=/<command> <player>
tpahereCommandUsage1=/<command> <player>
@@ -1274,10 +1313,14 @@ tpautoCommandDescription=Automatically accept teleportation requests.
tpautoCommandUsage=/<command> [player]
tpautoCommandUsage1=/<command> [player]
tpautoCommandUsage1Description=Toggles if tpa requests are auto accepted for yourself or another player if specified
tpdenyCommandDescription=Rejects teleport requests.
tpdenyCommandUsage=/<command>
tpdenyCommandUsage1=/<command>
tpdenyCommandUsage1Description=Rejects the most recent teleport request
tpdenyCommandUsage2=/<command> <player>
tpdenyCommandUsage2Description=Rejects a teleport request from the specified player
tpdenyCommandUsage3=/<command> *
tpdenyCommandUsage3Description=Rejects all teleport requests
tphereCommandDescription=Teleport a player to you.
tphereCommandUsage=/<command> <player>
tphereCommandUsage1=/<command> <player>
@@ -9,7 +9,7 @@ adventure=adventure
afkCommandDescription=Marks you as away-from-keyboard.
afkCommandUsage=/<command> [player/message...]
afkCommandUsage1=/<command> [message]\n
afkCommandUsage1Description=Toggles your afk status with an optional reason
afkCommandUsage1Description=Toggles your AFK status with an optional reason
afkCommandUsage2=/<command> <player> [message]
afkCommandUsage2Description=Toggles the afk status of the specified player with an optional reason
alertBroke=broke\:
@@ -126,7 +126,7 @@ cantReadGeoIpDB=Failed to read GeoIP database\!
cantSpawnItem=§4You are not allowed to spawn the item§c {0}§4.
cartographytableCommandDescription=Opens up a cartography table.
cartographytableCommandUsage=/<command>
chatTypeLocal=[L]
chatTypeLocal=§3[L]
chatTypeSpy=[Spy]
cleaned=Userfiles Cleaned.
cleaning=Cleaning userfiles.
@@ -151,7 +151,7 @@ commandFailed=Command {0} failed\:
commandHelpFailedForPlugin=Error getting help for plugin\: {0}
commandHelpLine1=§6Command Help\: §f/{0}
commandHelpLine2=§6Description\: §f{0}
commandHelpLine3=§6Usage(s);
commandHelpLine3=§6Usage(s)\:
commandHelpLine4=§6Aliases(s)\: §f{0}
commandHelpLineUsage={0} §6- {1}
commandNotLoaded=§4Command {0} is improperly loaded.
@@ -233,8 +233,18 @@ destinationNotSet=Destination not set\!
disabled=disabled
disabledToSpawnMob=§4Spawning this mob was disabled in the config file.
disableUnlimited=§6Disabled unlimited placing of§c {0} §6for§c {1}§6.
discordbroadcastCommandDescription=Broadcasts a message to the specified Discord channel.
discordbroadcastCommandUsage=/<command> <channel> <msg>
discordbroadcastCommandUsage1=/<command> <channel> <msg>
discordbroadcastCommandUsage1Description=Sends the given message to the specified Discord channel
discordbroadcastInvalidChannel=§4Discord channel §c{0}§4 does not exist.
discordbroadcastPermission=§4You do not have permission to send messages to the §c{0}§4 channel.
discordbroadcastSent=§6Message sent to §c{0}§6\!
discordCommandDescription=Sends the Discord invite link to the player.
discordCommandLink=§6Join our Discord server at §c{0}§6\!
discordCommandUsage=/<command>
discordCommandUsage1=/<command>
discordCommandUsage1Description=Sends the Discord invite link to the player
discordCommandExecuteDescription=Executes a console command on the Minecraft server.
discordCommandExecuteArgumentCommand=The command to be executed
discordCommandExecuteReply=Executing command\: "/{0}"
@@ -251,6 +261,8 @@ discordErrorLoggerNoPerms=Discord console logger has been disabled due to insuff
discordErrorNoGuild=Invalid or missing server ID\! Please follow the tutorial in the config in order to setup the plugin.
discordErrorNoGuildSize=Your bot is not in any servers\! Please follow the tutorial in the config in order to setup the plugin.
discordErrorNoPerms=Your bot cannot see or talk in any channel\! Please make sure your bot has read and write permissions in all channels you wish to use.
discordErrorNoPrimary=You did not define a primary channel or your defined primary channel is invalid. Falling back to the default channel\: \#{0}.
discordErrorNoPrimaryPerms=Your bot cannot speak in your primary channel, \#{0}. Please make sure your bot has read and write permissions in all channels you wish to use.
discordErrorNoToken=No token provided\! Please follow the tutorial in the config in order to setup the plugin.
discordErrorWebhook=An error occurred while sending messages to your console channel\! This was likely caused by accidentally deleting your console webhook. This can usually by fixed by ensuring your bot has the "Manage Webhooks" permission and running "/ess reload".
discordLoggingIn=Attempting to login to Discord...
@@ -318,6 +330,7 @@ essentialsCommandUsage6=/<command> cleanup
essentialsCommandUsage6Description=Cleans up old userdata
essentialsCommandUsage7=/<command> homes
essentialsCommandUsage7Description=Manages user homes
essentialsCommandUsage8=/<command> dump [all] [config] [discord] [kits] [log]
essentialsCommandUsage8Description=Generates a server dump with the requested information
essentialsHelp1=The file is broken and Essentials can''t open it. Essentials is now disabled. If you can''t fix the file yourself, go to http\://tiny.cc/EssentialsChat
essentialsHelp2=The file is broken and Essentials can''t open it. Essentials is now disabled. If you can''t fix the file yourself, either type /essentialshelp in game or go to http\://tiny.cc/EssentialsChat
@@ -575,6 +588,9 @@ jailAlreadyIncarcerated=§4Person is already in jail\:§c {0}
jailList=§6Jails\:§r {0}
jailMessage=§4You do the crime, you do the time.
jailNotExist=§4That jail does not exist.
jailNotifyJailed=§6Player§c {0} §6jailed by §c{1}.
jailNotifyJailedFor=§6Player§c {0} §6jailed for§c {1}§6by §c{2}§6.
jailNotifySentenceExtended=§6Player§c{0}§6''s jail time extended to §c{1} §6by §c{2}§6.
jailReleased=§6Player §c{0}§6 unjailed.
jailReleasedPlayerNotify=§6You have been released\!
jailSentenceExtended=§6Jail time extended to §c{0}§6.
@@ -651,8 +667,9 @@ listCommandUsage1=/<command> [group]
listCommandUsage1Description=Lists all players on the server, or the given group if specified
listGroupTag=§6{0}§r\:
listHiddenTag=§7[HIDDEN]§r
listRealName=({0})
loadWarpError=§4Failed to load warp {0}.
localFormat=[L]<{0}> {1}
localFormat=§3[L] §r<{0}> {1}
loomCommandDescription=Opens up a loom.
loomCommandUsage=/<command>
mailClear=§6To mark your mail as read, type§c /mail clear§6.
@@ -670,6 +687,8 @@ mailCommandUsage4=/<command> sendall <message>
mailCommandUsage4Description=Sends all players the given message
mailCommandUsage5=/<command> sendtemp <player> <expire time> <message>
mailCommandUsage5Description=Sends the specified player the given message which will expire in the specified time
mailCommandUsage6=/<command> sendtempall <expire time> <message>
mailCommandUsage6Description=Sends all players the given message which will expire in the specified time
mailDelay=Too many mails have been sent within the last minute. Maximum\: {0}
mailFormatNew=§6[§r{0}§6] §6[§r{1}§6] §r{2}
mailFormatNewTimed=§6[§e⚠§6] §6[§r{0}§6] §6[§r{1}§6] §r{2}
@@ -759,6 +778,7 @@ nearCommandUsage3Description=Lists all players within the default near radius of
nearCommandUsage4=/<command> <player> <radius>
nearCommandUsage4Description=Lists all players within the given radius of the specified player
nearbyPlayers=§6Players nearby\:§r {0}
nearbyPlayersList={0}§f(§c{1}m§f)
negativeBalanceError=§4User is not allowed to have a negative balance.
nickChanged=§6Nickname changed.
nickCommandDescription=Change your nickname or that of another player.
@@ -812,8 +832,9 @@ noPlacePermission=§4You do not have permission to place a block near that sign.
noPotionEffectPerm=§4You do not have permission to apply potion effect §c{0} §4to this potion.
noPowerTools=§6You have no power tools assigned.
notAcceptingPay=§4{0} §4is not accepting payment.
notAllowedToQuestion=§4You are not authorised to use question.
notAllowedToShout=§4You are not authorised to shout.
notAllowedToLocal=§4You don''t have permission to speak in local chat.
notAllowedToQuestion=§4You don''t have permission to ask a question.
notAllowedToShout=§4You don''t have permission to shout.
notEnoughExperience=§4You do not have enough experience.
notEnoughMoney=§4You do not have sufficient funds.
notFlying=not flying
@@ -872,9 +893,14 @@ playerTempBanned=§6Player §c{0}§6 temporarily banned §c{1}§6 for §c{2}§6\
playerUnbanIpAddress=§6Player§c {0} §6unbanned IP\:§c {1}
playerUnbanned=§6Player§c {0} §6unbanned§c {1}
playerUnmuted=§6You have been unmuted.
playtimeCommandDescription=Shows a player''s time played in game
playtimeCommandUsage=/<command> [player]
playtimeCommandUsage1=/<command>
playtimeCommandUsage1Description=Shows your time played in game
playtimeCommandUsage2=/<command> <player>
playtimeCommandUsage2Description=Shows the specified player''s time played in game
playtime=§6Playtime\:§c {0}
playtimeOther=§6Playtime of {1}§6\:§c {0}
pong=Pong\!
posPitch=§6Pitch\: {0} (Head angle)
possibleWorlds=§6Possible worlds are the numbers §c0§6 through §c{0}§6.
@@ -998,14 +1024,17 @@ replyLastRecipientDisabledFor=§6Replying to last message recipient §cdisabled
replyLastRecipientEnabled=§6Replying to last message recipient §cenabled§6.
replyLastRecipientEnabledFor=§6Replying to last message recipient §cenabled §6for §c{0}§6.
requestAccepted=§6Teleport request accepted.
requestAcceptedAll=§6Accepted §c{0} §6pending teleport request(s).
requestAcceptedAuto=§6Automatically accepted a teleport request from {0}.
requestAcceptedFrom=§c{0} §6accepted your teleport request.
requestAcceptedFromAuto=§c{0} §6accepted your teleport request automatically.
requestDenied=§6Teleport request denied.
requestDeniedAll=§6Denied §c{0} §6pending teleport request(s).
requestDeniedFrom=§c{0} §6denied your teleport request.
requestSent=§6Request sent to§c {0}§6.
requestSentAlready=§4You have already sent {0}§4 a teleport request.
requestTimedOut=§4Teleport request has timed out.
requestTimedOutFrom=§4Teleport request from §c{0} §4has timed out.
resetBal=§6Balance has been reset to §c{0} §6for all online players.
resetBalAll=§6Balance has been reset to §c{0} §6for all players.
rest=§6You feel well rested.
@@ -1047,7 +1076,6 @@ serverTotal=§6Server Total\:§c {0}
serverUnsupported=You are running an unsupported server version\!
serverUnsupportedClass=Status determining class\: {0}
serverUnsupportedCleanroom=You are running a server that does not properly support Bukkit plugins that rely on internal Mojang code. Consider using an Essentials replacement for your server software.
serverUnsupportedDangerous=You are running a server fork that is known to be extremely dangerous and lead to data loss. It is strongly recommended you switch to a more stable, high-performing server software, like Paper or Tuinity.
serverUnsupportedLimitedApi=You are running a server with limited API functionality. EssentialsX will still work, but certain features may be disabled.
serverUnsupportedMods=You are running a server that does not properly support Bukkit plugins. Bukkit plugins should not be used with Forge/Fabric mods\! For Forge\: Consider using ForgeEssentials, or SpongeForge + Nucleus.
setBal=§aYour balance was set to {0}.
@@ -1265,10 +1293,14 @@ tpacancelCommandUsage1=/<command>
tpacancelCommandUsage1Description=Cancels all your outstanding teleport requests
tpacancelCommandUsage2=/<command> <player>
tpacancelCommandUsage2Description=Cancels all your outstanding teleport request with the specified player
tpacceptCommandDescription=Accepts teleport requests.
tpacceptCommandUsage=/<command> [otherplayer]
tpacceptCommandUsage1=/<command>
tpacceptCommandUsage1Description=Accepts the most recent teleport request
tpacceptCommandUsage2=/<command> <player>
tpacceptCommandUsage2Description=Accepts a teleport request from the specified player
tpacceptCommandUsage3=/<command> *
tpacceptCommandUsage3Description=Accepts all teleport requests
tpahereCommandDescription=Request that the specified player teleport to you.
tpahereCommandUsage=/<command> <player>
tpahereCommandUsage1=/<command> <player>
@@ -1281,10 +1313,14 @@ tpautoCommandDescription=Automatically accept teleportation requests.
tpautoCommandUsage=/<command> [player]
tpautoCommandUsage1=/<command> [player]
tpautoCommandUsage1Description=Toggles if tpa requests are auto accepted for yourself or another player if specified
tpdenyCommandDescription=Rejects teleport requests.
tpdenyCommandUsage=/<command>
tpdenyCommandUsage1=/<command>
tpdenyCommandUsage1Description=Rejects the most recent teleport request
tpdenyCommandUsage2=/<command> <player>
tpdenyCommandUsage2Description=Rejects a teleport request from the specified player
tpdenyCommandUsage3=/<command> *
tpdenyCommandUsage3Description=Rejects all teleport requests
tphereCommandDescription=Teleport a player to you.
tphereCommandUsage=/<command> <player>
tphereCommandUsage1=/<command> <player>
@@ -8,10 +8,10 @@ addedToOthersAccount=§a{0} han sidos agregados a la cuenta de {1}§a. Nuevo sal
adventure=aventura
afkCommandDescription=Te pone como ausente.
afkCommandUsage=/<command> [jugador/mensaje...]
afkCommandUsage1=/<command> [message]
afkCommandUsage1=/<command> [mensaje]
afkCommandUsage1Description=Cambia tu estado de ausente con un motivo opcional
afkCommandUsage2=/<comando> <jugador> [mensaje]
afkCommandUsage2Description=Alterna el estado de afk de el jugador especificado con una razón opcional
afkCommandUsage2=/<command> <player> [mensaje]
afkCommandUsage2Description=Alterna el estado de ausente de el jugador especificado con una razón opcional
alertBroke=roto\:
alertFormat=§3[{0}] §f {1} §6 {2} en\: {3}
alertPlaced=colocado\:
@@ -24,14 +24,14 @@ antiBuildInteract=§4No puedes interactuar con§c {0}§4.
antiBuildPlace=§4No puedes colocar §c{0} §4aquí.
antiBuildUse=§4No puedes usar §c{0}§4.
antiochCommandDescription=Una pequeña sorpresa para operadores.
antiochCommandUsage=/<command> [message]
antiochCommandUsage=/<command> [mensaje]
anvilCommandDescription=Abre un yunque.
anvilCommandUsage=/<command>
autoAfkKickReason=Has sido echado por estar inactivo más de {0} minuto/s.
autoTeleportDisabled=§6Ya no estás aprobando automáticamente solicitudes de teletransportación.
autoTeleportDisabled=§6Ya no estás aprobando automáticamente solicitudes de teletransporte.
autoTeleportDisabledFor=§c{0}§6 ya no está aprobando automáticamente solicitudes de teletransportación.
autoTeleportEnabled=§6Ahora estás aprobando automáticamente las solicitudes de teletransportación.
autoTeleportEnabledFor=§c{0}§6 ahora está aprobando automáticamente solicitudes de teletransportación.
autoTeleportEnabled=§6Ahora estás aprobando automáticamente las solicitudes de teletransporte.
autoTeleportEnabledFor=§c{0}§6 ahora está aprobando automáticamente solicitudes de teletransporte.
backAfterDeath=§6Usa el comando §c/back §6para volver al lugar de tu muerte.
backCommandDescription=Te teletransporta a tu ubicación anterior a tp/spawn/warp.
backCommandUsage=/<command> [jugador]
@@ -51,19 +51,19 @@ balance=§aDinero\:§c {0}
balanceCommandDescription=Muestra el saldo actual de un jugador.
balanceCommandUsage=/<command> [jugador]
balanceCommandUsage1=/<command>
balanceCommandUsage1Description=Establece tu saldo actual
balanceCommandUsage1Description=Comprueba tu saldo actual
balanceCommandUsage2=/<command> <jugador>
balanceCommandUsage2Description=Muestra el saldo de un jugador especificado
balanceOther=§aDinero de {0} §a\:§c {1}
balanceTop=§6Ranking de economías ({0})
balanceTopLine={0}. {1}, {2}
balancetopCommandDescription=Obtiene los valores más altos de dinero.
balancetopCommandUsage=/<comando> [página]
balancetopCommandUsage1=/<comando> [página]
balancetopCommandUsage=/<command> [página]
balancetopCommandUsage1=/<command> [página]
balancetopCommandUsage1Description=Muestra la primera (o especificada) página de el top valores de saldo
banCommandDescription=Banea a un jugador.
banCommandUsage=/<command> <jugador> [razón]
banCommandUsage1=/<command> <jugador> [razón]
banCommandUsage=/<command> <player> [razón]
banCommandUsage1=/<command> <player> [razón]
banCommandUsage1Description=Banea a el jugador especificado con una razón opcional
banExempt=§4No puedes banear a ese jugador.
banExemptOffline=§4No puedes banear a jugadores que no están conectados.
@@ -71,8 +71,8 @@ banFormat=§4Baneado\: §r {0}
banIpJoin=Your IP address is banned from this server. Reason\: {0}
banJoin=Estás baneado de este servidor. Motivo\: {0}
banipCommandDescription=Banea una dirección IP.
banipCommandUsage=/<comando> <dirección> [motivo]
banipCommandUsage1=/<comando> <dirección> [motivo]
banipCommandUsage=/<command> <adress> [motivo]
banipCommandUsage1=/<command> <adress> [motivo]
banipCommandUsage1Description=Banea la dirección IP especificada con una razón opcional
bed=§ocama§r
bedMissing=§cTu cama no esta, se encuentra obstruída o no esta segura
@@ -86,17 +86,17 @@ bigTreeSuccess=§6Árbol grande generado.
bigtreeCommandDescription=Genera un árbol grande donde estás mirando.
bigtreeCommandUsage=/<command> <tree|redwood|jungle|darkoak>
bigtreeCommandUsage1=/<command> <tree|redwood|jungle|darkoak>
bigtreeCommandUsage1Description=Genera un gran árbol del tipo especificado
bigtreeCommandUsage1Description=Genera un árbol grande del tipo especificado
blockList=§6EssentialsX está transmitiendo los siguientes comandos a otros plugins\:
blockListEmpty=§6EssentialsX no está reenviando ningún comando a otros plugins.
blockListEmpty=§6EssentialsX no está transmitiendo ningún comando a otros plugins.
bookAuthorSet=§6Ahora el autor de este libro es {0}.
bookCommandDescription=Permite reabrir y editar libros sellados.
bookCommandUsage=/<command> [título|autor [nombre]]
bookCommandUsage=/<command> [title|author [nombre]]
bookCommandUsage1=/<command>
bookCommandUsage1Description=Bloquea/desbloquea un libro con pluma/libro firmado
bookCommandUsage2=/<comando> author <autor>
bookCommandUsage1Description=Bloquea/desbloquea un libro-y-pluma/libro firmado
bookCommandUsage2=/<command> autor <author>
bookCommandUsage2Description=Establece el autor de un libro firmado
bookCommandUsage3=/<comando> title <título>
bookCommandUsage3=/<command> título <title>
bookCommandUsage3Description=Establece el título de un libro firmado
bookLocked=§6El libro ha sido bloqueado.
bookTitleSet=§6Ahora el título del libro es {0}.
@@ -104,16 +104,16 @@ breakCommandDescription=Rompe el bloque que estás mirando.
breakCommandUsage=/<command>
broadcast=§6[§4Aviso§6]§a {0}
broadcastCommandDescription=Transmite un mensaje a todo el servidor.
broadcastCommandUsage=/<command> <mensaje>
broadcastCommandUsage=/<command> <msg>
broadcastCommandUsage1=/<command> <mensaje>
broadcastCommandUsage1Description=Retransmite el mensaje a todo el servidor
broadcastworldCommandDescription=Transmite un mensaje a un mundo.
broadcastworldCommandUsage=/<command> <mundo> <mensaje>
broadcastworldCommandUsage1=/<command> <mundo> <mensaje>
broadcastworldCommandUsage=/<command> <world> <msg>
broadcastworldCommandUsage1=/<command> <world> <msg>
broadcastworldCommandUsage1Description=Retransmite el mensaje al mundo especificado
burnCommandDescription=Prender fuego a un jugador.
burnCommandUsage=/<command> <jugador> <segundos>
burnCommandUsage1=/<command> <jugador> <segundos>
burnCommandDescription=Prende fuego a un jugador.
burnCommandUsage=/<command> <player> <seconds>
burnCommandUsage1=/<command> <player> <seconds>
burnCommandUsage1Description=Prende en llamas al jugador especificado por la cantidad especificada de segundos
burnMsg=§7Has puesto a {0} en fuego durante {1} segundos.
cannotSellNamedItem=§4No tienes permiso para vender un ítem nombrado.
@@ -126,27 +126,27 @@ cantReadGeoIpDB=¡Error al leer la base de datos de GeoIP\!
cantSpawnItem=§4No tienes acceso para producir el ítem§c {0}§4.
cartographytableCommandDescription=Abre una mesa de cartografía.
cartographytableCommandUsage=/<command>
chatTypeLocal=[L]
chatTypeLocal=§3[L]
chatTypeSpy=[Espía]
cleaned=Archivos de usuarios limpiados.
cleaning=Limpiando archivos de usuario.
clearInventoryConfirmToggleOff=§6You will no longer be prompted to confirm inventory clears.
clearInventoryConfirmToggleOn=§6You will now be prompted to confirm inventory clears.
clearinventoryCommandDescription=Desecha todos los objetos de tu inventario.
clearinventoryCommandUsage=/<command> [jugador|*] [item[\:<data>]|*|**] [cantidad]
clearinventoryCommandDescription=Elimina todos los objetos de tu inventario.
clearinventoryCommandUsage=/<command> [player|*] [item[\:<data>]|*|**] [amount]
clearinventoryCommandUsage1=/<command>
clearinventoryCommandUsage1Description=Elimina todos los objetos de tu inventario
clearinventoryCommandUsage2=/<command> <jugador>
clearinventoryCommandUsage2Description=Elimina todo los objetos del inventario del jugador especificado
clearinventoryCommandUsage3=/<comando> <jugador> <objeto> [cantidad]
clearinventoryCommandUsage2Description=Elimina todos los objetos del inventario del jugador especificado
clearinventoryCommandUsage3=/<command> <player> <item> [cantidad]
clearinventoryCommandUsage3Description=Elimina todos (o la cantidad especificada) los objetos del inventario especificado del jugador
clearinventoryconfirmtoggleCommandDescription=Alterna la configuración de confirmación al eliminar el inventario.
clearinventoryconfirmtoggleCommandDescription=Alterna la solicitud de confirmación al eliminar el inventario.
clearinventoryconfirmtoggleCommandUsage=/<command>
commandArgumentOptional=§7
commandArgumentOr=§c
commandArgumentRequired=§e
commandCooldown=§cNo puedes usar ese comando durante {0}.
commandDisabled=§cEl comando§6 {0}§c está desactivado.
commandDisabled=§cEl comando§6 {0}§c está deshabilitado.
commandFailed=Comando {0} fallido\:
commandHelpFailedForPlugin=Error al obtener ayuda para el plugin\: {0}
commandHelpLine1=§6Comando de ayuda\: §f/{0}
@@ -159,11 +159,11 @@ compassBearing=§6Orientación\: {0} ({1} grados).
compassCommandDescription=Describe tu rumbo actual.
compassCommandUsage=/<command>
condenseCommandDescription=Condensa ítems en bloques más compactos.
condenseCommandUsage=/<comando> [objeto]
condenseCommandUsage=/<command> [item]
condenseCommandUsage1=/<command>
condenseCommandUsage1Description=Condensa todos los objetos en tu inventario
condenseCommandUsage1Description=Condensa todos los items en tu inventario
condenseCommandUsage2=/<command> <item>
condenseCommandUsage2Description=Condensa el objeto especificado en tu inventario
condenseCommandUsage2Description=Condensa el item especificado en tu inventario
configFileMoveError=Error al mover config.yml a la carpeta de la copia de seguridad.
configFileRenameError=Error al renombrar archivo temp a config.yml.
confirmClear=§7To §lCONFIRM§7 inventory clear, please repeat command\: §6{0}
@@ -176,8 +176,8 @@ coordsKeyword={0}, {1}, {2}
couldNotFindTemplate=§4No se puede encontrar la plantilla§6 {0}
createdKit=§6Kit §c{0} §6creado con §c{1} §6articulos y un tiempo de espera de §c{2}
createkitCommandDescription=¡Crea un kit en el juego\!
createkitCommandUsage=/<command> <kit> <retraso>
createkitCommandUsage1=/<command> <kit> <retraso>
createkitCommandUsage=/<command> <kitname> <delay>
createkitCommandUsage1=/<command> <kitname> <delay>
createkitCommandUsage1Description=Crea un kit con el nombre y tiempo de espera dados
createKitFailed=§4Ocurrio un error durante la creacion del kit {0}.
createKitSeparator=§m-----------------------
@@ -203,14 +203,14 @@ deleteWarp=§6El warp§c {0} §6ha sido borrado.
deletingHomes=Eliminando todas las casas...
deletingHomesWorld=Eliminando todas las casas en {0}...
delhomeCommandDescription=Elimina una casa.
delhomeCommandUsage=/<command> [jugador\:]<nombre>
delhomeCommandUsage1=/<comando> <nombre>
delhomeCommandUsage=/<command> [jugador\:]<name>
delhomeCommandUsage1=/<command> <name>
delhomeCommandUsage1Description=Elimina tu casa por su nombre
delhomeCommandUsage2=/<comando> <jugador>\:<nombre>
delhomeCommandUsage2=/<command> <player>\:<name>
delhomeCommandUsage2Description=Elimina la casa del jugador especificado por su nombre
deljailCommandDescription=Elimina una cárcel.
deljailCommandUsage=/<command> <cárcel>
deljailCommandUsage1=/<command> <cárcel>
deljailCommandUsage=/<command> <jailname>
deljailCommandUsage1=/<command> <jailname>
deljailCommandUsage1Description=Elimina la cárcel por su nombre
delkitCommandDescription=Elimina el kit especificado.
delkitCommandUsage=/<command> <kit>
@@ -239,7 +239,7 @@ discordbroadcastCommandUsage1=/<command> <channel> <msg>
discordbroadcastCommandUsage1Description=Envía el mensaje dado al canal de Discord especificado
discordbroadcastInvalidChannel=§4El canal de Discord §c{0}§4 no existe.
discordbroadcastPermission=§4No tienes permiso para enviar mensajes al canal §c{0}§4.
discordbroadcastSent=§6Mensaje enviado a §c{0}§6
discordbroadcastSent=§6Mensaje enviado a §c{0}§6\!
discordCommandDescription=Envía el enlace de invitación a Discord al jugador.
discordCommandLink=§6¡Únete a nuestro servidor de Discord en §c{0}§6\!
discordCommandUsage=/<command>
@@ -247,8 +247,8 @@ discordCommandUsage1=/<command>
discordCommandUsage1Description=Envía el enlace de invitación a Discord al jugador
discordCommandExecuteDescription=Ejecuta un comando de consola en el servidor de Minecraft.
discordCommandExecuteArgumentCommand=El comando a ejecutar
discordCommandExecuteReply=Ejecutando comando\: «/{0}»
discordCommandListDescription=Genera una lista de jugador en línea.
discordCommandExecuteReply=Ejecutando comando\: "/{0}"
discordCommandListDescription=Genera una lista de jugadores en línea.
discordCommandListArgumentGroup=Un grupo específico para limitar tu búsqueda
discordCommandMessageDescription=Envía un mensaje a un jugador del servidor de Minecraft.
discordCommandMessageArgumentUsername=El jugador al que enviar el mensaje
@@ -256,21 +256,21 @@ discordCommandMessageArgumentMessage=El mensaje a enviar al jugador
discordErrorCommand=El bot se ha añadido al servidor de forma incorrecta. ¡Sigue el tutorial de configuración y añade el bot usando https\://essentialsx.net/discord.html\!
discordErrorCommandDisabled=¡Ese comando está desactivado\!
discordErrorLogin=Error al iniciar sesión en Discord. El plugin se ha desactivado por sí mismo\: \n{0}
discordErrorLoggerInvalidChannel=¡El inicio de sesión en la consola de Discord se ha desactivado por una definición del canal no válida\! Si quieres reactivarlo, establece la id. del canal en «none», de lo contrario comprueba que la identificación del canal es correcta.
discordErrorLoggerNoPerms=¡El identificador de la consola de Discord se ha desactivado por falta de permisos\! Asegúrate de que tu bot tiene permisos para «Administrar webhooks» en el servidor. Tras corregir eso, ejecuta «/ess reload».
discordErrorLoggerInvalidChannel=¡El inicio de sesión en la consola de Discord se ha desactivado por una definición del canal no válida\! Si quieres reactivarlo, establece la id. del canal en "none", de lo contrario comprueba que la identificación del canal es correcta.
discordErrorLoggerNoPerms=¡El identificador de la consola de Discord se ha desactivado por falta de permisos\! Asegúrate de que tu bot tiene permisos para "Administrar webhooks" en el servidor. Tras corregir eso, ejecuta "/ess reload".
discordErrorNoGuild=¡La id. del servidor no se encuentra o no es válida\! Sigue el tutorial de configuración para poner en marcha el plugin.
discordErrorNoGuildSize=¡Tu bot no está en ningún servidor\! Sigue el tutorial de configuración para poner en marcha el plugin.
discordErrorNoPerms=¡Tu bot no puede ver ni hablar en ningún canal\! Asegúrate de que tu bot tiene permisos de lectura y escritura en todos los canales que quieras usar.
discordErrorNoPrimary=No has definido un canal principal o el que has definido no es válido. Volviendo al canal por defecto\: \#{0}.
discordErrorNoPrimaryPerms=Tu bot no puede hablar en tu canal principal, \#{0}. Asegúrate de que tu bot tiene permisos de lectura y escritura en todos los canales que quieras que use.
discordErrorNoToken=¡No hay token\! Sigue el tutorial de configuración para poner en marcha el plugin.
discordErrorWebhook=¡Se ha producido un error al enviar mensajes al canal de la consola\! Esto puede deberse a que se haya eliminado accidentalmente tu webhook de consola. Esto se puede corregir asegurándote de que tu bot tiene permiso para «Administrar webhooks» y ejecutar «/ess reload».
discordErrorWebhook=¡Se ha producido un error al enviar mensajes al canal de la consola\! Esto puede deberse a que se haya eliminado accidentalmente tu webhook de consola. Esto se puede corregir asegurándote de que tu bot tiene permiso para "Administrar webhooks" y ejecutar "/ess reload".
discordLoggingIn=Intentando iniciar sesión en Discord...
discordLoggingInDone=Se ha iniciado sesión con éxito como {0}
discordNoSendPermission=Error al enviar el mensaje al canal\: \#{0}. ¡Asegúrate de que el bot tiene permisos para «Enviar mensajes» en ese canal\!
discordNoSendPermission=Error al enviar el mensaje al canal\: \#{0}. ¡Asegúrate de que el bot tiene permisos para "Enviar mensajes" en ese canal\!
discordReloadInvalid=¡Se ha intentado recargar la configuración de Discord de EssentialsX pero el plugin no era válido\! Si has modificado tu configuración, reinicia tu servidor.
disposal=Basura
disposalCommandDescription=Abre un menú portable de desechos.
disposalCommandDescription=Abre un menú de basurero portatíl.
disposalCommandUsage=/<command>
distance=§6Distancia\: {0}
dontMoveMessage=§6El teletransporte comenzará en§c {0}§6. Por favor, no te muevas.
@@ -285,20 +285,20 @@ duplicatedUserdata=Datos de usuario duplicados\: {0} y {1}
durability=§7Esta herramienta tiene §c{0}§7 usos restantes.
east=E
ecoCommandDescription=Gestiona la economía del servidor.
ecoCommandUsage=/<command><give|take|set|reset> <jugador> <cantidad>
ecoCommandUsage1=/<comando> give <jugador> <cantidad>
ecoCommandUsage=/<command> <give|take|set|reset> <player> <amount>
ecoCommandUsage1=/<command> give <player> <amount>
ecoCommandUsage1Description=Da al jugador especificado la cantidad de dinero especificada
ecoCommandUsage2=/<comando> take <jugador> <cantidad>
ecoCommandUsage2=/<command> take <jugador> <monto>
ecoCommandUsage2Description=Toma la cantidad especificada de dinero del jugador especificado
ecoCommandUsage3=/<command> set <jugador> <cantidad>
ecoCommandUsage3=/<command> set <jugador> <monto>
ecoCommandUsage3Description=Establece el saldo del jugador especificado a la cantidad de dinero especificada
ecoCommandUsage4=/<command> reset <jugador> <cantidad>
ecoCommandUsage4Description=Restablece el saldo del jugador especificado al saldo inicial del servidor
editBookContents=§eAhora puedes editar los contenidos de este libro.
enabled=activado
enchantCommandDescription=Encanta el ítem que el usuario está sosteniendo.
enchantCommandUsage=/<command> <encantamiento> [nivel]
enchantCommandUsage1=/<command> <nombre del encantamiento> [nivel]
enchantCommandUsage=/<command> <NombreDelEncantamientoEnIngles> [nivel]
enchantCommandUsage1=/<command> <Nombre del Encantamiento (en ingles)> [Nivel]
enchantCommandUsage1Description=Encanta el objeto sostenido con el encantamiento dado a un nivel opcional
enableUnlimited=§6Dando cantidad ilimitada de§c {0} §6a §c{1}§6.
enchantmentApplied=§6El encantamiento§c {0} §6fue aplicado al objeto de tu mano.
@@ -314,6 +314,7 @@ enderchestCommandUsage2=/<command> <jugador>
enderchestCommandUsage2Description=Abre el cofre de ender del jugador mencionado
errorCallingCommand=Error al ejecutar el comando /{0}
errorWithMessage=§cError\:§4 {0}
essChatNoSecureMsg=La versión de chat de EssentialsX {0} no soporta el chat seguro en este software del servidor. Actualiza EssentialsX, y si este problema persiste, informa a los desarrolladores.
essentialsCommandDescription=Recarga Essentials.
essentialsCommandUsage=/<command>
essentialsCommandUsage1=/<command> reload
@@ -323,25 +324,25 @@ essentialsCommandUsage2Description=Da información sobre la versión de Essentia
essentialsCommandUsage3=/<command> commands
essentialsCommandUsage3Description=Da información acerca de cuales comandos Essentials está enviando
essentialsCommandUsage4=/<command> debug
essentialsCommandUsage4Description=Activa el "modo debug" de Essentials
essentialsCommandUsage4Description=Activa el "modo de depuración" de Essentials
essentialsCommandUsage5=/<command> reset <jugador>
essentialsCommandUsage5Description=Restablece los datos de usuario del jugador dado
essentialsCommandUsage6=/<comando> cleanup
essentialsCommandUsage6Description=Limpia los datos de usuario antiguos
essentialsCommandUsage7=/<comando> homes
essentialsCommandUsage7Description=Administra casas de usuarios
essentialsCommandUsage6=/<command> cleanup
essentialsCommandUsage6Description=Limpia datos de usuario antiguos
essentialsCommandUsage7=/<command> homes
essentialsCommandUsage7Description=Gestiona hogares de usuarios
essentialsCommandUsage8=/<command> dump [all] [config] [discord] [kits] [log]
essentialsCommandUsage8Description=Genera un volcado del servidor con la información solicitada
essentialsCommandUsage8Description=Genera un volcado con la información requerida a la página de essentialsX
essentialsHelp1=Archivo corrupto, no es posible abrirlo. Essentials está ahora desactivado. Si no puedes arreglar el archivo, ve a http\://tiny.cc/EssentialsChat
essentialsHelp2=Archivo corrupto, no es posible abrirlo. Essentials está ahora desactivado. Si no puedes arreglar el archivo, escribe /essentialshelp dentro del juego o ve a http\://tiny.cc/EssentialsChat
essentialsReload=§6Essentials ha sido recargado. La versión es§c {0}.
exp=§c{0} §6tiene§c {1} §6 de exp. (nivel§c {2}§6) y necesita§c {3} §6de exp para subir su nivel.
expCommandDescription=Da, establece, restablece o mira a la experiencia de un jugador.
expCommandUsage=/<command> [reset|show|set|give] [jugador [cantidad]]
expCommandUsage1=/<comando> give <jugador> <cantidad>
expCommandDescription=Da, establece, reinicia o mira la experiencia de un jugador.
expCommandUsage=/<command> [reset|show|set|give] [jugador] [monto]
expCommandUsage1=/<command> give <player> <amount>
expCommandUsage1Description=Da al jugador mencionado la cantidad de xp especificada
expCommandUsage2=/<command> set <jugador> <cantidad>
expCommandUsage2Description=Establece el xp del jugador mencionado a la cantidad especificada
expCommandUsage2Description=Establece el xp del jugador objetivo la cantidad especificada
expCommandUsage3=/<command> show <jugador>
expCommandUsage4Description=Muestra la cantidad de xp que el jugador mencionado tiene
expCommandUsage5=/<command> reset <jugador>
@@ -414,7 +415,7 @@ getposCommandUsage1=/<command> [jugador]
getposCommandUsage1Description=Obtiene las coordenadas de ti mismo o de otro jugador si se especifica
giveCommandDescription=Da un item a un jugador.
giveCommandUsage=/<command> <jugador> <item|numeric> [cantidad [itemmeta...]]
giveCommandUsage1=/<comando> <jugador> <objeto> [cantidad]
giveCommandUsage1=/<command> <player> <item> [cantidad]
giveCommandUsage1Description=Da al jugador mencionado 64 (o la cantidad especificada) del objeto especificado
giveCommandUsage2=/<comando> <jugador> <objeto> <cantidad> <metadatos>
giveCommandUsage2Description=Da al jugador mencionado la cantidad especificada del item especificado con los metadatos especificados
@@ -475,9 +476,9 @@ holdPotion=§4No tienes pociones a las que agregar efectos.
holeInFloor=§4¡No hay suelo en el punto de aparición\!
homeCommandDescription=Teletransportarte a tu casa.
homeCommandUsage=/<command> [player\:][nombre]
homeCommandUsage1=/<comando> <nombre>
homeCommandUsage1=/<command> <name>
homeCommandUsage1Description=Te teletransporta a tu casa con el nombre dado
homeCommandUsage2=/<comando> <jugador>\:<nombre>
homeCommandUsage2=/<command> <player>\:<name>
homeCommandUsage2Description=Te teletransporta a la casa del jugador especificado con el nombre dado
homes=§6Hogares\:§r {0}
homeConfirmation=§6Ya tienes una casa llamada §c{0}§6\!\nPara sobrescribir tu casa existente, escribe el comando de nuevo.
@@ -541,6 +542,7 @@ itemCommandDescription=Generar un elemento.
itemCommandUsage=/<command> <item|numeric> [cantidad [itemmeta...]]
itemCommandUsage1=/<command> <item> [cantidad]
itemCommandUsage1Description=Te da un stack completo (o una cantidad especificada) del item especificado
itemCommandUsage2=/<command> <item> <amount> <meta>
itemCommandUsage2Description=Te da la cantidad especificada del item especificado con los metadatos especificados
itemId=§6ID\:§c {0}
itemloreClear=§6Has eliminado el lore de este objeto.
@@ -548,6 +550,7 @@ itemloreCommandDescription=Editar el lore de un elemento.
itemloreCommandUsage=/<command> <add/set/clear> [texto/línea] [texto]
itemloreCommandUsage1=/<comando> add [texto]
itemloreCommandUsage1Description=Añade el texto dado al final del lore del objeto sostenido
itemloreCommandUsage2=/<comando> poner <número de línea> <texto>
itemloreCommandUsage2Description=Establece la línea especificada del lore del item sostenido al texto dado
itemloreCommandUsage3=/<command> clear
itemloreCommandUsage3Description=Elimina el lore del item sostenido
@@ -563,7 +566,7 @@ itemnameCommandDescription=Nombra un item.
itemnameCommandUsage=/<command> [nombre]
itemnameCommandUsage1=/<command>
itemnameCommandUsage1Description=Elimina el nombre del item sostenido
itemnameCommandUsage2=/<comando> <nombre>
itemnameCommandUsage2=/<command> <name>
itemnameCommandUsage2Description=Establece el nombre del item sostenido al texto dado
itemnameInvalidItem=§cNecesitas tener un objeto en la mano para renombrarlo.
itemnameSuccess=§6Has renombrado el objeto de tu mano a "§c{0}§6".
@@ -602,8 +605,8 @@ jumpCommandDescription=Salta al bloque más cercano en la línea de visión.
jumpCommandUsage=/<command>
jumpError=§4Eso dañaría el cerebro de tu ordenador.
kickCommandDescription=Expulsa al jugador especificado con una razón.
kickCommandUsage=/<command> <jugador> [razón]
kickCommandUsage1=/<command> <jugador> [razón]
kickCommandUsage=/<command> <player> [razón]
kickCommandUsage1=/<command> <player> [razón]
kickCommandUsage1Description=Expulsa al jugador especificado con una razón opcional
kickDefault=Has sido expulsado del servidor\! Nota\: Revisa tu comportamiento
kickedAll=§4Todos los jugadores han sido expulsados.
@@ -629,6 +632,7 @@ kitCost=\ §7§o({0})§r
kitDelay=§m{0}§r
kitError=§cNo hay ningún kit válido.
kitError2=§4Este kit está mal creado. Por favor, contacta con un administrador.
kitError3=No se pudo dar el objeto en el kit del kit "{0}" al usuario {1} ya que ese objeto requiere Paper 1\n15.2+ para deserializar.
kitGiveTo=§6Dando kit§c {0}§6 a §c{1}§6.
kitInvFull=§4Tu inventario no tiene espacio para este kit. El kit se lanzará al suelo.
kitInvFullNoDrop=§4No hay suficiente espacio en tu inventario para ese kit.
@@ -636,10 +640,11 @@ kitItem=§6- §f{0}
kitNotFound=§4Ese kit no existe.
kitOnce=§4No puedes volver a usar este kit.
kitReceive=§6Kit§c {0}§6 recibido.
kitReset=§6Restablecer el tiempo de reutilización del kit §c {0} §6.
kitresetCommandDescription=Restablece el tiempo de reutilización del kit especificado.
kitReset=§6Reinicia el tiempo de espera del kit §c {0} §6.
kitresetCommandDescription=Reinicia el tiempo de espera del kit especificado.
kitresetCommandUsage=/<command> <kit> [jugador]
kitresetCommandUsage1=/<command> <kit> [jugador]
kitresetCommandUsage1Description=Reinicia el enfriamiento del kit especificado para ti o para otro jugador si se específica
kitResetOther=§6Restableciendo el tiempo de espera del kit §c{0} §6durante §c{1}§6.
kits=§7Kits disponibles\: {0}
kittycannonCommandDescription=Tira un gato explosivo a tu oponente.
@@ -649,7 +654,9 @@ leatherSyntax=§6Sintaxis color del cuero\:§c color\:<red>,<green>,<blue> ejemp
lightningCommandDescription=El poder de Thor. Lanza un rayo al cursor o al jugador.
lightningCommandUsage=/<command> [jugador] [poder]
lightningCommandUsage1=/<command> [jugador]
lightningCommandUsage1Description=Golpea con un rayo ya sea donde estás mirando o a otro jugador si se especifica
lightningCommandUsage2=/<command> <jugador> <poder>
lightningCommandUsage2Description=Lanza un rayo al jugador objetivo con el poder elegido
lightningSmited=§6¡Has sido golpeado mágicamente\!
lightningUse=§6Golpeando al jugador§c {0}
listAfkTag=§8[Ausente]§r
@@ -663,7 +670,7 @@ listGroupTag=§6{0}§r\:
listHiddenTag=§8[Oculto]§r
listRealName=({0})
loadWarpError=§4Error al cargar el Warp {0}.
localFormat=[L]<{0}> {1}
localFormat=§3[L] §r<{0}> {1}
loomCommandDescription=Abre un telar.
loomCommandUsage=/<command>
mailClear=§6Para marcar tu correo como leído, escribe§c /mail clear§6.
@@ -723,6 +730,7 @@ months=meses
moreCommandDescription=Rellena el stack de items en tu mano con la cantidad especificada, o al máximo si ninguna cantidad es especificada.
moreCommandUsage=/<command> [cantidad]
moreCommandUsage1=/<command> [cantidad]
moreCommandUsage1Description=Llena el ítem retenido hasta el monto establecido, o su tamaño máximo si no está especificado
moreThanZero=Las cantidades deben ser mayores que 0.
motdCommandDescription=Mira el Mensaje del Día.
motdCommandUsage=/<command> [capítulo] [página]
@@ -730,6 +738,7 @@ moveSpeed=§6Establecida velocidad de {0} a§c {1} §6durante §c{2}§6.
msgCommandDescription=Envía un mensaje privado al jugador especificado.
msgCommandUsage=/<command> <hacia> <mensaje>
msgCommandUsage1=/<command> <hacia> <mensaje>
msgCommandUsage1Description=Envía el mensaje privado al jugador especificado
msgDisabled=§6Receiving messages §cdisabled§6.
msgDisabledFor=§6Receiving messages §cdisabled §6for §c{0}§6.
msgEnabled=§6Receiving messages §cenabled§6.
@@ -745,6 +754,9 @@ multiplePotionEffects=§4No puedes aplicarle más de un efecto a esta poción.
muteCommandDescription=Silencia o deja de silenciar a un jugador.
muteCommandUsage=/<command> <jugador> [tiempo] [razón]
muteCommandUsage1=/<command> <jugador>
muteCommandUsage1Description=Silenciar permanentemente al jugador especificado o de-silenciarlos si ya estaban silenciados
muteCommandUsage2=/<comando> <jugador> <duración> [razón]
muteCommandUsage2Description=Silencia al jugador especificado durante el tiempo dado con una razón opcional
mutedPlayer=§6El jugador§c {0} §6está silenciado.
mutedPlayerFor=§6Jugador§c {0} §6silenciado por§c {1}§6.
mutedPlayerForReason=§c {0} §6silenciado por§c {1}§6. Motivo\: §c{2}
@@ -759,21 +771,33 @@ muteNotifyReason=§c{0} §6ha silenciado a §c{1}§6. §6Motivo\: §c{2}
nearCommandDescription=Lista los jugadores cerca o alrededor de un jugador.
nearCommandUsage=/<command> [jugador] [radio]
nearCommandUsage1=/<command>
nearCommandUsage1Description=Enumera a todos los jugadores cerca de ti dentro del radio por defecto
nearCommandUsage2=/<command> <radius>
nearCommandUsage2Description=Enumera a todos los jugadores cerca de ti dentro del radio dado
nearCommandUsage3=/<command> <jugador>
nearCommandUsage3Description=Enumera a todos los jugadores cerca del jugador especificado dentro del radio por defecto
nearCommandUsage4=/<comando> <jugador> <radio>
nearCommandUsage4Description=Enumera a todos los jugadores cerca del jugador especificado dentro del radio dado
nearbyPlayers=§6Jugadores cercanos\:§r {0}
nearbyPlayersList={0}§f(§c{1}m§f)
negativeBalanceError=§4El jugador no tiene permitido tener dinero por debajo de 0$.
nickChanged=§6Nick cambiado.
nickCommandDescription=Cambia tu apodo o el de otro jugador.
nickCommandUsage=/<command> [jugador] <apodo|off>
nickCommandUsage1=/<command> <apodo>
nickCommandUsage1Description=Cambia tu apodo al texto dado
nickCommandUsage2=/<comando> apagado
nickCommandUsage2Description=Elimina tu nick
nickCommandUsage3=/<comando> <jugador> <apodo>
nickCommandUsage3Description=Cambia el apodo del jugador especificado al texto dado
nickCommandUsage4=/<comando> <jugador> apagado
nickCommandUsage4Description=Elimina el nick del jugador proporcionado
nickDisplayName=§4Tienes que activar el cambio de nick en la configuración del plugin Essentials.
nickInUse=§4Ese nick ya está en uso. Prueba a usar otro.
nickNameBlacklist=§4Ese apodo no está permitido.
nickNamesAlpha=§4No puedes usar símbolos raros.
nickNamesOnlyColorChanges=§4Nicknames can only have their colors changed.
nickNoMore=§6Ya no tienes un nombre personalizado. VUELVES A SER TU.
nickNoMore=§6Ya no tienes un nombre personalizado.
nickSet=§6Tu nick ahora es §c{0}§6.
nickTooLong=§4Ese nick es demasiado largo.
noAccessCommand=§4No tienes permiso para ejecutar ese comando.
@@ -809,8 +833,9 @@ noPlacePermission=§4No tienes permiso para colocar un bloque junto a eso.
noPotionEffectPerm=§4No tienes permiso para aplicar el efecto§c {0} §4a esta poción.
noPowerTools=§6No tienes ninguna herramienta eléctrica asignada.
notAcceptingPay=§4{0} §4no esta aceptando pagos.
notAllowedToQuestion=§4No estás autorizado para hacer una pregunta.
notAllowedToShout=§4No estás autorizado para gritar.
notAllowedToLocal=§4No tienes permiso para hablar en el chat local.
notAllowedToQuestion=§4No tienes permiso para usar la pregunta.
notAllowedToShout=§4No tienes permiso para gritar.
notEnoughExperience=§4No tienes la experiencia necesaria.
notEnoughMoney=§4No tienes dinero suficiente.
notFlying=no esta volando
@@ -820,6 +845,8 @@ noWarpsDefined=§6No hay warps disponibles.
nuke=§5¡Que la lluvia de la muerte caiga sobre ellos\!.
nukeCommandDescription=Que la muerte llueva sobre ellos.
nukeCommandUsage=/<command> [jugador]
nukeCommandUsage1=/<comando> [jugadores...]
nukeCommandUsage1Description=Envía una bomba sobre todos los jugadores u otro(s) jugador(es), si se especifica
numberRequired=Se requiere un número.
onlyDayNight=§6/time §4únicamente funciona con los valores §6Day§4 o §6Night§4 (día/noche).
onlyPlayers=§4Solo jugadores dentro del juego pueden usar §c{0}§4.
@@ -833,6 +860,7 @@ passengerTeleportFail=§2♣§d§kii§a§lSkyblock§d§kii§2♣ No puedes telet
payCommandDescription=Paga a otro jugador con tu dinero.
payCommandUsage=/<command> <jugador> <cantidad>
payCommandUsage1=/<command> <jugador> <cantidad>
payCommandUsage1Description=Paga al jugador especificado la cantidad de dinero dada
payConfirmToggleOff=§6You will no longer be prompted to confirm payments.
payConfirmToggleOn=§6You will now be prompted to confirm payments.
payDisabledFor=§6Aceptación de pagos desactivado para §c{0}§6.
@@ -846,6 +874,7 @@ payconfirmtoggleCommandUsage=/<command>
paytoggleCommandDescription=Alterna si puedes aceptar pagos.
paytoggleCommandUsage=/<command> [jugador]
paytoggleCommandUsage1=/<command> [jugador]
paytoggleCommandUsage1Description=Activa o desactiva si tú, u otro jugador si se especifica, acepta pagos
pendingTeleportCancelled=§4Petición de teletransporte cancelada.
pingCommandDescription=¡PONG\!
pingCommandUsage=/<command>
@@ -879,6 +908,11 @@ possibleWorlds=§6Posibles mundos son los números desde el §c0§6 hasta el §c
potionCommandDescription=Añade efectos personalizados a una poción.
potionCommandUsage=/<command> <clear|apply|effect\:<efecto> power\:<poder> duration\:<duración>>
potionCommandUsage1=/<command> clear
potionCommandUsage1Description=Elimina todos los efectos de la poción sostenida
potionCommandUsage2=/<command> aplicar
potionCommandUsage2Description=Te aplica todos los efectos de la poción sostenida sin consumir la poción
potionCommandUsage3=/<comando> efecto\:<efecto> poder\:<poder> duración\:<duración>
potionCommandUsage3Description=Aplica el meta de la poción dada a la poción sostenida
posX=§7X\: {0} (+Este <-> -Oeste)
posY=§7Y\: {0} (+Arriba <-> -Abajo)
posYaw=§7Yaw\: {0} (Rotación)
@@ -897,12 +931,34 @@ powerToolsDisabled=§7Todas tus herramientas de poder han sido desactivadas.
powerToolsEnabled=§7Todas tus herramientas de poder han sido activadas.
powertoolCommandDescription=Asigna un comando al item en mano.
powertoolCommandUsage=/<command> [l\:|a\:|r\:|c\:|d\:][comando] [argumentos] - {jugador} puede ser reemplazado por un jugador clickeado.
powertoolCommandUsage1=/<comando> l\:
powertoolCommandUsage1Description=Enumera todos los powertools del objeto sostenido
powertoolCommandUsage2=/<comando> d\:
powertoolCommandUsage2Description=Elimina todos los powertools del objeto sostenido
powertoolCommandUsage3=/<comando> r\:<cmd>
powertoolCommandUsage3Description=Elimina el comando dado del elemento sostenido
powertoolCommandUsage4=/<comando> <cmd>
powertoolCommandUsage4Description=Establece el comando powertool del objeto sostenido al comando dado
powertoolCommandUsage5=/<comando> a\:<cmd>
powertoolCommandUsage5Description=Añade el comando powertool dado al elemento sostenido
powertooltoggleCommandDescription=Activa o desactiva todas las herramientas de poder actuales.
powertooltoggleCommandUsage=/<command>
ptimeCommandDescription=Ajustar la hora del cliente del jugador. Añadir prefijo @ para arreglar.
ptimeCommandUsage=/<command> [list|reset|day|night|dawn|17\:30|4pm|4000ticks] [jugador|*]
ptimeCommandUsage1=/<comando> lista [jugador|*]
ptimeCommandUsage1Description=Enumera el tiempo de juego de ti u otro(s) jugador(es) si se especifica
ptimeCommandUsage2=/<comando> <tiempo> [jugador|*]
ptimeCommandUsage2Description=Cambia la hora del día a la hora dada para ti u otro(s) jugador(es) si se especifica
ptimeCommandUsage3=/<comando> reset [jugador|*]
ptimeCommandUsage3Description=Resetea la hora del día para ti u otro(s) jugador(es) si se especifica
pweatherCommandDescription=Ajusta el clima de un jugador
pweatherCommandUsage=/<command> [list|reset|storm|sun|clear] [jugador|*]
pweatherCommandUsage1=/<comando> lista [jugador|*]
pweatherCommandUsage1Description=Enumera el clima personal para ti u otro(s) jugador(es) si se especifica
pweatherCommandUsage2=/<command> <storm|sun> [jugador|*]
pweatherCommandUsage2Description=Cambia el clima personal para ti u otro(s) jugador(es) si se especifica al clima dado
pweatherCommandUsage3=/<comando> reset [jugador|*]
pweatherCommandUsage3Description=Resetea el clima para ti u otro(s) jugador(es) si se especifica
pTimeCurrent=§6La hora de §c{0} es§c {1}§6.
pTimeCurrentFixed=§c{0}§6 la hora ha sido corregida a§c {1}§6.
pTimeNormal=§c{0} §7\: el tiempo es normal (coincide con el del servidor).
@@ -922,17 +978,21 @@ questionFormat=§2[Pregunta]§r {0}
rCommandDescription=Responde rápidamente al último jugador que te habló.
rCommandUsage=/<command> <mensaje>
rCommandUsage1=/<command> <mensaje>
rCommandUsage1Description=Responde con el texto dado al último jugador que te ha mandado un mensaje
radiusTooBig=§4Radidemasiado grande\! El máximo es§c {0}§4.
readNextPage=§7Escribe§c /{0} {1} §7para leer la página siguiente.
realName=§f{0}§r§6 es §f{1}
realnameCommandDescription=Muestra el nombre de usuario de alguien basado en su apodo.
realnameCommandUsage=/<command> <apodo>
realnameCommandUsage1=/<command> <apodo>
realnameCommandUsage1Description=Muestra el nombre de usuario de un jugador basado en el apodo dado
recentlyForeverAlone=§4{0} recently went offline.
recipe=§6Receta para §c{0}§6 (§c{1}§6 de §c{2}§6)
recipeBadIndex=No hay ningún crafteo con ese número.
recipeCommandDescription=Muestra como craftear items.
recipeCommandUsage=/<command> <item> [número]
recipeCommandUsage1=/<command> <item> [page]
recipeCommandUsage1Description=Muestra como crear el objeto dado
recipeFurnace=§6Fundir\: §c{0}§6.
recipeGrid=§c{0}X §6| §{1}X §6| §{2}X
recipeGridItem=§c{0}X §6es §c{1}
@@ -943,12 +1003,19 @@ recipeShapeless=§7Combinar §c{0}
recipeWhere=§7Donde\: {0}
removeCommandDescription=Elimina entidades de tu mundo.
removeCommandUsage=/<command> <all|tamed|named|drops|arrows|boats|minecarts|xp|paintings|itemframes|endercrystals|monsters|animals|ambient|mobs|[tipoDeMob]> [radio|mundo]
removeCommandUsage1=/<command> <mob type> [world]
removeCommandUsage1Description=Elimina todos los mobs del tipo dado en el mundo actual u otro si especificado
removeCommandUsage2=/<comando> <tipo de mob> <radio> [mundo]
removeCommandUsage2Description=Elimina el tipo de mob dado dentro del radio dado en el mundo actual u otro si se especifica
removed=§6Eliminadas§c {0} §6entidades.
repair=§6Has reparado exitósamente tu\: §c{0}§6.
repairAlreadyFixed=§4Este ítem no necesita reparación.
repairCommandDescription=Repara la durabilidad de uno o todos tus objetos.
repairCommandUsage=/<command> [hand|all]
repairCommandUsage1=/<command>
repairCommandUsage1Description=Repara el objeto sostenido
repairCommandUsage2=/<comando> todos
repairCommandUsage2Description=Repara todos los objetos en tu inventario
repairEnchanted=§4No tienes permiso para reparar un ítem encantado.
repairInvalidType=§4Ese ítem no puede ser reparado.
repairNone=§4No hay ítems que necesiten ser reparados.
@@ -958,20 +1025,24 @@ replyLastRecipientDisabledFor=§6Respuesta al último mensaje recibido/enviado
replyLastRecipientEnabled=§6Respuesta al último mensaje recibido/enviado §cactivado§6.
replyLastRecipientEnabledFor=§6Respuesta al último mensaje recibido/enviado §cdesactivado §6por §c{0}§6.
requestAccepted=§6Petición de teletransporte aceptada.
requestAcceptedAll=§6Aceptada(s) §c{0} §6peticion(es) de teletransporte pendiente(s).
requestAcceptedAuto=§6Se aceptó automáticamente una solicitud de teletransporte de {0}.
requestAcceptedFrom=§c{0} §6ha aceptado tu teletransportación.
requestAcceptedFromAuto=§c{0} §6aceptó tu solicitud de teletransporte automáticamente.
requestDenied=§6Petición de teletransporte denegada.
requestDeniedAll=§6Denegada(s) §c{0} §6peticion(es) de teletransporte pendiente(s).
requestDeniedFrom=§c{0} §6ha denegado tu teletransportación.
requestSent=§6La petición ha sido enviada a§c {0}§6.
requestSentAlready=§4Ya has enviado una peticion de teletransporte a {0}§4.
requestTimedOut=§4El tiempo de la solicitud de teletransporte se ha agotado.
requestTimedOutFrom=§4La petición de teletransporte de §c{0} §4ha caducado.
resetBal=§6Dinero reestablecido a §c{0} §6a todos los jugadores conectados.
resetBalAll=§6Dinero reestablecido a §c{0} §6a todos los jugadores.
rest=§6Te sientes descansado.
restCommandDescription=Te descansa o al jugador especificado.
restCommandUsage=/<command> [jugador]
restCommandUsage1=/<command> [jugador]
restCommandUsage1Description=Resetea el tiempo desde el último reposo para ti u otro(s) jugador(es) si se especifica
restOther=§6Descansando§c {0}§6.
returnPlayerToJailError=§4¡Ha ocurrido un error al intentar enviar al jugador§c {0} §4a la cárcel\: §c{1}§4\!
rtoggleCommandDescription=Cambia si el destinatario de la respuesta es del último mensaje enviado o último mensaje recibido
@@ -985,10 +1056,20 @@ seenAccounts=§6El jugador ha sido también conocido como\:§c {0}
seenCommandDescription=Muestra la última hora de desconexión de un jugador.
seenCommandUsage=/<command> <jugador>
seenCommandUsage1=/<command> <jugador>
seenCommandUsage1Description=Muestra la información sobre el tiempo desconectado, bans, silencios y UUID del jugador especificado
seenOffline=§6El jugador§c {0} §6ha estado §4desconectado§6 desde §c{1}§6.
seenOnline=§6El jugador§c {0} §6ha estado §aconectado§6 desde §c{1}§6.
sellBulkPermission=§6You do not have permission to bulk sell.
sellCommandDescription=Vende el item en tu mano.
sellCommandUsage=/<comando> <<nombredeitem>|<id>|mano|inventario|bloques> [cantidad]
sellCommandUsage1=/<comando> <nombredeitem> [cantidad]
sellCommandUsage1Description=Vende todo (o la cantidad dada, si se especifica) del objeto dado que haya en tu inventario
sellCommandUsage2=/<comando> mano [cantidad]
sellCommandUsage2Description=Vende todo (o la cantidad dada, si se especifica) del objeto sostenido
sellCommandUsage3=/<comando> todos
sellCommandUsage3Description=Vende todos los objetos posibles en tu inventario
sellCommandUsage4=/<comando> bloques [cantidad]
sellCommandUsage4Description=Vende todos (o la cantidad dada, si se especifica) los bloques en tu inventario
sellHandPermission=§6You do not have permission to hand sell.
serverFull=¡El servidor está lleno\!
serverReloading=Hay una buena probabilidad de que estés recargando tu servidor en este momento. Si ese es el caso, ¿por qué te odias? No esperes soporte del equipo de EssentialsX al usar /reload.
@@ -996,28 +1077,43 @@ serverTotal=§6Total\:§c {0}
serverUnsupported=Estas ejecutando una version del servidor no soportada\!
serverUnsupportedClass=Estado de clase determinante\: {0}
serverUnsupportedCleanroom=Estás ejecutando un servidor que no es compatible con los plugins de Bukkit que dependen del código interno de Mojang. Si es posible sería conveniente reemplazar Essentials para el software del servidor.
serverUnsupportedDangerous=Estás ejecutando una ramificación del servidor que se considera extremadamente peligrosa y puede conllevar la pérdida de datos. Se recomienda encarecidamente que cambies a un software de servidor más estable y de alto rendimiento, como Paper o Tuinity.
serverUnsupportedDangerous=Está ejecutando un fork de servidor que se sabe que es extremadamente peligroso y que lleva a la pérdida de datos. Se recomienda encarecidamente que cambie a un software de servidor más estable como PaperMC.
serverUnsupportedLimitedApi=Está ejecutando un servidor con una funcionalidad API limitada. EssentialsX seguirá funcionando, pero ciertas características pueden estar desactivadas.
serverUnsupportedDumbPlugins=Estás usando plugins que se sabe que causan graves problemas con EssentialsX y otros plugins.
serverUnsupportedMods=Estás ejecutando un servidor que no es compatible con los plugins de Bukkit. ¡No se deben utilizar con mods de Forge/Fabric\! Para Forge\: es recomendable usar ForgeEssentials o SpongeForge + Nucleus.
setBal=§aEconomía personal establecida en {0}.
setBalOthers=§aLa economia de {0}§a ha sido establecida a {1}.
setSpawner=§Cambiado tipo de generador a§c {0}§6.
sethomeCommandDescription=Establece tu hogar en tu posición actual.
sethomeCommandUsage=/<command> [[jugador\:]nombre]
sethomeCommandUsage1=/<comando> <nombre>
sethomeCommandUsage2=/<comando> <jugador>\:<nombre>
sethomeCommandUsage1=/<command> <name>
sethomeCommandUsage1Description=Establece tu hogar con el nombre dado en tu ubicación
sethomeCommandUsage2=/<command> <player>\:<name>
sethomeCommandUsage2Description=Establece el hogar con el nombre dado el jugador especificado en tu ubicación
setjailCommandDescription=Crea una cárcel donde especificaste, llamada [jailname].
setjailCommandUsage=/<command> <cárcel>
setjailCommandUsage1=/<command> <cárcel>
setjailCommandUsage=/<command> <jailname>
setjailCommandUsage1=/<command> <jailname>
setjailCommandUsage1Description=Establece la cárcel con el nombre dado en tu ubicación
settprCommandDescription=Establece la ubicación y parámetros de teletransporte aleatorio.
settprCommandUsage=/<command> [center|minrange|maxrange] [valor]
settprCommandUsage1=/<command> centro
settprCommandUsage1Description=Establece el centro del teletransporte aleatorio en tu ubicación
settprCommandUsage2=/<comando> rangomin <radio>
settprCommandUsage2Description=Establece el radio mínimo de teletransporte aleatorio al valor dado
settprCommandUsage3=/<comando> rangomax <radio>
settprCommandUsage3Description=Establece el radio de teletransporte aleatorio máximo al valor dado
settpr=§6Establece un centro de teletransporte aleatorio.
settprValue=§6Establece un teletransporte aleatorio desde §c{0}§6 a §c{1}§6.
setwarpCommandDescription=Crea un nuevo warp.
setwarpCommandUsage=/<command> <warp>
setwarpCommandUsage1=/<command> <warp>
setwarpCommandUsage1Description=Establece el warp con el nombre especificado en tu ubicación
setworthCommandDescription=Establece el valor de venta de un item.
setworthCommandUsage=/<command> [item|id] <precio>
setworthCommandUsage1=/<command> <price>
setworthCommandUsage1Description=Establece el valor del objeto sostenido al precio dado
setworthCommandUsage2=/<command> <itemname> <price>
setworthCommandUsage2Description=Establece el valor del objeto especificado al precio dado
sheepMalformedColor=§4Color malformado.
shoutDisabled=§6Modo gritar §cdesactivado§6.
shoutDisabledFor=§6Modo gritar §cdesactivado §6para §c{0}§6.
@@ -1029,16 +1125,25 @@ editsignCommandClearLine=§6Borrada linea§c {0}§6.
showkitCommandDescription=Muestra los contenidos de un kit.
showkitCommandUsage=/<command> <kit>
showkitCommandUsage1=/<command> <kit>
showkitCommandUsage1Description=Muestra un resumen de los objetos en el kit especificado
editsignCommandDescription=Edita un cartel en el mundo.
editsignCommandLimit=§4El texto proporcionado es demasiado largo para que quepa en el cartel de destino.
editsignCommandNoLine=§4Debes indicar un número de línea entre §c1-4§4.
editsignCommandSetSuccess=§6Se estableció la línea§c {0}§6 a "§c{1}§6".
editsignCommandTarget=§4Debes mirar un cartel para editar su texto.
editsignCopy=§6¡Firma copiada\! Pégala con §c/{0}§6.
editsignCopyLine=§6¡Línea §c{0} §6de firma copiada\! Pégala con §c/{1}{0}§6.
editsignPaste=§6¡Firma pegada\!
editsignPasteLine=§6¡Línea de firma §c{0} §6pegada\!
editsignCommandUsage=/<comando> <set/clear/copy/paste> [número de línea] [texto]
editsignCopy=§6¡Letrero copiado\! Pégalo con §c/{0}§6.
editsignCopyLine=§6¡Línea §c{0} §6de letrero copiada\! Pégala con §c/{1}{0}§6.
editsignPaste=§6¡Letrero pegado\!
editsignPasteLine=§6¡Línea de letrero §c{0} §6pegada\!
editsignCommandUsage=/<command> <set/clear/copy/paste> [número de línea] [texto]
editsignCommandUsage1=/<comando> poner <número de línea> <texto>
editsignCommandUsage1Description=Pone el texto dado en la línea especificada del cartel
editsignCommandUsage2=/<comando> borrar <número de línea>
editsignCommandUsage2Description=Borra la línea especificada del cartel señalado
editsignCommandUsage3=/<comando> copiar [número de línea]
editsignCommandUsage3Description=Copia todo (o la línea especificada) el cartel señalado al portapapeles
editsignCommandUsage4=/<comando> pegar [número de línea]
editsignCommandUsage4Description=Pega el portapapeles a todo (o a la línea especificada) del cartel señalado
signFormatFail=§4[{0}]
signFormatSuccess=§1[{0}]
signFormatTemplate=[{0}]
@@ -1051,7 +1156,9 @@ skullChanged=§6Calavera cambiada a §c{0}§6.
skullCommandDescription=Establece el dueño de un cráneo
skullCommandUsage=/<command> [dueño]
skullCommandUsage1=/<command>
skullCommandUsage1Description=Obtienes tu propia cabeza
skullCommandUsage2=/<command> <jugador>
skullCommandUsage2Description=Obtiene la cabeza del jugador especificado
slimeMalformedSize=§4Medidas malformadas.
smithingtableCommandDescription=Abre una mesa de herrería.
smithingtableCommandUsage=/<command>
@@ -1061,22 +1168,34 @@ socialSpyMutedPrefix=§f[§6SS§f] §7(muted) §r
socialspyCommandDescription=Cambia si puedes ver msg/mail en chat.
socialspyCommandUsage=/<command> [jugador] [on|off]
socialspyCommandUsage1=/<command> [jugador]
socialspyCommandUsage1Description=Activa o desactiva el espía social para ti u otro jugador si se especifica
socialSpyPrefix=§f[§6SS§f] §r
soloMob=§4A este mob le gusta estar solo.
spawned=nacido
spawnerCommandDescription=Cambia el tipo de mob de un generador.
spawnerCommandUsage=/<command> <mob> [retraso]
spawnerCommandUsage1=/<command> <mob> [retraso]
spawnerCommandUsage1Description=Cambia el tipo de mob (y opcionalmente, la demora) del spawner que estés mirando
spawnmobCommandDescription=Invoca a un mob.
spawnmobCommandUsage=<command> <mob>[\:data][,<mount>[\:data]] [cantidad] [jugador]
spawnmobCommandUsage1=/<comando> <mob>[\:data] [cantidad] [jugador]
spawnmobCommandUsage1Description=Genera uno (o la cantidad especificada) del mob dado en tu ubicación (o la de otro jugador si se especifica)
spawnmobCommandUsage2=/<comando> <mob>[\:data],<motura>[\:data] [cantidad] [jugador]
spawnmobCommandUsage2Description=Genera uno (o la cantidad especificada) del mob dado montado en el mob dado en tu ubicación (o la de otro jugador si se especifica)
spawnSet=§6El lugar de aparición o el sitio del comando /spawn ha sido colocado para el grupo§c {0}§6.
spectator=espectador
speedCommandDescription=Cambia tus límites de velocidad.
speedCommandUsage=/<command> [tipo] <velocidad> [jugador]
speedCommandUsage1=/<command> <speed>
speedCommandUsage1Description=Establece tu velocidad de volar o de andar a la velocidad dada
speedCommandUsage2=/<command> <type> <speed> [player]
speedCommandUsage2Description=Establece el tipo de velocidad especificado a la velocidad dada para ti u otro jugador si se especifica
stonecutterCommandDescription=Abre un cortapiedras.
stonecutterCommandUsage=/<command>
sudoCommandDescription=Fuerza a otro usuario ejecutar un comando.
sudoCommandUsage=/<command> <jugador> <comando [argumentos]>
sudoCommandUsage1=/<command> <player> <command> [args]
sudoCommandUsage1Description=Hace que el jugador especificado ejecute el comando dado
sudoExempt=§4No puedes usar el comando sudo con este jugador.
sudoRun=§6Forcing§c {0} §6to run\:§r /{1}
suicideCommandDescription=Te hace perecer.
@@ -1115,16 +1234,29 @@ tempbanExemptOffline=§4No puedes banear temporalmente a jugadores que no están
tempbanJoin=You are banned from this server for {0}. Reason\: {1}
tempBanned=§cSe te ha baneado temporalmente por §r {0}\:\n§r{2}
tempbanCommandDescription=Banea temporalmente un usuario.
tempbanCommandUsage=/<command> <playername> <datediff> [reason]
tempbanCommandUsage1=/<comando> <jugador> <duración> [razón]
tempbanCommandUsage1Description=Banea al jugador dado durante la cantidad especificada de tiempo por una razón opcional
tempbanipCommandDescription=Banea temporalmente una dirección IP.
tempbanipCommandUsage=/<command> <playername> <datediff> [reason]
tempbanipCommandUsage1=/<comando> <jugador|dirección-ip> <duración> [razón]
tempbanipCommandUsage1Description=Banea la dirección IP dado durante la cantidad especificada de tiempo por una razón opcional
thunder=§6Has cambiado los truenos a§c {0} §6en tu mundo.
thunderCommandDescription=Activa/desactiva las tormentas.
thunderCommandUsage=/<command> <true/false> [duración]
thunderCommandUsage1=/<command> <true|false> [duration]
thunderCommandUsage1Description=Activa/desactiva los truenos durante una duración opcional
thunderDuration=§6Has§c {0} §6una tormenta en tu mundo durante§c {1} §6segundos.
timeBeforeHeal=Tiempo antes de la siguiente curacion\: {0}
timeBeforeTeleport=§4Tiempo antes del próximo teletransporte\:§c {0}§4.
timeCommandDescription=Muestra/Cambia la hora del mundo. Por defecto es el mundo actual.
timeCommandUsage=/<command> [set|add] [day|night|dawn|17\:30|4pm|4000ticks] [mundo|all]
timeCommandUsage1=/<command>
timeCommandUsage1Description=Muestra las horas de todos los mundos
timeCommandUsage2=/<comando> ajustar <tiempo> [mundo|todo]
timeCommandUsage2Description=Establece la hora del mundo actual (o el especificado) a la hora dada
timeCommandUsage3=/<comando> añadir <tiempo> [mundo|todo]
timeCommandUsage3Description=Añade la hora dada a la hora del mundo actual (o del especificado)
timeFormat=§c{0}§6 o §c{1}§6 o §c{2}§6
timeSetPermission=§4No tienes permitido cambiar la hora.
timeSetWorldPermission=§4You are not authorized to set the time in world ''{0}''.
@@ -1137,6 +1269,7 @@ togglejailCommandUsage=/<command> <jugador> <jail> [tiempo]
toggleshoutCommandDescription=Alterna si estás hablando en modo grito
toggleshoutCommandUsage=/<command> [jugador] [on|off]
toggleshoutCommandUsage1=/<command> [jugador]
toggleshoutCommandUsage1Description=Activa o desactiva el modo grito para ti u otro jugador si se especifica
topCommandDescription=Teletransporta al bloque más alto en tu posición actual.
topCommandUsage=/<command>
totalSellableAll=§aEl precio total de todos los objetos vendibles es de §c {1}.
@@ -1146,61 +1279,89 @@ totalWorthBlocks=§aVendidos todos los bloques por un total de §c{1}§a.
tpCommandDescription=Teletransporta a un jugador.
tpCommandUsage=/<command> <jugador> [otroJugador]
tpCommandUsage1=/<command> <jugador>
tpCommandUsage1Description=Te teletransporta al jugador especificado
tpCommandUsage2=/<comando> <jugador> <otro jugador>
tpCommandUsage2Description=Teletransporta el primer al segundo jugador especificado
tpaCommandDescription=Envía solicitud de teletransporte al jugador especificado.
tpaCommandUsage=/<command> <jugador>
tpaCommandUsage1=/<command> <jugador>
tpaCommandUsage1Description=Solicita teletransportarse al jugador especificado
tpaallCommandDescription=Solicita a todos los jugadores en línea a teletransportarse hacia ti.
tpaallCommandUsage=/<command> <jugador>
tpaallCommandUsage1=/<command> <jugador>
tpaallCommandUsage1Description=Solicita a todos los jugadores que se teletransporten a ti
tpacancelCommandDescription=Cancela todas las solicitudes de teletransporte pendientes. Especifica [player] para cancelar las solicitudes con aquel jugador.
tpacancelCommandUsage=/<command> [jugador]
tpacancelCommandUsage1=/<command>
tpacancelCommandUsage1Description=Cancela todas tus solicitudes de teletransporte pendientes
tpacancelCommandUsage2=/<command> <jugador>
tpacancelCommandUsage2Description=Cancela todas tus solicitudes de teletransporte pendientes con el jugador especificado
tpacceptCommandDescription=Acepta solicitudes de teletransporte.
tpacceptCommandUsage=/<command> [otrojugador]
tpacceptCommandUsage1=/<command>
tpacceptCommandUsage1Description=Acepta la solicitud de teletransporte más reciente
tpacceptCommandUsage2=/<command> <jugador>
tpacceptCommandUsage2Description=Acepta la solicitud de teletransporte del jugador especificado
tpacceptCommandUsage3=/<comando> *
tpacceptCommandUsage3Description=Acepta todas las solicitudes de teletransporte
tpahereCommandDescription=Solicita que el jugador especificado se teletransporte hacia ti.
tpahereCommandUsage=/<command> <jugador>
tpahereCommandUsage1=/<command> <jugador>
tpahereCommandUsage1Description=Solicita que el jugador especificado se teletransporte a ti
tpallCommandDescription=Teletransporta todos los jugadores en línea a otro jugador.
tpallCommandUsage=/<command> [jugador]
tpallCommandUsage1=/<command> [jugador]
tpallCommandUsage1Description=Teletransporta a todos los jugadores a ti, u otro jugador si se especifica
tpautoCommandDescription=Automáticamente acepta solicitudes de teletransporte.
tpautoCommandUsage=/<command> [jugador]
tpautoCommandUsage1=/<command> [jugador]
tpautoCommandUsage1Description=Activa o desactiva si las solicitudes de teletransporte se aceptan automáticamente para ti u otro jugador si se especifica
tpdenyCommandDescription=Rechaza las solicitudes de teletransporte.
tpdenyCommandUsage=/<command>
tpdenyCommandUsage1=/<command>
tpdenyCommandUsage1Description=Rechaza la solicitud de teletransporte más reciente
tpdenyCommandUsage2=/<command> <jugador>
tpdenyCommandUsage2Description=Rechaza la solicitud de teletransporte del jugador especificado
tpdenyCommandUsage3=/<comando> *
tpdenyCommandUsage3Description=Rechaza todas las solicitudes de teletransporte
tphereCommandDescription=Teletransporta un jugador hacia ti.
tphereCommandUsage=/<command> <jugador>
tphereCommandUsage1=/<command> <jugador>
tphereCommandUsage1Description=Teletransporta al jugador especificado a ti
tpoCommandDescription=Teletransporte anulado en tptoggle.
tpoCommandUsage=/<command> <jugador> [otroJugador]
tpoCommandUsage1=/<command> <jugador>
tpoCommandUsage1Description=Teletransporta al jugador especificado a ti sobrescribiendo sus preferencias
tpoCommandUsage2=/<comando> <jugador> <otro jugador>
tpoCommandUsage2Description=Teletransporta el primer jugador especificado al segundo sobrescribiendo sus preferencias
tpofflineCommandDescription=Teletransporta a la última ubicación de desconexión de un jugador
tpofflineCommandUsage=/<command> <jugador>
tpofflineCommandUsage1=/<command> <jugador>
tpofflineCommandUsage1Description=Te teletransporta al lugar de desconexión del jugador especificado
tpohereCommandDescription=Teletransporte aquí anulado en tptoggle.
tpohereCommandUsage=/<command> <jugador>
tpohereCommandUsage1=/<command> <jugador>
tpohereCommandUsage1Description=Teletransporta al jugador especificado a ti sobrescribiendo sus preferencias
tpposCommandDescription=Teletransportar a coordenadas.
tpposCommandUsage=/<command> <x> <y> <z> [yaw] [pitch] [world]
tpposCommandUsage1=/<command> <x> <y> <z> [yaw] [pitch] [world]
tpposCommandUsage1Description=Te teletransporta al lugar especificado con un cabeceo, balanceo, y/o mundo opcional
tprCommandDescription=Teletransporta al azar.
tprCommandUsage=/<command>
tprCommandUsage1=/<command>
tprCommandUsage1Description=Te teletransporta a una ubicación aleatoria
tprSuccess=§6Teletransportando a una ubicación aleatoria...
tps=§6Ticks por segundo \= {0}
tptoggleCommandDescription=Bloquea todas las formas de teletransportación.
tptoggleCommandUsage=/<command> [jugador] [on|off]
tptoggleCommandUsage1=/<command> [jugador]
tptoggleCommandUsageDescription=Activa o desactiva el teletransporte para ti u otro jugador si se especifica
tradeSignEmpty=Esta tienda no tiene nada disponible para ti.
tradeSignEmptyOwner=No hay nada que recojer de esta tienda.
treeCommandDescription=Genera un árbol donde miras.
treeCommandUsage=/<command> <tree|birch|redwood|redmushroom|brownmushroom|jungle|junglebush|swamp>
treeCommandUsage1=/<command> <tree|birch|redwood|redmushroom|brownmushroom|jungle|junglebush|swamp>
treeCommandUsage1Description=Genera un árbol del tipo especificado donde estés mirando
treeFailure=§cError al generar el árbol. Prueba de nuevo en tierra, tierra húmeda o hierba.
treeSpawned=§7Árbol generado.
true=§así§f
@@ -1213,15 +1374,23 @@ unableToSpawnMob=§4No puedes generar criaturas.
unbanCommandDescription=Desbanea el jugador especificado.
unbanCommandUsage=/<command> <jugador>
unbanCommandUsage1=/<command> <jugador>
unbanCommandUsage1Description=Desbanea el jugador especificado
unbanipCommandDescription=Desbanea la dirección IP especificada.
unbanipCommandUsage=/<command> <dirección IP>
unbanipCommandUsage1=/<command> <dirección IP>
unbanipCommandUsage1Description=Desbanea la dirección IP especificada
unignorePlayer=§6Ya no ignoras al jugador§c {0}§6.
unknownItemId=§4ID de ítem desconocido\:§r {0}§4.
unknownItemInList=§4Ítem desconocido {0} en {1} lista.
unknownItemName=§4Nombre de ítem desconocido\: {0}.
unlimitedCommandDescription=Permite la colocación infinita de items.
unlimitedCommandUsage=/<command> <list|item|clear> [jugador]
unlimitedCommandUsage1=/<comando> lista [jugador]
unlimitedCommandUsage1Description=Muestra una lista de elementos ilimitados para ti u otro jugador si se especifica
unlimitedCommandUsage2=/<comando> <objeto> [jugador]
unlimitedCommandUsage2Description=Activa o desactiva si el objeto dado es ilimitado para ti u otro jugador si se especifica
unlimitedCommandUsage3=/<comando> limpiar [jugador]
unlimitedCommandUsage3Description=Limpia todos los objetos ilimitados para ti u otro jugador si se especifica
unlimitedItemPermission=§4Sin permiso para artículo ilimitado §c{0}§4.
unlimitedItems=§6Ítems ilimitados\:§r
unmutedPlayer=§6El jugador§c {0} §6ya no está silenciado.
@@ -1250,6 +1419,7 @@ vanish=§6Invisibilidad mágica para {0}§6\:§c {1}
vanishCommandDescription=Te oculta de otros jugadores.
vanishCommandUsage=/<command> [jugador] [on|off]
vanishCommandUsage1=/<command> [jugador]
vanishCommandUsage1Description=Activa o desactiva el modo invisible para ti u otro jugador si se especifica
vanished=§6Ahora eres invisible para los usuarios normales, ellos no podrán detectarte ni con comandos.
versionCheckDisabled=§6Comprobación de actualización desactivada en config.
versionCustom=§6¡Error al comprobar tu versión\! ¿Autocompilar? Info. de compilación\: §c{0}§6.
@@ -1279,12 +1449,16 @@ voiceSilencedReasonTime=§6Tu voz ha sido silenciada por {0}\! Razón\: §c{1}
walking=caminando
warpCommandDescription=Lista todos los warp o teletransporta al warp especificado.
warpCommandUsage=/<command> <página|warp> [jugador]
warpCommandUsage1=/<comando> [página]
warpCommandUsage1=/<command> [página]
warpCommandUsage1Description=Enumera todos los warps en la primera página, o en la especificada
warpCommandUsage2=/<comando> <warp> [jugador]
warpCommandUsage2Description=Teletransporta a ti o a un jugador especificado al warp dado
warpDeleteError=Problema al borrar el archivo de teletransporte.
warpInfo=§6Información del warp§c {0}§6\:
warpinfoCommandDescription=Encuentra información de ubicación de un warp específico.
warpinfoCommandUsage=/<command> <warp>
warpinfoCommandUsage1=/<command> <warp>
warpinfoCommandUsage1Description=Proporciona información sobre el warp dado
warpingTo=§6Teletransportando a§c {0}§6...
warpList={0}
warpListPermission=§cNo tienes permiso para listar esos teletransportes.
@@ -1294,6 +1468,8 @@ warps=§6Warps\:§r {0}
warpsCount=§6Hay§c {0} §6puntos de teletransporte. Mostrando página §c{1} §6de §c{2}§6.
weatherCommandDescription=Establece el clima.
weatherCommandUsage=/<command> <storm/sun> [duración]
weatherCommandUsage1=/<comando> <tormenta|sol> [duración]
weatherCommandUsage1Description=Establece el clima del tipo dado durante una duración opcional
warpSet=§6El Warp§c {0} §6ha sido establecido.
warpUsePermission=§4No tienes permisos para usar ese Warp.
weatherInvalidWorld=¡No se ha podido encontrar el mundo llamado "{0}"\!
@@ -1310,6 +1486,7 @@ whoisBanned=§7 - Baneado\:§f {0}
whoisCommandDescription=Determina el usuario real detrás de un apodo.
whoisCommandUsage=/<command> <apodo>
whoisCommandUsage1=/<command> <jugador>
whoisCommandUsage1Description=Proporciona información básica sobre el jugador especificado
whoisExp=§7 - Exp\:§f {0} (Nivel {1})
whoisFly=§7 - Modo volar\:§f {0} ({1})
whoisSpeed=§6 - Velocidad\:§r {0}
@@ -1335,9 +1512,20 @@ workbenchCommandUsage=/<command>
worldCommandDescription=Alterna entre mundos.
worldCommandUsage=/<command> [mundo]
worldCommandUsage1=/<command>
worldCommandUsage1Description=Te teletransporta a tu ubicación actual en el nether o en el mundo normal
worldCommandUsage2=/<comando> <mundo>
worldCommandUsage2Description=Te teletransporta a tu ubicación en el mundo dado
worth=§7Pila de {0} con valor de §c{1}§7 ({2} objeto(s) a {3} cada uno)
worthCommandDescription=Calcula el valor de los items en la mano o especificados.
worthCommandUsage=/<command> <<item>|<id>|hand|inventory|blocks> [-][cantidad]
worthCommandUsage1=/<comando> <nombredeitem> [cantidad]
worthCommandUsage1Description=Comprueba el valor de todo (o la cantidad dada, si se especifica) del objeto dado en tu inventario
worthCommandUsage2=/<comando> mano [cantidad]
worthCommandUsage2Description=Comprueba el valor de todo (o la cantidad dada, si se especifica) del objeto sostenido
worthCommandUsage3=/<comando> todos
worthCommandUsage3Description=Comprueba el valor de todos los objetos posibles en tu inventario
worthCommandUsage4=/<comando> bloques [cantidad]
worthCommandUsage4Description=Comprueba el valor de todos (o la cantidad dada, si se especifica) los bloques en tu inventario
worthMeta=§7Pila de {0} con metadata de {1} , con valor de §c{2}§7 ({3} objeto(s) a {4} cada uno)
worthSet=Establecer valor
year=año
@@ -126,7 +126,7 @@ cantReadGeoIpDB=GeoIP andmebaasi lugemisel esines viga\!
cantSpawnItem=§4Sul puudub eseme§c {0}§4 tekitamiseks luba.
cartographytableCommandDescription=Avab kartograafialaua.
cartographytableCommandUsage=/<käsklus>
chatTypeLocal=[K]
chatTypeLocal=§3[L]
chatTypeSpy=[Spioon]
cleaned=Kasutajafailid puhastatud.
cleaning=Kasutajafailide puhastamine.
@@ -233,8 +233,33 @@ destinationNotSet=Sihtkoht on määramata\!
disabled=keelatud
disabledToSpawnMob=§4Selle eluka tekitamine on seadistustes keelatud.
disableUnlimited=§6Mängijale§c {1}§6 on keelatud ploki§c {0} §6lõpmatu asetamine.
discordbroadcastCommandDescription=Edastab teate määratud Discordi kanalile.
discordbroadcastCommandUsage=/<käsklus> <kanal> <sõnum>
discordbroadcastCommandUsage1=/<käsklus> <kanal> <sõnum>
discordbroadcastCommandUsage1Description=Saadab antud sõnumi määratud Discordi kanalile
discordbroadcastInvalidChannel=§4Discordi kanalit §c{0}§4 ei eksisteeri.
discordbroadcastPermission=§4Teil pole luba §c{0}§4 kanalile sõnumeid saata.
discordbroadcastSent=§6Sõnum saadetud kanalisse §c{0}§6\!
discordCommandDescription=Saadab discordi kutse lingi mängijale.
discordCommandLink=§6Liitu meie Discordi serveriga §c{0}§6\!
discordCommandUsage=/<käsklus>
discordCommandUsage1=/<käsklus>
discordCommandUsage1Description=Saadab discordi kutse lingi mängijale
discordCommandExecuteDescription=Täidab Minecrafti serveris konsoolikäsu.
discordCommandExecuteArgumentCommand=Käivitatav käsklus
discordCommandExecuteReply=Käskluse käivitamine\: "/{0}"
discordCommandListDescription=Hangib võrgumängijate nimekirja.
discordCommandListArgumentGroup=Konkreetne rühm, mille järgi otsingut piirata
discordCommandMessageDescription=Saadab sõnumeid Minecrafti serveris olevale mängijale.
discordCommandMessageArgumentUsername=Mängija, kellele sõnum saata
discordCommandMessageArgumentMessage=Sõnum, mis tuleb mängijale saata
discordErrorCommand=Lisasite oma roboti oma serverisse valesti. Järgige konfiguratsioonis toodud õpetust ja lisage oma robot, kasutades https\://essentialsx.net/discord.html\!
discordErrorCommandDisabled=See käsklus on keelatud\!
discordErrorLogin=Discordi sisselogimisel ilmnes viga, mis põhjustas pistikprogrammi enda keelamise\:\n{0}
discordErrorLoggerInvalidChannel=Discordi konsooli logimine on keelatud kanali definitsiooni tõttu\! Kui kavatsete selle keelata, määrake kanali ID-ks "puudub"; muul juhul kontrollige, kas teie kanali ID on õige.
discordErrorLoggerNoPerms=Discordi konsooli logija on ebapiisavate õiguste tõttu keelatud\! Veenduge, et teie robotil on serveris õigused "Halda veebihaake". Pärast selle parandamist käivitage "/ess reload".
discordLoggingIn=Proovin logida Discordi...
discordLoggingInDone=Edukalt sisse logitud kui {0}
disposal=Prügišaht
disposalCommandDescription=Avab kaasaskantava hävitusmenüü.
disposalCommandUsage=/<käsklus>
@@ -248,11 +273,11 @@ ecoCommandDescription=Haldab serveri ökonoomiat.
ecoCommandUsage=/<käsklus> <give|take|set|reset> <mängija> <kogus>
ecoCommandUsage1=/<käsklus> give <mängija> <summa>
ecoCommandUsage1Description=Annab määratud mängijale valitud hulgal raha
ecoCommandUsage2=/<käsklus> take <mängija> <kogus>
ecoCommandUsage2=/<käsklus> take <mängija> <summa>
ecoCommandUsage2Description=Võtab määratud mängijalt valitud hulga raha
ecoCommandUsage3=/<käsklus> set <mängija> <kogus>
ecoCommandUsage3=/<käsklus> set <mängija> <summa>
ecoCommandUsage3Description=Määrab määratud mängija rahasummaks valitud hulga raha
ecoCommandUsage4=/<käsklus> reset <mängija> <kogus>
ecoCommandUsage4=/<käsklus> reset <mängija> <summa>
ecoCommandUsage4Description=Lähtestab määratud mängija rahasumma serveri algussummale
editBookContents=§eSa võid nüüd muuta selle raamatu sisu.
enabled=lubatud
@@ -290,6 +315,7 @@ essentialsCommandUsage6=/<käsklus> cleanup
essentialsCommandUsage6Description=Kustutab vanad kasutajate andmed
essentialsCommandUsage7=/<käsklus> homes
essentialsCommandUsage7Description=Haldab kasutaja kodusid
essentialsCommandUsage8=/<käsklus> dump [all] [config] [discord] [kits] [log]
essentialsHelp1=Fail on vigane ning Essentials ei saa seda avada. Essentials on nüüd keelatud. Kui sa ei suuda seda faili ise parandada, mine aadressile http\://tiny.cc/EssentialsChat
essentialsHelp2=Fail on vigane ning Essentials ei saa seda avada. Essentials on nüüd keelatud. Kui sa ei suuda seda faili ise parandada, kirjuta mängus /essentialshelp või mine aadressile http\://tiny.cc/EssentialsChat
essentialsReload=§6Essentials taaslaetud§c {0}.
@@ -442,7 +468,7 @@ homeConfirmation=§6Sul juba on kodu nimega §c{0}§6\!\nOlemasoleva kodu üleki
homeSet=§6Kodu määratud.
hour=tund
hours=tundi
ice=§Sa tunned end jahedana...
ice=§Sa tunned end tunduvalt jahedamana...
iceCommandDescription=Jahutab mängija maha.
iceCommandUsage=/<käsklus> [mängija]
iceCommandUsage1=/<käsklus>
@@ -450,8 +476,8 @@ iceCommandUsage1Description=Jahutab sind maha
iceCommandUsage2=/<käsklus> <mängija>
iceCommandUsage2Description=Jahutab antud mängija maha
iceCommandUsage3=/<käsklus> *
iceCommandUsage3Description=Jahutab kõik aktiivsed mängijad maha
iceOther=§6Jahtumine§c {0}§6.
iceCommandUsage3Description=Jahutab kõik võrgus olevad mängijad maha
iceOther=§6Mängija§c {0}§6 jahutamine.
ignoreCommandDescription=Ignoreeri või ära ignoreeri teisi mängijaid.
ignoreCommandUsage=/<käsklus> <mängija>
ignoreCommandUsage1=/<käsklus> <mängija>
@@ -499,12 +525,13 @@ itemCommandDescription=Tekita ese.
itemCommandUsage=/<käsklus> <ese|number> [kogus [esememeta...]]
itemCommandUsage1=/<käsklus> <ese> [kogus]
itemCommandUsage1Description=Annab sulle terve kuhja (või määratud koguses) esemeid
itemCommandUsage2=/<käsklus> <mängija> <ese> <kogus> <metaandmed>
itemCommandUsage2=/<käsklus> <ese> <kogus> <metaandmed>
itemCommandUsage2Description=Annab mängijale määratud koguse määratud koguse esemeid koos antud metaandmetega
itemId=§6ID\:§c {0}
itemloreClear=§6Sa oled tühjendanud selle eseme vihjeteksti.
itemloreCommandDescription=Muuda eseme vihjeteksti.
itemloreCommandUsage=/<käsklus> <add/set/clear> [text/line] [tekst]
itemloreCommandUsage1=/<käsklus> add [tekst]
itemloreCommandUsage1Description=Lisatud antud teksti käes hoitava eseme vihjeteksti
itemloreCommandUsage2=/<käsklus> set <reanumber> <tekst>
itemloreCommandUsage2Description=Määrab kindlaks etteantud eseme vihjeteksti rea
@@ -545,6 +572,9 @@ jailAlreadyIncarcerated=§4Mängija on juba vanglas\:§c {0}
jailList=§6Vanglad\:§r {0}
jailMessage=§4Sooritasid kuriteo, istud oma aja ära.
jailNotExist=§4Sellist vanglat pole olemas.
jailNotifyJailed=§6Mängija§c {0} §6on §c{1}§6 poolt vangistatud.
jailNotifyJailedFor=§6Mängija§c {0} §6on §c{2}§6 poolt vangistatud põhjusega§c {1}§6.
jailNotifySentenceExtended=§6Mängija§c {0} §6vangistusaega on §c{2}§6 poolt pikendatud ajani §c{1}§6.
jailReleased=§6Mängija §c{0}§6 on vanglast vabastatud.
jailReleasedPlayerNotify=§6Sind vabastati vanglast\!
jailSentenceExtended=§6Vangi aega pikendati järgnevalt\: {0}
@@ -621,24 +651,34 @@ listCommandUsage1=/<käsklus> [grupp]
listCommandUsage1Description=Loetleb kõik mängijad serveris või antud rühmas, kui see on määratletud
listGroupTag=§6{0}§r\:
listHiddenTag=§7[PEIDETUD]§r
listRealName=({0})
loadWarpError=§4Koolu {0} laadimisel esines viga.
localFormat=[K]<{0}> {1}
loomCommandDescription=Avab kangasteljed.
loomCommandUsage=/<käsklus>
mailClear=§6Postkasti tühjendamiseks kirjuta§c /mail clear§6.
mailCleared=§6Postkast tühjendatud\!
mailClearIndex=§4Sa pead valima numbri 1-{0} vahel.
mailCommandDescription=Haldab üle-mängija, üle-serverilist postkastisüsteemi.
mailCommandUsage=/<käsklus> [read|clear|clear [arv]|send [mängijale] [sõnum]|sendtemp [mängijale] [aegumisaeg] [sõnum]|sendall [sõnum]]
mailCommandUsage1=/<käsklus> read [lk]
mailCommandUsage1Description=Loeb teie kirja esimest (või täpsustatud) lehte
mailCommandUsage2=/<käsklus> clear [arv]
mailCommandUsage3=/<käsklus> send <mängija> <sõnum>
mailCommandUsage3Description=Saadab määratud mängijale antud sõnumi
mailCommandUsage4=/<käsklus> sendall <sõnum>
mailCommandUsage4Description=Saadab kõikidele mängijatele antud sõnumi
mailCommandUsage5=/<käsklus> sendtemp <mängija> <aegumisaeg> <sõnum>
mailCommandUsage6=/<käsklus> sendtempall <aegumisaeg> <sõnum>
mailDelay=Saatsid viimase minuti jooksul liiga palju kirju. Maksimaalne kirjade saatmise arv\: {0}
mailFormatNew=§6[§r{0}§6] §6[§r{1}§6] §r{2}
mailFormatNewTimed=§6[§e⚠§6] §6[§r{0}§6] §6[§r{1}§6] §r{2}
mailFormatNewRead=§6[§r{0}§6] §6[§r{1}§6] §7§o{2}
mailFormatNewReadTimed=§6[§e⚠§6] §6[§r{0}§6] §6[§r{1}§6] §7§o{2}
mailFormat=§6[§r{0}§6] §r{1}
mailMessage={0}
mailSent=§6Kiri saadetud\!
mailSentTo=§6Mängijale §c{0}§6 saadeti järgnev kiri\:
mailSentToExpire=§6Mängijale §c{0}§6 saadeti järgnev kiri, mis aegub §c{1}§6\:
mailTooLong=§4Kiri on liiga pikk. Püüa see hoida alla 1000 tähemärgi.
markMailAsRead=§6Kirjade loetuks märkimiseks kirjuta §c /mail clear§6.
matchingIPAddress=§6Sellelt IP-aadressilt on eelnevalt sisse loginud järgnevad mängijad\:
@@ -718,6 +758,7 @@ nearCommandUsage3Description=Loetleb kõik mängijad, kes asuvad täpsustatud m
nearCommandUsage4=/<käsklus> <mängija> <raadius>
nearCommandUsage4Description=Loetleb kõik mängijad, kes asuvad täpsustatud mängija antud raadiuses
nearbyPlayers=§6Läheduses olevad mängijad\:§r {0}
nearbyPlayersList={0}§f(§c{1}m§f)
negativeBalanceError=§4Kasutajal ei tohi olla negatiivne rahasumma.
nickChanged=§6Hüüdnimi on muudetud.
nickCommandDescription=Muuda enda või teise mängija hüüdnime.
@@ -771,8 +812,6 @@ noPlacePermission=§4Sul puudub luba selle sildi juurde ploki asetamiseks.
noPotionEffectPerm=§4Sul puudub luba sellele võlujoogile efekti §c{0} §4 rakendamiseks.
noPowerTools=§6Sul puuduvad võimutööriistad.
notAcceptingPay=§4Mängija §4{0} §4ei võta makseid vastu.
notAllowedToQuestion=§4Sul puudub küsimuse kasutamiseks luba.
notAllowedToShout=§4Sul puudub hüüdmiseks luba.
notEnoughExperience=§4Sul pole piisavalt kogemuspunkte.
notEnoughMoney=§4Sul pole piisavalt raha.
notFlying=ei lenda
@@ -834,6 +873,8 @@ playerUnmuted=§6Sa ei ole enam vaigistatud.
playtimeCommandUsage=/<käsklus> [mängija]
playtimeCommandUsage1=/<käsklus>
playtimeCommandUsage2=/<käsklus> <mängija>
playtime=§6Mänguaeg\:§c {0}
playtimeOther=§6Mängija {1}§6 mänguaeg\:§c {0}
pong=Pong\!
posPitch=§6Vert. pööre\: {0} (pea nurk)
possibleWorlds=§6Võimalikud maailmad on arvud vahemikus §c0§6-§c{0}§6.
@@ -869,7 +910,7 @@ powertoolCommandUsage2=/<käsklus> d\:
powertoolCommandUsage2Description=Kustutab kõik käes oleva eseme tööriistad
powertoolCommandUsage3=/<käsklus> r\:<käsklus>
powertoolCommandUsage3Description=Eemaldab antud käskluse käeshoitavalt esemelt
powertoolCommandUsage4=/<käsklus> <cmd>
powertoolCommandUsage4=/<käsklus> <käsklus>
powertoolCommandUsage4Description=Määrab tööriista käskluse käeshoitavale eseme antud käskluse
powertoolCommandUsage5=/<käsklus> a\:<käsklus>
powertoolCommandUsage5Description=Lisab antud tööriista käskluse käeshoitavale esemele
@@ -887,7 +928,7 @@ pweatherCommandDescription=Määra mängija ilma
pweatherCommandUsage=/<käsklus> [list|reset|storm|sun|clear] [mängija|*]
pweatherCommandUsage1=/<käsklus> list [mängija]|*]
pweatherCommandUsage1Description=Loetleb mängija ilma sinu jaoks või teise mängija, kui on täpsustatud
pweatherCommandUsage2=/<käsklus> <torm|päikesepaisteline> [mängija]|*]
pweatherCommandUsage2=/<käsklus> <storm|sun> [mängija]|*]
pweatherCommandUsage2Description=Määrab ilma sinule või teistele mängijale kui on etteantud ilm
pweatherCommandUsage3=/<käsklus> reset [mängija|*]
pweatherCommandUsage3Description=Lähtestab ilma sinu või teisele mängijale, kui on täpsustatud
@@ -923,7 +964,7 @@ recipe=§6Retsept esemele §c{0}§6 (§c{1}§6/§c{2}§6)
recipeBadIndex=Selle arvuga retsepti ei leitud.
recipeCommandDescription=Kuvab, kuidas esemeid meisterdada.
recipeCommandUsage=/<käsklus> <ese> [number]
recipeCommandUsage1=/<käsklus> <ese> [lehekülg]
recipeCommandUsage1=/<käsklus> <ese> [lk]
recipeCommandUsage1Description=Näitab kuidas meisterdada antud eset
recipeFurnace=§6Sulata\: §c{0}§6.
recipeGrid=§c{0}X §6| §{1}X §6| §{2}X
@@ -935,9 +976,9 @@ recipeShapeless=§6Kombineeri §c{0}
recipeWhere=§6Kus\: {0}
removeCommandDescription=Eemaldab sinu maailmast olemid.
removeCommandUsage=/<käsklus> <all|tamed|named|drops|arrows|boats|minecarts|xp|paintings|itemframes|endercrystals|monsters|animals|ambient|mobs|[elukaliik]> [raadius|maailm]
removeCommandUsage1=/<käsklus> <eluka tüüp> [maailm]
removeCommandUsage1=/<käsklus> <elukatüüp> [maailm]
removeCommandUsage1Description=Eemaldab kõik eluka tüübid selles maailmas või teises, kui on täpsustatud
removeCommandUsage2=/<käsklus> <eluka tüüp> <raadius> [maailm]
removeCommandUsage2=/<käsklus> <elukatüüp> <raadius> [maailm]
removeCommandUsage2Description=Eemaldab antud eluka tüübi antud raadiuses praeguses maailmas või teises, kui on täpsustatud
removed=§c {0} §6 olemit on eemaldatud.
repair=§6Parandasid edukalt oma §c{0}§6.
@@ -951,6 +992,7 @@ repairCommandUsage2Description=Parandab sinu seljakotis kõik esemed
repairEnchanted=§4Sul puudub loitsitud esemete parandamiseks luba.
repairInvalidType=§4Seda eset ei saa parandada.
repairNone=§4Polnud ühtegi eset, mis vajaksid parandamist.
replyFromDiscord=**Vastus mängijalt {0}\:** `{1}`
replyLastRecipientDisabled=§6Viimasele sõnumisaatjale vastamine on §ckeelatud§6.
replyLastRecipientDisabledFor=§6Viimasele sõnumisaatjale vastamine on §ckeelatud §6mängijale §c{0}§6.
replyLastRecipientEnabled=§6Viimasele sõnumisaatjale vastamine on §clubatud§6.
@@ -964,6 +1006,7 @@ requestDeniedFrom=§6Mängija §c{0} §6hülgas su teleporteerumiskutse.
requestSent=§6Kutse saadetud mängijale§c {0}§6.
requestSentAlready=§4Sa juba saatsid teleporteerumiskutse mängijale {0}.
requestTimedOut=§4Teleporteerumiskutse aegus.
requestTimedOutFrom=§4Teleporteerumiskutse mängijalt §c{0} §4on aegunud.
resetBal=§6Rahasumma on taastatud väärtuseks §c{0} §6kõikidel võrgus olevatel mängijatel.
resetBalAll=§6Rahasumma on taastatud väärtuseks §c{0} §6kõikidel mängijatel.
rest=§6Tunned end puhanuna.
@@ -1005,7 +1048,6 @@ serverTotal=§6Serveris kokku\:§c {0}
serverUnsupported=Sa käitad mittetoetatud serveriversiooni\!
serverUnsupportedClass=Olekut määrav klass\: {0}
serverUnsupportedCleanroom=Käitad serverit, mis ei toeta korralikult Bukkiti pluginaid, mis kasutavad sisemist Mojangi koodi. Kaalu oma serveri tarkvaraga sobiva Essentialsi alternatiivi kasutamist.
serverUnsupportedDangerous=Käitad serveri fork''i, mis on teadaolevalt üliohtlik ning võib põhjustada andmekadu. Soovitame tungivalt vahetuda stabiilse ja parema jõudlusega serveri tarkvarale, nagu seda on Paper või Tuinity.
serverUnsupportedLimitedApi=Käitad piiratud rakendusliidesega serverit. EssentialsX töötab siiski, aga mõned funktsioonid võivad olla keelatud.
serverUnsupportedMods=Käitad serverit, mis ei toeta Bukkiti pluginaid korralikult. Bukkiti pluginaid ei peaks koos Forge''i/Fabricu modidega kasutama\! Kaalu Forge''i puhul ForgeEssentialsi või SpongeForge + Nucleuse kasutamist.
setBal=§aSinu rahasummaks on määratud\: {0}.
@@ -1066,7 +1108,7 @@ editsignCommandUsage1=/<käsklus> set <reanumber> <tekst>
editsignCommandUsage1Description=Seadistab määratud rea teksti sihitud märgile
editsignCommandUsage2=/<käsklus> clear <reanumber>
editsignCommandUsage2Description=Puhastab määratud rea sihitud sildilt
editsignCommandUsage3=/<käsklus> copy <reanumber>]
editsignCommandUsage3=/<käsklus> copy [reanumber]
editsignCommandUsage3Description=Kopeerib kõik(või määratud realt) teksti sildilt sinu lõikelauale
editsignCommandUsage4=/<käsklus> paste [reanumber]
editsignCommandUsage4Description=Kleebib sinu lõikelaua sildile või määratud reale sildil
@@ -1101,14 +1143,19 @@ spawnerCommandUsage=/<käsklus> <elukas> [viivitus]
spawnerCommandUsage1=/<käsklus> <elukas> [viivitus]
spawnmobCommandDescription=Tekitab eluka.
spawnmobCommandUsage=/<käsklus> <elukas>[\:andmed][,<seljas>[\:andmed]] [kogus] [mängija]
spawnmobCommandUsage1=/<käsklus> <elukas>[\:andmed] [kogus] [mängija]
spawnmobCommandUsage2=/<käsklus> <elukas>[\:andmed],<seljas>[\:andmed] [kogus] [mängija]
spawnSet=§6Grupi §c {0}§6 tekkekoht on määratud.
spectator=vaatlus
speedCommandDescription=Muuda oma kiirusepiiranguid.
speedCommandUsage=/<käsklus> [fly|walk] <kiirus> [mängija]
speedCommandUsage1=/<käsklus> <kiirus>
speedCommandUsage2=/<käsklus> <tüüp> <kiirus> [mängija]
stonecutterCommandDescription=Avab kivilõikuri.
stonecutterCommandUsage=/<käsklus>
sudoCommandDescription=Sunni teine kasutaja käsklust teostama.
sudoCommandUsage=/<käsklus> <mängija> <käsklus [param.]>
sudoCommandUsage1=/<käsklus> <mängija> <käsklus> [param.]
sudoExempt=§4Sa ei saa mängijat §c{0}§4 sundida.
sudoRun=§6Sunnin mängijat§c {0} §6käivitama käsklust §r /{1}
suicideCommandDescription=Hukatab sind.
@@ -1117,7 +1164,7 @@ suicideMessage=§6Head aega, julm maailm...
suicideSuccess=§6Mängija §c{0} §6võttis endalt elu.
survival=ellujäämine
takenFromAccount=§aSinu kontolt on §e{0}§a maha võetud.
takenFromOthersAccount=§aMängija§e {1}§akontolt on §e{0}§a maha võetud. Uus rahasumma\:§e {2}
takenFromOthersAccount=§aMängija§e {1}§a kontolt on §e{0}§a maha võetud. Uus rahasumma\:§e {2}
teleportAAll=§6Teleporteerumiskutse saadetud kõikidele mängijatele...
teleportAll=§6Teleporteerin kõik mängijad...
teleportationCommencing=§6Teleporteerumine algab...
@@ -1147,17 +1194,24 @@ tempbanExemptOffline=§4Sa ei tohi ajutiselt blokeerida võrgust väljas olevaid
tempbanJoin=Sa oled sellest serverist {0} blokeeritud. Põhjus\: {1}
tempBanned=§cSind blokeeriti sellest serverist ajutiselt§r {0}\:\n§r{2}
tempbanCommandDescription=Blokeerib mängija ajutiselt.
tempbanCommandUsage=/<käsklus> <mängijanimi> <kestus> [põhjus]
tempbanCommandUsage1=/<käsklus> <mängija> <kestus> [põhjus]
tempbanipCommandDescription=Blokeerib IP-aadressi ajutiselt.
tempbanipCommandUsage=/<käsklus> <mängijanimi> <kestus> [põhjus]
tempbanipCommandUsage1=/<käsklus> <mängija|ip-aadress> <kestus> [põhjus]
thunder=§6Sa§c {0} §6äikeseliseks oma maailmas.
thunderCommandDescription=Luba/keela äike.
thunderCommandUsage=/<käsklus> <true/false> [kestus]
thunderCommandUsage1=/<käsklus> <true|false> [kestus]
thunderDuration=§6Sa§c {0} §6oma maailmas kõu§c {1} §6sekundiks.
timeBeforeHeal=§4Aeg enne järgmist elustamist\:§c {0}§4.
timeBeforeTeleport=§4Aeg enne järgmist teleporteerumist\:§c {0}§4.
timeCommandDescription=Kuva/muuda maailma aega. Vaikimisi kehtib praeguse maailma jaoks.
timeCommandUsage=/<käsklus> [set|add] [day|night|dawn|17\:30|4pm|4000ticks] [worldname|all]
timeCommandUsage1=/<käsklus>
timeCommandUsage1Description=Kuvab kellaajad kõigis maailmades
timeCommandUsage2=/<käsklus> set <aeg> [world|all]
timeCommandUsage3=/<käsklus> add <aeg> [world|all]
timeFormat=§c{0}§6, §c{1}§6 või §c{2}§6
timeSetPermission=§4Sul puudub aja määramiseks luba.
timeSetWorldPermission=§4Sul puudub maailma "{0}" aja määramiseks luba.
@@ -1179,20 +1233,30 @@ totalWorthBlocks=§aMüüsid kõik plokid koguväärtusega §c{1}§a.
tpCommandDescription=Teleporteeru mängija juurde.
tpCommandUsage=/<käsklus> <mängija> [teinemängija]
tpCommandUsage1=/<käsklus> <mängija>
tpCommandUsage1Description=Teleporteerib sind kindla mängija juurde
tpCommandUsage2=/<käsklus> <mängija> <teine mängija>
tpCommandUsage2Description=Teleporteerib esimese kindla mängija teise juurde
tpaCommandDescription=Taotle valitud mängija juurde teleporteerumist.
tpaCommandUsage=/<käsklus> <mängija>
tpaCommandUsage1=/<käsklus> <mängija>
tpaallCommandDescription=Taotleb kõiki võrgus olevaid mängijaid sinu juurde teleporteeruma.
tpaallCommandUsage=/<käsklus> <mängija>
tpaallCommandUsage1=/<käsklus> <mängija>
tpaallCommandUsage1Description=Taotleb kõiki mängijaid sinu juurde teleporteeruma
tpacancelCommandDescription=Tühista kõik käimasolevad teleporteerumiskutsed. Määra [mängija], et tühistada vaid selle mängija taotlused.
tpacancelCommandUsage=/<käsklus> [mängija]
tpacancelCommandUsage1=/<käsklus>
tpacancelCommandUsage1Description=Tühistab kõik teie lahendamata teleportimistaotlused
tpacancelCommandUsage2=/<käsklus> <mängija>
tpacancelCommandUsage2Description=Tühistab kõik teie lahendamata teleportimistaotlused määratud mängijaga
tpacceptCommandDescription=Võtab teleporteerumiskutsed vastu.
tpacceptCommandUsage=/<käsklus> [teinemängija]
tpacceptCommandUsage1=/<käsklus>
tpacceptCommandUsage1Description=Võtab vastu kõige viimase Teleporteerimis kutse
tpacceptCommandUsage2=/<käsklus> <mängija>
tpacceptCommandUsage2Description=Võtab vastu teleporteerimis kutse kindlalt inimeselt
tpacceptCommandUsage3=/<käsklus> *
tpacceptCommandUsage3Description=Võtab kõik teleporteerumiskutsed vastu
tpahereCommandDescription=Taotle valitud mängijal sinu juurde teleporteerumist.
tpahereCommandUsage=/<käsklus> <mängija>
tpahereCommandUsage1=/<käsklus> <mängija>
@@ -1205,10 +1269,14 @@ tpautoCommandDescription=Võta automaatselt teleporteerumiskutsed vastu.
tpautoCommandUsage=/<käsklus> [mängija]
tpautoCommandUsage1=/<käsklus> [mängija]
tpautoCommandUsage1Description=Lülitab teleporteerumise kutsete automaatse vastuvõtmise sinule või teisele mängijale, kui on täpsustatud
tpdenyCommandDescription=Keeldub teleporteerumiskutsetest.
tpdenyCommandUsage=/<käsklus>
tpdenyCommandUsage1=/<käsklus>
tpdenyCommandUsage1Description=Tühistab kõige viimase teleporteerimis kutse
tpdenyCommandUsage2=/<käsklus> <mängija>
tpdenyCommandUsage2Description=Tühistab kõige viimase teleporteerimis kutse kindlalt inimeselt
tpdenyCommandUsage3=/<käsklus> *
tpdenyCommandUsage3Description=Keeldub kõigist teleporteerumiskutsetest
tphereCommandDescription=Teleporteeri mängija enda juurde.
tphereCommandUsage=/<käsklus> <mängija>
tphereCommandUsage1=/<käsklus> <mängija>
@@ -1217,6 +1285,7 @@ tpoCommandDescription=Teleporteerumise sundimine /tptoggle jaoks.
tpoCommandUsage=/<käsklus> <mängija> [teinemängija]
tpoCommandUsage1=/<käsklus> <mängija>
tpoCommandUsage1Description=Teleporteerib valitud mängija sinu juurde, eirates tema seadistust
tpoCommandUsage2=/<käsklus> <mängija> <teine mängija>
tpoCommandUsage2Description=Teleporteerib esimesena määratud mängija teise juurde, eirates nende seadistusi
tpofflineCommandDescription=Teleporteeru mängija viimase teadaoleva asukoha juurde enne välja logimist
tpofflineCommandUsage=/<käsklus> <mängija>
@@ -1320,6 +1389,7 @@ versionOutputFine=§6{0} versioon\: §a{1}
versionOutputWarn=§6{0} versioon\: §c{1}
versionOutputUnsupported=§d{0} §6versioon\: §d{1}
versionOutputUnsupportedPlugins=§6Sa käitad §dmittetoetatud pluginaid§6\!
versionOutputEconLayer=§6Ökonoomiakiht\: §r{0}
versionMismatch=§4Versioon ei kattu\! Palun uuenda {0} samale versioonile.
versionMismatchAll=§4Versioon ei kattu\! Palun uuenda kõik Essentialsi jarid samale versioonile.
versionReleaseLatest=§6Käitad viimatist EssentialsX''i stabiilset versiooni\!
@@ -1334,7 +1404,7 @@ warpCommandDescription=Loetleb kõik koolud või kooldub valitud asukohta.
warpCommandUsage=/<käsklus> <lehenr|koold> [mängija]
warpCommandUsage1=/<käsklus> [lk]
warpCommandUsage1Description=Annab nimekirja kõikidest lõimudest esimesel või täpsustatud leheküljel
warpCommandUsage2=/<käsklus> <warp> [mängija]
warpCommandUsage2=/<käsklus> <koold> [mängija]
warpCommandUsage2Description=Telepordib teid või määratud nimega mängija antud lõimu
warpDeleteError=§4Koolufaili kustutamisel esines probleem.
warpInfo=§6Koolu§c {0}§6 teave\:
@@ -22,6 +22,7 @@ antiBuildInteract=§4Ez duzu §c {0}§4-rekin interaktzioa jartzeko permisiorik.
antiBuildPlace=§4Ez daukazu hemen §c {0} §4 blokerik jartzeko baimenik.
antiBuildUse=§4Ez daukazu§c {0}§4 erabiltzeko baimenik.
antiochCommandUsage=/<command> [Mezua]
autoAfkKickReason=Byl jsi vyhozen za neaktivitu delší než {0} minut.
backupFinished=§6Segurtasun kopia ondo burutu da.
backupStarted=§6Segurtasun kopia burutzea hasi da.
backUsageMsg=§6Aurreko kokalekura itzultzen.
@@ -67,6 +68,7 @@ deleteFileError=Ezin izan da fitxategia ezabatu\: {0}
deleteHome=§c {0} §6etxea ezabatua.
deleteJail=§c {0} §6kartzela ezabatua.
deleteWarp=§c {0} §4telegarraiatze puntua ezabatu duzu.
deljailCommandDescription=Kartzela bat borratzen du.
deniedAccessCommand=§c{0} §4-(e) ri komandoaren erabilera ukatu zaio.
denyBookEdit=§4Ezin duzu liburu hau editatu.
denyChangeAuthor=§4Ezin duzu liburu honen idazlea aldatu.
@@ -232,8 +234,6 @@ noPerm=§4Ez daukazu §c{0} §4 baimena.
noPermissionSkull=§4Ez daukazu buru hori editatzeko baimenik.
noPermToSpawnMob=§4Ez daukazu munstro hori sortzeko baimenik.
noPlacePermission=§4Ez daukazu kartelaren ondoan blokerik jartzeko baimenik.
notAllowedToQuestion=§4Ez daukazu galderarik egiteko baimenik.
notAllowedToShout=§4Ez daukazu garrasi egiteko baimenik.
notEnoughExperience=§4Ez daukazu nahikoa esperientziarik.
notEnoughMoney=§4Ez daukazu nahikoa dirurik.
notFlying=ez da hegan ari
Loaded 100 of 185 files, more files were not shown because too many files have changed in this diff. Show more