Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
213b9ce
updates codex dependency
MaksyKun Apr 28, 2025
1e11409
fixed queue service for new icon settings and result section
MaksyKun Apr 28, 2025
db4b27a
removed extensive vanilla lore for ingredients due to many bugs
MaksyKun Apr 28, 2025
cd327e6
added singletone pattern for static instances of the api (they were n…
MaksyKun Jun 1, 2025
1048629
improved performance in guis through inv and recipe hashing
MaksyKun Jun 26, 2025
dbf0c48
improved reloading to reset caches
MaksyKun Jul 12, 2025
5f6001a
Merge remote-tracking branch 'origin/dev' into dev
MaksyKun Jul 12, 2025
f4f9d51
Merge branch 'dev' into recipe-hashing
MaksyKun Jul 12, 2025
690d5e9
Update src/main/java/studio/magemonkey/fusion/gui/recipe/InventoryFin…
MaksyKun Jul 20, 2025
d249ab5
Update src/main/java/studio/magemonkey/fusion/gui/RecipeGui.java
MaksyKun Jul 20, 2025
76032ff
Update src/main/java/studio/magemonkey/fusion/api/FusionAPI.java
MaksyKun Jul 20, 2025
e208b0d
change requests from copilot
MaksyKun Jul 20, 2025
e9ecc9c
Merge remote-tracking branch 'origin/recipe-hashing' into recipe-hashing
MaksyKun Jul 20, 2025
3cffc67
fixed merge conflicts
MaksyKun Jul 20, 2025
3b67146
updated dependencies
MaksyKun Jul 20, 2025
e116405
updated dependencies
MaksyKun Jul 20, 2025
091f126
Merge branch 'dev' into recipe-hashing
MaksyKun Jul 24, 2025
36f293b
removed md
MaksyKun Jul 24, 2025
3e4f920
fixed crafting time to be skipped completly when `Cfg.updateQueueOffl…
MaksyKun Jul 27, 2025
8179a2c
fix approach of offline updates from queue items
MaksyKun Jul 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 0 additions & 96 deletions FORCE_COMMANDS.md

This file was deleted.

1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
<groupId>studio.magemonkey</groupId>
<artifactId>sapphire</artifactId>
<version>1.0.1-R0.2-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>studio.magemonkey</groupId>
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/studio/magemonkey/fusion/Fusion.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import studio.magemonkey.fusion.data.player.PlayerLoader;
import studio.magemonkey.fusion.data.recipes.*;
import studio.magemonkey.fusion.gui.BrowseGUI;
import studio.magemonkey.fusion.gui.recipe.RecipeGuiEventRouter;
import studio.magemonkey.fusion.util.ExperienceManager;
import studio.magemonkey.fusion.util.LevelFunction;

Expand Down Expand Up @@ -127,6 +128,7 @@ public void onEnable() {
this.getCommand("craft").setExecutor(new Commands());
this.getCommand("fusion-editor").setExecutor(new FusionEditorCommand());
getServer().getPluginManager().registerEvents(this, this);
Bukkit.getPluginManager().registerEvents(new RecipeGuiEventRouter(), this);
runQueueTask();

if (hookManager.isHooked(HookType.PlaceholderAPI)) {
Expand Down
17 changes: 14 additions & 3 deletions src/main/java/studio/magemonkey/fusion/api/FusionAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,8 @@ public class FusionAPI {

@Getter
private static final JavaPlugin instance = Fusion.getInstance();
@Getter
private static ProfessionManager professionManager;
@Getter
private static PlayerManager playerManager;
@Getter
private static EventServices eventServices;

public static void init() {
Expand All @@ -24,4 +21,18 @@ public static void init() {
FusionAPI.getInstance().getLogger().info("FusionAPI has been initialized.");
}

public static ProfessionManager getProfessionManager() {
if (professionManager == null) {
professionManager = new ProfessionManager();
}
return professionManager;
}

public static PlayerManager getPlayerManager() {
return playerManager != null ? playerManager : new PlayerManager();
}

public static EventServices getEventServices() {
return eventServices != null ? eventServices : new EventServices();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import org.bukkit.inventory.ItemStack;
import studio.magemonkey.codex.CodexEngine;
import studio.magemonkey.codex.api.DelayedCommand;
import studio.magemonkey.codex.api.items.exception.MissingItemException;
import studio.magemonkey.codex.api.items.exception.MissingProviderException;
import studio.magemonkey.codex.util.messages.MessageData;
import studio.magemonkey.fusion.Fusion;
import studio.magemonkey.fusion.api.FusionAPI;
Expand All @@ -20,7 +18,10 @@
import studio.magemonkey.fusion.data.recipes.RecipeItem;
import studio.magemonkey.fusion.util.PlayerUtil;

import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class QueueService {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
package studio.magemonkey.fusion.cfg;

import net.kyori.adventure.text.Component;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import studio.magemonkey.codex.compat.VersionManager;
import studio.magemonkey.codex.util.messages.MessageUtil;
import studio.magemonkey.fusion.Fusion;
import studio.magemonkey.fusion.data.recipes.RecipeItem;
import studio.magemonkey.fusion.util.ChatUT;

import java.util.*;

public class CraftingRequirementsCfg {

private static YamlParser config;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import studio.magemonkey.fusion.data.recipes.RecipeItem;
import studio.magemonkey.fusion.gui.BrowseGUI;
import studio.magemonkey.fusion.gui.ProfessionGuiRegistry;
import studio.magemonkey.fusion.gui.RecipeGui;
import studio.magemonkey.fusion.gui.show.ShowRecipesGui;
import studio.magemonkey.fusion.util.Utils;

Expand Down Expand Up @@ -74,9 +75,9 @@ public static void useProfession(CommandSender sender, String[] args) {
openGui(target, eq, category);
CodexEngine.get().getMessageUtil().sendMessage("fusion.useConfirmOther",
sender,
new MessageData("craftingInventory", eq),
new MessageData("sender", sender),
new MessageData("target", target));
new MessageData("craftingInventory", eq.getProfession()),
new MessageData("sender", sender.getName()),
new MessageData("target", target.getName()));
} else {
if (sender instanceof Player player) {
if (!Utils.hasCraftingUsePermission(sender, eq.getProfession())) {
Expand Down Expand Up @@ -315,6 +316,8 @@ public static void reloadPlugin(CommandSender sender) {
Fusion.getInstance().closeAll();
Fusion.getInstance().reloadConfig();
Fusion.getInstance().reloadLang();
ProfessionGuiRegistry.clearLatestRecipeGui();
RecipeGui.resetRecipeHashes();
CodexEngine.get()
.getMessageUtil()
.sendMessage("fusion.reload", sender, new MessageData("sender", sender));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import studio.magemonkey.fusion.data.queue.QueueItem;
import studio.magemonkey.fusion.data.recipes.CraftingTable;
import studio.magemonkey.fusion.data.recipes.Recipe;
import studio.magemonkey.fusion.gui.RecipeGui;

import java.util.Collection;
import java.util.Map;
Expand All @@ -29,8 +28,6 @@ public class FusionPlayer {
private Map<String, CraftingQueue> cachedQueues = new TreeMap<>();
private Map<String, PlayerRecipeLimit> cachedRecipeLimits = new TreeMap<>();

private final Map<String, RecipeGui> cachedGuis = new TreeMap<>();

@Getter
@Setter
private boolean autoCrafting;
Expand All @@ -50,18 +47,11 @@ public Player getPlayer() {
}

public CraftingQueue getQueue(String profession, Category category) {
if (!cachedQueues.containsKey(profession)) {
cachedQueues.put(profession, new CraftingQueue(getPlayer(), profession, category));
}
return cachedQueues.get(profession);
}

public void cacheGui(String id, RecipeGui gui) {
if (cachedGuis.containsKey(id)) {
cachedGuis.get(id).open(getPlayer());
return;
if (!cachedQueues.containsKey(profession + "." + category.getName())) {
cachedQueues.put(profession + "." + category.getName(), new CraftingQueue(getPlayer(), profession, category));
Bukkit.getConsoleSender().sendMessage("Created new crafting queue for profession " + profession + " and category " + category.getName() + " for player " + getPlayer().getName());
}
cachedGuis.put(id, gui);
return cachedQueues.get(profession + "." + category.getName());
}

public PlayerRecipeLimit getRecipeLimit(Recipe recipe) {
Expand Down Expand Up @@ -359,9 +349,9 @@ public void save() {
}
for (CraftingQueue queue : cachedQueues.values()) {
SQLManager.queues().saveCraftingQueue(queue);
Bukkit.getConsoleSender().sendMessage("Saved queue for profession " + queue.getProfession() + " and category " + queue.getCategory().getName());
}
SQLManager.recipeLimits().saveRecipeLimits(uuid, cachedRecipeLimits);
cachedGuis.clear();
cachedQueues.clear();
cachedRecipeLimits.clear();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
import studio.magemonkey.codex.CodexEngine;
import studio.magemonkey.fusion.Fusion;
import studio.magemonkey.fusion.cfg.CraftingRequirementsCfg;
import studio.magemonkey.fusion.data.recipes.*;
import studio.magemonkey.fusion.data.recipes.CalculatedRecipe;
import studio.magemonkey.fusion.data.recipes.CraftingTable;
import studio.magemonkey.fusion.data.recipes.Recipe;
import studio.magemonkey.fusion.data.recipes.RecipeItem;
import studio.magemonkey.fusion.util.ExperienceManager;
import studio.magemonkey.fusion.util.InvalidPatternItemException;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import lombok.Getter;
import lombok.Setter;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import studio.magemonkey.codex.legacy.item.ItemBuilder;
import studio.magemonkey.codex.util.DeserializationWorker;
import studio.magemonkey.codex.util.SerializationBuilder;
import studio.magemonkey.fusion.data.recipes.RecipeItem;

import java.util.AbstractMap.SimpleEntry;
import java.util.*;
Expand Down Expand Up @@ -43,14 +44,14 @@ public InventoryPattern(Map<String, Object> map) {
continue;

Map<String, Object> section = itemsTemp.getSection(entry);
this.items.put(entry.charAt(0), new ItemBuilder(section).build());
this.items.put(entry.charAt(0), RecipeItem.fromConfig(section).getItemStack());

if (section.containsKey("closeonclick") && (boolean) section.get("closeonclick")) {
closeOnClickSlots.add(entry.charAt(0));
}
}
if (dw.getSection("items.queue-items.-") != null)
this.items.put('-', new ItemBuilder(dw.getSection("items.queue-items.-")).build());
this.items.put('-', RecipeItem.fromConfig(dw.getSection("items.queue-items.-")).getItemStack());

final DeserializationWorker commandsTemp =
DeserializationWorker.start(dw.getSection("commands", new HashMap<>(2)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import studio.magemonkey.codex.util.messages.MessageData;
import studio.magemonkey.fusion.Fusion;
import studio.magemonkey.fusion.api.FusionAPI;
import studio.magemonkey.fusion.cfg.Cfg;
import studio.magemonkey.fusion.cfg.ProfessionsCfg;
import studio.magemonkey.fusion.cfg.sql.SQLManager;
import studio.magemonkey.fusion.data.player.PlayerLoader;
Expand Down Expand Up @@ -39,9 +40,50 @@ public CraftingQueue(Player player, String profession, Category category) {
this.profession = profession;
this.category = category;
this.queuedItems = new HashMap<>(20);
queue.addAll(SQLManager.queues().getQueueItems(player.getUniqueId(), profession, category));
queue.forEach(entry -> entry.setCraftinQueue(this));

// Load items from the database
List<QueueItem> loaded = SQLManager.queues().getQueueItems(player.getUniqueId(), profession, category);
queue.addAll(loaded);

/*
* If offline progression is enabled, distribute the offline time across the
* queue sequentially. All items are saved with the same timestamp when
* saved, so use the first item's timestamp to calculate the offline duration.
*/
if (Cfg.updateQueueOffline && !queue.isEmpty()) {
long now = System.currentTimeMillis();
// find the first unfinished item
QueueItem current = queue.stream()
.filter(item -> !item.isDone())
.findFirst()
.orElse(null);
if (current != null) {
int offlineSeconds = (int) ((now - current.getTimestamp()) / 1000L);
// apply offline progress sequentially
for (QueueItem item : queue) {
if (offlineSeconds <= 0) {
break;
}
if (item.isDone()) {
continue;
}
int remaining = item.getRecipe().getCraftingTime() - item.getSavedSeconds();
int apply = Math.min(offlineSeconds, remaining);
item.progressOffline(apply);
offlineSeconds -= apply;
}
}
// normalize timestamps after applying offline progress
queue.forEach(item -> item.setTimestamp(now));
}

// Assign the queue and update the icons
queue.forEach(entry -> {
entry.setCraftinQueue(this);
entry.updateIcon();
});

// Start the queue update task
queueTask = new BukkitRunnable() {
@Override
public void run() {
Expand Down
Loading