9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2025-12-25 17:49:20 +00:00

TriumphGUI for menus, fix missing inv/echest view message, fix data saving despite no updates, close #42

This commit is contained in:
William
2022-10-12 21:02:57 +01:00
parent 394b8ff1d1
commit 43cd367ca3
21 changed files with 266 additions and 459 deletions

View File

@@ -13,7 +13,6 @@ import net.william278.husksync.data.DataAdapter;
import net.william278.husksync.data.JsonDataAdapter;
import net.william278.husksync.database.Database;
import net.william278.husksync.database.MySqlDatabase;
import net.william278.husksync.editor.DataEditor;
import net.william278.husksync.event.BukkitEventCannon;
import net.william278.husksync.event.EventCannon;
import net.william278.husksync.hook.PlanHook;
@@ -59,7 +58,6 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync {
private ResourceReader resourceReader;
private EventListener eventListener;
private DataAdapter dataAdapter;
private DataEditor dataEditor;
private EventCannon eventCannon;
private Settings settings;
private Locales locales;
@@ -114,9 +112,6 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync {
// Prepare event cannon
eventCannon = new BukkitEventCannon();
// Prepare data editor
dataEditor = new DataEditor(locales);
// Prepare migrators
availableMigrators = new ArrayList<>();
availableMigrators.add(new LegacyMigrator(this));
@@ -258,11 +253,6 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync {
return dataAdapter;
}
@Override
public @NotNull DataEditor getDataEditor() {
return dataEditor;
}
@Override
public @NotNull EventCannon getEventCannon() {
return eventCannon;

View File

@@ -27,8 +27,6 @@ public class BukkitSerializer {
public static CompletableFuture<String> serializeItemStackArray(@NotNull ItemStack[] inventoryContents)
throws DataSerializationException {
return CompletableFuture.supplyAsync(() -> {
BukkitHuskSync.getInstance().getLoggingAdapter().debug("[HS] Serializing inventory contents");
// Return an empty string if there is no inventory item data to serialize
if (inventoryContents.length == 0) {
return "";

View File

@@ -3,9 +3,7 @@ package net.william278.husksync.listener;
import net.william278.husksync.BukkitHuskSync;
import net.william278.husksync.data.BukkitInventoryMap;
import net.william278.husksync.data.BukkitSerializer;
import net.william278.husksync.data.DataSerializationException;
import net.william278.husksync.data.ItemData;
import net.william278.husksync.editor.ItemEditorMenuType;
import net.william278.husksync.player.BukkitPlayer;
import net.william278.husksync.player.OnlineUser;
import org.bukkit.Bukkit;
@@ -18,8 +16,6 @@ import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
@@ -29,9 +25,7 @@ import org.bukkit.event.world.WorldSaveEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
import java.util.stream.Collectors;
public class BukkitEventListener extends EventListener implements Listener {
@@ -61,27 +55,6 @@ public class BukkitEventListener extends EventListener implements Listener {
.collect(Collectors.toList())));
}
@EventHandler(ignoreCancelled = true)
public void onInventoryClose(@NotNull InventoryCloseEvent event) {
CompletableFuture.runAsync(() -> {
if (event.getPlayer() instanceof Player player) {
final OnlineUser user = BukkitPlayer.adapt(player);
plugin.getDataEditor().getEditingInventoryData(user).ifPresent(menu -> {
try {
BukkitSerializer.serializeItemStackArray(Arrays.copyOf(event.getInventory().getContents(),
menu.itemEditorMenuType == ItemEditorMenuType.INVENTORY_VIEWER
? player.getInventory().getSize()
: player.getEnderChest().getSize())).thenAccept(
serializedInventory -> super.handleMenuClose(user, new ItemData(serializedInventory)));
} catch (DataSerializationException e) {
plugin.getLoggingAdapter().log(Level.SEVERE,
"Failed to serialize inventory data during menu close", e);
}
});
}
});
}
@EventHandler(ignoreCancelled = true)
public void onPlayerDeath(PlayerDeathEvent event) {
final OnlineUser user = BukkitPlayer.adapt(event.getEntity());
@@ -137,13 +110,6 @@ public class BukkitEventListener extends EventListener implements Listener {
event.setCancelled(cancelPlayerEvent(BukkitPlayer.adapt(event.getPlayer())));
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onInventoryClick(@NotNull InventoryClickEvent event) {
if (event.getWhoClicked() instanceof Player player) {
event.setCancelled(cancelInventoryClick(BukkitPlayer.adapt(player)));
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onInventoryOpen(@NotNull InventoryOpenEvent event) {
if (event.getPlayer() instanceof Player player) {

View File

@@ -2,12 +2,14 @@ package net.william278.husksync.player;
import de.themoep.minedown.adventure.MineDown;
import de.themoep.minedown.adventure.MineDownParser;
import dev.triumphteam.gui.builder.gui.StorageBuilder;
import dev.triumphteam.gui.guis.Gui;
import dev.triumphteam.gui.guis.StorageGui;
import net.kyori.adventure.audience.Audience;
import net.william278.desertwell.Version;
import net.william278.husksync.BukkitHuskSync;
import net.william278.husksync.config.Settings;
import net.william278.husksync.data.*;
import net.william278.husksync.editor.ItemEditorMenu;
import org.bukkit.*;
import org.bukkit.advancement.Advancement;
import org.bukkit.advancement.AdvancementProgress;
@@ -15,7 +17,7 @@ import org.bukkit.attribute.Attribute;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.potion.PotionEffect;
@@ -565,16 +567,49 @@ public class BukkitPlayer extends OnlineUser {
}
@Override
public void showMenu(@NotNull ItemEditorMenu menu) {
BukkitSerializer.deserializeItemStackArray(menu.itemData.serializedItems).thenAccept(inventoryContents -> {
//todo show the inventory properly
/*final Inventory inventory = Bukkit.createInventory(player, menu.itemEditorMenuType.slotCount,
BaseComponent.toLegacyText(menu.menuTitle.toComponent()));*/
final Inventory inventory = Bukkit.createInventory(player, menu.itemEditorMenuType.slotCount,
menu.menuTitle.message());
inventory.setContents(inventoryContents);
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> player.openInventory(inventory));
public CompletableFuture<Optional<ItemData>> showMenu(@NotNull ItemData itemData, boolean editable,
int rows, @NotNull MineDown title) {
final CompletableFuture<Optional<ItemData>> updatedData = new CompletableFuture<>();
// Deserialize the item data to be shown and show it in a triumph GUI
BukkitSerializer.deserializeItemStackArray(itemData.serializedItems).thenAccept(items -> {
try {
// Build the GUI and populate with items
final int itemCount = items.length;
final StorageBuilder guiBuilder = Gui.storage().title(title.toComponent()).rows(rows).disableAllInteractions();
final StorageGui gui = editable ? guiBuilder.enableAllInteractions().create() : guiBuilder.create();
for (int i = 0; i < itemCount; i++) {
if (items[i] != null) {
gui.getInventory().setItem(i, items[i]);
}
}
// Complete the future with updated data (if editable) when the GUI is closed
gui.setCloseGuiAction(event -> {
if (!editable) {
updatedData.complete(Optional.empty());
return;
}
// Get and save the updated items
final ItemStack[] updatedItems = Arrays.copyOf(event.getPlayer().getOpenInventory()
.getTopInventory().getContents().clone(), itemCount);
BukkitSerializer.serializeItemStackArray(updatedItems).thenAccept(serializedItems -> {
if (serializedItems.equals(itemData.serializedItems)) {
updatedData.complete(Optional.empty());
return;
}
updatedData.complete(Optional.of(new ItemData(serializedItems)));
});
});
// Display the GUI (synchronously; on the main server thread)
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> gui.open(player));
} catch (Exception e) {
e.printStackTrace();
}
});
return updatedData;
}
@Override