attempted to start adding quests

This commit is contained in:
Teriuihi 2022-05-01 21:48:52 +02:00
parent b07eebcfc8
commit 1ecf4508e8
21 changed files with 540 additions and 20 deletions

View File

@ -1,5 +1,11 @@
package com.alttd.altitudequests;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.DatabaseConfig;
import com.alttd.altitudequests.config.LocalConfig;
import com.alttd.altitudequests.config.MessagesConfig;
import com.alttd.altitudequests.events.TalkToQuest;
import com.alttd.altitudequests.util.Logger;
import org.bukkit.plugin.java.JavaPlugin;
public final class AQuests extends JavaPlugin {
@ -17,12 +23,24 @@ public final class AQuests extends JavaPlugin {
@Override
public void onEnable() {
// Plugin startup logic
Config.reload();
DatabaseConfig.reload();
MessagesConfig.reload();
LocalConfig.reload();
registerEvents();
Logger.info("--------------------------------------------------");
Logger.info("AQuest started");
Logger.info("--------------------------------------------------");
}
@Override
public void onDisable() {
// Plugin shutdown logic
}
private void registerEvents() {
getServer().getPluginManager().registerEvents(new TalkToQuest(), this);
}
}

View File

@ -1,6 +1,7 @@
package com.alttd.altitudequests.commands;
import com.alttd.altitudequests.AQuests;
import com.alttd.altitudequests.commands.subcommands.CommandCreateScruff;
import com.alttd.altitudequests.commands.subcommands.CommandHelp;
import com.alttd.altitudequests.commands.subcommands.CommandReload;
import com.alttd.altitudequests.config.Config;
@ -31,7 +32,8 @@ public class CommandManager implements CommandExecutor, TabExecutor {
subCommands = Arrays.asList(
new CommandHelp(this),
new CommandReload());
new CommandReload(),
new CommandCreateScruff());
}
@Override

View File

@ -0,0 +1,99 @@
package com.alttd.altitudequests.commands.subcommands;
import com.alttd.altitudequests.commands.SubCommand;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.LocalConfig;
import com.alttd.altitudequests.config.MessagesConfig;
import com.alttd.altitudequests.util.Utilities;
import net.kyori.adventure.text.minimessage.Template;
import net.kyori.adventure.text.minimessage.template.TemplateResolver;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.*;
import org.bukkit.event.entity.CreatureSpawnEvent;
import java.util.*;
public class CommandCreateScruff extends SubCommand {
@Override
public boolean onCommand(CommandSender commandSender, String[] args) {
if (args.length != 8) {
commandSender.sendMiniMessage(getHelpMessage(), null);
return true;
}
World world = Bukkit.getServer().getWorld(args[7]);
if (world == null) {
commandSender.sendMiniMessage(getHelpMessage(), null);
return true;
}
Location location = new Location(world, Double.parseDouble(args[2]),Double.parseDouble(args[3]), Double.parseDouble(args[4]),
Float.parseFloat(args[5]), Float.parseFloat(args[6]));
Wolf wolf = (Wolf) world.spawnEntity(location, EntityType.WOLF, CreatureSpawnEvent.SpawnReason.CUSTOM);
wolf.setPersistent(true);
wolf.setInvulnerable(true);
wolf.setGravity(false);
wolf.setSilent(true);
wolf.setAI(false);
wolf.setCollarColor(DyeColor.MAGENTA);
wolf.setCustomNameVisible(true);
wolf.customName(getMiniMessage().deserialize("Scruff"));
UUID uuid = wolf.getUniqueId();
LocalConfig.setActiveNPC(uuid);
return true;
}
@Override
public String getName() {
return "createscruff";
}
@Override
public List<String> getTabComplete(CommandSender commandSender, String[] args) {
List<String> res = new ArrayList<>();
switch (args.length) {
case 2 -> {
if (commandSender instanceof Player player) {
res.add(String.valueOf(Utilities.round(player.getLocation().getX(), 2)));
}
}
case 3 -> {
if (commandSender instanceof Player player) {
res.add(String.valueOf(Utilities.round(player.getLocation().getY(), 1)));
}
}
case 4 -> {
if (commandSender instanceof Player player) {
res.add(String.valueOf(Utilities.round(player.getLocation().getZ(), 2)));
}
}
case 5 -> {
if (commandSender instanceof Player player) {
res.add(String.valueOf(Utilities.round(player.getLocation().getYaw(), 2)));
}
}
case 6 -> {
if (commandSender instanceof Player player) {
res.add(String.valueOf(Utilities.round(player.getLocation().getPitch(), 2)));
}
}
case 7 -> {
if (commandSender instanceof Player player) {
res.add(player.getLocation().getWorld().getName());
}
}
}
return res;
}
@Override
public String getHelpMessage() {
return MessagesConfig.CREATE_SCRUFF_MESSAGE;
}
}

