Skip to content
This repository has been archived by the owner on Mar 8, 2022. It is now read-only.

Commit

Permalink
quest wizard #31
Browse files Browse the repository at this point in the history
  • Loading branch information
RecursiveG committed Sep 3, 2017
1 parent c1a092b commit 6228fc0
Show file tree
Hide file tree
Showing 9 changed files with 379 additions and 22 deletions.
3 changes: 3 additions & 0 deletions src/main/java/cat/nyaa/HamsterEcoHelper/CommandHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import cat.nyaa.HamsterEcoHelper.auction.AuctionCommands;
import cat.nyaa.HamsterEcoHelper.balance.BalanceCommands;
import cat.nyaa.HamsterEcoHelper.market.MarketCommands;
import cat.nyaa.HamsterEcoHelper.quest.QuestCommands;
import cat.nyaa.HamsterEcoHelper.requisition.RequisitionCommands;
import cat.nyaa.HamsterEcoHelper.signshop.SearchCommands;
import cat.nyaa.HamsterEcoHelper.signshop.SignShopCommands;
Expand Down Expand Up @@ -38,6 +39,8 @@ public class CommandHandler extends CommandReceiver {
public AdsCommands adsCommands;
@SubCommand("search")
public SearchCommands searchCommands;
@SubCommand("quest")
public QuestCommands questCommands;

public CommandHandler(HamsterEcoHelper plugin, LanguageRepository i18n) {
super(plugin, i18n);
Expand Down
51 changes: 51 additions & 0 deletions src/main/java/cat/nyaa/HamsterEcoHelper/quest/QuestCommands.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package cat.nyaa.HamsterEcoHelper.quest;

import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
import cat.nyaa.HamsterEcoHelper.I18n;
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestStation;
import cat.nyaa.nyaacore.CommandReceiver;
import cat.nyaa.nyaacore.LanguageRepository;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.Set;

public class QuestCommands extends CommandReceiver{
private final HamsterEcoHelper plugin;

public QuestCommands(HamsterEcoHelper plugin, I18n i18n) {
super(plugin, i18n);
this.plugin = plugin;
}

@Override
public String getHelpPrefix() {
return "quest";
}

@SubCommand(value = "add", permission = "heh.quest.post")
public void postQuest(CommandSender sender, Arguments args) {
Sign stationSign = getSignLookat(sender);
QuestStation station = QuestCommon.toQuestStation(stationSign.getLocation());
if (station == null) {
msg(sender, "user.quest.not_station");
return;
}
new QuestWizard(station.id, asPlayer(sender), 30);
}

public Sign getSignLookat(CommandSender sender) {
Player p = asPlayer(sender);
Block b = p.getTargetBlock((Set<Material>) null, 5);// TODO use nms rayTrace

if (b == null || !b.getType().isBlock() || (b.getType() != Material.WALL_SIGN && b.getType() != Material.SIGN_POST)) {
throw new BadCommandException("user.error.not_sign");
}
return (Sign)b.getState();
}


}
18 changes: 18 additions & 0 deletions src/main/java/cat/nyaa/HamsterEcoHelper/quest/QuestCommon.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,22 @@ public static QuestStation toQuestStation(Location loc) {
return null;
}
}

public static boolean hasStation(Location loc) {
return HamsterEcoHelper.instance.database.query(QuestStation.class)
.whereEq("world", loc.getWorld().getName())
.whereEq("x", loc.getBlockX())
.whereEq("y", loc.getBlockY())
.whereEq("z", loc.getBlockZ())
.count() > 0;
}

public static void removeStation(Location loc) {
HamsterEcoHelper.instance.database.query(QuestStation.class)
.whereEq("world", loc.getWorld().getName())
.whereEq("x", loc.getBlockX())
.whereEq("y", loc.getBlockY())
.whereEq("z", loc.getBlockZ())
.delete();
}
}
28 changes: 28 additions & 0 deletions src/main/java/cat/nyaa/HamsterEcoHelper/quest/QuestListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,22 @@

import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
import cat.nyaa.HamsterEcoHelper.I18n;
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestEntry;
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestStation;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;

import java.util.List;

