Commit Graph

893 Commits

Author SHA1 Message Date
Andreas Troelsen
cc0a2f30b4 Use new BlockData API for Leaderboards.
This commit fixes a bug on Minecraft 1.14 servers where leaderboards would cause a NullPointerException due to the MaterialData API being broken. Instead, we now use the new BlockData API, and everything is back to normal.

Fixes #536
2019-07-20 22:55:49 +02:00
Andreas Troelsen
996a592023 Make all "damageable" items unbreakable.
This commit changes how the unbreakable setting works by just assuming that everything that is "damageable" (implements the Damageable interface) needs to be set as unbreakable. This means that the entire weapons/armor collection in ArenaClass is obsolete, and all of the checking is contained in ArenaImpl.

Fixes #544
2019-07-20 22:47:00 +02:00
Andreas Troelsen
a3004d6403 Give stone swords to wither skeletons on spawn.
Fixes #538
2019-07-20 22:39:22 +02:00
Andreas Troelsen
7317c64678 Use max health value instead of base value in SetHealth step.
This commit changes the SetHealth step such that it uses the player's own value for max health rather than the generic base value. As a result, players who join holding items that lower their max health will be missing health as soon as they join the lobby. But because food levels are maxed and locked, the health will quickly regenerate.

Unfortunately, players who join with a higher health value than the base max health value will have their health capped to the base max health value on the way out of the arena. This was also the case before this commit, but it is worth mentioning again for completeness.

These odd side effects are currently "necessary" because the effects of items that change max health values for players don't take immediate effect in the same tick as they are added/removed, so because MobArena's join sequence is synchronous, we can't feasibly "get it right".

Fixes #545
2019-07-20 22:37:23 +02:00
Andreas Troelsen
88ddbe5ac6 Lock food level for players in the lobby or spectator area.
There is no reason why food should be a thing in the lobby or spectator area. This commit effectively disables it for players in those places/states, while retaining the in-arena conditional logic based on the config-file setting.

Fixes #514
2019-07-20 21:40:24 +02:00
Andreas Troelsen
672e038ba7 Bump version to 0.103.3 2019-04-23 12:42:17 +02:00
Andreas Troelsen
d287a35137 Release 0.103.2. 2019-04-23 11:21:44 +02:00
Andreas Troelsen
4f548e08a6 Use a blacklist for the server version check.
The whitelisting approach works well for the legacy builds, because the
version landscape doesn't change with those. However, the main build on
the master branch will not run on a server version other than 1.13, so
come 1.14, MobArena will be broken.

This commit fixes this problem by changing to a blacklisting approach
for the main build on the master branch. Checking for versions that the
build *can't* run on brings back MobArena's old resilience to version
changes on the Minecraft side of things.
2019-04-16 12:38:19 +02:00
Andreas Troelsen
93af93d5a0 Use attribute base value instead of 20 when setting player health.
The previous hardcoded value of `20.0` works in most cases, but if a server uses a base health higher than 20, players don't get a full heal. Worse, if the base health is lower than 20, MobArena crashes when it tries to set the health to 20, which is now out of range.

This commit introduces the Attribute enum to MobArena's code base and uses it to get the base value for player max health. This should fix the aforementioned issues.

Fixes #513
2019-02-16 17:41:55 +01:00
Andreas Troelsen
afcc526a71 Relocate mobarena.admin.teleport permission check.
Instead of explicitly ALLOW'ing a teleport if a player has the permission, we let the teleport handler logic run its course. If an arena explicitly REJECTs the teleport, we need to cancel the event, but the permission now overrides that behavior. This means that only in the case of an impending event cancellation, the permission kicks in.

This is important, because the permission is supposed to override the decision to cancel, rather than drive the decision to uncancel. With this change, MobArena never uncancels something it wouldn't have uncancelled otherwise, meaning it won't interfere with teleports outside of its own context, and thus won't interfere with other plugins.

Fixes #515, closes #516

Thanks to @minoneer for the bug report and pull request that this code
was based upon!
2019-02-16 17:40:45 +01:00
Andreas Troelsen
fc8debca29 Clone ItemStack before adding to player inventory.
Spigot is at it again with another breaking change to the API where the
JavaDocs have been retrofitted to match the new, ancient way of writing
software.

