userQuestList = new ArrayList<>();
60 | msg.questFileList.forEach(questFile -> {
61 | try {
62 | userQuestList.add((UserQuest) GsonManager.getJsonClass(questFile, UserQuest.class));
63 | } catch (IOException e) {
64 | throw new RuntimeException(e);
65 | }
66 | });
67 |
68 | DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.setActiveQuestList(userQuestList));
69 | });
70 |
71 | ctx.get().setPacketHandled(true);
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/quest/QuestDataPacket.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.quest;
2 |
3 | import dev.zanckor.mod.common.network.handler.ServerHandler;
4 | import dev.zanckor.mod.common.util.MCUtil;
5 | import net.minecraft.network.FriendlyByteBuf;
6 | import net.minecraft.server.level.ServerLevel;
7 | import net.minecraft.server.level.ServerPlayer;
8 | import net.minecraft.world.entity.Entity;
9 | import net.minecraft.world.entity.LivingEntity;
10 | import net.minecraftforge.network.NetworkEvent;
11 |
12 | import java.io.IOException;
13 | import java.util.UUID;
14 | import java.util.function.Supplier;
15 |
16 | public class QuestDataPacket {
17 |
18 | /**
19 | * Packet to execute a quest handler from client to server
20 | *
21 | * Be careful using this from client side, may cause exploits
22 | */
23 |
24 | Enum quest;
25 | UUID entity;
26 |
27 | public QuestDataPacket(Enum quest, Entity entity) {
28 | this.quest = quest;
29 | this.entity = entity.getUUID();
30 | }
31 |
32 | public QuestDataPacket(FriendlyByteBuf buffer) {
33 | this.quest = buffer.readEnum(Enum.class);
34 | this.entity = buffer.readUUID();
35 | }
36 |
37 | public void encodeBuffer(FriendlyByteBuf buffer) {
38 | buffer.writeEnum(quest);
39 | buffer.writeUUID(entity);
40 | }
41 |
42 |
43 | public static void handler(QuestDataPacket msg, Supplier ctx) {
44 | ctx.get().enqueueWork(() -> {
45 | try {
46 | ServerPlayer player = ctx.get().getSender();
47 | LivingEntity entity = (LivingEntity) MCUtil.getEntityByUUID((ServerLevel) player.level(), msg.entity);
48 |
49 | ServerHandler.questHandler(msg.quest, player, entity);
50 | } catch (IOException e) {
51 | throw new RuntimeException(e);
52 | }
53 | });
54 |
55 | ctx.get().setPacketHandled(true);
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/quest/ServerQuestList.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.quest;
2 |
3 | import dev.zanckor.mod.QuestApiMain;
4 | import dev.zanckor.mod.common.network.handler.ClientHandler;
5 | import net.minecraft.network.FriendlyByteBuf;
6 | import net.minecraftforge.api.distmarker.Dist;
7 | import net.minecraftforge.fml.DistExecutor;
8 | import net.minecraftforge.network.NetworkEvent;
9 |
10 | import java.io.File;
11 | import java.io.IOException;
12 | import java.nio.file.Files;
13 | import java.util.ArrayList;
14 | import java.util.List;
15 | import java.util.function.Supplier;
16 |
17 | public class ServerQuestList {
18 | List questFileList = new ArrayList<>();
19 | int listSize;
20 |
21 |
22 | public ServerQuestList() {
23 | try {
24 | File[] serverQuests = QuestApiMain.serverQuests.toFile().listFiles();
25 |
26 | for (File file : serverQuests) {
27 | questFileList.add(Files.readString(file.toPath()));
28 | }
29 |
30 | } catch (IOException e) {
31 | throw new RuntimeException(e);
32 | }
33 | }
34 |
35 | public ServerQuestList(FriendlyByteBuf buffer) {
36 | listSize = buffer.readInt();
37 |
38 | for (int i = 0; i < listSize; i++) {
39 | questFileList.add(buffer.readUtf());
40 | }
41 | }
42 |
43 | public void encodeBuffer(FriendlyByteBuf buffer) {
44 | buffer.writeInt(questFileList.size());
45 |
46 | for (int i = 0; i < questFileList.size(); i++) {
47 | buffer.writeUtf(questFileList.get(i));
48 | }
49 |
50 | }
51 |
52 |
53 | public static void handler(ServerQuestList msg, Supplier ctx) {
54 | ctx.get().enqueueWork(() -> {
55 | DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.setAvailableServerQuestList(msg.questFileList));
56 | });
57 |
58 | ctx.get().setPacketHandled(true);
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/quest/TimerPacket.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.quest;
2 |
3 | import dev.zanckor.mod.common.network.handler.ServerHandler;
4 | import net.minecraft.network.FriendlyByteBuf;
5 | import net.minecraftforge.network.NetworkEvent;
6 |
7 | import java.util.function.Supplier;
8 |
9 | public class TimerPacket {
10 |
11 | public TimerPacket() {
12 | }
13 |
14 | public TimerPacket(FriendlyByteBuf buffer) {
15 | }
16 |
17 | public void encodeBuffer(FriendlyByteBuf buffer) {
18 | }
19 |
20 |
21 | public static void handler(TimerPacket msg, Supplier ctx) {
22 | ctx.get().enqueueWork(() -> {
23 | ServerHandler.questTimer(ctx.get().getSender().serverLevel());
24 | });
25 |
26 | ctx.get().setPacketHandled(true);
27 | }
28 | }
29 |
30 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/quest/ToastPacket.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.quest;
2 |
3 | import dev.zanckor.mod.common.network.handler.ClientHandler;
4 | import net.minecraft.network.FriendlyByteBuf;
5 | import net.minecraftforge.api.distmarker.Dist;
6 | import net.minecraftforge.fml.DistExecutor;
7 | import net.minecraftforge.network.NetworkEvent;
8 |
9 | import java.util.function.Supplier;
10 |
11 | public class ToastPacket {
12 |
13 | String questName;
14 |
15 | public ToastPacket(String questName) {
16 | this.questName = questName;
17 | }
18 |
19 | public ToastPacket(FriendlyByteBuf buffer) {
20 | this.questName = buffer.readUtf();
21 | }
22 |
23 | public void encodeBuffer(FriendlyByteBuf buffer) {
24 | buffer.writeUtf(questName);
25 | }
26 |
27 |
28 | public static void handler(ToastPacket msg, Supplier ctx) {
29 | ctx.get().enqueueWork(() -> {
30 | DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.toastQuestCompleted(msg.questName));
31 | });
32 |
33 | ctx.get().setPacketHandled(true);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/screen/ModifyTrackedQuests.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.screen;
2 |
3 | import dev.zanckor.api.filemanager.quest.codec.user.UserQuest;
4 | import dev.zanckor.mod.common.network.handler.ClientHandler;
5 | import dev.zanckor.mod.common.util.GsonManager;
6 | import net.minecraft.network.FriendlyByteBuf;
7 | import net.minecraftforge.api.distmarker.Dist;
8 | import net.minecraftforge.fml.DistExecutor;
9 | import net.minecraftforge.network.NetworkEvent;
10 |
11 | import java.io.IOException;
12 | import java.util.function.Supplier;
13 |
14 | public class ModifyTrackedQuests {
15 | private UserQuest userQuest;
16 | private Boolean addQuest;
17 |
18 |
19 | public ModifyTrackedQuests(boolean addQuest, UserQuest userQuest) {
20 | this.userQuest = userQuest;
21 | this.addQuest = addQuest;
22 | }
23 |
24 | public ModifyTrackedQuests(FriendlyByteBuf buffer) {
25 | try {
26 | addQuest = buffer.readBoolean();
27 | userQuest = (UserQuest) GsonManager.getJsonClass(buffer.readUtf(), UserQuest.class);
28 | } catch (IOException e) {
29 | throw new RuntimeException(e);
30 | }
31 | }
32 |
33 | public void encodeBuffer(FriendlyByteBuf buffer) {
34 | buffer.writeBoolean(addQuest);
35 | buffer.writeUtf(GsonManager.gson.toJson(userQuest));
36 | }
37 |
38 |
39 | public static void handler(ModifyTrackedQuests msg, Supplier ctx) {
40 | ctx.get().enqueueWork(() -> {
41 | DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.modifyTrackedQuests(msg.addQuest, msg.userQuest));
42 | });
43 |
44 | ctx.get().setPacketHandled(true);
45 | }
46 | }
47 |
48 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/screen/OpenVanillaEntityScreen.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.screen;
2 |
3 | import dev.zanckor.mod.common.util.MCUtil;
4 | import net.minecraft.network.FriendlyByteBuf;
5 | import net.minecraft.server.level.ServerLevel;
6 | import net.minecraft.world.InteractionHand;
7 | import net.minecraft.world.entity.Entity;
8 | import net.minecraft.world.entity.player.Player;
9 | import net.minecraftforge.network.NetworkEvent;
10 |
11 | import java.util.UUID;
12 | import java.util.function.Supplier;
13 |
14 | public class OpenVanillaEntityScreen {
15 |
16 | UUID entityUUID;
17 |
18 |
19 | public OpenVanillaEntityScreen(UUID entityUUID) {
20 | this.entityUUID = entityUUID;
21 | }
22 |
23 | public OpenVanillaEntityScreen(FriendlyByteBuf buffer) {
24 | entityUUID = buffer.readUUID();
25 | }
26 |
27 | public void encodeBuffer(FriendlyByteBuf buffer) {
28 | buffer.writeUUID(entityUUID);
29 | }
30 |
31 |
32 | public static void handler(OpenVanillaEntityScreen msg, Supplier ctx) {
33 | ctx.get().enqueueWork(() -> {
34 | Player player = ctx.get().getSender();
35 | Entity entity = MCUtil.getEntityByUUID((ServerLevel) ctx.get().getSender().level(), msg.entityUUID);
36 |
37 | player.setShiftKeyDown(true);
38 | player.interactOn(entity, InteractionHand.MAIN_HAND);
39 | });
40 |
41 | ctx.get().setPacketHandled(true);
42 | }
43 | }
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/screen/RemovedQuest.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.screen;
2 |
3 | import dev.zanckor.mod.common.network.handler.ClientHandler;
4 | import net.minecraft.network.FriendlyByteBuf;
5 | import net.minecraftforge.api.distmarker.Dist;
6 | import net.minecraftforge.fml.DistExecutor;
7 | import net.minecraftforge.network.NetworkEvent;
8 |
9 | import java.util.function.Supplier;
10 |
11 | public class RemovedQuest {
12 | private String id;
13 |
14 |
15 | public RemovedQuest(String questID) {
16 | this.id = questID;
17 | }
18 |
19 | public RemovedQuest(FriendlyByteBuf buffer) {
20 | id = buffer.readUtf();
21 | }
22 |
23 | public void encodeBuffer(FriendlyByteBuf buffer) {
24 | buffer.writeUtf(id);
25 | }
26 |
27 |
28 | public static void handler(RemovedQuest msg, Supplier ctx) {
29 | ctx.get().enqueueWork(() -> {
30 | DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.removeQuest(msg.id));
31 | });
32 |
33 | ctx.get().setPacketHandled(true);
34 | }
35 | }
36 |
37 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/screen/RequestActiveQuests.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.screen;
2 |
3 | import dev.zanckor.mod.common.network.SendQuestPacket;
4 | import dev.zanckor.mod.common.network.message.quest.ActiveQuestList;
5 | import net.minecraft.network.FriendlyByteBuf;
6 | import net.minecraft.world.entity.player.Player;
7 | import net.minecraftforge.network.NetworkEvent;
8 |
9 | import java.util.function.Supplier;
10 |
11 | public class RequestActiveQuests {
12 |
13 | public RequestActiveQuests() {
14 | }
15 |
16 | public RequestActiveQuests(FriendlyByteBuf buffer) {
17 |
18 | }
19 |
20 | public void encodeBuffer(FriendlyByteBuf buffer) {
21 |
22 | }
23 |
24 |
25 | public static void handler(RequestActiveQuests msg, Supplier ctx) {
26 | ctx.get().enqueueWork(() -> {
27 | Player player = ctx.get().getSender();
28 | SendQuestPacket.TO_CLIENT(player, new ActiveQuestList(player.getUUID()));
29 | });
30 |
31 | ctx.get().setPacketHandled(true);
32 | }
33 | }
34 |
35 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/network/message/screen/UpdateQuestTracked.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.network.message.screen;
2 |
3 | import dev.zanckor.api.filemanager.quest.codec.user.UserQuest;
4 | import dev.zanckor.mod.common.network.handler.ClientHandler;
5 | import dev.zanckor.mod.common.util.GsonManager;
6 | import net.minecraft.network.FriendlyByteBuf;
7 | import net.minecraftforge.api.distmarker.Dist;
8 | import net.minecraftforge.fml.DistExecutor;
9 | import net.minecraftforge.network.NetworkEvent;
10 |
11 | import java.io.File;
12 | import java.io.IOException;
13 | import java.nio.file.Files;
14 | import java.util.function.Supplier;
15 |
16 | public class UpdateQuestTracked {
17 | private String userQuest;
18 |
19 |
20 | public UpdateQuestTracked(UserQuest userQuest) {
21 | this.userQuest = GsonManager.gson.toJson(userQuest);
22 | }
23 |
24 | public UpdateQuestTracked(FriendlyByteBuf buffer) {
25 | userQuest = buffer.readUtf();
26 | }
27 |
28 | public void encodeBuffer(FriendlyByteBuf buffer) {
29 | buffer.writeUtf(userQuest);
30 | }
31 |
32 |
33 | public static void handler(UpdateQuestTracked msg, Supplier ctx) {
34 | ctx.get().enqueueWork(() -> {
35 | try {
36 | File file = File.createTempFile("userQuest", "json");
37 | Files.writeString(file.toPath(), msg.userQuest);
38 | UserQuest userQuest = (UserQuest) GsonManager.getJsonClass(file, UserQuest.class);
39 |
40 | if(userQuest != null) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.updateQuestTracked(userQuest));
41 | } catch (IOException e) {
42 | throw new RuntimeException(e);
43 | }
44 | });
45 |
46 | ctx.get().setPacketHandled(true);
47 | }
48 | }
49 |
50 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/util/GsonManager.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.util;
2 |
3 | import com.google.gson.Gson;
4 | import com.google.gson.GsonBuilder;
5 | import dev.zanckor.api.filemanager.FileAbstract;
6 | import net.minecraft.resources.ResourceLocation;
7 |
8 | import java.io.File;
9 | import java.io.FileReader;
10 | import java.io.FileWriter;
11 | import java.io.IOException;
12 |
13 | public class GsonManager {
14 | public static Gson gson = new Gson();
15 |
16 | public static FileAbstract getJsonClass(File file, Class fileClass) throws IOException {
17 | if (!file.exists()) return null;
18 |
19 | FileReader reader = new FileReader(file);
20 | FileAbstract dialog = GsonManager.gson.fromJson(reader, fileClass);
21 | reader.close();
22 |
23 | return dialog;
24 | }
25 |
26 | public static FileAbstract getJsonClass(String file, Class fileClass) throws IOException {
27 | return GsonManager.gson.fromJson(file, fileClass);
28 | }
29 |
30 | public static void writeJson(File file, T fileClass) throws IOException {
31 | FileWriter writer = new FileWriter(file);
32 | writer.write(GsonManager.gson.toJson(fileClass));
33 | writer.flush();
34 | writer.close();
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/util/Mathematic.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.util;
2 |
3 | import net.minecraft.util.Mth;
4 | import net.minecraft.util.RandomSource;
5 | import net.minecraft.world.phys.Vec3;
6 | import org.apache.commons.lang3.Range;
7 | import org.joml.Matrix4f;
8 | import org.lwjgl.BufferUtils;
9 |
10 | import java.nio.FloatBuffer;
11 |
12 | public class Mathematic {
13 | public static boolean numberBetween(double number, double min, double max) {
14 | Range range = Range.between(min, max);
15 |
16 | return range.contains(number);
17 | }
18 |
19 | public static boolean vec3NumberBetween(Vec3 vec3, Vec3 vec32, double min, double max) {
20 | Range rangeX = Range.between(vec32.x + min, vec32.x + max);
21 | Range rangeY = Range.between(vec32.y + min, vec32.y + max);
22 | Range rangeZ = Range.between(vec32.z + min, vec32.z + max);
23 |
24 | return rangeX.contains(vec3.x) && rangeY.contains(vec3.y) && rangeZ.contains(vec3.z);
25 | }
26 |
27 | public static int numberRandomizerBetween(int min, int max) {
28 | int randomizer = (int) Mth.randomBetween(RandomSource.createNewThreadLocalInstance(), min, max);
29 | return randomizer;
30 | }
31 |
32 | public static Vec3 simpleMatrixToVec3(Matrix4f matrix4f) {
33 | FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
34 | matrix4f.get(buffer);
35 |
36 | Vec3 vec3 = new Vec3(buffer.get(3), buffer.get(7), buffer.get(11));
37 |
38 | return vec3;
39 | }
40 | }
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/common/util/Timer.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.common.util;
2 |
3 | import com.google.common.collect.HashBasedTable;
4 | import com.google.common.collect.Table;
5 |
6 | import java.util.UUID;
7 | import java.util.concurrent.TimeUnit;
8 |
9 | public class Timer {
10 |
11 | private static final Table ACTIVE_COOLDOWNS_TABLE = HashBasedTable.create();
12 | private static final Table ACTIVE_TICKERS_TABLE = HashBasedTable.create();
13 |
14 | public static boolean canUseWithCooldown(UUID playerUUID, String cooldownKey, float delayInSeconds) {
15 | Long timeInMillis = ACTIVE_COOLDOWNS_TABLE.get(playerUUID, cooldownKey);
16 |
17 | if (timeInMillis != null) {
18 | return calculateCooldownRemainder(timeInMillis) <= 0L;
19 | }
20 |
21 | updateCooldown(playerUUID, cooldownKey, delayInSeconds);
22 | return true;
23 | }
24 |
25 | public static void updateCooldown(UUID playerUUID, String cooldownKey, float delayInSeconds) {
26 | ACTIVE_COOLDOWNS_TABLE.put(playerUUID, cooldownKey, System.currentTimeMillis() + TimeUnit.SECONDS.toMillis((long) delayInSeconds));
27 | }
28 |
29 | public static long remainingTime(UUID playerUUID, String cooldownKey) {
30 | Long timeInMillis = ACTIVE_COOLDOWNS_TABLE.get(playerUUID, cooldownKey);
31 |
32 | if (timeInMillis == null) return -1;
33 |
34 | return calculateCooldownRemainder(timeInMillis);
35 | }
36 |
37 | public static boolean existsTimer(UUID playerUUID, String cooldownKey) {
38 | Long timeInMillis = ACTIVE_COOLDOWNS_TABLE.get(playerUUID, cooldownKey);
39 |
40 | return (timeInMillis != null);
41 | }
42 |
43 | public static long calculateCooldownRemainder(long timeInMillis) {
44 | return timeInMillis - System.currentTimeMillis();
45 | }
46 |
47 | public static boolean canUseWithTicker(UUID playerUUID, String tickerKey, boolean isFirstTickValid, int maxTicks) {
48 | Integer timeInTicks = ACTIVE_TICKERS_TABLE.get(playerUUID, tickerKey);
49 |
50 | if (timeInTicks != null) {
51 | if (calculateTickRemainder(maxTicks, timeInTicks) <= 0) {
52 | updateTicker(playerUUID, tickerKey, 0);
53 | return true;
54 | }
55 |
56 | updateTicker(playerUUID, tickerKey, timeInTicks + 1);
57 | return false;
58 | }
59 |
60 | updateTicker(playerUUID, tickerKey, 0);
61 | return isFirstTickValid;
62 | }
63 |
64 | private static int calculateTickRemainder(int maxTicks, int timeInTicks) {
65 | return maxTicks - timeInTicks;
66 | }
67 |
68 | public static void updateTicker(UUID playerUUID, String tickerKey, int newValue) {
69 | ACTIVE_TICKERS_TABLE.put(playerUUID, tickerKey, newValue);
70 | }
71 |
72 | public static void clearTimers(UUID playerUUID) {
73 | ACTIVE_COOLDOWNS_TABLE.row(playerUUID).clear();
74 | ACTIVE_TICKERS_TABLE.row(playerUUID).clear();
75 | }
76 |
77 | public static void clearTimer(UUID playerUUID, String tickerKey) {
78 | ACTIVE_COOLDOWNS_TABLE.remove(playerUUID, tickerKey);
79 | ACTIVE_TICKERS_TABLE.remove(playerUUID, tickerKey);
80 | }
81 | }
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/server/event/StartDialog.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.server.event;
2 |
3 | import dev.zanckor.api.database.LocateHash;
4 | import dev.zanckor.api.filemanager.dialog.abstractdialog.AbstractDialogRequirement;
5 | import dev.zanckor.api.filemanager.dialog.codec.NPCConversation;
6 | import dev.zanckor.api.filemanager.quest.register.QuestTemplateRegistry;
7 | import dev.zanckor.example.common.enumregistry.EnumRegistry;
8 | import dev.zanckor.mod.common.util.GsonManager;
9 | import net.minecraft.resources.ResourceLocation;
10 | import net.minecraft.world.entity.Entity;
11 | import net.minecraft.world.entity.player.Player;
12 | import net.minecraft.world.item.Item;
13 |
14 | import java.io.File;
15 | import java.io.IOException;
16 | import java.nio.file.Path;
17 |
18 | public class StartDialog {
19 |
20 | /**
21 | * @param player The player
22 | * @param globalDialogID Dialog ID of dialog file player will see. Example: collect_items_dialog.json
23 | * @throws IOException Exception fired when server cannot read json file
24 | */
25 |
26 | public static void loadDialog(Player player, String globalDialogID, Entity entity) throws IOException {
27 | Path path = LocateHash.getDialogLocation(globalDialogID);
28 |
29 | File dialogFile = path.toFile();
30 | LocateHash.currentGlobalDialog.put(player, dialogFile.getName().substring(0, dialogFile.getName().length() - 5));
31 |
32 | NPCConversation dialog = (NPCConversation) GsonManager.getJsonClass(dialogFile, NPCConversation.class);
33 |
34 |
35 | for (int dialog_id = dialog.getDialog().size() - 1; dialog_id >= 0; dialog_id--) {
36 | if (dialog.getDialog().get(dialog_id).getServerRequirements().getType() == null) continue;
37 | Enum requirementEnum = EnumRegistry.getEnum(dialog.getDialog().get(dialog_id).getServerRequirements().getType(), EnumRegistry.getDialogRequirement());
38 |
39 | AbstractDialogRequirement dialogRequirement = QuestTemplateRegistry.getDialogRequirement(requirementEnum);
40 |
41 | if (dialogRequirement != null && dialogRequirement.handler(player, dialog, dialog_id, entity)) return;
42 | }
43 | }
44 | public static void loadDialog(Player player, String globalDialogID, String resourceLocation) throws IOException {
45 | Path path = LocateHash.getDialogLocation(globalDialogID);
46 |
47 | File dialogFile = path.toFile();
48 | LocateHash.currentGlobalDialog.put(player, dialogFile.getName().substring(0, dialogFile.getName().length() - 5));
49 |
50 | NPCConversation dialog = (NPCConversation) GsonManager.getJsonClass(dialogFile, NPCConversation.class);
51 |
52 |
53 | for (int dialog_id = dialog.getDialog().size() - 1; dialog_id >= 0; dialog_id--) {
54 | if (dialog.getDialog().get(dialog_id).getServerRequirements().getType() == null) continue;
55 | Enum requirementEnum = EnumRegistry.getEnum(dialog.getDialog().get(dialog_id).getServerRequirements().getType(), EnumRegistry.getDialogRequirement());
56 |
57 | AbstractDialogRequirement dialogRequirement = QuestTemplateRegistry.getDialogRequirement(requirementEnum);
58 |
59 | if (dialogRequirement != null && dialogRequirement.handler(player, dialog, dialog_id, resourceLocation)) return;
60 | }
61 | }
62 |
63 | public static void loadDialog(Player player, String globalDialogID, Item item) throws IOException {
64 | Path path = LocateHash.getDialogLocation(globalDialogID);
65 |
66 | File dialogFile = path.toFile();
67 | LocateHash.currentGlobalDialog.put(player, dialogFile.getName().substring(0, dialogFile.getName().length() - 5));
68 |
69 | NPCConversation dialog = (NPCConversation) GsonManager.getJsonClass(dialogFile, NPCConversation.class);
70 |
71 |
72 | for (int dialog_id = dialog.getDialog().size() - 1; dialog_id >= 0; dialog_id--) {
73 | if (dialog.getDialog().get(dialog_id).getServerRequirements().getType() == null) continue;
74 | Enum requirementEnum = EnumRegistry.getEnum(dialog.getDialog().get(dialog_id).getServerRequirements().getType(), EnumRegistry.getDialogRequirement());
75 |
76 | AbstractDialogRequirement dialogRequirement = QuestTemplateRegistry.getDialogRequirement(requirementEnum);
77 |
78 | if (dialogRequirement != null && dialogRequirement.handler(player, dialog, dialog_id, item)) return;
79 | }
80 | }
81 | }
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/server/menu/questmaker/QuestMakerMenu.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.server.menu.questmaker;
2 |
3 | import dev.zanckor.mod.common.menu.MenuHandler;
4 | import net.minecraft.world.entity.player.Player;
5 | import net.minecraft.world.inventory.AbstractContainerMenu;
6 | import net.minecraft.world.item.ItemStack;
7 |
8 | public class QuestMakerMenu extends AbstractContainerMenu {
9 | public QuestMakerMenu(int id) {
10 | super(MenuHandler.QUEST_DEFAULT_MENU.get(), id);
11 | }
12 |
13 |
14 |
15 | @Override
16 | public ItemStack quickMoveStack(Player player, int stack) {
17 | return null;
18 | }
19 |
20 | @Override
21 | public boolean stillValid(Player player) {
22 | return true;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/dev/zanckor/mod/server/startdialog/StartDialog.java:
--------------------------------------------------------------------------------
1 | package dev.zanckor.mod.server.startdialog;
2 |
3 | import dev.zanckor.api.database.LocateHash;
4 | import dev.zanckor.api.filemanager.dialog.abstractdialog.AbstractDialogRequirement;
5 | import dev.zanckor.api.filemanager.dialog.codec.NPCConversation;
6 | import dev.zanckor.api.filemanager.quest.register.QuestTemplateRegistry;
7 | import dev.zanckor.example.common.enumregistry.EnumRegistry;
8 | import dev.zanckor.mod.common.util.GsonManager;
9 | import net.minecraft.resources.ResourceLocation;
10 | import net.minecraft.world.entity.Entity;
11 | import net.minecraft.world.entity.player.Player;
12 | import net.minecraft.world.item.Item;
13 |
14 | import java.io.File;
15 | import java.io.IOException;
16 | import java.nio.file.Path;
17 |
18 | public class StartDialog {
19 |
20 | /**
21 | * @param player The player
22 | * @param globalDialogID Dialog ID of dialog file player will see. Example: collect_items_dialog.json
23 | * @throws IOException Exception fired when server cannot read json file
24 | */
25 |
26 | public static void loadDialog(Player player, String globalDialogID, Entity entity) throws IOException {
27 | Path path = LocateHash.getDialogLocation(globalDialogID);
28 |
29 | File dialogFile = path.toFile();
30 | LocateHash.currentGlobalDialog.put(player, dialogFile.getName().substring(0, dialogFile.getName().length() - 5));
31 |
32 | NPCConversation dialog = (NPCConversation) GsonManager.getJsonClass(dialogFile, NPCConversation.class);
33 |
34 |
35 | for (int dialog_id = dialog.getDialog().size() - 1; dialog_id >= 0; dialog_id--) {
36 | if (dialog.getDialog().get(dialog_id).getServerRequirements().getType() == null) continue;
37 | Enum requirementEnum = EnumRegistry.getEnum(dialog.getDialog().get(dialog_id).getServerRequirements().getType(), EnumRegistry.getDialogRequirement());
38 |
39 | AbstractDialogRequirement dialogRequirement = QuestTemplateRegistry.getDialogRequirement(requirementEnum);
40 |
41 | if (dialogRequirement != null && dialogRequirement.handler(player, dialog, dialog_id, entity)) return;
42 | }
43 | }
44 | public static void loadDialog(Player player, String globalDialogID, String resourceLocation) throws IOException {
45 | Path path = LocateHash.getDialogLocation(globalDialogID);
46 |
47 | File dialogFile = path.toFile();
48 | LocateHash.currentGlobalDialog.put(player, dialogFile.getName().substring(0, dialogFile.getName().length() - 5));
49 |
50 | NPCConversation dialog = (NPCConversation) GsonManager.getJsonClass(dialogFile, NPCConversation.class);
51 |
52 |
53 | for (int dialog_id = dialog.getDialog().size() - 1; dialog_id >= 0; dialog_id--) {
54 | if (dialog.getDialog().get(dialog_id).getServerRequirements().getType() == null) continue;
55 | Enum requirementEnum = EnumRegistry.getEnum(dialog.getDialog().get(dialog_id).getServerRequirements().getType(), EnumRegistry.getDialogRequirement());
56 |
57 | AbstractDialogRequirement dialogRequirement = QuestTemplateRegistry.getDialogRequirement(requirementEnum);
58 |
59 | if (dialogRequirement != null && dialogRequirement.handler(player, dialog, dialog_id, resourceLocation)) return;
60 | }
61 | }
62 |
63 | public static void loadDialog(Player player, String globalDialogID, Item item) throws IOException {
64 | Path path = LocateHash.getDialogLocation(globalDialogID);
65 |
66 | File dialogFile = path.toFile();
67 | LocateHash.currentGlobalDialog.put(player, dialogFile.getName().substring(0, dialogFile.getName().length() - 5));
68 |
69 | NPCConversation dialog = (NPCConversation) GsonManager.getJsonClass(dialogFile, NPCConversation.class);
70 |
71 |
72 | for (int dialog_id = dialog.getDialog().size() - 1; dialog_id >= 0; dialog_id--) {
73 | if (dialog.getDialog().get(dialog_id).getServerRequirements().getType() == null) continue;
74 | Enum requirementEnum = EnumRegistry.getEnum(dialog.getDialog().get(dialog_id).getServerRequirements().getType(), EnumRegistry.getDialogRequirement());
75 |
76 | AbstractDialogRequirement dialogRequirement = QuestTemplateRegistry.getDialogRequirement(requirementEnum);
77 |
78 | if (dialogRequirement != null && dialogRequirement.handler(player, dialog, dialog_id, item)) return;
79 | }
80 | }
81 | }
--------------------------------------------------------------------------------
/src/main/resources/META-INF/mods.toml:
--------------------------------------------------------------------------------
1 | modLoader="javafml"
2 | loaderVersion="[45,)"
3 | license="MIT License"
4 | [[mods]]
5 | modId="questapi"
6 | version="1.3.8"
7 | displayName="Quest API"
8 | logoFile="questapi.png"
9 | authors="Zanckor"
10 | description='''
11 | QuestApi is a forge library that allows modders and modpack makers to add easily quests & dialogs by npc, command...
12 | just adding a few .json with easy portability between words, servers and versions.
13 | '''
--------------------------------------------------------------------------------
/src/main/resources/assets/questapi/lang/en_us.json:
--------------------------------------------------------------------------------
1 | {
2 | "key.categories.QuestApi": "Quest API",
3 | "key.questapi.quest_menu": "Open Quest Menu",
4 | "entity.questapi.quest_npc": "Quest NPC Test",
5 |
6 | "tracker.questapi.quest_type": "Quest Type: ",
7 | "tracker.questapi.quest": "Quest: ",
8 | "tracker.questapi.time_limit": "Time limit: ",
9 |
10 | "quest_type.questapi.interact_entity": "Interact with entity",
11 | "quest_type.questapi.kill": "Kill",
12 | "quest_type.questapi.move_to": "Move to coords",
13 | "quest_type.questapi.collect": "Collect",
14 | "quest_type.questapi.collect_with_nbt": "Collect item with NBT",
15 | "quest_type.questapi.xp": "Obtain XP",
16 | "quest_type.questapi.locate_structure": "Locate structure",
17 |
18 | "quest_name.questapi.collect_items": "Collect Items",
19 | "quest_name.questapi.collect_items_tag": "Collect items with tag",
20 | "quest_name.questapi.interact_with_cow_and_pig": "Interact with cows and pigs",
21 | "quest_name.questapi.kill_entities": "Kill entities",
22 | "quest_name.questapi.locate_structure": "Locate structure",
23 | "quest_name.questapi.locate_coords": "Move to coordinates",
24 | "quest_name.questapi.multiple_quests": "Multiple quests",
25 |
26 | "dialog_text.questapi.collect_items_dialog.salute": "Hello adventurer, I need help with a task, would you help me?",
27 | "dialog_text.questapi.collect_items_dialog.quest_accepted": "Thanks, I need 2 gold and 1 iron ingots.",
28 | "dialog_text.questapi.collect_items_dialog.quest_declined": "I see, it doesn\u0027t matter, if you change your mind I\u0027ll stay here.",
29 | "dialog_text.questapi.collect_items_dialog.repeat_salute": "Ey, I see you\u0027re back, have you changed your mind?",
30 | "dialog_text.questapi.collect_items_dialog.work_in_progress": "Hello traveler, how are you doing on the quest?",
31 | "dialog_text.questapi.collect_items_dialog.greetings": "Thank you very much for helping me traveler.",
32 |
33 | "dialog_text.questapi.collect_items_dialog.salute.accept": "Sure, tell me what you need.",
34 | "dialog_text.questapi.collect_items_dialog.salute.deny": "No, sorry, I don\u0027t have time.",
35 | "dialog_text.questapi.collect_items_dialog.quest_accepted.add_quest": "I\u0027ll start right now.",
36 | "dialog_text.questapi.collect_items_dialog.quest_declined.close_dialog": "Okay...",
37 | "dialog_text.questapi.collect_items_dialog.repeat_salute.accept": "Sure, tell me what you need.",
38 | "dialog_text.questapi.collect_items_dialog.repeat_salute.deny": "No, sorry, I don\u0027t have time.",
39 | "dialog_text.questapi.collect_items_dialog.work_in_progress.close_dialog": "Okay, almost there.",
40 | "dialog_text.questapi.collect_items_dialog.greetings.response": "No problem."
41 | }
--------------------------------------------------------------------------------
/src/main/resources/assets/questapi/lang/es_ES.json:
--------------------------------------------------------------------------------
1 | {
2 | "key.categories.QuestApi": "Quest API",
3 | "key.questapi.quest_menu": "Abrir menu de misiones",
4 | "entity.questapi.quest_npc": "Quest NPC Test",
5 |
6 | "tracker.questapi.quest_type": "Tipo de mision: ",
7 | "tracker.questapi.quest": "Mision: ",
8 | "tracker.questapi.time_limit": "Tiempo limite: ",
9 |
10 |
11 | "quest_type.questapi.interact_entity": "Interactuar con entidad",
12 | "quest_type.questapi.kill": "Matar",
13 | "quest_type.questapi.move_to": "Moverte a las coordenadas",
14 | "quest_type.questapi.collect": "Recollectar items",
15 | "quest_type.questapi.collect_with_nbt": "Recolectar item con NBT",
16 | "quest_type.questapi.xp": "Obtener XP",
17 | "quest_type.questapi.locate_structure": "Encontrar estructura",
18 |
19 | "quest_name.questapi.collect_items": "Recolectar items",
20 | "quest_name.questapi.collect_items_tag": "Recolectar items con tag",
21 | "quest_name.questapi.interact_with_cow_and_pig": "Interactuar con vacas y cerdos",
22 | "quest_name.questapi.kill_entities": "Matar entidades",
23 | "quest_name.questapi.locate_structure": "Encontrar estructura",
24 | "quest_name.questapi.locate_coords": "Moverte a coordenadas",
25 | "quest_name.questapi.multiple_quests": "Multiples misiones",
26 |
27 | "dialog_text.questapi.collect_items_dialog.salute": "Hola aventurero, necesito ayuda con una tarea, ¿me ayudarías?",
28 | "dialog_text.questapi.collect_items_dialog.quest_accepted": "Gracias, necesito 2 lingotes de oro y 1 de hierro.",
29 | "dialog_text.questapi.collect_items_dialog.quest_declined": "Ya veo, no importa, si cambias de opinión me quedo aquí.",
30 | "dialog_text.questapi.collect_items_dialog.repeat_salute": "Ey, veo que has vuelto, ¿has cambiado de opinión?",
31 | "dialog_text.questapi.collect_items_dialog.work_in_progress": "Hola viajero, ¿cómo te va en la búsqueda?",
32 | "dialog_text.questapi.collect_items_dialog.greetings": "Muchas gracias por ayudarme viajero.",
33 |
34 | "dialog_text.questapi.collect_items_dialog.salute.accept": "Claro, dime lo que necesitas.",
35 | "dialog_text.questapi.collect_items_dialog.salute.deny": "No, lo siento, no tengo tiempo.",
36 | "dialog_text.questapi.collect_items_dialog.quest_accepted.add_quest": "Empezaré ahora mismo.",
37 | "dialog_text.questapi.collect_items_dialog.quest_declined.close_dialog": "Vale...",
38 | "dialog_text.questapi.collect_items_dialog.repeat_salute.accept": "Claro, dime que necesitas.",
39 | "dialog_text.questapi.collect_items_dialog.repeat_salute.deny": "No, lo siento, no tengo tiempo.",
40 | "dialog_text.questapi.collect_items_dialog.work_in_progress.close_dialog": "Si, me queda poco.",
41 | "dialog_text.questapi.collect_items_dialog.greetings.response": "De nada."
42 | }
--------------------------------------------------------------------------------
/src/main/resources/assets/questapi/textures/gui/dialog_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zanckor/QuestAPI/531a3a540ea6eb606027ead3090fd6b1b8bf8c17/src/main/resources/assets/questapi/textures/gui/dialog_background.png
--------------------------------------------------------------------------------
/src/main/resources/assets/questapi/textures/gui/minimalist_dialog_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zanckor/QuestAPI/531a3a540ea6eb606027ead3090fd6b1b8bf8c17/src/main/resources/assets/questapi/textures/gui/minimalist_dialog_background.png
--------------------------------------------------------------------------------
/src/main/resources/assets/questapi/textures/gui/quest_maker_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zanckor/QuestAPI/531a3a540ea6eb606027ead3090fd6b1b8bf8c17/src/main/resources/assets/questapi/textures/gui/quest_maker_bg.png
--------------------------------------------------------------------------------
/src/main/resources/assets/questapi/textures/gui/questlog_api.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zanckor/QuestAPI/531a3a540ea6eb606027ead3090fd6b1b8bf8c17/src/main/resources/assets/questapi/textures/gui/questlog_api.png
--------------------------------------------------------------------------------
/src/main/resources/data/questapi/dialog/collect_items_dialog.json:
--------------------------------------------------------------------------------
1 | {
2 | "dialog": [
3 | {
4 | "id": 0,
5 | "dialogText": "dialog_text.questapi.collect_items_dialog.salute",
6 | "requirements": {
7 | "type": "QUEST",
8 | "quest_id": "questapi.collect_items",
9 | "requirement_status": "NOT_OBTAINED"
10 | },
11 | "options": [
12 | {
13 | "text": "dialog_text.questapi.collect_items_dialog.salute.accept",
14 | "type": "OPEN_DIALOG",
15 | "global_id": "questapi.collect_items_dialog",
16 | "dialog": 1
17 | },
18 | {
19 | "text": "dialog_text.questapi.collect_items_dialog.salute.deny",
20 | "type": "OPEN_DIALOG",
21 | "global_id": "questapi.collect_items_dialog",
22 | "dialog": 2
23 | }
24 | ]
25 | },
26 | {
27 | "id": 1,
28 | "dialogText": "dialog_text.questapi.collect_items_dialog.quest_accepted",
29 | "requirements": {
30 | },
31 | "options": [
32 | {
33 | "text": "dialog_text.questapi.collect_items_dialog.quest_accepted.add_quest",
34 | "type": "ADD_QUEST",
35 | "quest_id": "questapi.collect_items"
36 | }
37 | ]
38 | },
39 | {
40 | "id": 2,
41 | "dialogText": "dialog_text.questapi.collect_items_dialog.quest_declined",
42 | "requirements": {
43 | },
44 | "options": [
45 | {
46 | "text": "dialog_text.questapi.collect_items_dialog.quest_declined.close_dialog",
47 | "type": "CLOSE_DIALOG"
48 | }
49 | ]
50 | },
51 | {
52 | "id": 3,
53 | "dialogText": "dialog_text.questapi.collect_items_dialog.repeat_salute",
54 | "requirements": {
55 | "type": "DIALOG",
56 | "dialog_id": 2,
57 | "requirement_status": "READ"
58 | },
59 | "options": [
60 | {
61 | "text": "dialog_text.questapi.collect_items_dialog.repeat_salute.accept",
62 | "type": "OPEN_DIALOG",
63 | "global_id": "questapi.collect_items_dialog",
64 | "dialog": 1
65 | },
66 | {
67 | "text": "dialog_text.questapi.collect_items_dialog.repeat_salute.deny",
68 | "type": "OPEN_DIALOG",
69 | "global_id": "questapi.collect_items_dialog",
70 | "dialog": 2
71 | }
72 | ]
73 | },
74 | {
75 | "id": 4,
76 | "dialogText": "dialog_text.questapi.collect_items_dialog.work_in_progress",
77 | "requirements": {
78 | "type": "QUEST",
79 | "quest_id": "questapi.collect_items",
80 | "requirement_status": "IN_PROGRESS"
81 | },
82 | "options": [
83 | {
84 | "text": "dialog_text.questapi.collect_items_dialog.work_in_progress.close_dialog",
85 | "type": "CLOSE_DIALOG"
86 | }
87 | ]
88 | },
89 | {
90 | "id": 5,
91 | "dialogText": "dialog_text.questapi.collect_items_dialog.greetings",
92 | "requirements": {
93 | "type": "QUEST",
94 | "quest_id": "questapi.collect_items",
95 | "requirement_status": "COMPLETED"
96 | },
97 | "options": [
98 | {
99 | "text": "dialog_text.questapi.collect_items_dialog.greetings.response",
100 | "type": "CLOSE_DIALOG"
101 | }
102 | ]
103 | }
104 | ]
105 | }
--------------------------------------------------------------------------------
/src/main/resources/data/questapi/dialog/secondary_collect_items_dialog.json:
--------------------------------------------------------------------------------
1 | {
2 | "dialog": [
3 | {
4 | "id": 0,
5 | "dialogText": "dialog_text.questapi.collect_items_dialog.salute",
6 | "requirements": {
7 | "type": "QUEST",
8 | "quest_id": "questapi.collect_items",
9 | "requirement_status": "NOT_OBTAINED"
10 | },
11 | "options": [
12 | {
13 | "text": "dialog_text.questapi.collect_items_dialog.salute.accept",
14 | "type": "OPEN_DIALOG",
15 | "global_id": "questapi.collect_items_dialog",
16 | "dialog": 1
17 | },
18 | {
19 | "text": "dialog_text.questapi.collect_items_dialog.salute.deny",
20 | "type": "OPEN_DIALOG",
21 | "global_id": "questapi.collect_items_dialog",
22 | "dialog": 2
23 | }
24 | ]
25 | },
26 | {
27 | "id": 1,
28 | "dialogText": "dialog_text.questapi.collect_items_dialog.quest_accepted",
29 | "requirements": {
30 | },
31 | "options": [
32 | {
33 | "text": "dialog_text.questapi.collect_items_dialog.quest_accepted.add_quest",
34 | "type": "ADD_QUEST",
35 | "quest_id": "questapi.collect_items"
36 | }
37 | ]
38 | },
39 | {
40 | "id": 2,
41 | "dialogText": "dialog_text.questapi.collect_items_dialog.quest_declined",
42 | "requirements": {
43 | },
44 | "options": [
45 | {
46 | "text": "dialog_text.questapi.collect_items_dialog.quest_declined.close_dialog",
47 | "type": "CLOSE_DIALOG"
48 | }
49 | ]
50 | },
51 | {
52 | "id": 3,
53 | "dialogText": "dialog_text.questapi.collect_items_dialog.repeat_salute",
54 | "requirements": {
55 | "type": "DIALOG",
56 | "dialog_id": 2,
57 | "requirement_status": "READ"
58 | },
59 | "options": [
60 | {
61 | "text": "dialog_text.questapi.collect_items_dialog.repeat_salute.accept",
62 | "type": "OPEN_DIALOG",
63 | "global_id": "questapi.collect_items_dialog",
64 | "dialog": 1
65 | },
66 | {
67 | "text": "dialog_text.questapi.collect_items_dialog.repeat_salute.deny",
68 | "type": "OPEN_DIALOG",
69 | "global_id": "questapi.collect_items_dialog",
70 | "dialog": 2
71 | }
72 | ]
73 | },
74 | {
75 | "id": 4,
76 | "dialogText": "dialog_text.questapi.collect_items_dialog.work_in_progress",
77 | "requirements": {
78 | "type": "QUEST",
79 | "quest_id": "questapi.collect_items",
80 | "requirement_status": "IN_PROGRESS"
81 | },
82 | "options": [
83 | {
84 | "text": "dialog_text.questapi.collect_items_dialog.work_in_progress.close_dialog",
85 | "type": "CLOSE_DIALOG"
86 | }
87 | ]
88 | },
89 | {
90 | "id": 5,
91 | "dialogText": "dialog_text.questapi.collect_items_dialog.greetings",
92 | "requirements": {
93 | "type": "QUEST",
94 | "quest_id": "questapi.collect_items",
95 | "requirement_status": "COMPLETED"
96 | },
97 | "options": [
98 | {
99 | "text": "dialog_text.questapi.collect_items_dialog.greetings.response",
100 | "type": "CLOSE_DIALOG"
101 | }
102 | ]
103 | }
104 | ],
105 | "identifier": "minimalist_questapi"
106 | }
--------------------------------------------------------------------------------
/src/main/resources/data/questapi/quest/collect_items.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "collect_items",
3 | "title": "quest_name.questapi.collect_items",
4 | "hasTimeLimit": false,
5 | "timeLimitInSeconds": 0,
6 | "goals": [
7 | {
8 | "type": "COLLECT",
9 | "target": "minecraft:iron_ingot",
10 | "amount": 1
11 | },
12 | {
13 | "type": "COLLECT",
14 | "target": "minecraft:gold_ingot",
15 | "amount": 1
16 | },
17 | {
18 | "type": "KILL",
19 | "target": "minecraft:pig",
20 | "amount": 1
21 | },
22 | {
23 | "type": "XP",
24 | "target": "",
25 | "amount": 3
26 | }
27 | ],
28 | "rewards": [
29 | {
30 | "type": "XP",
31 | "tag": "LEVEL",
32 | "amount": 10
33 | }
34 | ],
35 | "requirements": [
36 | {
37 | "type": "XP",
38 | "requirements_min": 0,
39 | "requirements_max": 10
40 | }
41 | ]
42 | }
--------------------------------------------------------------------------------
/src/main/resources/data/questapi/quest/collect_items_tag.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "collect_items_tag",
3 | "title": "quest_name.questapi.collect_items_tag",
4 | "hasTimeLimit": false,
5 | "timeLimitInSeconds": 0,
6 | "goals": [
7 | {
8 | "type": "COLLECT_WITH_NBT",
9 | "target": "minecraft:iron_ingot",
10 | "amount": 1,
11 | "additionalClassData": {
12 | "display": "Iron"
13 | }
14 | }
15 | ],
16 | "rewards": [
17 | {
18 | "type": "XP",
19 | "tag": "LEVEL",
20 | "amount": 10
21 | }
22 | ],
23 | "requirements": [
24 | {
25 | "type": "XP",
26 | "requirements_min": 0,
27 | "requirements_max": 10
28 | }
29 | ]
30 | }
--------------------------------------------------------------------------------
/src/main/resources/data/questapi/quest/interact_entity.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "interact_entity",
3 | "title": "quest_name.questapi.interact_with_cow_and_pig",
4 | "hasTimeLimit": false,
5 | "timeLimitInSeconds": 0,
6 | "goals": [
7 | {
8 | "type": "INTERACT_ENTITY",
9 | "target": "minecraft:pig",
10 | "amount": 1
11 | }
12 | ],
13 | "rewards": [
14 | {
15 | "type": "QUEST",
16 | "tag": "questapi.kill_entities",
17 | "amount": 1
18 | }
19 | ],
20 | "requirements": [
21 | {
22 | "type": "XP",
23 | "requirements_min": 0,
24 | "requirements_max": 10
25 | }
26 | ]
27 | }
--------------------------------------------------------------------------------
/src/main/resources/data/questapi/quest/kill_entities.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "kill_entities",
3 | "title": "quest_name.questapi.kill_entities",
4 |
5 | "hasTimeLimit": true,
6 | "timeLimitInSeconds": 10,
7 | "goals": [
8 | {
9 | "type": "KILL",
10 | "target": "minecraft:pig",
11 | "amount": 1
12 | },
13 | {
14 | "type": "KILL",
15 | "target": "minecraft:cow",
16 | "amount": 1
17 | }
18 | ],
19 | "rewards": [
20 | {
21 | "type": "LOOT_TABLE",
22 | "tag": "minecraft:chests/bastion_treasure",
23 | "amount": 1
24 | }
25 | ],
26 | "requirements": [
27 | {
28 | "type": "XP",
29 | "requirements_min": 0,
30 | "requirements_max": 10
31 | }
32 | ]
33 | }
34 |
--------------------------------------------------------------------------------
/src/main/resources/data/questapi/quest/move_to_coords.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "move_to_coords",
3 | "title": "quest_name.questapi.locate_coords",
4 | "goals": [
5 | {
6 | "type": "MOVE_TO",
7 | "target": "0 / 0 / 0",
8 | "amount": 1,
9 | "additionalListData": [0, 0, 0]
10 | }
11 | ],
12 | "hasTimeLimit": false,
13 | "timeLimitInSeconds": 0,
14 | "requirements": [
15 | {
16 | "type": "XP",
17 | "requirements_min": 40,
18 | "requirements_max": 50
19 | }
20 | ],
21 | "rewards": [
22 | {
23 | "type": "ITEM",
24 | "tag": "minecraft:coal",
25 | "amount": 64
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/resources/data/questapi/quest/multiple_quests.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "multiple_quests",
3 | "title": "quest_name.questapi.multiple_quests",
4 | "goals": [
5 | {
6 | "type": "MOVE_TO",
7 | "target": "0 / 0 / 0",
8 | "amount": 1,
9 | "additionalListData": [0, 0, 0]
10 | },
11 | {
12 | "type": "COLLECT",
13 | "target": "minecraft:gold_ingot",
14 | "amount": 1
15 | },
16 | {
17 | "type": "XP",
18 | "target": "",
19 | "amount": 1
20 | }
21 | ],
22 | "hasTimeLimit": false,
23 | "timeLimitInSeconds": 0,
24 | "requirements": [
25 | {
26 | "type": "XP",
27 | "requirements_min": 0,
28 | "requirements_max": 50
29 | }
30 | ],
31 | "rewards": [
32 | {
33 | "type": "ITEM",
34 | "tag": "minecraft:coal",
35 | "amount": 64
36 | }
37 | ]
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/resources/pack.mcmeta:
--------------------------------------------------------------------------------
1 | {
2 | "pack": {
3 | "description": "examplemod resources",
4 | "pack_format": 9,
5 | "forge:resource_pack_format": 9,
6 | "forge:data_pack_format": 10
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/resources/questapi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zanckor/QuestAPI/531a3a540ea6eb606027ead3090fd6b1b8bf8c17/src/main/resources/questapi.png
--------------------------------------------------------------------------------