public class QuestListener implements Listener {
private final HamsterEcoHelper plugin;

Expand Down Expand Up @@ -40,13 +46,35 @@ public void onSignChangeEvent(SignChangeEvent event) {
}
}

@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onSignBreak(BlockBreakEvent ev) {
Block b = ev.getBlock();
if (b.getType() == Material.SIGN_POST || b.getType() == Material.WALL_SIGN) {
Location loc = b.getLocation();
if (QuestCommon.hasStation(loc)) {
if (!ev.getPlayer().hasPermission("heh.quest.admin")) {
ev.getPlayer().sendMessage(I18n.format("user.quest.cannot_break"));
ev.setCancelled(true);
} else {
// TODO check quests
QuestCommon.removeStation(loc);
ev.getPlayer().sendMessage(I18n.format("user.quest.station_removed"));
}
}
}
}

@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
Block block = event.getClickedBlock();
QuestStation station = QuestCommon.toQuestStation(block.getLocation());
if (station == null) return;
event.getPlayer().sendMessage("Station clicked");
List<QuestEntry> quests = plugin.database.query(QuestEntry.class).whereEq("station_id", station.id).select();
for (QuestEntry q : quests) {
event.getPlayer().sendMessage("QUEST: " + q.questName);
}
}
}
}
214 changes: 214 additions & 0 deletions src/main/java/cat/nyaa/HamsterEcoHelper/quest/QuestWizard.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
package cat.nyaa.HamsterEcoHelper.quest;

import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
import cat.nyaa.HamsterEcoHelper.I18n;
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestEntry;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChatEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;

import java.time.Duration;
import java.time.ZonedDateTime;
import java.time.format.DateTimeParseException;
import java.util.UUID;

import static cat.nyaa.HamsterEcoHelper.quest.QuestWizard.State.*;

