Tutorial Work

This commit is contained in:
Shaun Bennett 2016-01-17 22:45:38 -05:00
parent b606c8da22
commit 976779b9f2
9 changed files with 213 additions and 30 deletions

View File

@ -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<Data extends ObjectiveData>
public abstract class Objective<Data extends ObjectiveData> implements Listener
{
private JavaPlugin _plugin;
private String _name;
@ -29,6 +32,8 @@ public abstract class Objective<Data extends ObjectiveData>
_active = new HashMap<>();
_listeners = new LinkedList<>();
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
public JavaPlugin getPlugin()
@ -78,7 +83,7 @@ public abstract class Objective<Data extends ObjectiveData>
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<Data extends ObjectiveData>
*/
protected abstract void completeGoal(ObjectiveGoal goal, Player player);
/**
* Returns a list of all the ObjectiveGoals used by this Objective
* Can return <code>null</code>
*/
protected abstract List<ObjectiveGoal> 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<UUID> getActive()
{
return new LinkedList<UUID>(_active.keySet());
}
/**
* Unregister all listeners associated with this Objective
*/
public abstract void unregisterAll();
public final void unregisterAll()
{
HandlerList.unregisterAll(this);
List<ObjectiveGoal> goals = getGoals();
if (goals != null) goals.forEach(HandlerList::unregisterAll);
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}

View File

@ -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<OrderedObjectiveData>
public abstract class OrderedObjective extends Objective<OrderedObjectiveData>
{
private List<ObjectiveGoal> _goals;
@ -18,25 +18,13 @@ public class OrderedObjective extends Objective<OrderedObjectiveData>
_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<OrderedObjectiveData>
@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<ObjectiveGoal> getGoals()
{
return _goals;
}
@Override
public void unregisterAll()
{
_goals.forEach(HandlerList::unregisterAll);
}
}
}

View File

@ -8,4 +8,14 @@ public class OrderedObjectiveData extends ObjectiveData
{
_index = 0;
}
public int getIndex()
{
return _index;
}
public void setIndex(int index)
{
_index = index;
}
}

View File

@ -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<ObjectiveData>
{
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<ObjectiveGoal> getGoals()
{
return null;
}
}

View File

@ -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);
}

View File

@ -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)
{
}
}

View File

@ -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;
}
}