From 5d3e0cf7f365ec418b00f02e4896f4da770f352a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=87=E8=A1=A1?= Date: Sun, 4 Jun 2023 23:33:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BA=86=E4=BB=8E=E8=BA=AB?= =?UTF-8?q?=E4=B8=8A=E7=9A=84=E6=BD=9C=E5=BD=B1=E7=9B=92=E4=B8=AD=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=A1=A5=E5=85=85=E6=9D=90=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../deercloud/liteworldedit/Jobs/Place.java | 57 +++++++++++++++++-- .../liteworldedit/LiteWorldEdit.java | 2 +- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 58c949a..8e26257 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ site.deercloud LiteWorldEdit - 1.4-SNAPSHOT + 1.5.12-SNAPSHOT jar LiteWorldEdit diff --git a/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java b/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java index 23084ec..460b871 100644 --- a/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java +++ b/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java @@ -2,12 +2,17 @@ package site.deercloud.liteworldedit.Jobs; import org.bukkit.*; import org.bukkit.block.Block; +import org.bukkit.block.ShulkerBox; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockStateMeta; import site.deercloud.liteworldedit.LoggerX; +import java.util.HashMap; + public class Place extends Job { private final Material _block; @@ -35,14 +40,22 @@ public class Place extends Job { return JobErrCode.NOT_AIR_BLOCK; } // 获取到玩家物品中材料的第一个堆叠 + ItemStack stack; int stack_index = _inventory.first(_block); if (stack_index == -1) { - LoggerX.debug("玩家物品中没有该材料!"); - return JobErrCode.NOT_ENOUGH_ITEMS; + // 物品栏没有就去潜影盒里找 + if (!moveBlockFromShulkerBoxToInv()) { + return JobErrCode.NOT_ENOUGH_ITEMS; + } + stack_index = _inventory.first(_block); + if (stack_index == -1) { + LoggerX.debug("物品中没有该材料!"); + return JobErrCode.NOT_ENOUGH_ITEMS; + } } - ItemStack stack = _inventory.getItem(stack_index); + stack = _inventory.getItem(stack_index); if (stack == null) { - LoggerX.debug("获取到的物品为空!"); + LoggerX.debug("物品中没有该材料!"); return JobErrCode.NOT_ENOUGH_ITEMS; } @@ -65,4 +78,40 @@ public class Place extends Job { return JobErrCode.NO_PERMISSION; } } + + private boolean moveBlockFromShulkerBoxToInv() { + HashMap shulkerBoxes = _inventory.all(Material.SHULKER_BOX); + for (Integer index : shulkerBoxes.keySet()) { + LoggerX.debug("找到潜影盒:" + index); + ItemStack itemStack = _inventory.getItem(index); + if (itemStack == null) { + continue; + } + if (!(itemStack.getItemMeta() instanceof BlockStateMeta)) { + LoggerX.debug("不是BlockStateMeta!"); + continue; + } + BlockStateMeta meta = (BlockStateMeta) itemStack.getItemMeta(); + if (!(meta.getBlockState() instanceof ShulkerBox)) { + LoggerX.debug("不是潜影盒!"); + continue; + } + ShulkerBox shulkerBox = (ShulkerBox) meta.getBlockState(); + Inventory boxInv = shulkerBox.getInventory(); + int item_idx = boxInv.first(_block); + if (item_idx == -1) { + return false; + } + // 把物品放到玩家物品栏 + _inventory.addItem(boxInv.getItem(item_idx)); + // 把潜影盒中的物品移除 + shulkerBox.getInventory().setItem(item_idx, null); + // 更新潜影盒 + meta.setBlockState(shulkerBox); + itemStack.setItemMeta(meta); + return true; + } + LoggerX.debug("潜影盒中没有该材料!"); + return false; + } } diff --git a/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java b/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java index dc77a28..ad10244 100644 --- a/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java +++ b/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java @@ -36,7 +36,7 @@ public final class LiteWorldEdit extends JavaPlugin { break; } if (re.canContinue()) { - job.get_creator().sendTitle("§c警告", "§c" + re.getMessage(), 10, 70, 20); + job.get_creator().sendTitle("§e警告", "§e" + re.getMessage(), 10, 70, 20); job = _cache.getOneJob(); if (job == null) { return;