From 976779b9f276e2ff1ea69f1c4d79dc4e8ee8c186 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Sun, 17 Jan 2016 22:45:38 -0500 Subject: [PATCH] Tutorial Work --- .../core/common/objective/Objective.java | 40 +++++++++- .../core/common/objective/ObjectiveGoal.java | 22 ++++++ .../common/objective/ObjectiveListener.java | 4 +- .../common/objective/OrderedObjective.java | 43 +++++------ .../objective/OrderedObjectiveData.java | 10 +++ .../common/objective/SingleObjective.java | 38 ++++++++++ .../game/clans/tutorial/Tutorial.java | 2 +- .../tutorials/combat/CombatTutorial.java | 11 +++ .../objectives/EquipArmorObjective.java | 73 +++++++++++++++++++ 9 files changed, 213 insertions(+), 30 deletions(-) create mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/SingleObjective.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/combat/objectives/EquipArmorObjective.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/Objective.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/Objective.java index a604a51a5..e360699fd 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/Objective.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/Objective.java @@ -1,18 +1,21 @@ package mineplex.core.common.objective; +import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.UUID; import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; /** * An Objective represents * */ -public abstract class Objective +public abstract class Objective implements Listener { private JavaPlugin _plugin; private String _name; @@ -29,6 +32,8 @@ public abstract class Objective _active = new HashMap<>(); _listeners = new LinkedList<>(); + + plugin.getServer().getPluginManager().registerEvents(this, plugin); } public JavaPlugin getPlugin() @@ -78,7 +83,7 @@ public abstract class Objective Data data = getData(player); _active.put(player.getUniqueId(), data); - _listeners.forEach(listener -> listener.startObjective(player, this)); + _listeners.forEach(listener -> listener.onObjectiveStart(player, this)); customStart(player); } @@ -113,19 +118,46 @@ public abstract class Objective */ protected abstract void completeGoal(ObjectiveGoal goal, Player player); + /** + * Returns a list of all the ObjectiveGoals used by this Objective + * Can return null + */ + protected abstract List getGoals(); + protected final void finish(Player player) { _active.remove(player.getUniqueId()); - _listeners.forEach(listener -> listener.finishObjective(player, this)); + _listeners.forEach(listener -> listener.onObjectiveFinish(player, this)); customFinish(player); } protected abstract void customFinish(Player player); + public boolean contains(Player player) + { + return contains(player.getUniqueId()); + } + + public boolean contains(UUID uuid) + { + return _active.containsKey(uuid); + } + + protected final List getActive() + { + return new LinkedList(_active.keySet()); + } + /** * Unregister all listeners associated with this Objective */ - public abstract void unregisterAll(); + public final void unregisterAll() + { + HandlerList.unregisterAll(this); + + List goals = getGoals(); + if (goals != null) goals.forEach(HandlerList::unregisterAll); + } } diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/ObjectiveGoal.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/ObjectiveGoal.java index daf666624..b764d56bb 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/ObjectiveGoal.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/ObjectiveGoal.java @@ -37,4 +37,26 @@ public abstract class ObjectiveGoal implements Listener { return _active.contains(player.getUniqueId()); } + + public final void start(Player player) + { + _active.add(player.getUniqueId()); + customStart(player); + } + + protected abstract void customStart(Player player); + + protected abstract void customFinish(Player player); + + protected void finish(Player player) + { + if (_active.contains(player.getUniqueId())) + { + _active.remove(player.getUniqueId()); + customFinish(player); + + _objective.completeGoal(this, player); + + } + } } diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/ObjectiveListener.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/ObjectiveListener.java index eb4f08287..3e528a73c 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/ObjectiveListener.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/ObjectiveListener.java @@ -4,7 +4,7 @@ import org.bukkit.entity.Player; public interface ObjectiveListener { - public void startObjective(Player player, Objective objective); + public void onObjectiveStart(Player player, Objective objective); - public void finishObjective(Player player, Objective objective); + public void onObjectiveFinish(Player player, Objective objective); } diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/OrderedObjective.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/OrderedObjective.java index e31560f3a..896f8c58c 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/OrderedObjective.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/OrderedObjective.java @@ -7,7 +7,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; -public class OrderedObjective extends Objective +public abstract class OrderedObjective extends Objective { private List _goals; @@ -18,25 +18,13 @@ public class OrderedObjective extends Objective _goals = new ArrayList<>(); } - private void addGoal(ObjectiveGoal goal) + protected void addGoal(ObjectiveGoal goal) { _goals.add(goal); getPlugin().getServer().getPluginManager().registerEvents(goal, getPlugin()); } - @Override - protected void customStart(Player player) - { - - } - - @Override - protected void customLeave(Player player) - { - - } - @Override protected OrderedObjectiveData getData(Player player) { @@ -46,18 +34,27 @@ public class OrderedObjective extends Objective @Override protected void completeGoal(ObjectiveGoal goal, Player player) { + int index = _goals.indexOf(goal); + OrderedObjectiveData data = getData(player); + assert index == data.getIndex(); + + if (data.getIndex() >= _goals.size()) + { + finish(player); + } + else + { + int nextIndex = data.getIndex() + 1; + ObjectiveGoal nextGoal = _goals.get(nextIndex); + data.setIndex(nextIndex); + nextGoal.start(player); + } } @Override - protected void customFinish(Player player) + protected List getGoals() { - + return _goals; } - - @Override - public void unregisterAll() - { - _goals.forEach(HandlerList::unregisterAll); - } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/OrderedObjectiveData.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/OrderedObjectiveData.java index 4d1201796..8626f7161 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/OrderedObjectiveData.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/OrderedObjectiveData.java @@ -8,4 +8,14 @@ public class OrderedObjectiveData extends ObjectiveData { _index = 0; } + + public int getIndex() + { + return _index; + } + + public void setIndex(int index) + { + _index = index; + } } diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/SingleObjective.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/SingleObjective.java new file mode 100644 index 000000000..e5d5a9992 --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/SingleObjective.java @@ -0,0 +1,38 @@ +package mineplex.core.common.objective; + +import java.util.List; +import java.util.UUID; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +public abstract class SingleObjective extends Objective +{ + private final ObjectiveData _nullData; + + public SingleObjective(JavaPlugin plugin, String name, String description) + { + super(plugin, name, description); + + _nullData = new ObjectiveData(); + } + + @Override + protected ObjectiveData getData(Player player) + { + return _nullData; + } + + @Override + protected void completeGoal(ObjectiveGoal goal, Player player) + { + // Do Nothing + } + + @Override + protected List getGoals() + { + return null; + } + +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/Tutorial.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/Tutorial.java index ed3c800c0..95eebea7a 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/Tutorial.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/Tutorial.java @@ -73,7 +73,7 @@ public abstract class Tutorial implements Listener, ObjectiveListener } @Override - public void finishObjective(Player player, Objective objective) + public void onObjectiveFinish(Player player, Objective objective) { int index = _objectives.indexOf(objective); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/combat/CombatTutorial.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/combat/CombatTutorial.java index f190dc220..973f8e711 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/combat/CombatTutorial.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/combat/CombatTutorial.java @@ -1,13 +1,24 @@ package mineplex.game.clans.tutorial.tutorials.combat; +import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.common.objective.Objective; import mineplex.game.clans.tutorial.Tutorial; +import mineplex.game.clans.tutorial.tutorials.combat.objectives.EquipArmorObjective; public class CombatTutorial extends Tutorial { public CombatTutorial(JavaPlugin plugin) { super(plugin, "Combat Tutorial", "combat"); + + addObjective(new EquipArmorObjective(plugin)); + } + + @Override + public void onObjectiveStart(Player player, Objective objective) + { + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/combat/objectives/EquipArmorObjective.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/combat/objectives/EquipArmorObjective.java new file mode 100644 index 000000000..ddef2fbf9 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/combat/objectives/EquipArmorObjective.java @@ -0,0 +1,73 @@ +package mineplex.game.clans.tutorial.tutorials.combat.objectives; + +import java.util.UUID; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.plugin.java.JavaPlugin; + +import mineplex.core.common.objective.SingleObjective; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +public class EquipArmorObjective extends SingleObjective +{ + public EquipArmorObjective(JavaPlugin plugin) + { + super(plugin, "Equip Armor", "Equip Armor"); + } + + @Override + protected void customStart(Player player) + { + + } + + @Override + protected void customLeave(Player player) + { + + } + + @Override + protected void customFinish(Player player) + { + + } + + @EventHandler + public void checkArmor(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + for (UUID uuid : getActive()) + { + Player player = UtilPlayer.searchExact(uuid); + + if (player == null) + { + System.out.println("Tutorial Error: " + getName() + " has UUID with null player: " + uuid); + continue; + } + + if (isEquipped(player)) + finish(player); + } + } + + private boolean isEquipped(Player player) + { + boolean equipped = true; + + if (player.getInventory().getHelmet() == null || player.getInventory().getHelmet().getType() != Material.IRON_HELMET || + player.getInventory().getChestplate() == null || player.getInventory().getChestplate().getType() != Material.IRON_CHESTPLATE || + player.getInventory().getLeggings() == null || player.getInventory().getLeggings().getType() != Material.IRON_LEGGINGS || + player.getInventory().getBoots() == null || player.getInventory().getBoots().getType() != Material.IRON_BOOTS) + equipped = false; + + return equipped; + } +}