From 3b132d28ddffaa91a477148ada6b09c645b76b19 Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Mon, 24 Aug 2020 22:47:29 +0200 Subject: [PATCH] Use ThingPicker for boss rewards. By using a ThingPicker instead of a Thing, boss rewards can now, just like regular wave rewards, make use of the new `random()` and `all()` functions as well as the `nothing` keyword. Closes #628 --- changelog.md | 1 + .../java/com/garbagemule/MobArena/ArenaListener.java | 12 ++++++++---- .../java/com/garbagemule/MobArena/waves/MABoss.java | 7 ++++--- .../com/garbagemule/MobArena/waves/WaveParser.java | 5 +++-- .../garbagemule/MobArena/waves/types/BossWave.java | 7 ++++--- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/changelog.md b/changelog.md index d3d9c2d..441d1e5 100644 --- a/changelog.md +++ b/changelog.md @@ -20,6 +20,7 @@ These changes will (most likely) be included in the next version. - New per-arena setting `announcer-type` determines where to display per-arena announcements such as wave spawns, auto start timers, boss abilities, and death messages. Options are `title` (default) or `chat`. - It is now possible to group rewards. For example, `all(stick, bone)` results a stick and a bone, while `random(all(stick, bone), all(dirt, stone))` results in getting _either_ a stick and a bone _or_ a dirt block and a stone block. - The new `nothing` keyword can be used to _not_ grant a reward. This can be used in a crude way to create "loot table"-style reward systems where there is a _chance_ that something is reward, but it might also just be nothing. +- Boss rewards also support the `all()` and `random()` functions as well as the `nothing` keyword. - The Root Target ability now uses potion effects (slowness, slow falling, and negative jump boost) instead of repeated teleports. This should make for a smoother root experience. - Using `spectate-on-death: true` no longer forces players out to their join location/exit warp before moving them to the spectator area. This should prevent "jumpy" behavior in multi-world setups. - Players should now properly respawn at the spectator area rather than at world spawn on servers with plugins that override respawn locations. diff --git a/src/main/java/com/garbagemule/MobArena/ArenaListener.java b/src/main/java/com/garbagemule/MobArena/ArenaListener.java index 5bd08bf..41a6b79 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaListener.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaListener.java @@ -15,6 +15,7 @@ import com.garbagemule.MobArena.repairable.RepairableDoor; import com.garbagemule.MobArena.repairable.RepairableSign; import com.garbagemule.MobArena.things.ExperienceThing; import com.garbagemule.MobArena.things.Thing; +import com.garbagemule.MobArena.things.ThingPicker; import com.garbagemule.MobArena.util.ClassChests; import com.garbagemule.MobArena.waves.MABoss; import org.bukkit.ChatColor; @@ -610,10 +611,13 @@ public class ArenaListener for (Player q : arena.getPlayersInArena()) { arena.getMessenger().tell(q, Msg.WAVE_BOSS_KILLED, p.getName()); } - Thing reward = boss.getReward(); - if (reward != null) { - arena.getRewardManager().addReward(p, reward); - arena.getMessenger().tell(damager, Msg.WAVE_BOSS_REWARD_EARNED, reward.toString()); + ThingPicker picker = boss.getReward(); + if (picker != null) { + Thing reward = picker.pick(); + if (reward != null) { + arena.getRewardManager().addReward(p, reward); + arena.getMessenger().tell(damager, Msg.WAVE_BOSS_REWARD_EARNED, reward.toString()); + } } } } diff --git a/src/main/java/com/garbagemule/MobArena/waves/MABoss.java b/src/main/java/com/garbagemule/MobArena/waves/MABoss.java index a870718..2b3bc1d 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/MABoss.java +++ b/src/main/java/com/garbagemule/MobArena/waves/MABoss.java @@ -2,6 +2,7 @@ package com.garbagemule.MobArena.waves; import com.garbagemule.MobArena.healthbar.HealthBar; import com.garbagemule.MobArena.things.Thing; +import com.garbagemule.MobArena.things.ThingPicker; import org.bukkit.Bukkit; import org.bukkit.attribute.Attribute; import org.bukkit.entity.LivingEntity; @@ -13,7 +14,7 @@ public class MABoss { private LivingEntity entity; private boolean dead; - private Thing reward; + private ThingPicker reward; private List drops; private HealthBar healthbar; @@ -79,11 +80,11 @@ public class MABoss healthbar.removeAll(); } - public void setReward(Thing reward) { + public void setReward(ThingPicker reward) { this.reward = reward; } - public Thing getReward() { + public ThingPicker getReward() { return reward; } diff --git a/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java b/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java index 1768564..01ab1d0 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java +++ b/src/main/java/com/garbagemule/MobArena/waves/WaveParser.java @@ -6,6 +6,7 @@ import com.garbagemule.MobArena.region.ArenaRegion; import com.garbagemule.MobArena.things.InvalidThingInputString; import com.garbagemule.MobArena.things.Thing; import com.garbagemule.MobArena.things.ThingManager; +import com.garbagemule.MobArena.things.ThingPicker; import com.garbagemule.MobArena.util.ItemParser; import com.garbagemule.MobArena.util.PotionEffectParser; import com.garbagemule.MobArena.waves.ability.Ability; @@ -307,8 +308,8 @@ public class WaveParser String rew = config.getString("reward", null); if (rew != null && !rew.isEmpty()) { try { - Thing thing = arena.getPlugin().getThingManager().parse(rew.trim()); - result.setReward(thing); + ThingPicker picker = arena.getPlugin().getThingPickerManager().parse(rew.trim()); + result.setReward(picker); } catch (InvalidThingInputString e) { throw new ConfigError("Failed to parse boss reward in wave " + name + " of arena " + arena.configName() + ": " + e.getInput()); } diff --git a/src/main/java/com/garbagemule/MobArena/waves/types/BossWave.java b/src/main/java/com/garbagemule/MobArena/waves/types/BossWave.java index 9b4c17d..693911f 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/types/BossWave.java +++ b/src/main/java/com/garbagemule/MobArena/waves/types/BossWave.java @@ -3,6 +3,7 @@ package com.garbagemule.MobArena.waves.types; import com.garbagemule.MobArena.Msg; import com.garbagemule.MobArena.framework.Arena; import com.garbagemule.MobArena.things.Thing; +import com.garbagemule.MobArena.things.ThingPicker; import com.garbagemule.MobArena.waves.AbstractWave; import com.garbagemule.MobArena.waves.BossAbilityThread; import com.garbagemule.MobArena.waves.MABoss; @@ -37,7 +38,7 @@ public class BossWave extends AbstractWave private int abilityInterval; - private Thing reward; + private ThingPicker reward; private List drops; public BossWave(MACreature monster) { @@ -119,11 +120,11 @@ public class BossWave extends AbstractWave this.abilityAnnounce = abilityAnnounce; } - public Thing getReward() { + public ThingPicker getReward() { return reward; } - public void setReward(Thing reward) { + public void setReward(ThingPicker reward) { this.reward = reward; }