public class QuestWizard implements Listener {
private final Player player;
private final UUID station;
private final int timeout;
private final QuestEntry entry;
private State state;
private Timer timer;

private class Timer extends BukkitRunnable {
boolean cancelled = false;

public Timer(int timeout) {
this.runTaskLater(HamsterEcoHelper.instance, timeout*20L);
}

@Override
public synchronized void cancel() throws IllegalStateException {
super.cancel();
this.cancelled = true;
}

@Override
public void run() {
if (cancelled) {
this.cancel();
} else {
cancelWizard();
}
}
}

enum State {
WAITING_NAME,
WAITING_DESCRIPTION,

WAITING_PREREQ_TYPE,
WAITING_PREREQ_MONEY,
WAITING_PREREQ_ITEM,

WAITING_EARLY_REWARD_ITEM,

WAITING_TARGET_TYPE,
WAITING_TARGET_ITEM,

WAITING_REWARD_TYPE,
WAITING_REWARD_ITEM,
WAITING_REWARD_MONEY,

WAITING_TIME_LIMIT,
WAITING_EXPIRE_IN,

WAITING_IS_RECURRENT,
WAITING_CLAIM_LIMIT,
WAITING_ENABLED,

FINISH,
CANCEL;
}

public QuestWizard(String stationUUID, Player p, int timeoutSeconds) {
player = p;
station = UUID.fromString(stationUUID);
timeout = timeoutSeconds;
entry = new QuestEntry();
entry.id = UUID.randomUUID().toString();
entry.publisher = p.getUniqueId().toString();
entry.stationId = stationUUID;
state = State.WAITING_NAME;
p.sendMessage(I18n.format("user.quest.wizard." + state.name().toLowerCase()));
Bukkit.getServer().getPluginManager().registerEvents(this, HamsterEcoHelper.instance);
timer = new Timer(timeout);
}

private void cancelWizard() {
state = CANCEL;
player.sendMessage(I18n.format("user.quest.wizard.cancelled"));
HandlerList.unregisterAll(this);
}

@EventHandler(ignoreCancelled = true)
public void onPlayerChat(PlayerChatEvent ev) {
if (state == CANCEL) return;
if (!player.getUniqueId().equals(ev.getPlayer().getUniqueId())) return;
timer.cancel();
ev.setCancelled(true);
String input = ev.getMessage();
if ("cancel".equalsIgnoreCase(input)) {
cancelWizard();
return;
}

switch (state) {
case WAITING_NAME:
entry.questName = input;
state = State.WAITING_DESCRIPTION;
break;
case WAITING_DESCRIPTION:
entry.questDescription = input;
state = State.WAITING_TARGET_TYPE;
break;
case WAITING_TARGET_TYPE:
if ("item".equalsIgnoreCase(input)) {
entry.targetType = QuestEntry.QuestType.ITEM;
state = State.WAITING_TARGET_ITEM;
} else {
entry.targetType = QuestEntry.QuestType.OTHER;
state = State.WAITING_REWARD_TYPE;
}
break;
case WAITING_TARGET_ITEM:
if ("end".equalsIgnoreCase(input)) {
if (entry.targetItems == null || entry.targetItems.size() <= 0) {
player.sendMessage(I18n.format("user.quest.wizard.at_least_one"));
} else {
state = State.WAITING_REWARD_TYPE;
}
} else {
ItemStack stack = player.getInventory().getItemInMainHand();
if (stack == null || stack.getType() == Material.AIR) {
player.sendMessage(I18n.format("user.quest.wizard.hold_item_plz"));
} else {
entry.targetItems.add(stack.clone());
}
}
break;
case WAITING_REWARD_TYPE:
if ("item".equalsIgnoreCase(input)) {
entry.rewardType = QuestEntry.QuestType.ITEM;
state = State.WAITING_REWARD_ITEM;
} else if ("money".equalsIgnoreCase(input)) {
entry.rewardType = QuestEntry.QuestType.MONEY;
state = State.WAITING_REWARD_MONEY;
} else {
entry.rewardType = QuestEntry.QuestType.NONE;
state = WAITING_TIME_LIMIT;
}
break;
case WAITING_REWARD_ITEM: // TODO remove item from user inventory
if ("end".equalsIgnoreCase(input)) {
if (entry.rewardItem == null || entry.rewardItem.size() <= 0) {
player.sendMessage(I18n.format("user.quest.wizard.at_least_one"));
} else {
state = WAITING_TIME_LIMIT;
}
} else {
ItemStack stack = player.getInventory().getItemInMainHand();
if (stack == null || stack.getType() == Material.AIR) {
player.sendMessage(I18n.format("user.quest.wizard.hold_item_plz"));
} else {
entry.rewardItem.add(stack.clone());
}
}
break;
case WAITING_REWARD_MONEY:
try {
double money = Double.parseDouble(input);
entry.rewardMoney = money;
state = WAITING_TIME_LIMIT;
} catch (NumberFormatException ex) {
player.sendMessage(I18n.format("user.quest.wizard.invalid_number"));
}
break;
case WAITING_TIME_LIMIT:
try {
entry.questTimeLimit = Duration.parse(input);
state = WAITING_EXPIRE_IN;
} catch (DateTimeParseException ex) {
player.sendMessage(I18n.format("user.quest.wizard.invalid_time"));
}
break;
case WAITING_EXPIRE_IN:
try {
Duration dur = Duration.parse(input);
entry.questExpire = ZonedDateTime.now().plus(dur);
state = FINISH;
} catch (DateTimeParseException ex) {
player.sendMessage(I18n.format("user.quest.wizard.invalid_time"));
}
break;
case FINISH:
entry.claimable = true;
HamsterEcoHelper.instance.database.query(QuestEntry.class).insert(entry);
HandlerList.unregisterAll(this);
player.sendMessage(I18n.format("user.quest.wizard.added"));
return;
default:
throw new IllegalStateException();
}
player.sendMessage(I18n.format("user.quest.wizard." + state.name().toLowerCase()));
timer = new Timer(timeout);
}
}
1 change: 1 addition & 0 deletions src/main/java/cat/nyaa/HamsterEcoHelper/utils/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ public static String encodeItemStacks(List<ItemStack> items) {
}

public static List<ItemStack> decodeItemStacks(String items) {
if (items.length() <= 0) return new ArrayList<>();
String[] a = items.split(",");
List<ItemStack> r = new ArrayList<>();
for (String str : a) r.add(decodeItemStack(str));
Expand Down
Loading

0 comments on commit 6228fc0

Please sign in to comment.