diff --git a/ansible/files/paper-config/plugins/Citadel/config.yml b/ansible/files/paper-config/plugins/Citadel/config.yml index 62eb27b16..c98c1495a 100644 --- a/ansible/files/paper-config/plugins/Citadel/config.yml +++ b/ansible/files/paper-config/plugins/Citadel/config.yml @@ -26,6 +26,7 @@ reinforcements: item: ==: org.bukkit.inventory.ItemStack type: STONE + v: 1 creation_effect: type: PORTAL speed: 0.8 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6628e214d..60d1dd326 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ runpaper = { id = "xyz.jpenilla.run-paper", version = "2.3.1" } [libraries] paper-api = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" } -aikar-acf = { group = "co.aikar", name = "acf-bukkit", version = "0.5.1-SNAPSHOT" } +aikar-acf = { group = "co.aikar", name = "acf-paper", version = "0.5.1-SNAPSHOT" } aikar-taskchain = { group = "co.aikar", name = "taskchain-bukkit", version = "3.7.2" } commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version = "3.12.0" } diff --git a/plugins/bastion-paper/src/main/java/isaac/bastion/BastionBlock.java b/plugins/bastion-paper/src/main/java/isaac/bastion/BastionBlock.java index e2b58c604..78d2aab0a 100644 --- a/plugins/bastion-paper/src/main/java/isaac/bastion/BastionBlock.java +++ b/plugins/bastion-paper/src/main/java/isaac/bastion/BastionBlock.java @@ -299,6 +299,14 @@ public class BastionBlock implements QTBox, Comparable { return placed; } + /** + * Sets how long the bastion has been in the world in ms + */ + public void setPlaced(long placed) { + this.placed = placed; + Bastion.getBastionStorage().updated(this); + } + /** * Sets the id of this bastion */ diff --git a/plugins/bastion-paper/src/main/java/isaac/bastion/listeners/CitadelListener.java b/plugins/bastion-paper/src/main/java/isaac/bastion/listeners/CitadelListener.java index 137cc3da6..12f9fbc24 100644 --- a/plugins/bastion-paper/src/main/java/isaac/bastion/listeners/CitadelListener.java +++ b/plugins/bastion-paper/src/main/java/isaac/bastion/listeners/CitadelListener.java @@ -8,8 +8,12 @@ import isaac.bastion.manager.BastionBlockManager; import java.util.Set; import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; +import vg.civcraft.mc.citadel.events.ReinforcementGroupChangeEvent; +import vg.civcraft.mc.citadel.events.ReinforcementRepairEvent; import vg.civcraft.mc.namelayer.permission.PermissionType; public class CitadelListener implements Listener { @@ -36,4 +40,25 @@ public class CitadelListener implements Listener { } } } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onReinforcementRepair(ReinforcementRepairEvent event) { + BastionBlock bastionBlock = Bastion.getBastionStorage().getBastionBlock(event.getReinforcement().getLocation()); + if (bastionBlock == null) return; + bastionBlock.setPlaced(System.currentTimeMillis()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onReinforcementRepair(ReinforcementChangeTypeEvent event) { + BastionBlock bastionBlock = Bastion.getBastionStorage().getBastionBlock(event.getReinforcement().getLocation()); + if (bastionBlock == null) return; + bastionBlock.setPlaced(System.currentTimeMillis()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onReinforcementRepair(ReinforcementGroupChangeEvent event) { + BastionBlock bastionBlock = Bastion.getBastionStorage().getBastionBlock(event.getReinforcement().getLocation()); + if (bastionBlock == null) return; + bastionBlock.setPlaced(System.currentTimeMillis()); + } } diff --git a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/CustomItem.java b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/CustomItem.java index ef95218b3..fe0be53b1 100644 --- a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/CustomItem.java +++ b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/CustomItem.java @@ -47,7 +47,11 @@ public class CustomItem { public static String getCustomItemKey(ItemStack item) { if (isCustomItem(item)) { - return item.getPersistentDataContainer().get(CUSTOM_ITEM, PersistentDataType.STRING); + String key = item.getPersistentDataContainer().get(CUSTOM_ITEM, PersistentDataType.STRING); + if (!customItems.containsKey(key)) { + return null; + } + return key; } else { return null; } diff --git a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/items/ItemMap.java b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/items/ItemMap.java index fc9589929..44cf23fd9 100644 --- a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/items/ItemMap.java +++ b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/items/ItemMap.java @@ -248,7 +248,7 @@ public class ItemMap { } for (String is : customItems.keySet()) { ItemStack item = CustomItem.getCustomItem(is); - if (item.getType() == m) { + if (item != null && item.getType() == m) { result.addItemAmount(item, customItems.get(is)); } } diff --git a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/DonumCommandHandler.java b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/DonumCommandHandler.java index 7bab25d4b..90ae2e848 100644 --- a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/DonumCommandHandler.java +++ b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/DonumCommandHandler.java @@ -3,6 +3,7 @@ package com.github.civcraft.donum.commands; import com.github.civcraft.donum.commands.commands.Deliver; import com.github.civcraft.donum.commands.commands.DeliverDeath; import com.github.civcraft.donum.commands.commands.OpenDeliveries; +import com.github.civcraft.donum.commands.commands.PendingDeliveries; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; import vg.civcraft.mc.civmodcore.commands.CommandManager; @@ -24,5 +25,6 @@ public class DonumCommandHandler extends CommandManager { registerCommand(new OpenDeliveries()); registerCommand(new Deliver()); registerCommand(new DeliverDeath()); + registerCommand(new PendingDeliveries()); } } diff --git a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/commands/Deliver.java b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/commands/Deliver.java index 0a307f6af..5f0d3dbac 100644 --- a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/commands/Deliver.java +++ b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/commands/Deliver.java @@ -2,6 +2,7 @@ package com.github.civcraft.donum.commands.commands; import co.aikar.commands.BaseCommand; import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Syntax; @@ -16,6 +17,7 @@ public class Deliver extends BaseCommand { @CommandAlias("deliver") @Description("Opens an inventory to which you can add items to forward them to the players delivery inventory") @Syntax("") + @CommandCompletion("@players") @CommandPermission("donum.op") public void execute(Player player, String targetPlayer) { //TODO make namelayer soft dependency diff --git a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/commands/DeliverDeath.java b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/commands/DeliverDeath.java index cdbb304b2..121a385c2 100644 --- a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/commands/DeliverDeath.java +++ b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/commands/commands/DeliverDeath.java @@ -2,6 +2,7 @@ package com.github.civcraft.donum.commands.commands; import co.aikar.commands.BaseCommand; import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Optional; @@ -20,6 +21,7 @@ public class DeliverDeath extends BaseCommand { @CommandAlias("deliverdeath") @Syntax(" [inventoriesToGet]") @Description("Shows death inventories for a player, by default the last 25") + @CommandCompletion("@players") @CommandPermission("donum.op") public void execute(Player player, String targetPlayer, @Optional String inventoriesToGet) { UUID delUUID = NameAPI.getUUID(targetPlayer); diff --git a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/gui/DeathInventoryGUI.java b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/gui/DeathInventoryGUI.java index aee8425c5..b99da3e2c 100644 --- a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/gui/DeathInventoryGUI.java +++ b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/gui/DeathInventoryGUI.java @@ -37,7 +37,7 @@ public class DeathInventoryGUI { return; } ClickableInventory.forceCloseInventory(p); - ClickableInventory ci = new ClickableInventory(54, "DeathInventory " + NameAPI.getCurrentName(viewer)); + ClickableInventory ci = new ClickableInventory(54, "DeathInventory"); if (inventories.size() < 45 * currentPage) { // would show an empty page, so go to previous currentPage--; @@ -133,7 +133,7 @@ public class DeathInventoryGUI { @Override public void clicked(Player p) { Donum.getManager().returnDeathInventory(i); - Donum.getInstance().info(p.getName() + " returned inventory " + i.getID()); + Donum.getInstance().info(p.getName() + " returned inventory " + i.getID() + " to delivery inventory of " + NameAPI.getCurrentName(viewer)); p.sendMessage(ChatColor.GREEN + "Successfully returned inventory with id " + i.getID() + " with a total of " + i.getInventory().getTotalItemAmount() + " items"); showScreen(); diff --git a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/listeners/AdminDeliveryListener.java b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/listeners/AdminDeliveryListener.java index fded21f83..0630790bb 100644 --- a/plugins/donum-paper/src/main/java/com/github/civcraft/donum/listeners/AdminDeliveryListener.java +++ b/plugins/donum-paper/src/main/java/com/github/civcraft/donum/listeners/AdminDeliveryListener.java @@ -19,16 +19,16 @@ public class AdminDeliveryListener implements Listener { public void closeInventory(InventoryCloseEvent e) { if (AdminDeliveryGUI.isEditingPlayerDeliveryInventory(e.getPlayer().getUniqueId())) { ItemMap im = new ItemMap(); + UUID beingViewed = AdminDeliveryGUI.getPlayerBeingViewed(e.getPlayer().getUniqueId()); for (ItemStack is : e.getInventory().getContents()) { if (is == null || is.getType() == Material.AIR) { continue; } im.addItemStack(is); + Donum.getInstance().info(e.getPlayer().getName() + " added " + is + " to delivery inventory of " + NameAPI.getCurrentName(beingViewed)); } - UUID beingViewed = AdminDeliveryGUI.getPlayerBeingViewed(e.getPlayer().getUniqueId()); AdminDeliveryGUI.closedInventory(e.getPlayer().getUniqueId()); DonumAPI.deliverItem(beingViewed, im); - Donum.getInstance().info(e.getPlayer().getName() + " added " + im.getTotalItemAmount() + " items to delivery inventory of " + NameAPI.getCurrentName(beingViewed)); e.getPlayer().sendMessage(ChatColor.GREEN + "Successfully added " + im.getTotalItemAmount() + " items to delivery inventory of " + NameAPI.getCurrentName(beingViewed)); } } diff --git a/plugins/factorymod-paper/src/main/java/com/github/igotyou/FactoryMod/recipes/PrintBookRecipe.java b/plugins/factorymod-paper/src/main/java/com/github/igotyou/FactoryMod/recipes/PrintBookRecipe.java index edc34bea2..d36d79e07 100644 --- a/plugins/factorymod-paper/src/main/java/com/github/igotyou/FactoryMod/recipes/PrintBookRecipe.java +++ b/plugins/factorymod-paper/src/main/java/com/github/igotyou/FactoryMod/recipes/PrintBookRecipe.java @@ -2,13 +2,16 @@ package com.github.igotyou.FactoryMod.recipes; import com.github.igotyou.FactoryMod.factories.FurnCraftChestFactory; import com.github.igotyou.FactoryMod.utility.MultiInventoryWrapper; - import java.util.ArrayList; import java.util.LinkedList; import java.util.List; - +import io.papermc.paper.datacomponent.DataComponentTypes; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minecraft.core.component.DataComponents; -import net.minecraft.world.item.component.WrittenBookContent; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.ListTag; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -75,13 +78,25 @@ public class PrintBookRecipe extends PrintingPressRecipe { protected ItemStack createBook(ItemStack printingPlateStack, int amount) { net.minecraft.world.item.ItemStack book = CraftItemStack.asNMSCopy(printingPlateStack); - WrittenBookContent content = book.get(DataComponents.WRITTEN_BOOK_CONTENT); - + CompoundTag bookData = (CompoundTag) book.get(DataComponents.CUSTOM_DATA).copyTag().get("Book"); ItemStack bookItem = new ItemStack(Material.WRITTEN_BOOK, amount); - net.minecraft.world.item.ItemStack newBook = CraftItemStack.asNMSCopy(bookItem); - newBook.set(DataComponents.WRITTEN_BOOK_CONTENT, content); + if (printingPlateStack.hasData(DataComponentTypes.WRITTEN_BOOK_CONTENT)) { + bookItem.setData(DataComponentTypes.WRITTEN_BOOK_CONTENT, printingPlateStack.getData(DataComponentTypes.WRITTEN_BOOK_CONTENT)); + } else { // Handle legacy (pre-1.20.5) plates + bookItem.editMeta(BookMeta.class, meta -> { + meta.title(Component.text(bookData.get("title").getAsString())); + meta.author(Component.text(bookData.get("author").getAsString())); + meta.setGeneration(BookMeta.Generation.values()[((IntTag) bookData.get("generation")).getAsInt()]); - return CraftItemStack.asBukkitCopy(newBook); + List pages = new ArrayList<>(); + ((ListTag) bookData.get("pages")).forEach(page -> { + pages.add(GsonComponentSerializer.gson().deserialize(page.getAsString())); + }); + meta.pages(pages); + }); + } + + return bookItem; } protected BookMeta.Generation getNextGeneration(@Nullable BookMeta.Generation generation) { diff --git a/plugins/factorymod-paper/src/main/java/com/github/igotyou/FactoryMod/recipes/PrintNoteRecipe.java b/plugins/factorymod-paper/src/main/java/com/github/igotyou/FactoryMod/recipes/PrintNoteRecipe.java index 94dc0c78c..17207fda2 100644 --- a/plugins/factorymod-paper/src/main/java/com/github/igotyou/FactoryMod/recipes/PrintNoteRecipe.java +++ b/plugins/factorymod-paper/src/main/java/com/github/igotyou/FactoryMod/recipes/PrintNoteRecipe.java @@ -103,7 +103,6 @@ public class PrintNoteRecipe extends PrintBookRecipe { for (String line : lines) { fixedLines.add(ChatColor.GRAY + line - .replaceAll("(? ProtocolLibrary.getProtocolManager().getAsynchronousManager().registerAsyncHandler(combatHandler = new AsyncPacketHandler(combatConfig)).start()); + this.combatHandler = new AsyncPacketHandler(combatConfig); + ProtocolLibrary.getProtocolManager().addPacketListener(this.combatHandler); } public AsyncPacketHandler getCombatHandler() {