This repository has been archived by the owner on Mar 8, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c1a092b
commit 6228fc0
Showing
9 changed files
with
379 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 51 additions & 0 deletions
51
src/main/java/cat/nyaa/HamsterEcoHelper/quest/QuestCommands.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
|
||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
214 changes: 214 additions & 0 deletions
214
src/main/java/cat/nyaa/HamsterEcoHelper/quest/QuestWizard.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.