Big commit, made mining quests work and use data lock to sync for when we add db
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
package com.alttd.altitudequests.events;
|
||||
|
||||
import com.alttd.altitudequests.objects.Quest;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
|
||||
public class LoginEvent implements Listener {
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
Quest.tryLoadDailyQuest(event.getPlayer().getUniqueId());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.alttd.altitudequests.events;
|
||||
|
||||
import com.alttd.altitudequests.AQuest;
|
||||
import com.alttd.altitudequests.config.Config;
|
||||
import com.alttd.altitudequests.objects.Quest;
|
||||
import com.alttd.altitudequests.util.Logger;
|
||||
import com.google.common.io.ByteArrayDataOutput;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class LogoutEvent implements Listener {
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
UUID uuid = event.getPlayer().getUniqueId();
|
||||
|
||||
if (Config.DEBUG)
|
||||
Logger.info("Syncing %", event.getPlayer().getName());
|
||||
Quest.unloadUser(uuid);
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
out.writeUTF("try-unlock");
|
||||
out.writeUTF(uuid.toString());
|
||||
Bukkit.getServer().sendPluginMessage(AQuest.getInstance(),
|
||||
"aquest:player-data",
|
||||
out.toByteArray());
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ import java.util.UUID;
|
||||
|
||||
public class MineBlocks implements Listener {
|
||||
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
UUID uuid = player.getUniqueId();
|
||||
@@ -20,7 +20,7 @@ public class MineBlocks implements Listener {
|
||||
if (quest == null || quest.isDone())
|
||||
return;
|
||||
if (quest instanceof MineQuest mineQuest)
|
||||
mineQuest.mine(event.getBlock(), player);
|
||||
mineQuest.mine(event.getBlock());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
package com.alttd.altitudequests.events;
|
||||
|
||||
import com.alttd.altitudequests.AQuest;
|
||||
import com.alttd.altitudequests.config.Config;
|
||||
import com.alttd.altitudequests.objects.Quest;
|
||||
import com.alttd.altitudequests.util.Logger;
|
||||
import com.google.common.io.ByteArrayDataInput;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class PluginMessageListener implements org.bukkit.plugin.messaging.PluginMessageListener {
|
||||
|
||||
@Override
|
||||
public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] bytes) {
|
||||
if (!channel.equals("aquest:player-data")) {
|
||||
Logger.warning("Received plugin message on invalid channel");
|
||||
return;
|
||||
}
|
||||
ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
|
||||
switch (in.readUTF()) {
|
||||
case "try-lock-result" -> {
|
||||
if (!in.readBoolean()) {
|
||||
Logger.warning("Unable to lock row");
|
||||
return; //TODO handle
|
||||
}
|
||||
UUID uuid = UUID.fromString(in.readUTF());
|
||||
if (Config.DEBUG)
|
||||
Logger.warning("Received positive log result for %, loading user", uuid.toString());
|
||||
loadUser(uuid);
|
||||
}
|
||||
case "queue-lock-failed" -> Logger.warning("Encountered uuid that was locked and had a lock queued: %, lock is from %", in.readUTF(), in.readUTF());
|
||||
case "try-unlock-result" -> {
|
||||
if (in.readBoolean()) {
|
||||
// ignore?
|
||||
return;
|
||||
}
|
||||
Logger.severe("Unable to unlock %.", in.readUTF());
|
||||
}
|
||||
case "locked-queue-lock" -> {
|
||||
if (!in.readBoolean()) {
|
||||
Logger.warning("Got false back from locked queue lock");
|
||||
return; //TODO handle
|
||||
}
|
||||
UUID uuid = UUID.fromString(in.readUTF());
|
||||
if (Config.DEBUG)
|
||||
Logger.warning("Received positive log result for %, loading user", uuid.toString());
|
||||
loadUser(uuid);
|
||||
}
|
||||
case "check-lock-result" -> {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void loadUser(UUID uuid) {
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
//TODO load user from database
|
||||
//TODO if no quest in database create one
|
||||
System.out.println("creating quest");
|
||||
Quest.createDailyQuest(Bukkit.getPlayer(uuid));
|
||||
}
|
||||
}.runTaskAsynchronously(AQuest.getInstance());
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,9 @@ package com.alttd.altitudequests.events;
|
||||
import com.alttd.altitudequests.AQuest;
|
||||
import com.alttd.altitudequests.config.Config;
|
||||
import com.alttd.altitudequests.config.LocalConfig;
|
||||
import com.alttd.altitudequests.objects.Quest;
|
||||
import net.kyori.adventure.inventory.Book;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
@@ -24,41 +26,54 @@ public class TalkToQuest implements Listener {
|
||||
|
||||
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||
|
||||
private static final Set<UUID> tmp = new HashSet<>();
|
||||
private static final Set<UUID> inProcess = new HashSet<>();
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onEntityInteract(PlayerInteractEntityEvent event) {
|
||||
if (LocalConfig.activeNPC == null || !LocalConfig.activeNPC.equals(event.getRightClicked().getUniqueId()))
|
||||
return;
|
||||
event.setCancelled(true);
|
||||
if (!tmp.remove(event.getPlayer().getUniqueId())) {
|
||||
tmp.add(event.getPlayer().getUniqueId());
|
||||
final Player player = event.getPlayer();
|
||||
final UUID uniqueId = player.getUniqueId();
|
||||
if (inProcess.contains(uniqueId))
|
||||
return;
|
||||
}
|
||||
event.getPlayer().sendMiniMessage("Interacted with scruff - DEBUG", null);
|
||||
|
||||
inProcess.add(uniqueId);
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
event.getPlayer().openBook(getBook(event));
|
||||
player.openBook(getBook(event));
|
||||
inProcess.remove(uniqueId);
|
||||
}
|
||||
}.runTaskTimerAsynchronously(AQuest.getInstance(), 0, 0);
|
||||
//TODO make it so there can be one book config per quest
|
||||
}.runTaskAsynchronously(AQuest.getInstance());
|
||||
//TODO make it so everything can be done with commands and just don't let them tab complete and do them through the book instead
|
||||
//TODO in config allow a multitude of events to be prepared and randomly select from them at certain times of day?
|
||||
}
|
||||
|
||||
private Book getBook (PlayerInteractEntityEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
return Book.builder()
|
||||
.author(miniMessage.deserialize(Config.QUEST_BOOK_AUTHOR))
|
||||
.title(miniMessage.deserialize(Config.QUEST_BOOK_TITLE))
|
||||
.pages(getPages(player).stream()
|
||||
.map(page -> miniMessage.deserialize(page, TagResolver.resolver(Placeholder.component("player", player.name()))))
|
||||
.collect(Collectors.toList()))
|
||||
.pages(getPages(player))
|
||||
.build();
|
||||
}
|
||||
|
||||
private List<String> getPages(Player player) {
|
||||
return (Config.QUEST_PAGES);
|
||||
private static final Component error = MiniMessage.miniMessage().deserialize("<red>Error retrieving quest data</red>");
|
||||
private List<Component> getPages(Player player) {
|
||||
Quest dailyQuest = Quest.getDailyQuest(player.getUniqueId());
|
||||
if (dailyQuest == null)
|
||||
return List.of(error);
|
||||
TagResolver tagResolver = TagResolver.resolver(
|
||||
TagResolver.resolver(Placeholder.component("player", player.name())),
|
||||
TagResolver.resolver(Placeholder.parsed("br", "\n")),
|
||||
dailyQuest.getTagResolvers()
|
||||
);
|
||||
//TODO add weekly quest?
|
||||
List<Component> pages = dailyQuest.getPages().stream()
|
||||
.map(page -> miniMessage.deserialize(page, tagResolver))
|
||||
.collect(Collectors.toList());
|
||||
return (pages);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user