The addItem and removeItem methods originally just added or removed
whatever they could when called, and returned a map of items that failed
due to lack of space/items. Now, with the breaking API change, these
methods actually *mutate their arguments* - a practice that has been
heavily discouraged for decades in modern software development, and
something you usually only see in C these days. This change, like many
others in the same vein, show the complete recklessness, incompetence,
and lack of awareness from an otherwise talented team of developers.
Hopefully, they will continue to hone their skills so that we can
eventually have a stable API again.
2019-02-03 14:34:37 +01:00
Andreas Troelsen
0e037b2f72 Don't change player flySpeed on join/spec.
From a purist standpoint, the flySpeed tag should never be messed with
in MobArena, because simply turning off flight should be enough. It is
likely that the flySpeed tag was originally included to cull "cheaters"
who somehow managed to activate flight in the arena anyway, but this
isn't really MobArena's responsibility and can very probably be handled
by other means of cheat prevention in WorldGuard regions or the like.

By not touching the flySpeed tag, it makes it much easier for server
owners to recover from crashes where the leave steps aren't executed,
leaving players "locked in the air" when they try to fly.

Closes #509 since this "fix" was the reason that feature request was made.
2019-02-03 14:32:28 +01:00
Justin W. Flory
eb67ec77b9 Update Commands documentation (#413)
* Update Commands documentation (see full commit)

This commit updates the Commands documentation.

* Follows RST document style guide
* Uses active voice / minor edits
* Reorganize structure, use tables

* Address feedback by @garbagemule in #413
2019-01-01 15:03:31 +01:00
Andreas Troelsen
e40ab31437 Bump version to 0.103.2 2018-12-31 15:39:33 +01:00
Andreas Troelsen
2f64783649 Release 0.103.1. 2018-12-31 15:33:06 +01:00
Andreas Troelsen
7bc6cf2800 Make commands case insensitive.
Note that this doesn't make the arguments for commands case insensitive. Each command is still responsible for lowercasing their arguments if it makes sense for them to do so.

This closes #446.
2018-12-31 14:50:19 +01:00
Andreas Troelsen
74a7388701 Make enchantments case insensitive.
Lowercasing the enchantment string before feeding it to the Bukkit API makes the enchantments a little more "copy/paste proof" when grabbing the uppercased names from the JavaDocs/Minecraft wiki.
2018-12-31 14:40:54 +01:00
Andreas Troelsen
5e7cb2a82b Allow class pets to teleport to their owners.
This closes #497.
2018-12-31 14:20:27 +01:00
Andreas Troelsen
624b87f4d3 Prevent spectators from taking damage at all times.
Spectating is possible both during and before/after arena sessions. This means that an early return from the entity damage cancellation logic when the arena isn't running is going to allow damage to go through to spectators of non-running arenas, which means they can die. By simply removing the early return (and placing it in the one branch that actually requires it explicitly), spectators should no longer be able to take damage.

This fixes #502.
2018-12-30 14:05:02 +01:00
Andreas Troelsen
399b228999 Use unbreakable item meta flag for unbreakable weapons and armor.
This changes how unbreakable items work in MobArena. It removes the legacy "repair logic" and replaces it with the item meta unbreakable flag. This approach should work all the same, except now if weapons and armor in class chests have special durability values, these are preserved in the cloning.

This should make MobArena compatible with plugins that depend on special durability values, such as QualityArmory.
2018-11-18 16:36:19 +01:00
Andreas Troelsen
d9b9b2493c Update README with new Discord invite.
Also removes the IRC links - sorry old pal.
2018-09-23 16:21:43 +02:00
Andreas Troelsen
32499dbe11 Use unbreakable item meta flag for unbreakable weapons and armor.
This changes how unbreakable items work in MobArena. It removes the legacy "repair logic" and replaces it with the item meta unbreakable flag. This approach should work all the same, except now if weapons and armor in class chests have special durability values, these are preserved in the cloning.

This should make MobArena compatible with plugins that depend on special durability values, such as QualityArmory.
2018-09-23 15:44:54 +02:00
Andreas Troelsen
fe5571c75b Update changelog with change from 6a8c6a9. 2018-09-23 15:41:37 +02:00
Sait™
6a8c6a9741 Grant permission for /ma ready by default
This makes the ready command consistent with the rest of the sane defaults as well as with the ready block, which requires no permissions.
2018-08-31 19:46:36 +02:00
Andreas Troelsen
09d0b4772b Bump version to 0.103.1 2018-08-28 22:58:51 +02:00
Andreas Troelsen
7962842be1 Release 0.103. 2018-08-28 22:00:59 +02:00
Andreas Troelsen
c546641c7b Start the join-interrupt-timer from the spectator area.
Following the changes in 266104d0a1, this commit gathers the leave-then-join logic and handles it in one fell swoop when joining from the spectator area. This means that the timer will start, and when it runs out, the player leaves the current arena (if any), and then joins.

There should be no issues with overlapping timers or anything like that, since the lookup happens when the time is up, not before the timer is started.
2018-08-28 21:30:45 +02:00
Andreas Troelsen
d17b588647 Update Thanks in changelog.
Thanks, kitty!
2018-08-24 19:44:23 +02:00
Andreas Troelsen
266104d0a1 Re-allow joining from spectator areas.
Commit 924a419b47 made it impossible to join an arena from a spectator area because the playerLeave method call in JoinCommand was removed. The call is re-introduced in this commit along with similar logic in InvokesSignAction. This means that a spectating player can now join arenas as if they weren't spectating, rather than having to first leave the arena they are spectating.
2018-08-24 19:27:21 +02:00
Andreas Troelsen
934eb2d8cc Build against Bukkit API for Minecraft 1.13.
This very likely introduces a few bugs and breaks some functionality, but at least we're compiling...
2018-08-19 21:05:24 +02:00
Andreas Troelsen
754eb156d1 Make SheepBouncer logic cancellable.
Following the changes in 96c1f18517, this commit makes SheepBouncer cancellable for the same reasons as outlined in the MASpawnThread commit.
2018-08-19 20:48:04 +02:00
Andreas Troelsen
96c1f18517 Make MASpawnThread logic cancellable.
This commit changes how MASpawnThread is started. Instead of simply scheduling a task and letting it run whenever, we now explicitly tell it to stop when the arena ends. This matters, because if the scheduled task does not get cancelled, it will run at the scheduled time. MASpawnThread's run() method has an early return to stop whenever the arena isn't running, but with unlucky timing, it's possible to start a new arena session before the task runs again, meaning the same MASpawnThread keeps scheduling itself on the previous scheduling loop.

Instead of this whacky approach, we now specifically have MASpawnThread track its own BukkitTask. Upon arena start, we instantiate a new MASpawnThread and call its start() method, which in turn schedules itself and stores a reference to the associated BukkitTask. Upon arena end, we call the MASpawnThread's stop() method, which explicitly calls the BukkitTask's cancel() method, effectively stopping/unscheduling the task.

This fixes the (very) long-standing "double wave spawner" bug that we haven't been able to reproduce for so long. Hooray!
2018-08-19 20:47:25 +02:00
Andreas Troelsen
fc51c5eff5 Clean up IntelliJ's overzealous refactoring of the word "reload"...
The command we want people to type is /ma reload, not /ma load. This is likely splash damage from a Rename refactoring action in IntelliJ.
2018-08-19 11:06:17 +02:00
Andreas Troelsen
944efed3f0 Use JitPack to resolve MagicSpells.
This commit nukes the lib/MagicSpells.jar file and instead uses JitPack to resolve MagicSpells (finally!).

Thanks, TheComputerGeek2.
2018-08-19 11:06:17 +02:00
Andreas Troelsen
220197b5db Bring keep-exp per-arena setting back.
This setting was removed a long time ago, likely by "happy mistake" in a larger refactoring.

When enabled, players are granted any collected experience during the arena session as a reward when they die or reach the final wave of the arena. Note that deliberately leaving the arena is not included here, because "leaving" an arena is a highly ambiguous and conditional concept at the time of this commit. Figuring out when and how the experience reward should be added is complicated, and unless someone puts in a request for it, I think it's enough that the "legitimate" reasons for getting the experience (honorable death and reaching the final wave) are covered.

Closes #485
2018-08-19 11:06:17 +02:00
Andreas Troelsen
fbb5fe7c4a Include total experience in SetExperience step.
It turns out that experience in Minecraft is split out on a couple of different variables, and they are only loosely coupled.

Total experience, level, and level progress are three completely different variables that can be manipulated individually. This means that while 10 experience points from level 0 should bring you up to level 1 with a third of the experience bar full (level 0 to 1 takes 7 points, level 1 to 2 takes 9 points), simply setting the total points value to 10 won't automatically level you up. Using the Player#giveExp(int) method will, however, work this way.
2018-08-19 11:06:02 +02:00
Andreas Troelsen
95e2abdee9 Update changelog with /ma ready command. 2018-08-19 11:05:00 +02:00
Sait™
977df0b9f4 Add /ma ready
This commit adds a new command, /ma ready (/ma rdy for short), as an alternative to the iron block for readying up after picking a class.

Note that this conflicts with the shorthand for /ma notready, which no longer triggers on the word "ready", but only on "notready".
2018-08-19 11:00:19 +02:00
Andreas Troelsen
548d8c7e4f Allow armor stands in arenas and lobbies.
This commit adds an event handler for the PlayerArmorStandManipulateEvent and cancels it if the arena protection is on, we aren't in edit mode, and the region contains the armor stand. The same logic applies to the armor stand damage event.
2018-08-11 00:16:21 +02:00
Andreas Troelsen
51fa78acd9 Change the fallback command error message.
This is a little less panicky, and it doesn't reference IRC (which is basically dead).
2018-08-10 23:23:34 +02:00
Andreas Troelsen
1fc6c5b8b9 Use an alias instead of two separate commands in plugin.yml 2018-08-10 23:23:33 +02:00
Andreas Troelsen
170dc2b122 Remove trailing whitespaces in command handler. 2018-08-10 23:23:33 +02:00
Andreas Troelsen
8d91598b21 Remove trailing whitespaces in main plugin class. 2018-08-10 23:23:33 +02:00
Andreas Troelsen
a1e802c6f0 Minor cleanup in ArenaMaster.
Removes unused imports and fields, trailing whitespace.
2018-08-10 23:23:33 +02:00
Andreas Troelsen
2081405d3b Refactor startup logic.
This commit re-implements and rearranges a lot of the logic in the main plugin class. It also removes the ConfigCommand class and moves its functionality into the CommandHandler to allow for reloads to be a bit more special than normal commands.

In the refactoring of the main class, the startup logic is broken up into two phases, setup and (re)load:

- In the setup phase, we create the data folder, and the command handler, config serializer(s), plugin integrations, boss abilities, the global event listener, and metrics are initialized. The ArenaMaster is instantiated, but it isn't initialized. These are things that need to be set up just once and don't change on reloads.

- In the (re)load phase, the config-file is loaded from disk, the global messenger is instantiated, the arena master is initialized (loads settings, classes, and arenas), the announcements file is loaded from disk along with the sign data/templates. These are things that we want to be reloadable.

If anything goes wrong during these phases, we store the exception thrown. This puts MobArena into a state where it prints the exception message to anyone who types a non-reload MobArena command to bring attention to the error so it can be fixed.
2018-08-10 23:23:30 +02:00
Andreas Troelsen
dc25a38d98 Throw ConfigErrors when pet items are invalid. 2018-08-10 21:55:22 +02:00
Andreas Troelsen
beb4269525 Remove all of the obsolete and commented out code in WaveUtils. 2018-08-06 01:25:21 +02:00
Andreas Troelsen
13e3c180e5 Make the class items node consistent with the rest.
Supposedly, this doesn't actually do much, but the code now looks like the rest of the "string or string list" parsing.
2018-08-06 01:23:26 +02:00
Andreas Troelsen
951e83cc55 Rework some of the wave parsing logic.
This commit is a full sweep across the WaveParser. It introduces the ConfigError exception to the WaveParser and throws it whenever something isn't right. There's quite a lot of stuff going on, but in overall:

- Errors are thrown rather than null values being returned
- Defaults are picked in lieu of explicit values when they "make sense"
- Most list-type values can now be either the default comma-separated string or a string list

Common nodes:
- Spawnpoints can now be a string list

Default waves:
- Missing or empty monsters map throws an error
- Missing wave growth defaults to medium
- Invalid wave growth throws an error

Special waves:
- Missing or empty monsters map throws an error

Swarm waves:
- Missing or empty monster node throws an error
- Missing swarm amount defaults to low
- Invalid swarm amount throws an error

Supply waves:
- Missing or empty monsters map throws an error
- Missing or empty drops node throws an error
- Invalid drop throws an error
- Drops can now be a string list

Upgrade waves:
- Missing or empty upgrades map throws an error

Boss waves:
- Missing or empty monster node throws an error
- Missing or empty boss health defaults to medium
- Invalid boss health throws an error
- Invalid ability throws an error
- Invalid drop throws an error
- Abilities and drops can now be string lists
2018-08-06 01:22:27 +02:00
Andreas Troelsen
060a395213 Guard against non-living entities in MACreature.
This should prevent runtime errors where MobArena tries to spawn non-living entities, causing arenas to get locked up.

Fixes #438
2018-08-05 23:30:03 +02:00