From 4e85a315f95a5d85dca70b81b61506c646eeed3e Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Tue, 15 Mar 2016 11:50:35 -0500 Subject: [PATCH] Objectives! --- .../common/block/schematic/Schematic.java | 2 +- .../core/common/objective/Objective.java | 21 +++++++ .../common/objective/OrderedObjective.java | 26 +++++++++ .../common/objective/SingleObjective.java | 8 +++ .../clans/message/ClansMessageManager.java | 20 +++++++ .../game/clans/tutorial/Tutorial.java | 13 ++++- .../tutorials/clans/ClansMainTutorial.java | 55 ++++++++++++++++++- .../clans/objective/ClanObjective.java | 34 ++++++++++++ .../clans/objective/LeaveSpawnObjective.java | 18 ++++++ .../clans/objective/goals/ClaimLandGoal.java | 38 +++++++++++++ .../objective/goals/ClanDetailsGoal.java | 40 ++++++++++++++ .../clans/objective/goals/CreateClanGoal.java | 37 +++++++++++++ 12 files changed, 309 insertions(+), 3 deletions(-) create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/ClanObjective.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/ClaimLandGoal.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/ClanDetailsGoal.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/CreateClanGoal.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java index d604b72b5..089101fe3 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java @@ -92,7 +92,7 @@ public class Schematic DyeColor color = DyeColor.getByWoolData(data); if (color != null) { - map.addLocation(color, origin.clone().add(x, y, z)); + map.addLocation(color, origin.clone().add(x + 0.5, y + 0.5, z + 0.5)); return true; } } 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 0ac75f747..470764357 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,8 +1,10 @@ package mineplex.core.common.objective; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Set; import java.util.UUID; import org.bukkit.entity.Player; @@ -10,6 +12,9 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; + /** * An Objective represents a set of goals that need to be completed to move on to the next Objective in the quest */ @@ -159,6 +164,20 @@ public abstract class Objective implements L return new LinkedList(_active.keySet()); } + protected final Player[] getActivePlayers() + { + Set uuidSet = _active.keySet(); + Player[] players = new Player[uuidSet.size()]; + + int index = 0; + for (UUID uuid : uuidSet) + { + players[index] = UtilPlayer.searchExact(uuid); + index++; + } + return players; + } + public Data getData(Player player) { return _active.get(player.getUniqueId()); @@ -174,4 +193,6 @@ public abstract class Objective implements L List goals = getGoals(); if (goals != null) goals.forEach(HandlerList::unregisterAll); } + + public abstract void addScoreboardLines(Player player, List lines); } 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 5bd6d781c..30290638b 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,6 +7,8 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; +import net.md_5.bungee.api.ChatColor; + public abstract class OrderedObjective extends Objective { private List _goals; @@ -68,4 +70,28 @@ public abstract class OrderedObjective extends Objective lines) + { + if (contains(player)) + { + OrderedObjectiveData data = getData(player); + lines.add(" " + getName()); + + for (int i = 0; i < _goals.size(); i++) + { + String prefix; + + if (i > data.getIndex()) + prefix = ChatColor.RED.toString(); + else if (i == data.getIndex()) + prefix = ">" + ChatColor.YELLOW.toString(); + else + prefix = ChatColor.GREEN.toString(); + + lines.add(" " + prefix + _goals.get(i).getName()); + } + } + } } \ No newline at end of file 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 index c8a765190..325c20d2b 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/SingleObjective.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/objective/SingleObjective.java @@ -35,4 +35,12 @@ public abstract class SingleObjective extends Objective lines) + { + if (contains(player)) + { + lines.add(" " + getName()); + } + } } \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/message/ClansMessageManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/message/ClansMessageManager.java index 4fe380cee..ac9a0332f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/message/ClansMessageManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/message/ClansMessageManager.java @@ -4,6 +4,7 @@ import java.util.HashMap; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.MiniPlugin; @@ -12,6 +13,8 @@ import mineplex.core.updater.event.UpdateEvent; public class ClansMessageManager extends MiniPlugin { + private static final Message BLANK_MESSAGE = new Message("", "", 20); + private HashMap _playerMessageMap; public ClansMessageManager(JavaPlugin plugin) @@ -42,4 +45,21 @@ public class ClansMessageManager extends MiniPlugin _playerMessageMap.put(player, message); if (displayNow) message.send(player); } + + public void removePlayer(Player player) + { + removePlayer(player, true); + } + + public void removePlayer(Player player, boolean sendBlankMessage) + { + BLANK_MESSAGE.send(player); + _playerMessageMap.remove(player); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) + { + removePlayer(event.getPlayer(), false); + } } 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 9a0a1fabb..78da9d444 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 @@ -3,6 +3,7 @@ package mineplex.game.clans.tutorial; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Set; import org.bukkit.Material; import org.bukkit.Sound; @@ -102,6 +103,11 @@ public abstract class Tutorial implements Listener, ObjectiveListener return _guiData; } + public ClansMessageManager getMessage() + { + return _message; + } + public final String getTaskIdentifier() { return "clans.tutorial." + _taskIdentifier; @@ -164,6 +170,11 @@ public abstract class Tutorial implements Listener, ObjectiveListener } } + public Set getPlayers() + { + return _playerSessionMap.keySet(); + } + /** * Called when the player finishes the tutorial */ @@ -196,7 +207,7 @@ public abstract class Tutorial implements Listener, ObjectiveListener int objectiveIndex = session.getObjectiveIndex(); Objective currentObjective = _objectives.get(objectiveIndex); lines.add(C.cGoldB + "Current Task (" + (objectiveIndex + 1) + "/" + _objectives.size() + ")"); - lines.add(" " + currentObjective.getName()); + currentObjective.addScoreboardLines(player, lines); } return lines; } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/ClansMainTutorial.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/ClansMainTutorial.java index 967d8878e..4891db734 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/ClansMainTutorial.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/ClansMainTutorial.java @@ -1,15 +1,24 @@ package mineplex.game.clans.tutorial.tutorials.clans; import java.io.IOException; +import java.util.List; import org.bukkit.DyeColor; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.common.Pair; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.message.ClansMessageManager; import mineplex.game.clans.tutorial.Tutorial; +import mineplex.game.clans.tutorial.TutorialRegion; import mineplex.game.clans.tutorial.TutorialWorldManager; +import mineplex.game.clans.tutorial.tutorials.clans.objective.ClanObjective; import mineplex.game.clans.tutorial.tutorials.clans.objective.LeaveSpawnObjective; public class ClansMainTutorial extends Tutorial @@ -28,12 +37,13 @@ public class ClansMainTutorial extends Tutorial } addObjective(new LeaveSpawnObjective(this, plugin)); + addObjective(new ClanObjective(this, plugin)); } @Override protected void onFinish(Player player) { - + getMessage().removePlayer(player); } @Override @@ -45,6 +55,49 @@ public class ClansMainTutorial extends Tutorial @Override protected void onQuit(Player player) { + } + @EventHandler + public void checkInRegion(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + return; + + for (Player player : getPlayers()) + { + TutorialRegion region = getRegion(player); + + if (!isInRegion(player.getLocation(), region)) + { + player.teleport(getSpawn(region)); + } + } + } + + public Location getSpawn(TutorialRegion region) + { + return region.getLocationMap().getLocations(DyeColor.RED).get(0); + } + + public boolean isInSpawn(Player player) + { + return isInSpawn(player.getLocation(), getRegion(player)); + } + + public boolean isInSpawn(Location location, TutorialRegion region) + { + List locs = region.getLocationMap().getLocations(DyeColor.ORANGE); + return UtilAlg.inBoundingBox(location, locs.get(0), locs.get(1)); + } + + public boolean isInRegion(Player player) + { + return isInRegion(player.getLocation(), getRegion(player)); + } + + public boolean isInRegion(Location location, TutorialRegion region) + { + List locs = region.getLocationMap().getLocations(DyeColor.GREEN); + return UtilAlg.inBoundingBox(location, locs.get(0), locs.get(1)); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/ClanObjective.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/ClanObjective.java new file mode 100644 index 000000000..89ec5c904 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/ClanObjective.java @@ -0,0 +1,34 @@ +package mineplex.game.clans.tutorial.tutorials.clans.objective; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +import mineplex.core.common.objective.OrderedObjective; +import mineplex.game.clans.tutorial.tutorials.clans.ClansMainTutorial; +import mineplex.game.clans.tutorial.tutorials.clans.objective.goals.ClaimLandGoal; +import mineplex.game.clans.tutorial.tutorials.clans.objective.goals.ClanDetailsGoal; +import mineplex.game.clans.tutorial.tutorials.clans.objective.goals.CreateClanGoal; + +public class ClanObjective extends OrderedObjective +{ + public ClanObjective(ClansMainTutorial clansMainTutorial, JavaPlugin javaPlugin) + { + super(clansMainTutorial, javaPlugin, "Clans", "Create clan with /c create "); + + addGoal(new CreateClanGoal(this)); + addGoal(new ClanDetailsGoal(this)); + addGoal(new ClaimLandGoal(this)); + } + + @Override + protected void customLeave(Player player) + { + + } + + @Override + protected void customFinish(Player player) + { + + } +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/LeaveSpawnObjective.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/LeaveSpawnObjective.java index 0164ac15c..ce572bd8f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/LeaveSpawnObjective.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/LeaveSpawnObjective.java @@ -1,9 +1,12 @@ package mineplex.game.clans.tutorial.tutorials.clans.objective; 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.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.tutorial.tutorials.clans.ClansMainTutorial; public class LeaveSpawnObjective extends SingleObjective @@ -30,4 +33,19 @@ public class LeaveSpawnObjective extends SingleObjective { } + + @EventHandler + public void checkRegion(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + for (Player player : getActivePlayers()) + { + if (!getPlugin().isInSpawn(player)) + { + finish(player); + } + } + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/ClaimLandGoal.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/ClaimLandGoal.java new file mode 100644 index 000000000..2ab236191 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/ClaimLandGoal.java @@ -0,0 +1,38 @@ +package mineplex.game.clans.tutorial.tutorials.clans.objective.goals; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import mineplex.core.common.objective.Objective; +import mineplex.core.common.objective.ObjectiveGoal; +import mineplex.game.clans.clans.event.PlayerPreClaimTerritoryEvent; + +public class ClaimLandGoal extends ObjectiveGoal +{ + public ClaimLandGoal(Objective objective) + { + super(objective, "Claim Land", "Claim land with /c claim"); + } + + @Override + protected void customStart(Player player) + { + + } + + @Override + protected void customFinish(Player player) + { + + } + + @EventHandler + public void onClaim(PlayerPreClaimTerritoryEvent event) + { + if (contains(event.getClaimer())) + { + event.setCancelled(true); + finish(event.getClaimer()); + } + } +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/ClanDetailsGoal.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/ClanDetailsGoal.java new file mode 100644 index 000000000..ce3bc56e5 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/ClanDetailsGoal.java @@ -0,0 +1,40 @@ +package mineplex.game.clans.tutorial.tutorials.clans.objective.goals; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import mineplex.core.common.objective.Objective; +import mineplex.core.common.objective.ObjectiveGoal; +import mineplex.game.clans.clans.event.ClansCommandExecutedEvent; + +public class ClanDetailsGoal extends ObjectiveGoal +{ + public ClanDetailsGoal(Objective objective) + { + super(objective, "View Clan Details", "View Clan Details with /c"); + } + + @Override + protected void customStart(Player player) + { + + } + + @Override + protected void customFinish(Player player) + { + + } + + @EventHandler + public void onClanInfo(ClansCommandExecutedEvent event) + { + if (contains(event.getPlayer())) + { + if (event.getCommand().equalsIgnoreCase("info")) + { + finish(event.getPlayer()); + } + } + } +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/CreateClanGoal.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/CreateClanGoal.java new file mode 100644 index 000000000..5f7f21186 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorial/tutorials/clans/objective/goals/CreateClanGoal.java @@ -0,0 +1,37 @@ +package mineplex.game.clans.tutorial.tutorials.clans.objective.goals; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import mineplex.core.common.objective.Objective; +import mineplex.core.common.objective.ObjectiveGoal; +import mineplex.game.clans.clans.event.ClanCreatedEvent; + +public class CreateClanGoal extends ObjectiveGoal +{ + public CreateClanGoal(Objective objective) + { + super(objective, "Create a Clan", "Create a Clan"); + } + + @Override + protected void customStart(Player player) + { + + } + + @Override + protected void customFinish(Player player) + { + + } + + @EventHandler + public void onClanCreate(ClanCreatedEvent event) + { + if (contains(event.getFounder())) + { + finish(event.getFounder()); + } + } +}