commit
37462fedfe
|
|
@ -45,5 +45,5 @@ tasks {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly("com.alttd:Galaxy-API:1.19-R0.1-SNAPSHOT")
|
compileOnly("com.alttd:Galaxy-API:1.19-R0.1-SNAPSHOT")
|
||||||
implementation("com.alttd:DataLockLib:1.0.0-SNAPSHOT")
|
compileOnly("com.alttd.datalock:api:1.1.0-SNAPSHOT")
|
||||||
}
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ import com.alttd.altitudequests.events.*;
|
||||||
import com.alttd.altitudequests.objects.Quest;
|
import com.alttd.altitudequests.objects.Quest;
|
||||||
import com.alttd.altitudequests.util.Logger;
|
import com.alttd.altitudequests.util.Logger;
|
||||||
import com.alttd.altitudequests.util.Utilities;
|
import com.alttd.altitudequests.util.Utilities;
|
||||||
|
import com.alttd.datalock.DataLockAPI;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
|
@ -28,6 +29,14 @@ public final class AQuest extends JavaPlugin {
|
||||||
registerEvents();
|
registerEvents();
|
||||||
new CommandManager();
|
new CommandManager();
|
||||||
scheduleTasks();
|
scheduleTasks();
|
||||||
|
DataLockAPI dataLockAPI = DataLockAPI.get();
|
||||||
|
if (dataLockAPI == null) {
|
||||||
|
Logger.severe("Unable to load datalockapi");
|
||||||
|
} else if (dataLockAPI.isActiveChannel("aquest")) {
|
||||||
|
Logger.warning("Unable to register aquest channel");
|
||||||
|
} else {
|
||||||
|
dataLockAPI.registerChannel("aquest:player-data");
|
||||||
|
}
|
||||||
|
|
||||||
Logger.info("--------------------------------------------------");
|
Logger.info("--------------------------------------------------");
|
||||||
Logger.info("AQuest started");
|
Logger.info("AQuest started");
|
||||||
|
|
@ -59,8 +68,9 @@ public final class AQuest extends JavaPlugin {
|
||||||
getServer().getPluginManager().registerEvents(new EntityBucketed(), this);
|
getServer().getPluginManager().registerEvents(new EntityBucketed(), this);
|
||||||
getServer().getPluginManager().registerEvents(new EntityBreed(), this);
|
getServer().getPluginManager().registerEvents(new EntityBreed(), this);
|
||||||
getServer().getPluginManager().registerEvents(new DonNotMessWithNPC(), this);
|
getServer().getPluginManager().registerEvents(new DonNotMessWithNPC(), this);
|
||||||
getServer().getMessenger().registerOutgoingPluginChannel(this, "aquest:player-data");
|
getServer().getPluginManager().registerEvents(new DataLock(), this);
|
||||||
getServer().getMessenger().registerIncomingPluginChannel(this, "aquest:player-data", new PluginMessageListener());
|
// getServer().getMessenger().registerOutgoingPluginChannel(this, "aquest:player-data");
|
||||||
|
// getServer().getMessenger().registerIncomingPluginChannel(this, "aquest:player-data", new PluginMessageListener());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int yearDay = Utilities.getYearDay();
|
private static int yearDay = Utilities.getYearDay();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.alttd.altitudequests.commands.subcommands;
|
||||||
|
|
||||||
|
import com.alttd.altitudequests.commands.SubCommand;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CommandProgress extends SubCommand {
|
||||||
|
//TODO show player current quest progress
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender commandSender, String[] args) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "progress";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getTabComplete(CommandSender commandSender, String[] args) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getHelpMessage() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldTabComplete() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
package com.alttd.altitudequests.database;
|
|
||||||
|
|
||||||
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, int progress) {
|
|
||||||
String sql = "INSERT VALUES (?, ?) INTO user_seen " +
|
|
||||||
"WHERE uuid = ?" +
|
|
||||||
"ON DUPLICATE KEY UPDATE progress = ?";
|
|
||||||
long time;
|
|
||||||
|
|
||||||
try {
|
|
||||||
PreparedStatement preparedStatement = Database.getDatabase().getConnection().prepareStatement(sql);
|
|
||||||
preparedStatement.setString(1, uuid.toString());
|
|
||||||
preparedStatement.setInt(3, progress);
|
|
||||||
preparedStatement.setString(4, uuid.toString());
|
|
||||||
preparedStatement.setInt(6, progress);
|
|
||||||
|
|
||||||
preparedStatement.execute();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
Logger.warning("Unable to set progress for %.", uuid.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
44
src/main/java/com/alttd/altitudequests/events/DataLock.java
Normal file
44
src/main/java/com/alttd/altitudequests/events/DataLock.java
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.alttd.altitudequests.events;
|
||||||
|
|
||||||
|
import com.alttd.altitudequests.AQuest;
|
||||||
|
import com.alttd.altitudequests.config.Config;
|
||||||
|
import com.alttd.altitudequests.util.LoadUser;
|
||||||
|
import com.alttd.altitudequests.util.Logger;
|
||||||
|
import com.alttd.datalock.LockResponseEvent;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class DataLock implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onLockResponseEvent(LockResponseEvent event) {
|
||||||
|
UUID uuid;
|
||||||
|
try {
|
||||||
|
uuid = UUID.fromString(event.getData());
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.warning("Invalid data received from lock response event [%]", event.getData());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Config.DEBUG) {
|
||||||
|
Logger.info("Received lock response: channel: [%], response type: [%], data: [%]", event.getChannel(), event.getResponseType().toString(), event.getData());
|
||||||
|
}
|
||||||
|
switch (event.getResponseType()) {
|
||||||
|
case TRY_LOCK_RESULT -> {
|
||||||
|
if (!event.getResult())
|
||||||
|
return;
|
||||||
|
new LoadUser(uuid).runTaskAsynchronously(AQuest.getInstance());
|
||||||
|
}
|
||||||
|
case QUEUE_LOCK_FAILED -> {
|
||||||
|
Logger.warning("Unable to queue lock");
|
||||||
|
}
|
||||||
|
case TRY_UNLOCK_RESULT -> {
|
||||||
|
if (event.getResult())
|
||||||
|
return;
|
||||||
|
Logger.warning("Unable to unlock user [%]", uuid.toString());
|
||||||
|
}
|
||||||
|
default -> Logger.warning("Received unimplemented response type [%]", event.getResponseType().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,6 +4,7 @@ import com.alttd.altitudequests.AQuest;
|
||||||
import com.alttd.altitudequests.config.Config;
|
import com.alttd.altitudequests.config.Config;
|
||||||
import com.alttd.altitudequests.objects.Quest;
|
import com.alttd.altitudequests.objects.Quest;
|
||||||
import com.alttd.altitudequests.util.Logger;
|
import com.alttd.altitudequests.util.Logger;
|
||||||
|
import com.alttd.datalock.DataLockAPI;
|
||||||
import com.google.common.io.ByteArrayDataOutput;
|
import com.google.common.io.ByteArrayDataOutput;
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
|
@ -26,12 +27,7 @@ public class LogoutEvent implements Listener {
|
||||||
if (Config.DEBUG)
|
if (Config.DEBUG)
|
||||||
Logger.info("Syncing %", event.getPlayer().getName());
|
Logger.info("Syncing %", event.getPlayer().getName());
|
||||||
Quest.unloadUser(uuid);
|
Quest.unloadUser(uuid);
|
||||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
DataLockAPI.get().tryUnlock("aquest:player-data", uuid.toString());
|
||||||
out.writeUTF("try-unlock");
|
|
||||||
out.writeUTF(uuid.toString());
|
|
||||||
Bukkit.getServer().sendPluginMessage(AQuest.getInstance(),
|
|
||||||
"aquest:player-data",
|
|
||||||
out.toByteArray());
|
|
||||||
}
|
}
|
||||||
}.runTaskAsynchronously(AQuest.getInstance());
|
}.runTaskAsynchronously(AQuest.getInstance());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,98 +1,98 @@
|
||||||
package com.alttd.altitudequests.events;
|
//package com.alttd.altitudequests.events;
|
||||||
|
//
|
||||||
import com.alttd.altitudequests.AQuest;
|
//import com.alttd.altitudequests.AQuest;
|
||||||
import com.alttd.altitudequests.config.Config;
|
//import com.alttd.altitudequests.config.Config;
|
||||||
import com.alttd.altitudequests.database.Database;
|
//import com.alttd.altitudequests.database.Database;
|
||||||
import com.alttd.altitudequests.objects.Quest;
|
//import com.alttd.altitudequests.objects.Quest;
|
||||||
import com.alttd.altitudequests.util.Logger;
|
//import com.alttd.altitudequests.util.Logger;
|
||||||
import com.alttd.altitudequests.util.Utilities;
|
//import com.alttd.altitudequests.util.Utilities;
|
||||||
import com.google.common.io.ByteArrayDataInput;
|
//import com.google.common.io.ByteArrayDataInput;
|
||||||
import com.google.common.io.ByteStreams;
|
//import com.google.common.io.ByteStreams;
|
||||||
import org.bukkit.Bukkit;
|
//import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
//import org.bukkit.entity.Player;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
//import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
//import org.jetbrains.annotations.NotNull;
|
||||||
|
//
|
||||||
import java.sql.PreparedStatement;
|
//import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
//import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
//import java.sql.SQLException;
|
||||||
import java.util.UUID;
|
//import java.util.UUID;
|
||||||
|
//
|
||||||
public class PluginMessageListener implements org.bukkit.plugin.messaging.PluginMessageListener {
|
//public class PluginMessageListener implements org.bukkit.plugin.messaging.PluginMessageListener {
|
||||||
|
//
|
||||||
@Override
|
// @Override
|
||||||
public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] bytes) {
|
// public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] bytes) {
|
||||||
if (!channel.equals("aquest:player-data")) {
|
// if (!channel.equals("aquest:player-data")) {
|
||||||
Logger.warning("Received plugin message on invalid channel");
|
// Logger.warning("Received plugin message on invalid channel");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
|
// ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
|
||||||
switch (in.readUTF()) {
|
// switch (in.readUTF()) {
|
||||||
case "try-lock-result" -> {
|
// case "try-lock-result" -> {
|
||||||
if (!in.readBoolean()) {
|
// if (!in.readBoolean()) {
|
||||||
Logger.warning("Unable to lock row");
|
// Logger.warning("Unable to lock row");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
UUID uuid = UUID.fromString(in.readUTF());
|
// UUID uuid = UUID.fromString(in.readUTF());
|
||||||
if (Config.DEBUG)
|
// if (Config.DEBUG)
|
||||||
Logger.info("Received positive log result for %, loading user", uuid.toString());
|
// Logger.info("Received positive log result for %, loading user", uuid.toString());
|
||||||
loadUser(uuid);
|
// 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 "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" -> {
|
// case "try-unlock-result" -> {
|
||||||
if (in.readBoolean()) {
|
// if (in.readBoolean()) {
|
||||||
// ignore?
|
// // ignore?
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
Logger.severe("Unable to unlock %.", in.readUTF());
|
// Logger.severe("Unable to unlock %.", in.readUTF());
|
||||||
}
|
// }
|
||||||
case "locked-queue-lock" -> {
|
// case "locked-queue-lock" -> {
|
||||||
if (!in.readBoolean()) {
|
// if (!in.readBoolean()) {
|
||||||
Logger.warning("Got false back from locked queue lock");
|
// Logger.warning("Got false back from locked queue lock");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
UUID uuid = UUID.fromString(in.readUTF());
|
// UUID uuid = UUID.fromString(in.readUTF());
|
||||||
if (Config.DEBUG)
|
// if (Config.DEBUG)
|
||||||
Logger.info("Received positive log result for %, loading user", uuid.toString());
|
// Logger.info("Received positive log result for %, loading user", uuid.toString());
|
||||||
loadUser(uuid);
|
// loadUser(uuid);
|
||||||
}
|
// }
|
||||||
case "check-lock-result" -> {
|
// case "check-lock-result" -> {
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private void loadUser(UUID uuid) {
|
// private void loadUser(UUID uuid) {
|
||||||
new BukkitRunnable() {
|
// new BukkitRunnable() {
|
||||||
@Override
|
// @Override
|
||||||
public void run() {
|
// public void run() {
|
||||||
String sql = "SELECT * FROM generic_quest_progress WHERE uuid = ?";
|
// String sql = "SELECT * FROM generic_quest_progress WHERE uuid = ?";
|
||||||
try {
|
// try {
|
||||||
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
|
// PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
|
||||||
statement.setString(1, uuid.toString());
|
// statement.setString(1, uuid.toString());
|
||||||
ResultSet resultSet = statement.executeQuery();
|
// ResultSet resultSet = statement.executeQuery();
|
||||||
if (resultSet.next() && resultSet.getInt("year_day") == Utilities.getYearDay()) {
|
// if (resultSet.next() && resultSet.getInt("year_day") == Utilities.getYearDay()) {
|
||||||
if (Quest.loadDailyQuest(
|
// if (Quest.loadDailyQuest(
|
||||||
resultSet.getString("quest"),
|
// resultSet.getString("quest"),
|
||||||
resultSet.getString("quest_variant"),
|
// resultSet.getString("quest_variant"),
|
||||||
resultSet.getInt("step_1_progress"),
|
// resultSet.getInt("step_1_progress"),
|
||||||
resultSet.getInt("step_2_progress"),
|
// resultSet.getInt("step_2_progress"),
|
||||||
uuid,
|
// uuid,
|
||||||
resultSet.getInt("amount"),
|
// resultSet.getInt("amount"),
|
||||||
resultSet.getInt("reward_received") == 1)) {
|
// resultSet.getInt("reward_received") == 1)) {
|
||||||
if (Config.DEBUG)
|
// if (Config.DEBUG)
|
||||||
Logger.info("Loading daily quest for %", uuid.toString());
|
// Logger.info("Loading daily quest for %", uuid.toString());
|
||||||
return;
|
// return;
|
||||||
} else
|
// } else
|
||||||
Logger.warning("Unable to load quest for %, creating new quest...", uuid.toString());
|
// Logger.warning("Unable to load quest for %, creating new quest...", uuid.toString());
|
||||||
}
|
// }
|
||||||
} catch (SQLException exception) {
|
// } catch (SQLException exception) {
|
||||||
exception.printStackTrace();
|
// exception.printStackTrace();
|
||||||
}
|
// }
|
||||||
if (Config.DEBUG)
|
// if (Config.DEBUG)
|
||||||
Logger.info("Creating new daily quest for %", uuid.toString());
|
// Logger.info("Creating new daily quest for %", uuid.toString());
|
||||||
Quest.createDailyQuest(Bukkit.getPlayer(uuid));
|
// Quest.createDailyQuest(Bukkit.getPlayer(uuid));
|
||||||
}
|
// }
|
||||||
}.runTaskAsynchronously(AQuest.getInstance());
|
// }.runTaskAsynchronously(AQuest.getInstance());
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,7 @@ import com.alttd.altitudequests.objects.quests.KillMobsQuest;
|
||||||
import com.alttd.altitudequests.objects.quests.MineQuest;
|
import com.alttd.altitudequests.objects.quests.MineQuest;
|
||||||
import com.alttd.altitudequests.util.Logger;
|
import com.alttd.altitudequests.util.Logger;
|
||||||
import com.alttd.altitudequests.util.Utilities;
|
import com.alttd.altitudequests.util.Utilities;
|
||||||
import com.google.common.io.ByteArrayDataOutput;
|
import com.alttd.datalock.DataLockAPI;
|
||||||
import com.google.common.io.ByteStreams;
|
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||||
|
|
@ -141,12 +140,7 @@ public abstract class Quest {
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
DataLockAPI.get().tryLock("aquest:player-data", uuid.toString());
|
||||||
out.writeUTF("try-lock");
|
|
||||||
out.writeUTF(uuid.toString());
|
|
||||||
Bukkit.getServer().sendPluginMessage(AQuest.getInstance(),
|
|
||||||
"aquest:player-data",
|
|
||||||
out.toByteArray());
|
|
||||||
if (Config.DEBUG)
|
if (Config.DEBUG)
|
||||||
Logger.info("Send lock request for %", uuid.toString());
|
Logger.info("Send lock request for %", uuid.toString());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
51
src/main/java/com/alttd/altitudequests/util/LoadUser.java
Normal file
51
src/main/java/com/alttd/altitudequests/util/LoadUser.java
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
package com.alttd.altitudequests.util;
|
||||||
|
|
||||||
|
import com.alttd.altitudequests.config.Config;
|
||||||
|
import com.alttd.altitudequests.database.Database;
|
||||||
|
import com.alttd.altitudequests.objects.Quest;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class LoadUser extends BukkitRunnable {
|
||||||
|
|
||||||
|
UUID uuid;
|
||||||
|
|
||||||
|
public LoadUser(UUID uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
String sql = "SELECT * FROM generic_quest_progress WHERE uuid = ?";
|
||||||
|
try {
|
||||||
|
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
|
ResultSet resultSet = statement.executeQuery();
|
||||||
|
if (resultSet.next() && resultSet.getInt("year_day") == Utilities.getYearDay()) {
|
||||||
|
if (Quest.loadDailyQuest(
|
||||||
|
resultSet.getString("quest"),
|
||||||
|
resultSet.getString("quest_variant"),
|
||||||
|
resultSet.getInt("step_1_progress"),
|
||||||
|
resultSet.getInt("step_2_progress"),
|
||||||
|
uuid,
|
||||||
|
resultSet.getInt("amount"),
|
||||||
|
resultSet.getInt("reward_received") == 1)) {
|
||||||
|
if (Config.DEBUG)
|
||||||
|
Logger.info("Loading daily quest for %", uuid.toString());
|
||||||
|
return;
|
||||||
|
} else
|
||||||
|
Logger.warning("Unable to load quest for %, creating new quest...", uuid.toString());
|
||||||
|
}
|
||||||
|
} catch (SQLException exception) {
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
if (Config.DEBUG)
|
||||||
|
Logger.info("Creating new daily quest for %", uuid.toString());
|
||||||
|
Quest.createDailyQuest(Bukkit.getPlayer(uuid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,6 +4,8 @@ main: com.alttd.altitudequests.AQuest
|
||||||
api-version: 1.18
|
api-version: 1.18
|
||||||
authors: [ Teriuihi ]
|
authors: [ Teriuihi ]
|
||||||
description: A plugin to run quests on a server
|
description: A plugin to run quests on a server
|
||||||
|
depend:
|
||||||
|
- DataLockLib
|
||||||
commands:
|
commands:
|
||||||
aquest:
|
aquest:
|
||||||
permission: aquest.use
|
permission: aquest.use
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user