View File

@ -2,7 +2,7 @@ package com.alttd.altitudequests.commands.subcommands;
import com.alttd.altitudequests.commands.CommandManager;
import com.alttd.altitudequests.commands.SubCommand;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.MessagesConfig;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
@ -20,7 +20,7 @@ public class CommandHelp extends SubCommand {
@Override
public boolean onCommand(CommandSender commandSender, String[] args) {
commandSender.sendMiniMessage(Config.HELP_MESSAGE_WRAPPER.replaceAll("<commands>", commandManager
commandSender.sendMiniMessage(MessagesConfig.HELP_MESSAGE_WRAPPER.replaceAll("<commands>", commandManager
.getSubCommands().stream()
.filter(subCommand -> commandSender.hasPermission(subCommand.getPermission()))
.map(SubCommand::getHelpMessage)
@ -40,6 +40,6 @@ public class CommandHelp extends SubCommand {
@Override
public String getHelpMessage() {
return Config.HELP_MESSAGE;
return MessagesConfig.HELP_MESSAGE;
}
}

View File

@ -2,6 +2,9 @@ package com.alttd.altitudequests.commands.subcommands;
import com.alttd.altitudequests.commands.SubCommand;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.DatabaseConfig;
import com.alttd.altitudequests.config.LocalConfig;
import com.alttd.altitudequests.config.MessagesConfig;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
@ -12,6 +15,9 @@ public class CommandReload extends SubCommand {
@Override
public boolean onCommand(CommandSender commandSender, String[] args) {
Config.reload();
DatabaseConfig.reload();
MessagesConfig.reload();
LocalConfig.reload();
commandSender.sendMiniMessage("<green>Reloaded AltitudeQuests config.</green>", null);
return true;
}
@ -28,6 +34,6 @@ public class CommandReload extends SubCommand {
@Override
public String getHelpMessage() {
return Config.RELOAD_HELP_MESSAGE;
return MessagesConfig.RELOAD_HELP_MESSAGE;
}
}

View File

@ -104,6 +104,11 @@ abstract class AbstractConfig {
return yaml.getList(path, yaml.getList(path));
}
List<String> getStringList(String path, List<String> def) {
yaml.addDefault(path, def);
return yaml.getStringList(path);
}
@NonNull
<T> Map<String, T> getMap(final @NonNull String path, final @Nullable Map<String, T> def) {
final ImmutableMap.Builder<String, T> builder = ImmutableMap.builder();

View File

@ -1,6 +1,7 @@
package com.alttd.altitudequests.config;
import java.io.File;
import java.util.List;
public final class Config extends AbstractConfig {
@ -9,7 +10,6 @@ public final class Config extends AbstractConfig {
public Config() {
super(new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs" + File.separator + "AltitudeQuests"), "config.yml");
}
public static void reload() {
config = new Config();
@ -19,33 +19,29 @@ public final class Config extends AbstractConfig {
config.readConfig(Config.class, null);
}
public static String HELP_MESSAGE_WRAPPER = "<gold>AltitudeQuests help:\n<commands></gold>";
public static String HELP_MESSAGE = "<green>Show this menu: <gold>/aquest help</gold></green>";
public static String RELOAD_HELP_MESSAGE = "<green>Reload configs: <gold>/aquest reload</gold></green>";
private static void loadHelp() {
HELP_MESSAGE_WRAPPER = config.getString("help.help-wrapper", HELP_MESSAGE_WRAPPER);
HELP_MESSAGE = config.getString("help.help", HELP_MESSAGE);
RELOAD_HELP_MESSAGE = config.getString("help.reload", RELOAD_HELP_MESSAGE);
}
public static String NO_PERMISSION = "<red>You do not have permission to do that.</red>";
public static String NO_CONSOLE = "<red>You cannot use this command from console.</red>";
private static void loadGeneric() {
NO_PERMISSION = config.getString("generic.no-permission", NO_PERMISSION);
NO_CONSOLE = config.getString("generic.no-console", NO_CONSOLE);
}
private static void loadMessages() {
public static String QUEST_BOOK_AUTHOR = "<magenta>Scruff</magenta>";
public static String QUEST_BOOK_TITLE = "<green>Quest Title</green>";
public static List<String> QUEST_PAGES = List.of("Example");
private static void loadBook() {
QUEST_BOOK_AUTHOR = config.getString("book.author", QUEST_BOOK_AUTHOR);
QUEST_BOOK_TITLE = config.getString("book.title", QUEST_BOOK_TITLE);
QUEST_PAGES = config.getStringList("book.pages", QUEST_PAGES);
}
private static void loadGUIText() {
}
public static String NPC_NAME = "<light_purple>Scruff</light_purple>";
public static boolean DEBUG = false;
private static void loadSettings() {
NPC_NAME = config.getString("settings.npd-name", NPC_NAME);
DEBUG = config.getBoolean("settings.debug", DEBUG);
}
}

View File

@ -0,0 +1,34 @@
package com.alttd.altitudequests.config;
import java.io.File;
public class DatabaseConfig extends AbstractConfig {
static DatabaseConfig config;
public DatabaseConfig() {
super(new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs"
+ File.separator + "AltitudeQuests"), "database.yml");
}
public static void reload() {
config = new DatabaseConfig();
config.readConfig(DatabaseConfig.class, null);
}
public static String DRIVER = "mysql";
public static String IP = "localhost";
public static String PORT = "3306";
public static String DATABASE_NAME = "AltitudeQuests";
public static String USERNAME = "root";
public static String PASSWORD = "root";
private static void loadDatabase() {
DRIVER = config.getString("database.driver", DRIVER);
IP = config.getString("database.ip", IP);
PORT = config.getString("database.port", PORT);
DATABASE_NAME = config.getString("database.name", DATABASE_NAME);
USERNAME = config.getString("database.username", USERNAME);
PASSWORD = config.getString("database.password", PASSWORD);
}
}

View File

@ -0,0 +1,31 @@
package com.alttd.altitudequests.config;
import java.util.UUID;
public class LocalConfig extends AbstractConfig{
static LocalConfig config;
public LocalConfig() {
super("LocalConfig");
}
public static void reload() {
config = new LocalConfig();
config.readConfig(LocalConfig.class, null);
}
public static UUID activeNPC = null;
private static void loadActiveNPC() {
activeNPC = UUID.fromString(config.getString("active-npc", null));
}
public static void removeActiveNPC() {
config.set("active-npc", null);
}
public static void setActiveNPC(UUID uuid) {
config.set("active-npc", uuid.toString());
}
}

View File

@ -0,0 +1,35 @@
package com.alttd.altitudequests.config;
import java.io.File;
public class MessagesConfig extends AbstractConfig{
static MessagesConfig config;
public MessagesConfig() {
super(new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs"
+ File.separator + "AltitudeQuests"), "messages.yml");
}
public static void reload() {
config = new MessagesConfig();
config.readConfig(MessagesConfig.class, null);
}
public static String HELP_MESSAGE_WRAPPER = "<gold>AltitudeQuests help:\n<commands></gold>";
public static String HELP_MESSAGE = "<green>Show this menu: <gold>/aquest help</gold></green>";
public static String RELOAD_HELP_MESSAGE = "<green>Reload configs: <gold>/aquest reload</gold></green>";
public static String CREATE_SCRUFF_MESSAGE = "<green>Create Scruff: <gold>/aquest createscruff <x> <y> <z> <yaw> <pitch> <world></gold></green>";
private static void loadHelp() {
HELP_MESSAGE_WRAPPER = config.getString("help.help-wrapper", HELP_MESSAGE_WRAPPER);
HELP_MESSAGE = config.getString("help.help", HELP_MESSAGE);
RELOAD_HELP_MESSAGE = config.getString("help.reload", RELOAD_HELP_MESSAGE);
CREATE_SCRUFF_MESSAGE = config.getString("help.help-wrapper", CREATE_SCRUFF_MESSAGE);
}
private static void loadCommandMessages() {
}
}

View File

@ -0,0 +1,82 @@
package com.alttd.altitudequests.database;
import com.alttd.altitudequests.AQuests;
import com.alttd.altitudequests.config.DatabaseConfig;
import com.alttd.altitudequests.util.Logger;
import org.bukkit.Bukkit;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Database {
private static Database instance = null;
public static Connection connection = null;
private Database() {
}
public static Database getDatabase(){
if (instance == null)
instance = new Database();
return (instance);
}
public void init() {
try {
openConnection();
} catch (SQLException e) {
e.printStackTrace();
}
// Tables
createUserPointsTable();
}
/**
* Opens the connection if it's not already open.
* @throws SQLException If it can't create the connection.
*/
private void openConnection() throws SQLException {
if (connection != null && !connection.isClosed()) {
return;
}
synchronized (this) {
if (connection != null && !connection.isClosed()) {
return;
}
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
connection = DriverManager.getConnection(
"jdbc:mysql://" + DatabaseConfig.IP + ":" + DatabaseConfig.PORT + "/" + DatabaseConfig.DATABASE_NAME +
"?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true",
DatabaseConfig.USERNAME, DatabaseConfig.PASSWORD);
}
}
private static void createUserPointsTable() {
try {
String sql = "CREATE TABLE IF NOT EXISTS quest_progress(" +
"uuid VARCHAR(36) NOT NULL, " +
"quest VARCHAR(36) NOT NULL, " +
"prepare_progress INT NOT NULL, " +
"turn_in_progress INT NOT NULL, " +
"PRIMARY KEY (UUID, quest)" +
")";
connection.prepareStatement(sql).executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
Logger.severe("Error while trying to create user point table");
Logger.severe("Shutting down AltitudeQuests");
Bukkit.getPluginManager().disablePlugin(AQuests.getInstance());
}
}
}

View File

@ -0,0 +1,35 @@
package com.alttd.altitudequests.database;
import com.alttd.altitudequests.objects.GoalType;
import com.alttd.altitudequests.util.Logger;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.UUID;
public class Queries {
public static int setUserProgress(UUID uuid, GoalType goalType, int progress) {
String sql = "INSERT VALUES (?, ?, ?) INTO user_seen " +
"WHERE uuid = ? AND goal_type = ? " +
"ON DUPLICATE KEY UPDATE progress = ?";
long time;
try {
PreparedStatement preparedStatement = Database.connection.prepareStatement(sql);
preparedStatement.setString(1, uuid.toString());
preparedStatement.setString(2, goalType.name());
preparedStatement.setInt(3, progress);
preparedStatement.setString(4, uuid.toString());
preparedStatement.setString(5, goalType.name());
preparedStatement.setInt(6, progress);
preparedStatement.execute();
} catch (SQLException e) {
e.printStackTrace();
Logger.warning("Unable to set progress for %.", uuid.toString());
}
return (0);
}
}

View File

@ -0,0 +1,26 @@
package com.alttd.altitudequests.events;
import com.alttd.altitudequests.objects.Quest;
import com.alttd.altitudequests.objects.quests.MineQuest;
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.BlockBreakEvent;
import java.util.UUID;
public class MineBlocks implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
Quest quest = Quest.getDailyQuest(uuid);
if (quest == null || quest.isDone())
return;
if (quest instanceof MineQuest mineQuest)
mineQuest.mine(event.getBlock(), player);
}
}

View File

@ -0,0 +1,38 @@
package com.alttd.altitudequests.events;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.LocalConfig;
import net.kyori.adventure.inventory.Book;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import java.util.stream.Collectors;
public class TalkToQuest implements Listener {
private static final Book book;
static {
MiniMessage miniMessage = MiniMessage.miniMessage();
book = Book.builder()
.author(miniMessage.deserialize(Config.QUEST_BOOK_AUTHOR))
.title(miniMessage.deserialize(Config.QUEST_BOOK_TITLE))
.pages(Config.QUEST_PAGES.stream()
.map(miniMessage::deserialize)
.collect(Collectors.toList()))
.build();
}
@EventHandler(priority = EventPriority.HIGH)
public void onEntityInteract(PlayerInteractEntityEvent event) {
if (LocalConfig.activeNPC == null || !LocalConfig.activeNPC.equals(event.getRightClicked().getUniqueId()))
return;
event.setCancelled(true);
event.getPlayer().openBook(book);
//TODO make it so there can be one book config per quest
//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?
}
}

View File

@ -0,0 +1,5 @@
package com.alttd.altitudequests.gui;
public class BookGUI {
}

View File

@ -0,0 +1,20 @@
package com.alttd.altitudequests.gui;
import net.kyori.adventure.inventory.Book;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import java.util.HashMap;
import java.util.UUID;
public interface GUI {
HashMap<UUID, GUI> GUIByUUID = new HashMap<>();
void open(Player player);
GUIAction getGuiAction(int slot);
Inventory getInventory();
Book getBook();
}

View File

@ -0,0 +1,7 @@
package com.alttd.altitudequests.gui;
import org.bukkit.entity.Player;
public interface GUIAction {
void click(Player player);
}

View File

@ -0,0 +1,8 @@
package com.alttd.altitudequests.objects;
public enum GoalType {
TALK,
MONEY,
MINE,
WALK
}

View File

@ -0,0 +1,38 @@
package com.alttd.altitudequests.objects;
import java.util.HashMap;
import java.util.UUID;
public abstract class Quest {
private static Quest dailyQuest = null;
private static final HashMap<UUID, Quest> dailyQuests = new HashMap<>();
private static Quest weeklyQuest = null;
private String name;
private GoalType goalType;
//TODO add all data every quest needs
public Quest(String name, GoalType goalType) {
this.name = name;
this.goalType = goalType;
}
public static Quest getDailyQuest(UUID uuid) {
if (!dailyQuests.containsKey(uuid))
dailyQuests.put(uuid, dailyQuest.initQuest());
return dailyQuests.get(uuid);
}
public static void setActiveDailyQuest(Quest newQuest) {
Quest.dailyQuest = newQuest;
}
public static void setActiveWeeklyQuest(Quest newQuest) {
Quest.weeklyQuest = newQuest;
}
public abstract boolean isDone();
public abstract Quest initQuest();
}

View File

@ -0,0 +1,27 @@
package com.alttd.altitudequests.objects.quests;
import com.alttd.altitudequests.objects.GoalType;
import com.alttd.altitudequests.objects.Quest;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
public class MineQuest extends Quest {
public MineQuest(String name, GoalType goalType) {
super(name, goalType);
}
@Override
public boolean isDone() {
return false;
}
@Override
public Quest initQuest() {
return new MineQuest("Mine", GoalType.MINE);
}
public void mine(Block block, Player player) {
}
}

View File

@ -0,0 +1,8 @@
package com.alttd.altitudequests.util;
public class Utilities {
public static double round(double num, int precision) {
double scale = Math.pow(10, precision);
return ((int) (num * scale)) / scale;
}
}