Big commit, made mining quests work and use data lock to sync for when we add db

This commit is contained in:
2022-06-01 19:33:02 +02:00
parent 686925361a
commit 063fc4061e
21 changed files with 531 additions and 113 deletions
@@ -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);
}
}