diff --git a/pom.xml b/pom.xml index eef4f47b..117de595 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.5 + 3.11.6 Citadel https://github.com/Devotedmc/Citadel diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index c2b13d0a..11d40a99 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -229,6 +229,74 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group return rein; } + public static boolean createTheoreticalReinforcement(Player player, Group g, Block block, ReinforcementType type, ItemStack reinfMat) { + if (player == null || g == null || block == null || type == null) { + return false; + } + + if (g.isDisciplined()) { + return false; + } + if (NonReinforceableType.isNonReinforceable(block.getType())){ + + return false; + } + + if (!NameAPI.getGroupManager().hasAccess(g.getName(), player.getUniqueId(), PermissionType.getPermission("REINFORCE"))) { + return false; + } + + // Find necessary itemstacks + final PlayerInventory inv = player.getInventory(); + final int invSize = inv.getSize(); + final ItemStack itemType = type.getItemStack(); + List slots = new ArrayList(type.getRequiredAmount()); + int requirementscheck = type.getRequiredAmount(); + if (requirementscheck <= 0) { + return false; + } + if (reinfMat != null && itemType.isSimilar(reinfMat)){ // only in CTF. + requirementscheck++; + } + int requirements = requirementscheck; + boolean consumeOffhand = false; + try { + //offhand needs special handling + + ItemStack offSlot = inv.getItemInOffHand(); + if (offSlot != null && offSlot.isSimilar(itemType)) { + requirementscheck -= offSlot.getAmount(); + consumeOffhand = true; + } + //cycle through normal inventory + for (int slot = 0; slot < invSize && requirements > 0; ++slot) { + final ItemStack slotItem = inv.getItem(slot); + if (slotItem == null) { + continue; + } + if (!slotItem.isSimilar(itemType)) { + continue; + } + requirementscheck -= slotItem.getAmount(); + slots.add(slot); + } + } catch (Exception ex) { + // Eat any inventory size mis-match exceptions, like with the Anvil + } + if (requirementscheck > 0) { + // Not enough reinforcement material + return false; + } + // Fire the creation event + PlayerReinforcement rein = new PlayerReinforcement(block.getLocation(), + type.getHitPoints(), getIntFormofMaturation(System.currentTimeMillis(),type.getItemStack()), + getIntFormofAcidMaturation(System.currentTimeMillis(),type.getItemStack()), + g, type.getItemStack()); + ReinforcementCreationEvent event = new ReinforcementCreationEvent(rein, block, player); + Bukkit.getPluginManager().callEvent(event); + return true; + } + /** * Creates a player reinforcement without consuming any materials. This should only be used * for admin tools